Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Mitsubishi Electric. Контроллеры, преобразователи частоты, HMI _ Программирование _ QJ71MB91 (Write Single Coil (FC: 05))

Автор: SlySnake 7.04.2017 - 12:57

Салют коллеги.
Сегодня хочу поведать Вам с какими трудностями мы столкнулись при настройке записи Modbus Function:05 (Write Single Coil) и описать путь решения данной задачи.
Начнем с задачи: в наличии контроллер Q06UDEH, к нему прикручен модуль QJ71MB91. Нужно прочитать пул регистров (Function: 04), пул битов(Function:02), и записать 3 катушки(Function:05) со Slave-контроллера.
Первым делом я решил сходить на сайт Mitsubishi и поискать подходящую библиотеку для настройки передачи данных по Modbus от нашего Masterа(QJ71MB91) к Slave (стороннему контроллеру). Из четырех имеющихся библиотек подходящей оказалась только одна QJMB91ModbusSerial_V120, так как оказалась более универсальной, по сравнению с остальными, которые сделаны для конкретного оборудования. Взял ее, внедрил в GX Works 2 и начал курить мануал. В результате чтения выяснилось, что данная библиотека поддерживает только следующие функции: 01h, 02h, 03h, 04h, 0Fh, 10h, 17h. Естественно функции 05 среди них нет. Остальные библиотеки, имеющиеся на сайте Mitsubishi так же не поддерживают F05.
Было решено Read функции 02 и 04 реализовывать через QJMB91ModbusSerial_V120 lib, что в общем то легко получилось. А Write функцию 05 настраивать собственными силами.
Реализация Write Single Coil (FC:05) началась как обычно с курения манула:
QJ71MB91 MODBUSInterfaceModule GX Configurator-MB (SW1D5C-QMBU-E)
Art. no. 168869 01042009 SH(NA)-080578ENG Version G
В результате чтения выяснилось, что 01h, 02h, 03h, 04h, 0Fh, 10h, 17h (которые поддерживает библиотека QJMB91ModbusSerial_V120) используют для передачи целого массива данных функцию Z.MBRW. Но F:05 передает только отдельно каждому регистру данные и использует совсем другую функцию Z.MBREQ, видимо поэтому писатели из Mitsubishi не стали реализовывать F:05 в своей библиотеке и просто забили (БРАВО профессионалам!! :-D)
Пакет данных, передаваемый F:05, выглядит следующим образом:



Далее в мануале удалось найти пример применения Function:05 написанный на LD на стр. 10.23 (256):





Начал разбираться, что куда надо писать и параллельно писать свою программу.
Нужно отправить: F:05, Slave №5, адрес регистра 0002h, значение FF00h.
Подвох заключался в написании сообщения слэйву, там мудовое построение сообщения. Эх и налюбились мы с этим. Ну как бы логично, нужно присвоить D1101 = 5h (Номер функции=05), D1102 = 0002h (адрес регистра), и D1103 = FF00 (Значение ON), как на картинке чуть выше.
А вот и нет. Это было просто не Mitsubishi, если бы они не начали играться со старшими и младшими байтами в слове.
В итоге путем брутфорса (как обычно), получить вывести рабочую формулу:



Объясню, как писать сообщение слэйву:
Слэйв должен получить сообщение (hex):
05 0002 FF00 (контрольную сумму в конце я упускаю, формируется автоматом)




Итого получилось D1101 = 0005h, D1102=FF02h, а D1103=0000h.
Все теперь работает и команда работает. Можно питать свой функциональный блок и использовать для записи F:05.

Надеюсь кому то поможет, удачи!


Автор: inntele 8.04.2017 - 14:31

Сами создаём себе трудности, сами же их героически преодолеваем... Насколько помню, SlySnake, этот модуль не нуждается в библиотеках, а все настройки обмена с ведомыми, включая Автообновление, с легкостью выставляются через соответствующую утилиту, предназначенную для конфигурирования модуля.

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)