Решил создать общую тему по этому вопросу. Имею первый вопрос:"Поддерживает ли МикроМРВ эти драйверы?" И хотелось бы одно небольшое уточнение. Для МРВ я написал свою библиотеку для работы с любым устройством по любому протоколу. Функции библиотеки вызывается программой. Механизм опробован и работает. Поэтому никаких t11,t12 не требуется. Так вот МикроМРВ может программно вызывать функции dll, как МРВ? Понятно, что dll будет писаться на EmVC++.
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Под Windows CE функция вызова внешних библиотек не поддерживается.
Подключение корректно написанных драйверов типа T11 и T12 возможно.
В Микро МРВ для XPEmbedded функции вызова внешних библиотек поддерживаются.
Posted by Kollega (Участник № / Member № 4097) on :
Тогда, подскажите еще одно. Можно ли с помощью драйверов t11, t12 опрашивать два (или больше) устройства с разными протоколами по одному сом-порту в МикроМРВ? Может вопросы дилетантские, но я хочу полностью представлять все возможности ТМ. Собственно, я уже организовывал опрос двух устройств (газоанализатор и пылемер) с помощью универсального механизма и двух каналов CALL, включая и выключая их во времени. Но периодически возникают ситуации, когда опроса нет совсем, пока не перегрузишь систему или МикроМРВ.
Posted by Nico (Участник № / Member № 5342) on :
да
Posted by Kollega (Участник № / Member № 4097) on :
Добрый день! Не могли бы Вы предоставить какой-то демо-проект по работе с драйверами?
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Примеры драйверов (исходные тексты) приведены в соответствующем разделе справочной системы.
Все драйверы, поставляемые в составе Trace Mode 6, написаны в соответствии со спецификациями, приведенными в справочной системе.
Любой проект с подключением внешних устройств (см. видео-уроки на сайте) является таким демо-проектом.
Posted by Kollega (Участник № / Member № 4097) on :
Добрый день! Подскажите какие ключи использовать для мониторинга драйверов?
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
В ключе DEBUGON это биты · бит 6 (0x40) – драйверы t12; · бит 9 (0x200) – обмен по RS; · бит 31 (0x80000000) – каналы, работающие по внешним протоколам (t12, Modbus и т.п.) (расширенная информация);
(см. документацию).
Posted by Kollega (Участник № / Member № 4097) on :
Доброе время суток! Пытаюсь написать драйвер t11(TCOM5) для МикроМРВ под Win CE и пока не выходит. Мои действия: 1. Создаю в среде узел Embedded. В нем два канала, в источниках два канала t11. В Visual C++ написана библиотека t11s27.dll. Находится в папке узла. Запускаю, проверяю, все работает прекрасно. 2. Переношу код библиотеки в EmVC, который настроен на данный контроллер(почти уверен, что правильно). Создаю библиотеку, ложу в папку узла Embedded, переношу все в контроллер и ничего не работает. Можно грешить, что где-то в библиотеке нестыковка, но компилируется без ошибок. Отсюда возникают вопросы: 1. Механизм общения с t11(TCOM5) у МикроМРВ такой же как у МРВ? 2.Как все-таки должен называться драйвер и где он должен располагаться в контроллере? 3. В принципе, код что под вин7, что под се одинаков, разница в платформах. Но может на что-то обратить внимание? 4.На пример не надеюсь, но все же))). Не хочется опять применять универсальный механизм обмена, который иногда сбоит. Надеюсь на помощь.
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
1. Для МикроМРВ под Windows CE надо писать драйвер по спецификации "TCOM6. Драйвер t11".
2. Механизм общения с t11(TCOM6) у МикроМРВ такой же как у МРВ.
3. Драйвер должен размещаться в папке МикроМРВ.
4. Имя драйвера зависит от используемого шаблона в слое "Источники/Приемники". Имя T11s27.dll предназначено для компонентов типа TYPE11/UniversalPLC_type1.
5. "1. Создаю в среде узел Embedded. В нем два канала, в источниках два канала t11. В Visual C++ написана библиотека t11s27.dll. Находится в папке узла. Запускаю, проверяю, все работает прекрасно. " Можно понять, что этот эксперимент проводился под Windows 7. Если драйвер размещается в папке узла, а не в папке МРВ (профайлера), драйвер вызываться не будет.
6. Для диагностики обмена с помощью драйверов типа T11 надо использовать ключ DEBUGON=200. В профайлерном протоколе должна быть информация по инициализации заданного COM-порта, вызову драйвера, список каналов. вызывающих драйвер, по транзакциям обмена.
Posted by Kollega (Участник № / Member № 4097) on :
Доброе утро! Все сделал по вашим рекомендациям, но пока увы... (7:21:36) INF_RS:init string is \\.\COM4: baud=9600 parity=N data=8 stop=1 (7:21:36) WRN_RS:found channels = 2 (7:21:36) INF_RS:t11.27 : set 00000000 02181030 (7:21:36) INF_RS:t11.27 : check 00000000 02181190 (7:21:36) INF_RS:t11.27 : get 00000000 02181110 (7:21:36) INF_RS:t11.27 : zCmp 00000000 021811A0 (7:21:36) INF_RS:t11.27 : zAny 02181190 . . . (7:23:28) INF_RS:COM4 TRANSACTION=387 ERROR=0 TIME=112.735 BYTES=10062 Это лог файла узла при испытании на Win7. Все работает нормально.
А это лог контроллера: (7:36:17) INF_RS:init string is COM4:: baud=9600 parity=N data=8 stop=1 (7:36:17) WRN_RS:found channels = 2 (7:36:17) INF_RS:t11.27 : set 00000000 01AE1028 (7:36:17) INF_RS:t11.27 : check 00000000 01AE1264 (7:36:17) INF_RS:t11.27 : get 00000000 01AE10E0 (7:36:17) INF_RS:t11.27 : zCmp 00000000 01AE126C (7:36:17) INF_RS:t11.27 : zAny 01AE1020 (7:36:19) ERR_RS:COM4 err=9 ch=UniversalPLC_type1_1[1] (7:36:20) ERR_RS:COM4 err=9 ch=UniversalPLC_type1_2[2] (7:36:20) ERR_RS:COM4 err=9 ch=UniversalPLC_type1_1[1] (7:36:20) ERR_RS:COM4 err=9 ch=UniversalPLC_type1_2[2] . . . (7:37:22) INF_RS:COM4 TRANSACTION=141 ERROR=141 TIME=64.778 BYTES=1833 Функции вроде корректно вызываются. При запуске узла каналы выставляют недостоверность , т.е. не получают ответа. Но в порт тоже ничего не отсылается. Помогите, пожалуйста разобраться пока контроллер на руках.
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Непонятно, как вы проверяли, что в контроллере в COM-порт ничего не посылается. "Не посылается в COM 4" или не передается из COM 4?
ERR_RS:COM4 err=9 ch=UniversalPLC_type1_1[1] Это сообщение об отсутствии ответа на запрос в течение заданного таймаута. Это означает, что запрос в COM 4 передан, а ответа нет. Надо проверять COM-порт или интерфейсную шину.
Posted by Kollega (Участник № / Member № 4097) on :
Все заработало, большое спасибо за консультацию.
Posted by Kollega (Участник № / Member № 4097) on :
Добрый день, уважаемая техподдержка. Возник небольшой вопрос. Для работы с топливораздаточной колонкой написал драйвер T11 TCOM6. Драйвер работает нормально. Для его вызова использую канал CALL.ChGroupReq. Но в процессе работы надо передавать сколько литров надо отпустить. Сейчас использую атрибут 92,I2 удаленного адреса. Но это хорошо, что число одно. А как можно передавать в драйвер более одного числа? Например, посредством аргументов канала CALL(как при универсальном обмене по RS)?
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Непонятно, зачем Вы использовали CALL.ChGroupReq.
Можно использовать настройку "Дополнительно", которая в интерфейсе TCOM6 формирует переменную void *ext_data.
Posted by Kollega (Участник № / Member № 4097) on :
Добрый день! Возник небольшой вопрос. На сом-порту компьютера сидят два устройства: модуль ввода-вывода I7055 и RFID-считыватель. Модуль опрашивается по встроеному протоколу через Источники-приемники-I7000-I7055, а для считывателя написан драйвер t11s27. Так вот считывать rfid-метки не получается, хотя по сканеру порта видно, что обмен происходит. Но в канал данные не попадают. Когда отвязываю канал IN модуля, то считывание происходит. При этом получается посылать значения в канал OUT модуля. Поэтому вопрос: может ли на одном порту находиться в данном случае модули I7000 и устройства, опрашиваемые посредством драйвера t11s27?
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
В общем случае гарантировать совместимость драйверов различных протоколов нельзя. Надо анализировать регламенты обмена и коды команд для каждого протокола.
Posted by Kollega (Участник № / Member № 4097) on :
Добрый день! Возникла проблема с передачей в драйвер параметров через void *ext_data. Драйвер собранный под Вин7 работает корректно, а вот под контроллер на Embedded C++ нет. Все остальные параметры передаются нормально. Фрагмент кода: void Set_xxx(IA &ia, unsigned int &max_send, unsigned int &max_rec, int &q_rec, RSDATA *p, char *sbuf, void *ext_data) { if (ia.c[1] == 10) { const char* szExtString = *(char**)ext_data;//"261120161646 0 0 0 0 0 0 49.113 0 0 4.60336";// size_t len; len = strlen(szExtString); } } Причем если задать строку явно, то функция strlen отрабатывается нормально. Из этого следует, что строка не передается из МикроМРВ. Поле "Дополнительно" не пустое, вижу прямо в контроллере. Подскажите в чем может быть дело? Версия 6.10.
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
У нас нет возможности консультировать программистов-разработчиков драйверов.
В разделе "Использование для разработки драйверов других компиляторов" указано на необходимость учета особенностей компиляторов и среды функционирования драйвера.
По опыту создания драйверов для контроллеров с OC Windows CE для соответствующей функции выражение
ext = *(char**)(ext_data);
работоспособно.
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Попробуйте (ТОЛЬКО ДЛЯ CE!!!) вместо const char* szExtString = *(char**)ext_data;
использовать const char* szExtString = (char*)ext_data;