Скрипты на экране
Скрипты пишутся на JavaScript и бывают двух видов.
| Клиентские | Серверные | |
|---|---|---|
| Где выполняются | В программе оператора и в браузере, у каждого клиента свои | На сервере, один экземпляр |
| Где пишутся | На событиях элементов и экранов, в модулях scripts/*.js |
В задачах и модулях serverscripts/*.js |
| Что умеют | Теги, элементы экрана, окна, вопросы оператору | Теги, базы данных, файлы, журнал |
| Работают без оператора | Нет | Да |
Эта страница про клиентские скрипты. Дальше: Элементы из скриптов, Серверные скрипты и Примеры.

Где писать скрипт
Заголовок раздела «Где писать скрипт»На событии. Откройте вкладку События элемента или экрана и напишите скрипт. Код выполняется как тело функции, поэтому в нём можно писать return, а var создаёт локальную переменную.
if (Tags("Line.Mode").Value !== 1) return;Tags("Line.Start").Write(true);В модуле. Функции из scripts/*.js видны во всех скриптах клиента. На событии их вызывают напрямую или системной функцией RunScript.
function startLine(mode) { if (Tags("Line.Fault").Value) { HMI.ShowMessage("Линия в аварии"); return; } Tags("Line.Mode").Write(Number(mode)); Tags("Line.Start").Write(true);}Функция, вызванная через RunScript, получает необязательный текстовый аргумент первым параметром.
Модули выполняются один раз при первом скрипте сеанса. Их глобальные переменные живут, пока пользователь не вышел, и у каждого клиента они свои.
Какие объекты доступны
Заголовок раздела «Какие объекты доступны»| Объект | Что это |
|---|---|
Tags(name) |
Тег по имени |
HMI |
Окна, сообщения, переходы, системные функции |
Screen |
Открытые экраны и их элементы |
Item |
Элемент, на событии которого идёт скрипт. На событиях экрана равен null |
Доступен стандартный JavaScript: let, const, стрелочные функции, классы, Math, JSON, Date, методы массивов и строк.
Браузерных и системных средств нет: window, document, fetch, setTimeout, require не определены. Для периодических действий используйте событие экрана Цикл.
Порядок выполнения
Заголовок раздела «Порядок выполнения»- Скрипт выполняется целиком, не ожидая сети.
- Изменения элементов сразу видны следующим строкам скрипта. На экран они попадают одной перерисовкой после завершения.
- Записи в теги и системные функции ставятся в очередь и выполняются по порядку после скрипта.
Поэтому записанное значение нельзя прочитать в той же строке:
Tags("Counter").Write(5);HMI.ShowMessage(Tags("Counter").Value); // покажет старое значениеЗапомните значение в переменной, если оно нужно дальше.
Ограничения
Заголовок раздела «Ограничения»| Ограничение | Значение |
|---|---|
| Время одного запуска | 2 секунды |
| Число операций | 2 000 000 |
| Глубина рекурсии | 256 |
| Память | 64 МБ |
Зациклившийся скрипт останавливается с сообщением, клиент продолжает работать.
Ошибка скрипта показывается оператору с номером строки, а запланированные записи при этом не выполняются. Синтаксические ошибки редактор показывает в проверке проекта.
var level = Tags("Tank1.Level");| Член | Описание |
|---|---|
.Name |
Имя тега |
.Value |
Последнее значение из подписки: Bool, число или строка; null, если значения ещё нет |
.Read() |
То же, что .Value |
.Quality |
Качество: Good, Uncertain, Bad, CommFailure и другие |
.Write(value) |
Запись после скрипта |
.Value отдаёт последнее известное значение, даже если связь потеряна. Если от значения зависит команда, проверяйте качество:
var level = Tags("Tank1.Level");if (level.Quality !== "Good") { HMI.ShowMessage("Нет достоверного значения уровня"); return;}Write приводит значение к типу тега. Записать null нельзя. Права проверяются при записи и ещё раз на сервере: при их нехватке оператор увидит сообщение.
Несуществующий тег вызывает ошибку скрипта с его именем.
Объект HMI
Заголовок раздела «Объект HMI»HMI.User
Заголовок раздела «HMI.User»Имя вошедшего пользователя.
HMI.ActivateScreen(name)
Заголовок раздела «HMI.ActivateScreen(name)»Открывает экран после завершения скрипта.
HMI.ShowMessage(text)
Заголовок раздела «HMI.ShowMessage(text)»Показывает окно с текстом.
HMI.Confirm(question)
Заголовок раздела «HMI.Confirm(question)»Спрашивает оператора и возвращает true или false.
if (!HMI.Confirm("Остановить линию?")) return;Tags("Line.Stop").Write(true);HMI.TextList(list, value)
Заголовок раздела «HMI.TextList(list, value)»Текст из списка текстов проекта для числа.
var text = HMI.TextList("Режимы", Tags("Line.Mode").Value);HMI.RunServerScript(function, argument)
Заголовок раздела «HMI.RunServerScript(function, argument)»Вызывает функцию серверного скрипта. Нужно право «Управление».
HMI.SysFct(name, …args)
Заголовок раздела «HMI.SysFct(name, …args)»Вызывает любую системную функцию по имени. Параметры передаются в порядке из справочника, необязательные можно пропустить.
HMI.SysFct("IncreaseValue", "Tank1.Setpoint", 0.5, 10);HMI.SysFct("ShowGeniePopup", "PumpControl", "Tag=Pump1; Title=Насос 1");HMI.SysFct("ShowPopupScreen", "TankDetails", 100, 50);HMI.SysFct("AcknowledgeAllAlarms");Условие «js:»
Заголовок раздела «Условие «js:»»В условиях «работает / вкл» можно написать выражение с префиксом js:. В нём value — значение тега, также доступны Tags и функции модулей:
js: value == 3 || value == 5Переменная value есть только в таких условиях. В скриптах событий читайте значение через тег или Item.Value.