Все операции сравнения в качестве операндов могут использовать переменные BYTE, SHORTINT, INTEGER, WORD, DWORD, LONGINT, FLOAT, TIMER

Входные переменные каждой отдельной операции должны иметь одинаковый тип. На выходах всех функциональных блоков сравнения по результату операции формируются переменные типа BOOLEAN. После инициализации программы эти переменные принимают значение FALSE, кроме тех глобальных переменных, значение которых при инициализации явно объявлены как TRUE.

Для всех операций сравнения количество операндов может достигать 32. При этом результат вычисляется попарно сверху вниз, т. е. сначала вычисляется результат сравнения первой и второй переменной, затем второй и третьей т. д. Результаты всех промежуточных вычислений объединяются логическим И.

Таблица 2 – Операции сравнения

Операция

Описание

-  равно

val1 – первая переменная;

val2 – вторая переменная;

test – переменная типа BOOLEAN, принимает значение TRUE, если val1 равно val2

-  не равно

val1 – первая переменная;

val2 – вторая переменная;

test – переменная типа BOOLEAN, принимает значение TRUE, если val1 неравно val2

-  больше чем

val1 – первая переменная;

val2 – вторая переменная;

test – переменная типа BOOLEAN, принимает значение TRUE, если val1 больше val2

-  меньше чем

val1 – первая переменная;

val2 – вторая переменная;

test – переменная типа BOOLEAN, принимает значение TRUE, если val1 меньше val2

-  больше или равно

val1 – первая переменная;

val2 – вторая переменная;

test – переменная типа BOOLEAN, принимает значение TRUE, если val1 больше или равно val2

-  меньше или равно

val1 – первая переменная;

val2 – вторая переменная;

test – переменная типа BOOLEAN, принимает значение TRUE, если val1 меньше или равно val2

3  Арифметические операции

НЕ нашли? Не то? Что вы ищете?

Арифметические операции в качестве операндов могут использовать переменные типов BYTE, SHORTINT, INTEGER, WORD, DWORD, LONGINT, FLOAT, TIMER. Входные переменные каждой отдельной операции должны иметь одинаковый тип. После инициализации программы, переменные на выходах всех арифметических функциональных блоков принимают значение 0, кроме тех глобальных переменных, значение которых при инициализации явно объявлены иначе.

При арифметических операциях учитывайте ожидаемые диапазоны результатов вычислений, которые не должны выходить из допустимых значений переменных. В случае возникновения ошибки переполнения результаты операции могут быть различными в зависимости от типа переменных, участвующих в операции и способа выполнения операций над переменными типа FLOAT.

Для арифметических операций с переменными типа FLOAT, выполняемых способом программной эмуляции, в системе предусмотрены две глобальные переменные с именами ERR_SEG и ERR_OFS, в которых записывается адрес команды программы, где произошла ошибка. Если эти переменные приняли значение, отличное от нуля (заданное при инициализации), значит произошла ошибка арифметики, что должно быть учтено в алгоритме управления. Кроме этого на терминал выдается сообщение об ошибке.

Таблица 3 – Арифметические операции

Операция

Описание

-  сложение

val1 – первая слагаемая переменная

val2 – вторая слагаемая переменная

res – знаковая сумма первой и второй переменных

-  вычитание

val1 – первая уменьшаемая переменная

val2 – вторая вычитаемая переменная

res – знаковая разность первой и второй переменных

-  деление

val1 – первая делимая переменная

val2 – вторая переменная – делитель

res – знаковое частное первой и второй переменных

-  умножение

val1 – первая умножаемая переменная

val2 – вторая переменная – множитель

res – знаковое произведение первой и второй переменных

-  ограничитель значения

minimum – минимальное заданное значение

value – текущее значение

maximum – минимальное заданное значение

limited – ограниченное значение:

= minimum если value < minimum

= maximum если value > maximum

= value если minimum < value < maximum

-  максимум

val – текущее значение

минимальное значение Out = maxVal

-  минимум

val – текущее значение

максимальное значение Out = minVal

-  присваивание

Присваивает переменной var_out значение переменной var_in.

Вход блока EQU не может быть подсоединен к своему выходу.

Функция преобразования значения входной переменной var_in выбирается автоматически, исходя из типа переменной var_out

-  интерполятор

X, Y переменные типа FLOAT

Операция преобразует переменную Х в переменную Y в соответствии законом преобразования Y=f(X). Преобразование осуществляется в соответствии с таблицей, в которой задаются множество точек (x) и соответствующее им множество точек значений физической величины f(x). Точки могут быть заданы вручную или загружены из файла. Интерполяция между точками может осуществляться двумя методами:

1. Метод построения полинома степени N по формуле f(x)=a0+a1x1+a2x2+a3x3...+ aNxN. Степень полинома в зависимости от требуемой точности преобразования может выбираться от 1 до 20. Степень полинома не может быть больше количества записей в таблице минус один.

2. Метод кусочно-линейной интерполяции.

-  поразрядное отрицание

Х, Y – переменные типа SHORTINT, WORD, DWORD, INTEGER, BYTE, LONGINT. Операция производит поразрядное отрицание Х и помещает результат в Y.

4  Операции управления программой и таймерами

Операции управления программой в качестве входных операндов могут использовать переменные типа BOOLEAN.

Таблица 4 – Операции управления программой и таймерами

Операция

Описание

-  выход из программы

Завершает текущую программу и передает управление следующей за ней программе. Для условного завершения программы оператор RETURN может быть соединен с переменной типа BOOLEAN. Если данная переменная примет логическое значение TRUE, программа завершится. В случае, если оператор RETURN встретился внутри библиотечного блока, то управление перейдет к следующему блоку, но не к следующей программе.

-  переход к метке

Prog1 – метка. Оператор GOTO может быть соединен с переменной типа BOOLEAN. Если данная переменная примет логическое значение TRUE, будет осуществлен переход к указанной метке. Если оператор GOTO не соединен с переменной типа BOOLEAN, осуществляется безусловный переход к метке.

-  пуск таймера;

tm_var – переменная таймерного типа. Операция осуществляет инициализацию (сброс), и начинается инкрементирование указанной таймерной переменной с периодом 0,01 с до момента выполнения команды TSTOP. Оператор TSTART может быть соединен с переменной типа BOOLEAN. Если данная переменная примет логическое значение TRUE, оператор будет выполнен. Команда недопустима для сохраняемых таймерных переменных и констант таймерного типа.

-  останов таймера

tm_var – переменная таймеpного типа. Операция останавливает инкрементирование указанной таймерной переменной, состояние переменной сохраняется. Оператор TSTOP может быть соединен с переменной типа BOOLEAN. Если данная переменная примет логическое значение TRUE, оператор будет выполнен. Команда недопустима для сохраняемых таймерных переменных и констант таймерного типа.

-  продолжить счет таймера

tm_var – переменная таймеpного типа. Операция продолжает инкрементирование указанной таймерной переменной, счет которой был остановлен оператором TSTOP. Оператор TCONTINUE может быть соединен с переменной типа BOOLEAN. Если данная переменная примет логическое значение TRUE, оператор будет выполнен.

-  старт программы

name_prog – имя любой программы проекта. Операция включает любую программу в цикл контроллера. Начиная с этого момента программа исполняется в каждом цикле контроллера. Оператор GSTART может быть соединен с переменной типа BOOLEAN. Если данная переменная примет логическое значение TRUE, оператор будет выполнен.

-  останов программы

name_prog – имя любой программы проекта. Операция исключает любую программу из цикла контроллера. Оператор GSTOP может быть соединен с переменной типа BOOLEAN. Если данная переменная примет логическое значение TRUE, оператор будет выполнен.

-  выполнить программу

name_prog – имя любой программы проекта, которая должна быть выполнена. Оператор GCALL может быть соединен с переменной типа BOOLEAN. Если данная переменная примет логическое значение TRUE, оператор будет выполнен.

-  выполнить внешнюю процедуру

EXT – внешняя процедура в виде объектного модуля Parametr – переменная любого типа, являющаяся параметром для операции EXT. Примечания:

1. Количество входов и выходов функции EXT, их название и функциональное назначение (Inp, I/O) определяется пользователем в диалоговом режиме.

2. На выходы операции Out в качестве параметра не могут быть назначены константы.

Редактор языка FBD

Редактор вызывается при открывании окна с редактируемой программой. Для этого необходимо сделать щелчок на соответствующей программе в дереве проекта.

Работа осуществляется с помощью мыши и клавиатуры. Изображение курсора (стрелка, перекрестие) изменяется в зависимости от активности команды редактора. Если команда выбрана и активна, курсор принимает вид перекрестия.

