
- •Предисловие
- •Введение
- •1. Основные особенности языков программирования
- •2. Язык функциональных блок-схем - fbd
- •2.1. Основные понятия
- •1.2. Функции и функциональные блоки
- •Группа «Arithmetic»
- •2.3. Пример программы на языке fbd
- •3. Язык лестничных схем – ld
- •3.1. Контакты
- •3.2. Катушки
- •3.4. Функции и функциональные блоки
- •3.5. Пример программы на языке ld
- •4. Язык последовательных функциональных схем – sfc
- •4.1. Описание элементов sfc
- •4.2 Задание свойств шага
- •4.3 Задание действий
- •4.4. Переход
- •4.5. Пример программы на языке sfc
- •5. Язык структурированного текста – st
- •5.1. Операторы
- •Описание операторов
- •5.2. Примеры использования операторов в простых инструкциях
- •5.3. Сложные инструкции
- •5.4. Использование функций и функциональных блоков
- •5.5. Примеры программ на языке st
- •5.6. Пример программы на языках sfc и st
- •6. Язык списка инструкций – il
- •6.1. Операторы и модификаторы
- •Описание операторов
- •Описание модификаторов
- •6.2. Примеры выполнения инструкций
- •6.3. Использование функций и функциональных блоков
- •6.4. Пример программы на языке il
- •Заключение
- •Библиографический список
- •Оглавление
- •Языки программирования в среде Concept
- •443100, Г. Самара, ул. Молодогвардейская, 244. Главный корпус
- •443100, Г. Самара, ул. Молодогвардейская, 244. Корпус 8
1.2. Функции и функциональные блоки
В разделе кратко описаны некоторые простейшие FFB, доступные в библиотеке IEC. Для удобства эти FFB разбиты на группы. В имени FFB часто присутствует тип данных, который должен стоять вместо «***» (например, ADD_REAL). Более полно FFB описаны в [1].
Группа элементарных функций «Arithmetic» - арифметика
В этой группе представлены EF, выполняющие арифметические операции (табл. 2.1). Типы данных на входах (IN) и выходе (OUT) должны быть одинаковыми. Некоторые EF допускают расширение количества входов до 32.
Таблица 2.1
Группа «Arithmetic»
Имя функции |
Тип данных |
Действие |
Примечание |
ADD_*** |
ANY_NUM, TIME |
Сложение OUT=IN1+IN2+… |
Количество входов – до 32 для ANY_NUM |
DIV_*** |
ANY_NUM |
Деление OUT:=IN1/IN2 |
Для ANY_INT – целочисленное деление |
MOD_*** |
ANY_INT |
Остаток от целочисленного деления |
|
MOVE |
ANY |
OUT=IN |
|
Окончание таблицы 2.1
Имя функции |
Тип данных |
Действие |
Примечание |
MUL_*** |
ANY_NUM |
Умножение OUT=IN1*IN2*… |
Количество входов – до 32 |
SUB_*** |
ANY_NUM, TIME |
вычитание OUT=IN1–IN2 |
|
TIME_MUL_*** |
IN1: TIME IN2: ANY_NUM OUT: TIME |
умножение OUT=IN1*IN2 |
|
TIME_DIV_*** |
IN1: TIME IN2: ANY_NUM OUT: TIME |
деление OUT=IN1/IN2 |
|
Группа элементарных функциональных блока «Bistable» – триггеры
В
группу входят два триггера: RS
(с доминирующим входом «Сброс» – R1)
и SR
(с доминирующим входом «Установка» –
S1).
Оба триггера имеют выход Q1.
Разрешенный тип данных на входах и
выходах – BOOL.
Ниже приведена таблица переходов RS и SR триггеров. В таблице «» означает лог. 0 или лог. 1.
Таблица 2.2 |
||||||
Таблицы переходов RS и SR триггеров |
||||||
Q1t-1 Q1t+1 |
R1t |
St |
|
Q1t-1 Q1t+1 |
Rt |
S1t |
0 0 |
|
0 |
0 0 |
|
0 |
|
0 1 |
0 |
1 |
0 1 |
|
1 |
|
1 1 |
0 |
|
1 1 |
0 |
|
|
1 0 |
1 |
|
1 0 |
1 |
0 |
Группа элементарных функций «Comparison» - сравнение
В группу входят EF, выполняющие функцию сравнения входных данных типа ANY_ELEM (табл. 2.3). Количество входов в EF может варьироваться от 2 до 32. Если условие сравнения выполняется, то выходная переменная (типа BOOL) принимает значение лог. 1, иначе – лог. 0.
|
Таблица 2.3 |
||
Группа «Comparison» |
|||
Имя функции |
Условие сравнения |
Описание функции сравнения |
|
EQ_*** |
= |
OUT=1, если IN1=IN2 и IN2=IN3 и IN3=IN4… |
|
GE_*** |
|
OUT=1, если IN1IN2 и IN2IN3 и IN3IN4… |
|
LE_*** |
|
OUT=1, если IN1IN2 и IN2IN3 и IN3IN4… |
|
GT_*** |
> |
OUT=1, если IN1>IN2 и IN2>IN3 и IN3>IN4… |
|
LT_*** |
< |
OUT=1, если IN1<IN2 и IN2<IN3 и IN3<IN4… |
|
NE_*** |
|
OUT=1, если IN1IN2 и IN2IN3 и IN3IN4… |
Группа элементарных функций «Converter» - преобразование типа данных
В группу входят EF (табл. 2.4), преобразующие тип данных.
При преобразовании типов данных выполняются условия:
если входные данные имеет большую разрядность чем выходные, то значение выходных данных определяется младшими разрядами входных данных;
если входные данные имеет меньшую разрядность чем выходные, то входные данные передаются в младшие разряды выходных данных, а старшие разряды обнуляются;
при преобразовании знаковых переменных в незнаковые знак теряется.
На рис. 2.3 приведен пример преобразования переменной Sensor_Temperature типа UDINT в переменную Temperature типа REAL с помощью функции UDINT_TO_REAL:
Таблица 2.4 |
|
Группа «Converter» |
|
Имя функции |
Действие |
BOOL_TO_*** |
Преобразование данных типа BOOL в данные типа ANY_NUM, BYTE или WORD |
BYTE_TO_*** |
Преобразование данных типа BYTE в данные типа ANY_NUM, BOOL или WORD |
DINT_TO_*** |
Преобразование данных типа DINT в данные типа INT, ANY_BIT, UDINT, UINT, REAL, TIME |
INT_TO_*** |
Преобразование данных типа INT в данные типа, ANY_BIT, DINT, UDINT, UINT, REAL или TIME.. |
REAL_TO_*** |
Преобразование данных типа REAL в данные типа ANY_BIT или ANY_INT, или TIME. |
REAL_TRUNC_TO_*** |
Преобразование данных типа REAL в данные типа ANY_INT с округлением в сторону нуля. |
TIME_TO_*** |
Преобразование данных типа TIME в данные типа ANY_BIT или ANY_NUM |
UDINT_TO_*** |
Преобразование данных типа UDINT в данные типа ANY_BIT, DINT, INT, UINT, REAL, TIME |
UINT_TO_*** |
Преобразование данных типа UINT в данные типа ANY_BIT, DINT, INT, UDINT, REAL или TIME |
WORD_TO_*** |
Преобразование данных типа WORD в данные типа ANY_NUM, BOOL, BYTE, или TIME. |
Группа элементарных функциональных блоков «Counter» - счетчики
В группу входят суммирующий – CTU (Up counter), вычитающий – CTD (Down counter) и реверсивный – CTUD (Up/Down counter) счетчики.
В суммирующем счетчике (рис. 2.4) для обнуления на вход R необходимо подать лог. 1. Изменение переменной на входе CD с лог. 0 к лог. 1 приводит к увеличению содержимого счетчика (выход CV) на 1. Выход Q становится равным лог. 1, если CV становится больше PV.
В вычитающем счетчике (рис. 2.5) при подаче на вход LD лог. 1 в счетчик (выход CV) записывается начальное значение, подаваемое на вход PV. Изменение переменной на входе CD с лог. 0 к лог. 1 приводит к уменьшению содержимого счетчика на 1. Выход Q становится равен лог. 1, если CV<=0.
В
реверсивном счётчике (рис. 2.6) для
обнуления на вход R необходимо подать
лог. 1. При подаче на вход LD лог 1 в счетчик
записывается начальное значение,
подаваемое на вход PV. При одновременном
приходе лог. 1 на входы LD и R, преимущество
имеет вход R. Изменение значения на входе
CU с лог. 0 к лог. 1 приводит к увеличению
содержимого счетчика на 1. Такое же
изменение на входе CD приводит к уменьшению
содержимого счетчика. При одновременном
изменении на входах CU и CD, вход CU имеет
преимущество.
Выход CV предназначен для считывания содержимого счетчика. Выход QU=1, если CV>=PV. Выход QD=1, если CV<=0.
Группа элементарных функциональных блоков «Edge Detection» – обнаружение фронта/среза
В группу входят два EFB – R_TRIG и F_TRIG, имеющие вход CLK и выход Q. В R_TRIG на выходе Q появляется лог. 1 по фронту (переходу из лог. 0 к лог 1) на входе CLK. В F_TRIG на выходе Q появляется лог. 1 по срезу (переходу из лог. 1 к лог. 0) на входе CLK.
Группа элементарных функций «Logic» - логика
В группу входят EF, выполняющие поразрядные логические операции над данными типа ANY_BIT (табл. 2.5). Типы данных на входах и выходе должны быть одинаковыми.
|
Таблица 2.5 |
||
Группа «Logic» |
|||
|
Действие |
Примечание |
|
NOT_*** |
Поразрядное логическое отрицание |
|
|
AND_*** |
Поразрядное логическое умножение |
Количество входов – до 32 |
|
OR_*** |
Поразрядное логическое сложение |
Количество входов – до 32 |
|
XOR_*** |
Поразрядное сложение по модулю 2 |
Количество входов – до 32 |
|
ROL_*** |
Циклический сдвиг влево |
Количество разрядов для сдвига задается на входе N |
|
ROR_*** |
Циклический сдвиг вправо |
Количество разрядов для сдвига задается на входе N |
|
SHL_*** |
Сдвиг влево |
Количество разрядов для сдвига задается на входе N |
|
SHR_*** |
Сдвиг вправо |
Количество разрядов для сдвига задается на входе N |
Группа элементарных функций «Numerical» - вычисление функций
В группу входят EF, предназначенные для вычисления:
- тригонометрических функций – SIN_REAL, COS_REAL, TAN_REAL, ASIN_REAL, ACOS_REAL и ATAN_REAL;
- квадратного корня – SQRT_REAL);
- натурального и десятичного логарифмов – LN_REAL и LOG_REAL;
- экспоненты – EXP_REAL;
(для перечисленных EF входные и выходные переменные имеют тип – REAL);
- возведения в степень – ***_EXPT_REAL;
- модуля – ABS_***.
Здесь «***» - переменная типа ANY_NUM.
Группа элементарных функций «Selection» - селекция
В EF группы «Selection» (табл. 2.6) входные и выходные данные могут быть любого типа (ANY_ELEM).
|
Таблица 2.6 |
||
Группа «Selection» |
|||
Имя функции |
Действие |
Примечание |
|
LIMIT_*** |
Передает на выход входное значение (вход IN), ограниченное сверху (вход MX) и снизу (вход MN) |
|
|
MAX_*** |
Передает на выход максимальное значение из нескольких входных значений |
Количество входов – до 32 |
|
MIN_*** |
Передает на выход минимальное значение из нескольких входных значений |
Количество входов – до 32 |
|
MUX_*** |
Мультиплексор: соединяет заданный вход с выходом в зависимости от значения переменой на входе К |
Количество входов – до 32 типа ANY, выбор входа переменной типа ANY_INT |
|
SEL |
Мультиплексор на два входа IN0 и IN1 типа ANY с переключателем логического типа |
|
Пример: Для элементарной функции LIMIT_REAL (рис. 2.7) выполняется:
P=SENSOR_P, если 4.0 ≤ SENSOR_P ≤ 5.0;
Р
=4.0,
если P
< 4.0;
Р=5.0, если P > 5.0.
Группа элементарных функциональных блоков «Timer» - таймер
В эту группу входят ЕFB TOF, TON и TP.
Во всех таймерах вход PT предназначен для задания величины выдержки времени (переменная типа TIME), вход IN – для пуска таймера (переменная типа BOOL). На выходе Q (переменная типа BOOL) формируется лог. 1 в момент времени, определяемый типом таймера, а на выходе ET (переменная типа TIME) формируется код текущего времени с начала пуска таймера.
На рис. 2.8 приведены временные диаграммы функционирования таймера TOF.
В FFB TOF (рис. 2.8) в исходном состоянии IN=0 и Q=0. При изменении переменной на входе IN из лог. 0 в лог. 1 (моменты (1, 4)) переменная на выходе Q принимает значение лог. 1. Отсчет времени начинается при изменении на входе IN из лог. 1 в лог. 0, при этом значение переменной на выходе ET начинает линейно увеличиваться. По окончании времени выдержки на выходе Q формируется переход из лог. 1. в лог. 0. Сброс таймера осуществляется подачей лог. 1 на вход IN (момент (4)).
В EFB TON (рис. 2.9) в исходном состоянии IN=0 и Q=0. Отсчет времени начинается (момент (1)) при изменении значения переменной на входе IN из лог. 0 в лог. 1. По окончании времени выдержки (момент (2)) переменная на выходе Q принимает значение лог. 0. Сброс таймера (моменты (3, 4)) осуществляется изменением значения переменной на входе IN из лог. 1 в лог. 0.
В FFB TP (рис. 2.10) в исходном состоянии IN=0 и Q=0. Отсчет времени начинается (момент (1)) при изменении значения переменной на входе IN из лог. 0 в лог. 1. При этом на выходе Q формируется лог. 1. По окончании времени выдержки на выходе Q формируется переход из лог. 1. в лог. 0. Сброс таймера осуществляется подачей лог. 0 на вход IN независимо от состояния таймера (во время отсчета выдержки или после ее окончания).