Симулятор для тестування ПО АСУТП
Доброго дня, шановні хаброжителі!

Розповім вам про свій проект, який роблю у вільний час уже три роки.
Працюю в компанії, що займається автоматизацією на посаді програміста контролерів. Останнім часом в основному використовуємо Siemens, ПЛК SIMATIC S7 та пакет візуалізації WinCC, але є досвід і по інших виробниках. Профіль компанії – нафтогазовий сектор (резервуарні парки, насосні, залізничні естакади, причальні комплекси, системи пожежогасіння).
На даний момент, використовуючи мою програмну платформу, ми можемо позбавитися більшої частини помилок і налагодити автоматизовані функції в комфортних умовах офісу (а не сидячи на котушці кабелю, в приміщенні, що не опалюється, в морозний зимовий день).
У спрощеному вигляді наша АСУТП складається з наступних компонентів:
- Датчики (тиску, температури) та виконавчі механізми (засувки, насоси).
- Програмований логічний контролер (ПЛК).
- Система візуалізації (SCADA, HMI).
У нас у розробці, як правило, беруть участь дві людини. Один пише програму для ПЛК, другий робить систему візуалізації. Зараз намагаємось задіяти третього – тестувальника. Не можу сказати, що ми реалізуємо дуже складні алгоритми управління, але є своя специфіка, пов'язана насамперед із розмірами системи. Наприклад, мій поточний проект у сумі має приблизно 2300 сигналів,Більшість у тому числі вхідні (близько 1500).
Для тестування, стенд, що складається з ПЛК та системи візуалізації, збираємо в офісі. Деякі виробники пропонують програмні симулятори ПЛК, так що іноді можна обійтися звичайною комп'ютерною технікою. Наприклад, S7PLCSim від Siemens:

Залишається питання з датчиками та виконавчими механізмами, пов'язаними з нашою системою через дискретні/аналогові вхідні/вихідні сигнали.
Деякі компанії виробники ПЛК надають інструменти програмної імітації вхідних сигналів. Наприклад, через середовище програмування Step7 контролерів Siemens можна значення будь-якого вхідного сигналу, в реальному ПЛК, встановити примусово (форсувати), а якщо ви використовуєте симулятор контролера, просто встановити через графічний інтерфейс. На наведеній вище ілюстрації: IB 10 – байт входів, IW 5 – слово входів, QB 7 та QW 2 – виходу, а MD 123 – подвійне слово у внутрішній пам'яті котроллера.
Інший підхід, який слід згадати, це імітація вхідних сигналів на рівні заліза. Для нас цей підхід незручний – надто багато часу витрачається на підключення. Крім того, в офісі зазвичай є тільки модуль процесора від ПЛК, а модулі для підключення вхідних/вихідних сигналів, які ставляться в окремих шафах, стоять на складі або вже відправлені для монтажу до замовника.
Зрозуміло, що такими засобами можна провести просту перевірку проходження сигналів від контролера в систему візуалізації і назад. Можна налагодити не дуже складні автоматичні алгоритми, благо, що в Step7 є точки зупинки (breakpoints). Але якщо в алгоритмі бере участь кілька одиниць обладнання (кілька насосів + обв'язування із засувок та датчиків) це досить складно.
Ось уже кілька років для кожногосвого проекту, крім програми для ПЛК, я створюю програмний симулятор автоматизованого об'єкта. Англомовні джерела іноді називають подібні системи Factory Acceptance Test (FAT) simulator (симулятор для заводської приймання) і класифікують їх за ступенем достовірності симуляції. У мережі зовсім небагато інформації щодо створення подібних симуляторів, переважно використовуються Matlab + Simulink, LabView, хтось реалізує симуляцію всередині ПЛК. Існують спеціальні засоби розробки – WinMOD, Mynah MiMiC, Siemens SIMIT, APROS.
Після деяких роздумів вирішив спробувати створити свою платформу. Насамперед було бажання вивчити щось нове (.NET і С#). Обставини склалися вдало, і наша компанія для одного з проектів придбала готову бібліотеку OPC клієнта. Це дозволило мені сконцентруватися на основному завданні.
Щоб створити програмний симулятор для стенду з реальним ПЛК, необхідно передбачити в ньому підміну даних, що одержуються з фізичних входів на імітаційні. На жаль, це доводиться робити у самій програмі контролера. Наступний крок – забезпечити доступ до цих даних через інтерфейс OPC. Після цього можна приступати до написання програми ПЛК і створення симулятора об'єкта, що автоматизується.
Якщо використовувати S7PLCSim – у заміні даних немає потреби. При цьому систему візуалізації доведеться запустити на тій же машині разом із S7PLCSim та симулятором об'єкта (обмеження S7PLCSim). У разі нестачі потужності можна спробувати рознести їх за допомогою безкоштовної утиліти NetToPLCSim.
Платформа, яку я розробив, нагадує примітивне середовище для створення систем візуалізації. Роботу можна розбити на три етапи:
- Створення змінних (Item). Їх лише три типи:
- Internal - внутрішнязмінна, яка використовується для зв'язку між об'єктами усередині симулятора.
- OPC – змінна пов'язана із зовнішнім OPC сервером. У разі симулятор виступає OPC клієнтом.
- S7PLCSim - ця змінна призначена для зв'язку з симулятором контролера SIMATIC S7. Підтримуються області пам'яті I, Q, M та DB. На поточній стадії розвитку платформа дозволяє підключення тільки до одного симулятора контролера SIMATIC S7 і одного сервера OPC. Зате всі змінні видно по OPC, так як платформа є OPC сервером.
Додавати та видаляти змінні можна під час роботи симулятора. Система не дозволить видалити змінну, яка використовується.
Об'єкти можна додавати, видаляти та редагувати його властивості під час роботи симулятора.
Створення інтерфейсу користувача. Як база використовується панель із закладками (TabControl). На кожному створеному екрані можна розміщувати відображення об'єктів симуляції. Наприклад, аналоговий датчик можна відобразити його у вигляді повзунка, поля для введення значення або графіка, в будь-якому місці панелі. Один і той же об'єкт можна вивести будь-яку кількість разів, на одній або кількох панелях, у різних видах.
Щоб видалити об'єкт симуляції, необхідно спочатку видалити всі його відображення на всіх панелях. Конфігурація симулятора зберігаються у вигляді XML файлу із простою структурою:
Це дозволяє редагувати його вручну, генерувати скриптами, наприклад Excel, а також повноцінно використовувати систему контролю версій.
Так може виглядати інтерфейс симулятора:

Можливості
Створення симулятора об'єкта, що автоматизується, дає безліч переваг:
- Зручність розробки та тестування.Створюючи програму для ПЛК і паралельно зній симулятор об'єкта, я можу перевірити кожну ділянку коду і змоделювати практично будь-яку ситуацію. Розробник системи візуалізації також користується всіма зручностями симулятора, не вникаючи, при цьому, в програму ПЛК (і не смикаючи мене, щоразу, коли хоче щось перевірити). Більш-менш нормальний графічний інтерфейс дозволяє залучити до тестування системи людини, яка не брала участі в її створенні, а отже, знайде більше помилок, ніж будь-хто з творців. Крім того, навіть на об'єкті можна переключити систему в режим симуляції, щось доопрацювати і перевірити повністю програмним методом, без використання реального обладнання.
- Демонстрація роботи програмної частини системи незалежно від ступеня готовності решти.
- Навчання операторів.Робота системи в режимі симуляції дозволяє оператору більш докладно, і головне без стресу, вивчити роботу системи (і знайти помилки).
- Спрощення гарантійного супроводу системи.Якщо відтворити умови виникнення помилки, іноді можна обійтися без відрядження на об'єкт.
Подальший розвиток
Тому що це мій перший досвід створення чогось серйозного на С#, перш за все, хотілося б переробити архітектуру:
- Виділити шар відповідального за зовнішні з'єднання і реалізувати їх у вигляді модулів, що підключаються (Plug-in). Це дозволить підключатися до кількох OPC серверів та екземплярів Siemens SIMATIC S7PLCSim. Крім того, полегшить додавання інших типів з'єднань, наприклад, Modbus.
- Впровадити клас візуальних елементів не пов'язаних із симуляційними об'єктами. На даний момент будь-який елемент інтерфейсу користувача на екрані обов'язково пов'язаний з об'єктом симуляції, що не дуже зручно. Іноді справді не вистачаєможливості чогось намалювати, вставити картинку або просто написати текст, що пояснює.
- Створити систему модулів, що підключаються (Plug-in) для об'єктів симуляції та їх відображень. Основний напрям розвитку платформи – розширення бібліотеки об'єктів симуляції, тому зручність їх створення та інтеграції є ключовим фактором.