В рамках «базового» курса вопросы работы с драйверами в WinCC OA освещаются весьма посредственно, а в рамках моего базового курса - и того посредственнее. В целях исправления данного недочета и написана сегодняшняя заметка.
Необходимо заметить, что по неясным причинам настройка драйвера Modbus TCP сложнее, чем S7 / S7plus. Простым методом тыка (т.н. «инженерная интуиция») задачу не решить, необходимо знать некоторые нюансы. Очень хорошо расписано это, например, у Вячеслава Лапшина на его сайте «Быстрые проекты». Тем не менее, ряд деталей у него в описании был опущен, так что создам свою версию гайда.
Я работаю в среде КАСКАД версии 3.18 beta. По сути, это OEM поставка WinCC OA от компании «СибКом» (https://www.sybcom.ru).
В качестве сервера (подчиненного устройства) протокола Modbus у меня выступает свободнопрограммируемый ПЛК.
Я традиционно работаю в англоязычной среде, не переключаясь на русский.
В случае неясностей рекомендую обратиться к «номерным» частям базового курса.
В первую очередь создаем пустой проект с «классическими» настройками безопасности и выбранным архивированием NextGen. Все шаги создания проекта не описываю, это уже очевидные вещи. Рутовый пароль для учебного проекта не задаю.
![](https://habrastorage.org/getpro/habr/upload_files/9be/c24/10c/9bec2410cafd6dab58daafb25ee020c6.jpeg)
![](https://habrastorage.org/getpro/habr/upload_files/84b/e12/28b/84be1228bdbad3de8c4f55adc5a1efb7.jpeg)
Запускаем созданный проект и переходим в консоль. Добавляем драйвер Modbus (именно драйвер модбаса, а не сервер модбаса!). При добавлении опцией «-num 10» задаем ему номер 10.
![](https://habrastorage.org/getpro/habr/upload_files/b66/516/9e7/b665169e7d95aa1b75874cd8ade2d111.jpeg)
![](https://habrastorage.org/getpro/habr/upload_files/a65/69f/b19/a6569fb193c891342ee2e932a156aa53.jpeg)
Убеждаемся, что драйвер запустился, а он запустился, так как его статус в консоли = 2, а цвет статуса - зеленый.
![](https://habrastorage.org/getpro/habr/upload_files/cea/ec7/204/ceaec72043026f917e1eb9e92b6a3bcb.jpeg)
А вот теперь делаем очень неочевидную вещь. Открываем конфиг-файл нашего проекта. Напоминаю, что его можно открыть через свойства проекта в администраторе проектов.
![](https://habrastorage.org/getpro/habr/upload_files/2d4/433/fa6/2d4433fa66adf5dc578d120c89fdc954.jpeg)
![](https://habrastorage.org/getpro/habr/upload_files/0c4/6f6/fe1/0c46f6fe18a6d040256d1ac40996cd5e.jpeg)
И там мы должны вписать следующее:
[mod_10]
tcpServerPort = 502
Не забываем, что конфиг-файл должен заканчиваться пустой строкой.
![](https://habrastorage.org/getpro/habr/upload_files/6fe/0a2/d46/6fe0a2d467dab9883221f6cc842a283b.jpeg)
10 в секции mod_10, очевидно, совпадает с номером драйвера, который мы указали при его добавлении в консоли. После изменения конфиг-файла необходимо перезапустить драйвер модбаса. Слава у себя пишет, что надо перезапустить весь проект. Однако, я специально провел эксперимент и сделал «и так, и эдак». В моем случае и в моей версии оказалось достаточным перезапустить только драйвер. В первый раз у меня, разумеется, возбудился брэндмауэр Windows и попросил выставить соответствующие разрешения.
![](https://habrastorage.org/getpro/habr/upload_files/e75/5d3/e00/e755d3e00b69dc89b2b418422827416a.jpeg)
При последующих экспериментах файерволл уже настроен и не просит ничего.
Далее переходим в System Management и ищем настройки драйвера модбаса.
![](https://habrastorage.org/getpro/habr/upload_files/a7c/e14/de3/a7ce14de3aea264dfc933f879566ff92.jpeg)
![](https://habrastorage.org/getpro/habr/upload_files/34c/98b/073/34c98b0735f538b65d618f7d6b7c64ba.jpeg)
![](https://habrastorage.org/getpro/habr/upload_files/055/e41/7cc/055e417cc7602c7bdd1cf99b0a497139.jpeg)
Нажимаем кнопку Create и добавляем в список Mod_Plc_10. Как нетрудно догадаться, 10 - это номер драйвера.
![](https://habrastorage.org/getpro/habr/upload_files/915/772/1c0/9157721c016892b1b88571e63844cd4d.jpeg)
Добавляем ip-адрес нашего сервера modbus TCP, ставим галочку Active. Вот так теперь выглядят настройки. Напоминаю, что Unit Address в полноценной реализации протокола Modbus TCP используется только для гейтов TCP - RTU. Нормальные сервера Modbus TCP этот параметр игнорируют. Но встречаются и обратные случаи, и сервер, не являясь гейтом, все равно контролирует свой Unit ID. Поскольку в реализации протокола модбас каждый сходит с ума по-своему, заранее предугадать поведение подчиненного устройства затруднительно. В нашем же случае сервер Modbus TCP реализован правильно, и Unit ID игнорирует.
![](https://habrastorage.org/getpro/habr/upload_files/283/150/144/283150144bbcc2b57b3e6b92047db09c.jpeg)
Нажимаем кнопку Apply. Если вы ожидаете, что после нажатия состояние вместо Not Connected станет Connecting или Connected, то зря надеетесь. Состояние соединения изменится только после добавления первого конфига _address на какую-либо точку данных, для чего традиционно открываем модуль para. Я применяю предопределенный DPT ExampleDP_Int и создаю первую DP с названием MyInt.
![](https://habrastorage.org/getpro/habr/upload_files/91b/618/69e/91b61869e6848a3ae13e0059b5e787ea.jpeg)
Добавляем конфиг _address и начинаем его настройку
![](https://habrastorage.org/getpro/habr/upload_files/289/2f0/776/2892f0776871023b58da6fdde39175c9.jpeg)
![](https://habrastorage.org/getpro/habr/upload_files/68c/f52/959/68cf52959ac161192e2a8ea5c4ea96f4.jpeg)
![](https://habrastorage.org/getpro/habr/upload_files/42d/ff3/2e6/42dff32e653cccde878d599aaf3dc6df.jpeg)
Работать будем с регистрами хранения. Самый первый регистр в моем ПЛК - это шестнадцатиразрядный знаковый Int, который инкрементируется на 1 каждую секунду в программе ПЛК. Соответственно, тип преобразования указываем = Int16. Не забываем добавить группу опроса.
![](https://habrastorage.org/getpro/habr/upload_files/09d/8cd/e7d/09d8cde7d702575608800af12423c8ee.jpeg)
В группе опроса не забывает активировать группу, а то обмен не заработает.
Напоследок делаем адрес активным (ставим галочку).
![](https://habrastorage.org/getpro/habr/upload_files/02b/1ce/9b0/02b1ce9b0438915c20f6f370df6394ea.jpeg)
Переходим на конфиг _original.
![](https://habrastorage.org/getpro/habr/upload_files/9f1/712/201/9f171220199bc4e892ec24543207a06b.jpeg)
Читаемое раз в секунду значение соответствует значению в ПЛК. Этот опыт удался. Кстати, после добавления первого сигнала в окне драйвера появляется надпись Connected.
![](https://habrastorage.org/getpro/habr/upload_files/123/2f1/a13/1232f1a1381c87116837a8da74631607.jpeg)
Следующие два регистра в моем случае - это 32разрядный Int. Заведем еще одну точки данных с именем MyDInt в этом же типе и настроим ее.
![](https://habrastorage.org/getpro/habr/upload_files/d78/7c9/d7b/d787c9d7bb2fb4378e0f1a84f8527b7e.jpeg)
Тип преобразования - уже Int32, это два регистра. Задаем смещение - 1 (нулевой регистр - это MyInt, первый и второй - MyDInt). Группа опроса остается той же. Переходим на конфиг original и наблюдаем недостоверные данные.
![](https://habrastorage.org/getpro/habr/upload_files/774/963/2ea/7749632ea9e6cabd7af8c28df0c9bd71.jpeg)
Значение сигнала тут то ли несколько миллионов, то ли несколько миллиардов, что радикально отличается от значения в ПЛК = 5440 (для этого DInt так же запрограммирован ежесекундный инкремент). Идем смотреть в настройки драйвера. Один регистр Modbus - это 16 бит, два байта. Два регистра - это 32 бита, 4 байта или двойное слово. А порядок байт в слове у нас заранее может быть и неизвестен. Смотрим на закладку продвинутых настроек и находим порядок регистров. Что выставлено по умолчанию - я не знаю. Но на всякий случай попробуем порядок Big endian, как у интелловских процов.
![](https://habrastorage.org/getpro/habr/upload_files/e13/94f/b5c/e1394fb5c8cd54bbdff400bfb5fc0e1d.jpeg)
![](https://habrastorage.org/getpro/habr/upload_files/39b/e78/a9a/39be78a9a86d62630a4bf34523cdfaca.jpeg)
Не забываем нажимать Apply. После этого изменения значение MyDInt стало соответствовать значению в ПЛК. Разумеется, пока я пишу эту заметку, идет время, и сейчас значение сигнала уже не 5440,а немного больше.
![](https://habrastorage.org/getpro/habr/upload_files/d56/5ff/971/d565ff9712d7d7456b36bb5608f11946.jpeg)
На всякий случай смотрим MyInt, не сломалось ли там что-нибудь.
![](https://habrastorage.org/getpro/habr/upload_files/ce1/ecc/f64/ce1eccf64c9554e0bf5e053f0c0ec587.jpeg)
Не сломалось, что вполне ожидаемо. Следующим переметром давайте заведем переменную типа Real (так же, два регистра). На стороне контроллера это значение уже не задается принудительно, так что пропишем и чтение, и запись. Создаем и настраиваем точку данных типа ExampleDP_Float
![](https://habrastorage.org/getpro/habr/upload_files/4c3/ec8/126/4c3ec81262e373af249fad55447251cb.jpeg)
Заданное на стороне ПЛК значение считалось
![](https://habrastorage.org/getpro/habr/upload_files/fa1/938/c30/fa1938c30404a5e865e58a74989e33e5.jpeg)
Добавим к этой DP конфиг _smooth в режиме сравнения старое/новое. В противном случае будет проблематично вбить новое значение в модуле Para, ибо оно будет перезатираться каждую секунду.
![](https://habrastorage.org/getpro/habr/upload_files/e08/341/1a7/e083411a7bac12f51f6ff5e5feb02fba.jpeg)
Меняем значение в модуле Para и лезем проверять контроллер. Все работает.
![](https://habrastorage.org/getpro/habr/upload_files/45a/4cb/b57/45a4cbb57f9777de418a51cc804ba966.jpeg)
![](https://habrastorage.org/getpro/habr/upload_files/ced/97f/0d9/ced97f0d9d570b5efa775adca261381e.jpeg)
И напоследок решил проверить - можно ли задать DPE типа bool и читать его, как бит регистра хранения. Как оказалось, можно.
![](https://habrastorage.org/getpro/habr/upload_files/1fa/cb4/6cd/1facb46cdee688de734781402cfe9a62.jpeg)
Пятый регистр- это слово MyWord в ПЛК. Указываю номер бита = 1 (нумерация в этом случае с единицы). Пробую читать/записывать значение, все получается.
![](https://habrastorage.org/getpro/habr/upload_files/187/cf7/b9b/187cf7b9bdcb4c17fc94024bcdbd328a.jpeg)
![](https://habrastorage.org/getpro/habr/upload_files/580/4ec/ba2/5804ecba2b8cc2034e179137aa432cef.jpeg)
Шестой регистр в блоке данных ПЛК у меня представлен одним битом. Обращаю внимание, что конкретно в этом случае я должен выставить номер бита не 1, а 9, так как идет переворачивание байт в слове, и это никак не победить. Это связано в первую очередь с выравниванием информации в блоках данных Симатиков по слову в случае стандартного доступа.
![](https://habrastorage.org/getpro/habr/upload_files/033/9c0/71d/0339c071d3c6bdc7f86ae8109d3111c0.jpeg)