Здравствуйте.
Столкнулась с такой ситуацией: есть скрипт, которые распаковывыает Report_arData (массив String) из PLC (opc da) в локальные переменные LocReport_arData0, LocReport_arData01 .. LocReport_arData30(количество локальных переменных равно длине массива) типа String:
var
aVarArray: TM_Variable;
i1 : integer;
varName : string;
begin
aVarArray := GetVariableByName('Report_arData');
for i1:= 0 to GetVariableByName('Report_arData').HighBound do
begin
varName := 'LocReport_arData'+ IntToStr(i1);
if ( (GetVariableByName(varName) <> nil) ) then
GetVariableByName(varName).Value := aVarArray.Values[i1];
end;
end.
Если я в программе изменю количество элементов массива строк Report_arData (количество локальных переменных для распаковки увеличила в ручную в зависимости от длины массива строк), SimpleScada пишет в каждой локальной переменной распаковки LocReport_arData0, LocReport_arData01 .. LocReport_arData30 : @@@D.
Если удалить из SimpleScada эту переменную и заново добавить из программы, все снова работает.
В чем проблема?
Здравствуйте.
1. Не нужно никогда искать объекты/переменные по имени, если имя уже известно. Обращайтесь к ним напрямую;
2. Если Вы ищете переменную по имени, то ищите один раз, а затем используйте найденный результат, вместо повторного поиска через GetVariableByName;
3. Если нужно значение из массива в виде строки, то лучше использовать свойство ValuesStr (https://simple-scada.com/help/script/arrvaluesstr.html), а не Values;
Пример:
var
i1: integer;
localVar: TM_Variable;
begin
for i1 := Report_arData.LowBound to Report_arData.HighBound do
begin
localVar := GetVariableByName('LocReport_arData' + IntToStr(i1));
if localVar <> nil then
localVar.Value := Report_arData.ValuesStr[i1];
end;
end.
Если решить проблему не получается, то пришлите проект в котором она воспроизводится на support@simple-scada.com.