Описание языка

Архитектура проекта

Общие объекты

Язык последовательных функциональных схем (SFC)

Язык потоковых диаграмм (FС)

Язык функциональных блочных диаграмм (FBD)

Язык релейных диаграмм  (LD)

Язык структурированный текст (ST)

Язык инструкций (IL)

Стандартные операторы, функциональные блоки и функции


 Архитектура проекта

Проект ISaGRAF разделен на несколько программных модулей, называемых программами. Программы проекта связаны друг с другом в древовидную структуру. Программы могут быть описаны с помощью графических или текстовых языков SFC, FBD, LD, ST или IL.

Программы

Циклические и последовательные операции

Дочерние программы SFC и FC

Функции и подпрограммы

Функциональные блоки

Язык описания

Правила выполнения


Программы

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

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

Язык последовательных функциональных схем (SFC) для программирования высокого уровня

Flow Chart (FC) for high level programming

Язык функциональных блочных диаграмм (FBD) для сложных циклических операций

Язык релейных диаграмм  (LD) только для булевских операций

Язык структурированный текст (ST) только для циклических операций

Язык инструкций (IL) для операций низкого уровня

Одна и та же программа не может смешивать несколько языков, за исключением LD и FBD, которые могут быть скомбинированы в одной диаграмме.


Циклические и последовательные операции

Иерархия программ разделена на четыре основных секции или группы:

Begin	программы, выполняемые в начале каждого цикла целевой задачи

Sequential	программы, определяемые динамическими правилами SFC

End	программы, выполняемые в конце каждого цикла целевой задачи

Функции	набор подпрограмм

Программы секций Begin и End  описывают циклические операции и не зависят от времени. Программы секции Sequential описывают последовательные операции, где временная переменная явно синхронизирует основные действия. Основные программы секции Begin систематически выполняются в начале каждого цикла. Основные программы секции End систематически выполняются в конце каждого цикла. Основные программы секции Sequential  выполняются в соответствии с динамическими правилами SFC.

Программы секции Функции - это подпрограммы, которые могут быть вызваны любой другой программой в проекте. Программы секции Функции могут вызывать другие программы этой же секции.

Основные программы и дочерние программы секции Sequential должны быть описаны при помощи языка SFC.  Программы циклических секций (Begin и End) не могут быть описаны при помощи языка SFC.

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


Дочерние SFC программы

Любая программа SFC последовательной секции может управлять другой программой SFC. Такие программы низкого уровня называются дочерними SFC программами. Дочерние SFC программы - это параллельные программы, которые могут быть запущены, убиты, заморожены и перезапущены своей родительской программой. Родительская программа и дочерняя программа могут быть описаны при помощи языка SFC. Дочерняя SFC программа может иметь локальные переменные и предопределенные слова.

Когда родительская программа запускает дочернюю SFC программу, она устанавливает SFC маркер (активизирует) на каждом начальном шаге дочерней программы. Эта команда описывается оператором GSTART. Когда родительская программа убивает SFC дочернюю программу, она очищает все существующие маркеры на шагах дочерней программы. Такая команда описывается оператором GKILL.

Когда родительская программа замораживает SFC дочернюю программу, она очищает все значения в дочерней программе, и сохраняет их состояние в памяти. Такая команда описывается оператором GFREEZE. Когда родительская программа перезапускает SFC дочернюю программу, она восстанавливает все значения SFC, которые были очищены при замораживание программы. Такая команда описывается оператором GRST.

Любая программа FC последовательной секции может управлять другими FC подпрограммами. Родительская программа FC блокируется (ждет) пока не выполнится подпрограмма FC. Одновременная работа родительской программы FC и подпрограммы невозможна.


Функции и подпрограммы

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

Любая программа любой секции может иметь одну или несколько подпрограмм. У каждой подпрограммы может быть только одна родительская программа. Подпрограмма может иметь локальные переменные и макроопределения. Для описания подпрограмм может быть использован любой язык, за исключением SFC. Программы секции Функции - это подпрограммы, которые могут быть вызваны любой другой программой в проекте. В отличии от других подпрограмм они не принадлежат никакой родительской программе. Программы секции Функции могут вызывать другие программы этой же секции. Функции могут быть размещены в библиотеке.

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

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

Интерфейс подпрограммы должен быть определен явно, с типами и уникальными именами каждого вызываемого и возвращаемого параметра. Для того чтобы поддержать стандарт языка ST, возвращаемый параметр должен иметь то же имя, что и подпрограмма.

Следующая таблица показывает, как установить значение возвращаемого параметра в теле подпрограммы, в различных языках:

ST:	присвоить значение возвращаемому параметру, используя его имя

(то же имя что и у подпрограммы):

subprog_name := <expression>;

IL:	значение текущего результата (IL регистр)

в конце последовательности запоминается в возвращаемом параметре:

   LD      10

   ADD   20   (*значение возвращаемого параметра = 30*)

FBD:	установить возвращаемый параметр, используя имя:

subprog_name

LD:	использовать символ витка с именем возвращаемого параметра:

subprog_name


Функциональные блоки

Функциональные блоки могут использовать языки: LD, FBD, ST или IL. Локальные переменные функциональных блоков копируются для каждого экземпляра. Когда программа вызывает блок, на самом деле, вызывается экземпляр блока: вызывается тот же код, но используются данные, захваченные специально для данного экземпляра блока. Значения переменных экземпляра передаются от одного цикла к другому.

Предупреждение:

- Функциональный блок, написанный на одном из языков IEC, не может вызывать другие функциональные блоки: механизм экземпляров позволяет работать только с собственными локальными переменными блока. Вот список стандартных функциональных блоков, которые нельзя использовать внутри блоков IEC: SR, RS, R_Trig, F_Trig, SEMA, CTU, CTD, CTUD, TON, TOF, TP, CMP, StackInt, AVERAGE, HYSTER, LIM_ALRM, INTEGRAL, DERIVATE, BLINK, SIG_GEN

SR, RS, R_Trig, F_Trig, SEMA, CTU, CTD, CTUD, TON, TOF, TP, CMP, StackInt, AVERAGE, HYSTER, LIM_ALRM, INTEGRAL, DERIVATE, BLINK, SIG_GEN

- По той же причине нельзя использовать Положительные или Отрицательные  контакты или витки, или витки Установить и Сбросить.

- Функции  TSTART и TSTOP  для запуска и остановки таймеров не могут быть использованы внутри функционального блока для целевых задач версий  3.0x. Они работают начиная с версии 3.20.

- Если в функциональном блоке требуется виток, то прежде чем замкнуть виток, нужно использовать локальную переменную. Например:

Это не будет работать:	Это работает:


Язык описания

Программа может быть описана при помощи одного из следующих графических или текстовых языков:

Язык последовательных функциональных схем (SFC) для программирования высокого уровня

Язык Потоковых Диаграмм (FC) для программирования высокого уровня

Язык функциональных блочных диаграмм (FBD) для сложных циклических операций

Язык релейных диаграмм  (LD) только для булевских операций

Язык структурированный текст (ST) для любых циклических операций

Язык инструкций (IL) для операций низкого уровня

Одна и та же программа не может смешивать несколько языков. Язык программирования программы выбирается в момент создания программы и не может быть изменен в последствии. Исключением являются языки FBD и LD, которые можно комбинировать внутри одной программы.


Правила исполнения

ISaGRAF - это синхронная система. Все операции исполняются по часам. Основная единица длительности времени называется временным циклом:

Основные операции в течение временного цикла:

Это позволяет системе:

- гарантировать, что входные переменные сохраняют свое значение в течение временного цикла,

- гарантировать, что устройства вывода изменяются не более одного раза в течение временного цикла,

- правильно работать с одними и теми же глобальными переменными из различных программ,

- оценивать и управлять временем реакции всего приложения.


 Общие объекты

Это основные особенности и общие объекты базы данных ISaGRAF. Такие объекты могут использоваться любым из языков SFC, FBD, LD, ST или IL.

Основные типы

Константы

Переменные

Комментарии

Предопределенные слова


Основные типы

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

BOOLEAN:	логическая (true или false) величина

ANALOG:	целая или действительная (плавающая) непрерывная величина

TIMER:	временная величина

MESSAGE:	строка символов

Замечание: Переменные типа TIMER (временные) содержат значения не большие, чем один день, и не могут быть использованы для записи данных.


Константы

Константы относятся к одному типу. Одно и то же обозначение не может быть использовано для представления констант разных типов.

Логические константы

Целые аналоговые константы

Действительные аналоговые константы

Временные константы

Константа - строка сообщения


Логические константы

Существует только две логические константы:

TRUE	эквивалентно целому значению 1

FALSE	эквивалентно целому значению 0

Для написания ключевых слов true и false можно использовать, как заглавные буквы, так и прописные.


Целые аналоговые константы

Целые константы представляются знаковыми длинными целыми (32 бита) величинами:

от -2147483647 до +2147483647

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

База	Префикс	Пример
DECIMAL	(none)	-908
HEXADECIMAL	"16#"	16#1A2B3C4D
OCTAL	"8#"	8#1756402
BINARY	"2#"	2#1101_0001_0101_1101

Символ подчерк  (_) может быть использован для того, чтобы разделить группы цифр. Он не имеет особенного значения и используется для улучшения читаемости констант.


Действительные аналоговые константы

Действительные аналоговые константы могут быть записаны в десятичном или научном представлении. Десятичная точка (.) разделяет целую и десятичную части. Десятичную точку нужно использовать, для того чтобы отличить действительную константу от целой. Научное представление использует буквы E или F для того, чтобы отделить мантиссу от экспоненты. Экспоненциальная часть в научном представлении должна быть знаковой целой величиной от -37 до +37. Ниже приведены примеры действительных аналоговых констант:

3.14159	-1.0E+12

+1.0	1.0F-15

-789.56	+1.0E-37

Выражение 123 не представляет действительную константу. Ее правильное представление 123.0.


Временные константы

Временные константы представляют временные значения от 0 секунд до 23h59m59s999ms. Наименьшая допустимая единица - это миллисекунда. Стандартные временные единицы, использующиеся в константах это:

Час	буква h должна следовать за количеством часов

Минута	буква m должна следовать за количеством минут

Секунда	буква s должна следовать за количеством секунд

Миллисекунда	буквы ms должны следовать за количеством миллисекунд

Временные константы должны начинаться с T# или TIME#. Для написания ключевых слов  можно использовать как заглавные буквы, так и прописные. Некоторые единицы могут быть опущены. Вот примеры временных констант:

T#1H450MS	1 час, 450 миллисекунд

time#1H3M	1 час, 3 минуты

Выражение 0 представляет аналоговую константу, а не временное значение.


Константа - строка сообщения

Константа-сообщение представляет собой строку символов. Строка должна быть заключена в кавычки. Например:

'THIS IS A MESSAGE'

THIS IS A MESSAGE

Предупреждение: символ кавычка  не может быть использован внутри строки-константы. Строка-константа должна быть записана в одной строке исходного текста программы. Ее длина не должна превышать 255 символов, включая пробелы.

Пустая строка-константа представляется двумя кавычками без пробела или табуляции внутри:

''   (*это пустая строка*)

Для представления непечатных символов может быть использован знак $:

Sequence	Meaning	ASCII (hexa)	Example

$$	'$' character	16#24	'I paid $$5 for this'

$'	apostrophe	16#27	'Enter $'Y$' for YES'

$L	line feed	16#0a	'next $L line'

$R	carriage return	16#0d	'   llo $R He'

$N	new line	16#0d0a	'This is a line$N'

$P	new page	16#0c	'lastline $P first line'

$T	tabulation	16#09	'name$Tsize$Tdate'

$hh   (*)	any character	16#hh	'ABCD = $41$42$43$44'

(*)hh - шестнадцатеричное значение ASCII кода символа.


Переменные

Переменные программы могут быть локальными или глобальными. Локальные переменные могут использоваться только одной программой. Глобальные переменные могут использоваться любой программой проекта.

Зарезервированные ключевые слова

Переменные прямого представления

Булевские переменные

Аналоговые переменные

Временные переменные

Строковые переменные

Имена переменных должны удовлетворять следующим правилам:

имя не может быть длиннее 16 символов

первым символом должна быть буква

последующими символами могут быть буквы, цифры или символ подчеркивания


Зарезервированные ключевые слова

Ниже представлен список зарезервированных ключевых слов. Такие идентификаторы не могут быть использованы в качестве имен программ, переменных, C функций или функциональных блоков.

A	ANA, ABS, ACOS, ADD, ANA, AND, AND_MASK, ANDN, ARRAY, ASIN, AT, ATAN,

B	BCD_TO_BOOL, BCD_TO_INT, BCD_TO_REAL, BCD_TO_STRING, BCD_TO_TIME, BOO, BOOL, BOOL_TO_BCD, BOOL_TO_INT, BOOL_TO_REAL, BOOL_TO_STRING, BOOL_TO_TIME, BY, BYTE,

C	CAL, CALC, CALCN, CALN, CALNC, CASE, CONCAT, CONSTANT, COS,

D	DATE, DATE_AND_TIME, DELETE, DINT, DIV, DO, DT, DWORD,

E	ELSE, ELSIF, EN, END_CASE, END_FOR, END_FUNCTION, END_IF, END_PROGRAM, END_REPEAT, END_RESSOURCE, END_STRUCT, END_TYPE, END_VAR, END_WHILE, ENO, EQ, EXIT, EXP, EXPT,

F	FALSE, FEDGE, FIND, FOR, FUNCTION,

G	GE, GFREEZE, GKILL, GRST, GSTART, GSTATUS, GT,

I	IF, INSERT, INT, INT_TO_BCD, INT_TO_BOOL, INT_TO_REAL, INT_TO_STRING, INT_TO_TIME,

J	JMP, JMPC, JMPCN, JMPN, JMPNC,

L	LD, LDN, LE, LEFT, LEN, LIMIT, LINT, LN, LOG, LREAL, LT, LWORD,

M	MAX, MID, MIN, MOD, MOVE, MSG, MUL, MUX,

N	NE, NOT,

O	OF, ON, OPERATE, OR, OR_MASK, ORN,

P	PROGRAM

R	R, REDGE, READ_ONLY, READ_WRITE, REAL, REAL_TO_BCD, REAL_TO_BOOL, REAL_TO_INT, REAL_TO_STRING, REAL_TO_TIME, REDGE, REPEAT, REPLACE, RESSOURCE, RET, RETAIN, RETC, RETCN, RETN, RETNC, RETURN, RIGHT, ROL, ROR,

S	S, SEL, SHL, SHR, SIN, SINT, SQRT, ST, STN, STRING, STRING_TO_BCD, STRING_TO_BOOL, STRING_TO_INT, STRING_TO_REAL, STRING_TO_TIME, STRUCT, SUB, SYS_ERR_READ, SYS_ERR_TEST, SYS_INITALL, SYS_INITANA, SYS_INITBOO, SYS_INITTMR, SYS_RESTALL, SYS_RESTANA, SYS_RESTBOO, SYS_RESTTMR, SYS_SAVALL, SYS_SAVANA, SYS_SAVBOO, SYS_SAVTMR, SYS_TALLOWED, SYS_TCURRENT, SYS_TMAXIMUM, SYS_TOVERFLOW, SYS_TRESET, SYS_TWRITE, SYSTEM,

T	TAN, TASK, THEN, TIME, TIME_OF_DAY, TIME_TO_BCD, TIME_TO_BOOL, TIME_TO_INT, TIME_TO_REAL, TIME_TO_STRING, TMR, TO, TOD, TRUE, TSTART, TSTOP, TYPE,

U	UDINT, UINT, ULINT, UNTIL, USINT,

V	VAR, VAR_ACCESS, VAR_EXTERNAL, VAR_GLOBAL, VAR_IN_OUT, VAR_INPUT, ,VAR_OUTPUT,

W	WHILE, WITH, WORD,

X 	XOR, XOR_MASK, XORN

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


Переменные прямого представления

ISaGRAF позволяет использовать переменные прямого представления для того, чтобы представлять в исходном тексте программы свободные каналы. Свободные каналы - это каналы, не связанные с декларированными переменными ввода/вывода. Идентификатор переменной прямого представления всегда начинается с символа %.

Ниже приводятся соглашения об именах переменных прямого представления для каналов одиночной платы. s - это номер слота на палате.  c - это номер канала.

%IXs.c	свободный канал платы булевого ввода

%IDs.c	свободный канал платы целого ввода

%ISs.c	свободный канал платы строкового ввода

%QXs.c	свободный канал платы булевого вывода

%QDs.c	свободный канал платы целого вывода

%QSs.c	свободный канал платы строкового вывода

Ниже приводятся соглашения об именах переменных прямого представления для каналов комплексного оборудования. s - это номер слота оборудования. b - это индекс одной платы внутри комплексного оборудования. c - это номер канала.

%IXs.b.c	свободный канал платы булевого ввода

%IDs.b.c	свободный канал платы целого ввода

%Is.b..c	свободный канал платы строкового ввода

%QXs.b.c	свободный канал платы булевого вывода

%QDs.b.c	свободный канал платы целого вывода

%QSs.b.c	свободный канал платы строкового вывода

Примеры:

%QX1.6	6 канал 1 платы (логический вывод)

%ID2.1.7	7 канал 1 платы во 2 оборудовании (целый ввод)

Переменные прямого представления не могут иметь тип real.


Булевские переменные

Булевские означает логические. Такие переменные могут принимать одно из двух булевых значений: TRUE (ИСТИНА) или FALSE (ЛОЖЬ). Обычно, булевские переменные используются в логических выражениях. Булевские переменные могут иметь один из следующих атрибутов:

Internal:	переменная, хранящаяся в памяти, изменяемая программой

Constant:	неизменяемая переменная, хранящаяся в памяти, с начальным значением

Input:	переменная, связанная с устройством ввода (обновляется системой)

Output:	переменная, связанная с устройством вывода

Предупреждение: При объявлении логической переменной, могут быть определены строки, заменяющие true или false во время отладки. Эти строки не могут быть использованы в программах, если они не введены как предопределенные слова для языка.


Аналоговые переменные

Аналоговые означает - непрерывные. Такие переменные могут принимать значения знаковых целых или действительных (плавающих).  Возможны следующие форматы:

Integer 	32  битовое знаковое целое: от -2147483647 до +2147483647

Real	стандартное 32 битовое IEEE плавающее значение (одиночная точность)

1 знаковый + 23 бита мантиссы + 8 бит экспоненты

Значение экспоненты аналоговой переменной типа Real не может быть меньше -37 и больше +37.

Аналоговые переменные могут иметь один из следующих атрибутов:

Internal:	переменная, хранящаяся в памяти, изменяемая программой

Constant:	неизменяемая переменная, хранящаяся в памяти, с начальным значением

Input:	переменная, связанная с устройством ввода (обновляется системой)

Output:	переменная, связанная с устройством вывода

Замечание: Когда действительная переменна, привязана к устройству В/В, соответствующий драйвер В/В работает с эквивалентным целым значением.

Предупреждение: Целые и действительные аналоговые переменные или константы не могут смешиваться в одном и том же аналоговом выражении.


Временные переменные

Временные означает часы и счетчики. Такие переменные могут принимать значения, выраженные в единицах времени и, обычно, используются во временных выражениях. Значение временной переменной не может превосходить  23h59m59s999ms и не может быть отрицательным. Временная переменная хранится в 32 битовом слове. Его внутреннее представление - положительное число миллисекунд.

Временные переменные могут иметь один из следующих атрибутов:

Internal:	переменная, хранящаяся в памяти, изменяемая программой

Constant:	неизменяемая переменная, хранящаяся в памяти, с начальным значением

Предупреждение: Временная переменная не может иметь атрибутов INPUT или OUTPUT.

Временные переменные автоматически обновляются системой ISaGRAF. Когда временная переменная активна, ее значение автоматически увеличивается в соответствии с часами реального времени целевой задачи. Для управления временными переменными используются следующие операторы языка ST:

TSTART	запустить автоматическое обновление временной переменной (таймера)

TSTOP	остановить автоматическое обновление временной переменной (таймера)


Строковые переменные

Сообщения или строковые переменные содержат символьные строки . Длина строки может меняться в процессе работы. Длина строковой переменной не может превосходить значения определенного при объявлении переменной. Максимальная длина строки ограничена 255 символами.

Строковые переменные могут иметь один из следующих атрибутов:

Internal:	переменная, хранящаяся в памяти, изменяемая программой

