Описание работы с языками МЭК 61131-3 ===================================== МЭК 61131-3 – раздел международного стандарта МЭК 61131, описывающий языки программирования для программируемых логических контроллеров. Стандарт устанавливает пять языков программирования со следующими названиями: * Структурированный текст (ST – Structured Text); * Последовательные функциональные схемы (SFC – "Sequential Function Chart"); * Диаграммы функциональных блоков (FBD – Function Block Diagram); * Релейно-контактные схемы, или релейные диаграммы (LD – Ladder Diagram); * Список инструкций (IL – Instruction List). Графическими языками являются SFC, FBD, LD. Языки IL и ST являются текстовыми. Описание работы с текстовыми редакторами языков ST и IL ------------------------------------------------------- Текстовый редактор языков ST и IL позволяет создавать и редактировать алгоритмы и логику выполнения программных модулей на языках ST и IL. .. figure:: images/beremiz/27.png :align: center Редактор языков ST и IL Он обеспечивают следующие возможности: * Подсветку синтаксиса кода, написанного пользователем, т.е. выделения особыми параметрами шрифта ключевых слов данных языков; * Нумерации строк, что может быть полезным при возникновении ошибок в программе, т.к. транслятор кода ST в C выдаёт номер строки, в которой найдена ошибка; * Сворачивание кода структурных элементов языка: определения функции, определение типа и т.д. Увеличение или уменьшение размера шрифт выполняется с помощью Ctrl + <колёсико мыши>. Конструкции языка ST ~~~~~~~~~~~~~~~~~~~~ К конструкциям языка ST относятся: 1. Арифметические операции 2. Логические (побитовые) операции 3. Операции сравнения 4. Операция присвоения 5. Конструкция IF – ELSE 6. Цикл FOR 7. Цикл WHILE 8. Конструкция CASE. **1. Арифметические операции** К арифметическим операциям относятся: * «+» – сложение; * «–» – вычитание; * «*» – умножение; * «/» – деление; * «mod» – остаток от целочисленного деления. **2. Логические (побитовые) операции** К данным операциям относятся: * «OR» – Логическое (побитовое) сложение; * «AND» – Логическое (побитовое) умножение; * «XOR» – Логическое (побитовое) «исключающее ИЛИ»; * «NOT» – Логическое (побитовое) отрицание. **3. Операции сравнения** Поддерживаются следующие операции сравнения: * «=» – сравнение на «равенство»; * «<>» – сравнение на «неравенство»; * «>» – сравнение на «больше»; * «>=» – сравнение на «не меньше»; * «<» – сравнение на «меньше»; * «<=» – сравнение на «не больше». В качестве результата сравнения всегда используется значение типа BOOL. **4. Операция присвоения** Для обозначения присвоения используется парный знак «:=». В правой и левой части выражения должны быть операнды одного типа (автоматического приведения типов не предусмотрено). В левой части выражения (принимающая сторона) может быть использована только переменная. Правая часть может содержать выражение или константу. **5. Конструкция IF – ELSE** Конструкция IF–ELSE имеет следующий формат: .. code-block:: c IF<логическое выражение>THEN<выполняемое выражение> [ELSE<выполняемое выражение>] END_IF; Например: .. code-block:: c IF Vary<> 0 THEN Var4 := 1 ELSE Var4 := 10; END_IF; Конструкция допускает вложенность, т.е. внутри одного IF может быть еще один и т.д. Например: .. code-block:: c IF Var5 > 10 THEN IF Var5 < Var2 + 1 THEN Var5 := 10; ELSE Var5 := 0; END_IF; END_IF; **6. Цикл FOR** Служит для задания цикла с фиксированным количеством итераций. Формат конструкции следующий: .. code-block:: c FOR<переменная управления> := <выражение1> TO <выражение2> [BY< выражение3>] DO <выполняемое выражение> END_FOR; .. note:: Выражения <выражение1> … <выражение1> вычисляются до входа в цикл, поэтому изменения значений переменных, входящих в любое из этих выражений, не приведет к изменению числа итераций. При задании условий цикла считается, что <переменная управления>, <выражение1> …<выражение3> имеют тип INT. Выход из цикла будет произведен в том случае, если значение переменной цикла превысит значение <выражение3>. Например: .. code-block:: c FOR i := 1 TO 10 BY 2 DO k := k * 2; END_FOR; Оператор BY задает приращение переменной цикла (в данном случае i будет увеличиваться на 2 при каждом проходе по циклу). Если оператор BY не указан, то приращение равно 1. Например: .. code-block:: c FOR i := 1 TO k / 2 DO var3 := var3 + k; k := k – 1; END_FOR; Внутри цикла могут использоваться другие циклы, операторы IF и CASE. Для выхода из цикла (любого типа) может использоваться оператор EXIT. Например: .. code-block:: c FOR i := 1 TO 10 BY 2 DO k := k * 2; IF k > 20 THEN EXIT; END_IF; END_FOR; Другой пример: .. code-block:: c k := 10; FOR i := 1 TO k / 2 DO k := 20; END_FOR; На строках между DO и END_FOR производится изменение переменной k, при этом эти строки выполнятся пять раз. Например: .. code-block:: c FOR i := 1 TO 5 DO i := 55; END_FOR; При первом проходе значение i будет равно 1, потом в теле цикла изменится на 55, но на втором проходе значение i станет равно 2 – следующему значению по условиям цикла. **7. Цикл WHILE** Служит для определения цикла с предусловием. Цикл будет исполняться до тех пор, пока выражение в предложении WHILE возвращает TRUE. Формат конструкции следующий: .. code-block:: c WHILEDO<выполняемое выражение> END_WHILE; Значение проверяется на каждой итерации. Завершение цикла произойдет, если выражение вернет FALSE. Например: .. code-block:: c k := 10; WHILE k > 0 DO i := i + k; k := k – 1; END_WHILE; Внутри цикла могут использоваться другие циклы, операторы IF и CASE. Для досрочного завершения цикла используется оператор EXIT. **8. Конструкция CASE** Данная конструкция служит для организации выбора из диапазона значений. Формат конструкции следующий: .. code-block:: c CASE<выражение>OF CASE_ELEMENT {CASE_ELEMENT} [ELSE<выполняемое выражение>] END_CASE; CASE_ELEMENT – это список значений, перечисленных через запятую. Элементом списка может быть целое число или диапазон целых чисел. Диапазон задается следующим образом BEGIN_VAL.. END_VAL. Если текущее значение <выражение> не попало ни в один CASE_ELEMENT, то управление будет передано на предложение ELSE. Если предложение ELSE не указано, то никаких действий выполнено не будет. Значение <выражение> может быть только целым. Например: .. code-block:: c CASE k OF 1: k := k * 10; 2..5: k := k * 5; i := 0; 6, 9..20: k := k – 1; ELSE k := 0; i := 1; END_CASE; При задании списка значений необходимо выполнять следующие условия: – наборы значений внутри одного CASE не должны пересекаться; – при указании диапазона значений начало диапазона должно быть меньше его конца. Действия, предусмотренные для обработки каждого из случаев CASE, могут использовать циклы, операторы IF и CASE. Конструкции языка IL ~~~~~~~~~~~~~~~~~~~~ Основа языка программирования IL, как и в случае Assembler, это переходы по меткам и аккумулятор. В аккумулятор загружается значения переменной, а дальнейшее выполнение алгоритма представляет собой извлечение значения из аккумулятора и совершение над ним операций. В таблице приведены операторы языка IL. Пример программы выполненной на IL приведен на рисунке. .. csv-table:: Операторы языка IL :header: "Оператор","Описание" :widths: 5, 40 "LD", "Загрузить значение операнда в аккумулятор" "LDN", "Загрузить обратное значение операнда в аккумулятор" "ST", "Присвоить значение аккумулятора операнду" "STN", "Присвоить обратное значение аккумулятора операнду" "S", "Если значение аккумулятора TRUE, установить логический операнд" "R", "Если значение аккумулятора FALSE, сбросить логический операнд" "AND", "«Поразрядное И» аккумулятора и операнда" "ANDN", "«Поразрядное И» аккумулятора и обратного операнда" "OR", "«Поразрядное ИЛИ» аккумулятора и операнда" "ORN", "«Поразрядное ИЛИ» аккумулятора и обратного операнда" "XOR", "«Поразрядное разделительное ИЛИ» аккумулятора и операнда" "XORN", "«Поразрядное разделительное ИЛИ» аккумулятора и обратного операнда" "ADD", "Сложение аккумулятора и операнда, результат записывается в аккумулятор" "SUB", "Вычитание операнда из аккумулятора, результат записывается в аккумулятор" "MUL", "Умножение аккумулятора на операнд, результат записывается в аккумулятор" "DIV", "Деление аккумулятора на операнд, результат записывается в аккумулятор" "GT", "Значение аккумулятора сравнивается со значением операнда(>(greater than)). Значение (TRUE или FALSE) записывается в аккумулятор" "GE", "Значение аккумулятора сравнивается со значением операнда (>=greater than or equal). Значение (TRUE или FALSE) записывается в аккумулятор" "EQ", "Значение аккумулятора сравнивается со значением операнда (=(equal)). Значение (TRUE или FALSE) записывается в аккумулятор" "NE", "Значение аккумулятора сравнивается со значением операнда <>(not equal). Значение (TRUE или FALSE) записывается в аккумулятор" "LE", "Значение аккумулятора сравнивается со значением операнда (<=(less than or equal to)). Значение (TRUE или FALSE) записывается в аккумулятор" "LT", "Значение аккумулятора сравнивается со значением операнда (<(less than)). Значение (TRUE или FALSE) записывается в аккумулятор" "JMP", "Переход к метке" "JMPC", "Переход к метке при условии, что значение аккумулятора TRUE" "JMPCN", "Переход к метке при условии, что значение аккумулятора FALSE" .. figure:: images/beremiz/28.png :width: 600 :align: center Пример программы на языке IL Описание работы с графическими редакторами языков FBD, LD SFC ------------------------------------------------------------- Данные редакторы позволяют создавать и редактировать алгоритмы и логику выполнения программных модулей, написанных на языках FBD, SFC и LD. Конструкции языка FBD ~~~~~~~~~~~~~~~~~~~~~ Основными элементами языка FBD являются: переменные, функциональные блоки и соединения. При редактировании FBD диаграммы, в панели инструментов появляется следующая панель: .. figure:: images/beremiz/29.png :align: center Панель редактирования FBD диаграмм С помощью данной панели можно добавить все элементы языка FBD. Назначение каждой кнопки описано в таблице ниже. .. csv-table:: Кнопки панели редактирования FBD диаграммы :header: "Внешний вид кнопки","Наименование кнопки", "Функции кнопки" :widths: 10, 40, 60 .. figure:: images/beremiz/pointer.png , "Выделение объектов на диаграмме", "Перевод указателя мыши в состояние, при котором можно осуществлять выделение объектов в редакторе" .. figure:: images/beremiz/hand.png , "Перемещение диаграммы", "Перевод указателя мыши в состояние, при котором можно изменять размеры редактора" .. figure:: images/beremiz/cmt.png , "Создать новый комментарий", "Вызов диалога создания комментария" .. figure:: images/beremiz/var.png , "Добавить переменную", "Вызов диалога добавления переменной" .. figure:: images/beremiz/fb.png , "Добавить ФБ", "Вызов диалога добавления функционального блока" .. figure:: images/beremiz/connection.png , "Добавить соединение", "Вызов диалога добавления соединения" Для этого необходимо указателем мыши выбрать необходимую кнопку и нажать на свободное место в области редактирования FBD диаграммы. В зависимости от выбранного элемента появятся определённые диалоги добавления данного элемента. Аналогичные действия можно выполнить с помощью всплывающего меню в области редактирования FBD диаграмм. Вызов данного меню происходит при помощи нажатия правой клавишей мыши и выбора пункта «Add» (Добавить), в котором будет: «Block» (Блок), «Variable» (Переменная), «Connection» (Соединение), «Comment» (Комментарий). .. figure:: images/beremiz/30.png :align: center Всплывающее меню редактора языка FBD При добавлении функционального блока одним из описанных выше способов, появится диалог «Block Properties» (Свойства блока). .. figure:: images/beremiz/31.png :align: center Свойства функционального блока В данном диалоге приведено краткое описание функционального блока в нижнем левом окне и предоставлена возможность задать некоторые свойства (имя, количество входов, порядок выполнения). Добавление блока происходит путем перетаскивания необходимой функции из панели библиотеки функций и функциональных блоков, через окно «Block Properties» или путем копирования существующего блока. Переменные добавляются из панели переменных и констант с помощью перетаскивания левой клавишей мыши за область (#), указанную на рисунке ниже в область редактирования FBD диаграмм или через диалог «Variable Properties» (Свойства переменной), вызванный через всплывающего меню редактора языка FBD. .. figure:: images/beremiz/32.png :width: 600 :align: center Добавление переменной из панели переменных и констант .. figure:: images/beremiz/33.png :align: center Свойства переменной В данном диалоге можно задать порядок выполнения переменной и изменить её класс («Input» (Входная), «Output» (Выходная), «InOut» (Входная/Выходная)). Когда необходимо передать выходное значение одного функционального блока на один из входов другого для удобства можно использовать элемент «Connection» (Соединение). На схемах с большим количеством функциональных блоков элемент «Connection» позволяет избежать пересечения прямых соединений, которые приводит к тому, что схема становится менее понятной. После выбора добавления элемента «Connection» появится диалог «Connection Properties» (Свойства соединения). .. figure:: images/beremiz/34.png :align: center Диалог добавления соединения для FBD В данном диалоге можно выбрать тип соединения: «Connector» (Выходное соединение) – для выходного значения, «Continuation» (Входное соединение) – для входного значения, а так же необходимо указать имя данного соединения. Ниже представлен пример использования соединений. .. figure:: images/beremiz/35.png :align: center Пример FBD диаграммы с использованием соединений Редактор FBD диаграмм позволяют добавлять комментарии на диаграмму. После выбора на панели редактирования комментария и добавления его в область редактирования появится диалог для ввода текста комментария. .. figure:: images/beremiz/36.png :align: center Диалог добавления комментария Последовательность исполнения функций и функциональных блоков определяется порядком их выполнения. Автоматически он регламентируется следующим образом: чем выше и левее расположен верхний левый угол, описывающего функцию или ФБ прямоугольника, тем раньше данная функция или функциональный будет выполнен. Порядок выполнения может быть изменён вручную с помощью диалога свойств опцией «Execution Order» (Порядок выполнения). Конструкции языка LD ~~~~~~~~~~~~~~~~~~~~ Язык LD представляет собой графическую форму записи логических выражений в виде контактов и катушек реле. Как только активной становится вкладка с редактированием LD диаграммы, в панели инструментов появляется панель с элементами языка LD. .. figure:: images/beremiz/37.png :align: center Панель редактирования LD диаграмм С помощью данной панели можно добавить все элементы языка LD. В таблице ниже приведено описание кнопок данной панели. .. csv-table:: Кнопки панели редактирования LD диаграммы :header: "Внешний вид кнопки","Наименование кнопки", "Функции кнопки" :widths: 10, 40, 60 .. figure:: images/beremiz/pointer.png , "Выделение объектов на диаграмме", "Перевод указателя мыши в состояние, при котором можно осуществлять выделение объектов в редакторе" .. figure:: images/beremiz/hand.png , "Перемещение диаграммы", "Перевод указателя мыши в состояние, при котором можно изменять размеры редактора" .. figure:: images/beremiz/bus.png , "Создать новую шину питания", "Вызов диалога создания новой шины питания" .. figure:: images/beremiz/coil.png , "Создать новую катушку", "Вызов диалога создания новой катушки [6]_ " .. figure:: images/beremiz/contact.png , "Создать новый контакт", "Вызов диалога создания нового контакта [7]_" .. figure:: images/beremiz/cmt.png , "Создать новый комментарий", "Вызов диалога создания комментария" .. figure:: images/beremiz/var.png , "Добавить переменную", "Вызов диалога добавления переменной" .. figure:: images/beremiz/fb.png , "Добавить ФБ", "Вызов диалога добавления функционального блока" .. figure:: images/beremiz/connection.png , "Добавить соединение", "Вызов диалога добавления соединения" .. [6] Устанавливает соответствующий битовый объект в значение, равное результату, полученному в проверочной зоне (имеется инверсный элемент). .. [7] Контакт замкнут, когда битовая переменная, которая управляет им, равна 1 (имеется инверсный элемент). При добавлении шины питания появится диалог «Power Rail Properties» (Свойства шины питания). В данном диалоге указываются следующие свойства: * «Type» (тип шины питания) («Left PowerRail» (шина питания слева), «Right PowerRail» (шина питания справа)); * «Pin number»( количество контактов на добавляемой шине питания). .. figure:: images/beremiz/38.png :align: center Свойство шины питания При добавлении контакта на LD диаграмму появится диалог «Edit Contact Values» (Редактирование значения контакта). .. figure:: images/beremiz/39.png :align: center Редактирование контакта Данный диалог позволяет определить модификатор данного контакта: * «Normal» (Нормальный); * «Negated» (Инверсный); * «Rising Edge» (Нарастание фронта); * «Falling Edge» (Спад фронта). Диалог позволяет выбрать из списка переменную, к которой он связан. Переменные должны быть определены в панели переменных и констант и иметь тип переменной BOOL. Еще одним способом добавления контакта на диаграмму перетаскивание из панели переменных и констант переменной типа BOOL и класса: «Входная», «Входная/Выходная», «Внешняя», «Локальная», «Временная». Для этого необходимо зажать левой кнопкой мыши за первый столбец (который имеет заголовок #) переменную, удовлетворяющую описанным выше критериям и перенести в область редактирования диаграммы. При добавлении катушки на LD диаграмму появится диалог «Edit Coil Values» (Редактирование значения катушки). .. figure:: images/beremiz/40.png :align: center Редактирование катушки В данном диалоге можно определить модификатор данного контакта: * «Normal» (Нормальный); * «Negated» (Инверсный); * «Set» (Установка); * «Reset» (Сброс); * «Rising Edge» (Нарастание фронта); * «Falling Edge» (Спад фронта). Конструкции языка SFC ~~~~~~~~~~~~~~~~~~~~~ Основными элементами языка SFC являются: начальный шаг, шаг, переход, блок действий, дивергенции, «прыжок». Программа на языке SFC состоит из набора шагов, связанных переходами. Как только активной становится вкладка с редактированием SFC диаграммы, в панели инструментов появляется следующая панель. .. figure:: images/beremiz/41.png :align: center Панель редактирования SFC диаграмм В таблице ниже приведено описание кнопок данной панели. .. csv-table:: Кнопки панели редактирования SFC диаграммы :header: "Внешний вид кнопки","Наименование кнопки", "Функции кнопки" :widths: 10, 40, 60 .. figure:: images/beremiz/pointer.png , "Выделение объектов на диаграмме", "Перевод указателя мыши в состояние, при котором можно осуществлять выделение объектов в редакторе" .. figure:: images/beremiz/hand.png , "Перемещение диаграммы", "Перевод указателя мыши в состояние, при котором можно изменять размеры редактора" .. figure:: images/beremiz/cmt.png , "Создать новый комментарий", "Вызов диалога создания комментария" .. figure:: images/beremiz/start.png , "Создать новый начальный шаг", "Вызов диалога редактирования шага" .. figure:: images/beremiz/step.png , "Создать новый шаг", "Вызов диалога редактирования шага" .. figure:: images/beremiz/transition.png , "Создать новый переход", "Создать новый переход" .. figure:: images/beremiz/sfc_block.png , "Создать новый блок действий", "Вызов диалога редактирования блока действий" .. figure:: images/beremiz/new_branch.png , "Создать новую дивергенцию", "Вызов диалога создания новой дивергенции и конвергенции" .. figure:: images/beremiz/jump.png , "Создать новый «прыжок»", "Вызов диалога создания«прыжка»" .. figure:: images/beremiz/var.png , "Добавить переменную", "Вызов диалога добавления переменной" .. figure:: images/beremiz/fb.png , "Добавить ФБ", "Вызов диалога добавления функционального блока" .. figure:: images/beremiz/connection.png , "Добавить соединение", "Вызов диалога добавления соединения" .. figure:: images/beremiz/bus.png , "Создать новую шину питания", "Вызов диалога создания новой шины питания" .. figure:: images/beremiz/contact.png , "Создать новый контакт", "Вызов диалога создания нового контакта" Процедура добавления шага инициализации и обычного шага ничем не отличается. В обоих случаях вызывается диалог «Edit Step» (Редактировать шаг). .. figure:: images/beremiz/42.png :align: center Диалоги редактирования шага инициализации и обычного шага SFC диаграммы Согласно стандарту IEC 61131-3, на SFC диаграмме должен быть один шаг инициализации, который характеризует начальное состояние SFC-диаграммы и отображается со сдвоенными линиями на границах. При добавлении на SFC диаграмму перехода, появится диалог «Edit transition» (Редактировать переход). .. figure:: images/beremiz/43.png :align: center Диалог редактирования перехода для SFC диаграммы В данном диалоге необходимо выбрать тип перехода и его приоритет. Тип перехода может быть: * «Reference» (Ссылка); * «Inline» (Встроенный код); * «Connection» (Соединение). При выборе типа перехода «Ссылка» в открывающемся списке будут доступны переходы, предопределённые в дереве проекта для данного программного модуля, написанного на языке SFC. Добавление предопределённого перехода описывается ниже после описания всех добавляемых элементов языка SFC. При выборе типа перехода «Inline» условие перехода можно написать в виде выражения на языке ST. .. figure:: images/beremiz/44.png :align: center Условие перехода в виде встроенного кода, написанного на языке ST Реализация перехода таким способом удобна в случае, когда необходимо короткое условие, например: переменные «f3» и «f4» типа INT равны. Встроенный код для такого условия выглядит следующим образом: f3 = f4 Так же, например, можно в качестве условия просто указать переменную. В случае её значения равного 0 – будет означать FALSE, все остальные значения – TRUE. При выборе типа перехода «Connection», в качестве условия перехода можно использовать выходные значения элементов языка FBD или LD. При выборе типа перехода «Connection», у добавленного перехода появится слева контакт, который необходимо соединить с выходным значением, например, функционального блока языка FBD или катушки LD диаграммы. Стоит отметить, что данное выходное значение должно быть типа BOOL. При добавлении блока действий на диаграмму появится диалог «Edit action block properties» (Редактировать свойство блока действий). .. figure:: images/beremiz/45.png :align: center Диалог «Редактировать свойство блока действий» Данный блок действий может содержать набор действий. Добавить новое действие можно нажав кнопку «Добавить» и установив необходимые параметры: * «Qualifier» (Квалификатор); * «Duration» (Продолжительность); * «Type» (Тип): «Action» (Действие), «Variable» (Переменная), «Inline» (Встроенный код); * «Value» (Значение); * «Indicator» (Индикатор). Поле «Qualifier» определяет момент времени, когда действие начинается, сколько времени продолжается и когда заканчивается. Выбрать квалификатор можно из списка. Подробное описание квалификаторов, которые выбираются из предлагаемого списка при добавлении действия приведено в таблице. .. csv-table:: Квалификаторы действий SFC диаграммы :header: "Имя квалификатора действия", "Поведение блока" :widths: 20, 40 "D", "Действие начинает выполняться через некоторое заданное время (если шаг еще активен) и выполняется до тех пор, пока данный шаг активен" "L", "Действие выполняется в течение некоторого заданного интервала времени, после чего выполнение действия останавливается" "N", "Действие выполняется, пока данный шаг активен" "P", "Действие выполняется один раз, как только шаг стал активен" "S", "Действие активируется и остается активным пока SFC диаграмма выполняется" "R", "Действие выполняется, когда диаграмма деактивизируется" "DS", "Действие начинается выполняться через некоторое заданное время, только в том случае если шаг еще активен" "SL", "Действие активно в течении некоторого, заданного интервала" "SD", "Действие начинается выполняться через некоторое время, даже в том случае если шаг уже не активен" Поле «Duration» необходимо для установки интервала времени необходимого для некоторых квалификаторов, описанных выше. «Type» определяет код или конкретную манипуляцию, которая будет выполняться во время активации действия. В случае выбора «Действия» появляется возможность, как и в случае с переходом, использовать предопределённые действия в дереве проекта для данного программного модуля, написанного на языке SFC. Элемент «Jump» (прыжок) на SFC диаграмме подобен выполнению оператора GOTO при переходе на определённую метку в коде в различных языках программирования. После выбора добавления «прыжка» на SFC диаграмму, появится диалог, в котором необходимо выбрать из списка шаг, к которому будет происходить «прыжок» – переход от одного шага SFC диаграммы к другому. .. figure:: images/beremiz/46.png :align: center Диалог добавления «прыжка» В данном диалоге также присутствует и шаг инициализации (начальный шаг). После выбора шага и нажатия кнопки OK. На SFC диаграмме появится стрелочка, которую нужно соединить с переходом. Справа от стрелочки находится имя шага, к которому осуществляется переход в случае выполнения условия перехода, находящегося выше и соединённого с ней. .. figure:: images/beremiz/47.png :align: center Пример алгоритма, напианного на языке SFC