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'е, вроде включения глобальных настроек безопасности, среда будет выдавать вам предупреждающие и временами даже угрожающие окна сообщений. При описании я не акцентировал на этом внимание, так что просто нажимайте кнопку ОК и со всем соглашайтесь.
Захожу по самому первому варианту, без сертификатов, без шифрования, без пароля, нажимаю «ConnecttoselectedEndpoints» и перехожу на вкладку «Browsenodes». В контроллере загружена программа управления котельной, нахожу одну переменную (Node или узел — так называется «тэг» или «переменная» в протоколе) В правой верхней части есть строчка Nodeid (идентификатор узла или «адрес переменной»), выделяю его мышкой и жму Ctrl-C Перехожу на вкладку Read/Write, вставляю скопированный nodeid и нажимаю кнопку Read Получаю прочитанное значение переменной равное 3. Действительно, все совпадает, насосы отопительного контура должны чередоваться в третий день недели, и именно эта цифра вбита в переменную DayOkWeek блока данных OKPumpsAuto. Закрываю программу. Базовый функционал есть, и он работает. Но этого мало. Сейчас OPC UA сервер настроен на режим «заходи, кто хошь, бери, че хошь». Необходимо добавить немного безопасности.
Теперь любое открытие проекта TIA Portal будет требовать ввода логина и пароля. Кроме администратора проекта, разумеется, можно и нужно создать пользователей с меньшими правами.
Нажимаем кнопку «…» рядом с надписью «Servercertificate»,а в появившемся окне — кнопку «Addnew». Создаем новый сертификат устройства, все значения остаются по умолчанию. Сертификат, как видно, подписан серьезной организацией! В итоге все становится вот так: Сейчас предлагаю скомпилировать проект, загрузить его в ПЛК и проверить программой, как работает связь. На самом деле, в результате последних изменений в настройках уровень секьюрности не поднялся ни на йоту. Все это было лишь подготовительным процессом. Потихоньку приходит время приступать к настройкам контроллера, который будет играть роль OPC UA клиента, проверить обмен данными, ну а потом уже закрыть все бреши в безопасности. Но вначале необходимо выгрузить xml файл с описанием всех тэгов (узлов, nodes) контроллера-сервера. Этот файл формируется достаточно просто — система выбирает только те переменные, которые помечены флагом Accessiblefrom HMI/OPC UA и разрешает их запись, если стоит флаг Writablefrom HMI/OPC UA . Например: Для экспорта снова заходим в настройки CPU и ищем там OPC UA → Server → Export, нажимаем кнопку «Export OPC UA XML file» Переходим к настройкам OPC UA клиента, то есть той стороны обмена, которая будет инициировать связь, запрашивать и записать переменные. В качестве клиентской части у меня выступает S7-1510 с прошивкой FW2.6.
В поле usage я дополнительно указал, что сертификат используется для OPC UA Client'а, по умолчанию у меня был выставлен Tls.
PLC_2 → OPC UA communication → ClientInterfaces →Addnewclientinterface Жмем кнопку «Importinterface» и подгружаем ранее экспортированный XML файл Теперь открыты все Nodes серверного контроллера. Поскольку стоит задача учебного характера, требуется немного — просто считать 4 переменных блока OKPumpsAuto. Для этого я создаю Readlist и перетаскиваю интересные мне переменные из правой части экрана в левую. Разумеется, в боевых задачах список чтения может быть больше. Разумеется, в боевых задачах будет не только чтение, но и запись переменных. В этой заметке ограничился одним чтением. В итоге у нас получается следующее: Итого у нас создан один интерфейс, состоящий из одного списка чтения. Набор данных для чтения подготовлен. Но чего-то не хватает, необходимо еще настроить само соединение интерфейса. Для этого открываем вкладку Properties в нижней части экрана Необходимо прописать ip-адрес сервера, в моей случае 192.168.43.10. На странице Security выбираем ранее созданный клиентский сертификат и пока ничего более не меняем. Создание и заполнение клиентского интерфейса привело к автоматическому созданию двух блоков данных: Client interface_1_Data и Client interface_1_Configuration. Смотрим блок данных Data, там уже указаны те переменные, которые планируем читать. Чертовски удобно.
В проект добавляются следующие меркерные переменные Ищем функцию OPC_UA_Connect и перетаскиваем ее в нетворк OB1 Имя экземплярного блока я оставил по умолчанию. Что радует — этот вызов имеет графический конфигуратор, как, например, вызовы S7-связи в TIA Portal'е или вызов PID-регулятора. Этот конфигуратор экономит просто уйму времени, а это не может не радовать. Остается выбрать только созданный клиентский интерфейс (он один) и обвязать блок вспомогательными переменными. Для лучшего понимания привожу скриншот из онлайн справки Step 7. Именно в таком порядке необходимо выполнять вызовы (как минимум три) перед тем, как приступить к чтению/записи данных. Любой вызов выполняется по переднему фронту входа Req. Успешное или неуспешное выполнения вызова я фиксирую (не сбрасывая, сброс только ручной) в переменных с именами done или err. Теперь привожу скриншоты всех нетворков программы уже после того, как я последовательно сделал запрос на выполнение функциональных блоков. Как вы видите бит запроса req у меня выставлен в истину (блок отрабатывается только по переднему фронту), биты успешного исполнения (done) выставлены в истину. Если у вас ни done, ни error не выставляется в истину,аconnectionid первого вызова остается равным нулю, значит, что-то сделано не так. Например, используется не тот ServerEndpoint или неправильно установлен сертификат. Эти вызовы должны вызваться последовательно один за другим. Я взводил биты руками и смотрел на результат вызова, а только потом переходил к следующему. Очевидно, что полноценная программа должна осуществлять вызов автоматически и переходить на следующий шаг в зависимости от результата текущего. Нетворк 4 — самый важный, это цепочка чтения данных с сервера. Ради него все и делалось. Остальные нетворки вызывают функциональные блоки закрытия соединения и освобождения ресурсов. Их я пока не вызывал. В результате вызова нетворка 4 в блоке данных DB2 появились прочитанные данные:
Проматываем ниже до TrustedClients. Добавляем сертификат контроллера-клиента (PLC_2). Снимаем галочку Automaticallyacceptclientcertificatesduringruntime. Сервер теперь не будет общаться ни с кем, кроме как с клиентским PLC. Переходим на Userauthentication, запрещаем гостевой доступ, создаем логин/пароль для пользовательского доступа: user1 / password1. Прогружаем серверный PLC. Возвращаемся к клиентскому PLC, открываем Clientinterface, закладка Configuration, выбираем Security, в поле General выставляем режим и политику безопасности: Проматываем ниже, выбираем тип аутентификации — пользователь и пароль, указываем имя пользователя user1, пароль password1 Снимаемгалочку Automatically accept server certificate during runtime Жмем на зеленую стрелочку, сразу переходим на другую закладку настроек ищем там поле «сертификаты партнерских устройств» и добавляем в него сертификат сервера Компилируем и прогружаем клиентский ПЛК (PLC_2), открываем мониторинг OB1 и последовательно вручную исполняем блоки в нетворках1..4 Если все сделано правильно, то все блоки отработают успешно, а данные будут успешно прочитаны в DB2.
Предлагается проверка сертификата сервера, принимаем его Но соединение не устанавливается, сервер не принимает сертификат «левого» клиента. Итого, поставленная цель достигнута. Настроен безопасный обмен данными M2M.
| |
|
Всего комментариев: 0 | |
| |