Функциональные блоки
Функциональный блок - программный компонент, отображающий множество значений входных переменных на множество выходных. После выполнения экземпляра функционального блока все его переменные сохраняются до следующего выполнения. Следовательно, функциональный блок, вызываемый с одними и теме же параметрами, может производить различные выходные значения. Сохраняются все переменные, включая входные и выходные. Так, если мы вызовем экземпляр функционального блока, не определяя значения некоторых входных параметров, он будет использовать ранее установленные значения. Возможность задания переменного числа входных значений заложена по определению и не требует каких-либо усилий. Извне доступны только входы и выходы функционального блока, получить доступ к внутренним переменным блока нельзя.
С позиции объектно-ориентированного программирования (ООП) функциональные блоки - это объекты, великолепно реализующие инкапсуляцию, т.е. сокрытие деталей реализации. Объединение кода и данных в "одном флаконе" роднит функциональные блоки с классами ООП. Возможность наследования и полиморфизма, к сожалению, пока отсутствует. |
Прежде чем использовать функциональный блок, необходимо создать его экземпляр. Эта операция аналогична по смыслу объявлению переменной. Описав новый блок, мы фактически создали новый тип данных, подобный структуре. Каждый функциональный блок может иметь любое количество экземпляров. Так, различные экземпляры блока "таймер" совершенно независимы друг от друга. Каждый из них имеет свои настройки и живет собственной жизнью. Каждый экземпляр функционального блока имеет свой собственный идентификатор и свою область в статической памяти данных. Объявление еще одного экземпляра блока приводит к выделению еще одной области в памяти данных. Код, очевидно, как и для функции, остается общим. Экземпляр функционального блока создается в разделе объявлений переменных функции, функционального блока и программы. Как и переменные, он должен получить уникальный идентификатор.
Таймеры
Функциональный блок | Описание |
TP(BOOL IN, TIME PT, BOOL Q, TIME ET) | Импульсный таймер. Запуск таймера происходит по фронту импульса на входе IN. Вход РТ задает длительность формируемого импульса. После запуска таймер не реагирует на изменение значения входа IN. Выход ЕТ отсчитывает прошедшее время. При достижении ЕТ значения РТ счетчик останавливается, и выход Q сбрасывается в FALSE. |
TOF(BOOL IN, TIME PT, BOOL Q, TIME ET) | Таймер с задержкой выключения. По фронту входа IN выход Q устанавливается в TRUE. Сброс счетчика ЕТ и начало отсчета времени происходит по каждому спаду входа IN. Выход Q будет сброшен через заданное РТ время после спада входного сигнала. Если во время отсчета вход IN будет установлен в TRUE, то отсчет приостанавливается. Таким образом, выход Q включается по фронту, а выключается логическим нулем продолжительностью не менее РТ. |
TON(BOOL IN, TIME PT, BOOL Q, TIME ET) | Таймер с задержкой включения. По фронту входа IN выполняется обнуление счетчика и начинается новый отсчет времени. Выход Q будет установлен в TRUE через заданное РТ время, если IN будет продолжать оставаться в состоянии TRUE. Спад входа IN останавливает отсчет и сбрасывает выход Q в FALSE. Таким образом, выход Q включается логической единицей продолжительностью не менее РТ, а выключается по спаду входа IN. |
Триггеры
Функциональный блок | Описание |
SR(BOOL SET1, BOOL RESET, BOOL Q1) | Переключатель с доминантой включения. |
RS(BOOL SET, BOOL RESET1, BOOL Q1) | Переключатель с доминантой выключения. |
Детекторы импульсов
функциональный блок | Описание |
R_TRIG(BOOL CLK, BOOL Q) | Генерирует единичный импульс по переднему фронту входного сигнала. |
F_TRIG(BOOL CLK, BOOL Q) | Генерирует единичный импульс по заднему фронту входного сигнала. |
Счетчики
Функциональный блок | Описание |
CTU(BOOL CU, BOOL RESET, LINT PV, BOOL Q, LINT CV, BOOL M) | По каждому фронту на входе CU значение счетчика (выход CV) увеличивается на 1, Выход Q устанавливается в TRUE, когда счетчик достигнет или превысит заданный PV порог. Логическая единица на входе сброса (RESET = TRUE) останавливает счет и обнуляет счетчик (CV := 0). |
CTD(BOOL CD, BOOL LOAD, LINT PV, BOOL Q, LINT CV, BOOL M) | По каждому фронту на входе CD счетчик (выход CV) уменьшается на 1. Выход Q устанавливается в TRUE, когда счетчик достигнет нуля. Счетчик CV загружается начальным значением, равным PV по входу LOAD = TRUE. |
CTUD(BOOL CU,BOOL CD, BOOL RESET,BOOL LOAD, LINT PV, BOOL QU, BOOL QD, LINT CV, BOOL M, BOOL M2) | По значению входа RESET = TRUE счетчик CV сбрасывается в 0. По значению входа LOAD = TRUE счетчик CV загружается значением, равным PV. По фронту на входе CU счетчик увеличивается на 1. По фронту на входе CD счетчик уменьшается на 1 (до 0). Выход QU равен TRUE, если CV >= PV, иначе FALSE. Выход QD равен TRUE, если CV = 0, иначе FALSE. |