Text-функция: различия между версиями
Alex (обсуждение | вклад) Нет описания правки |
Alex (обсуждение | вклад) Нет описания правки |
||
| (не показаны 44 промежуточные версии этого же участника) | |||
| Строка 1: | Строка 1: | ||
Text-функции позволяют выполнить | | ||
== Введение == | |||
<pre>Обновление: | |||
04-04-2025 2.7.18 | |||
* дополнительная расшифровка ошибок в текстовом поле | |||
* исправлена ошибка в работе функций в 2.7.17 | |||
04-12-2024 2.7.17 | |||
* возможность размещать функции в подкаталогах | |||
15-09-2023 2.7.14 | |||
* конкретизация значения else | |||
* добавлены дополнительные логи | |||
* поддержка сигнала КУН-2Д.1-УПСЛ-System-ChannelID | |||
* функции pos, postext | |||
24-08-2021 2.7.3 | |||
* функция time - отображение текущего времени | |||
01-12-2020 2.6.4 | |||
* возможность выполнить числовое преобразование входного значения | |||
</pre> | |||
Text-функция ''- ''это обычный текстовый файл (.txt), название которого является названием самой функции. | |||
Функции находятся в папке Tekon \ ASUD Scada \ Scada \ scripts \ text | |||
Text-функции позволяют выполнить в программе SCADA математическое преобразование входного значения: | |||
<pre>Результат = F (Число)</pre> | |||
или преобразование путем сопоставления: | |||
Число = значение | Число = значение | ||
, где: | , где: | ||
*число - это значение Item-a ОРС-сервера, или параметра из БД. | |||
*значение - некоторая строка. | |||
В случае выполнения математического преобразования значение Item может быть целым или десятичной дробью. В случае, если функция выполняет сопоставление, значением Item должно быть целое число. | |||
Подобный функционал в частности реализуют [[Скрипты|Lua-cкрипты]] (и для более сложных задач, выходящих за возможности Text-функций, следует использовать именно их), однако написание Text-функций гораздо проще, они не требуют перезапуска SCADA в случае изменения и работают они несколько быстрее. | |||
Пример: функции func1 - файл func1.txt | |||
<pre>0=Останов | |||
1=Работа | |||
2=Авария ДТ | |||
</pre> | |||
Если значение Item = 1, то функция вернет значение "Работа" и т.д. | |||
1 | |||
Пример функции func2 - файл func2.txt | Пример функции func2 - файл func2.txt | ||
<pre>0=Зима | |||
0=Зима | 1=Лето </pre> | ||
1=Лето | |||
</ | Если по каким-то причинам значение Item, например: 4, не описано в Text-фунции, то функция вернет ошибку. Поэтому, начиная с версии 2.6.4 доступен оператор "else" | ||
Пример функции func3 - файл func3.txt | |||
<pre>0=Зима | |||
1=Лето | |||
else=Не знаю</pre> | |||
Если входное значение функции не [0, 1], то результат будет - "Не знаю" | |||
В версии 2.7.14 добавлена возможность, указать для варианта else значение Item | |||
<pre>0=Зима | |||
1=Лето | |||
else=#var</pre> | |||
В этом случае, если входное значение функции не [0, 1], то результат функции будет, например: при значении Item = 5 | |||
[[File:Textfunc textfield err5.PNG|center|upright|Textfunc textfield err5.PNG]] | |||
Начиная с версии 2.7.18 использование else=#var - не обязательно. | |||
Вы можете использовать коментрий в начале функции, для этого укажите в начале строки знак ?, например: | |||
<pre>? Это комментарий | |||
0=Зима | |||
1=Лето | |||
else=Не знаю</pre> | |||
'''Замечания:''' | |||
*Имя Text-функции в настройках примитивов указывается без ''.txt'', т.е. func1, а не func1.txt | |||
*Имя функции не чувствительно в регистру, т.е. Func1 = func1 = FUNC1 | |||
Text-функции используются, например в примитивах: | |||
*[[Tekon_Scada|Текстовое поле]] | |||
*[[Tekon_Scada|Лифтовая станция]] | |||
*[[Дополнительные_примитивы|Набор изображений]] | |||
*и т.п. | |||
| |||
== Настройка == | |||
Для работы с Text-функциями, в общем случае, '''не следует напрямую''' редактировать файлы в папке Tekon \ ASUD Scada \ Scada \ scripts \ text | |||
Вы можете добавлять / редактировать Text-функции непосредственно в SCADA (при этом для вступления изменений в силу '''не требуется перезапуск SCADA'''), открыв меню ''Дополнительно \ Text-функции'' в режиме Настройки. | |||
[[File:Text func1.JPG|center|upright|Text func1.JPG]] | |||
В открывшемся окне вы можете: | |||
*добавить новую функцию | |||
*изменить существующую функцию | |||
*посмотреть помощь по работе с функциями | |||
При добавлении новой функции следует указать ее имя, например: | |||
*func1 - функция будет сохранена в файле func1.txt | |||
*test\func1 - функция будет сохранена в подкаталоге test в файле func1.txt | |||
После изменения функции следует нажать ''Сохранить''. | |||
'''Внимание! '''Внесенные изменения вступают в силу (отображаются на карте) после закрытия окна редактирования. | |||
Пустая Text-функция (функция с пустым "телом") сохранена не будет. И пропадет после переоткрытия окна. | |||
В случае если в теле функции есть ошибки, программа сообщит об этом. При этом, можно вернуться к предыдущей версии, нажав ''Вернуть''. | |||
Причины ошибок: | |||
*Повтор идентификаторов в нескольких строчках | |||
*Лишние пробелы: например, 0 = Останов (правильно: 0=Останов) | |||
*Лишние пустые строки | |||
*Ошибка в выражении (подробнее см. далее) | |||
| |||
== Привязка к примитиву == | |||
Далее вы указаваете имя Text-функции в настройках примитива, например Текстовое поле. | |||
[[File:Textfunc textfield.PNG|center|upright|Text func1.JPG]]В некоторых случаях, вы можете увидеть ошибку в Текстовом поле после привязки Text-функции | |||
[[File:Textfunc textfield err.PNG|center|upright|Text func1.JPG]] | |||
Причиной ошибки могут быть: | |||
*Отстуствие функции с таким именем (проверьте указанное имя функции) | |||
*Примитив не привязан к тегу | |||
*Ошибка в теле функции (подробнее см. выше) | |||
*Переданное в функцию значение не описано в функции (используйте else в коце функции) | |||
== Дополнительно == | |||
В Text-функции добавлена поддержка [[Выражения|выражений]]. | |||
В случае необходимости вы можете добавить предварительную обработку входного значения Item-a ОРС-сервера. | |||
Выражение задается в первой строке Text-функции начиная с символа '''#''' | |||
| |||
=== Выполнить числовое преобразование значения === | |||
Например, вам нужно выполнить математическое преобразование: Результат = Значение + 10 | |||
Создаем новую функцию с названием, например Plus10, следующего содержания | |||
<pre># X + 10</pre> | |||
, где X - это условное обозначение значения Item-а. | |||
Если входное значение равно 10, то результат функции будет 20. | |||
| |||
=== Выполнить преобразование состояния АКБ КИР-16 === | |||
Создаем новую функцию с названием, например кир_акб, следующего содержания | |||
<pre>0=Норма | |||
1=Отсутствует | |||
3=Замкнут | |||
4=Заряжается | |||
7=Питание от АКБ | |||
else=#var</pre> | |||
=== Функция BIT === | |||
Проанализировать указанный бит значения связанного Item-a ОРС-сервера. | |||
Тело функции: | |||
<pre># BIT(X;1) | |||
0=Норма | |||
1=Авария | |||
</pre> | |||
, где X - это условное обозначение значения Item-а. | |||
Нумерация бит 32, 31, ..., 1 (1 - младший). | |||
Если значение Item = 2, то: | |||
*BIT (X;1) = 0, | |||
*BIT(X,2) = 1. | |||
Допускается сокращенная запись BIT(1) == BIT(X;1) | |||
=== Функция BITS === | |||
Проанализировать несколько бит, начиная с указанного. | |||
Тело функции: | |||
<pre># BITS(X;1;2) | |||
0=Норма | |||
1=Авария | |||
2=Авария2 | |||
3=Авария3 </pre> | |||
, где X - это условное обозначение Item-а. | |||
При использовании данной функции будут браться 2-а бита, начиная с 1-го. | |||
Если значение Item = 5, то BITS (X;2;1) = 1. | |||
Допускается сокращенная запись BITS(2;1) == BIT(X;2;1) | |||
=== Функция BITSTR === | |||
Собрать строку, проверив факт установки каждого бита значения Item-a. | |||
Тело функции: | |||
<pre># BITSTR() | |||
0=Норма | |||
1=Авария | |||
2=Авария2 | |||
3=Авария3 </pre> | |||
, где X - это условное обозначение Item-а. | |||
Если значение Item = 5 (это в двоичной системе 0101 - т.е. установлен 1 и 3 биты), то результатом BITSTR() будет строка: | |||
<pre>Авария | |||
Авария3 </pre> | |||
В скобах может быть указан символ разделитель строк (по умолчанию: перевод строки), например: если значение Item = 5, то результатом BITSTR(, ) будет строка: | |||
<pre>Авария, Авария3 </pre> | |||
=== Функция TIME === | |||
Отобразить текущее время. | |||
Тело функции: | |||
<pre># TIME (dd.mm.yy hh:mm:ss) </pre> | |||
Функцию имеет смысл использовать с примитивом Текстовое поле, связав его со служебной переменной "VAR.Timer1Sec". | |||
Для реализации более сложного функционала обработки входного значения Item-а смотрит документацию на [[Переменные|Переменные]]. | |||
| |||
=== Функция POS, POSTEXT, POSINV, POSTEXTINV === | |||
Доступна с версии 2.7.14 | |||
Найти подстроку в строке. | |||
Функция имеет смысл в связке с Item типа: | |||
*строка | |||
*массив строк | |||
Тело функции: | |||
<pre># POS (значение) | |||
0=не найдено | |||
1=найдено | |||
</pre> | |||
Если значение Item = 'Какое то тествое значение', то результатом POS (значение) будет : 'найдено'. | |||
Функция POSTEXT - аналогична POS, но не чувствительна к регистру. | |||
Функции с окончанием на *INV работают инверсивно, т.е. если значение не найдено выдают 1, 0 - иначе. | |||
<pre># POSINV (значение) | |||
0=найдено | |||
1=не найдено</pre> | |||
Функции могут применяться, например с примитивом [[Дополнительные_примитивы|Набор изображений]]. | |||
| |||
| |||
=== Функция подставновки значения из файла FILE_P === | |||
Доступно с версии 2.3.7 | |||
Функция позволяет определить значение результат по исходному значению, при этом связь значений описана в файле подстановок. | |||
Файл подстановок имеет следующий вид: | |||
*входное значение = результат | |||
Важно: | |||
*данные должны расположены от большего входного значения к меньшему | |||
*входное значение и результат - целые числа | |||
Например: файл датчика температуры NTC10K (зависимость температуры от выходного сопротивления датчика) | |||
<pre>66783=-50 | |||
33567=-40 | |||
17668=-30 | |||
9679=-20 | |||
5530=-10 | |||
3265=0 | |||
1990=10 | |||
1249=20 | |||
1000=25 | |||
806=30 | |||
532=40 | |||
360=50 | |||
249=60 | |||
175=70 | |||
126=80 | |||
92=90 | |||
68=100 | |||
51=110 | |||
39=120 | |||
30=130 | |||
23=140 | |||
18=150</pre> | |||
Файл подстановок должен быть сохранен в папку settings\ с именем table_N.txt, где N - число 1,2,3 и т.д. | |||
Тело функции: | |||
<pre># FILE_P(1;X) </pre> | |||
, где 1 - это N в имени файла table_1.txt | |||
== Известные проблемы == | |||
В версии 2.7.17 не работают простые Text-фунции вида | |||
<pre>0=Норма | |||
1=Авария</pre> | |||
выполните обновление на 2.7.18 | |||
[[Category:SCADA]] | |||
Текущая версия от 10:50, 29 сентября 2025
Введение
Обновление: 04-04-2025 2.7.18 * дополнительная расшифровка ошибок в текстовом поле * исправлена ошибка в работе функций в 2.7.17 04-12-2024 2.7.17 * возможность размещать функции в подкаталогах 15-09-2023 2.7.14 * конкретизация значения else * добавлены дополнительные логи * поддержка сигнала КУН-2Д.1-УПСЛ-System-ChannelID * функции pos, postext 24-08-2021 2.7.3 * функция time - отображение текущего времени 01-12-2020 2.6.4 * возможность выполнить числовое преобразование входного значения
Text-функция - это обычный текстовый файл (.txt), название которого является названием самой функции.
Функции находятся в папке Tekon \ ASUD Scada \ Scada \ scripts \ text
Text-функции позволяют выполнить в программе SCADA математическое преобразование входного значения:
Результат = F (Число)
или преобразование путем сопоставления:
Число = значение
, где:
- число - это значение Item-a ОРС-сервера, или параметра из БД.
- значение - некоторая строка.
В случае выполнения математического преобразования значение Item может быть целым или десятичной дробью. В случае, если функция выполняет сопоставление, значением Item должно быть целое число.
Подобный функционал в частности реализуют Lua-cкрипты (и для более сложных задач, выходящих за возможности Text-функций, следует использовать именно их), однако написание Text-функций гораздо проще, они не требуют перезапуска SCADA в случае изменения и работают они несколько быстрее.
Пример: функции func1 - файл func1.txt
0=Останов 1=Работа 2=Авария ДТ
Если значение Item = 1, то функция вернет значение "Работа" и т.д.
Пример функции func2 - файл func2.txt
0=Зима 1=Лето
Если по каким-то причинам значение Item, например: 4, не описано в Text-фунции, то функция вернет ошибку. Поэтому, начиная с версии 2.6.4 доступен оператор "else"
Пример функции func3 - файл func3.txt
0=Зима 1=Лето else=Не знаю
Если входное значение функции не [0, 1], то результат будет - "Не знаю"
В версии 2.7.14 добавлена возможность, указать для варианта else значение Item
0=Зима 1=Лето else=#var
В этом случае, если входное значение функции не [0, 1], то результат функции будет, например: при значении Item = 5
Начиная с версии 2.7.18 использование else=#var - не обязательно.
Вы можете использовать коментрий в начале функции, для этого укажите в начале строки знак ?, например:
? Это комментарий 0=Зима 1=Лето else=Не знаю
Замечания:
- Имя Text-функции в настройках примитивов указывается без .txt, т.е. func1, а не func1.txt
- Имя функции не чувствительно в регистру, т.е. Func1 = func1 = FUNC1
Text-функции используются, например в примитивах:
Настройка
Для работы с Text-функциями, в общем случае, не следует напрямую редактировать файлы в папке Tekon \ ASUD Scada \ Scada \ scripts \ text
Вы можете добавлять / редактировать Text-функции непосредственно в SCADA (при этом для вступления изменений в силу не требуется перезапуск SCADA), открыв меню Дополнительно \ Text-функции в режиме Настройки.
В открывшемся окне вы можете:
- добавить новую функцию
- изменить существующую функцию
- посмотреть помощь по работе с функциями
При добавлении новой функции следует указать ее имя, например:
- func1 - функция будет сохранена в файле func1.txt
- test\func1 - функция будет сохранена в подкаталоге test в файле func1.txt
После изменения функции следует нажать Сохранить.
Внимание! Внесенные изменения вступают в силу (отображаются на карте) после закрытия окна редактирования.
Пустая Text-функция (функция с пустым "телом") сохранена не будет. И пропадет после переоткрытия окна.
В случае если в теле функции есть ошибки, программа сообщит об этом. При этом, можно вернуться к предыдущей версии, нажав Вернуть.
Причины ошибок:
- Повтор идентификаторов в нескольких строчках
- Лишние пробелы: например, 0 = Останов (правильно: 0=Останов)
- Лишние пустые строки
- Ошибка в выражении (подробнее см. далее)
Привязка к примитиву
Далее вы указаваете имя Text-функции в настройках примитива, например Текстовое поле.
В некоторых случаях, вы можете увидеть ошибку в Текстовом поле после привязки Text-функции
Причиной ошибки могут быть:
- Отстуствие функции с таким именем (проверьте указанное имя функции)
- Примитив не привязан к тегу
- Ошибка в теле функции (подробнее см. выше)
- Переданное в функцию значение не описано в функции (используйте else в коце функции)
Дополнительно
В Text-функции добавлена поддержка выражений.
В случае необходимости вы можете добавить предварительную обработку входного значения Item-a ОРС-сервера.
Выражение задается в первой строке Text-функции начиная с символа #
Выполнить числовое преобразование значения
Например, вам нужно выполнить математическое преобразование: Результат = Значение + 10
Создаем новую функцию с названием, например Plus10, следующего содержания
# X + 10
, где X - это условное обозначение значения Item-а.
Если входное значение равно 10, то результат функции будет 20.
Выполнить преобразование состояния АКБ КИР-16
Создаем новую функцию с названием, например кир_акб, следующего содержания
0=Норма 1=Отсутствует 3=Замкнут 4=Заряжается 7=Питание от АКБ else=#var
Функция BIT
Проанализировать указанный бит значения связанного Item-a ОРС-сервера.
Тело функции:
# BIT(X;1) 0=Норма 1=Авария
, где X - это условное обозначение значения Item-а.
Нумерация бит 32, 31, ..., 1 (1 - младший).
Если значение Item = 2, то:
- BIT (X;1) = 0,
- BIT(X,2) = 1.
Допускается сокращенная запись BIT(1) == BIT(X;1)
Функция BITS
Проанализировать несколько бит, начиная с указанного.
Тело функции:
# BITS(X;1;2) 0=Норма 1=Авария 2=Авария2 3=Авария3
, где X - это условное обозначение Item-а.
При использовании данной функции будут браться 2-а бита, начиная с 1-го.
Если значение Item = 5, то BITS (X;2;1) = 1.
Допускается сокращенная запись BITS(2;1) == BIT(X;2;1)
Функция BITSTR
Собрать строку, проверив факт установки каждого бита значения Item-a.
Тело функции:
# BITSTR() 0=Норма 1=Авария 2=Авария2 3=Авария3
, где X - это условное обозначение Item-а.
Если значение Item = 5 (это в двоичной системе 0101 - т.е. установлен 1 и 3 биты), то результатом BITSTR() будет строка:
Авария Авария3
В скобах может быть указан символ разделитель строк (по умолчанию: перевод строки), например: если значение Item = 5, то результатом BITSTR(, ) будет строка:
Авария, Авария3
Функция TIME
Отобразить текущее время.
Тело функции:
# TIME (dd.mm.yy hh:mm:ss)
Функцию имеет смысл использовать с примитивом Текстовое поле, связав его со служебной переменной "VAR.Timer1Sec".
Для реализации более сложного функционала обработки входного значения Item-а смотрит документацию на Переменные.
Функция POS, POSTEXT, POSINV, POSTEXTINV
Доступна с версии 2.7.14
Найти подстроку в строке.
Функция имеет смысл в связке с Item типа:
- строка
- массив строк
Тело функции:
# POS (значение) 0=не найдено 1=найдено
Если значение Item = 'Какое то тествое значение', то результатом POS (значение) будет : 'найдено'.
Функция POSTEXT - аналогична POS, но не чувствительна к регистру.
Функции с окончанием на *INV работают инверсивно, т.е. если значение не найдено выдают 1, 0 - иначе.
# POSINV (значение) 0=найдено 1=не найдено
Функции могут применяться, например с примитивом Набор изображений.
Функция подставновки значения из файла FILE_P
Доступно с версии 2.3.7
Функция позволяет определить значение результат по исходному значению, при этом связь значений описана в файле подстановок.
Файл подстановок имеет следующий вид:
- входное значение = результат
Важно:
- данные должны расположены от большего входного значения к меньшему
- входное значение и результат - целые числа
Например: файл датчика температуры NTC10K (зависимость температуры от выходного сопротивления датчика)
66783=-50 33567=-40 17668=-30 9679=-20 5530=-10 3265=0 1990=10 1249=20 1000=25 806=30 532=40 360=50 249=60 175=70 126=80 92=90 68=100 51=110 39=120 30=130 23=140 18=150
Файл подстановок должен быть сохранен в папку settings\ с именем table_N.txt, где N - число 1,2,3 и т.д.
Тело функции:
# FILE_P(1;X)
, где 1 - это N в имени файла table_1.txt
Известные проблемы
В версии 2.7.17 не работают простые Text-фунции вида
0=Норма 1=Авария
выполните обновление на 2.7.18