22.11.2012, 16:21
|
| »»» |
#1
|
Начинающий
Россия
Регистрация: 22.11.2012
Сообщений: 4
|
Работа через COM, получение данных по прохождению контрольных точек
Доброго времени суток.
По производственной необходимости столкнулся с программой Автограф, из которой надо получать данные по прохождению транспортными средствами контрольных точек.
Делать это хотелось бы в режиме реального времени, либо близком к нему.
Узнал, что Автограф регистрирует COM объект и начал изучать его API, но к сожалению не смог нигде найти вменяемой документации к нему.
Нашёл событие OnReceiveOnlineData -- судя по названию, оно происходит, когда Автограф получает очередную порцию данных с авто. Вопрос: как в этом событии, получить новые пройденные контрольные точки?
Если предыдущий способ не подходит, я предполагал использовать метод StartComputing(string GroupFileName, int CarDevice, string FirstTime, string LastTime, string DataSource, int TakeTripsSetup), который вроде бы, соответствует групповой обработке данных, а это то что мне нужно.
Однако, совсем не понятно, какая семантика параметров в этом методе, нет ли описания для них? (Мне нужно прохождение всех ТС каждой контрольной точки).
Так же не очень понятно, как после вычислений считать полученные данные, например, в память?
|
|
|
|
22.11.2012, 17:07
|
| »»» |
#2
|
Администратор
Регистрация: 27.05.2010
Сообщений: 29,953
|
На чем пишите и какова задача ?
ООО «ТехноКом», г. Челябинск
Самцов Константин Юрьевич - зам. директора по коммерческой деятельности
|
|
|
|
22.11.2012, 17:10
|
| »»» |
#3
|
Начинающий
Россия
Регистрация: 22.11.2012
Сообщений: 4
|
Пишем на .NET
Задача -- получать данные о прохождении машинами контрольных точек в реальном (или близком к нему) времени.
|
|
|
|
22.11.2012, 17:22
|
| »»» |
#4
|
Администратор
Регистрация: 27.05.2010
Сообщений: 29,953
|
Если совсем по-быстрому отвечать, то могу предложить копипаст кода для 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; КонецЦикла; КонецЕсли; КонецЦикла; КонецЕсли;
|
ООО «ТехноКом», г. Челябинск
Самцов Константин Юрьевич - зам. директора по коммерческой деятельности
|
|
|
|
22.11.2012, 17:25
|
| »»» |
#5
|
Администратор
Регистрация: 27.05.2010
Сообщений: 29,953
|
ООО «ТехноКом», г. Челябинск
Самцов Константин Юрьевич - зам. директора по коммерческой деятельности
|
|
|
|
22.11.2012, 17:28
|
| »»» |
#6
|
Администратор
Регистрация: 27.05.2010
Сообщений: 29,953
|
Сообщение от Rulikkk
|
Пишем на .NET
Задача -- получать данные о прохождении машинами контрольных точек в реальном (или близком к нему) времени.
|
Задача имеет несколько решений, в т.ч. не OLE-шное.
Просто надо понять, какая физическая цель преследуется.
Какова задача в физическом смысле - что именно контролируется ?
ООО «ТехноКом», г. Челябинск
Самцов Константин Юрьевич - зам. директора по коммерческой деятельности
|
|
|
|
22.11.2012, 17:38
|
| »»» |
#7
|
Начинающий
Россия
Регистрация: 22.11.2012
Сообщений: 4
|
Спасибо за быстрый ответ!
В физическом смысле, нам необходимо уметь отвечать на следующие вопросы: - Какие точки сегодня уже были посещены машиной X?
- Посетила ли уже машина X сегодня точку Y?
Эти данные нужны для отображения пользователю, чем своевременнее, тем лучше.
Так же, в конце дня, эти данные будут использованы для сверки плана и реального маршрута, и принятия дальнейших решений в случае наличия отклонений.
Расскажите, пожалуйста, про не-OLE способы, потому что использовать это древнее средство взаимодействия мне тоже не кажется лучшим вариантом.
|
|
|
|
22.11.2012, 19:07
|
| »»» |
#8
|
Администратор
Регистрация: 27.05.2010
Сообщений: 29,953
|
Сообщение от Rulikkk
|
Спасибо за быстрый ответ!
В физическом смысле, нам необходимо уметь отвечать на следующие вопросы:- Какие точки сегодня уже были посещены машиной X?
- Посетила ли уже машина X сегодня точку Y?
Эти данные нужны для отображения пользователю, чем своевременнее, тем лучше.
Так же, в конце дня, эти данные будут использованы для сверки плана и реального маршрута, и принятия дальнейших решений в случае наличия отклонений.
|
Именно на эти вопросы Вы и получили ответ выше.
Цитата:
|
Расскажите, пожалуйста, про не-OLE способы, потому что использовать это древнее средство взаимодействия мне тоже не кажется лучшим вариантом.
|
Во-первых, не ДРЕВНЕЕ. Ничего другого универсального для обмена данными между Windows-программами, написанными под разными платформами и на разных языках - не придумано.
Во-вторых, данный способ Вам не подходит и служит обычно для оперативного тревожного реагирования. Когда надо определить, на момент последних данных, полученных от терминала машина в КТ или нет. Для этого делается специальный запрос к серверу (описан в документации к серверному ПО), потом Вы сами пишете проверку: входит или не входит машина в полигон (алгоритм с подсчетом пересечения количества сторон несамопересекающегося полигона лучом брошенным в произвольном направлении из точки с координатами х,у). Но это для конкретных моментов времени.
При запросе через OLE - ПО рассчитывает всю историю посещений с гораздо более высокой точностью, разбивает на рейсы по нужным признакам, определяет ближайшие адреса для точек входа и выхода (если подключена адресная база), пробеги внутри КТ, моточасы и многие другие параметры...
Плюс, с точки зрения кода, это займет на три порядка меньше кода.
Плюс, Вы не задумываетесь о таких вещах, как о фильтрации координат трека, соприкасающихся КТ и о многом другом (адресах, пробегах внутри КТ и т.д. и т.п.)
ООО «ТехноКом», г. Челябинск
Самцов Константин Юрьевич - зам. директора по коммерческой деятельности
|
|
|
|
23.11.2012, 11:07
|
| »»» |
#9
|
Начинающий
Россия
Регистрация: 22.11.2012
Сообщений: 4
|
Спасибо за ответы ещё раз, сейчас изучаю Ваш вариант.
Насчёт OLE: тут уж позвольте не согласится, этому решению уж почти 20 лет как, да и вносит оно ограничения:
- внешняя программа должна работать на той же физической машине, что и автограф, а это сразу значит что она под Windows, а ведь есть другие системы
- одна программа работает с одним автографом, т.е. нельзя обращаться к одному и тому же автографу из разных программ
- программа может делать в один момент времени только один запрос
Имхо, здесь очень удачным было бы решение в виде веб-сервиса, который бы предоставлял специально настроенный для этого Автограф, либо WCF, может быть даже что-то типа socket.io или signalr, но тут уж решать конечно не мне , да и выбирать надо исходя из того, что нужно реальным клиентам.
Добавлено через 48 минут
И у меня есть дополнительный вопрос: есть ли какие-то гарантии на порядок выдачи контрольных точек (например, по возрастанию времени прибытия), или необходим сортировать после получения?
|
|
|
|
23.11.2012, 11:43
|
| »»» |
#10
|
Администратор
Регистрация: 27.05.2010
Сообщений: 29,953
|
Сообщение от Rulikkk
|
Спасибо за ответы ещё раз, сейчас изучаю Ваш вариант.
Насчёт 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-сервер однозначно...
ООО «ТехноКом», г. Челябинск
Самцов Константин Юрьевич - зам. директора по коммерческой деятельности
Последний раз редактировалось SK; 23.11.2012 в 11:47.
|
|
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Текущее время: 04:04. Часовой пояс GMT.
|
|