Примеры скриптов
Цвет и подпись по состоянию
Заголовок раздела «Цвет и подпись по состоянию»Событие экрана Цикл. Когда логика проще условий анимации, скрипт может сам раскрасить элемент.
var state = Tags("Pump1.State").Value;var pump = Screen.Items("Насос1");pump.Children("Подпись").Text = HMI.TextList("Состояния", state);pump.Children("Корпус").Fill = state === 2 ? "#D32F2F" : state === 1 ? "#3C9A5F" : "#F2F3F4";Погасить всё оборудование участка
Заголовок раздела «Погасить всё оборудование участка»Имена элементов начинаются с префикса участка.
Screen.All() .filter(function (e) { return e.Name.indexOf("Уч2.") === 0; }) .forEach(function (e) { e.Visible = false; });Подсветить элементы без связи
Заголовок раздела «Подсветить элементы без связи»Screen.All().forEach(function (e) { if (!e.Has("Tag") || !e.Tag) return; e.Transparency = e.Quality === "Good" ? 0 : 60;});Блокировка кнопок по режиму
Заголовок раздела «Блокировка кнопок по режиму»var manual = Tags("Line.Mode").Value === 0;["КнопкаПуск", "КнопкаСтоп", "Уставка"].forEach(function (name) { Screen.Items(name).Enabled = manual;});Кнопка с подтверждением и проверками
Заголовок раздела «Кнопка с подтверждением и проверками»Вопрос стоит первым, поскольку в браузере скрипт после него выполняется заново.
if (!HMI.Confirm("Запустить насос?")) return;
var fault = Tags("Pump1.Fault");if (fault.Quality !== "Good" || fault.Value) { HMI.ShowMessage("Пуск запрещён: авария или нет связи"); return;}Tags("Pump1.Start").Write(true);Item.Text = "Запуск…";Индикация нажатия
Заголовок раздела «Индикация нажатия»// событие «Нажатие левой»Item.Fill = "#2F6FB0";// событие «Отпускание левой»Item.Reset();Переключить тег у виджета
Заголовок раздела «Переключить тег у виджета»Один прибор показывает выбранный насос.
var pump = Screen.Items("Выбор").Value;Screen.Items("Прибор").Tag = "Pump" + pump + ".Speed";Screen.Items("Подпись").Text = "Насос " + pump;Настроить тренд из скрипта
Заголовок раздела «Настроить тренд из скрипта»var pens = ["Tank1.Level", "Tank2.Level", "Tank3.Level"].map(function (tag) { return { tag: tag };});var trend = Screen.Items("Тренд");trend.RangeMinutes = 480;trend.Apply({ penList: pens });Обновить таблицу после записи
Заголовок раздела «Обновить таблицу после записи»HMI.RunServerScript("closeOrder", Item.Text);Screen.Items("ТаблицаЗаказов").Reload();Добавить событие во время работы
Заголовок раздела «Добавить событие во время работы»var box = Screen.Items("Схема");var events = box.Config.events || {};events.Click = { functions: [{ function: "ActivateScreen", args: { Screen: "Детали" } }] };box.Apply({ events: events });Сервер: счётчик пусков
Заголовок раздела «Сервер: счётчик пусков»Задача «Условие»: Pump1.Run = true.
var starts = Tags("Pump1.Starts").Value || 0;Tags("Pump1.Starts").Write(starts + 1);Log.Info("Пуск № " + (starts + 1));Сервер: журнал смены в SQLite
Заголовок раздела «Сервер: журнал смены в SQLite»Задача «Ежедневно», 08:00.
var total = Tags("Line.Count").Value;Db.Execute("Журнал", "INSERT INTO Shift(Time, Total) VALUES(?, ?)", [Server.Now, total]);Tags("Line.Count").Write(0);Сервер: загрузка рецепта из CSV
Заголовок раздела «Сервер: загрузка рецепта из CSV»function loadRecipe(name) { var rows = File.ReadCsv("recipes/" + name + ".csv"); rows.slice(1).forEach(function (row) { Tags(row[0]).Write(Number(row[1])); }); Log.Info(Trigger.User + " загрузил рецепт " + name);}Сервер: блокировка
Заголовок раздела «Сервер: блокировка»Задача «Изменение тега» на Tank1.Level.
if (Trigger.Value === null) return;if (Trigger.Value > 9 && Tags("Pump1.Start").Value) { Tags("Pump1.Start").Write(false); Log.Warn("Насос остановлен: высокий уровень");}