Резервирование
Резервирование модулей ЦП
Для резервирования модулей БТ75-201 необходимо добавить в проект плагин «Конфигурация резервного ПЛК» и в нем настроить сетевые параметры для основного и резервного модулей. На основном и резервном процессорном модуле должна выполняться одна и та же прикладная программа.

Для реализации алгоритма резервирования на резервный модуль передаются актуальные значения всех переменных из исходных текстов, написанных на языках МЭК. Сразу после переключения управления с текущего основного процессорного модуля на резервный, на резервном модуле начинает выполняться управляющая программа с актуальными текущими значениями всех переменных.
Резервирование модулей ввода-вывода
Добавить 2 плагина (основной/резервный) одного модуля в проект.

Далее следует объявить глобально переменные и привязать их к физическим входам-выходам модуля.
VAR_GLOBAL
(* Объявление массива входов-выходов основного модуля *)
DO1A : ARR_BOOL := [4];
DO1V1 AT %QX1.0.1 : BOOL;
DO1V2 AT %QX1.0.2 : BOOL;
DO1V3 AT %QX1.0.3 : BOOL;
DO1V4 AT %QX1.0.4 : BOOL;
(* Объявление массива входов-выходов резервного модуля *)
DO2A : ARR_BOOL := [4];
DO2V1 AT %QX2.0.1 : BOOL;
DO2V2 AT %QX2.0.2 : BOOL;
DO2V3 AT %QX2.0.3 : BOOL;
DO2V4 AT %QX2.0.4 : BOOL;
END_VAR
Создать POU (программный модуль), который будет обрабатывать рабочие статусы модулей и производить переключение в случае выхода одного из строя.
VAR
DO1STATUS AT %QX1.1.1 : BOOL; (* Статус основного модуля ввода-вывода *)
DO2STATUS AT %QX2.1.1 : BOOL; (* Статус резервного модуля ввода-вывода *)
I : INT := 1;
STATE : INT := 1; (* 1 — инициализация, 2 — работа *)
ARR2 : ARR_BOOL := [0]; (* Буфер для временного хранения рез. модуля *)
ARR1 : ARR_BOOL := [0]; (* Буфер для временного хранения осн. модуля *)
END_VAR
VAR_EXTERNAL
DO1A : ARR_BOOL; (* Связь с массивом основного модуля *)
DO2A : ARR_BOOL; (* Связь с массивом резервного модуля *)
END_VAR
IF STATE=1 THEN
FOR I:=1 TO 4 DO
ARR2[I]:=FALSE; (* Очистка буфера резервного модуля *)
ARR1[I]:=FALSE; (* Очистка буфера основного модуля *)
END_FOR;
STATE:=2; (* Переход в рабочий режим *)
I:=1; (* Сброс итератора *)
ARR1[I]:=TRUE; (* Установка первого элемента массива в TRUE *)
ELSE
ARR1[I+1]:=ARR1[I]; (* Инкремент значения текущего элемента массива *)
ARR1[I]:= not ARR1[I]; (* Инверсия текущего бита *)
I:=I+1;
IF I=5 THEN (* Если дошли до 5-го элемента *)
I:=1; (* Возврат к началу массива *)
END_IF;
END_IF;
IF DO1STATUS THEN
(* Основной модуль исправен *)
DO1A:=ARR1;
DO2A:=ARR2;
END_IF;
IF DO2STATUS and not DO1STATUS THEN
(* Основной модуль НЕИСПРАВЕН, резервный исправен *)
DO1A:=ARR2; (* Основной модуль отключается *)
DO2A:=ARR1; (* Резервный модуль принимает управление *)
END_IF;