Перейти к содержанию

Резервирование

Резервирование модулей ЦП

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

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

Резервирование модулей ввода-вывода

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

Далее следует объявить глобально переменные и привязать их к физическим входам-выходам модуля.

gvl_list.st
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 (программный модуль), который будет обрабатывать рабочие статусы модулей и производить переключение в случае выхода одного из строя.

rotation.st
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;