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

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

Автор Тема: Массивы переменных  (Прочитано 8222 раз)

pan-nn

  • Новичок
  • *
  • Сообщений: 30
    • Просмотр профиля
Массивы переменных
« : 19 Апреля 2018, 12:09:05 »
Добрый день.
В редакторе переменных обнаружил переменные типа "массив" (array)
Этот функционал реализован или просто пока заготовки?
Не получилось воспользоваться. Скрипты компилируются, но функционал не выполняется.
Если у вас реализовано  - можно пример скриптов?
« Изменён: 20 Апреля 2018, 11:43:00 от Simple_Scada »

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1365
    • Просмотр профиля
Re: массивы переменных
« Ответ #1 : 20 Апреля 2018, 11:42:35 »
Здравствуйте!

Массивы нужно раскладывать по виртуальным переменным, а затем работать с этими переменными. Массивы доступны только для чтения. Если есть возможность, то лучше обойтись без использования массивов, т.к. работа со стандартными переменными напрямую будет более оптимальной.

У каждой переменной есть свойства для работы с массивами:

property LowBound: Integer;
Возвращает начальный индекс массива

property HighBound: Integer;
Возвращает конечный индекс массива

property Values[AIndex: Integer]: Variant;
Возвращает значение с индексом AIndex из массива.

property ValuesStr[AIndex: Integer]: string;
Возвращает значение с индексом AIndex из массива переведённое в строку.

Рассмотрим простой пример. Допустим у нас есть переменная массив (строк) с именем vrMyArray и нам нужно разложить массив по трём отдельным внутренним переменным vrStr1, vrStr2, vrStr3. Тогда решение будет таким:

1. Переходим в меню скриптов и создаем новый скрипт с типом события "Изменились переменные". В список переменных добавляем нашу переменную-массив vrMyArray (как в этой инструкции). Теперь этот скрипт будет вызываться каждый раз когда переменная-массив изменилась.

2. Пишем такой код в скрипт:
Код: (delphi)
begin
  vrStr1.Value := Variable.ValuesStr[0];
  vrStr2.Value := Variable.ValuesStr[1];
  vrStr3.Value := Variable.ValuesStr[2];
end.

Готово. В скрипте мы в переменную vrStr1 записываем первое значение из массива. В vrStr2 второе значение из массива и так далее. Такой способ подходит если нам точно известно, что массив содержит три элемента. Если массив может содержать любое количество элементов, или его размер меняется во время работы проекта, то нужно проходить по элементам массива в цикле, например так:
Код: (delphi)
var
  I: Integer;
begin
  // проходим в цикле по каждому элементу массива
  for I := Variable.LowBound to Variable.HighBound do
    Text1.Text := Text1.Text + ', ' + Variable.ValuesStr[I];
end.
« Изменён: 28 Января 2025, 12:10:13 от Simple-Scada »

pan-nn

  • Новичок
  • *
  • Сообщений: 30
    • Просмотр профиля
Re: Массивы переменных
« Ответ #2 : 22 Апреля 2018, 12:32:50 »
А как инициализировать  такой массив начальными данными?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3197
    • Просмотр профиля
    • Simple-Scada
Re: Массивы переменных
« Ответ #3 : 25 Апреля 2018, 09:44:36 »
Цитировать
А как инициализировать  такой массив начальными данными?
Инициализировать или ещё как-то изменить массив не получится, т.к. как мы и писали: массивы доступны только для чтения. Т.е. можно только получить массив с любого OPC-DA сервера и работать с данными этого массива для чтения.

Eugene_

  • Пользователь
  • **
  • Сообщений: 92
    • Просмотр профиля
Re: Массивы переменных
« Ответ #4 : 24 Июня 2022, 10:32:31 »
Вопрос по чтению переменной массива, версия 2.6.1.0, не совсем полностью относится к Simple Scada но хотелось бы уточнить.

Есть контроллер Wago с прошивкой fw17, в нем объявлен массив вида и отображен в  OPC UA
array1 : array [0..7] of bool;

При подключении SS к этому OPC UA я могу импортировать переменные сразу вида BOOL, то есть к примеру переменная B0 будет иметь адрес ххх.ххх.ххх.array1[0]. И такая конструкция работает, могу читать один бит, могу прочитать все биты переменной-массива из ОPC UA, без преобразования скриптами получить сразу двоичную переменную.

Далее делаем тоже самое, но в fw21 и соответственно измененной, приведенной более близко к спецификации OPC UA прошивке контроллера, и такая адресация уже не работает, сервер SS при запуске в логах дает справедливую ошибку о неверном адресе.

Понятно, что дело не в SCADA совершенно, но есть вопрос: адресация к биту массива в качестве адреса переменной - вообще допустима ? не удается найти на форуме и инструкции пример.
Почему возник вопрос тут - если подключатся OPC UA клиентом, например OPC UA browser, и в fw17 и в fw21 мне доступны биты (переменные) в переменной-массиве, меняется только визуальное отображение дерева переменных.

upd: c FW17 и выше изменился встроенный ОРС UA сервер, с  "3S OPC UA Server" на "WAGO OPC UA server".
« Изменён: 24 Июня 2022, 12:41:28 от Eugene_ »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3197
    • Просмотр профиля
    • Simple-Scada
Re: Массивы переменных
« Ответ #5 : 27 Июня 2022, 10:20:37 »
Здравствуйте.

Цитировать
но есть вопрос: адресация к биту массива в качестве адреса переменной - вообще допустима ? не удается найти на форуме и инструкции пример.
Почему возник вопрос тут - если подключатся OPC UA клиентом, например OPC UA browser, и в fw17 и в fw21 мне доступны биты (переменные) в переменной-массиве, меняется только визуальное отображение дерева переменных.
Скада никак не контролирует адрес переменной. Вы можете указать любое строковое значение в поле "Адрес". Во время запуска проекта скада передаёт адрес в неизменном виде OPC-серверу. Если такой адрес не существует (или OPC-сервер не может его понять), то OPC-сервер вернёт ошибку и скада отобразит её в журнале сервера. Поэтому, если OPC-сервер к которому Вы подключаетесь поддерживает адреса с указанием номера бита, то всё будет работать. Если у него такой поддержки нет, то он будет возвращать ошибки и не даст скаде подписаться на изменения битов.
« Изменён: 28 Июня 2022, 11:44:18 от Simple-Scada »

Eugene_

  • Пользователь
  • **
  • Сообщений: 92
    • Просмотр профиля
Re: Массивы переменных
« Ответ #6 : 28 Июня 2022, 11:27:04 »
Спасибо, все понятно. Вопрос закрыт тогда.

StanleyTucci

  • Новичок
  • *
  • Сообщений: 18
    • Просмотр профиля
Re: Массивы переменных
« Ответ #7 : 02 Мая 2023, 14:40:24 »
Инициализировать или ещё как-то изменить массив не получится, т.к. как мы и писали: массивы доступны только для чтения. Т.е. можно только получить массив с любого OPC-DA сервера и работать с данными этого массива для чтения.
в 2023 инициализация и изменение массивов возможно?
« Изменён: 02 Мая 2023, 16:58:26 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3197
    • Просмотр профиля
    • Simple-Scada
Re: Массивы переменных
« Ответ #8 : 02 Мая 2023, 16:58:17 »
Объявлять и изменять массивы можно было всегда. Нельзя изменять только внешние переменные-массивы (которые считываются с OPC-сервера). Они доступны только для чтения.

sir

  • Новичок
  • *
  • Сообщений: 16
    • Просмотр профиля
Re: Массивы переменных
« Ответ #9 : 19 Сентября 2023, 15:36:03 »
Объявлять и изменять массивы можно было всегда. Нельзя изменять только внешние переменные-массивы (которые считываются с OPC-сервера). Они доступны только для чтения.
Здравствуйте!
Можете в примерах показать, как изменять данные локальных массивов.
Например, SQL база данных у нас не установлена, а данные хранить необходимо.
Мы создаем локальный массив с типом данных Byte array.
Тип: Внутренний тег (виртуальная переменная).
Если есть возможность создания массива типа локальной переменной, и она не связана с OPC вервером - Как писать и читать данный массив на delphy?
Запись командой типа Massiv_KPD.Values[0] := 1; - невозможна.
Но запись возможна командой типа Massiv_KPD.Value := 1;
Таким образом, одну ячейку мы все же можем записывать, но смысл тогда в переменной типа Byte array как внутреннего тега?
Получается ситуация, когда у нас существует внутренняя локальная переменная типа array, в которую возможно записать лишь один байт, но у нас тип - массив.
Возможно в этой переменной кроется какой-то другой смысл?
Если его нет, то предлагаю все же открыть возможность записи для применения как массив внутренней локальной переменной.
Это будет удобно, когда не хочется устанавливать SQL базу, а хранение пары сотен переменных надо сохранить, данные которых необходимо восстановить после загрузки.
Не создавать же для каждого байта кучу внутренних переменных...
Возможно Вы предложите более рациональный способ хранения данных, без использования SQL и файлов?
« Изменён: 19 Сентября 2023, 21:52:26 от sir »

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1365
    • Просмотр профиля
