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

Скрипты на экране

Скрипты пишутся на JavaScript и бывают двух видов.

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

Эта страница про клиентские скрипты. Дальше: Элементы из скриптов, Серверные скрипты и Примеры.

Редактор скриптов

На событии. Откройте вкладку События элемента или экрана и напишите скрипт. Код выполняется как тело функции, поэтому в нём можно писать return, а var создаёт локальную переменную.

if (Tags("Line.Mode").Value !== 1) return;
Tags("Line.Start").Write(true);

В модуле. Функции из scripts/*.js видны во всех скриптах клиента. На событии их вызывают напрямую или системной функцией RunScript.

scripts/Main.js
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 не определены. Для периодических действий используйте событие экрана Цикл.

  1. Скрипт выполняется целиком, не ожидая сети.
  2. Изменения элементов сразу видны следующим строкам скрипта. На экран они попадают одной перерисовкой после завершения.
  3. Записи в теги и системные функции ставятся в очередь и выполняются по порядку после скрипта.

Поэтому записанное значение нельзя прочитать в той же строке:

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 нельзя. Права проверяются при записи и ещё раз на сервере: при их нехватке оператор увидит сообщение.

Несуществующий тег вызывает ошибку скрипта с его именем.

Имя вошедшего пользователя.

Открывает экран после завершения скрипта.

Показывает окно с текстом.

Спрашивает оператора и возвращает true или false.

if (!HMI.Confirm("Остановить линию?")) return;
Tags("Line.Stop").Write(true);

Текст из списка текстов проекта для числа.

var text = HMI.TextList("Режимы", Tags("Line.Mode").Value);

Вызывает функцию серверного скрипта. Нужно право «Управление».

Вызывает любую системную функцию по имени. Параметры передаются в порядке из справочника, необязательные можно пропустить.

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:. В нём value — значение тега, также доступны Tags и функции модулей:

js: value == 3 || value == 5

Переменная value есть только в таких условиях. В скриптах событий читайте значение через тег или Item.Value.