Страница 1 из 1

Скрипт долго выполняется

СообщениеДобавлено: 07 дек 2021, 09:53
pinguin007
Здраствуйте! Написал скрипт для чтение данных с ПЛК, зависимости от полученных данных скрипт записывает во внутренние регистры данные, которые влияют на цвет объекта. Скрипт очень долго отрабатывает. Имитирую ситуацию на ПЛК, когда объект должен прокрасится в красный, и приходится ждать по 30 сек, чтобы на панельке это увидеть
Код: Выделить всё
short status,result,tmp,statusInt =0
GetData(statusInt, "PLC_MB_TCP", "AI_VU_1.StatWordInt", 1)
GetData(status, "PLC_MB_TCP", "AI_VU_1.StatWord", 1)
// 1 = yellow
// 2 = orang
// 3 = red
// 4 = white
// 5 = white
// 6 = green

if statusInt==-2 or statusInt==3 then
   tmp = 3
   SetData(tmp, "Local HMI", "AI_1.Status", 1)
else if statusInt==-1 or statusInt==1 then
   tmp = 1
   SetData(tmp, "Local HMI", "AI_1.Status", 1)
else if statusInt==2 then
   tmp = 2
   SetData(tmp, "Local HMI", "AI_1.Status", 1)   
else
   tmp = 6
   SetData(tmp, "Local HMI", "AI_1.Status", 1)   
end if   


GETBIT(status, result, 0)

if result==0 then
   tmp = 4
   SetData(tmp, "Local HMI", "AI_1.Status", 1)
end if

GETBIT(status, result, 7)
if result==1 then
   tmp = 5
   SetData(tmp, "Local HMI", "AI_1.Status", 1)
end if


Вот пример кода, этот участок еще 40 раз скопирован в скрипте. Может есть какая нибудь оптимизация или доп. настройка

Re: Скрипт долго выполняется

СообщениеДобавлено: 07 дек 2021, 15:05
8bit
А просто создать 10 картинок объекта нужных цветов (на каждое состояние свой цвет, всего 256 состояний) и добавить их в свою библиотеку, а потом привязать этот объект "Числовой индикатор" к AI_1.Status не работает ?

Re: Скрипт долго выполняется

СообщениеДобавлено: 07 дек 2021, 15:57
pinguin007
8bit писал(а):А просто создать 10 картинок объекта нужных цветов (на каждое состояние свой цвет, всего 256 состояний) и добавить их в свою библиотеку, а потом привязать этот объект "Числовой индикатор" к AI_1.Status не работает ?

Так и сделано, в скриптах вычисляется значения AI_1.Status по каждому каналу. AI_1.Status привязан к объекту.

Re: Скрипт долго выполняется

СообщениеДобавлено: 07 дек 2021, 16:10
8bit
pinguin007 писал(а):
8bit писал(а):А просто создать 10 картинок объекта нужных цветов (на каждое состояние свой цвет, всего 256 состояний) и добавить их в свою библиотеку, а потом привязать этот объект "Числовой индикатор" к AI_1.Status не работает ?

Так и сделано, в скриптах вычисляется значения AI_1.Status по каждому каналу. AI_1.Status привязан к объекту.


с какой целью используете макрос ?

Re: Скрипт долго выполняется

СообщениеДобавлено: 07 дек 2021, 16:45
pinguin007
8bit писал(а):
pinguin007 писал(а):
8bit писал(а):А просто создать 10 картинок объекта нужных цветов (на каждое состояние свой цвет, всего 256 состояний) и добавить их в свою библиотеку, а потом привязать этот объект "Числовой индикатор" к AI_1.Status не работает ?

Так и сделано, в скриптах вычисляется значения AI_1.Status по каждому каналу. AI_1.Status привязан к объекту.


с какой целью используете макрос ?



Для определение цвета объекта "Числовой индикатор"
1) Считываем значение с ПЛК
2) Согласно полученному значению, выставляем значение AI_1.Status
3) AI_1.Status привязан к объекту "Числовой индикатор"
4) объекта "Числовой индикатор" меняет цвет согласно AI_1.Status

На прямую соединить регистр из ПЛК к объекту не получится

Re: Скрипт долго выполняется

СообщениеДобавлено: 07 дек 2021, 16:53
8bit
pinguin007 писал(а):
На прямую соединить регистр из ПЛК к объекту не получится


1) по-хорошему все вычисления должны происходить в ПЛК, а панель/SCADA только отображение текущей ситуации и передача команд оператора в ПЛК....
2) можете попробовать разбить один большой макрос на несколько (возможно до 40) работающих параллельно
3) если алгоритм определения цвета для AI_1.Status унифицирован, то можете его упаковать в функцию и в макросе вызывать эту функцию для каждого аргумента
AI_1 , AI_2, AI_3 и т.д. Можно так же раскидать на несколько макросов
4) если входная величина и тип AI_1 одинаковы, то можно в Адресных метках создать метки и задать там преобразование через функцию макроса, в которой формировать номер состояния, годный для прикрепления к цветовой картинке

Re: Скрипт долго выполняется

СообщениеДобавлено: 07 дек 2021, 17:03
ArtemPM
И еще совет. Попробуйте воспользоваться GetDataEx в связке с GetError.
В вашем случае сильно тормозить выполнение скрипта может опрос тегов.

И еще вариант: так как у вас модбас, то если есть возможность, опрашивайте теги пачкой, можно даже все 80 сразу, если это позволяет ПЛК.

Re: Скрипт долго выполняется

СообщениеДобавлено: 07 дек 2021, 17:08
8bit
ArtemPM писал(а):И еще вариант: так как у вас модбас, то если есть возможность, опрашивайте теги пачкой, можно даже все 80 сразу, если это позволяет ПЛК.


Речь о функции GetData(var_in[0], "Local HMI", LW, 501, 100), где 100 - это количество элементов, которые надо считать с устройства "Local HMI", начиная с адреса 501 и поместить в массив var_in[0], начиная с элемента номер 0

Re: Скрипт долго выполняется

СообщениеДобавлено: 08 дек 2021, 16:49
pinguin007
Спасибо за рекомендации