Alex von Bumb
Junior Member / Новичок
Участник № / Member № 6253
отправлено / posted
Добрый день. Пытаемся опросить устройство SO-5L по протоколу ModbusRTU. Параметры связи с устройством: Номер устройства - 5, 38400 8-none-1, адрес сигнала в протоколе - 200, аналог, функция - 3. В ТМ6 создаю проект, добавляю в источники Modbus Rout_Word(3), номер порта - 0, адрес - 5, канал -200, Modbus, input,аналог. Создаю RTM, в нем создаю COM1, Master,38400,8-1-n. И перетаскиваю сигнал из источников в RTM и обзываю его Ua. К ноутбуку подключен преобразователь MOXA USB-RS485 (В системе виден как COM1, параметры выставлены 38400,8-1-n). Сохраняю проект, запускаю профайлер, Rx/Tx на Moxe начинают моргать, видно, что какой-то обмен идет, но в Просмотре компонентов профайлера Ua=0. Вклиниваюсь анализатором протоколов, вижу, что обмен реально идет (считываю запрос/ ответ, вижу значение в ответе). Если система простоит в работе минут 5, то значение все-таки проходит и мы его видим в Просмотре компанентов, однако, если меняем входное значение на SO-5L, то в ТМ оно не меняется. В чем может быть проблема?
Сообщения / Posts 30 | Из / From: РФ
| IP / IP: IP адрес / IP address |
отправлено / posted
В файле конфигурирования запуска узла *.cnf надо задать ключ DEBUGON=F0002200
Каналу Ua установите флажок ОТЛАДКА.
В профайлерном протоколе должна быть информация о работе с COM-портом, ошибках обмена и изменении атрибутов канала Ua.
Надо проанализировать и сопоставить протокол перехвата COM-порта и профайлерный протокол.
"адрес сигнала в протоколе - 200" - десятичный и HEX? А как задан "Канал" в "Источнике" Modbus? Возможно, что реальный "адрес сигнала" надо задавать со смещением "-1". Каков период обработки канала Ua? Как ведет себя атрибут 4 этого канала (ДОСТОВЕРНОСТЬ)?
Сообщения / Posts 17315 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Alex von Bumb
Junior Member / Новичок
Участник № / Member № 6253
адрес сигнала в протоколе - 200 - HEX канал в источнике modbus задан 0х200 и адрес вроде как правильный, потому что в отладчике (которым вклиниваемся в канал) идет обращение именно на этот адрес. период обработки Ua - цикл Calc, пробовали менять на 1 и 5 секунд. В свойствах RTM Пересчет: Период-1, Разрешение-1 В 4м атрибуте значение _F
Сообщения / Posts 30 | Из / From: РФ
| IP / IP: IP адрес / IP address |
отправлено / posted
По стандарту Modbus на запрос одного HOLDING-регистра 05 03 02 00 00 01 84 36 устройство должно ответить 05 03 02 XX YY ZZ TT, где 05 - номер устройства, 03 - номер Modbus-функции, XX YY - содержание регистра, ZZ TT - контрольная сумма.
Ответы устройства 05 03 a0 ab f0 bb или 05 20 a3 15 f0 f7 ни по количеству байтов, ни по содержанию не соответствует стандарту и драйвером воспринимаются как некорректные ответы.
Сообщения / Posts 17315 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Alex von Bumb
Junior Member / Новичок
Участник № / Member № 6253
отправлено / posted
Спасибо, разобрались. Помогло уменьшение скорости передачи. Данные считываются корректно, возник еще вопрос: Как описано в справке TRACE MODE поддерживает отклонения от стандарта MODBUS при работе с переменными FLOAT. Для выбора порядка следования байтов нужно вручную создать текстовый файл modbus.set в папке узла. Файл содержит целое число от 0 до 3, указывающее следующий порядок байтов (байт 0 – младший байт мантиссы, байт 3 – байт знака и порядка):
0 – 3-2-1-0 (данный порядок следования байтов устанавливается в отсутствие файла modbus.set);
1 – 0-1-2-3;
2 – 1-0-3-2;
3 – 2-3-0-1.
Нам нужен порядок следования 3 – 2-3-0-1. Создаю файл modbus.set в папке \project\modbustest1\RTM_1 в нем просто ставлю цифру 3, перезапускаю профайлер и ничего не происходит (Порядок следования не меняется) Что я делаю неправильно?
Сообщения / Posts 30 | Из / From: РФ
| IP / IP: IP адрес / IP address |
отправлено / posted
Перепроверено в релизе 6.09 при разных значениях в файле modbus.set считывается одно и то же число и возвращается: при 0 409.416 при 1 8.6688e-005 при 2 -6.684e-007 при 3 -5.1176e+007
Надо проверить точность размещения, формата, имени и расширения файла modbus.set.
Какую функцию Modbus Вы используете в "Источниках"? Какой канал залинкован на этот "Источник"? Как Вы определяете задаваемый адрес FLOAT-переменной?
Сообщения / Posts 17315 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Alex von Bumb
Junior Member / Новичок
Участник № / Member № 6253
отправлено / posted
В Источниках функция Modbusa 3 Rout_Word(3) Канал в RTM - float мы подаем 1002 - нам приходит 59907 (это при отсутствии файла modbus.set) 59907 в hex это EA03, по логике нам нужно сменить порядок байтов на 03EA (1002). А что значит считывается одно и то же число и возвращается? Правильно ли я понял, что значения при 0 409.416 при 1 8.6688e-005 при 2 -6.684e-007 при 3 -5.1176e+007 отображаются в Просмотре компонентов в Атрибуте реальное значение? Может быть просто я не там смотрю? файл modbus.set расположен в C:\Program Files\AdAstra Research Group\Trace Mode IDE 6 Base\project\modbustest1\RTM_1 RTC также запускает проект modbustest1_5.dbb из этой папки. Содержимое файла modbus.set 2
Сообщения / Posts 30 | Из / From: РФ
| IP / IP: IP адрес / IP address |
Alex von Bumb
Junior Member / Новичок
Участник № / Member № 6253
отправлено / posted
Получается мы работаем с 4х байтовым целочисленным регистром. ТМ по такому же принципу(файлом modbus.set) не умеет разворачивать байты? А каким образом проще осуществить преобразование в читаемое число в данном случае?
Сообщения / Posts 30 | Из / From: РФ
| IP / IP: IP адрес / IP address |
Nico
Forum Professor / Завсегдатай форума
Участник № / Member № 5342
запрашивается один регистр - данных 2 байта перестановки байт в регистрах читаемых 3 и 4 функциями ModBus по последовательному интерфейсу не предусмотрено
Alex von Bumb
Junior Member / Новичок
Участник № / Member № 6253
отправлено / posted
А если мы будем читать 2 регистра - 4 байта, я так понимаю это будет запрос типа 05 03 02 00 00 02 84 36, в таком случае мы сможем развернуть байты как нам требуется? И как такой запрос задавать? 3я функция в Modbus это вроде бы Получение текущего значения одного или НЕСКОЛЬКИХ регистров хранения.
Сообщения / Posts 30 | Из / From: РФ
| IP / IP: IP адрес / IP address |
отправлено / posted
В числе функций MODBUS, которые Вы можете использовать в слое "Источники/Приемники" есть функции, расширяющие стандарт. В частности, для считывания 4-байтовой переменной типа FLOAT из HOLDING-регистров следует выбрать функцию " Rout_Float(3) – считать 4-байтовую переменную с плавающей точкой типа out (номер дополнения к подтипу – 8);" Для такой функции конвертирование порядка байтов поддерживается, как это отражено в документации.
Надо обратить внимание на адресацию функции Rout_Float(3) - ее настройка "Канал" должна указывать адрес младшего из двух регистров, в которых хранится 4-байтовое число FLOAT.
Сообщения / Posts 17315 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Alex von Bumb
Junior Member / Новичок
Участник № / Member № 6253
отправлено / posted
На данный момент на устройстве реализован целочисленный формат передачи данных. Существует ли возможность в ТМ6 считать данный тип данных?
Число имеет следующий вид: 2 регистра = 4 байта Rout_Word(3)#2 посылает запрос типа 05 03 02 00 00 01 84 36 Rout_Float(3)#2 посылает запрос типа 05 03 02 00 00 02 C4 37 но число переводится в вещественный тип данных, а нам нужен целочисленный тип. Можно ли это реализовать?
Сообщения / Posts 30 | Из / From: РФ
| IP / IP: IP адрес / IP address |
Полученные 2 регистра обработать программным путем и сформировать 4-байтовое число с нужным порядком байтов. При необходимости можно записать результат в канал HEX32.
Вариант 2.
Использовать подключение CALL.ChGroupReq с ПАРАМЕТР=2 к источнику MODBUS.R_FIFO_Queue (см. описание канала CALL.ChGroupReq). Аргументам для считывания 4-байтовых чисел задать тип данных UDINT. В файле конфигурирования запуска узла задать ключи: MDB_FLOATCNV=101 MDB_AFCNV<nn>=32 (см. описание этих ключей).
Сообщения / Posts 17315 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Alex von Bumb
Junior Member / Новичок
Участник № / Member № 6253
отправлено / posted
Пытаемся использовать 2й вариант, в источниках создаем MODBUS.R_FIFO_Queue (с такими же параметрами как и в Rout_Word(3), номер порта - 0, адрес - 5, канал -200), создаем канал CALL тип вызова - ChGroupReq,ПАРАМЕТР=2. Привязываем его к источнику, в файле TMcom_5.cnf добавляем параметры MDB_FLOATCNV=101 MDB_AFCNV<nn>=32 запускаем профайлер и видим, что обращение к устройству не идет, на Moxe даже Тх не мигает. Что-то делаем не так. В файле modbustest1_5.txt: (17:45:35) INF_LOAD:Starting... modbustest1_5 (17:45:35) INF_RTM:Detected NT6.RTM 6.1 (17:45:35) INF_RTM:Base TRACE MODE 6 Profiler T-Factory RTM+ ver. 6.09.0 (17:45:35) ._.:RTM (17:45:35) INF_LOAD:max channel = 65535 (17:45:35) INF_LOAD:Load Channels = 1 (17:45:35) INF_LOAD:Templates=0 (math=0 sql=0 scr=0 doc=0 pnl=0) (17:45:35) INF_LOAD:Objects = 3 (17:45:35) INF_RTM:Timer=1s CalcLoop=1000ms (17:45:35) INF_LOAD:LoadTime=0.012s CalcPeriod=1000ms (17:45:35) INF_RTM:available(MB): pm=2666 vm=2047; free(MB): pm=1262 vm=1945 em=0 after load (17:45:35) INF_RTM:total use(MB): pm=1403 vm=102 after load (17:45:35) INF_RTM:use(MB): pm=23(23) vm=23(23) pf=0 after load (17:45:35) INF_RTM:gh:144 uh:80 hh:134 after load (17:45:36) INF_RS:init string is \\.\COM1: baud=9600 parity=N data=8 stop=1 (17:45:36) WRN_RS:found channels = 1 (17:45:36) INF_RS:ModBus-IN CALL#1 : RS=0 ADDR=5 CMD=24 CH=0200 Q=127 (17:45:36) INF_IP:hostname is test (17:45:36) INF_IP:card0 addr=0.0.0.0 (17:45:36) INF_IP:card1 addr=192.168.250.36 (17:45:36) INF_RTM:start time is 0.054 s (17:45:36) INF_RTM:total use(MB): pm=1407 vm=179 after start (17:45:36) INF_RTM:use(MB): pm=28(28) vm=90(90) pf=1764 after start (17:45:36) INF_RTM:gh:1514 uh:132 hh:205 after start (17:45:36) INF_FLT:ModeSwitch e15=0000 e18=0000 e20=0000 [0] (17:45:36) INF_RTM:mode=2(Work) e15=00 e18=00 e20=00 [src4] (17:45:36) INF_FLT:No detect condition (17:45:36) INF_GRAPH:scr:0:popup=0 scrref=0 trend=0,0 update=0 В чем может быть проблема?
Сообщения / Posts 30 | Из / From: РФ
| IP / IP: IP адрес / IP address |
отправлено / posted
1. В ключе MDB_AFCNV<nn>=32 <nn> - это номер устройства. При Ваших настройках нужно писать MDB_AFCNV05=32
2. У канала ChGroupReq, залинкованного на функцию MODBUS.R_FIFO_Queue, надо задать аргументы ARG_000 - IN, тип данных UINT, значение 3 (реализуемая функция Modbus), ARG_001 - IN, тип данных UINT, значение 2 (количество считываемых регистров), ARG_000 - OUT, тип данных UDINT (принимаемое 4-байтное число).
Сообщения / Posts 17315 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Alex von Bumb
Junior Member / Новичок
Участник № / Member № 6253
отправлено / posted
Спасибо, разобрались. В нашем случае потребовался порядок MDB_AFCNV05=16. Данные считываются.
Сообщения / Posts 30 | Из / From: РФ
| IP / IP: IP адрес / IP address |