Сообщение от
Владимир Ситников
И массивы.
Я бы делал так:
Предположим, у Вас есть глобальная константа, содержащая количество участков в системе
Код:
VAR_GLOBAL CONSTANT
g_c_usiMaxSectorsCount : USINT := 10; (* Максимальное количество участков *)
END_VAR
Объявите структуру, которая описывает все данные, которые необходимы для управления участком
Код:
(* Данные, относящиеся к одному участку *)
TYPE Sector :
STRUCT
rSetpoint : REAL; (* Уставка *)
timMinExecution : TIME; (* Время выполнения "работы" на участке *)
END_STRUCT
END_TYPE
ФБ, управляющий системой при этом может выглядеть вот так:
Интерфейс:
Код:
FUNCTION_BLOCK SystemControl
VAR_INPUT
xStart : BOOL;
astSystemSectors : ARRAY [1..g_c_usiMaxSectorsCount] OF Sector;
END_VAR
VAR_OUTPUT
xBusy : BOOL;
xDone : BOOL;
END_VAR
VAR
m_fb_StartCommand : R_TRIG;
m_usiCurrentSectorId : USINT;
m_stCurrentSector : Sector;
m_fb_SectorExectutionFinish : TON; (* Таймер времени выполнения сектора *)
END_VAR
Реализация:
Код:
m_fb_StartCommand.CLK := xStart;
m_fb_StartCommand();
(* Если получена команда на старт и ФБ еще не в работе *)
IF (m_fb_StartCommand.Q) AND (NOT xBusy) THEN
(* Начнем с первого сектора *)
m_usiCurrentSectorId := 1;
(* Сбросим время наработки сектора *)
m_fb_SectorExectutionFinish.IN := FALSE;
m_fb_SectorExectutionFinish();
xDone := FALSE;
xBusy := TRUE;
END_IF
IF xBusy THEN
m_stCurrentSector := astSystemSectors[m_usiCurrentSectorId];
m_fb_SectorExectutionFinish.IN := TRUE;
m_fb_SectorExectutionFinish.PT := m_stCurrentSector.timMinExecution;
m_fb_SectorExectutionFinish();
(* Регулирование где-то здесь *)
(* Если закончилось время выполнения перейти к следующему участку.
Возможно Вам нужно будет доработать это условие в соответствии с Вашими требованиями *)
IF m_fb_SectorExectutionFinish.Q THEN
m_usiCurrentSectorId := m_usiCurrentSectorId + 1;
m_fb_SectorExectutionFinish.IN := FALSE;
m_fb_SectorExectutionFinish();
END_IF
(* Если закончились все сектора *)
IF m_usiCurrentSectorId > g_c_usiMaxSectorsCount THEN
(* Работа завершена *)
xDone := TRUE;
xBusy := FALSE;
END_IF
END_IF
То же самое, но в виде проекта: