aslav
Junior Member / Новичок
Участник № / Member № 9803
отправлено / posted
Здравствуйте.
Пытаюсь разобраться с типами данных при работе по Modbus TCP.
Имею устройство, которое в первых двух регистрах передает мне число с плавающей точкой (float). Создал Modbus в источнике, адрес 1, функция R_2Hreg(3), прототип ANALOG-32, тип аргументов real. Перетащил в RTM_0, привязал к выводу на экран с типом in/real.
Без проблем на экране отображаю число.
Далее в третьем и четвертом регистре мне пересылается целое число (integer).
Создал Modbus в источнике, адрес 3, функция R_2Hreg(3), прототип DISCRETE 32, тип аргументов udint(32). Перетащил в RTM_0, указал в нем параметр "число бит" [56] равным 32 и привязал к выводу на экран с типом in/udint.
Никак не удается вывести правильное число на экран. Посдкажите, в чем может быть ошибка?
Сообщения / Posts 2 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Число с плавающей запятой отображается корректно, а целочисленное - нет?
Для начала, считанные значения проверяйте в Панели МРВ. Канал Discrete достоверен (атрибут 4,FA)?
Если достоверен, то, скорее всего вопрос только в порядке чтения байт (см. Перестановка (309)) в настройках подключения к устройству).
Если недостоверен, то проверьте, если ли следующий за считываемым регистром следующий регистр?
После того, как получим с устройств корректное значение, обсудим вопрос корректного вывода на экран
Сообщения / Posts 17345 | Из / From: Россия
| IP / IP: IP адрес / IP address |
aslav
Junior Member / Новичок
Участник № / Member № 9803
отправлено / posted
Здравствуйте!
Все оказалось сложнее. Ситуация с Modbus-устройством следующая:
По функции 3 оно отдает сразу 120 регистров каждый цикл опроса. Например, протокол такой
- в первых двух тип с плавающей точкой float, значение температуры. - во следующих двух целое значение типа integer, количество циклов. - далее в одном регистре идет целое беззнаковое значение типа unsigned short, там другой параметр. - в следующем регистре набор битовых данных.
и так далее для всех 120 регистров различные данные в разных форматах.
Я делал такую задачу когда-то на ISaGRAF, возникает вопрос как действовать в TraceMode. Как разобрать такой пакет данных в TraceMode, вревратив их в переменные, надо которыми уже можно совершать действия - вывод на экран, архивацию, отчеты и прочие возможности.
TraceMode явно делает запросы - "дай мне с такого-то смещение данные в таком-то формате" и так для всех созданных исходных данных для Modbus соединения. А у меня такой пакет каждый такт. С помощью программы Modbus Slave выяснил, что то значение, которое, как я думал, является Integer - на самом деле тот же первое float-значение. Видно в панели МРВ в фомате HEX, они одинаковы.
отправлено / posted
По функции 3 оно отдает сразу 120 регистров каждый цикл опроса. Это точно modbus? Согласно стандарту Modbus, устройство отдает ровно столько данных, сколько указано в запросе.
Как разобрать такой пакет данных в TraceMode, вревратив их в переменные Что бы запросить Х последовательных регистров, без чтения встроенной Справочной Системы (рекомендуется ознакомиться) параграфов о подключении по протоколу ModBus и групповых запросах, Вам достаточно настроить modbus-источник для запроса начального регистра, привязать его к каналу Call.ChGroupReq у которого будет необходимое количество аргументов необходимого типа данных и в необходимом порядке. Проверяем корректность считанных данных и далее работаем с аргументами этого канала.
Сообщения / Posts 17345 | Из / From: Россия
| IP / IP: IP адрес / IP address |