В рамках «базового» курса вопросы работы с драйверами в WinCC OA освещаются весьма посредственно, а в рамках моего базового курса - и того посредственнее. В целях исправления данного недочета и написана сегодняшняя заметка.

Необходимо заметить, что по неясным причинам настройка драйвера Modbus TCP сложнее, чем S7 / S7plus. Простым методом тыка (т.н. «инженерная интуиция») задачу не решить, необходимо знать некоторые нюансы. Очень хорошо расписано это, например, у Вячеслава Лапшина на его сайте «Быстрые проекты». Тем не менее, ряд деталей у него в описании был опущен, так что создам свою версию гайда.

Я работаю в среде КАСКАД версии 3.18 beta. По сути, это OEM поставка WinCC OA от компании «СибКом» (https://www.sybcom.ru).

В качестве сервера (подчиненного устройства) протокола Modbus у меня выступает свободнопрограммируемый ПЛК.

Я традиционно работаю в англоязычной среде, не переключаясь на русский.

В случае неясностей рекомендую обратиться к «номерным» частям базового курса.

В первую очередь создаем пустой проект с «классическими» настройками безопасности и выбранным архивированием NextGen. Все шаги создания проекта не описываю, это уже очевидные вещи. Рутовый пароль для учебного проекта не задаю.

Запускаем созданный проект и переходим в консоль. Добавляем драйвер Modbus (именно драйвер модбаса, а не сервер модбаса!). При добавлении опцией «-num 10» задаем ему номер 10.

Убеждаемся, что драйвер запустился, а он запустился, так как его статус в консоли = 2, а цвет статуса - зеленый.

А вот теперь делаем очень неочевидную вещь. Открываем конфиг-файл нашего проекта. Напоминаю, что его можно открыть через свойства проекта в администраторе проектов.

И там мы должны вписать следующее:

[mod_10]
tcpServerPort = 502

Не забываем, что конфиг-файл должен заканчиваться пустой строкой.

10 в секции mod_10, очевидно, совпадает с номером драйвера, который мы указали при его добавлении в консоли. После изменения конфиг-файла необходимо перезапустить драйвер модбаса. Слава у себя пишет, что надо перезапустить весь проект. Однако, я специально провел эксперимент и сделал «и так, и эдак». В моем случае и в моей версии оказалось достаточным перезапустить только драйвер. В первый раз у меня, разумеется, возбудился брэндмауэр Windows и попросил выставить соответствующие разрешения.

При последующих экспериментах файерволл уже настроен и не просит ничего.

Далее переходим в System Management и ищем настройки драйвера модбаса.

Нажимаем кнопку Create и добавляем в список Mod_Plc_10. Как нетрудно догадаться, 10 - это номер драйвера.

Добавляем ip-адрес нашего сервера modbus TCP, ставим галочку Active. Вот так теперь выглядят настройки. Напоминаю, что Unit Address в полноценной реализации протокола Modbus TCP используется только для гейтов TCP - RTU. Нормальные сервера Modbus TCP этот параметр игнорируют. Но встречаются и обратные случаи, и сервер, не являясь гейтом, все равно контролирует свой Unit ID. Поскольку в реализации протокола модбас каждый сходит с ума по-своему, заранее предугадать поведение подчиненного устройства затруднительно. В нашем же случае сервер Modbus TCP реализован правильно, и Unit ID игнорирует.

Нажимаем кнопку Apply. Если вы ожидаете, что после нажатия состояние вместо Not Connected станет Connecting или Connected, то зря надеетесь. Состояние соединения изменится только после добавления первого конфига _address на какую-либо точку данных, для чего традиционно открываем модуль para. Я применяю предопределенный DPT ExampleDP_Int и создаю первую DP с названием MyInt.

Добавляем конфиг _address и начинаем его настройку

Работать будем с регистрами хранения. Самый первый регистр в моем ПЛК - это шестнадцатиразрядный знаковый Int, который инкрементируется на 1 каждую секунду в программе ПЛК. Соответственно, тип преобразования указываем = Int16. Не забываем добавить группу опроса.

В группе опроса не забывает активировать группу, а то обмен не заработает.

Напоследок делаем адрес активным (ставим галочку).

Переходим на конфиг _original.

Читаемое раз в секунду значение соответствует значению в ПЛК. Этот опыт удался. Кстати, после добавления первого сигнала в окне драйвера появляется надпись Connected.

Следующие два регистра в моем случае - это 32разрядный Int. Заведем еще одну точки данных с именем MyDInt в этом же типе и настроим ее.

Тип преобразования - уже Int32, это два регистра. Задаем смещение - 1 (нулевой регистр - это MyInt, первый и второй - MyDInt). Группа опроса остается той же. Переходим на конфиг original и наблюдаем недостоверные данные.

Значение сигнала тут то ли несколько миллионов, то ли несколько миллиардов, что радикально отличается от значения в ПЛК = 5440 (для этого DInt так же запрограммирован ежесекундный инкремент). Идем смотреть в настройки драйвера. Один регистр Modbus - это 16 бит, два байта. Два регистра - это 32 бита, 4 байта или двойное слово. А порядок байт в слове у нас заранее может быть и неизвестен. Смотрим на закладку продвинутых настроек и находим порядок регистров. Что выставлено по умолчанию - я не знаю. Но на всякий случай попробуем порядок Big endian, как у интелловских процов.

Не забываем нажимать Apply. После этого изменения значение MyDInt стало соответствовать значению в ПЛК. Разумеется, пока я пишу эту заметку, идет время, и сейчас значение сигнала уже не 5440,а немного больше.

На всякий случай смотрим MyInt, не сломалось ли там что-нибудь.

Не сломалось, что вполне ожидаемо. Следующим переметром давайте заведем переменную типа Real (так же, два регистра). На стороне контроллера это значение уже не задается принудительно, так что пропишем и чтение, и запись. Создаем и настраиваем точку данных типа ExampleDP_Float

Заданное на стороне ПЛК значение считалось

Добавим к этой DP конфиг _smooth в режиме сравнения старое/новое. В противном случае будет проблематично вбить новое значение в модуле Para, ибо оно будет перезатираться каждую секунду.

Меняем значение в модуле Para и лезем проверять контроллер. Все работает.

И напоследок решил проверить - можно ли задать DPE типа bool и читать его, как бит регистра хранения. Как оказалось, можно.

Пятый регистр- это слово MyWord в ПЛК. Указываю номер бита = 1 (нумерация в этом случае с единицы). Пробую читать/записывать значение, все получается.

Шестой регистр в блоке данных ПЛК у меня представлен одним битом. Обращаю внимание, что конкретно в этом случае я должен выставить номер бита не 1, а 9, так как идет переворачивание байт в слове, и это никак не победить. Это связано в первую очередь с выравниванием информации в блоках данных Симатиков по слову в случае стандартного доступа.

Комментарии (0)