Здравствуйте. Возникла проблема при записи регистра в 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. просмотр регистров чем ?