Пока что я реализовал так, но получается громоздко, может все таки есть способ написать это как то более элегантно?:
1. 120 переменных типа Word на arOPC сервере с именами A1, A2... A120
2. В скаде объявил глобальный массив
interface
var
adrArray: array of Integer;
implementation
end.
3. В таймере в ручную каждую переменную поместил в массив и уже с массива отправляю запросы на запись в БД
//Записываем в массив адреса датчиков
adrArray [1] := A1.Value;
adrArray [2] := A1.Value;
...
adrArray [120] := A120.Value; //120 СТРОК!!!
aQuery := 'DELETE FROM table_report; ';
//Запись в БД не пустых показаний
count := 1;
For i := 1 to 120 do begin
if (adrArray[i]>0) then begin
Insert('INSERT INTO `table_report` (id, adr, vs) VALUES ( ' + IntToStr(count) + ' , ' + IntToStr(adrArray) + ', ' + IntToStr(voltArray) + ' );', aQuery, 99999);
count := count + 1;
end;
end;
Здравствуйте.
Если переменная на OPC-сервере является одномерным массивом, то её можно импортировать в скаду и использовать для чтения (внешние переменные являющиеся массивами доступны только для чтения). См. описание и пример этой ссылке (https://simple-scada.com/forum/index.php?topic=597.msg5408#msg5408).
Вышеописанное касается только массивов, которые читаются с OPC-серверов. С массивами объявленными в скриптах можно работать как угодно (читать, записывать, менять размерность и т.п.).
может все таки есть способ написать это как то более элегантно?
Не совсем понятно зачем вообще нужен локальный массив в Вашем коде, когда можно просто пройти по переменным А1..А120 в цикле. Например:
// проходим по переменным А1..А120
for i := 1 to 120 do
begin
aVar := GetVariableByName('A' + IntToStr(i));
// здесь работаем c переменной
end;
Пример для Вашего кода:
var
aQuery: string;
aVar: TM_Variable;
begin
count := 1;
aQuery := 'DELETE FROM table_report; ';
for i := 1 to 120 do
begin
aVar := GetVariableByName('A' + IntToStr(i));
if (aVar.AsInt > 0) then
begin
Insert('INSERT INTO `table_report` (id, adr, vs) VALUES ( ' + IntToStr(count) + ' , ' + IntToStr(aVar.AsInt) + ', ' + IntToStr(voltArray[i]) + ' );', aQuery, 99999);
count := count + 1;
end;
end;
end.