Данный CODESYS форум содержит архивную копию русской ветви только для чтения. Для создания сообщений пожалуйста используйте актуальную международную платформу CODESYS Forum. Close

ModBus CDS V3

Anonymous
2010-03-02
2011-02-02
  • Anonymous - 2010-03-02

    Originally created by: Mikhail Shvetsov

    Здравствуйте товарищи форумчане. Сегодня на простом примере установим связь по ModBus между SP WinPLC V3 и Slave-устройством, в качестве которого я использовал ПЛК 100 от фирмы ОВЕН.

    Настройка Slave-устройства на примере ПЛК 100 в сети ModBus TCP подробно описана тут (в первой части мануала): http://www.kipshop.ru/Documentation/lec ... rt_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.).

    Рис 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

    Ну вот,в двух словах, как то так:)

    IMG: Изображение

    IMG: Изображение

    IMG: Изображение

    IMG: Изображение

    IMG: Изображение

    IMG: Изображение

     
  • Anonymous - 2010-03-04

    Originally created by: Гость

    Делал все тоже самое. Когда в поле (Channels) "Variable" на вкладке ModbusTCPSlave I/O Mapping не вписано имя какой-либо переменной, то %IW0 обновляется в соответсвии со считываемым Modbus регистром. Когда прописываю переменную из проекта (делаю мэппинг) то после загрузки проекта, переменная не обновляется (%IW0 =0).

    Хотя данные ModbusTCP по сети бегают. Что-то где-то упустил?

     
  • Anonymous - 2010-03-04

    Originally created by: Гость

    Цитата:
    Делал все тоже самое. Когда в поле (Channels) "Variable" на вкладке ModbusTCPSlave I/O Mapping не вписано имя какой-либо переменной, то %IW0 обновляется в соответсвии со считываемым Modbus регистром. Когда прописываю переменную из проекта (делаю мэппинг) то после загрузки проекта, переменная не обновляется (%IW0 =0).
    Хотя данные ModbusTCP по сети бегают. Что-то где-то упустил?

    На самом деле переменная %IW0 как раз обновляется (в программе PLC_PRG ее переприсвоил другой переменной чтобы было видно состояние %IW0), не обновляется поле (Channels) "Current Value" на вкладке ModbusTCPSlave I/O Mapping почему-то, всегда показывает 0. (Проект на ПЛК запущен)

     
  • Anonymous - 2010-03-09

    Originally created by: Mikhail Shvetsov

    Проверил - работает:

    Ниже скрин проекта читающего по ModBus данные из контроллера. Данные "мапяться" в переменные ch1 и ch2

    А вот результат:

    Значение ch1 и ch2 меняються "вне" программы.

    IMG: Изображение

    IMG: Изображение

     
  • Anonymous - 2011-02-02

    Originally created by: КИП

    Пример работает нормально, но при кратковременном обрыве связи с плк обмен останавливается, но при востановлении связи обмен больше не востанавливается. Как сделать чтобы при востановлении связи с плк автоматически востанавливался обмен данными?