Использование формул
Формулы применяются для расчёта значений и статусов входных каналов, а также для расчёта значений команд управления. Обработка формул выполняется программой Сервер.
Выполняемые формулы вводятся в базу конфигурации в таблицы Входные каналы и Каналы управления в столбец Формула. Чтобы расчёт по формуле для какого-либо канала выполнялся, необходимо установить для него галочку в столбце Исп. формулу. Таблица Формулы базы конфигурации содержит дополнительные функции и структуры данных, которые могут быть использованы в формулах для входных каналов и каналов управления.
Правила написания формул
Общие правила написания и использования формул:
- Формулы записываются согласно синтаксису математических выражений языка C#. Доступны различные классы .NET, например, Math, DateTime.
- База конфигурации позволяет добавлять новые константы, поля, свойства и методы, которые становятся доступны в формулах.
- Если хотя бы одна из формул содержит ошибку, работа Сервера невозможна. Информация об ошибках в формулах выводится в журнал приложения.
Правила вычисления формул входных каналов:
- Расчёт по формулам для каналов типа Телесигнал и Телеизмерение выполняется только при получении сервером новых данных по этим каналам. Используйте эти типы каналов, если формула не ссылается на данные других каналов.
- Расчёт по формулам для каналов типа Дорасчётный * и Кол-во переключений выполняется постоянно. Последовательность расчёта – от меньших номеров каналов к большим. Дорасчётные типы каналов используются, если значение и статус канала вычисляются на основе данных других каналов.
- Расчёт по формулам для каналов типа Минутный * и Часовой * выполняется периодически один раз в минуту или один раз в час соответственно. Используйте эти типы каналов для реализации различных счётчиков, например, потребляемой энергии или времени наработки.
- Статус канала после вычисления по формуле для каналов типа Телесигнал и Телеизмерение равен статусу переданных Серверу данных, если расчёт статуса не задан в формуле явно.
- Для каналов других типов устанавливается статус Параметр определён, если расчёт статуса не задан в формуле явно.
- Формула, заданная для входного канала в базе конфигурации и не содержащая символа ";", определяет расчёт значения канала.
- Если формула содержит символ «;», то она разбивается на две части: первая часть определяет расчёт значения канала, вторая часть – расчёт статуса канала.
- Если для канала заданы границы, то статус канала пересчитывается с учётом границ после вычисления формулы канала.
- Формула для расчёта значения канала должна возвращать вещественное число типа double, а формула для расчёта статуса - целое число типа int.
Правила вычисления формул каналов управления:
- Формула, заданная для канала управления в базе конфигурации, применяется для каналов управления с типом команды Стандартная или Бинарная.
- Формула для расчёта значения стандартной команды должна возвращать вещественное число типа double, а формула для расчёта данных бинарной команды - массив байт типа byte[].
Существующие формулы
Переменные, доступные в формулах:
Переменная | Тип значения | Описание |
---|---|---|
CnlVal, Cnl | double | Передаваемое Серверу значение входного канала до расчёта |
CnlStat | int | Передаваемый Серверу статус входного канала до расчёта |
CmdVal, Cmd | double | Передаваемое Серверу значение команды управления |
CmdData | byte[] | Передаваемые Серверу данные команды управления |
CnlNum | int | Номер канала, формула которого вычисляется |
E | double | Число e |
PI | double | Число π |
Функции, доступные в формулах:
Функция | Тип значения | Описание |
---|---|---|
N(n) | int | Возвращает номер заданного канала для обновления номеров при клонировании |
Val() | double | Текущее значение входного канала вычисляемой формулы |
Val(n) | double | Текущее значение входного канала n |
SetVal(n, val) | double | Установить текущее значение входного канала n |
Stat() | int | Текущий статус входного канала вычисляемой формулы |
Stat(n) | int | Текущий статус входного канала n |
SetStat(n, stat) | int | Установить текущий статус входного канала n |
SetData(n, val, stat) | double | Установить текущее значение и статус входного канала n |
Abs(x) | double | Модуль |
Sin(x) | double | Синус |
Cos(x) | double | Косинус |
Tan(x) | double | Тангенс |
Exp(x) | double | Экспонента |
Ln(x), Log(x) | double | Натуральный логарифм |
Sqr(x) | double | Квадрат числа |
Sqrt(x) | double | Квадратный корень |
Дополнительные формулы, в том числе формулы для работы со средними значениеми, доступны на GitHub.
Отладка формул
При разработке собственных формул необходимо обеспечивать корректность синтаксиса формул и правильность их работы. Если службе Сервера при запуске не удалось скомпилировать формулы, информация об ошибке выводится в журнал работы Сервера, а компилируемый код формул доступен в файле CalcEngine.cs, который расположен по умолчанию в директории журналов Сервера C:\SCADA\ScadaServer\Log\
Для разработки сложных формул рекомендуется использовать Microsoft Visual Studio Community Edition, подключив в зависимости проекта сборку FormulaTester.dll. В качестве примера можно использовать проект формул указанный выше.