Вход

Просмотр полной версии : C# MS4D | Управление параметром из 2х скриптов



isamars
18.03.2026, 11:11
Здравствуйте! Знакомлюсь с MS4D, есть 2 скрипта(программы объекта) на c#:

Устанавливает параметр State при некоторых условиях, исполняется периодически.

if(Alert == 2 || Alert_1 == 2 || Alert_2 == 2 || Alert_3 == 2)
{
State = 2;
}
Действие по кнопке квитировать, сбрасывает State.

public override void Execute()
{
State = 0;
}


Проблема в том, что первый скрипт "зажимает" в состоянии тревоги, даже если условие перестало выполняться. Собственно вопрос, есть ли возможность не менять состояние выхода при не выполнении условия?

melky
18.03.2026, 11:16
Если Alert равен чему-то, то даже если вы сбросите, он снова появится (изменится State) и это нормально. Вы же не Alert сбрасываете своим вторым скриптом, а свою переменную State

Опять же, у вас Alert сработал, вы сбросите (используя промежуточную переменную), а потом у вас сработает Alert_1 и ничего не произойдет, так как вы промежуточной переменной запретите срабатывать всем Алертам.

Имхо, тут нужен массив или словарик, в зависимости сколько у вас там Алертов. И в нем сделать промежуточные переменные, чтобы когда вы квитируете, оно больше не реагировало.

Я правильно понимаю, что от оборудования, прилетает ошибка, что-то засветилось, зажужжало, вы просто отключаете это жужжание - то есть оператор принял и оповещен, но само оборудование то продолжает быть в ошибке.

isamars
18.03.2026, 11:28
Есть датчики, в них заданы уставки, при сработке уставок они ставят свою переменную Alert в значение 1 либо 2:

if(T.Value >= Hi && T.Value < HiHi)
{
//Верхняя предупредительная уставка
Alert = 1;
}
else if(T.Value >= HiHi)
{
//Верхняя аварийная уставка
Alert = 2;
}
else if(T.Value <= Lo && T.Value > LoLo)
{
//Нижняя предупредительная уставка
Alert = 1;
}
else if(T.Value <= LoLo)
{
//Нижняя аварийная уставка
Alert = 2;
}
else
{
Alert = 0;
//Нормальный режим
}

от значения Alert привязываются визуальные параметры в окне, эта логика работает отлично.

Но, нужно в основном окне при сработке любого Alert на датчиках - подсветить фон всего окна красным, пока не квитируется кнопкой(то есть, без разницы уставка в сработке или нет, если было - то меняем фон пока не квитируют). Для этого создал параметр State, от него зависит цвет фона, это тоже работает. Но программа 1 после сработки уставки видимо запоминает последнее значение или как(не силен в промышленном программировании), то есть при исполнении вижу, что на выходе программы2 State = 0, но на выходе программы1 остается State = 2, хотя Alert не в сработке

isamars
18.03.2026, 11:54
Разобрался, видимо программе на выходе нужно всегда какое то значение отдавать, то есть если один раз задали 2 и допустим в следующей итерации не задаем значение(так как условие не выполняется), то отдаст туже 2, надо же что-то отдать...

Пытался подать это же значение на вход и при не выполнении условия - отдавать то, что на входе получили, но видимо не успевает подхватить значение.

Вышел из положения так - сделал флаг, при квитировании ставлю его в true, в программе 1 при невыполнении условия смотрю этот флаг, если он true - cбрасываю значение и возвращаю флаг в false

melky
18.03.2026, 11:58
Ну, а если у вас с датчика продолжает переть HiHi ? вы сбросили окно (цвет) и он тут же вернулся обратно в красный? или вы квитированием еще что-то сбрасываете?

isamars
18.03.2026, 12:05
Если все еще сработан HiHi, то продолжает красным гореть все верно, другого и не требуется. Это как предупреждение, что вот была сработка - посмотри в чем дело. А если висит в сработке, то так и должно гореть - пока из сработки не выйдет.

melky
18.03.2026, 12:27
ага, и если там звук, то оператор хоть пообжимайся ? почему вдруг ничего не сбрасывается :)

с одной стороны понятно, сбросит и забудет, с другой стороны, запись в журнал - Федя сбросил, но никому ничего не сказал.

Роман Ж
01.04.2026, 07:44
Необходимо ещё обратить внимание на это:
Вопрос:

Как реализовать несколько входящих связей в параметре?

Ответ:

Диспетчеризация входящих связей для параметров проекта в MasterSCADA 4D в настоящий момент не поддерживается.

Таким образом, для корректной работы должна быть только одна входящая связь.



Если в проекте необходима диспетчеризация нескольких связей, то такую диспетчеризацию необходимо проводить в программе (например ST или FBD).



https://support.iek-digital.ru/ru/knowledge_base/art/85/cat/10/neskolko-vhodjaschih-svjazej-v-parametre

melky
01.04.2026, 10:00
Ну разве AND кто-то отменял? а уже выход его это одна связь. (пример)