BECK@IPC ModBus Master CDS V2.3

Стоит задача получить на базе BECK@IPC ModBus master. Slave получается несколько сложнее, посему только укажем возможный путь на решение этой задачи.

ModBus на пользовательском уровне в BECK чипах, к сожалению, не поддерживается. Производителям предлагается строить ModBus устройства либо на Си (примеры выложены на http://www.beck-ipc.com), либо воспользоваться библиотеками CoDeSys MODBUS library.

Тут самое время вспомнить о российском производителе контроллеров OWEN, который не только говорит на CoDeSys, но и совершенно бесплатно предлагает свою собственную библиотеку ModBus.lib для создания ModBus master. Эта библиотека базируется на элементах стандартных библиотек CoDeSys, что оставляет надежду на использование ее для других контролеров, разговаривающих на CoDeSys и имеющих рабочие COM порты, потому как именно через COM порты в этой библиотеке реализуется ModBus master.

Попробуем скрестить эти инструменты. Для этого нам понадобится готовое Slave устройство. Я его сделаю из уже имеющегося ПЛК 100. Бегло ознакомимся с предыдущим примером http://forum-ru.3s-software.com/viewtopic.php?t=888 и заострим внимание на том, как создать Slave устройство на Owen.

После этого создать Slave через RS-232 на Owen с двумя регистрами типа word. Один регистр инкрементировать с помощью параметров задачи раз в секунду (для удобства наблюдения Рис. 1).

img1_7.jpg
Рис. 1.

Для создания Master на BECK нам потребуется сама библиотека от OWEN ModBus.lib (ссылки на библиотеки и документацию в конце статьи) и библиотеки, на которых она базируется Analyzation.lib, ComService.lib, SysLibCom.lib (стандартная).

Стратегия будет состоять в том, что мы создадим проект и включим в него вышеперечисленные библиотеки, откроем COM порт на BECK и с помощью блоков из ModBus.lib будем читать и писать в Slave устройство.

Полезно будет вспомнить пример работы с COM портом http://forum-ru.3s-software.com/viewtopic.php?t=874&start=0. И создать аналогичный проект, оставив пустым блок Write. Параметры COM порта следует указать аналогичным Slave (рис 1.).

Не буду расписывать создание каждого блока, ИМХО, все будет и так понятно, а приведу сразу раздел переменных и весь проект на рис. 2:

Код:
PROGRAM PLC_PRG
VAR
(********** Для COM порта ***************)
dwHandle: DWORD:= INVALID_HANDLE;
Settings: _;
bSt: BOOL;
(********************************************)

Switch: BOOL; (*Ключ на старт*)
x:WORD; (*переменная для полученных данных*)
y:INT; (*переменная для посылки*)

get1_modbus: MB_RD_HOLD_REGS; (*функция 03 - чтение параметра типа INT*)
send1_modbus:MB_WR_SNG_REG; (*функция 06 - запись параметра*)

cmpl: BOOL; (*Признак завершение работы ModBus блока*)
err: INT; (*номер ошибки*)
DataSize: WOR (*кол-во считанных байтов *)
Buffer: ARRAY[0..255] OF BYTE; (* байтовый буфер данных *)
enbl:BOOL:=TRUE; (*Разрешение блоков чтения и записи в модбас*)

END_VAR

img2_7.jpg
Рис. 2

Для выполнения различных функций ModBus в библиотеке ModBus.lib существуют отдельные функции и функциональные блоки. Ознакомиться со всеми можно в прилагаемой к библиотеке документации.

В этом примере мы используем всего два функциональных блока – чтение регистра (ModBus функция 03) и запись регистра (ModBus функция 06).

Для этого в разделе переменных созданы экземпляры этих блоков:
get1_modbus: MB_RD_HOLD_REGS; (*функция 03 - чтение параметра типа INT*)
send1_modbus:MB_WR_SNG_REG; (*функция 06 - запись параметра*)

Следует заметить, что на сайте www.owen.ru есть примеры работы с ModBus. Именно оттуда перекочевали некоторые строчки этого примера, и название переменных были взяты также оттуда.

Если сравнивать примеры Owen можно заметить, что в случае с BECK в блоках Read и Write в параметр ComHandle передается указатель на открытый порт (указатель получаем блоком выше) в отличии от OWEN, где указывается номер открытого порта.

Блок считывания Read выполняем до тех пор, пока признак завершения операции cmpl не станет True. Как только cmpl станет TRUE, архив Buffer будет содержать кадр (пакет) данных ModBus.

Путем исследования этого пакета я увидел, что два байта нулевого регистра Slave устройства попадают в 3- старший,4- младший байт архива Buffer (архив начинается с 0).

В следующем блоке основной программы Pause соберем два байта Буфера в переменную X и приготовим переменную Y к передаче.(Безусловно, более грамотно процесс сборки X разместить во входном одноразовом действии блока, но и без этого окна не лезут в скриншот)

Для более удобного наблюдения за поведением переменных я поставил необязательную паузу в полсекунды на этом блоке и в пустом блоке Pause2.

В блоке Write передаем переменную Y во второй регистр Slave устройства. Признаком конца передачи будет тот же флаг cmpl.

После полусекундной паузы по циклу повторим все с чтения те с блока Read.

Запускаем проект и наблюдаем, что происходит с параметрами в Slave устройстве и с переменными в BECK (Рис. 3).

img3_7.jpg
Рис. 3

Из Рис 3. видно , что переменная X 168 ms назад считалась из Owen Slave устройства. За время паузы 500ms блок Pause насчитал какое-то значение Y, и следующий блок Write передает это значение в параметр V2 Slave устройства. Работает!

Для Slave на BECK библиотеку Owen к сожалению не написал. Но можно воспользоваться подходом Owen и написать собственные «низкоуровневые» функции для работы по протоколу ModBus через RS-232, используя стандартные библиотеки CoDeSys. Код также можно подсмотреть в реализации ModBus.lib – библиотека не защищена паролями, и для просмотра ее кода с богатыми русскими комментариями достаточно снять ограничения на доступ в свойствах функций и функциональных блоках.

Как видим, скрещивание продуктов немецкой и русской интеллектуальной собственности вполне жизнеспособно. А все благодаря чему? Правильно, благодаря CoDeSys.

************************ ССЫЛКИ *************************
1) Библиотеки, примеры (для овен естественно) и документацию на русском языке к этим библиотекам вы можете скачать с сайта OWEN www.owen.ru (прямая ссылка на архив (168M)ftp://78.107.137.186/CD/Disc_PLC1xx_8.11.zip
2) Ссылка ТОЛЬКО на библиотеки, использовавшиеся в примере: http://www.prolog-plc.ru/st/doc/ModBusLib.rar
3) Проект из примера для Owen Slave: http://www.prolog-plc.ru/st/doc/O100ModbusSlave.pro
4) Проект из примера для BECK@IPC (DK55): http://www.prolog-plc.ru/st/doc/COM_MODBUS_DK55_SFC.pro

Обсуждение на форуме