Просмотр полной версии : ПЛК73 + МК110-220.4К.4Р + МК110-224.8ДН.4Р опрос по ModBus
Здравствуйте.
Имеем:
ПЛК73 + ПИ73-2
МК110-220.4К.4Р настроен скорость - 9600 адрес - 2 DIP3 включен
МК110-224.8ДН.4Р настроен скорость - 9600 адрес - 3
По примерам написал простенькую программу по чтению состоянию входов и записи состоянию выходов.
Если ставлю адрес 3 то все замечательно читается и записывается.
А если 2 то видно что модуль опрашивается но данных нет. Хотел уже на ОВЕНСКОМ протоколе опрашивать но в документации написано что выходами не смогу управлять.
Сравнил документации 4К.4Р и 8ДН.4Р они практически одинаковы только по DIP отличаются.
Подскажите что я делаю не так.
Никита Сергеев
13.12.2019, 09:49
Получается, что по адресу 3 вы управляете регистром 50 и считываете регистр 51 - опрос идет замечательно.
Для модуля 8ДН.4Р регистр 50 - БМ выходов, регистр 51 - БМ входов. Это законно, что всё работает.
Теперь вы меняете адрес опрашиваемого устройства на 2.
Получается, что меняете только адрес устройства.
Получается, что на 4К.4Р вы считываете тот же 50 регистр и тот же 51 регистр.
Теперь сравниваем руководства на идентичность.
для 4К.4Р
БМ значений входов регистр 17
БМ значений выходов регистр 18.
т.е. с устройства 4К.4Р нужно считывать регистры 17 и 18, в то время как вы считываете регистры 50 и 51.
Данные при этом не приходят.
Это логично, так как считываете и пишете вы совсем не туда.
Дааааааааааауж.
Пользовался официальной документацией для 4К.4Р отсюда скаченной (https://owen.ru/uploads/171/re_mk110-x.4k.4r_m01__1-ru-32517-1.11.pdf)
и в ней написано регистры 50 и 51
сейчас нашел брошюрку из коробочки и действительно нужно использовать регистры 17 18
Спасибо.
Дааааааааааауж..
по подробней до абзаца на страницые можно, а то в таблице из этого документа все путем
8.3 Работа по протоколу ModBus
Работа по протоколу ModBus может идти в режимах ASCII или RTU.
По протоколу Modbus возможно считывание битовой маски состояния всех дискретных входов (регистрс номером 51 (0х33)).
В регистре используются биты с 0 по 3, старший из них соответствует входу снаибольшим номером.
омандой 16 (0x10) записью битовой маски в регистр с номером 50 (0x32)
A.Simonov
13.12.2019, 15:01
8.3 Работа по протоколу ModBus
Работа по протоколу ModBus может идти в режимах ASCII или RTU.
По протоколу Modbus возможно считывание битовой маски состояния всех дискретных входов (регистрс номером 51 (0х33)).
В регистре используются биты с 0 по 3, старший из них соответствует входу снаибольшим номером.
омандой 16 (0x10) записью битовой маски в регистр с номером 50 (0x32)
Добрый день.
Спасибо.
Поправим в руководстве.
Здравствуйте.
Написал программку опроса модулей, считывает битовую маску состояния дискретных входов без проблем а вот при записи битовой маски дискретных выходов вылетает ошибка по таймауту(см. рис. Ошибки 22 и 32) хотя данные в модуль записываются и выхода включаются согласно битовой маски.
Подскажите в какую сторону рыть?49781
A.Simonov
23.06.2020, 15:49
Не ясно о каком конкретно модуле и регистре речь, но предположу что регистр работает только на запись и не посылает ответы на запросы.
Нет ни какой разницы что при отправке в МК110-220.4К.4Р адрес - 2 DIP3 включен
set2, set3: MB_WR_REGS; (* Функция записи значения регистров 16 (0x10) Write Multiple Registers *)
Buffer[0] := 0;
Buffer[1] := 15; (* Битовая маска состояния дискретных выходов*)
set2(
Enable:= TRUE, (* Разрешение работы блока *)
Mode:=MB_RTU , (* Режим передачи ASCII/ RTU *)
DevAddr:=2 , (* Адрес ведомого устройства *)
FirstAddr:= 18, (* Номер первого регистра для чтения *)
Quantity:= 1, (* Количество записываемых регистров *)
ComHandle:=Settings.Port , (* Номер COM-порта *)
TimeOut:=TimeOut , (* Таймаут T#ХХХms *)
Buffer:=Buffer , (* Буфер данных *)
Complete=>cmpl , (* Скопировать признак завершения операции *)
Exception=>Error); (* Скопировать регистр ошибок *)
IF cmpl THEN (* Если завершено *)
CASE Error OF (* Делаем проверку ошибок*)
255:
Save_error(Err:= 22); (* Ошибка таймаута *)
254:
Save_error(Err:= 23); (* Аппаратная ошибка ПЛК *)
END_CASE
set2(
Enable:=FALSE , (* Завершаем работу блока *)
Mode:=MB_RTU , (* Режим передачи ASCII/ RTU *)
DevAddr:=2 , (* Адрес ведомого устройства *)
FirstAddr:= 18, (* Номер первого регистра для чтения *)
Quantity:= 1, (* Количество записываемых регистров *)
ComHandle:=Settings.Port , (* Номер COM-порта *)
TimeOut:=TimeOut , (* Таймаут T#ХХХms *)
Buffer:=Buffer); (* Буфер данных *)
master := 4;
END_IF
МК110-224.8ДН.4Р адрес - 3
Buffer[0] := 0;
Buffer[1] := 15; (* Записываем данные в буфер*)
set3(
Enable:= TRUE, (* Разрешение работы блока *)
Mode:=MB_RTU , (* Режим передачи ASCII/ RTU *)
DevAddr:=3 , (* Адрес ведомого устройства *)
FirstAddr:= 50, (* Номер первого регистра для чтения *)
Quantity:= 1, (* Количество записываемых регистров *)
ComHandle:=Settings.Port , (* Номер COM-порта *)
TimeOut:=TimeOut , (* Таймаут T#ХХХms *)
Buffer:=Buffer , (* Буфер данных *)
Complete=>cmpl , (* Скопировать признак завершения операции *)
Exception=>Error); (* Скопировать регистр ошибок *)
IF cmpl THEN (* Если завершено *)
CASE Error OF (* Делаем проверку ошибок*)
255:
Save_error(Err:= 32); (* Ошибка таймаута *)
254:
Save_error(Err:= 33); (* Аппаратная ошибка ПЛК *)
END_CASE
set3(
Enable:= FALSE , (* Завершаем работу блока *)
Mode:=MB_RTU , (* Режим передачи ASCII/ RTU *)
DevAddr:=3 , (* Адрес ведомого устройства *)
FirstAddr:= 50, (* Номер первого регистра для чтения *)
Quantity:= 1, (* Количество записываемых регистров *)
ComHandle:=Settings.Port , (* Номер COM-порта *)
TimeOut:=TimeOut , (* Таймаут T#ХХХms *)
Buffer:=Buffer); (* Буфер данных *)
master := 1;
END_IF
причем, признак завершения операции cmpl появляется одновременно с ошибкой = 255.
выхода на модулях включаются.
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot