
Сообщение от
sa_mut
Добрый день, Vniko. С написанием ФБ и последующем размножением через массив понятно. Цикл FOR для "оживления" также ясен. А вот что имеется ввиду в последней строке сообщения: "Входные, выходные и другие индивидуальные переменные экземпляров..." Я обычно использую область VAR_INPUT и VAR_OUTPUT сответсвенно. Могли бы Вы написать коротенький пример с применением структуры. Заранее спасибо..
Сложно сказать, что именно предлагал Vniko, опишу варианты.
Предположим есть у нас ФБ, отвечающий за зону нагрева:
Код:
FUNCTION_BLOCK Zone
VAR_INPUT
// Температура в зоне
rTemperature : REAL;
// Давление в зоне
rPressure : REAL;
END_VAR
VAR_OUTPUT
// Какое положение задвижки необходимо задать
rValvePosition : REAL;
END_VAR
А зон таких у нас может быть до 20ти.
1) Делаем так:
1.1) Объявляем структуру, содержащую значения для входов
Код:
TYPE ZoneInputs :
STRUCT
// Температура в зоне
rTemperature : REAL;
// Давление в зоне
rPressure : REAL;
END_STRUCT
END_TYPE
1.2) Объявляем структуру, содержащую значения для выходов
Код:
TYPE ZoneOutputs :
STRUCT
// Температура в зоне
rTemperature : REAL;
// Давление в зоне
rPressure : REAL;
END_STRUCT
END_TYPE
1.3) Объявляем массивы структур, содержащие данные для входов и выходов
Код:
PROGRAM PLC_PRG
VAR CONSTANT
m_c_usiMaxZones : USINT := 20;
END_VAR
VAR
m_astInputs : ARRAY [1..m_c_usiMaxZones] OF ZoneInputs;
m_astOutputs : ARRAY [1..m_c_usiMaxZones] OF ZoneOutputs;
END_VAR
1.4) Объявляем массив ФБ наших зон:
Код:
PROGRAM PLC_PRG
VAR CONSTANT
m_c_usiMaxZones : USINT := 20;
END_VAR
VAR
m_astInputs : ARRAY [1..m_c_usiMaxZones] OF ZoneInputs;
m_astOutputs : ARRAY [1..m_c_usiMaxZones] OF ZoneOutputs;
m_afbZones : ARRAY [1..m_c_usiMaxZones] OF Zone;
END_VAR
1.5) Наполнение PLC_PRG делаем примерно таким:
Код:
m_astInputs[1].rTemperature := 10.0; // Тут скорее будут данные с датчиков
m_astInputs[1].rPressure := 12.2;
// ... и т.д.
FOR i := 1 TO m_c_usiMaxZones DO
m_afbZones[i].rPressure := m_astInputs[i].rPressure;
m_afbZones[i].rTemperature := m_astInputs[i].rTemperature;
m_afbZones[i]();
m_astOutputs[i].rValvePosition := m_afbZones[i].rValvePosition;
END_FOR
// Устанавливаем положения задвижек получив значения из m_astOutputs[i].rValvePosition
2) Честно говоря особых преимуществ перед следующим подходом не вижу:
2.1) В том месте, где нужны наши зоны объявляем массив ФБ
Код:
PROGRAM PLC_PRG
VAR CONSTANT
m_c_usiMaxZones : USINT := 20;
END_VAR
VAR
m_afbZones : ARRAY [1..m_c_usiMaxZones] OF Zone;
i : USINT;
END_VAR
2.2) Тело программы делаем примерно таким:
Код:
m_afbZones[1].rTemperature := 10.0; // Тут скорее будут данные с датчиков
m_afbZones[1].rPressure := 12.2;
// ... и т.д.
FOR i := 1 TO m_c_usiMaxZones DO
m_afbZones[i]();
END_FOR
// Устанавливаем положения задвижек получив значения из m_afbZones[i].rValvePosition