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

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

Автор Тема: Чтение массивов из arOPC  (Прочитано 4257 раз)

yetinov

  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
Чтение массивов из arOPC
« : 09 Мая 2025, 12:46:15 »
Добрый день, на modbus устройстве есть некий одномерный массив данных с адресами от 0 до 120 как передать этот массив в arOPC в виде массива, а не в виде отдельных переменных типа word? Или возможно ли как то передать значения списка внешних переменных ОРС сервера в локальный массив Simple Scada 2? Типы данных в редакторе переменных есть, но описания как этим пользоваться я не нашел.

yetinov

  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
Re: Чтение массивов из arOPC
« Ответ #1 : 10 Мая 2025, 08:59:46 »
Пока что я реализовал так, но получается громоздко, может все таки есть способ написать это как то более элегантно?:
1. 120 переменных типа Word на arOPC сервере с именами A1, A2... A120

2. В скаде объявил глобальный массив
Код: (delphi)
interface
var
  adrArray: array of Integer;
implementation
end.

3. В таймере в ручную каждую переменную поместил в массив и уже с массива отправляю запросы на запись в БД
Код: (delphi)
//Записываем в массив адреса датчиков
  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;
« Изменён: 12 Мая 2025, 07:07:43 от Simple Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: Чтение массивов из arOPC
« Ответ #2 : 13 Мая 2025, 10:21:45 »
Здравствуйте.

Если переменная на OPC-сервере является одномерным массивом, то её можно импортировать в скаду и использовать для чтения (внешние переменные являющиеся массивами  доступны только для чтения). См. описание и пример этой ссылке.

Вышеописанное касается только массивов, которые читаются с OPC-серверов. С массивами объявленными в скриптах можно работать как угодно (читать, записывать, менять размерность и т.п.).

Цитировать
может все таки есть способ написать это как то более элегантно?
Не совсем понятно зачем вообще нужен локальный массив в Вашем коде, когда можно просто пройти по переменным А1..А120 в цикле. Например:
Код: (delphi)
  // проходим по переменным А1..А120
  for i := 1 to 120 do
  begin
    aVar := GetVariableByName('A' + IntToStr(i));
    // здесь работаем c переменной
  end;

Пример для Вашего кода:
Код: (delphi)
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.

yetinov

  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
Re: Чтение массивов из arOPC
« Ответ #3 : 13 Мая 2025, 10:45:50 »
Ваш метод достаточно элегантен и удобен, то что нужно! Большое Вам спасибо!