Серверные скрипты
Серверные скрипты выполняются на сервере без оператора: счётчики, расписания, блокировки, последовательности. Они запускаются задачами или из экрана через 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
Заголовок раздела «Объект Server»| Член | Описание |
|---|---|
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.
Вызов с экрана
Заголовок раздела «Вызов с экрана»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.
Работа с файлами описана в разделе Задачи, базы, файлы.