Май 12 2010

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

Продолжение. Начало здесь: 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 — контрольная сумма.

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

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

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