PLC, HMI, SCADA, INVERTERS, TUTORIALS, INDUSTRIAL AUTOMATION

22:25
Шифрованный обмен между двумя контроллерами S7-1500 по протоколу OPC UA

Протокол OPC UA (https://ru.wikipedia.org/wiki/OPC_UA) появился впервые в контроллерах Simatic во второй версии прошивки и в Step 7 версии 14. Тогда контроллер можно было настраивать только в качестве OPC UA - сервера, то есть ПЛК мог отвечать на запросы и отдавать данные, но не мог сам инициировать связь и опрашивать других участников сети.

 

Радикально ситуация меняется в ноябре-декабря 2018 года с выходом прошивки 2.6 и Step 7 версии 15.1. Появляется возможность настроить CPU в качестве OPC UA клиента. А это, в свою очередь дает нам возможность организовать защищенный канал обмена информацией машина-машина (контроллер-контроллер). И это важно (про существование Secure OUC мне так же известно, однако OUC являет собой обмен данными в свободном формате, чего хватает для маленьких объемов, но отсутствие строгого формата данных накладывает свой отпечаток…). Большинство протоколов полевого уровня для промышленности разрабатывалось в прошлом веке и рассчитаны они, в первую очередь, на честных людей. Только время идет, честных людей становится меньше, информационных злодеев - больше, поэтому обмен данными надо как можно лучше спрятать, зашифровать, запаролить, обложить сертификатами, а всем посторонним в ответ показывать обидные жесты и говорить неприличные слова.

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

Итак, настройка контроллера (S7-1512 FW2.6) в качестве OPC UA сервера.

В процессе некоторых манипуляций в TIA Portal'е, вроде включения глобальных настроек безопасности, среда будет выдавать вам предупреждающие и временами даже угрожающие окна сообщений. При описании я не акцентировал на этом внимание, так что просто нажимайте кнопку ОК и со всем соглашайтесь.

  1. По умолчанию OPC UA отключен в настройках, поэтому заходим в свойства CPU, ищем ветку OPC UA → Server → General и активируем OPC UA Server.

https://pp.userapi.com/c849432/v849432673/148be3/kkE84bbx6TM.jpg

  1. Использование OPC UA в контроллерах Simatic требует приобретение лицензии, поэтому покупаем лицензию, заходим в свойства Runtimelicenses → OPC UA и ставим тип приобретенной лицензии. Лицензии бывают трех типов: маленькая, средняя и большая, в зависимости от типа CPU. S7-1510 и S7-1512 требуют «small».

https://pp.userapi.com/c849432/v849432673/148bf3/OZ6eNWLsPdg.jpg

  1. По желанию можно задать Applicationname для OPC UA сервера, порт и временные интервалы. Интервалы сбора (sampling) и публикации (publishing) я выставил минимальными. Стоит помнить, что уменьшение интервалов повышает нагрузку на CPU. Имя приложения и номер порта оставил по умолчанию.

https://pp.userapi.com/c849432/v849432673/148bfc/85l6tXjMKCc.jpg

https://pp.userapi.com/c849432/v849432673/148c05/o4t4Euj6TV8.jpg

  1. Базовая настройка закончена. Компилируем и грузим PLC.

https://pp.userapi.com/c849432/v849432673/148c0e/xL7xPATSUnA.jpg

  1. Пора бы и проверить, работает ли вообще. Запускаем программу OPC UA Client (ее можно скачать с SIOS по первым двум ссылкам в начале заметки). Ставлю ip адрес моего контроллера — 192.168.43.10 и нажимаю кнопку GetEndpoints. Получаю возможные «точки входа»

https://pp.userapi.com/c849432/v849432673/148c27/4YI1U-rWk20.jpg

Захожу по самому первому варианту, без сертификатов, без шифрования, без пароля, нажимаю «ConnecttoselectedEndpoints» и перехожу на вкладку «Browsenodes». В контроллере загружена программа управления котельной, нахожу одну переменную (Node или узел — так называется «тэг» или «переменная» в протоколе)

https://pp.userapi.com/c849432/v849432673/148c2f/tGRumWIme_8.jpg

В правой верхней части есть строчка Nodeid (идентификатор узла или «адрес переменной»), выделяю его мышкой и жму Ctrl-C

https://pp.userapi.com/c849432/v849432673/148c42/Ozky2kZcH8g.jpg

Перехожу на вкладку Read/Write, вставляю скопированный nodeid и нажимаю кнопку Read

https://pp.userapi.com/c849432/v849432673/148c55/v5tef_LXmWM.jpg

Получаю прочитанное значение переменной равное 3. Действительно, все совпадает, насосы отопительного контура должны чередоваться в третий день недели, и именно эта цифра вбита в переменную DayOkWeek блока данных OKPumpsAuto.

Закрываю программу. Базовый функционал есть, и он работает. Но этого мало. Сейчас OPC UA сервер настроен на режим «заходи, кто хошь, бери, че хошь». Необходимо добавить немного безопасности.

  1. Включаем «глобальные настройки безопасности» в свойствах CPU, Protection&Security → CertificateManager, ставим галочку Useglobalsettings…

https://pp.userapi.com/c849432/v849432382/14450d/ojc_i549DqU.jpg

 

  1. В навигации всего проекта находим SecuritySettings → Settings. Смело нажимаем кнопку Protectthisproject. Действие необратимое, запомните. Снять защиту с проекта уже не получится. Дело в том, что оффлайновый проект будет содержать сертификаты серверной и клиентской машины, они должны быть защищены во избежании покражи. После нажатия кнопки Protect система предложит создать администратора проекта:

https://pp.userapi.com/c849432/v849432382/144529/KDwugv8hbWo.jpg

Теперь любое открытие проекта TIA Portal будет требовать ввода логина и пароля. Кроме администратора проекта, разумеется, можно и нужно создать пользователей с меньшими правами.

https://pp.userapi.com/c849432/v849432382/144539/7RZfvyp-Gso.jpg

  1. После того, как мы активировали глобальные настройки безопасности, необходимо заново вручную сгенерировать сертификат контроллера. В дальнейшем лучше, конечно же, сразу защищать проект, создавать администратора проекта и ставить контроллерам «глобальные настройки безопасности», но данная заметка частично носит общеобразовательный характер. Возвращаемся в настройки CPU, ищем OPC UA → Server →Security

https://pp.userapi.com/c849432/v849432382/144566/doUpH15naWw.jpg

Нажимаем кнопку «…» рядом с надписью «Servercertificate»,а в появившемся окне — кнопку «Addnew».

https://pp.userapi.com/c849432/v849432382/14456f/zaysfdkIyUk.jpg

Создаем новый сертификат устройства, все значения остаются по умолчанию. Сертификат, как видно, подписан серьезной организацией! В итоге все становится вот так:

https://pp.userapi.com/c849432/v849432382/144577/APWjbXChY1M.jpg

Сейчас предлагаю скомпилировать проект, загрузить его в ПЛК и проверить программой, как работает связь. На самом деле, в результате последних изменений в настройках уровень секьюрности не поднялся ни на йоту. Все это было лишь подготовительным процессом. Потихоньку приходит время приступать к настройкам контроллера, который будет играть роль OPC UA клиента, проверить обмен данными, ну а потом уже закрыть все бреши в безопасности. Но вначале необходимо выгрузить xml файл с описанием всех тэгов (узлов, nodes) контроллера-сервера. Этот файл формируется достаточно просто — система выбирает только те переменные, которые помечены флагом Accessiblefrom HMI/OPC UA и разрешает их запись, если стоит флаг Writablefrom HMI/OPC UA . Например:

https://pp.userapi.com/c849432/v849432382/1445c0/-E0Tf7eDO-4.jpg

Для экспорта снова заходим в настройки CPU и ищем там OPC UA → Server → Export, нажимаем кнопку «Export OPC UA XML file»

https://pp.userapi.com/c849432/v849432382/1445d2/Jg8n_jQTuJY.jpg

https://pp.userapi.com/c849432/v849432382/1445db/HhzEP8Z_okg.jpg

https://pp.userapi.com/c849432/v849432382/1445e3/-zjJqr-93Cs.jpg

Переходим к настройкам OPC UA клиента, то есть той стороны обмена, которая будет инициировать связь, запрашивать и записать переменные. В качестве клиентской части у меня выступает S7-1510 с прошивкой FW2.6.

  1. Добавляю контроллер в проект и сразу активирую глобальные настройки безопасности.

https://pp.userapi.com/c849432/v849432350/149174/5vgAuTMrAag.jpg

  1. Активирую OPC UA клиента

https://pp.userapi.com/c849432/v849432350/14917d/XozxUvQ0Tvk.jpg

  1. Активирую лицензию OPC UA

https://pp.userapi.com/c849432/v849432350/149186/_rUpkihlXMs.jpg

  1. Генерирую сертификат этого второго, клиентского контроллера. В дальнейшем контроллер-сервер и контроллер-клиент обменяются (не без моей помощи) своими сертификатами, а подключение незнакомых устройств будет запрещено. Всвойствах CPU идемна Protection & Security, жмем Add new..в таблице Devicecertificates, жмем на кнопку «…» в появившейся пустой строке, жмем «Addnew» в появившемся окне, наблюдаем уже знакомое окно создания нового подписанного сертификата:

https://pp.userapi.com/c849432/v849432350/14920a/A1hw0qFYv28.jpg

В поле usage я дополнительно указал, что сертификат используется для OPC UA Client'а, по умолчанию у меня был выставлен Tls.

  1. Наступает одно из самых интересных: настройка клиентского интерфейса,а точнее — настройка соединения к серверу и создания наборов данных для чтения и/или записи. В структуре проекта у второго (клиентского) контроллера:

PLC_2 → OPC UA communication → ClientInterfaces →Addnewclientinterface

https://pp.userapi.com/c849432/v849432360/14769e/bWlvuhYH34Q.jpg

https://pp.userapi.com/c849432/v849432360/1476a6/YOgm79E69Gk.jpg

Жмем кнопку «Importinterface» и подгружаем ранее экспортированный XML файл

https://pp.userapi.com/c849432/v849432360/1476af/raG-sepojZw.jpg

https://pp.userapi.com/c849432/v849432360/1476b7/GBzKTQeM_4Q.jpg

Теперь открыты все Nodes серверного контроллера. Поскольку стоит задача учебного характера, требуется немного — просто считать 4 переменных блока OKPumpsAuto.

https://pp.userapi.com/c849432/v849432360/1476bf/anKhaf0OwDE.jpg

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

https://pp.userapi.com/c849432/v849432360/1476d2/W7HuMSWTWqg.jpg

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

https://pp.userapi.com/c849432/v849432360/1476db/b21ygGKqK2I.jpg

Необходимо прописать ip-адрес сервера, в моей случае 192.168.43.10.

https://pp.userapi.com/c849432/v849432360/1476fe/PwRRQoySfWo.jpg

На странице Security выбираем ранее созданный клиентский сертификат и пока ничего более не меняем.

https://pp.userapi.com/c849432/v849432360/1476f5/4gs0WC_s1mY.jpg

Создание и заполнение клиентского интерфейса привело к автоматическому созданию двух блоков данных: Client interface_1_Data и Client interface_1_Configuration.

https://pp.userapi.com/c849432/v849432360/147706/rGF44Z4JFEk.jpg

Смотрим блок данных Data, там уже указаны те переменные, которые планируем читать. Чертовски удобно.

https://pp.userapi.com/c849432/v849432360/14770e/bKt5BVRFtJc.jpg

  1. Теперь необходимо написать программу, которая будет устанавливать связь с OPC UA сервером, готовить канал связи, читать информацию и закрывать соединение. Программа носит строго демонстрационный характер, в боевых задачах она должна быть написана по-другому. В онлайн справке на вызываемые блоки находится все необходимая информация. Там же приводится пример на языке SCL, лучше подходящий к промышленному применению, но не такой наглядный, как в моем случае.

В проект добавляются следующие меркерные переменные

https://pp.userapi.com/c849432/v849432360/147749/I0Ia_zfmJSY.jpg

Ищем функцию OPC_UA_Connect и перетаскиваем ее в нетворк OB1

https://pp.userapi.com/c849432/v849432360/147750/q6BhtAs2PAQ.jpg

Имя экземплярного блока я оставил по умолчанию. Что радует — этот вызов имеет графический конфигуратор, как, например, вызовы S7-связи в TIA Portal'е или вызов PID-регулятора. Этот конфигуратор экономит просто уйму времени, а это не может не радовать.

https://pp.userapi.com/c849432/v849432360/147758/-Zb2wKwQ6xQ.jpg

Остается выбрать только созданный клиентский интерфейс (он один) и обвязать блок вспомогательными переменными.

https://pp.userapi.com/c849432/v849432360/147761/jesUrC4RNpU.jpg

Для лучшего понимания привожу скриншот из онлайн справки Step 7. Именно в таком порядке необходимо выполнять вызовы (как минимум три) перед тем, как приступить к чтению/записи данных. Любой вызов выполняется по переднему фронту входа Req. Успешное или неуспешное выполнения вызова я фиксирую (не сбрасывая, сброс только ручной) в переменных с именами done или err.

https://pp.userapi.com/c849432/v849432662/149ad4/kt3FxLMvgAg.jpg

Теперь привожу скриншоты всех нетворков программы уже после того, как я последовательно сделал запрос на выполнение функциональных блоков. Как вы видите бит запроса req у меня выставлен в истину (блок отрабатывается только по переднему фронту), биты успешного исполнения (done) выставлены в истину. Если у вас ни done, ни error не выставляется в истину,аconnectionid первого вызова остается равным нулю, значит, что-то сделано не так. Например, используется не тот ServerEndpoint или неправильно установлен сертификат. Эти вызовы должны вызваться последовательно один за другим. Я взводил биты руками и смотрел на результат вызова, а только потом переходил к следующему. Очевидно, что полноценная программа должна осуществлять вызов автоматически и переходить на следующий шаг в зависимости от результата текущего.

https://pp.userapi.com/c849432/v849432662/149ae4/mI_90QxbQAc.jpg

https://pp.userapi.com/c849432/v849432662/149aed/4i66G4NXrhY.jpg

https://pp.userapi.com/c849432/v849432662/149af6/O--Kw-2y5d8.jpg

https://pp.userapi.com/c849432/v849432662/149b10/TAVC6ni68GM.jpg

Нетворк 4 — самый важный, это цепочка чтения данных с сервера. Ради него все и делалось. Остальные нетворки вызывают функциональные блоки закрытия соединения и освобождения ресурсов. Их я пока не вызывал.

https://pp.userapi.com/c849432/v849432662/149b21/ZvtPg6hInd4.jpg

https://pp.userapi.com/c849432/v849432662/149b29/Y9aGg-XoOJ4.jpg

В результате вызова нетворка 4 в блоке данных DB2 появились прочитанные данные:

https://pp.userapi.com/c849432/v849432662/149b3a/zxupRX09p-I.jpg

  1. В настоящий момент два контроллера общаются по протоколу OPC UA, цель почти достигнута. Но не полностью. Настройки безопасности до сих пор находятся на уровне «бери, чохошь». Я спокойно могу подключиться программой OPC UA Client и читать/записывать все возможные данные. Давайте ограничим круг общения этих ПЛК, пусть они «дружат» только друг с другом. Переходим на серверный контроллер, свойства CPU, OPC UA → Server → Security → Securechannel, убираем из Endpoint'ов политику «NoSecurity»

https://pp.userapi.com/c849432/v849432662/149b4a/_Z2oKO1vF6g.jpg

Проматываем ниже до TrustedClients. Добавляем сертификат контроллера-клиента (PLC_2). Снимаем галочку Automaticallyacceptclientcertificatesduringruntime. Сервер теперь не будет общаться ни с кем, кроме как с клиентским PLC.

https://pp.userapi.com/c849432/v849432662/149b53/lKqY6tatZJQ.jpg

Переходим на Userauthentication, запрещаем гостевой доступ, создаем логин/пароль для пользовательского доступа: user1 / password1.

https://pp.userapi.com/c849432/v849432662/149b5c/lZJPW5cOI1Q.jpg

Прогружаем серверный PLC. Возвращаемся к клиентскому PLC, открываем Clientinterface, закладка Configuration, выбираем Security, в поле General выставляем режим и политику безопасности:

https://pp.userapi.com/c849432/v849432662/149b65/VlIVm7BM9W0.jpg

Проматываем ниже, выбираем тип аутентификации — пользователь и пароль, указываем имя пользователя user1, пароль password1

Снимаемгалочку Automatically accept server certificate during runtime

https://pp.userapi.com/c849432/v849432662/149b7f/PnEq_bbF0yM.jpg

Жмем на зеленую стрелочку, сразу переходим на другую закладку настроек ищем там поле «сертификаты партнерских устройств» и добавляем в него сертификат сервера

https://pp.userapi.com/c849432/v849432662/149b92/PXfpXvjAq0M.jpg

Компилируем и прогружаем клиентский ПЛК (PLC_2), открываем мониторинг OB1 и последовательно вручную исполняем блоки в нетворках1..4 Если все сделано правильно, то все блоки отработают успешно, а данные будут успешно прочитаны в DB2.

  1. Осталось лишь проверить, пустит ли кого-нибудь еще серверный контроллер. Запускаем OPC UA Client и пробуем подключиться. Список Endpoint'ов возвращается. Подключаемся по Basic256 SignAndEncrypt, указав имя пользователя user1 и пароль password1.

https://pp.userapi.com/c849432/v849432662/149ba4/6-xtBTbwKE0.jpg

https://pp.userapi.com/c849432/v849432662/149bac/rs_3C8lrJ7Y.jpg

Предлагается проверка сертификата сервера, принимаем его

https://pp.userapi.com/c849432/v849432662/149bba/ipfEcOqmITk.jpg

Но соединение не устанавливается, сервер не принимает сертификат «левого» клиента.

https://pp.userapi.com/c849432/v849432662/149bc1/y54Ci22r7eg.jpg

Итого, поставленная цель достигнута. Настроен безопасный обмен данными M2M.

 

Категория: SIEMENS | Просмотров: 419 | Добавил: Admin | Рейтинг: 0.0/0
Всего комментариев: 0
avatar