This is topic Modbus Write Registers (16) in forum Редактор проекта TRACE MODE 6 / at Форум TRACE MODE: техническая поддержка.


To visit this topic, use this URL:
http://forum.adastra.ru/ultimatebb.php/ubb/get_topic/f/32/t/000660.html

Posted by Лобастов Сергей (Участник № / Member № 6240) on :
 
Здравствуйте.
Возникла проблема при записи регистра в Slave устройство Modbus TCP.
Подключение идет по протоколу Modbus TCP к панели производства B&R. Чтение ее регистров осуществляется нормально, контроль достоверности канала работает, а вот запись регистров нет. При этом Modbus Poll-у удается записывать данные в регистры командой Write Multiple Registers (16).
Я создал группу MODBUS, в ней компонент W_Word(16)#3, в его свойствах указал направление Output, COM port 0, устройство 0, канал 0 (для записи с первого регистра), формат Analog, тип протокола TCP/IP, задал IP адрес панели 192.168.0.111.
Далее создал канал CALL типа ChGroupReq с параметром 0 направлением Output. Привязал W_Word(16)#3 к созданному каналу. В канале создал 3 аргумента типа INT направлением OUT. В настройках экрана создал 3 аргумента с теми же параметрами, привязал аргументы экрана к аргументам канала. Создал 3 кнопки типа ввести и передать значение, привязанные к соотв. аргументам экрана. При запуске МРВ при вводе значений с кнопок регистры панели не меняют своего значения. Где я допустил ошибку?
Заранее спасибо.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Если "ChGroupReq с параметром 0 направлением Output", то он будет отрабатывать только по принудительной команде, например, через передачу "1" в атрибут 39 (EXEC).
Можно компонент W_Word(16)#3 задать с напривлением INPUT и соответствующий "ChGroupReq с параметром 0 направлением INPUT".
Такой канал будет передавать любые изменения значений его аргументов.
 
Posted by Лобастов Сергей (Участник № / Member № 6240) on :
 
Поменял на INPUT, остальное оставил прежним - все равно не работает.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Вы изменяли значения аргументов канала "ChGroupReq с параметром 0 направлением INPUT", привязанного к компоненту W_Word(16)?

Надо проводить диагностику.
1. Замените канал ChGroupReg на числовой и проверьте запись индивидуальную.
2. В файле конфигурирования запуска узла задать ключ DEBUGON=400. В протоколе профайлера могут быть сообщения об ошибках сетевого обмена.
3. В атрибуте 240 канала ChGroupReg при неудачной транзакции будет код ошибки.
4. Существует и способ получения расширенной диагностической информации. Для этого надо создать диагностический канал ChGroupReq, привязанный к диагностической переменной @e_TCP_ModBus (см. "Управление и диагностика обмена по встроенным протоколам"). В его аргументах можно увидеть статус обмена с устройством и информацию об ошибках.
 
Posted by Лобастов Сергей (Участник № / Member № 6240) on :
 
Изменение канала ChGroupReq на НЕХ16 ни к чему не привело. Подключил к 240-му атрибуту канала ChGroupReq аргумент экрана, вывел в поле текст и получил код ошибки 8198. Создал канал диагностики как вы сказали, вывел реальное его значение и аргументы (4 штуки) на экран. Получил следующее: R = 2, arg0 = 2, arg1 = 1,39073*e^009, arg2 = 0, arg3 = 1,39073*e^009. Как я понял, т.к. R = 2, соединение установлено. Но что означают другие коды ошибок - я не нашел.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Надо задать тип данных у аргументов диагностического канала UDINT.

Ключ диагностики DEBUGON=400 задавали?
Какие сообщения об ошибках имеются в профайлерном протоколе?
 
Posted by Лобастов Сергей (Участник № / Member № 6240) on :
 
Аргументы экрана и канала установил INPUT формата UDINT, но показания не изменились.
А в какой файл нужно писать ключ? Как он называется?
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
1,39073*e^009 - это формат вещественно числа с плавающей точкой.
Целочисленные аргументы не могут так отображать числа.

Ключ DEBUGON=400 следует ввести в файл TMcom_<ordinal>.cnf, который должен быть размещен в папке узла (см. "Приложения/Задание параметров работы мониторов").
Протокол профайлера также размещается в папке узла. Это текстовый файл с расширением .txt и именем, совпадающим с именем файла .dbb.
 
Posted by Лобастов Сергей (Участник № / Member № 6240) on :
 
Посмотрел лог, нашел там следующее:
INF_TCP:HOST 192.168.0.33:28156 connect to 192.168.0.111:502
(17:49:46) ERR_TCP:recieve wrong command Call_W_out_Words
где Call_W_out_Words - канал ChGroupReq на запись регистров, описанный выше.

Аргументы все поставил целочисленные, и тем не менее выводят они REAL.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
1. Из Вашего первого поста:
"Я создал группу MODBUS, в ней компонент W_Word(16)#3, в его свойствах указал направление Output, COM port 0, устройство 0, "
Если Вы задаете адрес устройства 0, то по стандарту Modbus соответствующая команда будет считаться широковещательной. Команда записи ожидает подтверждения.
"ERR_TCP:recieve wrong command Call_W_out_Words"
означает, что устройство не вернуло ожидаемый ответ с правильным кодом команды.

Надо задать правильный адрес устройства.

2. Проверьте у ГЭ, отображающих диагностические аргументы, форматы отображения. Они должны соответствовать типам данных в аргументах.
 
Posted by Лобастов Сергей (Участник № / Member № 6240) on :
 
Форматы совпадают. Поменял на адрес устройства 1 (реальный адрес Modbus-Slave), но это тоже не помогло. Могу я прислать свой проект (он достаточно прост), чтобы вы подкорректировали, что нужно? И если да, то на какой адрес?
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Присылайте проект с подробными комментариями.
 
Posted by Лобастов Сергей (Участник № / Member № 6240) on :
 
Отправил на hotline@adastra.ru
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
В проекте выявлены ошибки.
Откорректированный проект возвращен почтой.
 
Posted by Лобастов Сергей (Участник № / Member № 6240) on :
 
Во всем разобрался, спасибо большое.
 
Posted by Лобастов Сергей (Участник № / Member № 6240) on :
 
Если кто еще столкнется с подобной проблемой, то чтобы ее устранить надо поставить аргументам канала на запись регистров тип UINT, INPUT, а аргументам экрана, к ним привязанным, поставить тип UINT, OUTPUT, а также задать ненулевой адрес устройства в "Источниках/приемниках".
 
Posted by denchik (Участник № / Member № 6225) on :
 
Пытаюсь записать число с плавающей точкой в регистр(если быть точным в 2 регистра) контроллера.
Создал в Источниках/приемниках W_Float(16) - указал его как INPUT, затем в узле создал канал Float W_Float(16), привязал в экран, аргумент экрана указал как REAL OUTPUT, хочу чтобы по отжатию кнопки(ввести и передать) записывалось число в указанный регистр.
Все работает, но при просмотре регистров, оказывается, что туда записывается огромное число. Знаю, что где то напутал с типом данных, не могу понять где
 
Posted by Nico (Участник № / Member № 5342) on :
 
1. в Источниках/приемниках W_Float(16) = OUTPUT !
2. FLOAT занимает 2 регистра
3. просмотр регистров чем ?
 


Новости АСУ ТП / News | SCADA / HMI | Обучение / Trainings | Свяжитесь с нами / Contact Us



Powered by Infopop Corporation
UBB.classic™ 6.7.2