Тема / Topic: Драйвер обмена по последовательному порту
Titanic
Junior Member / Новичок
Участник № / Member № 1191
отправлено / posted
Добрый день. 1 Попробовал разработать свой драйвер, используя подтип КОНТР1. В SCADA Trace Mode это оказалось достаточно просто. Однако, в TMHelp нигде не нашел описание переменных следующих структур: 1.1 Удаленный адрес канала – IA, массив unsigned short int i[3]; 1.2 Назначение переменных структур FOUR_BYTE, TWO_BYTE; 1.3 назначение следующих переменных структуры RSDATA: 1.3.1 p.V.c[0], p.V.c[1], p.V.c[2], p.V.c[3]; 1.3.2 p.V.i[1]; 1.3.3 p.F.fmt[2]; 1.3.4 p.F.ind[1]; Если это не резервные переменные, то прошу сообщить их назначение. 2 Существуют ли способы формирования атрибута «Время» канала на уровне редактора базы каналов. И, если да, то какие? 3 Возможно ли управление вносимой в отчет тревог меткой времени? Заранее благодарен.
Сообщения / Posts 6 | Из / From: Россия
| IP / IP: IP адрес / IP address |
отправлено / posted
1) Массив unsigned short int i[3] - то же самое что и unsigned char c[6], только двухбайтные значения. Это же union. i[3] используется для более удобной передачи двухбайтовых переменных из настроек канала, но можно и "склеить" из 2х однобайтовых с[6], получится то же самое. Структуры FOUR_BYTE, TWO_BYTE, а также назначение переменных структуры RSDATA: p.V.c[0], p.V.c[1], p.V.c[2], p.V.c[3]; p.V.i[1]; p.F.fmt[2]; p.F.ind[1]; Являются внутренними переменными системы ТМ, трогать их не надо (также как и знать их назначение).
2) Не совсем понятен вопрос про атрибут "время" - что Вы имели в виду? Зачем формировать его в РБК, ведь это атрибут реального времени и формируется он сервером МРВ, Вы можете его только считывать.
Titanic
Junior Member / Новичок
Участник № / Member № 1191
отправлено / posted
Спасибо за ответ! Появился новый вопрос по блоковым запросам. В разработанном мной драйвере данные нормально считываются со Slave – устройства по сети Modbus (функция 03) и записываются в каналы. При старте сервер матобработки правильно устанавливает каналам признаки принадлежности к запросу. Пример профайлера: RS:Loaded protocol ModbusX RSIN RS=0 ADDR=1 by CH=1 Q=3 RSIN RS=0 ADDR=1 by CH=2 Q=2 RSIN RS=0 ADDR=1 by CH=3 Q=1 RSIN RS=0 ADDR=1 by CH=4 Q=0 Проблема в следующем – при создании N каналов принадлежащих одному блоковому запросу сервер матобработки посылает в сеть несколько запросов вместо одного: Адрес канала = 1 Количество запрашиваемых каналов = N (первый правильный запрос) Адрес канала = N/2 Количество запрашиваемых каналов = N/2 Адрес канала = N/2+N/4 Количество запрашиваемых каналов = N/4 Адрес канала = N/2+N/4+N/8 Количество запрашиваемых каналов = N/8 … Адрес канала = N Количество запрашиваемых каналов = 1 Буду очень признателен, если подскажите место, где я мог допустить ошибку.
Сообщения / Posts 6 | Из / From: Россия
| IP / IP: IP адрес / IP address |
отправлено / posted
1) Относительно ошибки - без исходников трудно сказать. Вероятно что-то неправильно с блоковыми запросами - в zCompare() может быть ошибка. 2) А зачем Вы драйвер ModBus пишите свой, чем не устраивает штатная реализация?
Сообщения / Posts 17320 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Titanic
Junior Member / Новичок
Участник № / Member № 1191
отправлено / posted
Тело функции zCompare_xxx очень простое: ecли count меньше 121 и ia0.c 2 + count == ia1.c 2 вернуть 1; иначе вернуть 0; Почему тогда сервер матобработки при старте правильно устанавливает каналам признаки принадлежности к запросу (видно из профайлера)? Штатная реализация драйвера ModBus меня не устраивает по следующим причинам: 1. Функцией ModBus 16 - отсутствует возможность выполнения блокового запроса. 2. Функции ModBus 03,04 - ограничен размер блокового запроса 65-ю регистрами. 3. Не реализована широковещательная посылка данных. 4. Значения параметров, считанных с интеллектуальных Slave-устройств по сети ModBus необходимо сохранять с определенными метками времени.
Сообщения / Posts 6 | Из / From: Россия
| IP / IP: IP адрес / IP address |