Здравствуйте. Может кто знает, как победить такой эффект.
Есть задача включать и отключать кнопки по времени.
По нескольку десятков кнопок в проекте скады и соответственно переменных в каждой кнопки в ПЛК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;
Здравствуйте.
Код скрипта рабочий. Только если нужно выполнять скрипт в 17:00, то лучше использовать скрипт с типом события "Прошел час" и делать такую проверку:
begin
if HourOf(Now) = 17 then
begin
// здесь код
end;
end.
В результате произвольно несколько штук либо не включаются либо не отключаются.
Возможно переменные перезаписываются в других скриптах или в программе контроллера. Если не получается разобраться, то вышлите проект на support@simple-scada.com для проверки. Мы укажем что именно не так.
В общем разобрался. Получается, что функция GetVariableByName не возвращает nil в случае неудачи.
Потому, что если добавить aVar:=nil; то всё работает корректно:
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;
Получается, что функция GetVariableByName не возвращает nil в случае неудачи.
Нет, это не так. Функция GetVariableByName возвращает либо указатель на переменную, если переменная с таким именем существует, либо nil. Каких-то других вариантов нет. Вы сделали неправильный вывод.
Кроме того, такой код:
aVar:=nil;
aVar := GetVariableByName(aPrefix+intToStr(i));
, является абсолютно бессмысленным, т.к. вторая строка неизбежно переписывает результат первой строки. И если бы GetVariableByName не возвращала nil, то в aVar всё равно записывался бы неправильный указатель.
Можно предположить что в вашем проекте есть другая переменная c именем aVar (например объявленная в глобальном модуле, или в разделе переменных), либо какие-то грубые ошибки в скриптах (например зацикливание), либо переменная aVar используется где-то в скрипте уже после выполнения allfeeders. Точную причину можно назвать только проверив проект.