Simple-Scada forum

Simple-Scada 2 => Ваши вопросы => Тема начата: gaargot1 от 24 Апреля 2020, 13:36:39

Название: Массовое изменение значений в переменных
Отправлено: gaargot1 от 24 Апреля 2020, 13:36:39
Здравствуйте. Может кто знает, как победить такой эффект.
Есть задача включать и отключать кнопки по времени.
По нескольку десятков кнопок в проекте скады и соответственно переменных в каждой кнопки в ПЛК100.
При достижении времени при помощи перебора отправляю в переменные 1 либо 0.

В результате произвольно несколько штук либо не включаются либо не отключаются.

Вызов процедуры перебора из посекундного скрипта:
Код
if TimeToStr(now)='17:00:00' then
  begin
   AllFeeders('PLC8_plc_prg_stp',1,32);
   AllFeeders('PLC9_plc_prg_stp',1,32); 

Перебор происходит в глобальном модуле:
Код
procedure allfeeders(aPrefix:string;StartStop:byte;aK:integer);
var
i   :integer;
aVar:TM_Variable;
begin
for i:=1 to aK do
  begin
  aVar := GetVariableByName(aPrefix+intToStr(i));
  if aVar <> nil then aVar.value:=StartStop;
  end;
end;
     
Название: Re: массовое изменение значений в переменных
Отправлено: knskey от 24 Апреля 2020, 16:26:02
а если поставить не =17.00.00, а например >17.00.00. Ну или еще условие поставить <17.00.05.  Я не знаю, но может в этом дело.
Название: Re: Массовое изменение значений в переменных
Отправлено: Simple-Scada от 26 Апреля 2020, 16:03:09
Здравствуйте.

Код скрипта рабочий. Только если нужно выполнять скрипт в 17:00, то лучше использовать скрипт с типом события "Прошел час" и делать такую проверку:
Код: (delphi)
begin
  if HourOf(Now) = 17 then
  begin
    // здесь код
  end;
end.

Цитировать
В результате произвольно несколько штук либо не включаются либо не отключаются.
Возможно переменные перезаписываются в других скриптах или в программе контроллера. Если не получается разобраться, то вышлите проект на support@simple-scada.com для проверки. Мы укажем что именно не так.
Название: Re: Массовое изменение значений в переменных
Отправлено: gaargot1 от 04 Июня 2020, 14:23:12
В общем разобрался. Получается, что функция GetVariableByName не возвращает nil в случае неудачи.
Потому, что если добавить aVar:=nil; то всё работает корректно:
Код: (delphi)
procedure allfeeders(aPrefix:string; StartStop:byte; aK:integer);
var
  i: integer;
  aVar: TM_Variable;
begin
  for i := 1 to aK do
  begin
    aVar:=nil;
    aVar := GetVariableByName(aPrefix+intToStr(i));
    if aVar <> nil then aVar.value:=StartStop;
  end;
end;
Название: Re: Массовое изменение значений в переменных
Отправлено: Simple-Scada от 04 Июня 2020, 14:55:21
Цитировать
Получается, что функция GetVariableByName не возвращает nil в случае неудачи.
Нет, это не так. Функция GetVariableByName возвращает либо указатель на переменную, если переменная с таким именем существует, либо nil. Каких-то других вариантов нет. Вы сделали неправильный вывод.
Кроме того, такой код:
Код: (delphi)
aVar:=nil;
aVar := GetVariableByName(aPrefix+intToStr(i));
, является абсолютно бессмысленным, т.к. вторая строка неизбежно переписывает результат первой строки. И если бы GetVariableByName не возвращала nil, то в aVar всё равно записывался бы неправильный указатель.
Можно предположить что в вашем проекте есть другая переменная c именем aVar (например объявленная в глобальном модуле, или в разделе переменных), либо какие-то грубые ошибки в скриптах (например зацикливание), либо переменная aVar используется где-то в скрипте уже после выполнения allfeeders. Точную причину можно назвать только проверив проект.