На простом примере установим связь по ModBus между SP WinPLC V3 и Slave-устройством, в качестве которого я использовал ПЛК 100 от фирмы ОВЕН.
Настройка Slave-устройства на примере ПЛК 100 в сети ModBus TCP подробно описана тут (в первой части мануала): http://www.kipshop.ru/Documentation/lectus/bistriy_start_tcp.zip
По аналогии точно также можно настроить на ModBus через RS232 (либо другие доступные интерфейсы).
Запрограммируем ПЛК 100 аналогично примеру по ссылке выше, но с одним отличием. Одна переменная, предназначенная для передачи, будет инкрементироваться, вторая декрементироваться. Это для того чтобы были видны отличия в сети этих переменных.
Будем считать Slave-устройство настроенным и уже работающим в сети (в нашем случае в обычном Ethernet). Если все же возникли какие-то вопросы по этой части повествования, задавайте их в этой теме, разберем.
Запускаем CoDeSys V3.x и создаем стандартный проект. В качестве целевого устройства выбираем CoDeSys SP Win V3 и язык исполнения ST.
После создания заготовки проекта настраиваем связь с WinPLC в Communication Settings, куда можно попасть двойным щелчком мышки на строке Device в дереве устройств во вкладке Devices слева (рис 1.)
Рис. 1
Затем двойным щелчком на PLC_PRG переходим в редактор ST где пишем программу x:=x+1;
И так, мы имеет софт-контроллер с простейшей программой. Наша задача считать данные из Slave-устройства, о котором известно, что оно вещает, а вернее выдает по запросу, две переменные по протоколу ModBus TCP/IP.
Добавим ветку в проект от Device, устройство Ethernet от этого устройства добавим ModBus master и в свою очередь от этого устройства ModBus Slave.
Для этого щелкаем правой клавишей мышки на строке Device и выбираем Add Device или Add Object в этом случае результат будет одинаковый. В появившемся окне устройств выбираем Ethernet Adapter -> Ethernet и щелкаем на него дважды. Закрывать окно Add Device не обязательно.
Видим, что в дереве устройств в окне на заднем плане появилось устройство Ethernet по ветке от Device. Не закрывая окна Add Device, щелкаем на уже добавленный Ethernet в дереве устройств главного окна (то что на заднем фоне) и замечаем, что содержимое окна Add Device изменилось. В Add Device выбираем Modbus TCP Master -> Modbus TCP Master дважды на нем щелкаем. В дереве устройств на заднем фоне в ветке Ethernet появляется Modbus_TCP_Master.Не закрывая окна Add Device, выбираем только что добавленное устройство Modbus_TCP_Master. В окне Add Device выбираем Modbus TCP Slave -> Modbus TCP Slave и щелкаем на нем дважды (Рис 2).
Если на каком-либо этапе Вы закрыли окно Add Device, его всегда можно открыть правой клавишей мышки на ветке (устройстве), в которую нужно вставить новое устройство (см. прилагаемый видеоролик).
Рис. 2
Закрываем окно Add Device и переходим к настройке добавленного Ethernet двойным щелчком мышки на оном.
В появившейся закладке Ethernet Configuration для наших целей достаточно изменить только Interface Name и Network Name на любые, лишь бы не выдавался значок предупреждения справа.
Так же двойным щелчком переходим в настройки Modbus_TCP_Slave. Тут потребуется указать Slave IP Address того устройства, с которого нужно прочитать данные. В моем случае это ПЛК 100 с адресом 192.168.0.114 (Рис. 3)
Рис. 3
Если настройка Slave устройства проводилась по инструкции приведенной выше, и ничего специально не менялось, то в поле Unit-ID указываем 1, а поле Port оставляем без изменений.
В этом же окне переходим во вкладку Modbus Slave Channel и нажимаем кнопку Add Channel в нижней части экрана. Этим самым мы попадаем в диалог добавления считываемых регистров.
Устанавливаем Access Type как Read Holding Registers (Function Code 03) и после этого обращаем внимание на Offset ниже. Это поле по умолчанию стоит 0x0000. Оставляем его так и нажимаем на ОК (Рис. 4).
Если настройка Slave устройства проводилась по инструкции, приведенной выше, и ничего специально не менялось, то в поле Unit-ID указываем 1, а поле Port оставляем без изменений.
В этом же окне переходим во вкладку Modbus Slave Channel и нажимаем кнопку Add Channel в нижней части экрана. Этим самым мы попадаем в диалог добавления считываемых регистров.
Устанавливаем Access Type как Read Holding Registers (Function Code 03) и после этого обращаем внимание на Offset ниже. Это поле по умолчанию стоит 0x0000. Оставляем его так и нажимаем на ОК (Рис. 4).
Рис. 4
После этого действия в активной вкладке Modbus Slave Channel появляется новый канал получения данных.
Забегая вперед, скажу, что также новая строчка появилась во вкладке ModbusTCPSlave I/O Mapping, но туда мы пойдем позже.
Созданный канал будет считывать циклически (Trigger CYCLIC на рис 4) только одну переменную регистр со смещением 0х0000. А нам требуется читать обе переменные.
Добавляем новый канал кнопочкой Add Channel и проводим те же процедуры, как выше, только Offset устанавливаем в 0х0001.
Таким образом, создался второй канал, чем сделал текущую вкладку нам безинтересной.
Далее мы перенесем свое внимание во вкладку ModbusTCPSlave I/O Mapping, где и будет происходить самое интересное.
В этой вкладке требуется установить галочку Always update variables и после этого можно подключаться к контроллеру, загружать в него проект и запускать на выполнение (Рис. 5).
Рис. 5
Если все сделано правильно, в столбце Current Value побегут значения обоих переменных, считываемых из Slave-устройства по Modbus TCP.
Тут же в столбце Variable (в оффлайн режиме) можно замапить (назначить) существующие в проекте переменные, куда будут считываться данные.
Если же по какой-либо ошибке Modbus не запустился и возле Modbus_TCP_Slave повиснет аварийный значек (как сейчас на рисунке 5 возле Ethernet), то данные считываться не будут, о чем будет извещено желтым значком предупреждения. В этом случае после исправления настроек выполните команду Build->Clean All, иначе исправленные настройки могут не подействовать.
На этом все. Наш пример чудом заработал, и если понадобится подключиться по ModBus через COM, сделать это можно по аналогии с приведенным примером (рис. 6).
Рис. 6
Ниже выложен видеоролик, где создается вышеприведенный пример с некоторыми отличиями. Отличия заключаются в считывании второй переменной по переднему фронту флага (переменная z). Этот флаг объявляется глобальным (глобальность, кстати, не обязательна) и меняется отдельной программой по отдельной задаче раз в полсекунды.
Рекомендем ролик смотреть отдельным Флеш-проигрывателем, картинка будет четкой, в отличие от просмотра браузером:
http://www.prolog-plc.ru/st/doc/ModbusTCP_CDSV3.swf