Перейти к содержимому

Серверные скрипты

Серверные скрипты выполняются на сервере без оператора: счётчики, расписания, блокировки, последовательности. Они запускаются задачами или из экрана через HMI.RunServerScript.

Серверные скрипты

  • Все скрипты и задачи идут по очереди в одном потоке, как цикл контроллера. Гонок между ними нет.
  • Глобальные переменные модулей живут, пока работает сервер. После перезапуска или применения новой версии проекта начинают заново.
  • Записи тегов и системные функции выполняются по порядку после скрипта.
  • На один запуск отводится 5 секунд, 2 000 000 операций, глубина рекурсии 256, 64 МБ памяти.
  • Очередь вмещает 10 000 запусков. При переполнении новые отбрасываются.

Доступен стандартный JavaScript. setTimeout, fetch и require не определены. Для повторения используйте задачу «Периодически».

Ошибка скрипта не останавливает сервер: она пишется в журнал, а запланированные записи отменяются.

Член Описание
Tags(name).Name Имя тега
.Value Значение; null, если качество плохое или значения нет
.Read() То же, что .Value
.Quality Качество: Good, Uncertain, Bad, CommFailure, NoData и другие
.Timestamp Время изменения, ISO 8601, UTC
.Write(value) Запись после скрипта

В отличие от клиента, на сервере при потере связи .Value равен null. Учитывайте это в сравнениях.

Член Описание
Server.Now Местное время сервера текстом ISO: 2026-11-09T15:30:00
Server.TextList(list, value) Текст из списка текстов
Server.SysFct(name, ...args) Системная функция по имени, после скрипта

На сервере работают функции записи тегов и битов (кроме SetBitWhileKeyPressed и InputValue), вычисления, AcknowledgeAllAlarms, AcknowledgeAlarm и RunScript. Функции окон и экранов там не работают: окон на сервере нет.

Server.SysFct("IncreaseValue", "Counter", 1, 1000);
Server.SysFct("LinearScaling", "Tank1.Percent", "Tank1.Level", 0, 10, 0, 100);

Записи из скриптов сервера выполняются от имени пользователя Сервер.

Метод Уровень
Log.Info(text), console.log(text) Информация
Log.Warn(text), console.warn(text) Предупреждение
Log.Error(text), console.error(text) Ошибка

Записи видны в окне среды исполнения и в файлах %ProgramData%\Scadora\logs.

Объект Trigger описывает, что запустило скрипт.

Поле Описание
Trigger.Task Имя задачи или вида запуска
Trigger.Tag Тег для задач «Изменение тега» и «Условие»
Trigger.Value Новое значение
Trigger.Previous Прежнее значение
Trigger.User Пользователь, если функцию вызвали с экрана; иначе Сервер

При загрузке модуля Trigger равен null.

serverscripts/Main.js
function startSequence(recipe) {
Log.Info(Trigger.User + " запустил рецепт " + recipe);
Tags("Seq.Recipe").Write(Number(recipe));
Tags("Seq.Start").Write(true);
}
// скрипт кнопки на экране
HMI.RunServerScript("startSequence", "3");

Аргумент всегда передаётся текстом.

Элемент Таблица с источником «функция» показывает то, что функция вернула: массив массивов или массив объектов. Во втором случае колонки берутся из свойств первой строки.

function ordersTable() {
return Db.Query("Журнал", "SELECT Name, Qty FROM Orders");
}
var rows = Db.Query("Журнал", "SELECT * FROM Events WHERE Id > ?", [100]);
rows.forEach(function (row) { Log.Info(row.Text); });
Метод Результат
Db.Query(base, sql, params) Массив объектов: row.Name, row["Имя колонки"]
Db.Execute(base, sql, params) Число изменённых строк
Db.Scalar(base, sql, params) Первое значение первой строки

Параметры подставляются вместо ?, передавать их можно массивом или списком аргументов. Всегда используйте параметры вместо склейки строк. Даты возвращаются текстом ISO, двоичные поля — в Base64.

Работа с файлами описана в разделе Задачи, базы, файлы.