Вот кстати напомнили мне подобную проблему в связке ИП320 - ПЛК210 без орс серверов и скада. Там тоже, посылка команды с ИП320 то проходила, то нет. Оказалось что контроллер сбрасывал бит почти сразу, а ИП320 повторно посылал уже ненужную команду. Также пришлось таймер на сброс втыкать.
Добрый день, никак не пойму как добавить шкалу к горизонтальному прогрессу. На фото пример1.png
Basil11 вы бы изучили лицензии на MS4D где и когда могут запускаться клиенты.
Добрый день! Пытаюсь с помощью блока GetActualEvents вытащить активные аварии в структуру типа "время активации + Сообщение".
MyFields := "ActiveTime, Message";
FilterActive := '["Active=TRUE"]';
GetActualEvents_1(Fields:= MyFields, Filter:=FilterActive, Count => CountEvents, Events => newEvents );
newEvent - динамический массив [DT, String].
Сообщения в динамическом массиве newEvents появляются, а вот дата у каждого элемента остается 0001-01-01-00:00.
Если пробовать вытащить одну дату активации - выдает ошибку "Attempt to index FileTime event".
Что у меня пошло не так?
Коллеги, добрый день! Возникла необходимость получить график скорости изменения параметра. Я понимаю, что можно пойти по сложному пути: написать скрипт, который будет "выцеплять" параметр из архива на заданное время от текущего (например минуту назад) и сравнивать его с текущим и записывать в архив эту скорость. Но зачем делать еще лишние вычисления и лишнюю запись в архив, если мы уже имеем архив этого параметра. Может быть есть какие-то решения "из коробки", которые имеют возможность показать скорость изменения параметра по заданному интервалу времени?
Здравствуйте!
В предыдущей версии MS4D 1.3.4.17698 работала настройка в таблицах данных"запрет изменения сортировки",
а в новой версии 1.3.4.23610 эта настройка не работает-хотя галка стоит, сортировка доступна и активна в мнемосхеме.
Мне приходится стыковать 2 таблицы на мнемосхеме -одна формируется в программе(и поэтому изменение её вручную недоступно)
и вторую я задаю вручную(адрес, вес импульса). Но т.к. запрет сортировки сейчас не работает, то пользователи путают стыковку таблиц
и получается аброкадабра -адрес и вес импульса отсюда а объект другой.
Что делать?
Добрый день!
Прошу разъяснения по Пользовательскому элементу (Script).
Все сделал как написано в pdf.
Сначала пытался на версии 1.3.7 запустить все это дело.
В логах c:\ProgramData\MPSSoft\MasterSCADA4DRT1_3\Server\ error.log
записи вот такого типа:
Контрол не работает, на экране пишет что -то типа "Не удалось установить параметр flag".Код:2025/05/14 10:26:23 [error] 6264#5256: *2 CreateFile() "C:\ProgramData\MPSSoft\MasterSCADA4DRT1_3\Server/htdocs/controls/basic.js" failed (3: The system cannot find the path specified), client: 127.0.0.1, server: _, request: "GET /controls/basic.js HTTP/1.1", host: "127.0.0.1:8043", referrer: "http://127.0.0.1:8043/resources/custom1.js"
Я так понимаю , что в с версии 1.3.7 не генерируются в папке htdocs папки controls, actions и тому подобное (а именно там находятся javascript файлы - в том числе и basic.js, от которого наследуются свои пользовательские контролы).
В более ранних версиях они были...
Обновился до новой версии (Версия: 1.3.8.24492(1.3.8_20250513.1)) - поменялось расположение самого рантайма (теперь в c:\ProgramData\MPSSoft\MasterSCADA4D_RT\rt\ и проект загружается в подпапку server). Папка logs есть , но там в файлах логов нет инфы касаемо визуализации.
И также нет controls (basic.js и прочего).
Вопрос: пользовательских элементов теперь не будет? наследоваться от HTMLElement? а параметры в контролах для привязок со стороны MS4D как делать в таком случае?
Я пытался делать простой элемент-наследник HTMLElement без импорта {Basic} из basic.js. Заводил поле flag в js, в MS4D также парметр добавлял flag - не работает.
Код:export class msscript extends HTMLElement { constructor() { super(); this._flag = false; } /** * flag * @type {bool} */ get flag() { console.log("Current flag state is:" + this._flag); return this._flag; } set flag(value) { this._flag = this._toBool(value); console.log("Current flag state is:" + this._flag); } _toBool(value) { if (value) { if (typeof value == "boolean") { return value; } else { switch (value.toString().toLowerCase().trim()) { case "true": case "yes": case "1": return true; case "false": case "no": case "0": case null: return false; default: return Boolean(value); } } } else { return false; } } }
Добрый день!
В проекте есть несколько объектов, в каждом из которых осуществляется занесение аварий в журнал. Также с помощью скрипта на языке ST, использующего блок EventsCounter, выходная переменная устанавливается в TRUE, если в журнале присутствует неквитированное сообщение.
Проблема заключается в том, что при срабатывании тревоги в любом из объектов, выход каждого скрипта становится TRUE, несмотря на то, что параметр IsGlobal установлен в FALSE.
Подскажите, пожалуйста, как можно решить эту проблему.
Пример скрипта приведён ниже:
VAR
filterSeverityWarning : STRING;
myEventsCounter : EventsCounter;
END_VAR
filterSeverityWarning := '["Active=TRUE","Acked=FALSE","Severity=555"]';
myEventsCounter(
Filter := filterSeverityWarning,
IsGlobal := FALSE,
Ack := FALSE,
UserName := '',
Comment := ''
);
ERROR := myEventsCounter.Exists;