Язык программирования instruction list
Команды (инструкции) языка IL
Список инструкций составлен из последовательности команд. Каждая команда начинается в новой ячейке и состоит из оператора (в случае необходимости с модификатором) и (если требуется для соответствующей операции) сопровождается одним или несколькими операндами (рисунок 9.1). Если используется несколько операндов, они отделяются запятыми. Команде может предшествовать метка с двоеточием. Команда может сопровождаться комментарием.
Рисунок 9.1 – Формат записи команды в языке IL
Язык IL – так называемый аккумуляторно-ориентированный язык, т. е. каждая команда использует или изменяет текущее содержимое аккумулятора (тип временной памяти). Стандарт IEC 61131-3 обозначает этот аккумулятор как результат.
Список команд должен всегда начинаться с оператора LD (команда загрузки аккумулятора) и заканчиваться оператором сохранения ST.
Пример показывает загрузку литерала 10 в аккумулятор, добавление литерала 25 и внесение результата в переменную А. Содержимое переменной и аккумулятора теперь 35. Любая последующая команда работала бы с содержимым аккумулятора 35, если она не начинается с LD.
Операции сравнения также всегда касаются аккумулятора. Булев результат сравнения вносится в аккумулятор, следовательно, это является текущим содержанием аккумулятора.
В примере значение переменной В загружено в аккумулятор и сравнивается с литералом 10. Если В меньше или равно 10, содержимое аккумулятора равно 0 (FALSE). Если В больше чем 10, содержимое аккумулятора есть 1 (TRUE).
Операнды. Операндом может быть литерал, переменная, структурированная переменная, элемент структурированной переменной, выход FB/DFB или прямой адрес.
Когда осуществляется доступ к массивам переменных (ARRAY), элемент указателя допускает только литералы и переменные типа ANY_INT.
В таблица 9.1 приведены заданные по умолчанию типы данных прямого адреса.
Вход | Выход | Заданные по умолчанию типы данных | Возможные типы данных |
%IХ,%I | %QX,%Q | BOOL | BOOL |
%IВ | %QB | BYTE | BYTE |
%IW | %QW | INT | INT, UINT, WORD |
%ID | %QD | REAL | REAL, DINT, UDINT, TIME |
Назначение типов данных, отличных от заданных по умолчанию типов данных прямого адреса, должно выполняться через явное объявление (VAR. END_VAR). В пакете Concept объявление VAR. END_VAR не может использоваться для объявления переменных. Объявление переменных очень легко выполнить через редактор переменных.
Операнд и текущее содержимое аккумулятора должны иметь одинаковый тип данных. Если необходимо обработать операнды различных типов данных, сначала выполняется преобразование типов. Исключением является тип данных TIME вместе с арифметическими операторами MUL и DIV. Эти два оператора позволяют обработать операнд типа данных TIME вместе с операндом типа данных ANY_NUM. В этом случае результат этих команд будет иметь тип данных TIME.
В примере целая переменная i1 преобразована в вещественную переменную прежде, чем она добавлена к вещественной переменной r4.
В примере переменная времени t2 умножена на целую переменную i4, а результат сохраняется в переменной времени t1.
Модификаторы. Модификаторы влияют на выполнение предшествующего оператора.
Модификатор N используется, чтобы инвертировать побитно значение операнда. Модификатор N может применяться только к операндам типа данных ANY_BIT.
Пример модификатора N:
В примере С = 1, если А = 1 и В = 0.
Модификатор С используется, чтобы выполнить соответствующую команду, если значение аккумулятора равно 1 (TRUE). Модификатор С может применяться только к операндам типа данных BOOL.
Пример модификатора С:
В примере переход к START выполняется, только если А = 1 (TRUE) и В = 1 (TRUE).
Если модификатор С объединен с модификатором N, соответствующая команда выполняется, только если значение аккумулятора равно булеву 0 (FALSE).
В примере переход к START выполняется, только если А = 0 (FALSE) и/или В = 0 (FALSE).
Модификатор ( (левая круглая скобка) используется, чтобы задержать оценку операнда до появления оператора (правая круглая скобка). Число операций правой круглой скобки должно быть равным числу модификаторов левой круглой скобки. Круглые скобки могут быть вложенными.
В примере Е будет равно 1 если С и/или D равны 1, а А и B равны 1.
Этот же пример может также программироваться следующим образом:
Операторы.
Оператор является символом для арифметической или логической операции, которая будет выполнена, или для вызова функции.
Операторы являются обобщенными, т. е. они автоматически корректируются к типу данных операнда.
Операторы языка программирования IL приведены в таблицах 9.2-9.8.
Таблица 9.2 – Операторы загрузки и сохранения
Языки программирования ПЛК — типы данных, IL
В этой статье, или, скорее, цикле статей хочу поговорить о языках программирования ПЛК и дать их понимание и описание.
Языки программирования ПЛК прошли довольно приличный путь, прежде, чем обрели свой теперешний вид.
Изначально ПЛК представляли собой вообще устройства с жестко зашитой логикой работы. Что, конечно же, было весьма неудобно для случаев, если нужно было что-то поменять в цикле производства. Приходилось фактически изготавливать новый контроллер. Хотя это был самый дешёвый вариант. Затем были придуманы контроллеры, которые можно было перепрограммировать с помощью релейной логики. И именно от них и пошла аббревиатура ПЛК (PLC — programmable logic controller).
Затем появились контроллеры с программированием на машинно-ориентированном языке, что значительно облегчало адаптацию их под новые нужды производства. Но, с другой стороны, требовало постоянного привлечения профессиональных программистов. Затем для программирования использовались и языки высокого уровня, что опять-таки требовало наличия программистов.
Кроме того, каждый производитель промышленных контроллеров изобретал свой язык и способ программирования своих изделий. Что, безусловно, облегчало программирование контроллеров и не требовало наличия программистов, но вносило сумбур и чересчур большое разнообразие языков на рынке, что создавало сложности для потребителя.
Как я уже сказал, этот стандарт предусматривает 5 языков. Языки эти не были выдуманы разработчиками стандарта, а взяты из всего лучшего, что было уже наработано производителями ПЛК. Эти языки достаточно просты, ориентированы не на программистов, а на инженеров, которые разбираются и понимают процессы, требующие автоматизации с помощью ПЛК, и достаточно легки в освоении.
Итак, что же это за языки.
Хотя, стоп. Для начала — о типах данных.
В языках стандарта типы данных строго контролируются. Это означает, что присвоить одной переменной значение другой можно только, если обе — одного типа. Но есть функции явного преобразования типов.
Возможно и неявное преобразование типов в том случае, если переменной присваивается значение, тип данных которого совместим с типом данных переменной и имеет более узкое множество значений. Например, тип данных SINT (-128. +127) можно присваивать типу INT (-32568. +32567).
Приведу табличку с типами данных МЭК 61131-3
Нижний предел
Верхний предел
Размер в байтах
А теперь – языки программирования ПЛК.
Знакомьтесь — IL – список инструкций (instruction list). Очень напоминает ассемблер. Все действия в нём совершаются через аккумулятор. Сначала в аккумулятор заносится необходимая переменная или величина, а затем с ней совершаются различные операции. Операций не много — всего 24.
Язык Instruction List (IL)
Язык Список команд (Instruction List) – это унификация интерфейса языка программирования низкого уровня, неориентированного на какую-либо микропроцессорную архитектуру. Происхождение базовых конструкций языка – STEP 5 (Siemens). У языка IL есть очень важное качество: на его основе можно создавать оптимальные по быстродействию программные единицы.
Программа, написанная на языке IL, состоит из набора инструкций, выполняемых ПЛК последовательно (рис 3.3). Каждая инструкция состоит из кода инструкций и операнда.
Например: LD %I 1.0, где LD – код инструкции, I 1.0 – операнд.
— Стандартные системные управляющие функции (таймеры, счетчики).
— Арифметические и логические операции и операции пересылки.
— Внутренние переменные ПЛК.
Существуют два типа инструкций:
— Проверочные инструкции, которые содержат условия, необходимые для того, чтобы выполнилось действие, например, LD, AND, OR.
— Инструкции действия, которые активизируют действие, следующее за проверочной последовательностью, например, ST, STN, R.
Рис. 3.3. Фрагмент программы на языке IL
Список базовых инструкций языка IL приведен в таблице 3.6.
Таблица 3.6. Базовые инструкции языка IL
Наименование | Инструкции | Описание | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Проверочные инструкции | LD, LDN, LDR, LDF | Инструкции загрузки | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
AND, ANDN, ANDR, ANDF | Инструкции логического И | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
OR, ORN, ORR, ORF | Инструкции логического ИЛИ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
AND, OR | (8 уровней вложения) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
XOR, XORN, XORR, XORF | исключающее ИЛИ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
MPS MRD МРР | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
N | отрицание | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Инструкции действия | ST, STN, S, R | –( )– –( / )– –( S )– –( R )– | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
JMP, JMPC, JMPCN | Используется для перехода (безусловного, условного при булевском результате равном 1, или условного при булевском результате равном 0) на помеченную инструкцию, которая может быть расположена в списке инструкций как перед текущей инструкцией, так и после нее. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
SRn | Используется для перехода к началу подпрограммы. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
RET, RETC, RETCN | Возврат из подпрограммы (безусловный, условный при булевском результате, равном 1, условный при булевском результате, равном 0). | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
END, ENDC, ENDCN | Конец программы (безусловный, условный при булевском результате, равном 1, условный при булевском результате, равном 0). | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
HALT | Выполнение программы останавливается. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Проверочные элементы | Блоки: таймер; счетчик; одновибратор; регистр; контроллер барабана | Существуют инструкции для управления каждым из стандартных функциональных блоков. Для активизации вводов/выводов функциональных блоков используется специальная структурная форма. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
LD[. ] AND[. ] OR[. ] | Используются для сравнения двух операндов. Выход становится равным 1, если при выполнении проверочной операции получаем истинный результат. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Пример: LD[%MW10 Программой является последовательность инструкций. Каждая последовательность должна содержать одну или несколько проверочных инструкций. Результаты проверочных инструкций используются в одной или нескольких инструкциях действия. Каждая инструкция занимает одну строку. Последовательность инструкций начинается с восклицательного знака (он формируется автоматически). Восклицательный знак может включать комментарий и может быть идентифицирован меткой.
Комментарий может быть расположен в начале последовательности инструкций. Он может занимать до 3-х строк (т.е. 222 алфавитно-цифровых символов) и должен быть обрамлен символами (*и*). На мониторе воспроизводится только первая строка комментария. Если последовательность удаляется, то удаляется также связанный с ней комментарий. Метка может быть назначена один раз для единственной последовательности инструкций в данном программном объекте. Для обеспечения соответствующих связей при программном переходе последовательность должна быть помечена. Система сканирует последовательность инструкций в том порядке, как они были введены независимо от значений чисел, используемых при формировании меток. Круглые скобки могут быть использованы в инструкциях AND и OR. Действие скобок наглядно демонстрируется при сопоставлении с соответствующими Лестничными Диаграммами. Открывающаяся круглая скобка связана с соответствующей инструкцией AND или OR. Закрывающаяся круглая скобка является инструкцией и обязательна для каждой открытой скобки.
Для круглых скобок допускается до восьми уровней вложения. При их применении следует соблюдать следующие правила: — За каждой открывающей круглой скобкой должна последовать закрывающая скобка. — Метки не должны располагаться в выражении между круглыми скобками. Это правило справедливо также для инструкций перехода и вызова подпрограмм. — Инструкции обозначенные – ST, STN, S и R не могут быть запрограммированы между круглыми скобками. Существуют три типа инструкций, которые используются для обработки содержимого ячеек в особом порядке. Они используют буфер в виде стека, который способен запоминать вплоть до трех битов булевских данных. — Инструкция MPS (Memory PuSh) запоминает на вершине стека последний результат проверочной инструкции и сдвигает другие данные в направлении дна стека. — Инструкция MRD (Memory ReaD) считывает содержимое вершины стека. — Инструкция МРР (Memory PoP) считывает вершину стека и сдвигает другие данные в нем в направлении вершины стека. Эти инструкции не используются в выражениях между круглыми скобками. Программы списка команд выполняются последовательно – инструкция за инструкцией. Первой инструкцией обязательно должна быть либо LD, либо инструкция безусловного перехода (JMP). Все инструкции (за исключением LD и JMP) используют булевский результат предыдущей инструкции.
Последовательность инструкций может быть изменена инструкциями JMP и вызова подпрограмм. Пример: Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет Национальная библиотека им. Н. Э. Баумана |
Парадигма | императивный, структурированный |
---|---|
Спроектировано | IEC |
Первый появившийся | 1993 |
Портал: | Instruction List |
Содержание
Синтаксис
Программы написанные на языке Instruction list это последовательности высказований. Высказования состоят из операторов и операндов, которые могут быть переменными, константами или метками. Кроме того, программы могут дополняться комментариями.
Некоторые операторы могут быть дополнены модификаторами. Существует два модификатора: N и C. Модификатор N изменяет операцию на такую же с отрицательным аргументом, т.е. отрицательным значением операнда. Операторы, дополненные модификатором C, исполняются только при условии, что значение CR истинно. Использование скобок позволяет заставить подвыражения вычисляться первыми, следовательно, избежать вспомогательные переменные или дополнительные операции загрузки/сохранения.
Инструкция | Описание |
---|---|
LD | загрузить операнд |
ST | сохранить операнд |
S | установить операнд в значение истина |
R | установить операнд в значение ложь |
NOT | Логическое отрицание |
AND | Логическое И |
OR | Логическое ИЛИ |
XOR | Логическое XOR |
ADD | сложение |
SUB | вычитание |
MUL | умножение |
DIV | целочисленное деление |
GT | больше чем |
GE | больше либо равно |
LT | меньше чем |
LE | меньше либо равно |
EQ | проверка на равенство |
NE | проверка на неравенство |
JMP | перейти к метке |
RET | вернуться из функции (блока) |
Типы данных
Типизирование данных является общим элементом стандарта с целью предотвращения ошибок на ранней стадии разработки. Оно определяет типы параметров, которые будут использоваться и помогает избежать ошибки, такие как деление даты на целое число. Поддерживаются такие типы данных как: Boolean, Integer, Real, Byte, Word, Date, Time-of-Day и String.
Переменные
Атрибуты переменных: RETAIN, CONSTANT, AT
Конфигурация
На самом высоком уровне, требуемое программное обеспечение для решения конкретной проблемы управления может быть названо конфигурацией. Конфигурация определяется для конкретного типа системы управления, в том числе распределения аппаратных средств, т.е. средств обработки, адресов памяти для каналов ввода / вывода и возможностей системы.
В конфигурации можно определить ресурсы. Ресурс можно рассматривать как объект обработки, которые способны выполнять программы. В пределах ресурса можно определить одну или несколько задач. Задачи контролируют выполнение набора программ и / или функциональных блоков. Они могут или выполняться периодически, или при наступлении определенного триггера.
Блоки, организующие программу
Примеры кода
Программа сохраняет значение 4000 в ячейке памяти, и значение 41 в другой ячейке. Делит первое на второе и сохраняет результат в память.
Программа увеличивает счетчик на единицу каждый тик генератора SM0.4 и уменьшает другой счетчик каждый тик того же генератора.
9 Язык списка инструкций il
Текстовый язык IL (Instruction List) относится к ассемблероподобным языкам, т. е. к языкам низкого (машинного) уровня, что существенно облегчает, например, вызов функциональных блоков и функций «условно» или «безусловно», выполнение назначений и условных или безусловных переходов внутри секции.
Язык IL, позволяет создавать высокоэффективные и оптимизированные функции. Его можно рекомендовать для написания наиболее критических мест в программе.
Ассемблероподобные языки использовались для программирования компьютеров в 50-е годы прошлого века и все еще предлагаются некоторыми изготовителями ПЛК, особенно программистами, поддерживающими микроРС. Программу можно написать с помощью любого текстового редактора.
При вводе ключевых слов, разделителей и комментариев в редакторе предусмотрена непосредственная по буквам проверка. При обнаружении ключевого слова, разделителя или комментария они идентифицируются через цветовое оттенение. При введении несанкционированных ключевых слов (назначений или операторов) они будут также идентифицироваться через цветовое оттенение.
Согласно стандарту IEC 61131-3 ключевые слова должны быть введены в символах верхнего регистра.
Пробелы и метки табуляции не влияют на синтаксис, они могут использоваться везде.
Генерация объектного кода вместе с проверкой синтаксиса будет выполняться, когда секция закрыта. Любые найденные ошибки затем отображаются в окне сообщений. Однако проверка синтаксиса может также осуществляться во время создания программы или блока DFB командой Project → Analyze Section.
Команды (инструкции) языка IL
Список инструкций составлен из последовательности команд. Каждая команда начинается в новой ячейке и состоит из оператора (в случае необходимости с модификатором) и (если требуется для соответствующей операции) сопровождается одним или несколькими операндами (рисунок 9.1). Если используется несколько операндов, они отделяются запятыми. Команде может предшествовать метка с двоеточием. Команда может сопровождаться комментарием.
Рисунок 9.1 – Формат записи команды в языке IL
Язык IL – так называемый аккумуляторно-ориентированный язык, т. е. каждая команда использует или изменяет текущее содержимое аккумулятора (тип временной памяти). Стандарт IEC 61131-3 обозначает этот аккумулятор как результат.
Список команд должен всегда начинаться с оператора LD (команда загрузки аккумулятора) и заканчиваться оператором сохранения ST.
Пример показывает загрузку литерала 10 в аккумулятор, добавление литерала 25 и внесение результата в переменную А. Содержимое переменной и аккумулятора теперь 35. Любая последующая команда работала бы с содержимым аккумулятора 35, если она не начинается с LD.
Операции сравнения также всегда касаются аккумулятора. Булев результат сравнения вносится в аккумулятор, следовательно, это является текущим содержанием аккумулятора.
В примере значение переменной В загружено в аккумулятор и сравнивается с литералом 10. Если В меньше или равно 10, содержимое аккумулятора равно 0 (FALSE). Если В больше чем 10, содержимое аккумулятора есть 1 (TRUE).
Операнды. Операндом может быть литерал, переменная, структурированная переменная, элемент структурированной переменной, выход FB/DFB или прямой адрес.
Когда осуществляется доступ к массивам переменных (ARRAY), элемент указателя допускает только литералы и переменные типа ANY_INT.
В таблица 9.1 приведены заданные по умолчанию типы данных прямого адреса.
Заданные по умолчанию типы данных
Возможные типы данных
REAL, DINT, UDINT, TIME
Назначение типов данных, отличных от заданных по умолчанию типов данных прямого адреса, должно выполняться через явное объявление (VAR. END_VAR). В пакете Concept объявление VAR. END_VAR не может использоваться для объявления переменных. Объявление переменных очень легко выполнить через редактор переменных.
Операнд и текущее содержимое аккумулятора должны иметь одинаковый тип данных. Если необходимо обработать операнды различных типов данных, сначала выполняется преобразование типов. Исключением является тип данных TIME вместе с арифметическими операторами MUL и DIV. Эти два оператора позволяют обработать операнд типа данных TIME вместе с операндом типа данных ANY_NUM. В этом случае результат этих команд будет иметь тип данных TIME.
В примере целая переменная i1 преобразована в вещественную переменную прежде, чем она добавлена к вещественной переменной r4.
В примере переменная времени t2 умножена на целую переменную i4, а результат сохраняется в переменной времени t1.
Модификаторы. Модификаторы влияют на выполнение предшествующего оператора.
Модификатор N используется, чтобы инвертировать побитно значение операнда. Модификатор N может применяться только к операндам типа данных ANY_BIT.
Пример модификатора N:
В примере С = 1, если А = 1 и В = 0.
Модификатор С используется, чтобы выполнить соответствующую команду, если значение аккумулятора равно 1 (TRUE). Модификатор С может применяться только к операндам типа данных BOOL.
Пример модификатора С:
В примере переход к START выполняется, только если А = 1 (TRUE) и В = 1 (TRUE).
Если модификатор С объединен с модификатором N, соответствующая команда выполняется, только если значение аккумулятора равно булеву 0 (FALSE).
В примере переход к START выполняется, только если А = 0 (FALSE) и/или В = 0 (FALSE).
Модификатор ( (левая круглая скобка) используется, чтобы задержать оценку операнда до появления оператора (правая круглая скобка). Число операций правой круглой скобки должно быть равным числу модификаторов левой круглой скобки. Круглые скобки могут быть вложенными.
В примере Е будет равно 1 если С и/или D равны 1, а А и B равны 1.
Этот же пример может также программироваться следующим образом:
Оператор является символом для арифметической или логической операции, которая будет выполнена, или для вызова функции.
Операторы являются обобщенными, т. е. они автоматически корректируются к типу данных операнда.
Операторы языка программирования IL приведены в таблицах 9.2-9.8.
Таблица 9.2 – Операторы загрузки и сохранения
(только для операндов типа BOOL, BYTE, WORD или DWORD)
Загрузка значений операндов в аккумулятор
Литерал, переменная, прямой адрес любого типа данных
Значение операнда загружается в аккумулятор, используя LD. Размер данных аккумулятора автоматически подстраивается для типа данных операции. Это также действительно для производных типов данных.
(только для операндов типа данных BOOL, BYTE, WORD или DWORD)
Сохранение значения аккумулятора в операнде
переменная, прямой адрес любого типа данных
Текущее значение аккумулятора сохраняется в операнде, используя ST. тип данных операнда должен соответствовать «типу данных» аккумулятора.
«Старый» результат используется далее, в зависимости от того, следует ли LD за ST или нет.
Таблица 9.3 – Операторы установки и сброса
Установка операнда в 1, когда содержимое аккумулятора = 1
Переменная, прямой адрес данных типа BOOL
S установка операнда в «1», когда текущее значение аккумулятора равно логической 1.
Пример: В этом примере значение A загружается в аккумулятор, если содержимое аккумулятора (значение A) = 1, тогда OUT устанавливается в 1.
Обычно этот оператор используется вместе с оператором сброса R в паре.
Пример: В этом примере показан RS Триггер (главный сброс), который управляется через логические переменные A и C.
Установка операнда в 0, когда содержимое аккумулятора = 1
Переменная, прямой адрес данных типа BOOL
R установка операнда в «0», когда текущее содержимое аккумулятора равно логической 1.
Пример: В этом примере значение A загружается в аккумулятор, если содержимое аккумулятора (значение A) = 0, тогда OUT устанавливается 1.
Обычно этот оператор используется вместе с оператором установки S в паре.
Пример: В этом примере показан SR Триггер (главная установка), который управляется через две логические переменные A и C.
Таблица 9.4 – Логические операторы
Литерал, переменная, прямой адрес данных типа BOOL, BYTE, WORD или DWORD
При помощи AND производится логическая операция И между содержимым аккумулятора и операндом.
Для BYTE, WORD и DWORD типов данных операция производится побитно.
Пример: В примере D = 1, если A, B и C = 1.
Литерал, переменная, прямой адрес данных типа BOOL, BYTE, WORD или DWORD
При помощи OR производится логическая операция ИЛИ между содержимым аккумулятора и операндом.
Для BYTE, WORD и DWORD типов данных, связь производится побитно.
Пример: В примере D = 1, если A или B = 1 и C = 1.
Логическое исключающее ИЛИ
Литерал, переменная, прямой адрес данных типа BOOL, BYTE, WORD или DWORD
При помощи XOR производится логическая операция Исключающее ИЛИ между содержимым аккумулятора и операндом.
Если связывается более двух операндов, результат для нечетного числа 1-состояния = 1, и = 0 для четного числа единичных состояний.
Для BYTE, WORD и DWORD типов данных, связь производится побитно.
Пример: В примере D = 1, если A или B = 1. Если A и B имеют одинаковое состояние (оба 0 или 1), D = 0.
Если связывается более двух операндов, результат для нечетного числа единичных состояний = 1, и 0 для четного числа единичных состояний.
Пример: В примере F = 1, если 1 или 3 операнды = 1. F = 0, если 0, 2 или 4 операнды = 1.
Содержимое аккумулятора типов данных BOOL, BYTE, WORD или DWORD
Содержимое аккумулятора инвертируется NOT.
Пример: В примере B = 1, если A = 0 и B = 0, если A = 1.
Таблица 9.5 – Арифметические операторы
Литерал, переменная, прямой адрес данных типа INT, DINT, UINT, UDINT, REAL или TIME
При помощи ADD значение операнда прибавляется к значению аккумулятора.
Пример: Пример соответствует формуле D = A + B + C
Литерал, переменная, прямой адрес данных типа INT, DINT, UINT, UDINT, REAL или TIME
При помощи SUB значение операнда вычитается из содержимого аккумулятора.
Литерал, переменная, прямой адрес данных типа INT, DINT, UINT, UDINT, REAL или TIME
При помощи MUL содержимое аккумулятора умножается на значение оператора.
Пример: Пример соответствует формуле D = A * B * C
Литерал, переменная, прямой адрес данных типа INT, DINT, UINT, UDINT, REAL или TIME
При помощи DIV содержимое аккумулятора делится на значение операнда.
Пример: Пример соответствует формуле D = A / B / C
Литерал, переменная, прямой адрес данных типа INT, DINT, UINT, UDINT, REAL или TIME
Для MOD значение первого операнда делится на значение второго операнда, и остаток от деления (модуль) возвращается как результат.
C = 1, если A = 7 и B = 2
Таблица 9.6 – Операторы сравнения
Литерал, переменная, прямой адрес данных типа BOOL, BYTE, WORD, DWORD, STRING, INT, DINT, UINT, UDINT, REAL, TIME, DATE, DT или TOD
При помощи GT содержимое аккумулятора сравнивается с содержимым операнда. Если содержимое аккумулятора больше, чем содержимое операнда, результат – логическая 1. Если содержимое аккумулятора меньше или равно содержимому операнда, результат – логический 0.
Пример: В примере значение D = 1, если A больше 10, иначе значение D = 0.
Литерал, переменная, прямой адрес данных типа BOOL, BYTE, WORD, DWORD, STRING, INT, DINT, UINT, UDINT, REAL, TIME, DATE, DT или TOD
При помощи GE содержимое аккумулятора сравнивается с содержимым операнда. Если содержимое аккумулятора больше или равно содержимому операнда, результат – логическая 1. Если содержимое аккумулятора меньше содержимого операнда, результат – логический 0.
Пример: В примере значение D = 1, если A больше или равно 10, иначе, значение D = 0.
Литерал, переменная, прямой адрес данных типа BOOL, BYTE, WORD, DWORD, STRING, INT, DINT, UINT, UDINT, REAL, TIME, DATE, DT или TOD
При помощи EQ содержимое аккумулятора сравнивается с содержимым операнда. Если содержимое аккумулятора равно содержимому операнда, результат – логическая 1. Если содержимое аккумулятора не равно содержимому операнда, результат – логический 0.
Пример: В примере значение D = 1, если A равно 10, иначе значение D = 0.
Литерал, переменная, прямой адрес данных типа BOOL, BYTE, WORD, DWORD, STRING, INT, DINT, UINT, UDINT, REAL, TIME, DATE, DT или TOD
При помощи NE содержимое аккумулятора сравнивается с содержимым операнда. Если содержимое аккумулятора не равно содержимому операнда, результат – логическая 1. Если содержимое аккумулятора равно содержимому операнда, результат – логический 0.
Пример: В примере значение D = 1, если A не равно 10, иначе значение D = 0.
(только если содержимое аккумулятора BOOL типа данных)
Вызов функционального блока, DFB или подпрограммы
Имя экземпляра функционального блока, DFB или подпрограммы
Функциональный блок, DFB или подпрограмма вызывается в ограниченном или неограниченном виде CAL.
Литерал, переменная, прямой адрес (тип данных зависит от функции)
Функция выполняется по имени функции.
Литерал, переменная, прямой адрес (тип данных зависит от процедуры)
Процедура выполняется по имени процедуры.
Таблица 9.8 – Операторы структурирования
(только если содержимое аккумулятора BOOL типа данных)
При помощи JMP прыжок к метке может быть ограниченным и неограниченным.
(только если содержимое аккумулятора BOOL типов данных)
Возврат к следующей более высокой организационной единице программы
Каждая подпрограмма и каждый DFB (производный функциональный блок) покидается после выполнения, т.е. происходит возврат к основной вызывающей программе.
Если подпрограмма/DFB покидается преждевременно, возврат к основной программе может форсироваться, используя RET (Возврат).
RET может использоваться только в подпрограммах или DFBs. Они не могут использоваться в основной программе.
редактирование отложенных операций
При помощи закрывающей скобки ) начинается выполнение восстановленного оператора. Число закрывающих скобок должно быть равно числу открывающих скобок. Скобки могут быть вложенными.
Пример: В примере E = 1, если C и/или D = 1 и A и B = 1.
Метки служат целями для прыжков.
Метки всегда должны быть первыми элементами в строке.
Имя должно быть свободным в пределах директории и не является чувствительным к регистру.
Метки могут быть 32 символа длиной (максимум).
Метки должны соответствовать IEC соглашениям об именовании.
Метки отделяются двоеточием : от следующей инструкции.
Метки разрешены только в начале»Выражений», иначе в батарее может быть обнаружено неопределенное значение.
При помощи JMP прыжок к метке может быть ограниченным или неограниченным.
JMP может использоваться с модификаторами C и CN (только если содержимое батарей типа данных BOOL).
Прыжки могут производится в пределах программы и секций DFB.
Прыжки возможны только в текущей секции.
Возможные места назначения:
первая LD инструкция вызова EFB/DFB с присваиванием входных параметров (см. start2),
нормальная LD инструкция (см. start1),
CAL инструкция, которая не работает с присваиванием входных параметров (см. start3),
JMP инструкция (см. start4),
конец списка инструкций (см. start5).
start3: CAL counter (
start4: JMPC start1
Команда VAR предназначена для объявления используемых функциональных блоков и для объявления прямых адресов, если они не должны использоваться с заданным по умолчанию типом данных. В пакете Concept команда VAR не может применяться для объявления переменных. Объявление переменных очень легко выполняется через редактор переменных.
Команда END_VAR идентифицирует конец объявления.
Команда VAR. END_VAR вводится только один раз в начале секции. Все блоки FB/DFB и используемые прямые адреса, которые отличаются от заданного по умолчанию типа данных, должны быть здесь объявлены.
Объявление блоков FB/DFB и прямых адресов применяется только к текущей секции. Если тот же самый тип FFB или тот же самый адрес должен также использоваться в другой секции, тип FFВ или адрес соответственно должен быть объявлен снова в этой секции.
Объявление функциональных блоков и блоков DFB. Перед вызовом функционального блока или блока DFB он должен быть объявлен с использованием команд VAR и END_VAR. В этом объявлении каждому применяемому экземпляру блока FB/DFB назначается имя. Имя экземпляра должно быть уникально для всего проекта; нет никакого различия между заглавными или строчными буквами. Имя экземпляра должно удовлетворять соглашениям стандарта по имени в противном случае появится сообщение об ошибках.
Тип функционального блока, например CTD_DINT, ROL_WORD, SIN_REAL, будет введен после имени экземпляра.
Для обобщенных типов функциональных блоков (например, MUX, SEL) не имеется никакого обозначения типа данных. Оно будет определено типом данных фактических параметров. Если фактические параметры состоят из литералов, для функционального блока будет принят тип данных INT.
Любое число имен экземпляра может быть объявлено для блоков FB/DFB.
Пример объявления функциональных блоков и DFB приведен на рисунке 9.2.
Рисунок 9.2 – Объявление функциональных блоков и DFB
Объявление прямых адресов. В этом объявлении каждому используемому прямому адресу, который имеет тип данных, отличающийся от заданного по умолчанию типа данных, назначается тип данных по выбору.
Пример объявление прямых адресов приведен на рисунке 9.3.
Рисунок 9.3 – Объявление прямых адресов
Вызовы функциональных блоков и блоков DFB. Чтобы найти имена доступных функциональных блоков и блоков DFB, нужно обратиться к библиотекам блоков. Существуют три способа для вызова функционального блока и блока DFB:
оператором с CAL и списком входных параметров;
оператором CAL и загрузкой или сохранением входных параметров;
с помощью входных операторов.
Если функциональный блок не имеет входов или входы не будут параметрированы, функциональный блок должен все равно вызываться прежде, чем его выходы могут использоваться.
Каждый экземпляр FB/DFB может вызываться только один раз.
Оператор CAL со списком входных параметров. Функциональные блоки и DFB могут вызываться командой, состоящей из команды CAL, следующей за именем экземпляра FB/DFB и списка распределения значений (фактических параметров) к формальным параметрам в круглых скобках. Порядок распечатки формальных параметров в обращении функционального блока не имеет значения. Список фактических параметров может иметь конец строки сразу же после запятой. Не требуется, чтобы всем формальным параметрам были присвоены значения. Если формальному параметру не задано значение, начальное значение, определенное в редакторе переменных, будет использоваться при выполнении функционального блока. Если начальное значение не было определено, будет использоваться значение по умолчанию (0).
Команда CAL (..) завершает назначение параметров функционального блока и DFB. После этого передача значений в FB/DFB больше невозможна. Теперь могут считываться только выходные значения.
Примеры CAL со списком входных параметров приведены на рисунках 9.4 и 9.5
Рисунок 9.4 – Пример использования команды CAL (вариант 1)
Рисунок 9.5 – Пример использования команды CAL (вариант 2)
Оператор CAL с загрузкой и сохранением входных параметров. Функциональные блоки и DFB могут вызываться списком команд, состоящим из команд загрузки фактических параметров, сохранения в формальных параметрах и вызова команды CAL. Порядок загрузки и сохранения параметров не имеет значения. Не требуется, чтобы всем формальным параметрам были заданы значения. Если формальному параметру не присвоено значение, начальное значение, определенное в редакторе переменных, будет использоваться при выполнении функционального блока. Если начальное значение не было определено, будет использоваться значение по умолчанию (0).
Команда CAL FBNAME завершает назначение параметров функциональных блоков и DFB. После этого передача значения этих параметров в блок FB/DFB больше невозможна. Теперь могут считываться лишь их выходные значения.
Только команды загрузки и сохранения для текущих назначений параметров FB/DFB позволяются между первой командой загрузки фактического параметра и вызовом функционального блока и блока DFB. Никакие другие команды не разрешаются в этом состоянии.
Примеры команды CAL с загрузкой и сохранением входных параметров приведены на рисунке 9.6.
Рисунок 9.6 – Пример команды CAL с загрузкой и сохранением входных параметров
Использование входных операторов. Функциональные блоки могут вызываться списком команд, состоящим из команд загрузки фактических параметров, сохранения в формальны параметры, входного оператора. Порядок загрузки и сохранения параметров не имеет значения. Список фактических параметров может иметь конец строки сразу же после запятой. Не требуется, чтобы всем формальным параметрам были заданы значения. Если формальному параметру не задано значение, начальное значение, определенное в редакторе переменных, будет использоваться при выполнении функционального блока. Если начальное значение не было определено, будет использоваться значение по умолчанию (0).
Возможные входные операторы для различных функциональных блоков находятся по таблице 9.9. Никакие другие входные операторы не доступны.
- Язык программирования ibm как называется
- Язык программирования intellij idea