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

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

lefion 24.12.2014 15:01

Получение координатных записей через 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"

Вообще хочу вытащить показания сенсоров по точкам, в частности уровень топлива.

SK 24.12.2014 17:46

Цитата:

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

Документация давно идет в комплекте с ПО - в инсталляторе...

SK 24.12.2014 17:49

Во-первых, Вы перепутали переменные:
Код:

колРейсов = AG.TripsNum;
        Для в = 1 По числоМашин Цикл
            AG.TripIndex = в;

Вы присваиваете индексу рейса значения от 1 до числоМашин, а не до колРейсов...

SK 24.12.2014 17:53

Цитата:

Сообщение от lefion (Сообщение 95353)
Вообще хочу вытащить показания сенсоров по точкам, в частности уровень топлива.

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

SK 24.12.2014 18:33

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

                КонецЦикла;
        КонецЦикла;


lefion 25.12.2014 07:20

Цитата:

Сообщение от SK (Сообщение 95354)
Документация давно идет в комплекте с ПО - в инсталляторе...

Как-то не думал что в инсталляции есть документация. Жаль что её не больше чем уже давно нашел в интернете. И то же нет примеров...

Цитата:

Сообщение от SK (Сообщение 95358)
массивКоординатРейса = AG.TrackCrdsArray;

Это Вам не поможет, т.к. 1С не работает с такими штуками...

Вообще 1С умеет работать с COMSafeArray...
Код:

AG.TrackCrdsArray.Выгрузить()
В нашем случае получается одномерный массив.

Но проблема даже не в этом, а в том что при попытке установить значение CrdEntryIndex для обхода списка AutoGRAPH отваливается. Ошибок я не вижу.

Цитата:

Сообщение от SK (Сообщение 95355)
Во-первых, Вы перепутали переменные:
Код:

колРейсов = 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 работать не будет (из-за того что будет вызвано из службы) из-за того что не сможет окно создать ?

SK 25.12.2014 07:22

Цитата:

Сообщение от lefion (Сообщение 95367)
Вообще 1С умеет работать с COMSafeArray...

Я по привычке про 7.7-ку )))

plex 25.12.2014 07:31

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

lefion 25.12.2014 07:52

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

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

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

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

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

Добавлено через 9 минут
И второй интересующий момент, это возможность достать координатные записи за период, не поделенные на рейсы.
Ведь, как я понимаю, кроме рейсов есть ещё и "стоянки", и, возможно, координатные записи для них ?

SK 25.12.2014 08:16



ТабТС - это табличка, где у меня выводится в 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));
                                КонецЦикла;

                        КонецЦикла;
                КонецЕсли;
               
        КонецЦикла;

КонецПроцедуры //ОтчетПоКоординатам()



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

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