Simple-Scada forum

Simple-Scada 2 => Ваши вопросы => Тема начата: pan-nn от 19 Апреля 2018, 12:09:05

Название: Массивы переменных
Отправлено: pan-nn от 19 Апреля 2018, 12:09:05
Добрый день.
В редакторе переменных обнаружил переменные типа "массив" (array)
Этот функционал реализован или просто пока заготовки?
Не получилось воспользоваться. Скрипты компилируются, но функционал не выполняется.
Если у вас реализовано  - можно пример скриптов?
Название: Re: массивы переменных
Отправлено: Simple_Scada от 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. Переходим в меню скриптов и создаем новый скрипт с типом события (https://simple-scada.com/help/script/event-types.html) "Изменились переменные". В список переменных добавляем нашу переменную-массив vrMyArray (как в этой инструкции (https://simple-scada.com/help/script/changemulvar.html)). Теперь этот скрипт будет вызываться каждый раз когда переменная-массив изменилась.

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.
Название: Re: Массивы переменных
Отправлено: pan-nn от 22 Апреля 2018, 12:32:50
А как инициализировать  такой массив начальными данными?
Название: Re: Массивы переменных
Отправлено: Simple-Scada от 25 Апреля 2018, 09:44:36
Цитировать
А как инициализировать  такой массив начальными данными?
Инициализировать или ещё как-то изменить массив не получится, т.к. как мы и писали: массивы доступны только для чтения. Т.е. можно только получить массив с любого OPC-DA сервера и работать с данными этого массива для чтения.
Название: Re: Массивы переменных
Отправлено: Eugene_ от 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".
Название: Re: Массивы переменных
Отправлено: Simple-Scada от 27 Июня 2022, 10:20:37
Здравствуйте.

Цитировать
но есть вопрос: адресация к биту массива в качестве адреса переменной - вообще допустима ? не удается найти на форуме и инструкции пример.
Почему возник вопрос тут - если подключатся OPC UA клиентом, например OPC UA browser, и в fw17 и в fw21 мне доступны биты (переменные) в переменной-массиве, меняется только визуальное отображение дерева переменных.
Скада никак не контролирует адрес переменной. Вы можете указать любое строковое значение в поле "Адрес". Во время запуска проекта скада передаёт адрес в неизменном виде OPC-серверу. Если такой адрес не существует (или OPC-сервер не может его понять), то OPC-сервер вернёт ошибку и скада отобразит её в журнале сервера (https://simple-scada.com/help/manual/server-journal.html). Поэтому, если OPC-сервер к которому Вы подключаетесь поддерживает адреса с указанием номера бита, то всё будет работать. Если у него такой поддержки нет, то он будет возвращать ошибки и не даст скаде подписаться на изменения битов.
Название: Re: Массивы переменных
Отправлено: Eugene_ от 28 Июня 2022, 11:27:04
Спасибо, все понятно. Вопрос закрыт тогда.
Название: Re: Массивы переменных
Отправлено: StanleyTucci от 02 Мая 2023, 14:40:24
Инициализировать или ещё как-то изменить массив не получится, т.к. как мы и писали: массивы доступны только для чтения. Т.е. можно только получить массив с любого OPC-DA сервера и работать с данными этого массива для чтения.
в 2023 инициализация и изменение массивов возможно?
Название: Re: Массивы переменных
Отправлено: Simple-Scada от 02 Мая 2023, 16:58:17
Объявлять и изменять массивы можно было всегда. Нельзя изменять только внешние переменные-массивы (которые считываются с OPC-сервера). Они доступны только для чтения.
Название: Re: Массивы переменных
Отправлено: sir от 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 и файлов?
Название: Re: Массивы переменных
Отправлено: Simple_Scada от 20 Сентября 2023, 12:22:45
Здравствуйте.

Цитировать
Это будет удобно, когда не хочется устанавливать SQL базу, а хранение пары сотен переменных надо сохранить, данные которых необходимо восстановить после загрузки.
Для этого у требуемых переменных можно включить опцию "Автоматическое восстановление (https://simple-scada.com/help/manual/varmain.html)", тогда значение переменной будет автоматически сохраняться, а при запуске проекта, сохраненное значение будет автоматически восстановлено.

Типы данных Array которые видны в окне добавления переменной (https://simple-scada.com/help/manual/variable-new.html) могут использоваться только для внешних тегов и только на чтение. Т.е., с их помощью можно получать в скаду значения из переменных-массивов с OPC-сервера.

Если Вам нужен не внешний массив с OPC-сервера, а массив который используется внутри скады, то нужно объявлять его в глобальном модуле (https://simple-scada.com/help/script/globalmodule.html) (или локально в скрипте, если нужно использовать только в пределах скрипта). Тогда это будет простой массив, не связанный с TM_Variable. К нему не придётся обращаться через свойство ".Value"  и т.п. и можно будет использовать его напрямую: myArray[0] := 55; Пример работы с массивами можно посмотреть в этом сообщении (https://simple-scada.com/forum/index.php?topic=1309.msg10124#msg10124).
Название: Re: Массивы переменных
Отправлено: sir от 20 Сентября 2023, 12:52:22
Да, все верно. Но задача - хранить 200-300 байт таким образом, чтобы восстанавливать после загрузки, а также выборочно изменять эти значения во время работы.
Конкретно, задача следующая. Есть три графика (отрисованы с помощью линий, точек, шкал и т.д., т.к. реализован функционал маткад, данные не в реальном времени, а по таймеру, кнопке измерения и т.д.). У каждого из графиков имеется 6 параметров настройки масштабирования, итого 18 значений. Всего режимов масштабирования 10. Потребуется 180 одиночных виртуальных переменных с вкл. режимом восстановления после загрузки, что неприемлемо, и хотелось бы иметь на такой случай массив в виртуальной переменной.
Глобальный массив временный, и после перезагрузки системы данные настроек исчезнут.
Остается либо SQL, либо файлы.
Вопрос по файлам, как выбрать строку для записи в текстовый файл, не перезаписывая перед ней все предыдущие строки?
Проект предоставить не могу, это ноу-хау завода, разработанное в маткад и реализованное мной в скаде для автоматического применения на стенде. Сейчас идет модернизация функционала, поэтому подскажите наилучшее решение вопроса, с которым постоянно сталкиваюсь. Привычка работы в С++..
Название: Re: Массивы переменных
Отправлено: Simple-Scada от 21 Сентября 2023, 12:33:45
Цитировать
Вопрос по файлам, как выбрать строку для записи в текстовый файл, не перезаписывая перед ней все предыдущие строки?
В текстовых файлах, для перехода к строке, нужно прочитать все предыдущие строки.

Если сохранять и загружать нужно числовые значения (или другие с типом данных фиксированной длины), то использовать текстовые файлы - наихудшее решение, используйте двоичные (https://simple-scada.com/help/script/binary-files.html). Числа можно записать в двоичный файл с типом данных фиксированной длины (integer, single, doube и т.п.), а значит можно быстро переходить к нужному числу, не читая предыдущие значения. Перезаписывать значение также можно без перезаписи последующих данных в файле (если тип данных не меняется).

Цитировать
Привычка работы в С++..
Работа с файлами по сути никак не отличается от C++. Все методы подробно описаны в этом разделе руководства (https://simple-scada.com/help/script/workfile.html).
Название: Re: Массивы переменных
Отправлено: sir от 21 Сентября 2023, 12:57:33
Спасибо за рекомендацию.
Есть ли более удобные и функциональные решения по части хранения и восстановления данных с Вашей точки зрения, как разработчиков данного ПО?
Название: Re: Массивы переменных
Отправлено: Simple_Scada от 24 Сентября 2023, 19:15:22
Для Вашей задачи можно использовать сохранение данных в файл или БД. Каких-либо других способов предложить не можем.