Re: Массивы переменных
« Ответ #10 : 20 Сентября 2023, 12:22:45 »
Здравствуйте.

Цитировать
Это будет удобно, когда не хочется устанавливать SQL базу, а хранение пары сотен переменных надо сохранить, данные которых необходимо восстановить после загрузки.
Для этого у требуемых переменных можно включить опцию "Автоматическое восстановление", тогда значение переменной будет автоматически сохраняться, а при запуске проекта, сохраненное значение будет автоматически восстановлено.

Типы данных Array которые видны в окне добавления переменной могут использоваться только для внешних тегов и только на чтение. Т.е., с их помощью можно получать в скаду значения из переменных-массивов с OPC-сервера.

Если Вам нужен не внешний массив с OPC-сервера, а массив который используется внутри скады, то нужно объявлять его в глобальном модуле (или локально в скрипте, если нужно использовать только в пределах скрипта). Тогда это будет простой массив, не связанный с TM_Variable. К нему не придётся обращаться через свойство ".Value"  и т.п. и можно будет использовать его напрямую: myArray[0] := 55; Пример работы с массивами можно посмотреть в этом сообщении.

sir

  • Новичок
  • *
  • Сообщений: 16
    • Просмотр профиля
Re: Массивы переменных
« Ответ #11 : 20 Сентября 2023, 12:52:22 »
Да, все верно. Но задача - хранить 200-300 байт таким образом, чтобы восстанавливать после загрузки, а также выборочно изменять эти значения во время работы.
Конкретно, задача следующая. Есть три графика (отрисованы с помощью линий, точек, шкал и т.д., т.к. реализован функционал маткад, данные не в реальном времени, а по таймеру, кнопке измерения и т.д.). У каждого из графиков имеется 6 параметров настройки масштабирования, итого 18 значений. Всего режимов масштабирования 10. Потребуется 180 одиночных виртуальных переменных с вкл. режимом восстановления после загрузки, что неприемлемо, и хотелось бы иметь на такой случай массив в виртуальной переменной.
Глобальный массив временный, и после перезагрузки системы данные настроек исчезнут.
Остается либо SQL, либо файлы.
Вопрос по файлам, как выбрать строку для записи в текстовый файл, не перезаписывая перед ней все предыдущие строки?
Проект предоставить не могу, это ноу-хау завода, разработанное в маткад и реализованное мной в скаде для автоматического применения на стенде. Сейчас идет модернизация функционала, поэтому подскажите наилучшее решение вопроса, с которым постоянно сталкиваюсь. Привычка работы в С++..
« Изменён: 20 Сентября 2023, 13:48:32 от Simple_Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3197
    • Просмотр профиля
    • Simple-Scada
Re: Массивы переменных
« Ответ #12 : 21 Сентября 2023, 12:33:45 »
Цитировать
Вопрос по файлам, как выбрать строку для записи в текстовый файл, не перезаписывая перед ней все предыдущие строки?
В текстовых файлах, для перехода к строке, нужно прочитать все предыдущие строки.

Если сохранять и загружать нужно числовые значения (или другие с типом данных фиксированной длины), то использовать текстовые файлы - наихудшее решение, используйте двоичные. Числа можно записать в двоичный файл с типом данных фиксированной длины (integer, single, doube и т.п.), а значит можно быстро переходить к нужному числу, не читая предыдущие значения. Перезаписывать значение также можно без перезаписи последующих данных в файле (если тип данных не меняется).

Цитировать
Привычка работы в С++..
Работа с файлами по сути никак не отличается от C++. Все методы подробно описаны в этом разделе руководства.

sir

  • Новичок
  • *
  • Сообщений: 16
    • Просмотр профиля
Re: Массивы переменных
« Ответ #13 : 21 Сентября 2023, 12:57:33 »
Спасибо за рекомендацию.
Есть ли более удобные и функциональные решения по части хранения и восстановления данных с Вашей точки зрения, как разработчиков данного ПО?

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1365
    • Просмотр профиля
Re: Массивы переменных
« Ответ #14 : 24 Сентября 2023, 19:15:22 »
Для Вашей задачи можно использовать сохранение данных в файл или БД. Каких-либо других способов предложить не можем.