6. Выражения
Данная глава описывает, как составлять SCIL-выражения с помощью операторов различных типов:
6.1 Общие принципы.
6.2 Арифметические операторы.
6.3 Операторы отношения.
6.4 Логические операторы.
6.1 Общие принципы
Использование
В языке программирования SCIL выражения используются следующим образом:
- Для присвоения значений (объектам, атрибутам, переменным)
- В качестве аргументов для функций и команд.
- В качестве операндов в выражениях.
Используя SCIL-выражения, можно обращаться к данным приложения MicroSCADA из внешних Windows-приложений через DDE-протокол.
Структура
Выражения составляются из операндов и операторов (возможно заключение в круглые скобки). Операторы – это символы операций (например +: сложение). Операнды образуют реальные операции.
Операнды
В качестве операндов могут использоваться:
- Константы
- Переменные (Глава 5)
- Обозначения объектов системы и объектов приложений (атрибуты)
- Атрибуты Visual SCIL и атрибуты окон
- Вызовы функции (Глава 8).
- Векторные множества (Раздел 3.9).
- Вызовы именованных программ и методов (при условии, что они возвращают значение)
- Выражения, заключенные в круглые скобки.
Самый простой тип выражения - одиночный операнд, который может быть константой, например, текстовой.
Типы данных операндов определяют, какие операции могут быть выполнены над ними, с какими типами данных они могут быть скомбинированы и какой будет результат. Правила совместимости данных для каждого оператора приведены в таблицах ниже. Операнды типа 'список' не могут использоваться с каким-либо оператором. Они могут быть только одиночными. Поэтому тип данных ‘список’ пропущен из таблиц правил совместимости. Тип данных выражения может быть считан с помощью функции DATA_TYPE (смотрите Главу 8).
Операторы
Имеются три типа операторов SCIL:
- Арифметические операторы
- Операторы отношения
- Логические операторы
В выражениях SCIL они оцениваются в вышеприведенном порядке приоритетов.
Операторы и их использование описаны в следующих разделах.
Достоверность данных
В SCIL все данные имеют код состояния, который выражает достоверность данных. Как правило, когда выражение вычислено, оно получает код состояния наименее надежного операнда. Данные, подробно записанные программистом или введенные пользователем, всегда имеют состояние OK. Плохой код состояния может быть вызван значением объекта процесса, которое было отмечено как устаревший из-за неисправности связи.
Код состояния выражения может быть считан и записан функциями GET_STATUS SCIL и SET_STATUS. Коды состояния перечислены в руководстве «Коды состояния».
6.2 Арифметические операторы
Использование
Арифметические операторы используются для числовых вычислений. В качестве операндов должны выступать численные значения, кроме операции сложения, которая допускает также текстовые операторы, операторы битовой строки и операторы байтовой строки (Таблица 2).
Операторы
SCIL имеет следующие арифметические операторы:
| + |
сложение, знак плюс |
| - |
вычитание, знак минус |
| * |
умножение |
| / |
деление |
| ** |
оператор возведения в степень |
| DIV |
целочисленное деление, остаток отбрасывается |
| MOD |
оператор модуля (остаток от целочисленного деления, если операторы положительные). |
Операторы DIV и MOD должны быть окружены пробелами. Для других операторов пробелы не обязательны.
Порядок приоритетов
Порядок приоритетов для арифметических операторов, т.е. порядок вычисления различных частей выражения, не отличается от порядка, принятого в математике. Порядок приоритетов следующий (операторы с самым высоким приоритетом идут первыми):
- **
- / , * , DIV , MOD
- + , -
Операции с одинаковым приоритетом вычисляются слева направо. Если выражение содержит круглые скобки, оно вычисляется в первую очередь.
Правила совместимости
Ниже приведены правила о том, какие типы данных могут быть объединены посредством арифметических операторов и каков тип данных результирующего выражения.
| Addition,+: |
| I=Integer |
| R=Real |
| B=Bolean |
| T=Time |
| C=Text |
| S=Bit String |
| V=Vector |
| -=Not allowed |
|
| |
I |
R |
B |
T |
C |
S |
V |
| I |
I |
R |
- |
- |
T |
- |
V |
| R |
R |
R |
- |
- |
R |
- |
V |
| B |
- |
- |
- |
- |
- |
- |
- |
| T |
- |
- |
- |
- |
- |
- |
V |
| C |
- |
- |
- |
- |
C |
- |
V |
| S |
- |
- |
- |
- |
- |
S |
V |
| V |
V |
V |
- |
V |
V |
V |
V |
|
Таблица 2. Правила сложения
| Subtraction,-: |
| I=Integer |
| R=Real |
| B=Bolean |
| T=Time |
| C=Text |
| S=Bit String |
| V=Vector |
| -=Not allowed |
|
| |
I |
R |
B |
T |
C |
S |
V |
| I |
I |
R |
- |
- |
- |
- |
V |
| R |
R |
R |
- |
- |
- |
- |
V |
| B |
- |
- |
- |
- |
- |
- |
- |
| T |
T |
T |
- |
I |
- |
- |
V |
| C |
- |
- |
- |
- |
- |
- |
- |
| S |
- |
- |
- |
- |
- |
- |
- |
| V |
V |
V |
- |
V |
- |
- |
V |
|
Таблица 3. Правила вычисления
Как видно из Таблиц 2 и 3, текстовые данные могут быть добавлены к текстовым данным. Соответствующее вычитание невозможно.
Имеется возможность сложения или вычитания из данных времени целых или вещественных чисел, которые затем будут восприняты как количество секунд. Полученный результат имеет тип данных времени. При сложении данных времени с целым числом результат является данными времени, а при сложении с вещественным числом, результат является вещественным числом.
При вычитании двух выражений данных времени, результат является целым числом, определяющим разницу времени в секундах. Следовательно, эта разность не может использоваться в операциях, требующих данные времени.
Если целочисленное значение, вещественное значение или значение времени добавляется или вычитается в/из вектора (или наоборот), значение добавляется или вычитается из каждого элемента вектора. При сложении или вычитании векторов, операция производится поэлементно. Для элементов применяются те же правила, что и для простых типов данных. Если один из элементов имеет плохое состояние (не OK), то результирующему элементу присваивается состояние SUSPICIOUS_STATUS. Если количество элементов не совпадает с количеством элементов в векторе-операнде, то отсутствующие элементы воспринимаются как нули, а лишние элементы получают статус SUSPICIOUS_STATUS.
При сложении двух битовых строк, слева будет прикреплен левый операнд, а справа – правый. При сложении двух байтовых строк, они соединяются таким же образом. Если результат больше, чем 1048576 байтов, переполнившиеся байты теряются.
Положительный и отрицательный знаки не изменяют типы данных тех значений, к которым они относятся. Знаки не могут использоваться с булевыми значениями, значениями времени или текстовыми значениями.
| Multiplication,*: |
| I=Integer |
| R=Real |
| B=Bolean |
| T=Time |
| C=Text |
| S=Bit String |
| V=Vector |
| -=Not allowed |
|
| |
I |
R |
B |
T |
C |
S |
V |
| I |
I |
R |
- |
- |
- |
- |
V |
| R |
R |
R |
- |
- |
- |
- |
V |
| B |
- |
- |
- |
- |
- |
- |
- |
| T |
- |
- |
- |
- |
- |
- |
- |
| C |
- |
- |
- |
- |
- |
- |
- |
| S |
- |
- |
- |
- |
- |
- |
- |
| V |
V |
V |
- |
- |
- |
- |
V |
|
Таблица 4. Правила умножения
| Division,/: |
| I=Integer |
| R=Real |
| B=Bolean |
| T=Time |
| C=Text |
| S=Bit String |
| V=Vector |
| -=Not allowed |
|
| |
I |
R |
B |
T |
C |
S |
V |
| I |
R |
R |
- |
- |
- |
- |
V |
| R |
R |
R |
- |
- |
- |
- |
V |
| B |
- |
- |
- |
- |
- |
- |
- |
| T |
- |
- |
- |
- |
- |
- |
- |
| C |
- |
- |
- |
- |
- |
- |
- |
| S |
- |
- |
- |
- |
- |
- |
- |
| V |
V |
V |
- |
- |
- |
- |
- |
|
Таблица 5. Правила деления
При умножении или делении вектора на целое или вещественное число (Таблицы 3 и 4), операция производится над каждым элементом в векторе.
При умножении вектора на вектор, операция производится между соответствующими элементами. Для элементов действуют те же правила, что и для простых типов данных. Если количество элементов в векторах неодинаково, лишние элементы умножаются на единицу, а результирующий элемент получает статус SUSPICIOUS_STATUS.
Вектор не может быть разделен на другой вектор.
В случаях, когда один из операндов (Таблица 6) является вектором, операция выполняется над каждым элементом вектора. Для элементов вектора действуют те же правила, что и для простых типов данных.
| Integer operators DIV and MOD; |
| I=Integer |
| R=Real |
| B=Bolean |
| T=Time |
| C=Text |
| S=Bit String |
| V=Vector |
| -=Not allowed |
|
| |
I |
R |
B |
T |
C |
S |
V |
| I |
I |
- |
- |
- |
- |
V |
- |
| R |
- |
- |
- |
- |
- |
- |
- |
| B |
- |
- |
- |
- |
- |
- |
- |
| T |
I |
- |
- |
- |
- |
- |
- |
| C |
- |
- |
- |
- |
- |
- |
- |
| S |
- |
- |
- |
- |
- |
- |
- |
| V |
V |
- |
- |
- |
- |
- |
- |
|
Таблица 6. Правила для DIV и MOD
| Exponential operator,**; |
| I=Integer |
| R=Real |
| B=Bolean |
| T=Time |
| C=Text |
| S=Bit String |
| V=Vector |
| -=Not allowed |
|
| |
I |
R |
B |
T |
C |
S |
V |
| I |
R |
R |
- |
- |
- |
- |
- |
| R |
R |
R |
- |
- |
- |
- |
- |
| B |
- |
- |
- |
- |
- |
- |
- |
| T |
I |
- |
- |
- |
- |
- |
- |
| C |
- |
- |
- |
- |
- |
- |
- |
| S |
- |
- |
- |
- |
- |
- |
- |
| V |
V |
- |
- |
- |
- |
- |
- |
|
Таблица 7. Правила возведения в степень
Примеры
Ниже приведены некоторые примеры выражений, составленных из арифметических операторов. Операторы битовых строк записаны здесь с помощью функции BIT_SCAN, которая преобразует текстовый аргумент в строку битов. Результат сложения является строкой битов, следовательно, он не может быть прочитан напрямую, а только посредством функции BIN.
| Выражение |
Результат |
| "A" + "B" |
"AB" |
| 3**2 |
9.0 |
| 5 DIV 2 |
2 |
| 5 MOD 2 |
1 |
| 2*3 + 4/2 |
8.0 |
| (2*3 + 4)/2 |
5.0 |
| BIT_SCAN("0101") + BIT_SCAN("0011") |
"01010011" (чтение функцией BIN) |
6.3 Операторы отношения
Использование
Операторы отношения используются для сравнения выражений. Результат сравнения всегда является булевым значением, т.е. либо отношение может быть либо TRUE (истина), либо FALSE (ложь).
Операторы
В SCIL имеются следующие операторы отношения:
| = = |
равно |
| > |
больше |
| < |
меньше |
| < > |
не равно |
| < = |
меньше или равно |
| > = |
больше или равно |
Операторы отношения имеют более низкий приоритет по сравнению с арифметическими операторами. Соответственно, арифметические выражения будут вычисляться до того, как выполнятся сравнения.
Правила совместимости
Таблица 8 представляет правила, какие типы данных могут сравниваться операторами отношения.
| Relational operators: |
| I=Integer |
| R=Real |
| B=Bolean |
| T=Time |
| C=Text |
| S=Bit String |
| V=Vector |
| -=Not allowed |
|
| |
I |
R |
B |
T |
C |
S |
V |
| I |
B |
B |
- |
B |
- |
- |
- |
| R |
B |
B |
- |
B |
- |
- |
- |
| B |
- |
- |
B |
- |
- |
- |
- |
| T |
B |
B |
- |
B |
- |
- |
- |
| C |
- |
- |
- |
- |
B |
- |
- |
| S |
- |
- |
- |
- |
- |
B |
- |
| V |
- |
- |
- |
- |
- |
- |
- |
|
Таблица 8. Правила для операторов отношения
Сравнение текстовых выражений основано на том, что каждый символ соответствует числу в диапазоне 0…255. Символы упорядочены так, что цифры (0...9) предшествуют буквам. Буквы размещаются в алфавитном порядке (за исключением шведского A, которому предшествует A). Буквы верхнего регистра предшествуют буквам нижнего регистра.
Логические значения и текст могут сравниваться только со значениями того же типа данных. Данные времени могут сравниваться с данными времени, целыми и вещественными значениями.
Строки битов сравниваются побитно, начиная с крайнего левого, который является самым старшим битом. 1 больше чем 0, и существующий бит (0 или 1) больше чем несуществующий бит.
Строки байтов могут сравниваться операторами отношения. Строки байтов сравниваются, в числовой форме побайтно (каждый байт имеет значение 0 ... 255), первый байт является старшим. Если две строки байтов различных длин идентичны на их общей части, кратчайшая рассматривается как 'меньшая'.
К векторам не могут быть применены операторы отношения.
Примеры
Ниже даются некоторые примеры выражений, содержащих операторы отношения.
| Выражение |
Результат |
| "B" > "A" |
TRUE |
| %A - 30 == 0 |
TRUE, если %A = 30 |
| OBJ:PRT + 60 > CLOCK |
TRUE, пока с последней регистрации времени прошло меньше одной минуты |
| BIT_SCAN("0011") < BIT_SCAN("0101") |
TRUE |
| BIT_SCAN("0101") < BIT_SCAN("010101") |
TRUE |
| BIT_SCAN("000111") < BIT_SCAN("0101") |
TRUE |
| BIT_SCAN("010100") > BIT_SCAN("0101") |
TRUE |
6.4 Логические операторы
Использование
С помощью логических операторов можно управлять булевыми значениями.
Операторы
В SCIL имеются следующие логические операторы:
| AND |
конъюнкция (соединение), "оба … и" |
| OR |
дизъюнкция (разбиение), "или" |
| XOR |
исключающее или, "один из двух, но не оба" |
| NOT |
логическое отрицание, инверсия |
Логические операторы имеют более низкий приоритет по сравнению с операторами отношения, то есть операторы отношения вычисляются до выполнения логических операций.
Правила совместимости
Все логические операторы требуют операндов булевого типа (boolean). Аналогично, результаты логических операций имеют тип boolean.
В выражении может иметься несколько логических операторов. Но в случаях, когда операторы различаются, связанные логические выражения должны заключаться в скобки. Смотрите следующий пример.
Примеры
Пусть A и B - булевы данные со значениями, показанными слева. Логические операторы дают следующие результаты:
| A |
B |
A AND B |
A OR B |
A XOR B |
NOT A |
| TRUE |
FALSE |
FALSE |
TRUE |
TRUE |
FALSE |
| FALSE |
TRUE |
FALSE |
TRUE |
TRUE |
TRUE |
| TRUE |
TRUE |
TRUE |
TRUE |
FALSE |
FALSE |
| FALSE |
FALSE |
FALSE |
FALSE |
FALSE |
TRUE |
| Неправильно: |
%A == 1 AND %B == 2 OR %C == 3 |
| Правильно: |
(%A == 1 AND %B == 2) OR %C ==3 |
| или |
%A == 1 AND (%B == 2 OR %C == 3) |
Вернуться к оглавлению
По материалам © ABB
|