Ответ
 
Опции темы
Старый 24.12.2014, 15:01    | »»» |  #1
lefion
Начинающий
 
Аватар для lefion
 
Белгород
Регистрация: 24.12.2014
Сообщений: 17
lefion is on a distinguished road
Question Получение координатных записей через 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"

Вообще хочу вытащить показания сенсоров по точкам, в частности уровень топлива.
lefion вне форума   Ответить с цитированием
Старый 24.12.2014, 17:46    | »»» |  #2
SK
Администратор
 
Аватар для SK
 
Регистрация: 27.05.2010
Сообщений: 29,970
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™
По умолчанию

Сообщение от lefion Посмотреть сообщение
Давно известно (судя по форуму), что данные можно получать из системы через COM. Жаль что документация где-то запрятана, но интернет тут помог - нашел доку страниц в 9-10, с описание COM-объектов, аналогичное этому: документация по OLE.
Документация давно идет в комплекте с ПО - в инсталляторе...

ООО «ТехноКом», г. Челябинск
Самцов Константин Юрьевич - зам. директора по коммерческой деятельности
SK вне форума   Ответить с цитированием
Сказал «Я - ЗА»:
lefion (25.12.2014)
Старый 24.12.2014, 17:49    | »»» |  #3
SK
Администратор
 
Аватар для SK
 
Регистрация: 27.05.2010
Сообщений: 29,970
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™
По умолчанию

Во-первых, Вы перепутали переменные:
Код:
колРейсов = AG.TripsNum;
	Для в = 1 По числоМашин Цикл
	    AG.TripIndex = в;
Вы присваиваете индексу рейса значения от 1 до числоМашин, а не до колРейсов...

ООО «ТехноКом», г. Челябинск
Самцов Константин Юрьевич - зам. директора по коммерческой деятельности
SK вне форума   Ответить с цитированием
Старый 24.12.2014, 17:53    | »»» |  #4
SK
Администратор
 
Аватар для SK
 
Регистрация: 27.05.2010
Сообщений: 29,970
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™
По умолчанию

Сообщение от lefion Посмотреть сообщение
Вообще хочу вытащить показания сенсоров по точкам, в частности уровень топлива.
А их реально нет в каждой точке, этих показаний-то...
Если Вы представляете, как работает терминал, то должны знать, что координатные записи пишутся асинхронно с данными различных датчиков. Иными словами, координаты опрашиваются повременно или адаптивно (от изменения вектора скорости), а те же ДУТ-ы - по времени (но интервал задается отдельно) или адаптивно (по изменению уровня).
Если бы в каждой точке писались абсолютно все значения всех датчиков - трафик вырос бы на два порядка.

ООО «ТехноКом», г. Челябинск
Самцов Константин Юрьевич - зам. директора по коммерческой деятельности

Последний раз редактировалось SK; 24.12.2014 в 18:37.
SK вне форума   Ответить с цитированием
Старый 24.12.2014, 18:33    | »»» |  #5
SK
Администратор
 
Аватар для SK
 
Регистрация: 27.05.2010
Сообщений: 29,970
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™
По умолчанию

массивКоординатРейса = 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
	        // и так далее - какие надо данные в точке...
		КонецЦикла;
	КонецЦикла;

ООО «ТехноКом», г. Челябинск
Самцов Константин Юрьевич - зам. директора по коммерческой деятельности
SK вне форума   Ответить с цитированием
Сказал «Я - ЗА»:
lefion (25.12.2014)
Старый 25.12.2014, 07:20    | »»» |  #6
lefion
Начинающий
 
Аватар для lefion
 
Белгород
Регистрация: 24.12.2014
Сообщений: 17
lefion is on a distinguished road
По умолчанию

Сообщение от 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 работать не будет (из-за того что будет вызвано из службы) из-за того что не сможет окно создать ?
lefion вне форума   Ответить с цитированием
Старый 25.12.2014, 07:22    | »»» |  #7
SK
Администратор
 
Аватар для SK
 
Регистрация: 27.05.2010
Сообщений: 29,970
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™
По умолчанию

Сообщение от lefion Посмотреть сообщение
Вообще 1С умеет работать с COMSafeArray...
Я по привычке про 7.7-ку )))

ООО «ТехноКом», г. Челябинск
Самцов Константин Юрьевич - зам. директора по коммерческой деятельности
SK вне форума   Ответить с цитированием
Старый 25.12.2014, 07:31    | »»» |  #8
plex
Дилер
 
Аватар для plex
 
Екатеринбург, ЗАО "Седьмая Экспедиция"
Регистрация: 14.12.2010
Сообщений: 14,952
plex is on a distinguished road
Отправить сообщение для plex с помощью ICQ Отправить сообщение для plex с помощью Skype™
По умолчанию

lefion, окно всегда будет а служба может запускаться от реального пользователя

ЗАО "Седьмая Экспедиция", Екатеринбург, РФ
Мушин Виктор Валерьевич, Технический директор
plex вне форума   Ответить с цитированием
Старый 25.12.2014, 07:52    | »»» |  #9
lefion
Начинающий
 
Аватар для lefion
 
Белгород
Регистрация: 24.12.2014
Сообщений: 17
lefion is on a distinguished road
По умолчанию

Пробовал аналогично получить данные и на C# - на чистой машине отрабатывает, на моей нет.

Возможно что-то с COM у меня, а может что-то опять поломалось после очередной синхронизации в АвтоГРАФ-е.

Кстати, скорость обработки не радует ни в 1С, ни в C# - долго выполняется обход Crd для рейсов. Я понимаю, что доходит до 10k элементов, и что это все таки COM, но тем не менее... Загрузка одного ядра АвтоГРАФом достигает 100%. При том что через AG.TrackCrdsArray (только координаты) достаются практически моментально (больше времени уходит на создание COM-соединения).

Идея механизма обхода данных в целом неплохая, но пригодна только для не частого использования.

Добавлено через 4 минуты
Кстати, можно ли сразу обратиться у нужной технике, не перебирая все группы в поисках нужной ?
Хотя бы по её коду, который выдаётся AG.CarDevice ( AG.CurrentCarDevice ) ?

Добавлено через 9 минут
И второй интересующий момент, это возможность достать координатные записи за период, не поделенные на рейсы.
Ведь, как я понимаю, кроме рейсов есть ещё и "стоянки", и, возможно, координатные записи для них ?
lefion вне форума   Ответить с цитированием
Старый 25.12.2014, 08:16    | »»» |  #10
SK
Администратор
 
Аватар для SK
 
Регистрация: 27.05.2010
Сообщений: 29,970
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С список ТС, чтобы пометить те, по которым выводить отчет.
Код:
//************************************************************************************************************************************************************************
// Процедура ОтчетПоКоординатам()
//************************************************************************************************************************************************************************
Процедура ОтчетПоКоординатам()
	ТабТС.ВыбратьСтроки();
	ПроцВсе=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));
				КонецЦикла;
			КонецЦикла;
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры //ОтчетПоКоординатам()

ООО «ТехноКом», г. Челябинск
Самцов Константин Юрьевич - зам. директора по коммерческой деятельности
SK вне форума   Ответить с цитированием
Ответ


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

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

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

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


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


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