Ответ
 
Опции темы
Старый 22.11.2012, 16:21    | »»» |  #1
Rulikkk
Начинающий
 
Аватар для Rulikkk
 
Россия
Регистрация: 22.11.2012
Сообщений: 4
Rulikkk is on a distinguished road
Отправить сообщение для Rulikkk с помощью ICQ
По умолчанию Работа через COM, получение данных по прохождению контрольных точек

Доброго времени суток.

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

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

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

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

Если предыдущий способ не подходит, я предполагал использовать метод StartComputing(string GroupFileName, int CarDevice, string FirstTime, string LastTime, string DataSource, int TakeTripsSetup), который вроде бы, соответствует групповой обработке данных, а это то что мне нужно.
Однако, совсем не понятно, какая семантика параметров в этом методе, нет ли описания для них? (Мне нужно прохождение всех ТС каждой контрольной точки).
Так же не очень понятно, как после вычислений считать полученные данные, например, в память?
Rulikkk вне форума   Ответить с цитированием
Старый 22.11.2012, 17:07    | »»» |  #2
SK
Администратор
 
Аватар для SK
 
Регистрация: 27.05.2010
Сообщений: 29,972
SK has much to be proud ofSK has much to be proud ofSK has much to be proud ofSK has much to be proud ofSK has much to be proud ofSK has much to be proud ofSK has much to be proud ofSK has much to be proud of
Отправить сообщение для SK с помощью Skype™
По умолчанию

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

ООО «ТехноКом», г. Челябинск
Самцов Константин Юрьевич - зам. директора по коммерческой деятельности
SK вне форума   Ответить с цитированием
Старый 22.11.2012, 17:10    | »»» |  #3
Rulikkk
Начинающий
 
Аватар для Rulikkk
 
Россия
Регистрация: 22.11.2012
Сообщений: 4
Rulikkk is on a distinguished road
Отправить сообщение для Rulikkk с помощью ICQ
По умолчанию

Пишем на .NET
Задача -- получать данные о прохождении машинами контрольных точек в реальном (или близком к нему) времени.
Rulikkk вне форума   Ответить с цитированием
Старый 22.11.2012, 17:22    | »»» |  #4
SK
Администратор
 
Аватар для SK
 
Регистрация: 27.05.2010
Сообщений: 29,972
SK has much to be proud ofSK has much to be proud ofSK has much to be proud ofSK has much to be proud ofSK has much to be proud ofSK has much to be proud ofSK has much to be proud ofSK has much to be proud of
Отправить сообщение для SK с помощью Skype™
По умолчанию

Если совсем по-быстрому отвечать, то могу предложить копипаст кода для 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    | »»» |  #5
SK
Администратор
 
Аватар для SK
 
Регистрация: 27.05.2010
Сообщений: 29,972
SK has much to be proud ofSK has much to be proud ofSK has much to be proud ofSK has much to be proud ofSK has much to be proud ofSK has much to be proud ofSK has much to be proud ofSK has much to be proud of
Отправить сообщение для SK с помощью Skype™
По умолчанию

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

ООО «ТехноКом», г. Челябинск
Самцов Константин Юрьевич - зам. директора по коммерческой деятельности
SK вне форума   Ответить с цитированием
Старый 22.11.2012, 17:28    | »»» |  #6
SK
Администратор
 
Аватар для SK
 
Регистрация: 27.05.2010
Сообщений: 29,972
SK has much to be proud ofSK has much to be proud ofSK has much to be proud ofSK has much to be proud ofSK has much to be proud ofSK has much to be proud ofSK has much to be proud ofSK has much to be proud of
Отправить сообщение для SK с помощью Skype™
По умолчанию

Сообщение от Rulikkk Посмотреть сообщение
Пишем на .NET
Задача -- получать данные о прохождении машинами контрольных точек в реальном (или близком к нему) времени.
Задача имеет несколько решений, в т.ч. не OLE-шное.
Просто надо понять, какая физическая цель преследуется.
Какова задача в физическом смысле - что именно контролируется ?

ООО «ТехноКом», г. Челябинск
Самцов Константин Юрьевич - зам. директора по коммерческой деятельности
SK вне форума   Ответить с цитированием
Старый 22.11.2012, 17:38    | »»» |  #7
Rulikkk
Начинающий
 
Аватар для Rulikkk
 
Россия
Регистрация: 22.11.2012
Сообщений: 4
Rulikkk is on a distinguished road
Отправить сообщение для Rulikkk с помощью ICQ
По умолчанию

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

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

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

Расскажите, пожалуйста, про не-OLE способы, потому что использовать это древнее средство взаимодействия мне тоже не кажется лучшим вариантом.
Rulikkk вне форума   Ответить с цитированием
Старый 22.11.2012, 19:07    | »»» |  #8
SK
Администратор
 
Аватар для SK
 
Регистрация: 27.05.2010
Сообщений: 29,972
SK has much to be proud ofSK has much to be proud ofSK has much to be proud ofSK has much to be proud ofSK has much to be proud ofSK has much to be proud ofSK has much to be proud ofSK has much to be proud of
Отправить сообщение для SK с помощью Skype™
По умолчанию

Сообщение от Rulikkk Посмотреть сообщение
Спасибо за быстрый ответ!



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

ООО «ТехноКом», г. Челябинск
Самцов Константин Юрьевич - зам. директора по коммерческой деятельности
SK вне форума   Ответить с цитированием
Старый 23.11.2012, 11:07    | »»» |  #9
Rulikkk
Начинающий
 
Аватар для Rulikkk
 
Россия
Регистрация: 22.11.2012
Сообщений: 4
Rulikkk is on a distinguished road
Отправить сообщение для Rulikkk с помощью ICQ
По умолчанию

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

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

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

Добавлено через 48 минут
И у меня есть дополнительный вопрос: есть ли какие-то гарантии на порядок выдачи контрольных точек (например, по возрастанию времени прибытия), или необходим сортировать после получения?
Rulikkk вне форума   Ответить с цитированием
Старый 23.11.2012, 11:43    | »»» |  #10
SK
Администратор
 
Аватар для SK
 
Регистрация: 27.05.2010
Сообщений: 29,972
SK has much to be proud ofSK has much to be proud ofSK has much to be proud ofSK has much to be proud ofSK has much to be proud ofSK has much to be proud ofSK has much to be proud ofSK has much to be proud of
Отправить сообщение для SK с помощью Skype™
По умолчанию

Сообщение от 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.
SK вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


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


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