Constant:	неизменяемая переменная, хранящаяся в памяти, с начальным значением

Input:	переменная, связанная с устройством ввода (обновляется системой)

Output:	переменная, связанная с устройством вывода

Строка может содержать любой символ из стандартной таблицы ASCII (код ASCII от 0 до 255). Некоторые C функции из стандартной библиотеки ISaGRAF неправильно обрабатывают сообщения, содержащие нулевой символ (0).


Комментарии

Комментарии могут быть свободно введены в текстовые языки, такие как ST и IL.  Комментарии должны начинаться со специального символа (* и заканчиваться символом *) .  Комментарии могут быть введены в любом месте программы  ST и могут занимать несколько строк.

Например:

counter := ivalue;   (* присвоить значение основному счетчику *)

(* это комментарий

на двух строках *)

c := counter (* комментарий можно расположить где угодно *) + base_value + 1;

Комментарии не должны перекрываться. Это означает, что символ (* не может быть использован внутри комментария.

Предупреждение:  Язык IL допускает  комментарий в строке только  после инструкции.


Макроопределения

Система ISaGRAF позволяет переопределять  константы, выражения true или false, ключевые слова и сложные выражения ST. Для этого соответствующему выражению должно быть дано имя идентификатора. Например:

YES	is	TRUE

PI	is	3.14159

OK	is	(auto_mode AND NOT (alarm))

Если такая эквивалентность определена, идентификатор может быть использован в любом месте ST программы вместо выражения. Например:

If OK Then

   angle := PI / 2.0;

   isdone := YES;

End_if;

Макроопределения могут быть локальными (LOCAL) для одной программы, глобальными (GLOBAL) или общими (COMMON).

Локальные макроопределения могут быть использованы только одной программой.

Глобальные макроопределения могут быть использованы любой программой в проекте.

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

Заметим, что общие макроопределения могут быть сохранены отдельно менеджером архивов.

Предупреждение: Когда один и тот же идентификатор определяется в ST программе дважды, тогда используется последнее определение. Например:

определение :	OPEN	is	FALSE

OPEN	is	TRUE

означает:	OPEN	is	TRUE

Имена макроопределений должны удовлетворять следующим правилам:

- имя не может быть длиннее 16 символов

- первым символом должна быть буква

- последующими символами могут быть буквы, цифры или символ подчеркивания

Предупреждение: Макроопределение не может быть определено через другое макроопределение, например, нельзя написать:

PI	is	3.14159

PI2 	is	PI*2

Пишите лучше:

PI2 	is	6.28318


 Язык инструкций (IL)

Список инструкций или IL - это язык низкого уровня.  Инструкции всегда относятся к текущему результату (или IL регистру). Оператор определяет операцию, которая должна быть выполнена с текущим результатом и операндом. Результат операции снова запоминается в текущем результате.

Основной синтаксис IL

Операторы IL


Основной синтаксис IL

IL программа - это список инструкций . Каждая инструкция должна начинаться с новой строки и должна содержать оператор, с дополнительным модификаторами, если нужно, для специфических операций, один или несколько операндов, разделенных запятой (,). Инструкции может предшествовать метка с двоеточием (:).  Если к инструкции присоединен комментарий, то он должен находиться в конце строки. Комментарий всегда начинается с (* и заканчивается *). Между инструкциями может быть введена пустая строка. Комментарии могут быть помещены в пустые строки.

Метки

Модификаторы оператора

Задержанные операции

Ниже даны примеры строк инструкций:

Метка	Оператор	Операнд	Комментарий

Start:	LD	IX1	(* нажать кнопку *)

ANDN	MX5	(* команда разрешена*)

ST	QX2	(* запустить мотор *)


Метки

Инструкции может предшествовать метка с двоеточием (:). Метка может быть помещена на пустую строку. Метки используются в качестве операндов для некоторых операций, таких как прыжки. Имена меток должны удовлетворять следующим правилам:

- имя не может быть длиннее 16 символов

- первым символом должна быть буква

- последующими символами могут быть буквы, цифры или символ подчеркивания

В одной программе одно и то же имя не может быть использовано для обозначения более чем одной метки. Имя метки может совпадать с именем переменной.


Модификаторы оператора

Ниже представлены возможные модификаторы оператора. Символ модификатора должен завершать имя оператора, без пробелов между ними.

N	булевское отрицание операнда

(	задержанная операция

С	условная операция

Модификатор N определяет булевское отрицание операнда Например, инструкция ORN IX12 интерпретируется как: result := result OR NOT (IX12).

Модификатор скобка ( указывает на то, что выполнение инструкции должно быть задержано до тех пор пока не встретится закрытая скобка ).

Модификатор C указывает на то, что соответствующая инструкция должна быть выполнена только если текущий результат имеет значение TRUE (отличное от нуля).

Модификатор C, может комбинироваться с модификатором N, который указывает на то, что инструкция должна быть выполнена только если текущий результат имеет значение FALSE (0).


Задержанные операции

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

'('	модификатор	указывает операцию, которая должна быть задержана
')'	оператор	выполняет задержанную операцию

Открывающаяся скобка ( указывает на то, что выполнение инструкции должно быть задержано до тех пор пока не встретится закрытая скобка ).  Например, следующая последовательность:

AND(	IX12

OR	IX35

)

интерпретируется как:

result := result AND ( IX12 OR IX35 )


Операторы IL

 Следующая таблица  представляет стандартные операторы языка IL:

Оператор	Модификатор	Операнд	Описание

LD	N	переменная, константа	Загружает операнд

ST	N	переменная	Запоминает текущий результат

S	BOO переменная	Устанавливает на TRUE

R	BOO переменная	Сбрасывает на FALSE

CAL 	C   N 	Имя экземпляра функц. блока 	Вызов функционального блока

JMP 	C   N	метка 	Прыжок на метку

RET	C   N 	Возврат из подпрограммы

) 	Выполнить задержанную операцию

Функция	Вызов функции или подпрограммы

AND	N   (	BOO 	логическое И

&	N   (	BOO 	логическое И

OR	N   (	BOO 	логическое ИЛИ

XOR	N   (	BOO 	исключающее ИЛИ

ADD	(	переменная, константа 	Сложение

SUB	(	переменная, константа 	Вычитание

MUL	(	переменная, константа	Умножение

DIV	(	переменная, константа	Деление

GT	(	переменная, константа 	Проверить: >

GE	(	переменная, константа	Проверить: >=

EQ	(	переменная, константа	Проверить: =

LE	(	переменная, константа	Проверить: <=

LT	(	переменная, константа	Проверить: <

NE	(	переменная, константа	Проверить: <

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


Оператор LD

Операция:	загружает значение в текущий результат

Допустимые модификаторы:	N

Операнд:	константа, внутренняя, входная или выходная переменная

Пример:

(* ПРИМЕР LD ОПЕРАЦИЙ *)

LDex:	LD	false	(* результат := FALSE boolean constant *)

LD	true	(*результат := TRUE boolean constant *)

LD	123	(*результат := integer constant *)

LD	123.1	(*результат := real constant *)

LD	t#3ms	(*результат := time constant *)

LD	boo_var1	(*результат := boolean variable *)

LD	ana_var1	(*результат := analog variable *)

LD	tmr_var1	(*результат := timer variable *)

LDN	boo_var2	(*результат := NOT ( boolean variable ) *)


Оператор ST

Операция:	запоминает текущий результат в переменной

Текущий результат этим оператором не изменяется

Допустимые модификаторы:	N

Операнд:	 внутренняя или выходная переменная

Пример:

(* ПРИМЕР ST ОПЕРАЦИЙ *)

STboo:	LD	false

ST	boo_var1	(* boo_var1 := FALSE *)

STN	boo_var2	(* boo_var2 := TRUE *)

STana:	LD	123

ST	ana_var1	(* ana_var1 := 123 *)

STtmr:	LD	t#12s

ST	tmr_var1	(* tmr_var1 := t#12s *)


Оператор S

Операция:	запоминает TRUE в булевской переменной, если текущий результат имеет значение TRUE. Никаких операций не выполняется, если текущий результат равен FALSE. Текущий результат не модифицируется.

Допустимые модификаторы:	(нет)

Операнд:	 внутренняя или выходная булевская переменная

Пример:

(* ПРИМЕР S ОПЕРАЦИЙ *)

SETex:	LD	true	(*текущий результат := TRUE *)

S	boo_var1	(* boo_var1 := TRUE *)

(*текущий результат не изменяется *)

LD	false	(*текущий результат := FALSE *)

S	boo_var1	(* ничего не делать - boo_var1 не изменяется *)


Оператор R

Операция:	запоминает FALSE в булевской переменной если текущий результат имеет значение TRUE. Никаких операций не выполняется если текущий результат равен FALSE. Текущий результат не модифицируется.

Допустимые модификаторы:	(нет)

Операнд:	 внутренняя или выходная булевская переменная

Пример:

(* ПРИМЕР R ОПЕРАЦИЙ *)

RESETex:	LD	true	(*текущий результат:= TRUE *)

R	boo_var1	(* boo_var1 := FALSE *)

(*текущий результат не изменяется *)

ST	boo_var2	(* boo_var2 := TRUE *)

LD	false	(*текущий результат:= FALSE *)

R	boo_var1	(*ничего не делать - boo_var1 не изменяется *)


Оператор JMP

Операция:	прыгает на указанную метку

Допустимые модификаторы:	C N

Операнд:	 метка определенная в той же IL программе

Пример:

(* следующий пример проверяет значение аналогового селектора  (0 или 1 или 2) 	*)

(* чтобы установить один из 3 булевских выходов. Проверка  "равно 0" делается	*)

(* оператором JMPC  	*)

JMPex:	LD	selector	(* selector is 0 or 1 or 2 *)

BOO	(* превращение в boolean *)

JMPC	test1	(* if selector = 0 then *)

LD	true

ST	bo0	(* bo0 := true *)

JMP	JMPend	(* конец программы*)

test1:	LD 	selector

SUB	1	(* уменьшить selector: теперь 0 или 1 *)

BOO	(* превращение в boolean *)

JMPC	test2	(* if selector = 0 then *)

LD	true

ST	bo1	(* bo1 := true *)

JMP	JMPend	(* конец программы*)

test2:	LD	true	(* последняя возможность *)

ST	bo2	(* bo2 := true *)

JMP	end:	(* конец  IL программы*)


Оператор RET

Операция:	заканчивает текущий список инструкций. Если IL последовательность - подпрограмма, то текущий результат возвращается в вызывающую подпрограмму.

Допустимые модификаторы:	C N

Операнд:	(нет)

Пример:

(* следующий пример проверяет значение аналогового селектора  (0 или 1 или 2) 	*)

(* чтобы установить один из 3 булевских выходов. Проверка  "равно 0" делается	*)

(* the JMPC operator	 	*)

JMPex:	LD	selector	(* selector is 0 or 1 or 2 *)

BOO	(* превращение в boolean *)

JMPC	test1	(* if selector = 0 then *)

LD	true

ST	bo0	(* bo0 := true *)

RET	(* end - return 0 *)

(* уменьшить selector *)

test1:	LD 	selector

SUB	1	(* selector теперь 0 или 1 *)

BOO	(* превращение в boolean *)

JMPC	test2	(* if selector = 0 then *)

LD	true

ST	bo1	(* bo1 := true *)

LD	1	(* загрузить действительное значение selector *)

RET	(* end - return 1 *)

(* последняя возможность *)

test2:	RETNC	(* возвращает если selector содержит *)

(* неправильное значение *)

LD	true

ST	bo2	(* bo2 := true *)

LD	2	(* загрузить действительное значение selector *)

 	(* end - return 2 *)


Оператор )

Операция:	выполняет задержанную операцию. Задержанная операция обозначается (

Допустимые модификаторы:	(нет)

Операнд:	 (нет)

Пример:

(* Следующая программа использует задержанные операции: *)

(* res := a1 + (a2 * (a3 - a4) * a5) + a6; *)

Delayed:	LD	a1	(* result := a1; *)

ADD(	a2	(* delayed ADD - result := a2; *)

MUL(	a3	(* delayed MUL - result := a3; *)

SUB	a4	(* result := a3 - a4; *)

)	(* execute delayed MUL - result := a2 * (a3-a4); *)

MUL	a5	(* result := a2 * (a3 - a4) * a5; *)

)	(* execute delayed ADD *)

(* result := a1 + (a2 * (a3 - a4) * a5); *)

ADD	a6	(* result := a1 + (a2 * (a3 - a4) * a5) + a6; *)

ST	res	(* запомнить текущий результат в переменной res *)


Вызов подпрограмм или функций

Подпрограмма или функция (написанная на любом из языков IL, ST, LD, FBD или C) вызывается из языка IL, используя имя в качестве оператора.

Операция:	выполняет подпрограмму или функцию - значение возвращенное подпрограммой или функцией запоминается в текущем результате IL

Допустимые модификаторы:	(нет)

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

Пример:

(* Вызывающая программа: превращает аналоговое значение в временное *)

Main:	LD	bi0

SUBPRO	bi1,bi2	(*вызвать подпрограмму чтобы получить аналоговое значение *)

ST	result	(* result := значение возвращенное подпрограммой *)

GT	vmax	(*проверка переполнения *)

RETC	(*возврат по переполнению *)

LD	result

MUL	1000	(*превратить секунды в миллисекунды *)

TMR	(* превратить в таймер *)

ST	tmval     (* запоминает превращенное значение в таймере*)

(* Вызванная подпрограмма 'SUBPRO' : вычисляет аналоговое значение *)

(* заданное как двоичное число трех булевских входов: in0, in1, in2 - три параметра подпрограммы*)

LD	in2

ANA	(* result = ana (in2); *)

MUL	2	(* result := 2*ana (in2); *)

ST	temporary	(* temporary := result *)

LD	in1

ANA

ADD 	temporary	(* result := 2*ana (in2) + ana (in1); *)

MUL	2	(* result := 4*ana (in2) + 2*ana (in1); *)

ST	temporary	(* temporary := result *)

LD	in0

ANA

ADD	temporary	(* result := 4*ana (in2) + 2*ana (in1)+ana (in0); *)

ST	SUBPRO	(* возвратить текущий результат в вызывающую программу*)


Вызов функциональных блоков: оператор CAL

Операция:	вызывает функциональный блок

Допустимые модификаторы:	C N

Операнд:	Имя функционального блока. Входные параметры блока должны быть присвоены с помощью операторов LD/ST до вызова. Выходные параметры могут быть использованы.

Пример 1:

(* Вызов функционального блока SR : SR1 - экземпляр SR *)

LD	auto_mode

AND	start_cmd

ST	SR1.set1

LD	stop_cmd

ST	SR1.reset

CAL	SR1

LD	SR1.Q1

ST	command

(* FBD эквивалент : *)

Пример 2

(*Мы предполагаем, что R_TRIG1 - это экземпляр блока R_TRIG и CTU1 - это экземпляр блока CTU*)

LD	command

ST	R_TRIG1.clk

CAL	R_TRIG1

LD	R_TRIG1.Q

ST	CTU1.cu

LDN	auto_mode

ST	CTU1.reset

LD	100

ST	CTU1.pv

CAL	CTU1

LD	CTU1.Q

ST	overflow

LD	CTU1.cv

ST	result

(* FBD эквивалент : *)


 Язык структурированный текст (ST)

ST (Structured text) - это структурный язык высокого уровня разработанный для процессов автоматизации. Этот язык, в основном, используется для создания сложных процедур, которые не могут быть легко выражены при помощи графических языков. По умолчанию ST является языком для описания действий внутри шагов и условий языка SFC.

Основной синтаксис ST

Выражения и скобки

Вызовы функций и функциональных блоков

Специфические булевские операторы языка ST

Основные операторы ST

Расширения ST


Основной синтаксис ST

ST программа - это список ST операторов. Каждый оператор заканчивается точкой с запятой (;). Имена используемые в исходном коде (идентификаторы переменных, константы, ключевые слова)  разделены неактивными разделителями (пробелами, символами окончания строки и табуляции) или активными разделителями, которые имеют определенное значение (например, разделитель > означает сравнение больше чем. В текст могут быть введены комментарии. Комментарий должен начинаться с ( и заканчиваться ).Каждый оператор заканчивается точкой с запятой (;).  Основные операторы языка ST:

- оператор присвоения (variable := expression)

- вызов подпрограммы или функции

- вызов функционального блока

- операторы выбора (IF, THEN, ELSE, CASE)

- итеративные операторы (FOR, WHILE, REPEAT)

- управляющие операторы  (RETURN, EXIT)

- специальные операторы для связи с такими языками как SFC

Неактивные разделители могут быть свободно введены между активными разделителями, константами и идентификаторами. Неактивные разделители - это пробелы, символы окончания строки и табуляции. В отличие от неформатных языков, таких как IL конец строки может быть введен  в любом месте программы. Для улучшения читаемости программ нужно использовать неактивные разделители в соответствии со следующими правилами:

- Не пишите более одного оператора в строке

- Используйте табуляция для сдвига сложных операторов

- Вводите комментарии для улучшения читаемости строк и параграфов

Плохая читаемость	Хорошая читаемость
imax := max_ite; cond := X12; if not(cond (* alarm *) then return; end_if; for i (* index *) := 1 to max_ite do if i <> 2 then Spcall(); end_if; end_for; (* no effect if alarm *)	(* imax : number of iterations *) (* i: FOR statement index *) (* cond: process validity *) imax := max_ite; cond := X12; if not (cond) then     return; end_if; (* process loop *) for I := 1 to max_ite do     if i <> 2 then         Spcall ();     end_if; end_for;


Выражения и скобки

Выражения ST объединяют операторы и операнды (переменные или константы). Для одного выражения (объединяющего операнды с одним  ST оператором), тип операндов должен быть одним и тем же.  Это одно выражение имеет тот же тип, что и его операторы и может быть использовано в более сложном выражении. Например:

(boo_var1 AND boo_var2)	BOO тип

not (boo_var1)	BOO тип

(sin (3.14) + 0.72)	REAL ANALOG тип

(t#1s23 + 1.78)	неправильное выражение

Скобки используются для того чтобы отделить подчасти выражения и явно определить приоритетность операций. Когда в сложном выражении нет скобок, приоритетность ST операторов задана неявно. Например:

2 + 3 * 6	 равно  2+18=20	оператор * имеет высший        приоритет

(2+3) * 6	равно 5*6=30	приоритет задается скобками

Предупреждение: Максимальное количество вложенных скобок - 8.


Вызовы функций и функциональных блоков

Стандартные ST вызовы функций  могут быть использованы для каждого из следующих объектов:

- Подпрограммы

- Библиотечные функции и функциональные блоки, написанные на IEC языках

- C функции и функциональные блоки

- Функции преобразования типов

Вызовы подпрограмм или функций

Вызов функциональных блоков


Вызовы подпрограмм или функций

Имя:	имя вызываемой подпрограммы или библиотечной функции написанной на IEC языке или C

Значение:	вызывает ST, IL, LD, или FBD подпрограммы или функции или C функции и дает возвращаемое значение

Синтаксис:	<variable> := <subprog> (<par1>,...<parN>);

Операнды:	За типом возвращаемого значения и параметрами вызова должен следовать интерфейс определенный для подпрограммы

Возвращаемое значение:	значение возвращаемое подпрограммой

Вызовы подпрограмм могут быть использованы в выражении. Они также могут быть использованы в переходах SFC.

Пример 1: вызов подпрограммы

(* Основная ST программа *)

(* получает аналоговое значение и превращает его во временное значение *)

ana_timeprog := SPlimit ( tprog_cmd );

appl_timer := tmr (ana_timeprog * 100);

(* Вызывается FBD программа 'SPlimit' *)

Пример 2: Вызов функции

(* функции использующиеся в сложных выражениях: min, max, right, mlen and left - стандартные "C" функции *)

limited_value := min (16, max (0, input_value) );

rol_msg := right (message, mlen (message) - 1) + left (message, 1);


Вызов функциональных блоков

Имя:	имя экземпляра функционального блока

Значение:	вызывает функциональный блок из библиотеки ISaGRAF или библиотеки пользователя и передает возвращаемые параметры

Синтаксис:	(* вызвать функциональный блок *)

<blockname> ( <p1>, <p2> ... );

(получить возвращаемые параметры *)

<result> := <blockname>. <ret_param1>;

...

<result> := <blockname>. <ret_paramN>;

Операнды:	Параметры и выражения, которые имеют тот же тип, что и параметры этого функционального блока

Возвращаемое значение:	См. Синтаксис получения возвращаемых параметров

Смотрите библиотеку ISaGRAF для того, чтобы найти значение и тип каждого параметра функционального блока. Экземпляр функционального блока (имя копии) должно быть объявлено в словаре.

Пример:

(*вызов функционального блока ST программой *)

(* объявить экземпляр функционального блока в словаре: *)

(* trigb1 : block R_TRIG - определение переднего фронта*)

(* активизация функционального блока из языка ST *)

trigb1 (b1);

(* доступ к возвращаемым параметрам *)

If (trigb1.Q) Then nb_edge := nb_edge + 1; End_if;


Специфические булевские операторы языка ST

Следующие логические операторы являются специфическими для языка ST:

REDGE	определение восходящего фронта

FEDGE	определение падающего фронта

Могут быть использованы другие логические операторы, такие, как:

- NOT	логическое отрицание

- AND(&)	логическое И (AND)

- OR	логическое ИЛИ (OR)

- XOR	логическое исключающее ИЛИ (OR)

Их описание можно найти в главе Стандартные операторы функциональные блоки и функции.


REDGE оператор

Имя:	REDGE

Значение:	определяет передний фронт булевского выражения

Синтаксис:	<edge> := REDGE ( <boo_expression>,<memo_variable> );

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

Возвращаемое значение:	TRUE если значение выражения меняется с FALSE на TRUE. FALSE во всех остальных случаях.

Передний фронт не может быть определен при помощи оператора REDGE более одного раза в течении одного цикла. Этот оператор можно использовать для описания состояния присоединенного к SFC переходу.

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

Если выражение - это булевская переменная с именем xxx, то нужно объявить уникальное имя внутренней переменной EDGE_xxx и использовать его в выражении REDGE для этой переменной. Этот метод гарантирует, что эта переменная не будет изменена во время других вычислений REDGE.

Пример:

(*ST программа, использующая REDGE оператор*)

(*Эта программа считает передние фронты булевского входа*)

(*Bi120 - переменная булевского входа*)

(*Edge_Bi120 - память состояние переменной Bi120*)

If  REDGE (Bi120, Edge_Bi120) Then

Counter := Counter + 1;

End_if;

Замечание: Этот оператор не из IEC1131-3. Вы можете использовать стандартный блок R_TRIG. Он сохраняется для совместимости.


FEDGE оператор

Имя:	FEDGE

Значение:	определяет задний фронт булевского выражения

Синтаксис:	<edge> := FEDGE ( <boo_expression>,<memo_variable> );

Возвращаемое значение:	TRUE если значение выражения меняется с TRUE на FALSE. FALSE во всех остальных случаях.

Задний фронт не может быть определен при помощи оператора FEDGE более одного раза в течении одного цикла. Этот оператор можно использовать для описания состояния присоединенного к SFC переходу.

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

Если выражение - это булевская переменная с именем xxx, то нужно объявить уникальное имя внутренней переменной EDGER_xxx и использовать его в выражении FEDGE для этой переменной. Этот метод гарантирует, что эта переменная не будет изменена во время других вычислений FEDGE.

Пример:

(*ST программа, использующая FEDGE оператор*)

(*Эта программа считает передние фронты булевского входа*)

(*Bi120 - переменная булевского входа*)

(*Edge_Bi120 - память состояние переменной Bi120*)

If FEDGE (Bi120, Edge_Bi120) Then

Counter := Counter + 1;

End_if;

Замечание: Этот оператор не из IEC1131-3. Вы можете использовать стандартный блок F_TRIG. Он сохраняется для совместимости.


Основные операторы ST

Основные операторы языка ST:

Присвоение

Оператор RETURN

Структура IF-THEN-ELSIF-ELSE

Оператор CASE

Итерационный оператор WHILE

Итерационный оператор REPEAT

Итерационный оператор FOR

Оператор EXIT


Присвоение

Name:	:=

Значение:	присваивает значение выражению

Синтаксис:	<variable> :=  <any_expression>;

Операнды:	переменная должна быть внутренняя или выход, переменная и выражение должны иметь один и тот же тип

Выражение может быть вызовом подпрограммы или функции из библиотеки ISaGRAF.

Пример:

(* ST программа с присвоением *)

(* variable <<= variable *)

bo23 := bo10;

(* variable <<= expression *)

bo56 := bx34 OR alrm100 & (level >= over_value);

result := (100 * input_value) / scale;

(* присвоение возвращаемого значения подпрограммы *)

rc := PSelect ( );

(* присвоение с вызовом функции *)

limited_value := min (16, max (0, input_value) );


Оператор RETURN

Имя:	RETURN

Значение:	заканчивает выполнение текущей программы

Синтаксис:	RETURN;

Операнды:	(нет)

В блоке SFC оператор RETURN определяет конец выполнения только данного блока.

Пример:

(* FBD программа: программируемый счетчик *)

(* ST программа *)

If not (CU) then

Q := false;

CV := 0;

RETURN;   (* закончить программу*)

end_if;

if R then

CV := 0;

else

if (CV < PV) then

CV := CV + 1;

end_if;

end_if;

Q := (CV >= PV);


Структура IF-THEN-ELSIF-ELSE

Имя:	IF... THEN... ELSIF... THEN... ELSE... END_IF

Значение:	выполняет один или два списка ST операторов, выбор осуществляется в соответствии со значением булевского выражения

Синтаксис:	IF <boolean_expression> THEN

   <statement> ;

   <statement> ;

   ...

ELSIF <boolean_expression> THEN

   <statement> ;

   <statement> ;

   ...

ELSE

   <statement> ;

   <statement> ;

   ...

END_IF;

Операторы ELSE и ELSIF - дополнительные. Если ELSE опущен и условие равно FALSE, то никаких инструкций не выполняется.

Пример:

(*ST программа , использующая оператор IF*)

IF manual AND not (alarm) THEN

level := manual_level;

bx126 := bi12 OR bi45;

ELSIF over_mode THEN

level := max_level;

ELSE

level := (lv16 * 100) / scale;

END_IF;

(* IF структура  без ELSE *)

If overflow THEN

alarm_level := true;

END_IF;


Оператор CASE

Имя:	CASE... OF... ELSE...  END_CASE

Значение:	выполняет один или несколько списков ST операторов, выбор осуществляется в соответствии с целым выражением

Синтаксис:	CASE <integer_expression> OF

   <value> : <statements> ;

   <value> , <value> : <statements> ;

   ...

ELSE

   <statements> ;

END_CASE;

Значением CASE должна быть целая константа. Несколько значений разделенных запятыми могут указывать на один и тот же список операторов. Оператор ELSE - дополнительный.

Пример:

(*ST программа , использующая оператор CASE*)

CASE error_code OF

255:	err_msg := 'Division by zero';

fatal_error := TRUE;

1:	err_msg := 'Overflow';

2, 3:	err_msg := 'Bad sign';

ELSE

err_msg := 'Unknown error';

END_CASE;


Итерационный оператор WHILE

Имя:	WHILE... DO... END_WHILE

Значение:	итерационная структура для группы ST операторов, условие вычисляется прежде выполнения итерации

Синтаксис:	WHILE <boolean_expression> DO

   <statement> ;

   <statement> ;

   ...

END_WHILE ;

Предупреждение: Так как ISaGRAF синхронная система входные переменные не обновляются во время итераций WHILE. Изменение состояния входных переменных не может быть использовано для описания условия оператора WHILE.

Пример:

(*ST программа , использующая оператор WHILE*)

(* эта программа использует "C" функции для чтения *)

(* символов из последовательного порта *)

string := ''; (* empty string *)

nbchar := 0;

WHILE ((nbchar < 16) & ComIsReady ( )) DO

string := string + ComGetChar ( );

nbchar := nbchar + 1;

END_WHILE;


Итерационный оператор REPEAT

Имя:	REPEAT... UNTIL... END_REPEAT

Значение:	итерационная структура для группы ST операторов, условие вычисляется после выполнения итерации

Синтаксис:	REPEAT

   <statement> ;

   <statement> ;

  ...

UNTIL <boolean_condition>

END_REPEAT ;

Предупреждение: Так как ISaGRAF синхронная система входные переменные не обновляются во время итераций REPEAT. Изменение состояния входных переменных не может быть использовано для описания условия оператора REPEAT.

Пример:

(*ST программа , использующая оператор REPEAT*)

(* эта программа использует "C" функции для чтения *)

(* символов из последовательного порта *)

string := ''; (* empty string *)

nbchar := 0;

IF ComIsReady ( ) THEN

REPEAT

string := string + ComGetChar ( );

nbchar := nbchar + 1;

UNTIL ( (nbchar >= 16) OR NOT (ComIsReady ( )) )

END_REPEAT;

END_IF;


Оператор FOR

Имя:	FOR... TO... BY... DO... END_FOR

Значение:	выполняет ограниченное число итераций, используя целую аналоговую индексную переменную

Синтаксис:	FOR <index> := <mini> TO <maxi> BY <step> DO

   <statement> ;

   <statement> ;

END_FOR;

Операнды:	index: 	внутренняя аналоговая переменная,  увеличивающаяся на каждом витке

mini:	начальное значение для индекса (перед первой  итерацией)

maxi:	максимально-допустимое значение индекса

step:	приращение индекса на каждом шаге

Оператор [BY step] - дополнительный. Если он не определен то приращение равно 1.

While эквивалент оператора FOR:

index := mini;

while (index <= maxi) do

   <statement> ;

   <statement> ;

   index := index + step;

end_while;

Пример:

(*ST программа , использующая оператор FOR*)

(* эта программа извлекает целые числа из строки *)

length := mlen (message);

target := ''; (* empty string *)

FOR index := 1 TO length BY 1 DO

code := ascii (message, index);

IF (code >= 48) & (code <= 57) THEN

target := target + char (code);

END_IF;

END_FOR;


Оператор EXIT

Имя:	EXIT

Значение:	выход из итерационных операторов FOR, WHILE, REPEAT

Синтаксис:	EXIT;

Операнды:	(нет)

EXIT, обычно, используется в операторе IF внутри блоков FOR, WHILE, REPEAT.

Пример:

(*ST программа , использующая оператор EXIT*)

(* эта программа ищет символ в строке *)

length := mlen (message);

found := NO;

FOR index := 1 TO length BY 1 DO

code := ascii (message, index);

IF (code  = searched_char) THEN

found := YES;

EXIT;

END_IF;

END_FOR;


Расширения ST

Следующие функции являются расширениями языка ST:

TSTART - TSTOP: управление таймером

Следующие операторы и функции предназначены для управления исполнением программ наследников SFC:

GSTART	запускает SFC программу

GKILL	убивает SFC программу

GFREEZE	замораживает SFC программу

GRST	перезапускает замороженную SFC программу

GSTATUS	получает текущее состояние SFC программы

Предупреждение: эти функции не относятся к стандарту IEC 1131-3.

Простой эквивалент для GSTART и GKILL может быть получен путем использования синтаксиса SFC шагов:

child_name(S); (* эквивалентно GSTART(child_name); *)

child_name(R); (* эквивалентно GKILL(child_name); *)

Следующие поля могут быть использованы для доступа к состоянию SFC шага:

GSnnn.x	булевская переменная, представляющая активность шага

GSnnn.t	время прошедшее с момента последней активизации шага

(nnn номер SFC шага)

Есть возможность, также проверить активность шага объявленного в другой SFC программе, используя следующий синтаксис:

GSnnn(progname).x

Предупреждение:  номер шага другой программы, при использовании такого синтаксиса не относится к стандарту IEC 1131-3. Простой способ сделать тоже самое, используя правила IEC - это объявить глобальную булевскую переменную в словаре, которая будет представлять активность интересующего нас шага (например ref_step_X). Затем вы вводите в шаг переменную с признаком N (ref_step_X(N);). Затем в программе, которая желает проверить активность этого шага, вы используете эту переменную.

Программа Prog 	Другая программа, которой нужна активность шага программы Prog


TSTART оператор

И мя:	TSTART

Значение:	запускает переменную таймер, таймер не модифицируется командой TSTART, т. е. счет начинается с текущего значения таймера

Синтаксис:	TSTART (<time_variable> );

Операнды:	Любой неактивный таймер

Возвращаемое значение:	(нет)

Пример:

(*ST программа , использующая оператор TSTART и TSTOP*)

Временная диаграмма если bi100 всегда равно FALSE:

Таймер сохраняет свое значение в течении одного цикла.


TSTOP оператор

Имя:	TSTOP

Значение:	останавливает переменную таймер, таймер не модифицируется командой TSTOP.

Синтаксис:	TSTOP (<time_variable> );

Операнды:	Любой активный таймер

Возвращаемое значение:	(нет)

Пример: см. TSTART


GSTART оператор

Имя:	GSTART

Значение:	запускает программу наследник, устанавливая маркер на все ее начальные шаги.

Синтаксис:	GSTART (<child_program> );

Операнды:	SFC программа, которая должна быть наследником по отношению к программе в которой написан оператор

Возвращаемое значение:	(нет)

Наследники программы-наследника не запускаются автоматически оператором GSTART.

Замечание: Так как оператор GSTART не относится к стандарту IEC 1131-3, для запуска программы-наследника лучше использовать признак S:

Child_name(S);

Пример использование GSTART и GKILL:

(* Последовательность 'Sfather' *)	(* Последовательность 'Schild' *)


GKILL оператор

Имя:	GKILL

Значение:	убивает SFC программу, уничтожая маркер на всех ее текущих шагах.

Синтаксис:	GKILL (<child_program> );

Операнды:	SFC программа, которая должна быть наследником по отношению к программе, в которой написан оператор

Возвращаемое значение:	(нет)

Наследники программы-наследника убиваются автоматически оператором GKILL.

Замечание: Так как оператор GKILL не относится к стандарту IEC 1131-3, для того чтобы убить программу-наследник лучше использовать признак R:

Child_name(R);

Пример: см. GSTART (функция описана выше)


GFREEZE оператор

Имя:	GFREEZE

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

Синтаксис:	GFREEZE (<child_program> );

Операнды:	SFC программа, которая должна быть наследником по отношению к программе в которой написан оператор

Возвращаемое значение:	(нет)

Наследники программы-наследника замораживаются автоматически вместе с указанной программой.

Замечание: Оператор GFREEZE не относится к стандарту IEC 1131-3.

Пример:


GRST оператор

Имя:	GRST

Значение:	перезапускает программу-наследник и замороженную оператором GFREEZE, все маркеры, уничтоженные оператором GFREEZE восстанавливаются.

Синтаксис:	GRST (<child_program> );

Операнды:	SFC программа, которая должна быть наследником по отношению к программе в которой написан оператор

Возвращаемое значение:	(нет)

Наследники программы-наследника запускаются автоматически вместе с указанной программой.

Замечание: Оператор GRST не относится к стандарту IEC 1131-3.

Пример: см. GFREZE (функция описана выше)


GSTATUS оператор

Имя:	GSTATUS

Значение:	возвращает текущее состояние SFC программы.

Синтаксис:	<ana_var> := GSTATUS (<child_program> );

Операнды:	SFC программа, которая должна быть наследником по отношению к программе в которой написан оператор

Возвращаемое значение:	0 = программа неактивна (убита)

1 = программа активна (запущена)

2 = программа заморожена

Замечание: Оператор GSTATUS не относится к стандарту IEC 1131-3.

Пример:


 Язык функциональных блочных диаграмм (FBD)

Язык функциональных блочных диаграмм (FBD) - графический язык.  Он позволяет программисту строить сложные процедуры, используя существующие функции из библиотеки ISaGRAF и связывая их вместе при помощи графических диаграмм.

Основной формат диаграмм FBD

Оператор RETURN

Прыжки и метки

Логическое отрицание

Вызов функций и функциональных блоков из FBD


Основной формат диаграмм FBD

FBD диаграмма описывает функцию между входными переменными и выходными переменными. Функция описывается как множество элементарных функциональных блоков. Входные и выходные переменные связываются в блоки при помощи линий связи. Выход функционального блока может быть также связан с входом другого функционального блока.

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

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

Выходные переменные FBD программы должны быть связаны с точками выхода функционального блока. Тип каждой переменной должен быть тем же что и тип соответствующего выхода. Выходом FBD блока может быть внутренняя или выходная переменная или имя программы (только для подпрограмм). Когда выходом является имя редактируемой подпрограммы, оно представляет присвоение возвращаемого значения подпрограммы (возвращаемого в вызывающую программу). Входные и выходные переменные, входы и выходы функциональных блоков соединены линиями связи. Линии могут быть использованы для соединения двух логических точек диаграммы:

- Входной переменной и входа функционального блока

- Выхода функционального блока и входа другого блока

- Выхода функционального блока и выходной переменной

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

Множественные правые связи могут  быть использованы чтобы передать информацию от его левого конца к каждому правому концу. Все концы связи должны быть одного типа.


Оператор RETURN

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

(* Пример FBD программы использующей оператор RETURN *)

(* ST эквивалент: *)

If auto_mode OR alarm Then

Return;

End_if;

bo67 := (bi10 AND bi23) OR x_cmd;


Прыжки и метки

Прыжки и метки используются для управления выполнением диаграммы. К правому краю символа метки или прыжка не может быть присоединено никаких других объектов. Используются следующие обозначения:

>>LAB	прыжок на метку (имя метки "LAB")

LAB:	определение метки (имя метки "LAB")

Если линия связи слева от символа прыжка находится в состоянии TRUE , исполнение программы переходит на соответствующую метку.

(* Пример FBD программы с использованием меток и прыжков *)

(* IL эквивалент: *)

ld	manual

and	b1

jmpc	NOMODIF

ld	input1

or	input2

st	result

NOMODIF:	ld	result

and	valid

st	cmd10


Логическое отрицание

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

(* Пример FBD программы использующей метки и прыжки *)

(* ST эквивалент: *)

output1 := input1 AND NOT (input2);


Вызов функций и функциональных блоков из FBD

Язык FBD позволяет вызывать подпрограммы, функции и функциональные блоки. Подпрограммы, функции и функциональные блоки представляются прямоугольником функции. Имя, написанное в прямоугольнике, - это имя подпрограммы, функции или функционального блока. В случае подпрограммы или функции единственным выходом прямоугольника является возвращаемая величина. Функциональные  блоки могут иметь более одного выхода.

(* Пример FBD программы использующей блок SUB PROGRAM *)

(* ST Эквивалент *)

net_weight := Weighing (mode, delta); (* call sub-program *)

If (net_weight = 0) Then Return; End_if;

weight := net_weight + tare_weight;


 Язык последовательных функциональных схем (SFC)

Язык последовательных функциональных схем (SFC) - это графический язык, который используется для описания последовательных операций. Процесс представляется в виде набора определенных шагов, связанных переходами. К каждому переходу прикреплено логическое условие. Действия внутри шагов описаны более детально при помощи других языков (ST, IL, LD, FBD).

Основной формат схемы SFC

Основные компоненты SFC

Схождения и расхождения

Макро шаги

Действия внутри шагов

Условия, присоединенные к переходам

Динамические правила SFC

Иерархия программы SFC


Основной формат схемы SFC

SFC программа - это графический набор шагов и переходов, соединенных вместе направленными связями. Для обозначения схождений и расхождений используются множественные связи. Некоторые части программы могут быть отделены и представлены в основной схеме одним символом - макро шагом. Вот основные графические правила для SFC:

- шаги не могут следовать подряд

- переходы не могут следовать подряд


Основные компоненты SFC

Основные компоненты SFC : шаги, начальные шаги, переходы, ориентированные связи, прыжки на шаг.

Шаги и начальные шаги

Переходы

Ориентированные связи

Прыжок на шаг


Шаги и начальные шаги

Шаг представляется одиночным квадратом. Каждому шагу присваивается номер, написанный внутри квадрата. Основное описание шага пишется внутри прямоугольника , присоединенного к символу шага. Это свободный комментарий (который не является частью языка). Вышеприведенная информация называется Уровнем 1 шага:

Во время работы активный шаг помечается маркером:

Во время работы активный шаг помечается маркером:

Активный шаг:	Неактивный шаг:

Начальная ситуация программы SFC описывается начальными шагами. Начальный шаг обозначается графическим символом с двойной рамкой. После запуска  программы маркер автоматически устанавливается на каждый начальный шаг.

начальный шаг:

 SFC программа должна содержать, по крайней мере, один начальный шаг.

У шага есть атрибуты. Они могут быть использованы в любом другом языке:

GSnnn.x........................активность шага (логическая переменная)

GSnnn.t........................продолжительность активного состояния шага (таймер)

(где nnn - номер начального шага)


Переходы

Переходы представлены горизонтальными полосками, которые пересекают линии связи. Каждому переходу присвоен номер, следующий за символом перехода. Описание перехода располагается справа от символа перехода. Это описание представляет собой свободный комментарий (не входящий в язык программирования). Вышеприведенная информация называется Уровнем 1 перехода


Ориентированные связи

Для связи шагов и переходов используются одиночные линии. Это ориентированные связи. Когда ориентация не задана явно, связь ориентирована сверху вниз.


Прыжок на шаг

Символ прыжка может быть использован, чтобы определить линию связи от перехода к шагу, не рисуя линию. Символ прыжка должен иметь номер шага назначения:

Связь от шага к переходу нельзя представить с помощью символа прыжка. Следующие схемы эквивалентны:


Схождения и расхождения

Расхождения - это множественные связи от одного символа SFC (шага или перехода) ко многим. Схождение - это множественные связи от более чем одного символа SFC к одному другому символу. Схождения и расхождения могут быть одиночными или двойными.

Одиночные расхождения

Двойные расхождения


Одиночные расхождения

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

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

(* Это программа SFC с одиночным схождением и расхождением*)


Двойные расхождения

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

Пример двойного схождения и расхождения:

(* Программа SFC с дойными расхождениями и схождениями *)


Макро шаги

Макро шаг - это уникальное представление уникальной группы шагов и переходов. Тело макро шага описывается отдельно в другом месте SFC программы. В основной схеме SFC он выглядит как один символ. Для макро шага используется символ:

Номер, написанный в макро шаге, - это номер первого шага в теле макро шага. Тело макро шага должно начинаться начальным шагом и заканчиваться конечным шагом. Схема должна быть замкнутой. Начальный шаг не имеет верхней связи (нет перехода сзади). Конечный шаг не имеет нижней связи (нет перехода вперед). Символ макро шага может быть помещен в тело другого макро шага.

Предупреждение: Так как макро шаг это уникальный набор шагов и переходов, один и тот же макро шаг не может быть использован более чем однажды в SFC программе.

Пример:

(* Программа SFC с макрошагом *)

(* Основная схема *)	(* Тело макрошага *)


Действия внутри шагов

Уровень 2 шага SFC представляет собой детальное описание действий в период активности шага. Это описание может использовать текстовые дополнения языка SFC и другие языки, такие как Структурный Текст (ST). Основные типы действий:

Булевские действия

Импульсные действия

Не сохраняемые действия

Действия SFC

Несколько действий одинаковых или разных типов могут быть описаны в одном шаге. Средства, позволяющие использовать любой другой язык:

Вызов функций и функциональных блоков из действия

Соглашения языка IL


Булевские действия

Булевские действия присваивают значение логической переменной при активизации шага. Логические переменные могут быть выходными или внутренними. Им присваивается значение каждый раз, когда шаг становится активным или перестает быть активным. Синтаксис основных логических действий:

<boolean_variable> (N) ;	присвоить переменной сигнал активности шага

<boolean_variable> ;	тот же эффект (N не обязательно)

/ <boolean_variable> ;	присвоить переменной отрицание сигнала активности шага

Есть другие возможности установки и сброса логических переменных, когда шаг становится активным. Синтаксис установки и сброса логических действий:

<boolean_variable> (S) ;	присваивает переменной значение TRUE, когда шаг

<boolean_variable> (R) ;	присваивает переменной значение FALSE, когда шаг

Логические переменные должны быть выходными (OUTPUT) или внутренними (INTERNAL). Следующая программа ведет себя таким образом:

Пример:

(* Программа SFC использующая булевские действия *)

Пример:


Импульсные действия

Импульсное действие - это список инструкций ST или IL, которые выполняются только однажды при активизации шага. Инструкции пишутся в соответствии со следующим синтаксисом:

ACTION (P) :

(*ST операторы *)

END_ACTION ;

Вот результат импульсного действия:

Пример:


Не сохраняемые действия

Не сохраняемое действие - это список инструкций ST или IL, которые выполняются на каждом цикле, в течение всего периода активности шага. Инструкции пишутся в соответствии со следующим синтаксисом:

ACTION (N) :

(* ST операторы *)

END_ACTION ;

Вот результат не сохраняемого действия:

Пример:


Действия SFC

SFC действие - это дочерняя последовательность SFC, стартующая и убивающаяся в соответствии с изменением сигнала активности шага. SFC действие может иметь признак N (не запоминаемый ), R (установить), S (сбросить). Вот синтаксис основных SFC действий:

<child_prog> (N);	запустить дочернюю последовательность, когда шаг становится активным и убить ее, когда шаг становится пассивным

<child_prog> ;	тот же эффект (N не обязательно)

<child_prog> (S);	запустить дочернюю последовательность, когда шаг становится активным и ничего не делать, когда шаг становится пассивным

<child_prog> (R);	убить дочернюю последовательность, когда шаг становится

активным и ничего не делать, когда шаг 	становится 	пассивным

SFC последовательность, определенная как действие, должна быть дочерней SFC программой редактируемой программы. Заметим, что использование признаков S и R для SFC действия имеет тот же эффект, что и операторы GSTART и GKILL в импульсном действии на языке ST.

Ниже представлен пример SFC действия. Основная SFC программа называется Father. Она имеет два SFC наследника - SeqMix и SeqPump. Текст родительской SFC программы:

(* Программа SFC использующая действия SFC *)


Вызов функции и функционального блока из действия

Подпрограммы, функции или функциональные блоки (написанные на ST, IL, LD, или FBD) или C функции и C функциональные блоки, могут быть вызваны непосредственно из блока SFC действия на основе следующего синтаксиса:

Для подпрограмм и C функций:

ACTION (P) :

result := sub_program ( ) ;

END_ACTION;

или

ACTION (N) :

result := sub_program ( ) ;

END_ACTION;

Для функциональных блоков на "C" или на ST, IL, LD, FBD:

ACTION (P) :

Fbinst(in1, in2);

result1 := Fbinst.out1;

result2 := Fbinst.out2;

END_ACTION;

или

ACTION (N) :

Fbinst(in1, in2);

result1 := Fbinst.out1;

result2 := Fbinst.out2;

END_ACTION;

Более подробный синтаксис можно найти в описании языка ST.

Пример вызова подпрограммы в блоке действия:

(* Программа SFC с вызовом подпрограммы в блоке действия *)


Соглашения языка IL

Текст на языке IL  может быть непосредственно введен в блок действия SFC, на основе следующего синтаксиса:

ACTION (P) :	(* или N *)

#info=IL

     <инструкция>

     <инструкция>

     ....

#endinfo

END_ACTION;

Специальные ключевые слова #info=IL и #endinfo должны быть введены именно так, прописными буквами. Пробелы и символы табуляции вводить нельзя до или после ключевых слов. Пример:

(* SFC программ с последовательностью IL в блоке действия *)


Условия, присоединенные к переходам

К каждому переходу присоединяется логическое выражение, которое является условием прохождения этого перехода. Условие обычно записывается на языке ST или LD (быстрый LD редактор). Это Уровень 2 перехода. Однако могут быть использованы и другие структуры:

Соглашения языка ST

Соглашения языка LD

Соглашения языка IL

Вызовы функций из переходов

Предупреждение: Если к переходу не присоединено выражение, то по умолчанию условие - TRUE.


Соглашения языка ST

Язык Структурный Текст (ST) можно использовать для описания условий, присоединенных к переходам. Выражение должно иметь логический тип и заканчиваться точкой с запятой:

< boolean_expression > ;

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

(* Программа SFC с программой ST для переходов *)


Соглашения языка LD

Язык Релейных Диаграмм (LD) можно использовать для описания условий, присоединенных к переходам. Диаграмма состоит из штанги с витком. Значение витка представляет значение перехода. Пример:


Соглашения языка IL

Язык Список Инструкций (IL) можно использовать для описания SFC переходов, согласно следующему синтаксису:

#info=IL

<инструкция>

<инструкция>

....

Значение, которое содержит current result (IL регистр) в конце IL последовательности, будет являться условием присоединенным к переходу:

current result = 0 	 	условие FALSE

current result <> 0	условие TRUE

Специальные ключевые слова #info=IL и #endinfo должны быть введены именно так, прописными буквами. Пробелы и символы табуляции вводить нельзя до или после ключевых слов. Пример:

(* SFC программа с IL программой для переходов *)


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

Любая подпрограмма или функция (написанные на FBD, LD, ST или IL) или C функция могут вычислять значение условия присоединенного к переходу, согласно следующему синтаксису:

< sub_program > ( ) ;

Значение, возвращаемое подпрограммой или функцией должно быть логическим и давать результирующее условие:

return value = FALSE	условие FALSE

return value = TRUE	условие TRUE

Пример:

(* Программа SFC с вызовом программ для переходов *)


Динамические правила SFC

Вот пять динамических правил языка SFC:

 Начальная ситуация

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

 Освобождение перехода

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

- он не разрешен и

- соответствующее условие перехода не true.

 Изменение состояния активного шага

Освобождение перехода одновременно ведет к активному состоянию непосредственно следующего шага и пассивному состоянию непосредственно предшествующего шага.

 Одновременное освобождение переходов

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

 Одновременная активизация и дезактивация шага

Если во время работы шаг одновременно активизируется и дезактивируется, 	о приоритет отдается активизации.


Иерархия программы SFC

Система ISaGRAF допускает описание вертикальной структуры программы SFC. SFC программы образуют иерархическое дерево. Каждая SFC программа может управлять (запускать, убивать) другие SFC программы. Такие программы называются наследниками SFC программы управляющей ими. SFC программы связаны в основное иерархическое дерево, используя связь родитель-наследник:

Основные правила иерархической структуры:

- SFC программы, которые не имеют родителей, называются основными SFC программами

- Основные SFC программы активизируются системой в момент запуска приложения

- Программа может иметь несколько программ-наследников

- Наследник не может иметь более одного родителя

- Программа-наследник управляется только своим родителем

- Программа не может управлять наследником своего наследника

Основные действия, которые SFC программа-родитель может выполнять для управления программой-наследником :

Start	Запустить	(GSTART) Запускает дочернюю программу : активизирует каждый ее начальный шаг. Наследники этой программы не запускаются автоматически.

Kill	Убить	(GKILL) Убивает дочернюю программу : дезактивируя каждый ее активный шаг. Все наследники этой программы также убиваются.

Freeze	(Заморозить	(GFREEZE) Дезактивирует каждый активный шаг программы, и запоминает их так, чтобы программа могла быть  перезапущена. Все наследники этой программы также замораживаются.

Restart	Перезапустить	(GRST) Перезапускает замороженную дочернюю программу активизируя все ее зависшие шаги. Наследники этой  программы не перезапускаются автоматически.


 Язык релейных диаграмм  (LD)

Язык релейных диаграмм - это графическое представление логических уравнений, комбинирующее контакты (входы) и витки (выходы). Язык LD позволяет описывать работу с булевыми данными помещая графические символы в схему программы. Графические символы LD организованы внутри схемы так же, как электрическая схема. Справа и слева LD диаграмма  должна соединяться с вертикальными силовыми рельсами.

Силовые рельсы и соединительные линии

Множественные соединения

Основные контакты и витки языка LD

Оператор RETURN

Прыжки и метки

Блоки в LD

Основные компоненты  LD диаграммы:

Левая вертикальная силовая шина

Правая вертикальная силовая шина

Горизонтальная линия связи

Вертикальная линия связи

Множественные линии соединения (все соединенные вместе)

Контакт связанный с переменной

Виток связанный с переменной


Силовые рельсы и соединительные линии

LD диаграмма ограничена справа и слева вертикальными линиями, которые называются левым силовым рельсом и правым силовым рельсом соответственно.

Символы LD диаграммы связаны с силовыми рельсами и другими символами при помощи соединительных линий. Соединительные линии могут быть горизонтальными или вертикальными.

Каждый отрезок линии имеет состояние TRUE или FALSE. Отрезки, соединенные напрямую имеют одно и то же булевское состояние. Любая горизонтальна линия, соединенная с левым вертикальным рельсом имеет состояние TRUE.


Множественные соединения

Левый и правый концы соединительной линии имеют одно и тоже логическое состояние. Комбинируя вертикальные и горизонтальные линии можно строить множественные соединения. Состояния концов множественного соединения определяются правилами логики.

Левое множественное соединение объединяет более чем одну горизонтальную линию, соединенную с вертикальной линией и одну горизонтальную линию подходящую с правой стороны. Булевское состояние правого конца - это логическое ИЛИ(OR) всех левых концов.

(* Пример множественного левого соединения*)

(* состояние правого конца (v1 OR v2 OR v3) *)

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

(* Пример множественного ПРАВОГО соединения*)

(* ST эквивалент: *)

output1 := input1;

output2 := input1;

Множественное соединение слева и справа объединяет более чем одну горизонтальную линию соединенную с вертикальной линией с левой стороны и более чем одну горизонтальную линию подходящую с правой стороны. Булевское состояние каждого правого конца - это логическое ИЛИ(OR) всех левых концов.

(*Пример множественного ЛЕВОГО и ПРАВОГО соединения *)

(* ST Эквивалент: *)

output1 := input1 OR input2;

output2 := input1 OR input2;

output3 := input1 OR input2;


Основные контакты и витки языка LD

Для представления контактов используются символы:

Прямой контакт

Инвертированный контакт

Контакт с определением переднего фронта

Контакт с определением заднего фронта

Для представления витков используются символы:

Прямой виток

Инвертированный виток

SET виток

RESET виток

Виток с определением переднего фронта

Виток с определением заднего фронта

Имя переменной пишется над этими графическими символами:


Прямой контакт

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

Состояние линии соединения на правом конце - это логическое И(AND) состояния левого конца и значения переменной контакта.

(* Пример использования ПРЯМЫХ *)

(* ST Эквивалент: *)

output1 := input1 AND input2;


Инвертированный контакт

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

Состояние линии соединения на правом конце - это логическое И(AND) состояния левого конца и  отрицания значения переменной контакта.

(* Пример использования ИНВЕРТИРОВАННЫХ контактов*)

(* ST Эквивалент: *)

output1 := NOT (input1) AND NOT (input2);


Контакт с определением переднего фронта

Этот контакт позволяет производить логические операции между состоянием линии и  логической переменной.

Состояние линии соединения на правом конце принимает значение TRUE, когда значение на левом конце - TRUE и  значения переменной контакта меняется с FALSE на TRUE. Во всех остальных случаях оно устанавливается равным FALSE.

(* Пример использования контактов ПЕРЕДНЕГО ФРОНТА*)

(* ST Эквивалент: *)

output1 := input1 AND (input2 AND NOT (input2prev));

(* input2prev - значение input2 на предыдущем цикле *)


Контакт с определением заднего фронта

Этот контакт позволяет производить логические операции между состоянием линии и  логической переменной.

Состояние линии соединения на правом конце принимает значение TRUE когда значение на левом конце - TRUE и  значения переменной контакта меняется с TRUE на FALSE. Во всех остальных случаях оно устанавливается равным FALSE.

(* ST Эквивалент: *)

output1 := input1 AND (NOT (input2) AND input2prev);

(* input2prev - значение input2 на предыдущем цикле *)


Прямой виток

Прямой виток дает логический выход состояния  линии соединения.

Переменной витка приписывается значение состояния левой лини соединения. Состояние левого соединения распространяется на правое соединение. Правое соединение может быть связано с правым вертикальным силовым рельсом.

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

Соответствующее имя может быть именем программы (только для подпрограмм). Это соответствует присвоению возвращаемой величины подпрограммы.

(* ST Эквивалент: *)

output1 := input1;

output2 := input1;


Инвертированный виток

Инвертированный виток дает логический выход отрицания состояния  линии соединения.

Переменной витка приписывается отрицание значение состояния левой линии соединения. Состояние левого соединения распространяется на правое соединение. Правое соединение может быть связано с правым вертикальным силовым рельсом.

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

Соответствующее имя может быть именем программы (только для подпрограмм). Это соответствует присвоению возвращаемой величины подпрограммы.

(* ST Эквивалент: *)

output1 := NOT (input1);

output2 := input1;


SET виток

SET виток дает логический выход состояния  линии соединения.

Соответствующая переменная принимает значение TRUE, когда состояние левой линии связи становится равным TRUE. Переменная удерживает это состояние до тех пор, пока она не будет инвертирована витком RESET. Состояние левого соединения распространяется на правое соединение. Правое соединение может быть связано с правым вертикальным силовым рельсом.

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

(* ST Эквивалент: *)

IF input1 THEN

   output1 := TRUE;

END_IF;

IF input2 THEN

   output1 := FALSE;

END_IF;


RESET виток

RESET виток дает логический выход состояния  линии соединения.

Соответствующая переменная принимает значение FALSE, когда состояние левой линии связи становится равным TRUE. Переменная удерживает это состояние до тех пор, пока она не будет инвертирована витком SET. Состояние левого соединения распространяется на правое соединение. Правое соединение может быть связано с правым вертикальным силовым рельсом.

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

(* ST Эквивалент: *)

IF input1 THEN

   output1 := TRUE;

END_IF;

IF input2 THEN

   output1 := FALSE;

END_IF;


Виток с определением переднего фронта

Положительный виток дает логический выход состояния  линии соединения. Этот тип витка имеется только в быстром релейном редакторе (Quick ladder).

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

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

(* ST Эквивалент: *)

IF (input1 and NOT(input1prev)) THEN

   output1 := TRUE;

ELSE

   output1 := FALSE;

END_IF;

(* input1prev - значение input1 на предыдущем цикле *)


Виток с определением заднего фронта

Отрицательный виток дает логический выход состояния  линии соединения. Этот тип витка имеется только в быстром релейном редакторе (Quick ladder).

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

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

(* Пример использования витка "Positive" *)

(* ST Эквивалент: *)

IF (NOT(input1) and input1prev) THEN

   output1 := TRUE;

ELSE

   output1 := FALSE;

END_IF;

(* input2prev - значение input2 на предыдущем цикле *)


Оператор RETURN

Метка RETURN может быть использована как выход, чтобы представить условное завершение программы. Никаких символов к правому концу RETURN подключать нельзя.

Если левый конец линии соединения имеет состояние TRUE, то программы завершается, не выполняя уравнения введенные в следующих строках программы.

Замечание: Если LD программа - это подпрограмма, то ее имя должно быть связано с выходным витком, чтобы установить возвращаемое значение.

(* Пример использования символа RETURN *)

(* ST  Эквивалент: *)

If Not (manual_mode) Then RETURN; End_if;

result := (input1 OR input3) AND input2;


Прыжки и метки

Метки, условные и безусловные прыжки, могут быть использованы для управления выполнением диаграммы. Никаких символов к правому концу символа метки и прыжка подключать нельзя. Используются следующие обозначения:

>>LAB	прыжок на метку "LAB"

LAB:	определение метки "LAB"

Если линия связи слева от символа прыжка находится в состоянии TRUE , исполнение программы переходит на соответствующую метку.

(* Пример использования символа прыжка и метки *)

(* IL Эквивалент: *)

ldn	manual_mode

jmpc	other

ld	input1

st	result

jmp	END

OTHER:	ld	input2

st	result

END:	(* end of program *)


Блоки в LD

Используя Быстрый LD редактор, вы подключаете функциональные блоки к логическим линиям. Функция, в действительности, может быть оператором, функциональным блоком или функцией. Так как блоки не всегда имеют логические входы и/или логические выходы, введение блоков в LD диаграммы приводит к добавлению нескольких новых параметров EN, ENO в интерфейс блока. Параметры EN, ENO не добавляются, если вы используете FBD/LD редактор, и вы можете подключить переменные требуемого типа.

Вход EN

Выход ENO

Использование EN и ENO


Вход "EN"

В некоторых операторах, функциях или функциональных блоках первый вход не булевский. Так как первый вход всегда должен быть подключен к шине, на первую позицию автоматически вводится другой вход, называемый EN. Блок выполняется только тогда, когда вход EN равен TRUE. Ниже представлен пример оператора сравнения и эквивалентный код на ST:

	IF rung_state THEN    q := (value1 > value 2); ELSE    q := FALSE; END_IF; (*продолжить шину с состоянием q *)


Выход "ENO"

В некоторых операторах, функциях или функциональных блоках первый выход не булевский. Так как первый выход всегда должен быть подключен к шине, на первую позицию автоматически вводится другой выход, называемый ENO. Выход ENO всегда имеет то же значение, что и первый вход блока. Ниже представлен пример функционального блока AVERAGE и эквивалентный код на ST:

	AVERAGE(rung_state, Signal, 100); OutSignal := AVERAGE.XOUT; eno := rung_state; (*продолжить шину с состоянием eno *)


параметры "EN" и "ENO"

В некоторых случаях требуются EN и ENO. Ниже представлен пример с арифметическим оператором и эквивалентный код на ST:

	IF rung_state THEN    result := (value1 + value2); END_IF; eno := rung_state; (*продолжить шину с состоянием eno*)


 Язык потоковых диаграмм

Потоковые Диаграммы (FC)  это графический язык, использующийся для описания  последовательных операций. Потоковая Диаграмма состоит из Действий и Тестов. Между Действиями и Тестами находятся ориентированные связи представляющие потоки данных. Множественные связи используются для представления расхождений и схождений. Действия и тесты могут быть описаны с помощью языков ST, LD or IL. Функции и Функциональные блоки любого языка (кроме SFC) могут быть вызваны из действий и тестов. Программа Потоковых Диаграмм может вызывать другие программы Потоковых Диаграмм. Вызываемая программа FC  это подпрограмма вызывающей программы FC.

Основные компоненты FC

Примеры сложных структур FC

Динамическое поведение FC

Проверка FC


Компоненты FC

Ниже даны компоненты языка Потоковых Диаграмм:

Начало схемы FC

Конец схемы FC

Связи потоков FC

Действия FC

Условия FC

Подпрограммы FC

Специфические действия В/В FC

Соединители FC

Комментарии FC


Начало схемы FC

Символ "начало" должен появляться в начале программы Потоковых Диаграмм. Он уникален и не может быть опущен. Он представляет начальное состояние диаграммы, когда она активизирована. Ниже дан чертеж символа "начало" :

Символ "Начало" всегда имеет соединение (внизу) с другим объектом схемы. Потоковая диаграмма неверна, если нет соединения символа "Начало" с другим объектом.


Конец схемы FC

Символ "конец" должен возникать в конце программы Потоковых Диаграмм. Он уникален и не может быть пропущен. Может быть так, что никакого соединения не подходит к символу "Конец" (всегда виток), но символ "Конец" все же нарисован внизу схемы. Он представляет собой заключительное состояние схемы, когда исполнение было завершено. Ниже дан чертеж символа "конец":

Символ "Конец" обычно имеет соединение (наверху) с другими объектами схемы. Потоковая диаграмма может не иметь соединения с объектом "Конец" (бесконечный цикл). В этом случае объект "Конец" должен быть, тем не менее, виден внизу схемы.


Потоковые связи FC

Потоковые связи  это линии, которые представляют потоки между двумя точками в диаграмме. Связь всегда заканчивается стрелкой. Ниже дан чертеж потоковой связи:

Две связи не могут исходить из одного источника.


Действия FC

Символ действия представляет собой действие, которое нужно выполнить. Действия идентифицируются при помощи числа и имени. Ниже дан чертеж символа "действия" :

Два разных объекта одной схемы не могут иметь одно и то же имя или логический номер. Языками программирования для действий могут быть ST, LD или IL. Действия всегда соединены со связями, одна подходит к нему, другая исходит из него.


Условия FC

Условие представляет собой булевский тест. Условие идентифицируется числом и именем. В соответствии со значением присоединенного выражения на ST, LD или IL, поток направляется либо по пути "YES", либо "NO".  Ниже даны возможные чертежи символа условия:

Два различных объекта одной и той же схемы не могут иметь одно и тоже имя или логический номер. Программа теста

- выражение на ST, или

- одиночная ступень в LD, с символом присоединенном к уникальному витку, или

- несколько инструкций на IL. Регистр IL (или текущий результат) используется для того, чтобы оценить условие.

При программировании на ST, за выражение может следовать двоеточие. При программировании на LD, значение условия представляется уникальным витком. Условие равное:

- 0 or FALSE направляет поток по NO

- 1 or TRUE направляет поток по YES

Тест всегда соединен с входящей связью, и оба выходящих соединения должны быть определены.


Подпрограмма FC

Система допускает описание иерархической структуры программ FC. Программы FC организованы в виде иерархического дерева. Каждая программа FC может вызывать другие FC программы. Такая программа называется дочерней программой программы FC, которая ее вызывает. Программы FC, которые вызывают подпрограммы, называются родительскими программами. Программы FC объединяются вместе в общее иерархическое дерево, используя отношение "предок - наследник":

Символ подпрограммы в Потоковой Диаграмме представляет вызов подпрограммы. Исполнение вызывающей программы FC останавливается до завершения работы подпрограммы. Подпрограмма Потоковой Диаграммы идентифицируется числом и именем, как другие программы, функции или функциональные блоки. Ниже дан чертеж символа "вызова подпрограммы":

Два различных объекта одной и той же схемы не могут иметь одно и тоже имя или логический номер. Вот основные правила, по которым строится иерархическая структура FC:

- FC программы, которые не имеют родителей, называются  основными FC программами.

- Основные программы FC активизируются системой при запуске приложения

- Программа может иметь несколько дочерних программ

- Дочерняя программа не может иметь более одного родителя

- Дочерняя программа может быть вызвана своим родителем

- Программа не может вызывать дочь своей собственной дочери

Одна и та же подпрограмма может возникать несколько раз в родительской схеме. Вызов подпрограммы Потоковой Диаграммы представляет собой полное исполнение подсхемы. Исполнение родительской схемы прекращается на время исполнения дочерней схемы. Блок вызова подпрограммы должен следовать тем же правилам соединений, что и действие.


Специфические действия В/В FC

Символ специфических действий В/В представляет действие, которое должно быть выполнено. Как другие действия, специфические действия В/В идентифицируются номером и именем. Одна и та же семантика используется в стандартных действиях и специфических действиях В/В. Цель специфических действий В/В состоит только в том, чтобы сделать схему более читаемой и сфокусировать внимание на непереносимых частях схемы. Использование специфических действий В/В  дополнительная особенность. Ниже дан чертеж символа "специфических действий В/В":

Специфические блоки В/В ведут себя точно так же, как стандартные действия. Это относится к их свойствам, программированию на ST, LD или IL, и правилам соединения.


Соединители FC

Соединители используются для представления связи между двумя точками диаграммы без вычерчивания. Соединитель обозначен как круг и связан с началом потока. Чертеж соединителя завершается, на соответствующей стороне (в зависимости от направления потока данных), с помощью идентификации точки цели (обычно имя символа цели). Ниже дан стандартный чертеж соединителя:

Соединитель всегда попадает в определенный в Потоковой Диаграмме символ. Символ назначения определяется его логическим номером.


Комментарии FC

Блок комментариев содержит текст, который не имеет смысла для семантики схемы. Он может быть введен на любом свободном месте в окне Потоковой Диаграммы, и используется для документирования программ. Ниже дан чертеж символа  "комментария":


Примеры сложных структур FC

Эта секция показывает примеры сложных структур, которые могут быть определены в Потоковых Диаграммах. Такие структуры объединяют основные объекты связанные вместе.

	IF / THEN / ELSE (1) место для ввода действий по "THEN" (2) место для ввода действий по "ELSE"
	REPEAT / UNTIL (3) место для ввода повторяемых действий
	WHILE / DO (3) место для ввода повторяемых действий


Динамическое поведение FC

Исполнение Потоковой Диаграммы может быть представлено следующим образом:

- Символ Начало занимает один целевой цикл.

- Символ Конец занимает один целевой цикл и заканчивает исполнение схемы. После того, как этот символ достигнут, никаких действий на схеме не выполняется.

- Исполнение действия занимает один целевой цикл.

Замечание: В противоположность SFC, действие не постоянное состояние. Инструкции не повторяются, пока символ выделен.


Проверка FC

Кроме присоединенных ST, LD или IL программ, некоторые другие синтаксические правила применяются к потоковой диаграмме. Ниже дан список основных правил:

- Все точки "соединения" всех символов должны быть связаны. (связь с символом "Конец" может быть опущена)

- Все символы должны быть связаны (не должно быть изолированных частей)

- Все соединители должны иметь правильный пункт назначения

Могут возникать другие синтаксические ошибки:

- Пустые действия (нет программы) рассматриваются, как шаги во время работы

- Пустые тесты (нет программы) рассматриваются, как "всегда истинные"

- Empty tests (no programming) are considered as "always true"


 Стандартные операторы, функции и функциональные блоки

Стандартные операторы

Стандартные функциональные блоки

Стандартные функции

Алфавитный указатель


Стандартные операторы

Существуют следующие стандартные операторы IEC языков:

Работа с данными:

1 gain	Присвоение

Neg	 Аналоговое отрицание

Булевские операции:

& (AND)	Логическое И (AND)

>=1 (OR)	Логическое ИЛИ (OR)

=1 (XOR)	Логическое исключающее ИЛИ (OR)

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

 + 	Сложение

 - 	Вычитание

 * 	Умножение

 / 	Деление

Логические операции:

AND_MASK	Аналоговое побитовое И (AND)

OR_MASK	Аналоговое побитовое ИЛИ (OR)

XOR_MASK	Аналоговое побитовое исключающее ИЛИ (OR)

NOT_MASK	Аналоговое побитовое отрицание

Сравнения:

 < 	Меньше чем

 <= 	Меньше или равно

 > 	Больше чем

 >= 	Больше или равно

 = 	Равно

 <> 	Неравно

Превращение данных:

BOO	Превратить в

ANA	Превратить в

REAL	Превратить в

TMR	Превратить в

MSG	Превратить в Message

Другие:

CAT	Соединение строк

SYSTEM	Доступ к системе

OPERATE	Работа с каналами В/В


1 gain

q

Аргументы:

IN	любой тип

Q	любой тип

Описание:

Приписывает значение одной переменной другой переменной.

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

(*FBD пример блоков присвоения*)

(* ST эквивалент: *)

ao23 := ai10;

bo100 := NOT (bi1 AND bi2);

(* IL эквивалент: *)

LD	ai10

ST 	ao23

LD	bi1

AND	bi2

STN	bo100


NEG

Аргументы:

IN	INT-REAL вход и выход должны иметь один и тот же формат

Q	INT-REAL

Описание:

Приписывает отрицание переменной.

(*FBD пример блоков отрицания*)

(* ST эквивалент: *)

ao23 := - (ai10);

ro100 := - (ri1 + ri2);

(* IL эквивалент: *)

LD	ai10

MUL	-1

ST 	ao23

LD	ri1

ADD	ri2

MUL	-1.0

ST	ro100


& AND

Замечание: Для этого оператора количество входов может быть больше чем два.

Аргументы:

(inputs)	BOOLEAN

output	BOOLEAN	логическое И двух или более входов

Описание:

Логическое И двух или больше значений.

(*FBD пример блоков AND*)

(* ST эквивалент: *)

bo10 := bi101 AND NOT (bi102);

bo5 := (bi51 AND bi52) AND bi53;

(* IL эквивалент *)

LD	bi101	(* текущий результат := bi101 *)

ANDN	bi102	(*текущий результат:= bi101 AND not(bi102) *)

ST	bo10	(* bo10 := текущий результат *)

LD	bi51	(*текущий результат:= bi51;

&	bi52	(*текущий результат:= bi51 AND bi52 *)

&	bi53	(* тек. результат := (bi51 AND bi52) AND bi53 *)

ST	bo5	(* bo5 := текущий результат *)


>=1 OR

Замечание: Для этого оператора количество входов может быть больше чем два.

Аргументы:

(inputs)	BOOLEAN

output	BOOLEAN	логическое ИЛИ двух или более входов

Описание:

Логическое ИЛИ двух или больше значений.

(*FBD пример блоков OR*)

(* ST эквивалент: *)

bo10 := bi101 OR NOT (bi102);

bo5 := (bi51 OR bi52) OR bi53;

(* IL эквивалент: *)

LD	bi101

ORN	bi102

ST	bo10

LD	bi51

OR	bi52

OR	bi53

ST	bo5


=1 XOR

Аргументы:

IN1	BOOLEAN

IN2	BOOLEAN

Q	BOOLEAN	логическое ИЛИ двух или более входов

Описание:

Логическое ИЛИ двух или больше значений.

(*FBD пример блоков XOR*)

(* ST эквивалент: *)

bo10 := bi101 XOR NOT (bi102);

bo5 := (bi51 XOR bi52) XOR bi53;

(* IL эквивалент: *)

LD	bi101

XORN	bi102

ST	bo10

LD	bi51

XOR	bi52

XOR	bi53

ST	bo5


+

Замечание: Для этого оператора количество входов может быть больше чем два.

Аргументы:

(inputs)	INT-REAL 	могут быть целыми или действительными

(все входы должны быть одного формата)

output	INT-REAL	знаковое сложение входов

Описание:

Складывает две или несколько переменных.

(*FBD пример блоков Сложения*)

(* STэквивалент: *)

ao10 := ai101 + ai102;

ao5 := (ai51 + ai52) + ai53;

(* IL эквивалент: *)

LD	ai101

ADD	ai102

ST	ao10

LD	ai51

ADD	ai52

ADD	ai53

ST	ao5


-

Аргументы:

IN1	INT-REAL 	могут быть целыми или действительными

IN2	INT-REAL	(IV1 и IN2 должны быть одного формата)

Q	INT-REAL	вычитание (первый - второй)

Описание:

Вычитает две переменные (первый - второй).

(*FBD пример блоков Вычитание*)

 (* ST эквивалент: *)

ao10 := ai101 - ai102;

ao5 := (ai51 - 1) - ai53;

(* IL эквивалент: *)

LD	ai101

SUB	ai102

ST	ao10

LD	ai51

SUB	1

SUB	ai53

ST	ao5


*

Замечание: Для этого оператора количество входов может быть больше чем два.

Аргументы:

(inputs)	INT-REAL 	могут быть целыми или действительными

(все входы должны быть одного формата)

output	INT-REAL	знаковое сложение входов

Описание:

Умножает две или несколько переменных.

(*FBD пример блоков Умножение*)

(* ST эквивалент *)

ao10 := ai101 * ai102;

ao5 := (ai51 * ai52) * ai53;

(* IL эквивалент: *)

LD	ai101

MUL	ai102

ST	ao10

LD	ai51

MUL	ai52

MUL	ai53

ST	ao5


/

Аргументы:

IN1	INT-REAL 	могут быть целыми или действительными

IN2	INT-REAL	ненулевое аналоговое значение

(IV1 и IN2 должны быть одного формата)

Q	INT-REAL	знаковое целое или действительное деление IN1 на IN2

Описание:

Делит две переменные (первый / второй).

(*FBD пример блоков Деление*)

(* ST эквивалент: *)

ao10 := ai101 / ai102;

ao5 := (ai5 / 2) / ai53;

(* IL эквивалент: *)

LD	ai101

DIV	ai102

ST	ao10

LD	ai51

DIV	2

DIV	ai53

ST	ao5


AND_MASK

Аргументы:

IN	INT	целый формат

MSK	INT	целый формат

Q	INT	побитовый логический AND между IN и MSK

Описание:

Целый аналоговый побитовый И.

(*FBD пример блоков AND_MASK*)

(* ST эквивалент: *)

parity := AND_MASK (xvalue, 1); (* 1 if xvalue is odd *)

result := AND_MASK (16#abc, 16#f0f); (* equals 16#a0c *)

(* IL эквивалент: *)

LD	xvalue

AND_MASK	1

ST	parity

LD	16#abc

AND_MASK	16#f0f

ST	result


OR_MASK

Аргументы:

IN	INT	целый формат

MSK	INT	целый формат

Q	INT	побитовый логический OR между IN и MSK

Описание:

Целый аналоговый побитовый ИЛИ.

(*FBD пример блоков OR_MASK*)

(* ST эквивалент: *)

is_odd := OR_MASK (xvalue, 1); (* делает значение всегда нечетным *)

result := OR_MASK (16#abc, 16#f0f); (* равно 16#fbf *)

(* IL эквивалент: *)

LD	xvalue

OR_MASK	1

ST	is_odd

LD	16#abc

OR_MASK	16#f0f

ST	result


XOR_MASK

Аргументы:

IN	INT	целый формат

MSK	INT	целый формат

Q	INT	побитовый логический исключающий OR между IN и MSK

Описание:

Целый аналоговый побитовый исключающий ИЛИ.

(*FBD пример блоков XOR_MASK*)

(* ST эквивалент: *)

crc32 := XOR_MASK (prevcrc, nextc);

result := XOR_MASK (16#012, 16#011); (* equals 16#003 *)

(* IL эквивалент: *)

LD	prevcrc

XOR_MASK	nextc

ST	crc32

LD	16#012

XOR_MASK	16#011

ST	result


NOT_MASK

Аргументы:

IN	INT	целый формат

Q	INT	побитовое логическое отрицание 32 разрядного IN

Описание:

Целое аналоговое побитовое логическое отрицание.

(*FBD пример блоков NOT_MASK*)

(*ST эквивалент: *)

result := NOT_MASK (16#1234);

(* result is 16#FFFF_EDCB *)

(* IL эквивалент: *)

LD	16#1234

NOT_MASK

ST	result


<

Аргументы:

IN1	INT-REAL-TMR-MSG

IN2	INT-REAL-TMR-MSG    вход и выход должны иметь один и тот же  тип

Q	BOOLEAN	TRUE if IN1 < IN2

Описание:

Проверить, что одна величина меньше другой.

(*FBD пример блоков Меньше чем*)

(* STЭквивалент: *)

aresult := (10 < 25); (* aresult is TRUE *)

mresult := ('z' < 'B'); (* mresult is FALSE *)

(* IL эквивалент: *)

LD	10

LT	25

ST	aresult

LD	'z'

LT	'B'

ST	mresult


<=

Аргументы:

IN1	INT-REAL-MSG

IN2	INT-REAL-MSG	вход и выход должны иметь один и тот же тип

Q	BOOLEAN	TRUE if IN1 <= IN2

Описание:

Проверить, что одна величина меньше или равна другой.

(*FBD пример блоков Меньше или равно*)

(* ST эквивалент: *)

aresult := (10 <= 25); (* aresult is TRUE *)

mresult := ('ab' <= 'ab'); (* mresult is TRUE *)

(* IL эквивалент: *)

LD	10

LE	25

ST	aresult

LD	'ab'

LE	'ab'

ST	mresult


>

Аргументы:

IN1	INT-REAL-TMR-MSG

IN2	INT-REAL-TMR-MSG    вход и выход должны иметь один и тот же тип

Q	BOOLEAN	TRUE if IN1 > IN2

Описание:

Проверить, что одна величина больше другой.

(*FBD пример блоков Больше*)

(* ST эквивалент: *)

aresult := (10 > 25); (* aresult is FALSE *)

mresult := ('ab' > 'a'); (* mresult is TRUE *)

(* IL эквивалент: *)

LD	10

GT	25

ST	aresult

LD	'ab'

GT	'a'

ST	mresult


>=

Аргументы:

IN1	INT-REAL-MSG

IN2	INT-REAL-MSG	вход и выход должны иметь один и тот же тип

Q	BOOLEAN	TRUE if IN1 >= IN2

Описание:

Проверить, что одна величина больше или равна другой.

(*FBD пример блоков Больше или равно*)

(* ST эквивалент: *)

aresult := (10 >= 25); (* aresult is FALSE *)

mresult := ('ab' >= 'ab'); (* mresult is TRUE *)

(* IL эквивалент: *)

LD	10

GE	25

ST	aresult

LD	'ab'

GE	'ab'

ST	mresult


=

Аргументы:

IN1	INT-REAL-MSG

IN2	INT-REAL-MSG	вход и выход должны иметь один и тот же тип

Q	BOOLEAN	TRUE if IN1 = IN2

Описание:

Проверить, что одна величина равна другой.

(*FBD пример блоков Равно*)

(* ST эквивалент: *)

aresult := (10 = 25); (* aresult is FALSE *)

mresult := ('ab' = 'ab'); (* mresult is TRUE *)

(* IL эквивалент: *)

LD	10

EQ	25

ST	aresult

LD	'ab'

EQ	'ab'

ST	mresult


<>

Аргументы:

IN1	INT-REAL-MSG

IN2	INT-REAL-MSG	вход и выход должны иметь один и тот же тип

Q	BOOLEAN	TRUE if IN1 <> IN2

Описание:

Проверить, что одна величина не равна другой.

(*FBD пример блоков Не равно*)

(* ST эквивалент: *)

aresult := (10 <> 25); (* aresult is TRUE *)

mresult := ('ab' <> 'ab'); (* mresult is FALSE *)

(* IL эквивалент: *)

LD	10

NE	25

ST	aresult

LD	'ab'

NE	'ab'

ST	mresult


BOO

Аргументы:

IN	ANY	любое не булевское значение

Q	BOO	TRUE для ненулевого значения

FALSE для нулевого значения

TRUE для сообщения 'TRUE'

FALSE для сообщения 'FALSE'

Описание:

Превращает переменную в булевскую.

(*FBD пример блоков BOO*)

(* ST эквивалент: *)

ares := BOO (10);	(* ares is TRUE *)

tres := BOO (t#0s);	(* tres is FALSE *)

mres := BOO ('false');	(* mres is FALSE *)

(* IL эквивалент: *)

LD	10

BOO

ST	ares

LD	t#0s

BOO

ST	tres

LD	'false'

BOO

ST	mres


ANA

Аргументы:

IN	ANY	любая нецелая аналоговая величина

Q	INT	0 if IN = FALSE / 1 if IN = TRUE

число миллисекунд для таймера

целая часть действительного аналогового

десятичное число представленное строкой

Описание:

Превращает переменную в целую.

(*FBD пример блоков ANALOG*)

(* ST эквивалент: *)

bres := ANA (true);	(* bres is 1 *)

tres := ANA (t#1s46ms);	(* tres is 1046 *)

mres := ANA ('0198');	(* mres is 198 *)

(* IL эквивалент: *)

LD	true

ANA

ST	bres

LD	t#1s46ms

ANA

ST	tres

LD	'0198'

ANA

ST	mres


REAL

Аргументы:

IN	BOO-INT-TMR	любая недействительная аналоговая величина

Q	INT	0.0 if IN = FALSE / 1 if IN = TRUE

число миллисекунд для таймера

число эквивалентное целому аналоговому

Описание:

Превращает переменную в действительную.

(*FBD пример блоков REAL*)

(* ST эквивалент: *)

bres := REAL (true);	(* bres is 1.0 *)

tres := REAL (t#1s46ms);	(* tres is 1046.0 *)

ares := REAL (198);	(* ares is 198.0 *)

(* IL эквивалент: *)

LD	true

REAL

ST	bres

LD	t#1s46ms

REAL

ST	tres

LD	198

REAL

ST	ares


TMR

Аргументы:

IN	INT-REAL	любая не временная величина

IN (или целая часть от IN, если он действительный) -

число миллисекунд

Q	TIMER	временная величина, представленная IN

Описание:

Превращает аналоговую переменную в таймер.

(*FBD пример блоков TMR*)

 (* STэквивалент: *)

ares := TMR (1256);	(* ares := t#1s256ms *)

rres := TMR (1256.3);	(*rres := t#1s256ms *)

(* IL эквивалент: *)

LD	1256

TMR

ST	ares

LD	1256.3

TMR

ST	rres


MSG

Аргументы:

IN	BOO-INT-REAL	любая не строковая величина

Q	MSG	false или true если IN - булевская

десятичное представление, если IN - аналоговая

Описание:

Превращает любую переменную в строку.

(*FBD пример блоков MSG*)

(* ST Эквивалент: *)

bres := MSG (true); (* bres is 'TRUE' *)

ares := MSG (125); (* ares is '125' *)

(* IL эквивалент: *)

LD	true

MSG

ST	bres

LD	125

MSG

ST	ares


CAT

Замечание: Для этого оператора количество входов может быть больше чем два.

Аргументы:

(inputs)	MSG  (сумма длин всех сообщений не должна превышать емкости выхода)

output	MSG        соединение всех входных сообщений

Описание:

Соединяет несколько сообщений в одно.

(*FBD пример блоков CAT*)

(* ST эквивалент: use the + operator *)

myname := ('Mr' + ' ') + 'Jones';

(* means: myname := 'Mr Jones' *)

(* IL эквивалент: *)

LD	'Mr'

ADD	' '

ADD	'Jones'

ST	myname


SYSTEM

Аргументы:

Mode	INT	задает системный параметр и режим доступа

Arg	INT-TMR	новое значение для режима запись

Param	INT	значение запрашиваемого параметра

Описание:

Доступ к системным параметрам.

Далее следует список возможных команд для функции SYSTEM:

Команда	Значение

SYS_TALLOWED	читать допустимое время цикла

SYS_TCURRENT	читать текущее время цикла

SYS_TMAXIMUM	читать максимальное время цикла

SYS_TOVERFLOW	читать переполнения времени цикла

SYS_TRESET	сбросить счетчик времени цикла

SYS_TWRITE	изменить время цикла

SYS_ERR_TEST	проверка ошибок выполнения

SYS_ERR_READ	читать старейшую ошибку выполнения

Возможные аргументы предопределенных функций функции SYSTEM:

Команда	Аргумент	Возвращаемая величина

SYS_TALLOWED	0	допустимое время цикла

SYS_TCURRENT	0	текущее время цикла

SYS_TMAXIMUM	0	максимальное время цикла

SYS_TOVERFLOW	0	количество переполнений времени цикла

SYS_TRESET	0	0

SYS_TWRITE	новое время цикла	записанное время цикла

SYS_ERR_TEST	0	0 если ошибок нет

SYS_ERR_READ	0	код старейшей ошибки выполнения

(*FBD пример блоков SYSTEM*)

(* STэквивалент: *)

alarm := (SYSTEM (SYS_TOVERFLOW, 0) <> 0);

If (alarm) Then

nb_err := nb_err + 1;

rc := SYSTEM (SYS_TRESET, 0);

End_If;


OPERATE

Аргументы:

IO	ANY	вход или выход

Funct	INT	управляемое действие

Arg	INT	аргумент действия В/В

Q	INT	возврат проверки

Описание:

Доступ к каналам В/В.

Значение аргументов блока OPERATE зависит от реализации интерфейса В/В. См. Описание соответствующих плат В/В.


Стандартные функциональные блоки

Существуют следующие стандартные функциональные блоки, поддерживаемые системой ISaGRAF. Эти функциональные блоки предопределены и их не нужно заявлять в библиотеке.

Булевские:

SR	установить доминанту

RS	сбросить доминанту

R_TRIG	определение переднего фронта

F_TRIG	определение заднего фронта

SEMA	семафор

Счетчики:

CTU	счетчик вверх

CTD	счетчик вниз

CTUD	счетчик вверх-вниз

Таймеры:

TON	время включения

TOF	время выключения

TP	время пульсирования

Целые аналоги:

CMP	сравнение

STACKINT	Стек целых аналоговых

Действительные аналоги:

AVERAGE	Среднее из N образцов

HYSTER	Булевский гистерезис на разнице действительных

LIM_ALRM	Тревога верхнего/нижнего предела с гистерезисом

INTEGRAL	Интегрирование по времени

DERIVATE	Дифференцирование по времени

Генерация сигналов:

BLINK	Мерцающий булевский сигнал

SIG_GEN	Генератор сигнала

Замечание: Если созданы новые функциональные блоки на C , они могут быть вызваны из языка FBD.


SR

Аргументы:

SET1	BOO	если TRUE, установить Q1 в TRUE (доминанта)

RESET	BOO	если TRUE, сбросить Q1 в FALSE

Q1	BOO	булевское состояние в памяти

Описание:

Устанавливает доминанту. См. Таблицу:

Set1 	Reset	Q1	result Q1

0 	0	0	0

0	0	1	1

0	1	0	0

0	1	1	0

1	0	0	1

1	0	1	1

1	1	0	1

1	1	1	1

(*FBD пример блоков SR*)

(* ST эквивалент: Мы предполагаем, что SR1 - это экземпляр блока SR *)

SR1((auto_mode & start_cmd), stop_cmd);

command := SR1.Q1;

(* IL Эквивалент: *)

LD	auto_mode

AND	start_cmd

ST	SR1.set1

LD	stop_cmd

ST	SR1.reset

CAL	SR1

LD	SR1.Q1

ST	command


RS

Аргументы:

SET	BOO	если TRUE, установить Q1 в TRUE

RESET1	BOO	если TRUE, сбросить Q1 в FALSE (доминанта)

Q1	BOO	булевское состояние в памяти

Описание:

Сбрасывает доминанту. См. Таблицу:

Set 	Reset1	Q1	result Q1

0 	0	0	0

0	0	1	1

0	1	0	0

0	1	1	0

1	0	0	1

1	0	1	1

1	1	0	0

1	1	1	0

(*FBD пример блоков RS*)

(* ST Эквивалент: Мы предполагаем, что RS1 - это экземпляр блока RS *)

RS1(start_cmd, (stop_cmd OR alarm));

command := RS1.Q1;

(* IL Эквивалент: *)

LD	start_cmd

ST	RS1.set

LD	stop_cmd

OR	alarm

ST	RS1.reset1

CAL	RS1

LD	RS1.Q1

ST	command


R_TRIG

Аргументы:

CLK	BOO	любая булевская переменная

Q	BOO	TRUE, когда CLK поднимается с FALSE на TRUE

FALSE во всех остальных случаях

Описание:

Определяет передний фронт булевской переменной.

(*FBD пример блоков R_TRIG*)

(* ST Эквивалент: Мы предполагаем, что R_TRIG1 - это экземпляр блока R_TRIG *)

R_TRIG1(cmd);

nb_edge := ANA(R_TRIG1.Q) + nb_edge;

(* ILЭквивалент: *)

LD	cmd

ST	R_TRIG1.clk

CAL	R_TRIG1

LD	R_TRIG1.Q

ANA

ADD	nb_edge

ST	nb_edge


F_TRIG

Аргументы:

CLK	BOO	любая булевская переменная

Q	BOO	TRUE, когда CLK меняется с TRUE на FALSE

FALSE во всех остальных случаях

Описание:

Определяет задний фронт булевской переменной.

(*FBD пример блоков F_TRIG*)

(* ST эквивалент: Мы предполагаем, что F_TRIG1  экземпляр блока F_TRIG *)

F_TRIG1(cmd);

nb_edge := ANA(F_TRIG1.Q) + nb_edge;

(* IL Эквивалент: *)

LD	cmd

ST	F_TRIG1.clk

CAL	F_TRIG1

LD	F_TRIG1.Q

ANA

ADD	nb_edge

ST	nb_edge


SEMA

Аргументы:

CLAIM	BOOLEAN	команда проверить и установить

RELEASE	BOOLEAN	освободить семафор

BUSY	BOOLEAN	состояние семафора

Описание:

(* "x" - это булевская переменная проинициализированная значением FALSE *)

busy := x;

If claim Then

x := True;

Else

If release Then

busy := False;

x := False;

End_if;

End_if;


CTU

Аргументы:

CU	BOO   	вход для счета (считать когда CU равно TRUE)

RESET	BOO	команда сброса (доминанта)

PV	INT	планируемое максимальное значение

Q	BOO	переполнение: TRUE если CV = PV

CV	INT	результат счета

Предупреждение: Блок CTU не определяет передний и задний фронты входа (CU). Для того чтобы создать импульсный счетчик, его нужно связать с блоками R_TRIG или F_TRIG.

Описание:

Считает от 0 до заданного значения по 1.

(*FBD пример блоков CTU*)

(* ST Эквивалент: Мы предполагаем, что R_TRIG1 - это экземпляр блока R_TRIG и CTU1 - это экземпляр блока CTU *)

CTU1(R_TRIG1(command),NOT(auto_mode),100);

overflow := CTU1.Q;

result := CTU1.CV;

(* IL Эквивалент: *)

LD	command

ST	R_TRIG1.clk

CAL	R_TRIG1

LD	R_TRIG1.Q

ST	CTU1.cu

LDN	auto_mode

ST	CTU1.reset

LD	100

ST	CTU1.pv

CAL	CTU1

LD	CTU1.Q

ST	overflow

LD	CTU1.cv

ST	result


CTD

Аргументы:

CD	BOO вход для счета (считать вниз когда CD равно TRUE)

(счет вниз если CD равно TRUE)

LOAD	BOO  команда загрузить (доминанта)

(CV = PV если LOAD равно TRUE)

PV	INT	планируемое максимальное значение

Q	BOO  переполнение: TRUE если CV = 0

CV	INT	 результат счета

Предупреждение: Блок CTD не определяет передний и задний фронты входа (CD). Для того чтобы создать импульсный счетчик, его нужно связать с блоками R_TRIG или F_TRIG.

Описание:

Считает от заданного значения вниз до 0 по 1.

(*FBD пример блоков CTD*)

(* ST Эквивалент: Мы предполагаем, что R_TRIG1 - это экземпляр блока R_TRIG и CTD1 - это экземпляр блока CTD *)

CTD1(F_TRIG1(command),load_cmd,100);

underflow := CTD1.Q;

result := CTD1.CV;

(* IL Эквивалент: *)

LD	command

ST	F_TRIG1.clk

CAL	F_TRIG1

LD	F_TRIG1.Q

ST	CTD1.cd

LD	load_cmd

ST	CTD1.load

LD	100

ST	CTD1.pv

CAL	CTD1

LD	CTD1.Q

ST	underflow

LD	CTD1.cv

ST	result


CTUD

Аргументы:

CU	BOO	вход для счета вверх (считать когда CU равно TRUE)

CD	BOO	вход для счета вниз (считать когда CD равно TRUE)

RESET	BOO	команда сброса (доминанта)

(CV=0 когда RESET = TRUE)

LOAD	BOO	команда загрузить (CV=PV когда LOAD = TRUE)

PV	INT	планируемое максимальное значение

QU	BOO	переполнение: TRUE если CV = PV

QD	BOO	переполнение: TRUE если CV = 0

CV	INT	результат счета

Предупреждение: Блок CTUD не определяет передний и задний фронты входа (CU и CD). Для того чтобы создать импульсный счетчик, его нужно связать с блоками R_TRIG или F_TRIG.

Описание:

Считает от 0 до заданного значения по 1 или от заданного значения вниз до 0 по 1.

(* FBD программа использующая блок "CTUD" *)

(* ST Эквивалент: Мы предполагаем, что R_TRIG1 и R_TRIG2 - это экземпляры блока R_TRIG и CTD1 - это экземпляр блока CTUD *)

CTUD1(R_TRIG1(add_elt), R_TRIG2(sub_elt), reset_cmd, load_cmd,100);

full := CTUD1.QU;

empty := CTUD1.QD;

nb_elt := CTUD1.CV;

(* IL Эквивалент: *)

LD	add_elt

ST	R_TRIG1.clk

CAL	R_TRIG1

LD	R_TRIG1.Q

ST	CTUD1.cu

LD	sub_elt

ST	R_TRIG2.clk

CAL	R_TRIG2

LD	R_TRIG2.Q

ST	CTUD1.cd

LD	reset_cmd

ST	CTUD1.reset

LD	load_cmd

ST	CTUD1.load

LD	100

ST	CTUD1.pv

CAL	CTUD1

LD	CTUD1.QU

ST	full

LD	CTUD1.QD

ST	empty

LD	CTUD1.CV

ST	nb_elt


TON

Аргументы:

IN	BOO	если передний фронт, то начинает увеличивать

внутренний таймер, если задний фронт, то останавливается и сбрасывает внутренний таймер

PT	TMR	максимальное планируемое время

Q	BOO	если TRUE, то планируемое время истекло

ET	TMR	текущее прошедшее время

Описание:

Увеличивать внутренний таймер до заданной величины.

Временная диаграмма:


TOF

Аргументы:

      IN	                   BOO	          если задний фронт, то начинает увеличивать

внутренний таймер если передний фронт, то                         останавливается и сбрасывает внутренний таймер

PT	TMR	максимальное планируемое время

Q	BOO	если TRUE, то планируемое время истекло

ET	TMR	текущее прошедшее время

Описание:

Увеличивать внутренний таймер до заданной величины.

Временная диаграмма:


TP

Arguments:

IN	BOO	если передний фронт, то начинает увеличивать

внутренний таймер (если уже не увеличивается) если задний фронт и время истекло, то сбрасывает внутренний таймер

любое изменение IN во время счета не имеет эффекта.

PT	TMR	максимальное планируемое время

Q	BOO	если TRUE, то таймер считает

ET	TMR	текущее прошедшее время

Описание:

Увеличивать внутренний таймер до заданной величины.

Временная диаграмма:


CMP

Аргументы:

VAL1	INT	    любое знаковое целое аналоговое значение

VAL2	INT	    любое знаковое целое аналоговое значение

LT	BOO   TRUE если val1 меньше чем val2

EQ	BOO   TRUE если val1 равно val2

GT	BOO   TRUE если val1 больше чем val2

Описание:

Сравнивает две величины: сообщает они равны или первая больше или меньше второй.

(*FBD пример блоков CMP*)

(* ST Эквивалент: Мы предполагаем, что CMP1 - это экземпляр блока CMP *)

CMP1(level, max_level);

pump_cmd := CMP1.LT OR CMP1.EQ;

alarm := CMP1.GT AND NOT(manual_mode);

(* IL Эквивалент: *)

LD	level

ST	CMP1.val1

LD	max_level

ST	CMP1.val2

CAL	CMP1

LD	CMP1.LT

OR	CMP1.EQ

ST	pump_cmd

LD	CMP1.GT

ANDN	manual_mode

ST	alarm


STACKINT

Аргументы:

PUSH	BOO	команда PUSH (на переднем фронте)

добавить значение IN в верхушку стека

POP	BOO	команда POP (на переднем фронте)

удалить из верхушки стека последнее сохраненное значение

R1	BOO	сбросить стек в пустое состояние

IN	INT	сохраняемое значение

N	INT	размер стека определенный приложением

EMPTY	BOO	TRUE если стек пустой

OFLO	BOO	переполнение: TRUE если стек переполнен

OUT	INT	значение в верхушке стека

Описание:

Управляет стеком целых значений.

Функциональный блок STACKINT включает определение переднего фронта для команд PUSH и POP. Максимальный размер стека 128. Размер стека определенный приложением - N не может быть меньше 1 и больше 128.

Заметим, что значение OFLO действительно только после сброса (R1 было установлено в TRUE, по крайней мере, однажды и обратно в FALSE)

(*FBD пример блоков STACKINT : управление ошибками*)

(* ST Эквивалент: Мы предполагаем, что STACKINT1 - это экземпляр блока STACKINT *)

STACKINT1(err_detect, acknoledge, manual_mode, err_code, max_err);

appli_alarm := auto_mode AND NOT(STACKINT1.EMPTY);

err_alarm := STACKINT1.OFLO;

last_error := STACKINT1.OUT;

(* IL Эквивалент: *)

LD	err_detect

ST	STACKINT1.push

LD	acknoledge

ST	STACKINT1.pop

LD	manual_mode

ST	STACKINT1.r1

LD	err_code

ST	STACKINT1.IN

LD	max_err

ST	STACKINT1.N

CAL	STACKINT1

LD	auto_mode

ANDN	STACKINT1.empty

ST	appli_alarm

LD	STACKINT1.OFLO

ST	err_alarm

LD	STACKINT1.OUT

ST	last_error


AVERAGE

Аргументы:

RUN	BOO     TRUE=запустить/FALSE=сбросить

XIN	REAL    любая аналоговая переменная

N	INT	        количество образцов, заданное приложением

XOUT	REAL     среднее значение XIN

Описание:

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

Количество образцов не может превосходить 128.

Если команда RUN равна FALSE, то значение на выходе равно значению на входе.

Когда достигнуто максимальное значение N сохраненных величин, первое запомненное значение вытесняется последним.

(*FBD пример блоков AVERAGE *)

(* ST Эквивалент: Мы предполагаем, что AVERAGE1 - это экземпляр блока AVERAGE *)

AVERAGE1((auto_mode & store_cmd), sensor_value, 100);

ave_value := AVERAGE1.XOUT;

(* IL Эквивалент: *)

LD	auto_mode

AND	store_cmd

ST	AVERAGE1.run

LD	sensor_value

ST	AVERAGE1.xin

LD	100

ST	AVERAGE1.N

CAL	AVERAGE1

LD	AVERAGE1.XOUT

ST	ave_value


HYSTER

Аргументы:

XIN	REAL	любое аналоговое значение

XIN2	REAL	любое аналоговое значение

EPS	REAL	величина гистерезиса (должна быть больше нуля)

Q	BOO	TRUE если XIN1 перешел через XIN2 + EPS, но еще

не ниже XIN2 - EPS

Описание:

Гистерезис действительного значения по верхнему пределу.

Временная диаграмма:


LIM_ALRM

Аргументы:

H	REAL	значение верхнего предела

X	REAL	вход: любое аналоговое значение

L	REAL	значение нижнего предела

EPS	REAL	величина гистерезиса (должна быть больше нуля)

QH	BOO	верхняя тревога: TRUE если X выше верхнего

предела H

Q	BOO	тревога: TRUE если X вне пределов

QL	BOO	нижняя тревога: TRUE если X ниже нижнего

предела L

Описание:

Гистерезис действительного значения по верхнему  и нижнему пределам.

Гистерезис налагается на верхний и на нижний пределы. Дельта гистерезиса, использующаяся, как для нижнего предела так и для верхнего, равна половине параметра EPS.

Временная диаграмма:


INTEGRAL

Аргументы:

RUN	BOO	режим: TRUE=интегрировать/FALSE=держать

R1	BOO	сброс

XIN	REAL	вход: любая действительная аналоговая величина

X0	REAL	начальное значение

CYCLE	TMR	период интегрирования

Q	BOO	не R1

XOUT	REAL	интегрированный выход

Описание:

Интеграл действительной величины

Если величина параметра CYCLE меньше чем время цикла приложения ISaGRAF, то период интегрирования будет равен времени цикла приложения ISaGRAF.

(*FBD пример блока INTEGRAL *)

(* ST Эквивалент: Мы предполагаем, что INTEGRAL1 - это экземпляр блока INTEGRAL *)

INTEGRAL1(manual_mode, NOT(manual_mode), sensor_value, init_value, t#100ms);

controlled_value := INTEGRAL1.XOUT;

(* IL Эквивалент: *)

LD	manual_mode

ST	INTEGRAL1.run

STN	INTEGRAL1.R1

LD	sensor_value

ST	INTEGRAL1.XIN

LD	init_value

ST	INTEGRAL1.X0

LD	t#100ms

ST	INTEGRAL1.CYCLE

CAL	INTEGRAL1

LD	INTEGRAL1.XOUT

ST	controlled_value


DERIVATE

Аргументы:

RUN	BOO	режим: TRUE=нормальный/FALSE=сброс

XIN	REAL	вход: любая действительная аналоговая величина

CYCLE	TMR	период дифференцирования

XOUT	REAL	интегрированный выход

Описание:

Дифференцирование действительной величины

Если величина параметра CYCLE меньше чем время цикла приложения ISaGRAF, то период дифференцирования будет равен времени цикла приложения ISaGRAF.

(*FBD пример блока DERIVATE *)

(* ST Эквивалент: Мы предполагаем, что DERIVATE1 - это экземпляр блока DERIVATE *)

DERIVATE1(manual_mode, sensor_value, t#100ms);

derivated_value := DERIVATE1.XOUT;

(* IL Эквивалент: *)

LD	manual_mode

ST	DERIVATE1.run

LD	sensor_value

ST	DERIVATE1.XIN

LD	t#100ms

ST	DERIVATE1.CYCLE

CAL	DERIVATE1

LD	DERIVATE1.XOUT

ST	derivated_value


BLINK

Аргументы:

RUN	BOO	режим : TRUE=мигать/FALSE=сброс выхода в FALSE

CYCLE	TMR	период мигания

Q	BOO	выходной мигающий сигнал

Описание:

Генерирует мигающий сигнал.

Временная диаграмма:


SIG_GEN

Аргументы:

RUN	BOO	режим : TRUE=работать/FALSE=сброс выхода в  FALSE

PERIOD	TMR	период образца

MAXIMUM	INT	максимальное значение

PULSE	BOO	инвертируется после каждого образца

UP	INT	счетчик, увеличивающийся на каждом образце

END	BOO	TRUE, когда заканчивается счет вверх

SINE	REAL	синусоидальный сигнал (период = время счета)

Описание:

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

Когда счетчик достигает максимума, он перезапускается с нуля. Так что END удерживает TRUE в течении одного периода.

Временная диаграмма:


Стандартные функции

Существуют следующие стандартные функции, поддерживаемые системой ISaGRAF. Эти функции предопределены и их не нужно заявлять в библиотеке.

Математические:

ABS	модуль

EXPT	экспонента, степень

LOG	логарифм

POW	степень

SQRT	корень квадратный

TRUNC	отрезать действительную часть

Тригонометрические:

ACOS	арккосинус

ASIN	арксинус

ATAN	арктангенс

COS	косинус

SIN	синус

TAN	тангенс

Работа с регистрами:

ROL	вращать влево

ROR	вращать вправо

SHL	сдвиг влево

SHR	сдвиг вправо

Работа с данными:

MIN	Минимум

MAX	Максимум

LIMIT	Ограничение

MOD	Модуль

MUX4	Мультиплексор (4 входа)

MUX8	Мультиплексор (8 входа)

ODD	Четность

RAND	Случайная величина

SEL	Двоичный селектор

Превращение данных:

ASCII	Символ · ASCII код

CHAR	ASCII код · символ

Работа со строками

DELETE	Удалить подстроку

INSERT	Вставить строку

FIND	Найти подстроку

MLEN	Взять длину строки

LEFT	Извлечь левую часть

MID	Извлечь середину

REPLACE	Заменить подстроку

RIGHT	Извлечь правую часть

DAY_TIME	Время дня

Работа с массивами:

ARCREATE	Создать массив целых чисел

ARREAD	Читать

ARWRITE	Писать элемент массива

Работа с двоичным файлом:

F_ROPEN	Открыть двоичный файл в режиме чтения

F_WOPEN	Открыть двоичный файл в режиме записи

F_CLOSE	Закрыть двоичный файл

F_EOF	Проверить конец двоичного файла

FA_READ	Читать из двоичного файла

FA_WRITE	Записать в двоичный файл

FM_READ	Читать из двоичного файла строку

FM_WRITE	Записать в двоичный файл строку


ABS

Аргументы:

IN	REAL	любая знаковая аналоговая величина

Q	REAL	модуль аналоговой величины

Описание:

Дает абсолютное значение действительной величины.

(*FBD пример блока ABS*)

(* ST Эквивалент: *)

over := (ABS (delta) > range);

(* IL Эквивалент: *)

LD	delta

ABS

GT 	range

ST	over


EXPT

Аргументы:

IN	REAL	любая знаковая аналоговая величина

EXP	INT	целая аналоговая экспонента

Q	REAL	(INexp)

Описание:

Дает действительный результат операции: (база экспонента) база - первый аргумент, экспонента - второй.

(*FBD пример блока EXPT*)

(* ST Эквивалент: *)

tb_size := ANA (EXPT (2.0, range) );

(* IL Эквивалент: *)

LD	2.0

EXPT	range

ANA

ST	tb_size


LOG

Аргументы:

IN	REAL	аналоговая величина должна быть больше нуля

Q	REAL	логарифм (основание 10) входа

Описание:

Вычисляет логарифм (основание 10) действительной величины.

(*FBD пример блока LOG*)

(* ST Эквивалент: *)

xpos := ABS (xval);

xlog := LOG (xpos);

(* IL Эквивалент: *)

LD	xval

ABS

ST	xpos

LOG

ST	xlog


POW

Аргументы:

IN	REAL	любая знаковая аналоговая величина

EXP	REAL	степень

Q	REAL	(INexp)

1.0 если IN не 0.0 и EXP = 0.0

0.0 если IN = 0.0 и EXP отрицательно

0.0 если IN = 0ю0 и EXP = 0.0

0.0 если IN отрицательно и EXP не целое

Описание:

Дает действительный результат операции: (база экспонента) база - первый аргумент, экспонента - второй. Экспонента - действительное число.

(*FBD пример блока POW*)

(* ST Эквивалент: *)

result := POW (xval, power);

(* IL Эквивалент: *)

LD	xval

POW	power

ST	result


SQRT

Аргументы:

IN	REAL	аналоговая величина должна быть больше нуля

Q	REAL	квадратный корень входа

Описание:

Вычисляет квадратный корень действительной величины.

(*FBD пример блока SQRT*)

(* ST Эквивалент: *)

xpos := ABS (xval);

xroot := SQRT (xpos);

(* IL Эквивалент: *)

LD	xval

ABS

ST	xpos

SQRT

ST	xrout


TRUNC

Аргументы:

IN	REAL	любая действительная аналоговая величина

Q	REAL	если IN>0 наибольшее целое меньшее или равное

входа

если IN<0 наименьшее целое большее или равное

входа

Описание:

Отсекает дробную часть.

(*FBD пример блока TRUNC*)

(* ST Эквивалент: *)

result := TRUNC (+2.67) + TRUNC (-2.0891);

(* означает: result := 2.0 + (-2.0) := 0.0; *)

(* IL Эквивалент: *)

LD	2.67

TRUNC

ST	temporary	(* временный результат TRUNC *)

LD	-2.0891

TRUNC

ADD	temporary

ST	result


ACOS

Аргументы:

IN	REAL	должен быть в диапазоне [-1.0..+1.0]

Q	REAL	арккосинус входа в диапазоне [0.0..Pi]

0.0 для неверного входа

Описание:

Вычисляет арккосинус действительной величины.

(*FBD пример блока COS и ACOS*)

(* ST Эквивалент: *)

cosine := COS (angle);

result := ACOS (cosine); (*результат равен углу *)

(* IL Эквивалент: *)

LD	angle

COS

ST	cosine

ACOS

ST	result


ASIN

Аргументы:

IN	REAL	должен быть в диапазоне [-1.0..+1.0]

Q	REAL	арксинус входа в диапазоне [-PI/2..+Pi/2]

0.0 для неверного входа

Описание:

Вычисляет арксинус действительной величины.

(*FBD пример блоков SIN и ASIN*)

(* ST Эквивалент: *)

sine := SIN (angle);

result := ASIN (sine); (*результат равен углу *)

(* IL Эквивалент: *)

LD	angle

SIN

ST	sine

ASIN

ST	result


ATAN

Аргументы:

IN	REAL 	любая действительная аналоговая

Q	REAL	арктангенс входа в диапазоне [-PI/2..+PI/2]

0.0 для неверного входа

Описание:

Вычисляет арктангенс действительной величины.

(*FBD пример блока TAN  и ATAN*)

(* ST Эквивалент: *)

tangent := TAN (angle);

result := ATAN (tangent); (*результат равен углу *)

(* IL Эквивалент: *)

LD	angle

TAN

ST	tangent

ATAN

ST	result


COS

Аргументы:

IN	REAL	любая действительная аналоговая

Q	REAL	косинус входа в диапазоне [-1.0..+1.0]

Описание:

Вычисляет косинус действительной величины.

(*FBD пример блока COS и ACOS*)

(* ST Эквивалент: *)

cosine := COS (angle);

result := ACOS (cosine); (*результат равен углу *)

(* IL Эквивалент: *)

LD	angle

COS

ST	cosine

ACOS

ST	result


SIN

Аргументы:

IN	REAL	любая действительная аналоговая

Q	REAL	синус входа в диапазоне [-1.0..+1.0]

Описание:

Вычисляет синус действительной величины.

(*FBD пример блока SIN и ASIN*)

(* ST Эквивалент: *)

sine := SIN (angle);

result := ASIN (sine); (*результат равен углу *)

(* IL Эквивалент: *)

LD	angle

SIN

ST	sine

ASIN

ST	result


TAN

Аргументы:

IN	REAL 	не может равняться PI/2 по модулю PI

Q	REAL	тангенс входа

=1У+38 для неверного входа

Описание:

Вычисляет тангенс действительной величины.

(*FBD пример блока TAN  и ATAN*)

(* ST Эквивалент : *)

tangent := TAN (angle);

result := ATAN (tangent); (*результат равен углу *)

(* IL Эквивалент: *)

LD	angle

TAN

ST	tangent

ATAN

ST	result


ROL

Arguments:

IN	INT	any integer analog value

NbR	INT	number of 1 bit rotations (in set [1..31])

Q	INT	left rotated value

no effect if NbR <= 0

Description:

Make the bits of an integer rotate to the left. Rotation is made on 32 bits:

(* FBD program using "ROL" block *)

(* ST Equivalence: *)

result := ROL (register, 1);

(* register = 2#0100_1101_0011_0101*)

(* result    = 2#1001_1010_0110_1010*)

(* IL Equivalence: *)

LD	register

ROL	1

ST	result


ROR

Аргументы:

IN	INT	любая целая аналоговая величина

NbR	INT	количества вращаемых бит (в диапазоне [1..31])

Q	INT	провернутая вправо величина

если NbR <= 0, то нет никакого эффекта

Описание:

Вращает биты вправо. Вращаются 32 бита:

(*FBD пример блока ROR*)

(* ST Эквивалент: *)

result := ROR (register, 1);

(* register = 2#0100_1101_0011_0101 *)

(* result    = 2#1010_0110_1001_1010 *)

(* IL : *)

LD	register

ROR	1

ST	result


SHL

Аргументы:

IN	INT	любая целая аналоговая величина

NbR	INT	количества сдвигаемых бит (в диапазоне [1..31])

Q	INT	провернутая вправо величина

если NbR <= 0, то нет никакого эффекта

младший бит заменяет нулем

Описание:

Сдвигает биты влево. Сдвигаются 32 бита.

(*FBD пример блока SHL*)

(* ST Эквивалент: *)

result := SHL (register,1);

(* register = 2#0100_1101_0011_0101 *)

(* result    = 2#1001_1010_0110_1010 *)

(* IL Эквивалент: *)

LD	register

SHL	1

ST	result


SHR

Аргументы:

IN	INT	любая целая аналоговая величина

NbR	INT	количества сдвигаемых бит (в диапазоне [1..31])

Q	INT	провернутая вправо величина

если NbR <= 0, то нет никакого эффекта

младший бит заменяет нулем

Описание:

Сдвигает биты влево. Сдвигаются 32 бита.

(*FBD пример блока SHL*)

(* ST Эквивалент: *)

result := SHR (register,1);

(* register = 2#1100_1101_0011_0101 *)

(* result    = 2#1110_0110_1001_1010 *)

(* IL Эквивалент: *)

LD	register

SHR	1

ST	result


MIN

Аргументы:

IN	INT	любая знаковая целая величина

IN2	INT	(не может быть REAL)

Q	INT	минимум из двух входов

Описание:

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

(*FBD пример блоков MIN и MAX*)

(* ST Эквивалент: *)

new_value := MAX (MIN (max_value, value), min_value);

(*ограничивает значение в диапазоне [min_value..max_value] *)

(* IL Эквивалент: *)

LD	max_value

MIN	value

MAX	min_value

ST	new_value


MAX

Аргументы:

IN1	INT	любая знаковая целая величина

IN2	INT	(не может быть REAL)

Q	INT	максимум из двух входов

Описание:

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

(*FBD пример блоков MIN и MAX*)

(* ST Эквивалент: *)

new_value := MAX (MIN (max_value, value), min_value);

(*ограничивает значение в диапазоне [min_value..max_value] *)

(* IL Эквивалент: *)

LD	max_value

MIN	value

MAX	min_value

ST	new_value


LIMIT

Аргументы:

MIN	INT	минимальная допустимая величина

IN	INT	любая знаковая целая величина

MAX	INT	максимальная допустимая величина

Q	INT	выходная величина ограниченная заданным диапазоном

Описание:

Удерживает величину в заданным диапазоне. Величина сохраняется если она между максимумом и минимумом или становится равной максимуму если она больше максимума и становится равной минимуму если она меньше минимума.

(*FBD пример блока LIMIT*)

(* ST Эквивалент: *)

new_value := LIMIT (min_value, value, max_value);

(* ограничивает значение в диапазоне [min_value..max_value] *)

(* IL Эквивалент: *)

LD	min_value

LIMIT	value, max_value

ST	new_value


MOD

Аргументы:

IN	INT	любая знаковая целая величина

Base	INT	должна быть больше нуля

Q	INT	вычисление модуля (вход MOD база)

возвращает -1 если Base <= 0

Описание:

Вычисляет модуль целого значения.

(*FBD пример блока MOD*)

(* ST Эквивалент: *)

division_result := (value / divider); (* целое деление *)

rest_of_division := MOD (value, divider); (* остаток от деления *)

(* IL Эквивалент: *)

LD	value

DIV	divider

ST	division_result

LD	value

MOD	divider

ST	rest_of_division


MUX4

Аргументы:

SEL	INT	целый селектор (должен быть в диапазоне [0..3])

IN1..IN4	INT	целая аналоговая величина

Q	INT	= value1 if SEL = 0

= value2 if SEL = 1

= value3 if SEL = 2

= value4 if SEL = 3

= 0 для других значений селектора

Описание:

Мультиплексор 4 входов: выбирает одно из четырех целых чисел.

(*FBD пример блока MUX4*)

(* ST Эквивалент: *)

range := MUX4 (choice, 1, 10, 100, 1000);

(* выбор из 4 предопределенных значений, например, если выбор - 1, значение будет 10 *)

(* IL Эквивалент: *)

LD	choice

MUX4	1,10,100,1000

ST	range


MUX8

Аргументы:

SEL	INT	целый селектор (должен быть в диапазоне [0..7])

IN1..IN8	INT	целая аналоговая величина

Q	INT	= value1 if SEL = 0

= value2 if SEL = 1

...

= value8 if selector = 7

= 0 для всех других значений селектора

Описание:

Мультиплексор 8 входов: выбирает одно из восьми целых чисел.

(*FBD пример блока MUX8*)

(* ST Эквивалент: *)

range := MUX8 (choice, 1, 5, 10, 50, 100, 500, 1000, 5000);

(* выбирает из 8 предопределенных значений, например, если выбрана 3, значение будет 50 *)

(* IL Эквивалент: *)

LD	choice

MUX8	1,5,10,50,100,500,1000,5000

ST	range


ODD

Аргументы:

IN	INT	любая целая знаковая аналоговая величина

Q	BOO	TRUE если входная величина нечетная

FALSE если входная величина четная

Описание:

Проверяет целую величину на четность: результат - четный или нечетный.

(*FBD пример блока ODD*)

(* ST Эквивалент: *)

If Not (ODD (value)) Then Return; End_if;

value := value + 1;

(*делает значение четным*)

(* IL Эквивалент: *)

LD	value

ODD

RETNC

LD	value

ADD	1

ST	value


RAND

Аргументы:

base	INT	определяет допустимое множество чисел

Q	INT	случайная величина в диапазоне [0..base - 1]

Описание:

Дает случайную целую величину в заданном диапазоне.

(*FBD пример блока RAND*)

(* ST Эквивалент: *)

selected := MUX4 ( RAND (4), 1, 4, 8, 16 );

(*

случайный выбор одного из 4 предопределенных значений

RAND выдает значение в интервале [0..3],

так 'selected' выходящий из MUX4, получит случайное значение

1 если 0 выходит из RAND,

или 4 если 1 выходит из RAND,

или 8 если 2 выходит из RAND,

или 16 если 3 выходит из RAND,

*)

(* IL Эквивалент: *)

LD	4

RAND

MUX4	1,4,8,16

ST	selected


SEL

Аргументы

SEL	BOO	определяет выбранную величину

IN1, IN2	INT	любая целая аналоговая величина

Q	INT	= value1 если SEL = FALSE

= value2 если SEL = TRUE

Описание:

Двоичный селектор: выбирает значение из двух целых чисел.

(*FBD пример блока *)

(* ST Эквивалент: *)

ProCmd := SEL (AutoMode, ManuCmd, InpCmd);

(* выбор команды *)

IN	MSG	любая непустая строка

LD	AutoMode

SEL	ManuCmd,InpCmd

ST	ProCmd


ASCII

Аргументы:

IN	MSG	любая непустая строка

Pos	INT	позиция выбранного символа

в диапазоне [1..len] (len - длина сообщения IN)

Code	INT	код выбранного символа

(в диапазоне [0..255])

возвращает 0 если Pos вне строки

Описание:

Дает ASCII код символа в строке.

(*FBD пример блока ASCII*)

(* ST Эквивалент: *)

FirstChr := ASCII (message, 1);

(* FirstChr - это ASCII код первого символа строки *)

(* IL Эквивалент: *)

LD	message

ASCII	1

ST	FirstChr


CHAR

Аргументы:

Code	INT	код в диапазоне [0..255]

Q	MSG	строка из одного символа

символ имеет ASCII код заданный на входе

(используется ASCII код по модулю 256)

Описание:

Дает строку из одного символа с заданным ASCII кодом.

(*FBD пример блока CHAR*)

(* ST Эквивалент: *)

Display := CHAR ( value + 48 );

(* значение в диапазоне [0..9] *)

(* 48 - это ascii код '0' *)

(* result - строка из одного символа от '0' до '9' *)

(* IL Эквивалент: *)

LD	value

ADD	48

CHAR

ST	Display


DELETE

Аргументы:

IN	MSG	любая непустая строка

NbC	INT	количество символов, которые нужно удалить

Pos	INT	позиция первого символа для удаления

(позиция первого символа строки - 1)

Q	MSG	измененная строка

пустая строка если Pos < 1

первоначальная строка если Pos > длина IN

первоначальная строка если NbC <= 0

Описание:

Удаляет часть строки.

(*FBD пример блока DELETE*)

(* ST Эквивалент: *)

complete_string := 'ABCD' + 'EFGH'; (* полная строка - это 'ABCDEFGH' *)

sub_string := DELETE (complete_string, 4, 3); (* sub_string is 'ABGH' *)

(* IL Эквивалент: *)

LD	'ABCD'

ADD	'EFGH'

ST	complete_string

DELETE	4,3

ST 	sub_string


INSERT

Аргументы:

IN	MSG	начальная строка

Str	MSG	строка которую нужно вставить

Pos	INT	позиция вставки

вставка делается перед позицией

(первая позиция - 1)

Q	MSG	измененная строка

пустая строка если Pos < 0

соединение строк если Pos > длина IN

Описание:

Вставляет подстроку в строку начиная с данной позиции.

(*FBD пример блока INSERT*)

(* ST Эквивалент: *)

MyName := INSERT ('Mr JONES', 'Frank ', 4);

(* MyName - это 'Mr Frank JONES' *)

(* IL Эквивалент: *)

LD	'Mr JONES'

INSERT	'Frank ',4

ST 	MyName


FIND

Аргументы:

IN	MSG	любая строка

Pat	MSG	любая непустая строка

Pos	INT	=0 если подстрока Pos не найдена

=позиция первого символа первого вхождения подстроки Pat	(первая позиция - 1)	эта функция отличает заглавные буквы от прописных

Описание:

Находит подстроку в строке. Возвращает положение подстроки в строке.

(*FBD пример блока FIND*)

(* ST Эквивалент: *)

complete_string := 'ABCD' + 'EFGH'; (* полная строк - это 'ABCDEFGH' *)

found := FIND (complete_string, 'CDEF'); (* найдено 3 *)

(* IL Эквивалент: *)

LD	'ABCD'

ADD	'EFGH'

ST	complete_string

FIND	'CDEF'

ST 	found


MLEN

Аргументы:

IN	MSG	любая непустая строка

NbC	INT	Количество символов в строке IN

Описание:

Вычисляет длину строки.

(*FBD пример блока MLEN*)

(* ST Эквивалент: *)

nbchar := MLEN (complete_string);

If (nbchar < 3) Then Return; End_if;

prefix := LEFT (complete_string, 3);

(*эта программа извлекает 3 символа из левой части строки кладет результат в строковую переменную prefix никаких действий не выполняется если длина строки менее чем 3 символа*)

(* IL Эквивалент: *)

LD	complete_string

MLEN

ST	nbchar

LT	3

RETC

LD	complete_string

LEFT	3

ST	prefix


LEFT

Аргументы:

IN	MSG	любая непустая строка

NbC	INT	Количество символов, которые нужно изъять

не может быть больше строки IN

Q	MSG	левая часть строки IN (ее длина = NbC)

пустая строка если NbC < 0

вся строка IN если NbC >  длина IN

Описание:

Берет левую часть строки. Количество символов задано.

(*FBD пример блоков LEFT и RIGHT*)

(* ST Эквивалент: *)

complete_string := RIGHT ('12345678', 4) + LEFT ('12345678', 4);

(* полная строка - это '56781234'

значение выходящее из RIGHT - это '5678'

значение выходящее из LEFT  - это '1234'

*)

(* IL Эквивалент: Сначала вызывается LEFT *)

LD	'12345678'

LEFT	4

ST	sub_string 	(* промежуточный результат *)

LD	'12345678'

RIGHT	4

ADD	sub_string

ST 	complete_string


MID

Аргументы:

IN	MSG	любая непустая строка

NbC	INT	Количество символов, которые нужно изъять

не может быть больше длины строки IN

Pos	INT	позиция подстроки

Pos должен указывать на первый символ подстроки

(первая правильная позиция 1)

Q	MSG средняя часть строки IN (ее длина = NbC)

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

Описание:

Берет часть строки. Количество символов и позиция первого символа заданы.

(*FBD пример блока MID*)

(* ST Эквивалент: *)

sub_string := MID ('abcdefgh', 2, 4);

(* подстрока - 'de' *)

(* IL Эквивалент: *)

LD	'abcdefgh'

MID	2,4

ST	sub_string


REPLACE

Аргументы:

IN	MSG	любая строка

Str	MSG	строка, которую нужно вставить

NbC	INT	Количество символов, которые должны быть  удалены

Pos	INT	Позиция первого измененного символа

(первая правильная позиция 1)

Q	MSG	измененная строка:

-NbC символов удаляются начиная с позиции Pos

-затем строка Str вводится начиная с этой позиции

возвращает пустую строку если Pos <= 0

возвращает соединение строк (IN+Str) если Pos больше, чем длина строки IN

возвращает начальную строку IN если NbC <= 0

Описание:

Заменяет часть строки новым набором символов.

(*FBD пример блока REPLACE*)

(* ST Эквивалент: *)

MyName := REPLACE ('Mr X JONES, 'Frank', 1, 4);

(* MyName - это 'Mr Frank JONES' *)

(* IL Эквивалент: *)

LD	'Mr X JONES'

REPLACE	'Frank',1,4

ST	MyName


RIGHT

Аргументы:

IN	MSG	любая непустая строка

NbC	INT	не может быть больше, чем длина строки IN

Q	MSG	правая часть строки IN (ее длина = NbC)

пустая строка если NbC < 0

вся строка IN если NbC >  длина IN

Описание:

Берет правую часть строки. Количество символов задано.

(*FBD пример блоков LEFT и RIGHT*)

(* ST Эквивалент: *)

complete_string := RIGHT ('12345678', 4) + LEFT ('12345678', 4);

(* полная строка - это '56781234'

значение выходящее из RIGHT - это '5678'

значение выходящее из LEFT  - это '1234'

*)

(* IL Эквивалент: Сначала вызывается LEFT *)

LD	'12345678'

LEFT	4

ST	sub_string 	(* промежуточный результат *)

LD	'12345678'

RIGHT	4

ADD	sub_string

ST 	complete_string


DAY_TIME

Аргументы:

SEL	INT	выбор выхода

0=текущая дата

1=текущее время

2=день недели

Q	MSG	время/дата, выраженные символьной строкой

YYY/MMM/DDD если SEL = 0

HH:MM:SS если SEL = 1

имя дня если SEL = 2 (например: Monday)

Описание:

Возвращает дату или время дня, выраженные символьной строкой.

(*FBD пример блока DAY_TIME*)

(* ST Эквивалент: *)

Display := Day_Time (0) + ' ; ' + Day_Time (1);

(*Формат текста: 'YYYY/MM/DD ; HH:MM:SS' *)

(* IL Эквивалент: Сначала вызывается day_time(1) *)

LD	1

DAY_TIME

ST	hour_str 	(* промежуточный результат *)

LD	0

DAY_TIME

ADD	' ; '

ADD	hour_str

ST 	Display


ARCREATE

Аргументы

ID	INT	идентификатор массива (должен быть в пределах [0..15])

Size	INT	количество элементов в массиве

Q	INT	результат исполнения

1 = если массив был успешно создан

2 = неправильный идентификатор массива или массив уже создан

3 = неправильный размер

4 = не хватило памяти

Описание:

Создание массива целых.

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

(*FBD программа, создающая массив целых*)

(* ST Эквивалент: *)

array_error := (ARCREATE (ident, 16) <> 1));

(* IL Эквивалент: *)

LD	ident

ARCREATE	16

NE 	1

ST	array_error


ARREAD

Аргументы:

ID	INT	идентификатор массива (должен быть в пределах [0..15])

Pos	INT	позиция элемента в массиве

(должна быть в пределах [0..size-1])

value	INT	значение считанного элемента

0 = если аргумент неправильный

Описание:

Читает элемент массива целых.

(*FBD программа, использующая блок управления массивом*)

(* ST Эквивалент: *)

If (array_error) Then Return; End_if;

read_value := ARREAD (ident, index);

(* array_error приходит от ARCREATE call *)

(* IL Эквивалент: *)

LD	array_error

RETC

LD	ident

ARREAD	index

ST	read_value


ARWRITE

Аргументы:

ID	INT	идентификатор массива (должен быть в пределах [0..15])

Pos	INT	позиция элемента в массиве

(должна быть в пределах [0..size-1])

IN	INT	новое значение элемента

ok	INT	результат исполнения

1 = запись была успешно выполнена

2 = неправильный идентификатор массива

3 = неправильный индекс

Описание:

Запоминает (записывает) значение в массив целых.

(*FBD программа, использующая блок управления массивом*)

(* ST Эквивалент: *)

If (array_error) Then Return; End_if;

write_status := ARWRITE (Ident, Index, value);

(* array_error приходит от ARCREATE *)

(* IL Эквивалент: *)

LD	array_error

RETC

LD	ident

ARWRITE	index,value

ST	write_status


F_ROPEN

Аргументы:

Path	MSG	имя файла может определять путь доступа к файлу с использованием символов / или \ для определения директории. Для переносимости приложений / или \ эквивалентны

ID	INT	номер файла

0 если была ошибка: файл не существует

Описание:

Открывает двоичный файл для чтения. Должен использоваться с FX_READ и FX_CLOSE. Эта функция не включена в симулятор ISaGRAF.

(*FBD программа, использующая блок управления файлом*)

(* ST Эквивалент: *)

file_id := F_ROPEN('c:\data \data.bin');

error := (file_id=0);

(* IL Эквивалент: *)

LD	'c:\data\data.bin'

F_ROPEN

ST	file_id

EQ	0

ST	error


F_WOPEN

Аргументы:

Path	MSG	имя файла может определять путь доступа к файлу с использованием символов / или \ для определения директории. Для переносимости приложений / или \ эквивалентны.

ID	INT	номер файла

0 если была ошибка: файл не существует

Описание:

Открывает двоичный файл для чтения. Должен использоваться с FX_READ и FX_CLOSE. Эта функция не включена в симулятор ISaGRAF.

(*FBD программа, использующая блок управления файлом*)

(* ST Эквивалент: *)

file_id := F_WOPEN('c:\data \data.bin');

error := (file_id=0);

(* IL Эквивалент: *)

LD	'c:\data\data.bin'

F_WOPEN

ST	file_id

EQ	0

ST	error


F_CLOSE

Аргументы:

ID	INT	номер файла: возвращенный функциями F_ROPEN или F_WOPEN

ok	BOO	статус

TRUE если файл закрыт успешно

FALSE если была ошибка

Описание:

Закрывает двоичный файл, открытый функциями F_ROPEN или F_WOPEN.  Эта функция не включена в симулятор ISaGRAF.

(*FBD программа, использующая блоки управления файлом*)

(* ST Эквивалент: *)

file_id := F_ROPEN('data.bin');

ok := F_CLOSE(file_id);

(* IL Эквивалент: *)

LD	'data.bin'

F_ROPEN

ST	file_id

F_CLOSE	(* идентификатор файла уже в текущем результате *)

ST 	ok


F_EOF

Аргументы:

ID	INT	номер файла: возвращенный функциями F_ROPEN или F_WOPEN

ok	BOO	индикатор конца файла

TRUE если конец файл был достигнут при последнем чтении или записи

FM_READ последнее сообщение прочитанное из файла может быть неверным, если последний символ -

не символ окончания строки

Описание:

Проверяет достигнут ли конец файла.  Эта функция не включена в симулятор ISaGRAF.

(*FBD программа, использующая блоки управления файлом*)

(* ST Эквивалент: *)

file_id := F_ROPEN('data.bin');

WHILE not(F_EOF(file_id))

VAL := FA_READ(file_id);

END_WHILE;

MESSAGE := 'last val = ' + msg(VAL);

ok := F_CLOSE(file_id);

(* IL Эквивалент: *)

LD	'data.bin'

F_ROPEN

ST	file_id

LD 	file_id

F_EOF

JMPC	END_OF_FILE

NOT_EOF:	LD 	file_id

FA_READ

ST	VAL

LD 	file_id

F_EOF

JMPNC	NOT_EOF 	(* если не eof, то читать*)

END_OF_FILE:	LD	VAL

MSG

ST	val_msg	(* превращение VAL в строку *)

LD	'last val = '

ADD	val_msg

ST	MESSAGE

LD 	file_id

F_CLOSE

ST	ok


FA_READ

Аргументы:

ID	INT	номер файла: возвращенный функцией F_ROPEN

Q	INT	целая аналоговая величина считанная из файла

Описание:

Читает аналоговые переменные из двоичного файла. Должна использоваться с F_ROPEN и F_CLOSE. Эта функция осуществляет последовательный доступ к файлу, начиная с предыдущей позиции. Первый вызов после F_ROPEN читает первые 4 байта файла, каждый вызов сдвигает указатель чтения. Для проверки достигнут ли конец файла используйте F_EOF.  Эта функция не включена в симулятор ISaGRAF.

(*FBD программа, использующая блоки управления файлом*)

(* ST Эквивалент: *)

file_id := F_ROPEN('voltramp.bin');

vstart := FA_READ(file_id);

vend := FA_READ(file_id);

vinc := FA_READ(file_id);

delta_tim := tmr(FA_READ(file_id));

ok := F_CLOSE(file_id);

(* IL Эквивалент: *)

LD	'voltramp.bin'

F_ROPEN

ST	file_id

FA_READ	(* читать vstart *)

ST	vstart

LD 	file_id

FA_READ	(* читать vend *)

ST	vend

LD 	file_id

FA_READ	(* читать vinc *)

ST	vinc

LD 	file_id

FA_READ	(* читать delta_tim *)

TMR	(* превращение в timer *)

ST	delta_tim

LD 	file_id

F_CLOSE

ST	ok


FA_WRITE

Аргументы:

ID	INT	номер файла: возвращенный функцией F_WOPEN

IN	INT	целая аналоговая величина, которую нужно записать в файла.

Q	BOO	статус выполнения: TRUE если ok

Описание:

Записывает аналоговые переменные в двоичный файл. Эта функция осуществляет последовательный доступ к файлу, начиная с предыдущей позиции. Первый вызов после F_WOPEN записывает первые 4 байта файла, каждый вызов сдвигает указатель чтения. Для проверки достигнут ли конец файла используйте F_EOF.  Эта функция не включена в симулятор ISaGRAF.

(*FBD программа*)

(* ST Эквивалент: *)

file_id := F_WOPEN('voltramp.bin');

nb_written  := 0;

nb_written := nb_written + ana(FA_WRITE(file_id,vstart));

nb_written := nb_written + ana(FA_WRITE(file_id,vend));

nb_written := nb_written + ana(FA_WRITE(file_id,vinc));

nb_written := nb_written + ana(FA_WRITE(file_id,ana(delta_tim)));

ok := F_CLOSE(file_id);

IF ( nb_written <> 4) THEN

ERROR := ERR_FILE;

END_IF;

(* IL Эквивалент: *)

LD	'voltramp.bin'

F_ROPEN

ST	file_id

LD	0

ST	nb_written

LD 	file_id	(* писать vstart *)

FA_WRITE	vstart

ANA

ADD	nb_written

ST	nb_written

LD 	file_id	(* писать vend *)

FA_WRITE	vend

ANA

ADD	nb_written

ST	nb_written

LD 	file_id	(*писать vinc *)

FA_WRITE	vinc

ANA

ADD	nb_written

LD	(* писать delta_tim *)

ANA	(* превратить в integer *)

ST	ana_delta_tim

LD 	file_id

FA_WRITE	ana_delta_tim

ANA

ADD	nb_written

ST	nb_written

F_CLOSE

ST	ok

LD	nb_written

EQ	4

RETC	(* возврат если равно 4 *)

LD	ERR_FILE	(* иначе ошибка *)

ST	ERROR


FM_READ

Аргументы:

ID	INT	номер файла: возвращенный функцией F_ROPEN

Q	MSG	сообщение считанное из файла

Описание:

Читает строковые переменные из двоичного файла. Должна использоваться с F_ROPEN и F_CLOSE.  Эта функция осуществляет последовательный доступ к файлу, начиная с предыдущей позиции. Первый вызов после F_ROPEN читает первую строку файла, каждый вызов сдвигает указатель чтения. Строка заканчивается нулем (0), символом конца строки (\n) или возвратом (\r);

Для проверки достигнут ли конец файла используйте F_EOF.  Эта функция не включена в симулятор ISaGRAF.

(*FBD программа, использующая блоки управления файлом*)

(* ST Эквивалент: *)

file_id := F_ROPEN('voltramp.bin');

status1 := FM_READ(file_id);

status2 := FM_READ(file_id);

IF (F_EOF(file_id)) THEN

ERROR := ERR_FILE;

unused_eof_mes := FM_READ(file_id);

END_IF;

ok := F_CLOSE(file_id);

(* IL Эквивалент: *)

LD	'voltramp.bin'

F_ROPEN

ST	file_id

FM_READ	(* читать status1 *)

ST	status1

LD 	file_id

FM_READ	(* читать status2 *)

ST	status2

LD 	file_id

F_EOF

JMPNC	CLOSE_FILE 	(* если конец файла, то не делать прыжок *)

LD	ERR_FILE

ST	ERROR

LD 	file_id

FM_READ	(* читать unused_eof_mes *)

ST	unused_eof_mes

CLOSE_FILE	LD 	file_id

F_CLOSE

ST	ok


FM_WRITE

Аргументы:

ID	INT	номер файла: возвращенный функцией F_ROPEN

IN	MSG	сообщение, которое надо записать в файл

ok	BOO	статус выполнения

TRUE если успешно

Описание:

Записывает строковые переменные в двоичный файл. Должна использоваться с F_WOPEN и F_CLOSE.  Эта функция осуществляет последовательный доступ к файлу, начиная с предыдущей позиции. Первый вызов после F_WOPEN записывает первую строку файла, каждый вызов сдвигает указатель записи.  Эта функция не включена в симулятор ISaGRAF.

(*FBD программа, использующая блоки управления файлом*)

(* ST Эквивалент: *)

file_id := F_WOPEN('trace.txt');

ok := FM_WRITE(file_id,'First message');

ok := FM_WRITE(file_id,'Last message');

ok := F_CLOSE(file_id);

(* IL Эквивалент: *)

LD	'trace.txt'

F_WOPEN

ST	file_id

FM_WRITE	'First message'	(*писать первое сообщение *)

ST	ok

LD 	file_id

FM_WRITE	'Last message'	(* писать второе сообщение *)

ST	ok

LD 	file_id

F_CLOSE

ST	ok


Алфавитный указатель

-	ARWRITE	F_ROPEN	MSG	SHR
& (AND)	ASCII	F_TRIG	MUX4	SIG_GEN
*	ASIN	F_WOPEN	MUX8	SIN
/	ATAN	FA_READ	Neg	SQRT
+	AVERAGE	FA_WRITE	NOT_MASK	SR
<	BLINK	FIND	ODD	STACKINT
<=	BOO	FM_READ	OPERATE	SYSTEM
<>	CAT	FM_WRITE	OR_MASK	TAN
=	CHAR	HYSTER	POW	TMR
=1 (XOR)	CMP	INSERT	R_TRIG	TOF
>	COS	INTEGRAL	RAND	TON
>=	CTD	LEFT	REAL	TP
>=1 (OR)	CTU	LIM_ALRM	REPLACE	TRUNC
1 gain	CTUD	LIMIT	RIGHT	XOR_MASK
ABS	DAY_TIME	LOG	ROL
ACOS	DELETE	MAX	ROR
ANA	DERIVATE	MID	RS
AND_MASK	EXPT	MIN	SEL
ARCREATE	F_CLOSE	MLEN	SEMA
ARREAD	F_EOF	MOD	SHL