Если редактор находится в режиме ожидания команды, курсор принимает изображение стрелки. Напомним, что правый щелчок вызывает контекстное меню для выбора команды. Когда команда выбрана, ее действие начинается левым щелчком, а прекращается правым. Повторный правый или двойной правый щелчок переводит редактор в режим ожидания команды.

Панель инструментов редактора представляет собой набор кнопок, расположенных на 4-х панелях инструментов, с условными изображениями различных операций редактора. Панели имеют следующие наименования:

-  Edit – общие операции редактирования;

-  Boolean – логические операции;

-  Analog – арифметические операторы;

-  Control – операции управления программой.

Панель инструментов Edit (рисунок 10) содержит кнопки для выполнения следующих операций:

-  Редактировать – переход в режим редактирования;

-  Увеличить – увеличивает размер изображения;

-  Уменьшить – уменьшает размер изображения;

-  Навигатор – уменьшает изображение до минимального, показывает панораму всех объектов программы, выделяет рамкой последний вид. Передвигая рамку можно быстро позиционироваться в нужное место.

-  Инвертировать – инвертирует выделенные объекты;

-  Удалить – удаляет выделенные объекты;

-  Отменить – отменить предыдущую операцию;

-  Вернуть – вернуть предыдущую операцию;

-  Создать связь – создать (рисовать связь);

-  Комментарий – ввести комментарий в программу;

-  Библиотека – вызвать библиотеку проекта.

Рисунок 10 – Панель инструментов Edit

Контекстные меню содержат наиболее употребительные команды для выбранного объекта. Кроме этого в контекстных меню содержатся команды для изменения размера используемых шрифтов, размера функциональных блоков, изменения количества входов блоков, редактирования имен и типов связей, получение справки по указанному объекту.

Для установки функциональных блоков на панели групп операций (Boolean, Analog, Control) необходимо выбрать операцию в группе. Изображение функционального блока появится в рабочем поле, и будет следовать за курсором. Положение блока фиксируется на рабочем поле щелчком. Размещая блоки на поле, необходимо помнить, что выполнение программы на языке FBD производится слева направо, сверху вниз.

Для установки логических, арифметических блоков и блоков сравнения используется панель инструментов для вызова логических операций (рисунок 11).

Рисунок 11 – Панель инструментов для вызова логических операций

Для логических и арифметических функциональных блоков количество входов задается перед установкой блока кнопкой «Переключатель количества входов» (рисунок 12).

Рисунок 12 – Панель инструментов для вызова арифметических операций

Для логических функциональных блоков, а также блоков сравнения можно применять операцию инверсии. Для этого нужно выбрать команду «Логическая инверсия сигнала» и сделать щелчок на инвертируемом выводе блока. Изменять количество входов и производить операции инверсии можно непосредственно в поле редактора командами контекстного меню.

Для установки функциональных блоков управления программой используется панель инструментов операций управления программой (рисунок 13).

Рисунок 13 – Панель инструментов операций управления программой

Для соединения блоков необходимо сделать щелчок правой кнопкой мыши в поле программы и в появившемся контекстное меню выбрать команду меню «Рисовать связь» («Draw wire») (курсор примет изображение перекрестья). Эта команда используется для создания связей между входами и выходами функциональных блоков. Фактически связь является графическим изображением переменной, и для функциональных блоков ее наличие является обязательным условием. Компилятор выдает сообщение об ошибке, если обнаруживает несоединенный вход или выход. Соединение изображается отрезками, концы которых фиксируются щелчком. Соединительная линия будет продолжаться до тех пор, пока не сделаете правый щелчок. Повторный правый щелчок переводит редактор в режим ожидания команды. Нельзя соединять связи, имеющие разные типы.

Для именования связей используется команда для присвоения связи имени переменной. Если нескольким различным связям присвоить одно и тоже имя, компилятор будет считать их одной связью с одним именем. Двойным щелчком на какой либо связи вызывается окно ввода имени (рисунок 14).

Рисунок 14 – Окно ввода имени связи

Вы можете ввести имя связи двумя способами: с помощью клавиатуры или выбрать имя из списка «Показать переменные».

Приёмы программирования на языке FBD

В системе исполнения реализуется режим многозадачности. Работа системы исполнения имеет циклический характер. Весь контролируемый технологический процесс разбивается на ряд формальных независимых задач, каждая из которых обслуживается отдельной программой. Программы выполняются поочередно с одинаковым приоритетом. Если время одного цикла системы исполнения существенно меньше скорости изменения реального процесса, можно считать, что все программы выполняются параллельно, т. е. одновременно.

Идеология программирования на языке FBD подразумевает, что время исполнения каждой программы должно быть вполне определенным, т. е. детерминированным. Другими словами ни одна программа не имеет права зациклиться на неопределенное время, например на ожидании какого-либо события. Данное правило является «хорошим тоном» в программировании многозадачных процессов и гарантирует, что никакая программа не приостановит исполнение других программ. Такой подход обеспечивает простоту и прозрачность для понимания. Так как нет прерываний, система полностью детерминирована. Задачи вызываются в одной и той же последовательности, что позволяет достаточно просто произвести анализ «наихудшего случая» и вычислить максимальную задержку.

Рассмотрим некоторые приемы программирования на языке FBD:

установка функциональных блоков в программе;

секция инициализации;

ветвление по нескольким условиям;

циклы;

ожидание события;

подсчет событий;

таймеры;

нормализаторы и преобразователи сигналов;

фильтрация сигналов;

10  регуляторы;

11  моделирование объектов управления.

установка функциональных блоков в программе

При установке функциональных блоков необходимо помнить правило, что очередность выполнения блоков в программе: сверху вниз, слева направо, а точка привязки – левый верхний угол блока.

Типичной ошибкой при установке блоков является то, что программу на языке FBD отождествляют с электрической схемой, забывая о порядке выполнения блоков. Например, необходимо сложить переменные A, B (тип FLOAT), привести сумму к типу INTEGER, сравнить с переменной С (тип INTEGER) и результат поместить в переменную D. В программе (рисунок 15) алгоритм реализован неправильно. Блок EQU будет выполнен последним, т. к. его точка привязки расположена ниже точки привязки блока CMP (порядок выполнения блоков указан цифрами внутри блоков).

Рисунок 15 – Неправильная установка блоков

а) 

б) 

Рисунок 16 – Варианты правильной установки блоков

В примере программы детектора фронтов логического сигнала (рисунок 17) выход Q будет принимать значение TRUE на один цикл системы исполнения, при изменении состояния переменной IN на противоположное. То есть на выходе Q будет формироваться импульс длительностью в один цикл контроллера при изменении полярности входного сигнала.

Рисунок 17 – Детектор фронта

Подробно рассмотрим работу программы. Начальное значение всех переменных равно FALSE. Первым выполняется блок XOR, так как его точка привязки выше, чем у блока EQU. Значения переменных IN и A на входа блока XOR равны FALSE, поэтому на выходе Q будет FALSE. После выполнения блока EQU значения переменных не меняются. Так будет до тех пор, пока значение переменной IN не изменится. Если переменная IN станет равна TRUE, то на выходе блока XOR будет TRUE, так как IN=TRUE, A=FALSE. После блока XOR выполнится блок EQU, который присвоит переменной А значение TRUE. В следующем цикле на входах блока XOR обе переменные будут равны TRUE и значение переменной Q станет равно FALSE. Аналогично программа будет работать при изменении значения переменной IN из состояния TRUE в FALSE.

секция инициализации

Используя особенности порядка исполнения блоков, можно легко организовать в программе секцию инициализации, т. е. такую секцию, которая выполняется один раз при первом проходе (рисунок 18).

Рисунок 18 – Пример организации секции инициализации

Оператор GOTO расположен выше блока EQU, поэтому выполняется первым. При первом проходе программы, значение переменной на входе оператора GOTO равно FALSE (значение по умолчанию), поэтому переход на метку MAIN не выполнится и будет исполнена секция между метками INIT и MAIN. На втором и последующих циклах значение переменной на входе GOTO будет равно TRUE и выполнится переход на метку MAIN (т. е. будет пропущена секция инициализации).

ветвление по нескольким условиям

Рассмотрим пример программы в которой выполняются различные процедуры, в зависимости от значения переменной SW, т. е. эквивалент оператора Switch в Си или Case в Паскале. Фрагмент программы на языке Паскаль:

case SW of

1: Prog1;

2: Prog2;

3: Prog3;

end;

Программа на языке FBD будет выглядеть, как показано на рисунке 19.

Рисунок 19 – Эквивалентная программа на языке FBD

Если процедуры расположены внутри данной программы, то вместо GCALL необходимо использовать операторы GOTO (рисунок 20).

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4