Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Автор Тема: Массовое изменение значений в переменных  (Прочитано 1549 раз)

gaargot1

  • Новичок
  • *
  • Сообщений: 16
    • Просмотр профиля
Здравствуйте. Может кто знает, как победить такой эффект.
Есть задача включать и отключать кнопки по времени.
По нескольку десятков кнопок в проекте скады и соответственно переменных в каждой кнопки в ПЛК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;
     
« Изменён: 24 Апреля 2020, 20:49:38 от Simple_Scada »

knskey

  • Новичок
  • *
  • Сообщений: 30
    • Просмотр профиля
Re: массовое изменение значений в переменных
« Ответ #1 : 24 Апреля 2020, 16:26:02 »
а если поставить не =17.00.00, а например >17.00.00. Ну или еще условие поставить <17.00.05.  Я не знаю, но может в этом дело.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3202
    • Просмотр профиля
    • Simple-Scada
Re: Массовое изменение значений в переменных
« Ответ #2 : 26 Апреля 2020, 16:03:09 »
Здравствуйте.

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

Цитировать
В результате произвольно несколько штук либо не включаются либо не отключаются.
Возможно переменные перезаписываются в других скриптах или в программе контроллера. Если не получается разобраться, то вышлите проект на support@simple-scada.com для проверки. Мы укажем что именно не так.

gaargot1

  • Новичок
  • *
  • Сообщений: 16
    • Просмотр профиля
В общем разобрался. Получается, что функция 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;
« Изменён: 04 Июня 2020, 14:56:28 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3202
    • Просмотр профиля
    • Simple-Scada
Цитировать
Получается, что функция GetVariableByName не возвращает nil в случае неудачи.
Нет, это не так. Функция GetVariableByName возвращает либо указатель на переменную, если переменная с таким именем существует, либо nil. Каких-то других вариантов нет. Вы сделали неправильный вывод.
Кроме того, такой код:
Код: (delphi)
aVar:=nil;
aVar := GetVariableByName(aPrefix+intToStr(i));
, является абсолютно бессмысленным, т.к. вторая строка неизбежно переписывает результат первой строки. И если бы GetVariableByName не возвращала nil, то в aVar всё равно записывался бы неправильный указатель.
Можно предположить что в вашем проекте есть другая переменная c именем aVar (например объявленная в глобальном модуле, или в разделе переменных), либо какие-то грубые ошибки в скриптах (например зацикливание), либо переменная aVar используется где-то в скрипте уже после выполнения allfeeders. Точную причину можно назвать только проверив проект.
« Изменён: 04 Июня 2020, 15:00:32 от Simple-Scada »