CODESYS форум

Добро пожаловать на официальный форум CODESYS
Deutsche Version English version russian version 
Текущее время: Вс июл 23, 2017 5:37 am

Часовой пояс: UTC+01:00




Начать новую тему  Ответить на тему  [ 5 сообщений ] 
Автор Сообщение
 Заголовок сообщения: ModBus CDS V3
СообщениеДобавлено: Вт мар 02, 2010 2:40 pm 
Не в сети

Зарегистрирован: Вт сен 15, 2009 7:48 am
Сообщения: 47
Здравствуйте товарищи форумчане. Сегодня на простом примере установим связь по 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

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


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


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


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


Вернуться к началу
   
 Заголовок сообщения:
СообщениеДобавлено: Вт мар 09, 2010 11:50 am 
Не в сети

Зарегистрирован: Вт сен 15, 2009 7:48 am
Сообщения: 47
Проверил - работает:

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

А вот результат:
Изображение

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


Вернуться к началу
 Заголовок сообщения: Re: ModBus CDS V3
СообщениеДобавлено: Ср фев 02, 2011 5:45 pm 
Не в сети

Зарегистрирован: Пн янв 31, 2011 8:17 am
Сообщения: 1
Пример работает нормально, но при кратковременном обрыве связи с плк обмен останавливается, но при востановлении связи обмен больше не востанавливается. Как сделать чтобы при востановлении связи с плк автоматически востанавливался обмен данными?


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 5 сообщений ] 

Часовой пояс: UTC+01:00


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB