Модули измерения и отсчета времени
ALARM_2
Тип модуля: ФБ | Переменная | Тип | Описание |
|---|---|---|---|
Входы | X | REAL | Контролируемое значение |
LO_1 | REAL | Нижний предел 1 | |
HI_1 | REAL | Верхний предел 1 | |
LO_2 | REAL | Нижний предел 2 | |
HI_2 | REAL | Верхний предел 2 | |
HYS | REAL | Значение гистерезиса | |
Выходы | Q1_LO | BOOL | Флаг «значение меньше нижнего предела 1» |
Q1_HI | BOOL | Флаг «значение больше верхнего предела 1» | |
Q2_LO | BOOL | Флаг «значение меньше нижнего предела 2» | |
Q2_HI | BOOL | Флаг «значение больше верхнего предела 2» |
Функциональный блок ALARM_2 проверяет входное значение X на принадлежность диапазонам [LO_1…HI_1] и [LO_2…HI_2]. Вход HYS определяет величину гистерезиса. Выходы блока становятся активными в следующих случаях:
Обычно с помощью диапазона [LO_1…HI_1] задаются пороговые значения для сигнала тревоги, с помощью [LO_2…HI_2] – для сигнала аварии.
Пример
VAR
(* Экземпляр функционального блока ALARM_2 *)
Alarm : OSCAT_BASIC.ALARM_2;
(* Контролируемое значение (температура) *)
Temperature : REAL := 85.0; (* 85 °C *)
(* Настройки пределов *)
LO_1 : REAL := 60.0; (* Нижний предел 1 (тревога) *)
HI_1 : REAL := 80.0; (* Верхний предел 1 (тревога) *)
LO_2 : REAL := 50.0; (* Нижний предел 2 (авария) *)
HI_2 : REAL := 90.0; (* Верхний предел 2 (авария) *)
HYS : REAL := 2.0; (* Гистерезис 2 °C *)
(* Выходные флаги *)
AlarmLO1 : BOOL; (* Меньше нижнего предела 1 *)
AlarmHI1 : BOOL; (* Больше верхнего предела 1 *)
AlarmLO2 : BOOL; (* Меньше нижнего предела 2 *)
AlarmHI2 : BOOL; (* Больше верхнего предела 2 *)
(* Состояние системы *)
StatusMessage : STRING[50];
END_VAR
(* Настройка параметров блока *)
Alarm(
LO_1 := LO_1,
HI_1 := HI_1,
LO_2 := LO_2,
HI_2 := HI_2,
HYS := HYS
);
(* Циклический вызов блока с текущим значением *)
Alarm(X := Temperature);
(* Чтение выходных флагов *)
AlarmLO1 := Alarm.Q1_LO;
AlarmHI1 := Alarm.Q1_HI;
AlarmLO2 := Alarm.Q2_LO;
AlarmHI2 := Alarm.Q2_HI;
(* Логика обработки *)
IF AlarmHI2 THEN
StatusMessage := 'АВАРИЯ: превышение верхнего предела 90 °C!';
ELSIF AlarmLO2 THEN
StatusMessage := 'АВАРИЯ: падение ниже нижнего предела 50 °C!';
ELSIF AlarmHI1 THEN
StatusMessage := 'ПРЕДУПРЕЖДЕНИЕ: температура выше 80 °C';
ELSIF AlarmLO1 THEN
StatusMessage := 'ПРЕДУПРЕЖДЕНИЕ: температура ниже 60 °C';
ELSE
StatusMessage := 'Нормальный режим';
END_IF;
(*Результат при Temperature = 85 °C:
- AlarmHI1 = TRUE (85 > 80)
- AlarmHI2 = FALSE (85 < 90)
- StatusMessage = 'ПРЕДУПРЕЖДЕНИЕ: температура выше 80 °C'*)
END_PROGRAM (*Объявление конца программы*) |
BAR_GRAPH
Тип модуля: ФБ | Переменная | Тип | Описание |
|---|---|---|---|
Входы | X | REAL | Контролируемое значение |
rst | REAL | Сигнал сброса тревоги | |
Выходы | LOW | BOOL | Флаг «значение меньше нижнего предела» |
Q1…Q6 | BOOL | Флаги «значение в зоне 1…6» | |
HIGH | BOOL | Флаг «значение больше верхнего предела» | |
Alarm | BOOL | Флаг «тревога» | |
Status | BYTE | ESR-код | |
Параметры | trigger_Low | REAL | Нижний предел |
trigger_High | REAL | Верхний предел | |
Alarm_low | BOOL | Режим «обработка нижнего предела тревоги» | |
Alarm_high | BOOL | Режим «обработка верхнего предела тревоги» | |
log_scale | BOOL | Режим «логарифмирование интервалов» |
Функциональный блок BAR_GRAPH проверяет входное значение X на принадлежность диапазону [trigger_Low…trigger_High]. Выход LOW принимает значение TRUE, если значение X меньше нижней границы диапазона, выход HIGH – если больше верхней границы. Если параметры Alarm_low и Alarm_high имеют значение TRUE, то при выходе значения X за границы допустимого диапазона выход Alarm принимает значение TRUE. Выход Alarm остается активным до тех пор, пока не будет сброшен с помощью сигнала по переднему фронту на входе rst.
Если значение X находится в пределах диапазона, то активен один из выходов Q1…Q6, характеризующий интервал, в котором находится значение. По умолчанию интервалы являются равными:
Если параметр log_ scale имеет значение TRUE, то размеры интервалов связаны через логарифм:
Выход Status определяет состояние блока и совместим с ESR-модулями:
Значение выхода Status | Описание |
110 | Значение X находится в диапазоне [trigger_Low…trigger_High] |
111 | Значение X меньше trigger_Low, выход LOW равен TRUE |
112 | Значение X больше trigger_High выход HIGH равен TRUE |
1 | Значение X меньше trigger_Low, выход ALARM равен TRUE |
2 | Значение X больше trigger_High выход ALARM равен TRUE |
CALIBRATE
Тип модуля: ФБ | Переменная | Тип | Описание |
|---|---|---|---|
Входы | X | REAL | Сигнал датчика |
CO | BOOL | Сигнал датчика для нижнего предела | |
CS | BOOL | Сигнал датчика для верхнего предела | |
Выходы | Y | REAL | Измеренное значение |
Параметры | Y_Scale | REAL | Верхний предел измеренного значения |
Y_Offset | REAL | Нижний предел измеренного значения |
Функциональный блок CALIBRATE используется для калибровки сигнала аналогового датчика X. Параметры Y_Offset и Y_Scale определяют нижний и верхний предел измеряемого значения. По переднему фронту на входе CO в блок записывается измеренное значение для нижнего предела, по переднему фронту на входе CS – для верхнего. После этого значение входа X будет линейно масштабироваться и подаваться на выход Y c учетом рассчитанных коэффициентов. Коэффициенты являются энергонезависимыми (VAR RETAIN).
Поясним вышесказанное на примере. Предположим, мы получаем от датчика температуры сигнал 4-20 мА, который соответствует диапазону 0-100 °C. Зададим Y_Offset=0 и Y_Scale=100. Поместим датчик в среду с температурой 0 °C (значение температуры должно быть измерено с помощью эталонного термометра) и подадим импульс по переднему фронту на входе CO. Блок вычислит значение смещения сигнала. Нагреем датчик до 100 °C и подадим импульс по переднему фронту на входе CS. Блок вычислит коэффициент масштабирования для входного сигнала. В случае, если датчик изначально откалиброван, смещение должно составить
а коэффициент масштабирования –
Теперь если подать на вход X измеренное датчиком значение (например, 12 мА), то на выходе Y будет получено значение температуры – 50 °C. Поскольку в реальной жизни по мере эксплуатации характеристики датчиков могут изменяться, использование данного блока позволит поддерживать точность измеренного значения на приемлемом уровне.
CYCLE_TIME
Тип модуля: ФБ | Переменная | Тип | Описание |
|---|---|---|---|
Входы | RST | BOOL | Сигнал сброса блока |
Выходы | ct_min | TIME | Минимальное время цикла |
ct_max | TIME | Максимальное время цикла | |
ct_last | TIME | Последнее измеренное время цикла | |
systime | TIME | Время, прошедшее со старта ПЛК | |
sysdays | INT | Число дней, прошедшее со старта ПЛК | |
cycles | DWORD | Число циклов ПЛК с момента старта | |
Используемые модули | T_PLC_MS | ||
Функциональный блок CYCLE_TIME используется для получения статистической информации о времени цикла ПЛК. На выходы ct_min, ct_max и ct_last подается минимальное, максимальное и последнее измеренное время цикла. Выходы systime и sysdays содержат информацию о времени и числе дней, прошедших со старта ПЛК. Выход cycles содержит число циклов ПЛК, прошедших с момента его старта. По переднему фронту на входе RST выходы блока обнуляются и отсчет начинается заново.
DT_SIMU
Тип модуля: ФБ | Переменная | Тип | Описание |
|---|---|---|---|
Входы | START | DT | Начальное время часов (точка отсчета) |
SPEED | REAL | Коэффициент масштаба времени | |
Выходы | DTS | DT | Текущее время |
Используемые модули | T_PLC_MS | ||
Функциональный блок DT_SIMU представляет собой программный модуль RTC с задаваемым масштабом времени. Вход START определяет начальное время, которое будет являться точкой отсчета. Выход DTS отображает текущее время. Вход SPEED определяет масштаб времени относительно стандартного. Например, если SPEED=5.0, то каждую секунду к текущему значению времени на выходе DTS будет прибавляться 5 секунд – т.е. время будет идти в 5 раз быстрее, чем в реальном мире. Это может быть полезным при отладке проектов, связанных с медленно протекающими процессами.
FLOW_METER
Тип модуля: ФБ | Переменная | Тип | Описание |
|---|---|---|---|
Входы | VX | REAL | Измеренное значение расхода (ед./час) |
E | BOOL | Сигнал управления блоком | |
RST | BOOL | Сигнал сброса блока | |
Выходы | F | REAL | Мгновенное значение расхода (ед./час) |
Входы - выходы | X | REAL | Суммарное значение расхода (дробная часть) |
Y | UDINT | Суммарное значение расхода (целая часть) | |
Параметры | PULSE_MODE | BOOL | Режим работы блока |
UPDATE_TIME | TIME | Время опроса входа VX | |
Используемые модули | INTEGRATE, FLOOR, T_PLC_MS | ||
Функциональный блок FLOW_METER используется для определения суммарного расхода. На вход VX подается измеренное значение расхода. Параметр PULSE_MODE определяет режим работы блока. Если PULSE_MODE имеет значение FALSE, то расходомер работает в режиме интегрирования и пока вход E имеет значение TRUE, значение входа VX интерпретируется как расход за час, а на входах-выходах Y и X отображается целая и дробная часть суммарного расхода за прошедшее с начала работы блока время. На выходе F отображается текущее значение расхода. Параметр UPDATE_TIME частоту опроса входа VX. Если PULSE_MODE имеет значение TRUE, то расходомер работает в импульсном режиме и при импульсе по переднему фронту входа E прибавляет значение VX к суммарному значению расхода Y и X (целая часть/дробная часть). По переднему фронту входа RST происходит сброс памяти блока, после чего отсчет начинается заново.
Суммарное значение расхода представлено в виде двух величин – X и Y. Если суммарный расход = 210.115 л/ч, то Y=210 (целая часть), X=0.115 (дробная часть).
Поясним вышесказанное несколькими примерами.
Пусть VX=3600 л/ч, PULSE_MODE=FALSE, UPDATE_TIME=T#100ms.
Расходомер работает в режиме интегратора, вход VX опрашивается каждые 100 мс (т.е если значение входа изменится, то блок начнет использовать его вместо предыдущего с задержкой до 100 мс). Значение Y каждую секунду увеличивается на +1 (3600 л/ч = 1 л/с). Значение X содержит дробную часть значения и изменяется с частотой цикла ПЛК.
Пусть VX=10 л/ч, PULSE_MODE=TRUE, UPDATE_TIME=T#100ms
Расходомер работает в импульсном режиме, вход VX опрашивается каждые 100 мс (т.е если значение входа изменится, то блок начнет использовать его вместо предыдущего с задержкой до 100 мс). Значение Y увеличивается на +10 по переднему фронту на входе E.
M_D
Тип модуля: ФБ | Переменная | Тип | Описание |
|---|---|---|---|
Входы | start | BOOL | Сигнала начала отсчета |
stop | BOOL | Сигнал окончания отсчета | |
tmax | TIME | Максимальное время отсчета | |
RST | BOOL | Сигнал сброса блока | |
Выходы | PT | TIME | Время между сигналом старта и стопа |
ET | TIME | Прошедшее время | |
run | BOOL | Флаг «идет отсчет времени» | |
Используемые модули | T_PLC_MS | ||
Функциональный блок M_D представляет собой модуль измерения времени между двумя импульсами переднего фронта. По переднему фронту на входе start блок начинает отсчет времени, при этом на выходе ET отображается время, прошедшее с начала отсчета, а выход RUN имеет значение TRUE. По переднему фронту на входе stop отсчет времени прекращается, при этом на выходе PT отображается время окончания отсчета (совпадающее с текущим значением выхода ET), а выход RUN принимает значение FALSE. Вход tmax используется для ограничения продолжительности отсчета – если ET > tmax, то блок прекращает работу, а его выходы обнуляются. По переднему фронту на входе RST происходит принудительная остановка блока с обнулением выходов.
Обратите внимание, старт начала отсчета возможен только в том случае, если входы stop и RST имеют значение FALSE.
M_T
Тип модуля: ФБ | Переменная | Тип | Описание |
|---|---|---|---|
Входы | IN | BOOL | Контролируемый сигнал |
tmax | TIME | Максимальное время отсчета | |
RST | BOOL | Сигнал сброса блока | |
Выходы | PT | TIME | Время, которое сигнал был в TRUE |
ET | TIME | Прошедшее время | |
Используемые модули | T_PLC_MS | ||
Функциональный блок M_T представляет собой модуль измерения времени между импульсами переднего и заднего фронта. По переднему фронту на входе IN блок начинает отсчет времени, при этом на выходе ET отображается время, прошедшее с начала отсчета. По заднему фронту на входе IN отсчет времени прекращается, при этом на выходе PT отображается время окончания отсчета (совпадающее с текущим значением выхода ET). Таким образом, блок измеряет время, в течение которого вход IN находился в значении TRUE. Вход tmax используется для ограничения продолжительности отсчета – если ET > tmax, то блок прекращает работу, а его выходы обнуляются. По переднему фронту на входе RST происходит принудительная остановка блока с обнулением выходов.
Обратите внимание, старт начала отсчета возможен только в том случае, если вход RST имеет значение FALSE.
M_TX
Тип модуля: ФБ | Переменная | Тип | Описание |
|---|---|---|---|
Входы | IN | BOOL | Контролируемый сигнал |
tmax | TIME | Максимальное время отсчета | |
RST | BOOL | Сигнал сброса блока | |
| Выходы | TH | TIME | Время, которое IN был в TRUE |
TL | TIME | Время, которое IN был в FALSE | |
DC | REAL | Процент времени, которое IN был в TRUE (0…1) | |
F | REAL | Частота изменения сигнала на входе IN | |
ET | TIME | Прошедшее время | |
Используемые модули | T_PLC_MS | ||
Функциональный блок M_TX представляет собой модуль сбора статистики о состоянии входа IN По переднему фронту на входе IN блок начинает отсчет времени, при этом на выходе ET отображается время, прошедшее с начала отсчета. По заднему фронту на входе IN отсчет не прекращается; для остановки работы блока необходим импульс по переднему фронту на входе RST, который также обнулит его выходы. На выходах TH и TL отображается время, которое сигнал IN находится в состоянии TRUE и FALSE соответственно. Выход DC сообщает, какой процент времени сигнал находился в состоянии TRUE (например, если DC=0.4, то в течение 40% времени вход IN имел значение TRUE, в течение 60% - значение FALSE). На выходе F отображается частота изменения входа IN. Вход tmax используется для ограничения продолжительности отсчета – если ET > tmax, то блок прекращает работу, а его выходы обнуляются.
Обратите внимание, обновление значений на выходах TH, TL, DC и F происходит после очередного импульса на входе IN. В первый раз значения на этих выходах появятся после второго импульса по переднему фронту на входе IN с начала работы блока.
METER
Тип модуля: ФБ | Переменная | Тип | Описание |
|---|---|---|---|
| Входы | M1 | REAL | Контролируемое значение 1 |
M2 | REAL | Контролируемое значение 2 | |
I1 | BOOL | Режим контроля значения 1 | |
I2 | BOOL | Режим контроля значения 2 | |
D | REAL | Делитель для выхода | |
RST | BOOL | Сигнал сброса блока | |
| Входы – выходы | MX | REAL | Интегральное значение M1 и M2 |
Используемые модули | T_PLC_MS, R2_ADD | ||
Функциональный блок METER используется для определения интегрального значения двух величин за заданный период времени. Пока вход I1 имеет значение TRUE, значение M1 каждый цикл ПЛК прибавляется к последнему сохраненному значению. Пока вход I2 имеет значение TRUE, значение M2 каждый цикл ПЛК прибавляется к последнему сохраненному значению. Вход D определяет значение делителя для cохраненного значения. Выход MX содержит сумму всех предыдущих значений M1 и M2 за периоды, во время которых I1 и I2 имели значение TRUE, поделенную на D:
По переднему фронту на входе RST значение MX обнуляется, после чего суммирование начинается заново.
На рисунке ниже приведена трассировка работы блока, используемого для подсчета суммарной потребляемой электроэнергии для двух нагревателей с мощностью 60 и 85 кВ соответственно. Переменные xI1 и xI2 определяют состояние соответствующего нагревателя (TRUE – включен, FALSE – отключен).

METER_STAT
Тип модуля: ФБ | Переменная | Тип | Описание |
|---|---|---|---|
| Входы | IN | REAL | Контролируемое значение |
DI | DATE | Текущая дата | |
RST | BOOL | Сигнал сброса блока | |
| Входы – выходы | Last_Day | REAL | Расход за вчерашний день |
Current_Day | REAL | Расход за текущий день | |
Last_Week | REAL | Расход за прошлую неделю | |
Current_Week | REAL | Расход за текущую неделю | |
Last_Month | REAL | Расход за прошлый месяц | |
Current_Month | REAL | Расход за текущий месяц | |
Last_Year | REAL | Расход за прошлый год | |
Current_Year | REAL | Расход за текущий год | |
Используемые модули | YEAR_OF_DATE, MONTH_OF_DATE, DAY_OF_YEAR, DAY_OF_WEEK | ||
Функциональный блок METER_STAT используется для определения суммарного расхода величины IN за прошлые день (Last_Day), неделю (Last_Week), месяц (Last_Month) и год (Last_Year), а также за текущие день (Current_Day), неделю (Current_Week), месяц (Current_Month) и год (Current_Year). На вход DI подается текущая дата. По переднему фронту на входе RST выходы блока обнуляются, после чего сбор статистики начинается заново.
Логика работы блока подразумевает, что IN является возрастающей с течением времени величиной, характеризующий расход какого-либо вещества, потребление электроэнергии и т.п.
ONTIME
Тип модуля: ФБ | Переменная | Тип | Описание |
|---|---|---|---|
| Входы | IN | BOOL | Контролируемый сигнал |
RST | BOOL | Сигнал сброса блока | |
| Входы – выходы | SECONDS | UDINT | Время активного сигнала |
CYCLES | UDINT | Число периодов активности сигнала | |
Используемые модули | T_PLC_MS | ||
Функциональный блок ONTIME представляет собой модуль измерения периода активности сигнала. Если вход IN имеет значение TRUE, то на входе-выходе SECONDS отображается число секунд активности сигнала. Если вход IN принимает значение FALSE, то отсчет времени останавливается, но будет продолжен при следующем переходе в состояние TRUE. По переднему фронту входа IN значение входа-выхода CYCLES увеличивается на +1 – таким образом, эта величина характеризует число периодов активности сигнала. По переднему фронту на входе RST значения SECONDS и CYCLES обнуляются, после чего подсчет начинается заново.
T_PLC_MS
Тип модуля: функция | Переменная | Тип | Описание |
|---|---|---|---|
| Выходы | T_PLC_MS | DWORD | Значение системного таймера ПЛК |
| Константы | debug | BOOL | Управление режимом отладки |
N | INT | Коэффициент масштаба времени | |
offset | DWORD | Смещение времени таймера, мс |
Функция T_PLC_MS возвращает значение системного таймера (время, прошедшее со старта ПЛК) в миллисекундах. Функция T_PLC_MS представляет собой обвязку вокруг системной функции TIME(), но помимо этого позволяет тестировать системный таймер на переполнение. Для этого надо внести изменения в область объявления переменных функции: присвоить константе debug значение TRUE и задать значения для констант N (коэффициент масштаба времени, каждую миллисекунду к значению таймера будет прибавляться 2N миллисекунд) и offset (смещение значения таймера).
Следует помнить, что реализация программной обвязки для системного таймера может отличаться для разных сред программирования.
T_PLC_US
Тип модуля: функция | Переменная | Тип | Описание |
|---|---|---|---|
| Выходы | T_PLC_US | DWORD | Значение системного таймера ПЛК |
| Константы | debug | BOOL | Управление режимом отладки |
N | INT | Коэффициент масштаба времени | |
offset | DWORD | Смещение времени таймера, мс |
Функция T_PLC_US возвращает значение системного таймера (время, прошедшее со старта ПЛК) в микросекундах. Функция T_PLC_US фактически возвращает значение системной функции TIME(), умноженное на 1000. При необходимости эта реализация может быть заменена на вызов системной функции LTIME(), если последняя поддержана на ПЛК. Функция T_PLC_US также содержит режим отладки; см. подробности в описании функции T_PLC_MS.
TC_MS
Тип модуля: ФБ | Переменная | Тип | Описание |
|---|---|---|---|
| Входы | TC | DWORD | Время системного таймера, мс |
Используемые модули | T_PLC_MS | ||
Функциональный блок TC_MS возвращает значение длительности (в миллисекундах) прошедшего цикла задачи ПЛК, в которой осуществляется вызов блока. Блок представляет собой обвязку для функции T_PLC_MS; если блок возвращает некорректное значение, то следует проверить, не используется ли данная функция в режиме отладки.
TC_S
Тип модуля: ФБ | Переменная | Тип | Описание |
|---|---|---|---|
| Входы | TC | REAL | Время системного таймера |
Используемые модули | T_PLC_US | ||
Функциональный блок TC_S возвращает значение длительности прошедшего цикла задачи ПЛК, в которой осуществляется вызов блока, в виде переменной с плавающей точкой с разрядностью до миллисекунд (например, 0.01 для T=10 мс). Блок представляет собой обвязку для функции T_PLC_US; если блок возвращает некорректное значение, то следует проверить, не используется ли данная функция в режиме отладки. Более подробную информацию (в т.ч. сведения о точности) см. в описании функции T_PLC_US.
TC_US
Тип модуля: ФБ | Переменная | Тип | Описание |
|---|---|---|---|
| Входы | TC | DWORD | Время системного таймера, мкс |
Используемые модули | T_PLC_US | ||
Функциональный блок TC_US (в микросекундах) прошедшего цикла задачи ПЛК, в которой осуществляется вызов блока. Блок представляет собой обвязку для функции T_PLC_US; если блок возвращает некорректное значение, то следует проверить, не используется ли данная функция в режиме отладки. Более подробную информацию (в т.ч. сведения о точности) см. в описании функции T_PLC_US.