Имитация объектов в ПЛК

Для быстрой, грубой но глубокой отладки программы ещё до выезда на объект можно использовать грубые программные имитаторы. Они конечно же не будут адекватными реальному объекту управления, но заставят "ожить" ваш объект. Кроме того, они могут помочь при отладке человеко-машинного интерфейса. В учебных целях имитаторы вообще вещь незаменимая, так как студент сможет сам проверить работоспособность своей программы. Также такие имитаторы сгодятся для демо-стендов. Буду стараться потихонечку наполнять эту страницу новыми объектами. Основной упор будет на учебный процесс. Все примеры, думаю, будут доступны в новом пособии.
Цели программного имитатора:
- проверка работы программы на имиатционной модели;
- проверка работы человеко-машинного интерфейса;
- учебные цели: проверка работы программы (самостоятельная работа) или HMI;
- демонстрационные цели;
   
Генератор случайных чисел
Задание. создать в UNITY генератор случайных чисел от 0-32767 в виде DFB.
Решение.
1) Ознакомиться с математикой процесса можно тут -> используем линейный конгруэнтный метод
Завимость описывается формулой:
ri + 1 = mod(k · ri + b, M)
где M = 231 – 1 = 16#7FFF,
k = 69069,
b = 7,
r0 = 7,
MOD - остаток от дления
 
2) Создаем тип DFB с именем RND.
 
3) В секции Random пишем программу:
 
if init then ri:=r0; end_if;
ri:=MOD (k*ri+b,M);
OUT:=UDINT_TO (ri
);
 
4) Создаем екземпляр блока например с именем RND1
5) Создаем секцию например на ST, которая будет вызывать екземпляр: 
RND1 (%S0); (%S0 - инициализация при холодном старте)
Проверка. Один из вариантов - в операторских экранах создать экран, туда вставить прямоугольник, привязать анимацию (вкладка Animation) к выходу RND1.OUT, а во вкладке AnimationType  выбрать Trend Diagram. 
 
Генератор шумов
Задание. создать в UNITY в виде DFB генератор шумов, искажающий полезный входящий сигнал.
Решение.
1) Создаем тип DFB с именем Noise. Входом является полезный сигнал типа INT, который искажается белыми шумами, накладывающимися на полезный сигнал с амплитудой от minNoise до maxNoise. OUT является искаженный сигнал: OUT=IN+шум
 
2) В секции Noise создаем программу:
 Программа включает код генерации случайных чисел (RND) с заданными параметрами и диапазоном от 0-32767. Инициализация генератора происходит по холодному старту (%S0=TRUE - первый цикл после холодного старта). Далее проводится масштабирование сгенерированного числа по линейному закону, согласно указанных границ для шума (min_Noise, maxNoise). Для корректности операций умножения и деления (предотвращение переполнения) всё проводим с типом DINT, а потом преобразуем в INT. Шум суммируем с входным сигналом IN и подаем записываем в OUT.
3) Создаем экземпляр и вызываем в секции, "пропуская" через него полезный сигнал. Глобальные параметры блока при этом можно оставить без изменения, в этом случае сигнал будет зашумляться от -500 до +500 (5% от 0-10000). 
Проверка. Один из вариантов - в операторских экранах создать экран, где подобно предыдущему примеру показать полезный сигнал с переменной, которая подается на вход экземпляра DFB, и зашумленный сигнал с его выхода. Наложив два прямоугольника с прозрачным фоном можно добиться 2-х перьев на трендовой диаграмме.
 
 
Имитатор сигнала объекта апериодическим звеном (первого порядка) 
Задание. Создать в UNITY в виде DFB имитатор сигнала объекта, который описывается апериодическим звеном с заданными параметрами. Предвидеть возможность имитации шумов а также адитивного возмущения. Положение исполнительного механизма задается в диапазоне 0-10000 (диапазон по умолчанию для переменных, отвечающих за аналоговые входы и выходы).  
Решение.
1) Создаем тип DFB с именем SimulLagNoise. Входами являются: VALVE - положение исполнительного механизма (0-10000), Z - возмущение, INIT - инициализация имитатора начальными значениями. Выходом является SENSOR - имитированный сигнал. Диапазон выходного сигнала задается значениями глобальных параметров sensor_min и sensor_max. Параметрами noise_min и noise_max задается диапазон амплитуды шумов. T_LAG - постоянная времени объекта. 
DFB содержит 2 экземпляра функциональных блоков: Noise (тип Noise с предыдущего примера) для генерации шумов и LAG1(тип LAG_FILTER из CONT_CTL->Conditioning) для реализации апериодического звена.  
  
 
 2) В секции simul создаем программу:
 
 Блоки ".5", ".4" рассчитывают коэффициент объекта по каналу управления (VALVE), который задается входным VALVE (от 0 до 10000) и выходным  диапазоном SENSOR (от sensor_min до sensor_max). Смещение (sensor_min) уже складывается в блоке ".3". LAG_FILTER работает с типом REAL, по этому в блоках ".6", ".2" и ".7" делаются соответственные преобразования. Вход DFB INIT подается на вход TR_S блока LAG1, чтоб при инициализации скинуть его выход (и внутреннее состояние) на значение TR_I. 
Выход LAG1 после преобразования типов суммируется со смещением и возмущением. Симитированный сигнал пропускается через шумогенератор Noise, параметры которого задаются в блоках ".8" и ".9". Зашумленный сигнал, предварительно ограниченный в диапазоне 0-10000, записывается на выход DFB SENSOR.
3) Создаем экземпляр DFB simul с именем T_SIMUL, который предназначен для имитации аналогового входа %I0.1.0 в зависимости от значения выходной ячейки %Q0.2.0 и возмущения %MW101. Модули аналоговых входов и выходов должны быть заказаны в конфигураторе UNITY. В параметрах экземпляра выставляем: T_LAG=25s, sensor_min=2000, sensor_max=10000, все остальные = по умолчанию.
4) Создаем секцию на FBD для имитации нужного сигнала.
 Функция WRITE_INPUT_INT предназначена для имитации входных переменных симулятора UNITY или ПЛК типа %IW. 
5) Дополнительно для наглядности можно в другой секции отфильтровать имитированый сигнал
 
Проверка. Один из вариантов - в операторских экранах создать экран, где подобно предыдущему примеру показать симитированный зашумелнный сигнал %IW0.1.0 и отфильтрованный LAG_0.OUT. Для изменения %QW0.2.0 можно привязать его к ползунку, %MW101 как возмущение можно привязать к полю для ввода.