24.12.2014, 15:01
|
| »»» |
#1
|
Начинающий
Белгород
Регистрация: 24.12.2014
Сообщений: 17
|
Получение координатных записей через COM
Приветствую, господа АвтоГРАФоды (водители АвтоГРАФ-а)!
Давно известно (судя по форуму), что данные можно получать из системы через COM. Жаль что документация где-то запрятана, но интернет тут помог - нашел доку страниц в 9-10, с описание COM-объектов, аналогичное этому: документация по OLE.
Методом проб и ошибок таки вышло получить достать через COM текущие (последние) данные по группам и технике.
А вот с историей прямо засада. Вытащил только "рейсы", а через них получил положение и скорость в точках (+время).
Однако в доке видел TripCrdEntriesNum который, по логике, должен указывать на количество координатных записей которые (по логике) вытаскиваются через CrdEntryIndex = 1..TripCrdEntriesNum
Но при попытке установить CrdEntryIndex выдается ошибка.
Вот фрагмент схемы тестового алгоритма (данные по всей техники всех групп):
Код:
|
числоГрупп = AG.GroupsNum;
Для а = 1 По числоГрупп Цикл
AG.GroupIndex = а;
числоМашин = AG.GroupCarsNum;
Для б = 1 По числоМашин Цикл
AG.CarIndex = б;
AG.SetGroupIndexByFileName( AG.GroupFileName );
AG.SetCarIndexByDevice( AG.CarDevice );
AG.WaitForComputing( AG.GroupFileName, AG.CarDevice, началоПериода, конецПериода, "GSM", 1 );
колРейсов = AG.TripsNum;
Для в = 1 По числоМашин Цикл
AG.TripIndex = в;
массивКоординатРейса = AG.TrackCrdsArray; // число кооррдинатных записей * 5 потому что массив одномерный
числоКоординатныхЗаписей = AG.TripCrdEntriesNum; // как достать эти самые записи ?
Для г = 1 По числоМашин Цикл
AG.CrdEntryIndex = г;
// дальше не идет, из-за ошибки
Конец;
Конец;
Конец;
Конец; |
где AG - COM от "AutoGRAPH.AutoGRAPHAutomation"
Вообще хочу вытащить показания сенсоров по точкам, в частности уровень топлива.
|
|
|
|
24.12.2014, 17:46
|
| »»» |
#2
|
Администратор
Регистрация: 27.05.2010
Сообщений: 29,983
|
Сообщение от lefion
|
Давно известно (судя по форуму), что данные можно получать из системы через COM. Жаль что документация где-то запрятана, но интернет тут помог - нашел доку страниц в 9-10, с описание COM-объектов, аналогичное этому: документация по OLE.
|
Документация давно идет в комплекте с ПО - в инсталляторе...
ООО «ТехноКом», г. Челябинск
Самцов Константин Юрьевич - зам. директора по коммерческой деятельности
|
|
|
|
24.12.2014, 17:49
|
| »»» |
#3
|
Администратор
Регистрация: 27.05.2010
Сообщений: 29,983
|
Во-первых, Вы перепутали переменные:
Код:
|
колРейсов = AG.TripsNum;
Для в = 1 По числоМашин Цикл
AG.TripIndex = в; |
Вы присваиваете индексу рейса значения от 1 до числоМашин, а не до колРейсов...
ООО «ТехноКом», г. Челябинск
Самцов Константин Юрьевич - зам. директора по коммерческой деятельности
|
|
|
|
24.12.2014, 17:53
|
| »»» |
#4
|
Администратор
Регистрация: 27.05.2010
Сообщений: 29,983
|
Сообщение от lefion
|
Вообще хочу вытащить показания сенсоров по точкам, в частности уровень топлива.
|
А их реально нет в каждой точке, этих показаний-то...
Если Вы представляете, как работает терминал, то должны знать, что координатные записи пишутся асинхронно с данными различных датчиков. Иными словами, координаты опрашиваются повременно или адаптивно (от изменения вектора скорости), а те же ДУТ-ы - по времени (но интервал задается отдельно) или адаптивно (по изменению уровня).
Если бы в каждой точке писались абсолютно все значения всех датчиков - трафик вырос бы на два порядка.
ООО «ТехноКом», г. Челябинск
Самцов Константин Юрьевич - зам. директора по коммерческой деятельности
Последний раз редактировалось SK; 24.12.2014 в 18:37.
|
|
|
|
24.12.2014, 18:33
|
| »»» |
#5
|
Администратор
Регистрация: 27.05.2010
Сообщений: 29,983
|
массивКоординатРейса = AG.TrackCrdsArray;
Это Вам не поможет, т.к. 1С не работает с такими штуками...
Надо типа такого:
Код:
|
колРейсов = AG.TripsNum;
Для НомерРейса = 1 По колРейсов Цикл
AG.TripIndex = НомерРейса;
числоКоординатныхЗаписей = AG.TripCrdEntriesNum;
Для НомерТочкиТрека = 1 По числоКоординатныхЗаписей Цикл
AG.CrdEntryIndex = НомерТочкиТрека;
ТочкаВремя = AG.CrdEntryTime;
ТочкаДолгота = AG.CrdEntryLongitude;
ТочкаШирота = AG.CrdEntryLatitude;
ТочкаПробег = AG.CrdEntryDistance;
ТочкаСкорость = AG.CrdEntrySpeed;
ТочкаВход1 = AG.CrdEntrySensor1; // Датчик 1 (0 – выключен, 1 – включен)
ТочкаВход2 = AG.CrdEntrySensor2; // Датчик 2 (0 – выключен, 1 – включен)
ТочкаВход5 = AG.CrdEntrySensor5; // Датчик 5 (0 – выключен, 1 – включен)
ТочкаВход7 = AG.CrdEntrySensor7; // Датчик 7 (0 – выключен, 1 – включен)
ТочкаLLS1 = AG.CrdEntryLLS1; // Показание датчика LLS 1
ТочкаLLS2 = AG.CrdEntryLLS2; // Показание датчика LLS 2
ТочкаLLS5 = AG.CrdEntryLLS5; // Показание датчика LLS 5
// и так далее - какие надо данные в точке...
КонецЦикла;
КонецЦикла; |
ООО «ТехноКом», г. Челябинск
Самцов Константин Юрьевич - зам. директора по коммерческой деятельности
|
|
|
|
25.12.2014, 07:20
|
| »»» |
#6
|
Начинающий
Белгород
Регистрация: 24.12.2014
Сообщений: 17
|
Сообщение от SK
|
Документация давно идет в комплекте с ПО - в инсталляторе...
|
Как-то не думал что в инсталляции есть документация. Жаль что её не больше чем уже давно нашел в интернете. И то же нет примеров...
Сообщение от SK
|
массивКоординатРейса = AG.TrackCrdsArray;
Это Вам не поможет, т.к. 1С не работает с такими штуками...
|
Вообще 1С умеет работать с COMSafeArray...
Код:
|
AG.TrackCrdsArray.Выгрузить() |
В нашем случае получается одномерный массив.
Но проблема даже не в этом, а в том что при попытке установить значение CrdEntryIndex для обхода списка AutoGRAPH отваливается. Ошибок я не вижу.
Сообщение от SK
|
Во-первых, Вы перепутали переменные:
Код:
|
колРейсов = AG.TripsNum;
Для в = 1 По числоМашин Цикл
AG.TripIndex = в; |
Вы присваиваете индексу рейса значения от 1 до числоМашин, а не до колРейсов...
|
Действительно, при наборе кода в топике я ошибся. Вот фрагмент кода из 1С:
Код:
|
AG = Новый COMОбъект("AutoGRAPH.AutoGRAPHAutomation");
ИнициализацияAG = AG.WaitForInitializing();
ЧислоГрупп = AG.GroupsNum;
Для а = 1 По ЧислоГрупп Цикл
AG.GroupIndex = а;
ЧислоТС = AG.GroupCarsNum;
Для б = 1 По ЧислоТС Цикл
AG.CarIndex = б;
AG.SetGroupIndexByFileName( AG.GroupFileName );
AG.SetCarIndexByDevice( AG.CarDevice );
AG.WaitForComputing( AG.GroupFileName, AG.CarDevice, НачалоПериода, КонецПериода, "GSM", 1 );
ЧислоРейсов = AG.TripsNum;
Для в = 1 По ЧислоРейсов Цикл
AG.TripIndex = в;
Если AG.TripMotor1Fuel > 0 Тогда
Нов = ВремТаб.Добавить();
Нов.Индекс = в;
Нов.Код = AG.CurrentCarDevice;
Нов.Группа = AG.GroupName;
Нов.Модель = AG.CarModel;
Нов.Госномер = AG.CarNumber;
Нов.Расход = AG.TripMotor1Fuel;
Нов.Пробег = AG.TripDistance;
Нов.ВремяВыезда = AG.TripRealCont;
Нов.ВодительID = AG.TripDriverID;
Нов.ВодительИмя = AG.TripDriverName;
Нов.НачальнаяТочка = AG.TripStartName;
Нов.КонечнаяТочка = AG.TripEndName;
Нов.НачальнаяШирока = AG.TripStartLatitude;
Нов.НачальнаяДолгода = AG.TripStartLongitude;
Нов.КонечнаяШирота = AG.TripEndLatitude;
Нов.КонечнаяДолгота = AG.TripEndLongitude;
Нов.НачальноеВремя = AG.TripStartRealTime;
Нов.КонечноеВремя = AG.TripEndRealTime;
Нов.СкоростьСредняя = AG.TripAverSpeed;
Нов.СкоростьМаксимальная = AG.TripMaxSpeed;
Нов.КолвоКординат = AG.TripCrdEntriesNum;
Нов.Координаты = AG.TrackCrdsStr;
ЧислоКоординатныхЗаписей = AG.TripCrdEntriesNum;
Для г = 1 По ЧислоКоординатныхЗаписей Цикл
AG.CrdEntryIndex = г;
Время = AG.CrdEntryTime;
Долгота = AG.CrdEntryLongitude;
Широта = AG.CrdEntryLatitude;
Пробег = AG.CrdEntryDistance;
Скорость = AG.CrdEntrySpeed;
Вход1 = AG.CrdEntrySensor1;
Вход2 = AG.CrdEntrySensor2;
LLS1 = AG.CrdEntryLLS1;
LLS2 = AG.CrdEntryLLS2;
// ...
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла; |
Добавлено через 9 минут
Утром попробовал на чистой машине запустить обработку из пустой файловой базы с АвтоГРАФ-ом версии 4.0.6 с одной группой и 12 машинами (сразу после загрузки онлайновых данных).
Отработало без ошибок.
Помогло то ли что автограф на локальной машине отработал, то ли что база файловая и все работало с правами пользователя, то ли на чистой машине нет косяков с COM.
Кстати, почему открывается окно программы ?
Означает ли это что на сервере COM работать не будет (из-за того что будет вызвано из службы) из-за того что не сможет окно создать ?
|
|
|
|
25.12.2014, 07:22
|
| »»» |
#7
|
Администратор
Регистрация: 27.05.2010
Сообщений: 29,983
|
Сообщение от lefion
|
Вообще 1С умеет работать с COMSafeArray...
|
Я по привычке про 7.7-ку )))
ООО «ТехноКом», г. Челябинск
Самцов Константин Юрьевич - зам. директора по коммерческой деятельности
|
|
|
|
25.12.2014, 07:31
|
| »»» |
#8
|
Дилер
Екатеринбург, ЗАО "Седьмая Экспедиция"
Регистрация: 14.12.2010
Сообщений: 14,997
|
lefion, окно всегда будет а служба может запускаться от реального пользователя
ЗАО "Седьмая Экспедиция", Екатеринбург, РФ
Мушин Виктор Валерьевич, Технический директор
|
|
|
|
25.12.2014, 07:52
|
| »»» |
#9
|
Начинающий
Белгород
Регистрация: 24.12.2014
Сообщений: 17
|
Пробовал аналогично получить данные и на C# - на чистой машине отрабатывает, на моей нет.
Возможно что-то с COM у меня, а может что-то опять поломалось после очередной синхронизации в АвтоГРАФ-е.
Кстати, скорость обработки не радует ни в 1С, ни в C# - долго выполняется обход Crd для рейсов. Я понимаю, что доходит до 10k элементов, и что это все таки COM, но тем не менее... Загрузка одного ядра АвтоГРАФом достигает 100%. При том что через AG.TrackCrdsArray (только координаты) достаются практически моментально (больше времени уходит на создание COM-соединения).
Идея механизма обхода данных в целом неплохая, но пригодна только для не частого использования.
Добавлено через 4 минуты
Кстати, можно ли сразу обратиться у нужной технике, не перебирая все группы в поисках нужной ?
Хотя бы по её коду, который выдаётся AG.CarDevice ( AG.CurrentCarDevice ) ?
Добавлено через 9 минут
И второй интересующий момент, это возможность достать координатные записи за период, не поделенные на рейсы.
Ведь, как я понимаю, кроме рейсов есть ещё и "стоянки", и, возможно, координатные записи для них ?
|
|
|
|
25.12.2014, 08:16
|
| »»» |
#10
|
Администратор
Регистрация: 27.05.2010
Сообщений: 29,983
|
ТабТС - это табличка, где у меня выводится в 1С список ТС, чтобы пометить те, по которым выводить отчет.
Код:
|
//************************************************************************************************************************************************************************
// Процедура ОтчетПоКоординатам()
//************************************************************************************************************************************************************************
Процедура ОтчетПоКоординатам()
ТабТС.ВыбратьСтроки();
ПроцВсе=0;
ВсегоТС=0;
ОбработаноТС=0;
ТабТС.ВыбратьСтроки();
Пока ТабТС.ПолучитьСтроку() = 1 Цикл
Если ТабТС.Метка = "+" Тогда ВсегоТС = ВсегоТС + 1; КонецЕсли;
КонецЦикла;
ТабТС.ВыбратьСтроки();
Пока ТабТС.ПолучитьСтроку() > 0 Цикл
Если ТабТС.Метка = "" Тогда Продолжить; КонецЕсли;
ТСПериодНач=Формат(ДатаЧисло(ВыбНачПериода),"Ч(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;
Если КолРейсов=0 Тогда
Предупреждение("Рейсов не обнаружено");
Иначе
Для х = 1 По КолРейсов Цикл
AG.TripIndex = х;
ЧислоКоординатныхЗаписей = AG.TripCrdEntriesNum;
Для НомерТочкиТрека = 1 По числоКоординатныхЗаписей Цикл
AG.CrdEntryIndex = НомерТочкиТрека;
ТочкаВремя = AG.CrdEntryTime;
ТочкаДолгота = AG.CrdEntryLongitude;
ТочкаШирота = AG.CrdEntryLatitude;
ТочкаПробег = AG.CrdEntryDistance;
ТочкаСкорость = AG.CrdEntrySpeed;
ТочкаВход1 = AG.CrdEntrySensor1; // Датчик 1 (0 – выключен, 1 – включен)
ТочкаВход2 = AG.CrdEntrySensor2; // Датчик 2 (0 – выключен, 1 – включен)
ТочкаВход5 = AG.CrdEntrySensor5; // Датчик 5 (0 – выключен, 1 – включен)
ТочкаВход7 = AG.CrdEntrySensor7; // Датчик 7 (0 – выключен, 1 – включен)
ТочкаLLS1 = AG.CrdEntryLLS1; // Показание датчика LLS 1
ТочкаLLS2 = AG.CrdEntryLLS2; // Показание датчика LLS 2
ТочкаLLS5 = AG.CrdEntryLLS5; // Показание датчика LLS 5
// и так далее - какие надо данные в точке...
Сообщить("Время: "+Строка(ТочкаВремя)+СимволТабуляции+"Долгота: "+Лев(Строка(ТочкаДолгота),7)+СимволТабуляции+"Широта: "+Лев(Строка(ТочкаШирота),7)
+СимволТабуляции+"Скорость: "+Лев(Строка(ТочкаСкорость),5)+СимволТабуляции+"LLS1: "+Строка(ТочкаLLS1)+СимволТабуляции+"Вход1: "+Строка(ТочкаВход1));
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецЦикла;
КонецПроцедуры //ОтчетПоКоординатам() |
ООО «ТехноКом», г. Челябинск
Самцов Константин Юрьевич - зам. директора по коммерческой деятельности
|
|
|
|
Здесь присутствуют: 2 (пользователей: 0 , гостей: 2)
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Текущее время: 20:50. Часовой пояс GMT.
|
|