Записная книжка разработчика

Мои проекты

Протокол Modbus в устройствах на базе микроконтроллеров. Часть 1.1

| Comments

Продолжение. Начало здесь: http://32bit.me/?p=355 - введение; http://32bit.me/?p=373 - часть 1.0.

Продолжим эксперименты по исследованию протокола Modbus. Для этого воспользуемся контроллером ICP-DAS i7188EGD:

Он может служить ведомым устройством с поддержкой протокола Modbus RTU.

Этот контроллер может также служить ведомым устройством в сети Modbus TCP, для чего у него имеется порт Eternet. Но контроллер данной модели не может служить ведущим устройством в сети Modbus, для связи со своими модулями расширения он использует собственный протокол, называемый DCON. Однако фирма ICP выпускает аналогичные контроллеры с полной поддержкой потокола Modbus.

Этот контроллер программируется с помощью среды ISaGRAF. Создадим в проекте переменные, с такими же адресами, как в проекте панели и соединим контроллер с панелью через COM-порт. Подключая линию RX COM-порта компьютера поочерёдно к линиям RX и TX контроллера, мы сможем наблюдать посылки, отправляемые панелью и контроллером соответственно (рис. 1).

Рис 1. "Прослушивание" линий COM-порта.

Для эксперимента загрузим в контроллер простую программу, сделанную в среде ISaGRAF (сама программа на FBD, языке функциональных блоковых диаграмм). Она изображена на рис. 2:

Рис. 2. Программа контроллера.

Переменные a1, a10-a14, a30 имеют соответствующие адреса (т.е. 1, 10-14, 30). В переменные a1, a10-13 записываются соответствующие константы, в переменную a14 записывается значение переменной a30 (по этому адресу записывается значение, привязанное к кнопке а программе панели).

После подключения контроллера к панели мы видим, что все переменные отображаются на панели (рис. 3):

Рис. 3.

Теперь пожно "подслушать" диалог контроллера и панели.

Запросы панели:

01 03 00 00 00 01 84 0A - запрос на чтение 1 переменной в регистре 0.

01 03 00 09 00 05 55 CB - запрос на чтение 5 переменных, начиная с регистра 9.

Ответы контроллера:

01 03 02 00 01 79 84

Этим контроллер говорит буквально следующее: "устройство 01 отвечает на запрос с командой 03 и передаёт 02 байта: 00 01. Контрольная сумма сообщения равна 79 84". Это ответ на запрос значения переменной в регистре 0: её значение равно 1 (байты 00 01 в сообщении).

На второй запрос контроллер отвечает:

01 03 0A 00 0A 00 0B 00 0C 00 0D 00 00 61 14

что значит: "устройство 01 отвечает на запрос с командой 03 и передаёт 0A байт: 00 0A 00 0B 00 0C 00 0D 00 00. Контрольная сумма сообщения равна 61 14". Действительно, значения переменных в регистрах с 09 по 13 равны 10 -14 соответственно, т.е. 000A - 000D в 16-ричном коде.

Теперь посмотрим, что будет, если нажать на кнопку на панели. Запрос, отправляемый панелью, мы уже видели: 01 10 00 1D 00 01 02 15 B3 EA F8. Контроллер отвечает на это следующим сообщением: "01 10 00 1D 00 01 91 CF". Это означает:

01 - адрес контроллера

10 - номер функции протокола (Preset Multiple Registers).

001D - начальный адрес, с которого была произведена перезапись регистров 1D16 = 2910, т.е. переменная с адресом 30 (адрес = номер регистра + 1).

0001 - количество переписанных регистров

91CF - контрольная сумма.

В следующей части мы продолжим эксперименты с контроллером.

Продолжение следует.

Владимир Татарчевский