Опрос китайского модуля 8DI/4DO по Modbus RTU
Опрос китайского модуля 8DI/4DO по Modbus RTU
РЕШЕНО!
Здравствуйте! Возможно задаю глупый вопрос, но никак не могу его осилить.
есть китайская железка MBSL8DI4RO 8DI/4DO релейка, с интерфейсом mudbus RTU (внешне похожая ADAM) далее Модуль.
сам по себе Модуль сделан очень добротно. внутри есть гальванические развязки и по RS-485 и даже по питанию. спаяно все аккуратно. есть серьезные опасения, что работать он будет долго и счастливо
Инструкция на этот модуль
Ссылка на Aliexpress где я покупал этот модуль.
Параметры связи с Модулем по умолчанию: RTU, 9600, N, 8,1
я произвожу опрос Модуля с помощью команды MODRD, 1 регистр.
в терминале com порта я Вижу правильный запрос от дельты и правильный ответ от Модуля.
(в параллель с RS-485 между ПЛК и Модулем стоит преобразователь RS485->USB, а на компе использую программу "therminal" и там вижу HEX данные отправляемые на модуль и отсылаемые модулем в ответ)
Запускаю программу опроса и в терминале при одном активном входе на Модуле DI-0 видим:
запрос от функции MODRD: 01 03 00 00 00 01 84 0A
ответ от оборудования: 01 03 02 00 01 79 84
соответственно получаем правильные данные от Модуля. при изменении количества активных входов ответ меняется правильно.
регистр D1050 - все время нули (хотя раньше, когда я читал регистры из других ПЛК дельты и митсубиси там было все правильно, причем не важно какой был режим ACII или RTU)
В регистрах D1070 и далее какой-то бред. в тех регистрах, где должен быть ответ: D1073-D1074 лежат следующие числа
D1073: H0x00040
D1074: H0x00011
там ни при каких перестановках (в пределах моего скудного мировоззрения) никак h03 не получается! в регистрах D1050 и далее просто нули
прошу помощи в данном вопросе.
Решение проблемы (или выход из положения):
После напоминания от tvent о существовании команды MODRW
Использовал modbus запрос H0x02, который запрашивает у прибора заданное количество дискретных входов
MODRW K1 H02 K0 D100 K8 (число K8 используется, поскольку у меня только 8 дискретных входов).
Но тут надо не забывать, что результат операции записывается начиная с D100 и далее в том объеме, который вы запросили, включая всю служебную информацию (соответственно, если вы в программе используете автоназначение адресов или функциональные блоки необходимо позаботится о сохранности всех задействованных в этой операции регистров), а нужные данные начинаются с D102 (а в моем случае и заканчиваются). далее я командой MOV D102 K2M10 я "распаковываю" значение регистра в последовательность из 8 реле, начиная с M10. После беглой проверки я выяснил, что реле, куда я распаковал данные, ведут себя полностью аналогично с обычными дискретными входами.
А для работы с дискретными выходами необходимо использовать ту же MODRW, только с функцией H0x0F, только предварительно запаковать в передаваемый регистр нужные данные: MOV K1M20 D200 (К1 используется только по причине что на Модуле только 4 выхода)
и передать этот регистр в Модуль
MODRW K1 H0F K0 D200 K4 (K4 - поскольку у меня только 4 выхода)
В итоге все начинает работать! хочу обратить внимание на то, что в этом модуле, а скорее всего и во всех аналогичных модулях дискретные выходы имеют задержку по включению и выключению. и это не проблемы передачи данных. а встроенная в Модуль функция.
При пропадании связи через 2 секунды модуль выключает все дискретные выходы.
Здравствуйте! Возможно задаю глупый вопрос, но никак не могу его осилить.
есть китайская железка MBSL8DI4RO 8DI/4DO релейка, с интерфейсом mudbus RTU (внешне похожая ADAM) далее Модуль.
сам по себе Модуль сделан очень добротно. внутри есть гальванические развязки и по RS-485 и даже по питанию. спаяно все аккуратно. есть серьезные опасения, что работать он будет долго и счастливо
Инструкция на этот модуль
Ссылка на Aliexpress где я покупал этот модуль.
Параметры связи с Модулем по умолчанию: RTU, 9600, N, 8,1
я произвожу опрос Модуля с помощью команды MODRD, 1 регистр.
в терминале com порта я Вижу правильный запрос от дельты и правильный ответ от Модуля.
(в параллель с RS-485 между ПЛК и Модулем стоит преобразователь RS485->USB, а на компе использую программу "therminal" и там вижу HEX данные отправляемые на модуль и отсылаемые модулем в ответ)
Запускаю программу опроса и в терминале при одном активном входе на Модуле DI-0 видим:
запрос от функции MODRD: 01 03 00 00 00 01 84 0A
ответ от оборудования: 01 03 02 00 01 79 84
соответственно получаем правильные данные от Модуля. при изменении количества активных входов ответ меняется правильно.
регистр D1050 - все время нули (хотя раньше, когда я читал регистры из других ПЛК дельты и митсубиси там было все правильно, причем не важно какой был режим ACII или RTU)
В регистрах D1070 и далее какой-то бред. в тех регистрах, где должен быть ответ: D1073-D1074 лежат следующие числа
D1073: H0x00040
D1074: H0x00011
там ни при каких перестановках (в пределах моего скудного мировоззрения) никак h03 не получается! в регистрах D1050 и далее просто нули
прошу помощи в данном вопросе.
Решение проблемы (или выход из положения):
После напоминания от tvent о существовании команды MODRW
Использовал modbus запрос H0x02, который запрашивает у прибора заданное количество дискретных входов
MODRW K1 H02 K0 D100 K8 (число K8 используется, поскольку у меня только 8 дискретных входов).
Но тут надо не забывать, что результат операции записывается начиная с D100 и далее в том объеме, который вы запросили, включая всю служебную информацию (соответственно, если вы в программе используете автоназначение адресов или функциональные блоки необходимо позаботится о сохранности всех задействованных в этой операции регистров), а нужные данные начинаются с D102 (а в моем случае и заканчиваются). далее я командой MOV D102 K2M10 я "распаковываю" значение регистра в последовательность из 8 реле, начиная с M10. После беглой проверки я выяснил, что реле, куда я распаковал данные, ведут себя полностью аналогично с обычными дискретными входами.
А для работы с дискретными выходами необходимо использовать ту же MODRW, только с функцией H0x0F, только предварительно запаковать в передаваемый регистр нужные данные: MOV K1M20 D200 (К1 используется только по причине что на Модуле только 4 выхода)
и передать этот регистр в Модуль
MODRW K1 H0F K0 D200 K4 (K4 - поскольку у меня только 4 выхода)
В итоге все начинает работать! хочу обратить внимание на то, что в этом модуле, а скорее всего и во всех аналогичных модулях дискретные выходы имеют задержку по включению и выключению. и это не проблемы передачи данных. а встроенная в Модуль функция.
При пропадании связи через 2 секунды модуль выключает все дискретные выходы.
- Вложения
-
- MBSL8DI4RO внешний вид железки.
- IMG_20171205_102854346.jpg (75.77 КБ) 3876 просмотров
Последний раз редактировалось bayk 06 дек 2017, 14:46, всего редактировалось 6 раз.
Re: Опрос дискр. входов стороннего оборуд. по Modbus RTU
Если протокол Modbus ASCII, то по команде MODRD регистрах D1070-D1080 сохраняется полный ответ (feedback) в символьном формате в младших байтах регистров. Собственно данные начнутся с D1073 и будут выглядеть как 00 33H.
А вот в D1050 -D1055 будут уже преобразованные в HEX значения данных ( 0033H->0003H) .
А вот в D1050 -D1055 будут уже преобразованные в HEX значения данных ( 0033H->0003H) .
Re: Опрос дискр. входов стороннего оборуд. по Modbus RTU
Тогда в D1073-D1070 значение вашего регистра.bayk писал(а):У меня rtu
Если сомневаетесь - берете мануал и...
Re: Опрос дискр. входов стороннего оборуд. по Modbus RTU
Глянул удаленные модули Delta...
Команда modrd работать не будет.
Команда modrd работать не будет.
Re: Опрос дискр. входов стороннего оборуд. по Modbus RTU
немного не понял, что не так, и что с этим делать? завал на работе, поэтому скрины могу сделать только через пару дней
Re: Опрос дискр. входов стороннего оборуд. по Modbus RTU
Не знаю, как у ваших "железок", а у RTU-495 Delta дискретные выходы читаются функцией 01Н ModBus, а дискретные входы 02H.
В MODRD встроена функция 03H. В чем разница - разберетесь сами.
По любому - для чтения/записи нужна команда MODRW.
В MODRD встроена функция 03H. В чем разница - разберетесь сами.
По любому - для чтения/записи нужна команда MODRW.
Re: Опрос дискр. входов стороннего оборуд. по Modbus RTU
tvent, не вводите топикстартера в заблуждение. Он читает состояний не дельтовских модулей.
Описание D1050 - D1055 - Processing MODRD communication data The PLC automatically converts the data in D1070~D1085 in the ASCII mode into hexadecimal values, or combines two lower 8 bits in the RTU mode into 16 bits in the RTU mode. Гуглоперевод :" Обработка данных MODRD.ПЛК автоматически преобразует данные в D1070 ~ D1085 в режиме ASCII в шестнадцатеричные значения, или объединяет два младших 8 бит в режиме RTU в 16 бит в
RTU.
Выберите нужное слово в ответе и выделите необходимую часть. ( ORW и ( или SWAP)) в помощь.
Что вас не устраивает в таком ответе? Уточните модель ПЛК и номер порта который используется.например при активных входах DI-0 и DI-1 я вижу ответ h0003 ну если перевести в BIN: 00000011 (остальную часть не пишу, дабы не вводить в блуд)
Описание D1050 - D1055 - Processing MODRD communication data The PLC automatically converts the data in D1070~D1085 in the ASCII mode into hexadecimal values, or combines two lower 8 bits in the RTU mode into 16 bits in the RTU mode. Гуглоперевод :" Обработка данных MODRD.ПЛК автоматически преобразует данные в D1070 ~ D1085 в режиме ASCII в шестнадцатеричные значения, или объединяет два младших 8 бит в режиме RTU в 16 бит в
RTU.
Выберите нужное слово в ответе и выделите необходимую часть. ( ORW и ( или SWAP)) в помощь.
Re: Опрос дискр. входов стороннего оборуд. по Modbus RTU
ТС пишет о модуле Аля-ADAM. К примеру в ADAM-4150 дискретные входы читаются так же как у Дельты RTU-495 - битовой функцией 02 команды modrw.pkl писал(а):tvent, не вводите топикстартера в заблуждение. Он читает состояний не дельтовских модулей.
Re: Опрос дискр. входов стороннего оборуд. по Modbus RTU
Виноват. Про ADAM не в курсе. Однако в терминальной проге ответ видит правильный, значит что то получает от модуля.