Simple-Scada forum

Simple-Scada 2 => Ваши вопросы => Тема начата: Лиза от 22 Июля 2026, 11:23:14

Название: Распаковка массива строк в локальные переменные пишет @@@D
Отправлено: Лиза от 22 Июля 2026, 11:23:14
Здравствуйте.
Столкнулась с такой ситуацией: есть скрипт, которые распаковывыает Report_arData (массив String) из PLC (opc da) в локальные переменные LocReport_arData0, LocReport_arData01 .. LocReport_arData30(количество локальных переменных равно длине массива) типа String:
Код: (delphi)
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 эту переменную и заново добавить из программы, все снова работает.

В чем проблема?
Название: Re: Распаковка массива строк в локальные переменные пишет @@@D
Отправлено: Simple-Scada от 23 Июля 2026, 10:03:53
Здравствуйте.

1. Не нужно никогда искать объекты/переменные по имени, если имя уже известно. Обращайтесь к ним напрямую;
2. Если Вы ищете переменную по имени, то ищите один раз, а затем используйте найденный результат, вместо повторного поиска через GetVariableByName;
3. Если нужно значение из массива в виде строки, то лучше использовать свойство ValuesStr (https://simple-scada.com/help/script/arrvaluesstr.html), а не Values;

Пример:
Код: (delphi)
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.