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

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

Автор Тема: Распаковка массива строк в локальные переменные пишет @@@D  (Прочитано 212 раз)

Лиза

  • Новичок
  • *
  • Сообщений: 4
    • Просмотр профиля
Здравствуйте.
Столкнулась с такой ситуацией: есть скрипт, которые распаковывыает 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 эту переменную и заново добавить из программы, все снова работает.

В чем проблема?
« Изменён: 22 Июля 2026, 11:24:59 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3224
    • Просмотр профиля
    • Simple-Scada
Здравствуйте.

1. Не нужно никогда искать объекты/переменные по имени, если имя уже известно. Обращайтесь к ним напрямую;
2. Если Вы ищете переменную по имени, то ищите один раз, а затем используйте найденный результат, вместо повторного поиска через GetVariableByName;
3. Если нужно значение из массива в виде строки, то лучше использовать свойство ValuesStr, а не 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.