ОФИЦИАЛЬНЫЙ ФОРУМ ГРУППЫ КОМПАНИЙ «ТЕХНОКОМ»

ОФИЦИАЛЬНЫЙ ФОРУМ ГРУППЫ КОМПАНИЙ «ТЕХНОКОМ» (http://forum.tk-chel.ru/index.php)
-   Система «АвтоГРАФ»: Программное обеспечение (http://forum.tk-chel.ru/forumdisplay.php?f=4)
-   -   Проблема: Работа через COM, получение данных по прохождению контрольных точек (http://forum.tk-chel.ru/showthread.php?t=2489)

Rulikkk 22.11.2012 16:21

Работа через COM, получение данных по прохождению контрольных точек
 
Доброго времени суток.

По производственной необходимости столкнулся с программой Автограф, из которой надо получать данные по прохождению транспортными средствами контрольных точек.

Делать это хотелось бы в режиме реального времени, либо близком к нему.

Узнал, что Автограф регистрирует COM объект и начал изучать его API, но к сожалению не смог нигде найти вменяемой документации к нему.

Нашёл событие OnReceiveOnlineData -- судя по названию, оно происходит, когда Автограф получает очередную порцию данных с авто. Вопрос: как в этом событии, получить новые пройденные контрольные точки?

Если предыдущий способ не подходит, я предполагал использовать метод StartComputing(string GroupFileName, int CarDevice, string FirstTime, string LastTime, string DataSource, int TakeTripsSetup), который вроде бы, соответствует групповой обработке данных, а это то что мне нужно.
Однако, совсем не понятно, какая семантика параметров в этом методе, нет ли описания для них? (Мне нужно прохождение всех ТС каждой контрольной точки).
Так же не очень понятно, как после вычислений считать полученные данные, например, в память?

SK 22.11.2012 17:07

На чем пишите и какова задача ?

Rulikkk 22.11.2012 17:10

Пишем на .NET
Задача -- получать данные о прохождении машинами контрольных точек в реальном (или близком к нему) времени.

SK 22.11.2012 17:22

Если совсем по-быстрому отвечать, то могу предложить копипаст кода для 1С (по-русски, правда... но такова 1С... как раз отчет по КТ делался - должно быть понятно для программера)

Сначала заполнялась таблица ТС (всех ТС по всем группам):
PHP код:


Процедура ЗаполнитьТаблицуТС
()
 
AG=СоздатьОбъект("AutoGRAPH.AutoGRAPHAutomation"); // Создаем COM-объект
ddd=AG.WaitForInitializing(); // Ждем окончания инициализации объекта
 
НепройденныеКТ 1// Устанавливаем чекбокс "Показывать отчет с непройденными КТ" в положение "Да"
ВыбНачПериода ТекущаяДата(); // Устанавливаем начальную дату отчета на начало текущего дня
ВыбКонПериода ТекущаяДата(); // Устанавливаем конечную дату отчета на конец текущего дня
 
// Инициализируем таблицу групп ТС
ТабГрупп.УдалитьСтроки();
 
// Инициализируем таблицу ТС
ТабТС.УдалитьСтроки();
ЧислоГрупп=AG.GroupsNum//Определяем число групп ТС
Если ЧислоГрупп>0 Тогда
Для х 
1 По ЧислоГрупп Цикл
 
AG
.GroupIndex х//Передаем индекс (номер) группы в АГ 
 
ГрЧислоТС AG.GroupCarsNum//Определяем число ТС в группе
 
Если ГрЧислоТС 0 Тогда //Если кол-во ТС в текущей группе > 0 тогда выводим ТС группы, пустую группу - не выводим
 
ТабГрупп.НоваяСтрока();
ТабГрупп.Группа AG.GroupName//Название группы ТС
Для хх 1 По ГрЧислоТС Цикл
 
AG
.CarIndex хх//Передаем индекс (номер) ТС внутри группы в АГ
ТабТС.НоваяСтрока();
ТабТС.Метка ""//Метка выбора - снята
ТабТС.Группа AG.GroupName//Название группы ТС
ТабТС.СерНом AG.CarDevice//Сер. номер контроллера
ТабТС.Марка AG.CarModel//Марка ТС
ТабТС.НомерТС AG.CarNumber//Гос. номер ТС
ТабТС.ГрФайл AG.GroupFileName//Файл группы ТС (нужен для расчета)
 
КонецЦикла;
 
КонецЕсли;
 
КонецЦикла;
КонецЕсли;
 
КонецПроцедуры // ЗаполнитьТаблицуТС() 

Потом, для каждого нужного ТС из этой таблицы, исполняется такой код:
PHP код:

//ВыбНачПериода и ВыбКонПериода - DataPicker-ы на форме
 
  
ТСПериодНач=Формат(ДатаЧисло(ВыбНачПериода),"Ч(0)2.0")+"."+Формат(ДатаМесяц(ВыбНачПериода),"Ч(0)2.0")+"."+Строка(ДатаГод(ВыбНачПериода))+" 00:00:00";
  
ТСПериодКон=Формат(ДатаЧисло(ВыбКонПериода),"Ч(0)2.0")+"."+Формат(ДатаМесяц(ВыбКонПериода),"Ч(0)2.0")+"."+Строка(ДатаГод(ВыбКонПериода))+" 23:59:59";
 
  
AG.SetGroupIndexByFileName(ТабТС.ГрФайл);
  
AG.SetCarIndexByDevice(ТабТС.СерНом);
 
  
AG.WaitForComputing(ТабТС.ГрФайл,ТабТС.СерНом,ТСПериодНач,ТСПериодКон,"GSM",1);
  
ОбработаноТС=ОбработаноТС+1;
  
Форма.Проц.Заголовок(Строка(Окр(100/ВсегоТС*ОбработаноТС,0))+" %");
 
  
КолРейсов AG.TripsNum;
  
ФайлКТ    AG.CarCheckPointsFile;
 
  
Таб.ВывестиСекцию("ШапкаТС");
 
     
Если КолРейсов=0 Тогда 
   
//Предупреждение("Рейсов не обнаружено"); 
  
Иначе
   Для х 
1 По КолРейсов Цикл
    AG
.TripIndex х;
    
AG.TripEntriesListTypeName="checkpoints";
    
AG.TripEntriesListKindName="points";
    
КолКТ AG.TripEntriesNum;
    
Если КолКТ 0 Тогда
     Для хх 
1 По КолКТ Цикл
      AG
.EntryIndex хх;
 
      
ТабКТ.НоваяСтрока();
      
ТабКТ.КТИД    AG.EntryID;
      
ТабКТ.КТИмя   AG.EntryStartName;
      
ТабКТ.КТАдрес AG.EntryStartAddress;
      
ТабКТ.КТИДП   AG.EntryStartIDP;
      
ТабКТ.КТПриб  AG.EntryStartRealTime;
      
ТабКТ.КТОтпр  AG.EntryEndRealTime;
 
     
КонецЦикла;
    
КонецЕсли;
   
КонецЦикла;
  
КонецЕсли


SK 22.11.2012 17:25

Еще с примерами:

SK 22.11.2012 17:28

Цитата:

Сообщение от Rulikkk (Сообщение 43573)
Пишем на .NET
Задача -- получать данные о прохождении машинами контрольных точек в реальном (или близком к нему) времени.

Задача имеет несколько решений, в т.ч. не OLE-шное.
Просто надо понять, какая физическая цель преследуется.
Какова задача в физическом смысле - что именно контролируется ?

Rulikkk 22.11.2012 17:38

Спасибо за быстрый ответ!

В физическом смысле, нам необходимо уметь отвечать на следующие вопросы:
  • Какие точки сегодня уже были посещены машиной X?
  • Посетила ли уже машина X сегодня точку Y?

Эти данные нужны для отображения пользователю, чем своевременнее, тем лучше.
Так же, в конце дня, эти данные будут использованы для сверки плана и реального маршрута, и принятия дальнейших решений в случае наличия отклонений.

Расскажите, пожалуйста, про не-OLE способы, потому что использовать это древнее средство взаимодействия мне тоже не кажется лучшим вариантом.

SK 22.11.2012 19:07

Цитата:

Сообщение от Rulikkk (Сообщение 43580)
Спасибо за быстрый ответ!



В физическом смысле, нам необходимо уметь отвечать на следующие вопросы:
  • Какие точки сегодня уже были посещены машиной X?
  • Посетила ли уже машина X сегодня точку Y?
Эти данные нужны для отображения пользователю, чем своевременнее, тем лучше.
Так же, в конце дня, эти данные будут использованы для сверки плана и реального маршрута, и принятия дальнейших решений в случае наличия отклонений.

Именно на эти вопросы Вы и получили ответ выше.
Цитата:

Расскажите, пожалуйста, про не-OLE способы, потому что использовать это древнее средство взаимодействия мне тоже не кажется лучшим вариантом.
Во-первых, не ДРЕВНЕЕ. Ничего другого универсального для обмена данными между Windows-программами, написанными под разными платформами и на разных языках - не придумано.
Во-вторых, данный способ Вам не подходит и служит обычно для оперативного тревожного реагирования. Когда надо определить, на момент последних данных, полученных от терминала машина в КТ или нет. Для этого делается специальный запрос к серверу (описан в документации к серверному ПО), потом Вы сами пишете проверку: входит или не входит машина в полигон (алгоритм с подсчетом пересечения количества сторон несамопересекающегося полигона лучом брошенным в произвольном направлении из точки с координатами х,у). Но это для конкретных моментов времени.
При запросе через OLE - ПО рассчитывает всю историю посещений с гораздо более высокой точностью, разбивает на рейсы по нужным признакам, определяет ближайшие адреса для точек входа и выхода (если подключена адресная база), пробеги внутри КТ, моточасы и многие другие параметры...
Плюс, с точки зрения кода, это займет на три порядка меньше кода.
Плюс, Вы не задумываетесь о таких вещах, как о фильтрации координат трека, соприкасающихся КТ и о многом другом (адресах, пробегах внутри КТ и т.д. и т.п.)

Rulikkk 23.11.2012 11:07

Спасибо за ответы ещё раз, сейчас изучаю Ваш вариант.

Насчёт OLE: тут уж позвольте не согласится, этому решению уж почти 20 лет как, да и вносит оно ограничения:
- внешняя программа должна работать на той же физической машине, что и автограф, а это сразу значит что она под Windows, а ведь есть другие системы
- одна программа работает с одним автографом, т.е. нельзя обращаться к одному и тому же автографу из разных программ
- программа может делать в один момент времени только один запрос

Имхо, здесь очень удачным было бы решение в виде веб-сервиса, который бы предоставлял специально настроенный для этого Автограф, либо WCF, может быть даже что-то типа socket.io или signalr, но тут уж решать конечно не мне :), да и выбирать надо исходя из того, что нужно реальным клиентам.

Добавлено через 48 минут
И у меня есть дополнительный вопрос: есть ли какие-то гарантии на порядок выдачи контрольных точек (например, по возрастанию времени прибытия), или необходим сортировать после получения?

SK 23.11.2012 11:43

Цитата:

Сообщение от Rulikkk (Сообщение 43697)
Спасибо за ответы ещё раз, сейчас изучаю Ваш вариант.

Насчёт OLE: тут уж позвольте не согласится, этому решению уж почти 20 лет как,

Ну... если только по этой логике...
То процессоры Intel вообще устаревший палеолит. Думаете, ничего не развивается со временем ?
А сама Windows - древнее OLE на годы ? Отказываемся от Windows ?
Цитата:

да и вносит оно ограничения:
- внешняя программа должна работать на той же физической машине, что и автограф, а это сразу значит что она под Windows, а ведь есть другие системы
Поясняю: технология УЖЕ ВСТРОЕНА в огромное количество самого разнообразного софта. COM-объекты используются и в средах разработки - откройте соответствующую вкладку VisualStudio.
Кроме того, это мгновенно совместило софт с 1С, MS Office, OpenOffice, MapInfo, даже CorelDraw (да-да - можно там прямо трек рисовать - VBA встроен) и огромным количеством самого разоног софта.
Какой универсальный механизм Вы можете предложить на замену ?
Цитата:

- одна программа работает с одним автографом, т.е. нельзя обращаться к одному и тому же автографу из разных программ
Напишите маленькую примочку-службу с любым удобным для Вас механизмом обмена, которая будет конвертировать запросы в OLE-запросы.
Цитата:

- программа может делать в один момент времени только один запрос
Это определяется архитектурой построения софта в плане распараллеливания задач. Запросы могут прийти и последовательно, а обработка их может идти параллельно. Потом выставляется флаг готовности и вторым запросом клиенты забирают результат. Механизмы есть - поверьте. За годы чего только не придумали.
Цитата:

Имхо, здесь очень удачным было бы решение в виде веб-сервиса, который бы предоставлял специально настроенный для этого Автограф, либо WCF, может быть даже что-то типа socket.io или signalr, но тут уж решать конечно не мне :), да и выбирать надо исходя из того, что нужно реальным клиентам.
Медленно для больших потоков данных. И уязвимо.
Цитата:

Добавлено через 48 минут
И у меня есть дополнительный вопрос: есть ли какие-то гарантии на порядок выдачи контрольных точек (например, по возрастанию времени прибытия), или необходим сортировать после получения?
Данные типа Entry располагаются в хронологической последовательности.

P.S.: В соседней теме человек попросил написать получение данных по заправкам и сливам в 1С. Я потратил на это всего-то около часа и то - вместе с оформлением таблиц.
Не знаю, сколько бы без OLE я убил времени на связку.
И еще: задержка на обработку данных значительно больше, чем на запросы через OLE-механизм. Да, в версию .NET будет встроен дублирующий скоростной механизм соединения модулей, но не web-сервер однозначно...


Текущее время: 23:41. Часовой пояс GMT.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot