Вопросы по скриптам в Simple-Scada 2

Автор Simple-Scada, 29 января 2016, 15:19:20

pan2000

#1665
   Здравствуйте.
Цитата: Gabrrr от 09 февраля 2026, 14:07:14Есть ли какая то возможность понять отображается где-то шаблонное окно или нет, чтобы я мог не выполнять скрипт для невидимых никому окон?
Стандартной возможности понять состояние окна нет. Но есть любительская, основанная на массиве пар <ссылка на окно> - <имя клиента>.
При открывании окна пара добавляется в массив. При закрывании - удаляется. При переходе на другую страницу или при отключении клиента удаляются все  пары клиента. Т.е. массив содержит информацию только об открытых окнах подключенных клиентов.
А далее пошли "прилады" - однотипный вызов скриптов для действий в открытых окнах. Скрипты выполняются один раз для каждого окна, независимо от того, сколько клиентов его открыло.
Во вложении пример в лучших традициях барона Мюнхгаузена - состояние массива выводится в таблицу, из которой в свою очередь, заполняются окна при открывании или при изменении таблицы. Переменные не используются, от слова вообще.
Цитата: Gabrrr от 09 февраля 2026, 14:07:14Или есть в принципе подход получше для решения такого рода задачи?
Вы изложили свой подход, но никак ни задачу. Для возможности других подходов недостаточно информации. "Огласите весь список, пж-жалуйста" (с) "Операция Ы и ...". Если это не страшная тайна, разумеется.

Елена_Силаева

#1666
Здравствуйте.
В проекте есть скрипт Nasos1 типа Таймер, который срабатывает раз в секунду.
Код: pascal
begin
  i.Value:=(i.Value+1)mod 100;
  Pump_Frequency.Value:=i.Value;
end.
Как его запустить по нажатию кнопки в обработчике OnClick?
Код: pascal
 begin
  Nasos1;
end.
     
Данный код не работает пишет не известный идентификатор.

Gabrrr

Цитата: pan2000 от 12 февраля 2026, 17:31:31Вы изложили свой подход, но никак ни задачу. Для возможности других подходов недостаточно информации. "Огласите весь список, пж-жалуйста" (с) "Операция Ы и ...". Если это не страшная тайна, разумеется.
Добрый день. Да я вроде довольно подробно изложил.
Но задача довольно банальная - обновить поля в окне, когда данные изменились. Конкретнее - есть куча мест хранения, отображаемая на мнемосхеме иконками. Тыкаем на иконку, открывается окно, в котором должна отображаться информации о том, что в этом месте хранится. Информация хранится в БД (хотя лично в моем подходе я использую таблицу в качестве буфера, для того чтобы хранить результаты последнего чтения, а не опрашивать БД каждый раз). Соответственно в окне места хранения есть несколько кнопок, например, "удалить предмет" или "создать предмет". Если я создаю предмет, то соответственно вызывается ещё одно окошко, которое надо заполнить. Если удаляю, то после окна конфирмации, я удаляю. И вот собственно вопрос отсюда и пошел. У меня на момент выполнения команд создания или удаления уже открыто окно с отображением информации. И эту информацию после выполненных действий надо как то обновить, без того чтобы оператор закрывал и открывал окно заново. А привязывать окна к внутренним переменным (в которые можно было бы закидывать результаты запроса) не очень хочется, т.к. даже структур и массивов для внутренних переменных нет, насколько я понял. 

pan2000

   Здравствуйте.
Цитата: Gabrrr от 14 февраля 2026, 20:07:45Да я вроде довольно подробно изложил.
Можно считать что основа проекта "революционная тройка": иконка, информационное окно и окно редактирования. Всех их объединяет уникальный параметр "местоположение".
Пример проекта при следующих условиях: окна совмещены, иконка не является шаблоном и информация о предмете укладывается в одну строку таблицы. Можно достаточно просто работать с этой тройкой одиночными запросами к БД и нет необходимости в таблице. Да и в переменных.
При инициализации шаблонного окна устанавливается цепочка ссылок на управляющие и информационные объекты окна. При открывании окна выполняется запрос к БД на обновление данных в окне.
В окне есть три управляющих кнопки: "НОВЫЙ", "ЗАПИСЬ" и "УДАЛИТЬ". Поля данных доступны для редактирования.

Simple_Scada

Цитата: Елена_Силаева от 13 февраля 2026, 10:48:49В проекте есть скрипт Nasos1 типа Таймер, который срабатывает раз в секунду.
Код: pascal
begin
  i.Value:=(i.Value+1)mod 100;
  Pump_Frequency.Value:=i.Value;
end.
Как его запустить по нажатию кнопки в обработчике OnClick?
1. Скрипт с типом события "Таймер" будет выполняться периодически, с заданным интервалом сразу после запуска проекта.
2. При работе со значением переменной, рекомендуем использовать явное приведение к нужному типу, например .AsInt, .AsBool и так далее. Также, использование свойства ".Value" в условиях может приводить к некорректной работе – подробнее см. по ссылке.

Если требуется, чтобы код выполнялся по дополнительным условиям, то такие условия нужно добавить в скрипт. Например, чтобы код скрипта выполнялся после нажатия на кнопку необходимо:
1. Создать переменную с типом данных "Boolean", например с именем "vrStart".
2. Связать кнопку с данной переменной.
3. Изменить код скрипта следующим образом:
Код: pascal
begin
  if vrStart.AsBool then   // если значение переменной vrStart равно True, то
  begin
    i.Value := (i.AsInt + 1) mod 100;
    Pump_Frequency.Value := i.AsInt;
  end;
end.

При желании, Вы можете прислать нам на support@simple-scada.com текущую версию проекта из директории "..\Simple-Scada 2\Projects\" и максимально подробно описать задачу. Возможно мы сможем предложить более простое решение.

Gabrrr

Цитата: pan2000 от 16 февраля 2026, 05:37:32иконка не является шаблоном
Я потыкался, но не понимаю откуда это ограничение. Вроде как без разницы кто окно вызовет шаблон или просто объект. Вся "магия" у вас вроде внутри окна происходит.

Цитата: pan2000 от 16 февраля 2026, 05:37:32Можно достаточно просто работать с этой тройкой одиночными запросами к БД и нет необходимости в таблице
У меня к таблице ещё состояние иконок привязано, чтобы было понятно заполнено (т.е. есть какая то информация в БД отличная от нулл для этого места). Я конечно чую, что я  в определенный момент где-то окараюсь и не обновлю вовремя таблицу, но и слать сотни мелких запросов вместо одного большого как будто странно.

Цитата: pan2000 от 16 февраля 2026, 05:37:32При инициализации шаблонного окна устанавливается цепочка ссылок на управляющие и информационные объекты окна.
Это действительно интересная идея и реализация. Думаю цепочку ссылающихся друг на друга объектов могу куда то прикрутить.
А подскажите в SimpleScada инициализация этих шаблонных окон ведь происходит на этапе компиляции/старта сервера? Т.е. когда вы в проекте сделали ссылки на TemplateWnd1 для нескольких текстовых полей, то экземпляры этого окна сразу создались? Или они в момент клика реально инициализируются и появляются в памяти?

И ещё, хотя это немного оффтопик для данной темы, не подскажите как обычно реализуют многострочный ввод/отображение текстовой информации. Т.е. у меня будет запись в бд "комментарий" для каждого места, который неплохо было бы вводить, да и отображать, в несколько строк для читаемости. Для вывода я так понимаю можно подменять что-то на #13#10, либо просто читать текст из БД в котором уже есть переносы строк, но как это вводить не очень понятно. Пока идеи или заставлять оператора использовать какой то символ (условно @) в качестве символа переноса, или делать несколько полей для ввода, каждое из которых будет отвечать за свою строку.



pan2000

#1671
       Здравствуйте.
Цитата: Gabrrr от 16 февраля 2026, 17:22:15иконка не является шаблоном
На опережение, в случае требования двух окон - информационного и редактирования, т.к одностороннюю ссылку между объектами разных шаблонов можно организовать только через обычный объект, имеющий свойство UserData.
Ссылки на объекты шаблонов можно хранить и в глобальном скрипте, но там свои сложности из-за неопределенного порядка выполнения скриптов инициализации.

ЦитироватьУ меня к таблице ещё состояние иконок привязано
Очередной пример с индикацией состояния мест хранения, тут уж иконка обязательно должна быть обычным объектом.

ЦитироватьА подскажите в SimpleScada инициализация этих шаблонных окон ведь происходит на этапе компиляции/старта сервера?
Точно ответить могут лишь авторы Simple-Scada, но полагаю, что создание на этапе компиляции, а инициализация при запуске проекта. Ссылки - сила! Жаль что ссылочное свойство UserData есть не у всех объектов и его не видно в инспекторе.

Цитировать...как обычно реализуют многострочный ввод/отображение текстовой информации
Можно попробовать "Пишущую машинку" из вложения. Это просто основа, к которой можно добавить редактирование,  и т.д.

Gabrrr

Цитата: pan2000 от 16 февраля 2026, 20:49:17Очередной пример с индикацией состояния мест хранения, тут уж иконка обязательно должна быть обычным объектом.   
Большое спасибо за уделенное время. Я точно пару полезных вещей подсмотрел. Не уверен правда пока на каком варианте остановиться, то что у меня было или что-то ближе к вашему сделать.

ЦитироватьМожно попробовать "Пишущую машинку" из вложения. Это просто основа, к которой можно добавить редактирование,  и т.д.
Как вариант. Для меня может даже проще будет просто таблицу использовать, а при чтении парсить знаки переноса обратно в новую строку таблицы.

gl_ingener@nurzhanar.kz

#1673
Добрый день. почему не работает данный скрипт.
Код: pascal
var
  aQuery: string;
begin
  // запрос на вставку в БД значения переменной vrTemperature
  aQuery := 'INSERT IGNORE INTO `my_archive` (`timestamp`, `value`) ' +
            'VALUES (NOW(), ' + QuotedStr(vrTemperature.AsStr) + ')';
  RunSQL(aQuery, nil, 0);
end.
Необходимо сохранять переменную в базе данных. Делал все по инструкции, не работает

Simple Scada

Здравствуйте.

1. В любых непонятных ситуациях нужно в первую очередь проверить журнал сервера скады. С большой вероятностью в нем будут содержаться ошибки или предупреждения, которые укажут, в чем именно проблема.
2. В примере по ссылке описано, как сохранять значение требуемой переменной с заданной периодичностью в свою таблицу БД. Если строго следовать руководству, то проблем быть не должно. Убедитесь, что в проекте настроено подключение к БД и в указанной БД создана таблица "my_archive".
3. Какая версия Simple-Scada используется? Возможно, Вы используете версию с ограничением на выполнение SQL-запросов – это версии Minimal и Demo-64.
4. Если требуется архивация переменных, то в этом случае использовать скрипты не требуется. Для этого нужно у требуемых переменных настроить архивацию – описание доступных способов архивации и их настроек доступно по ссылке. Тогда, после запуска проекта переменные, у которых включена архивация будут архивироваться в БД и можно будет работать с архивными данными этих переменных, например просмотреть тренды, создать отчет и т.д.

Если самостоятельно разобраться не получится, то пришлите на support@simple-scada.com целиком папку с логами "..\Simple-Scada 2\Logs", текущую версию проекта из директории "..\Simple-Scada 2\Projects\" и укажите проблемный скрипт. Также, пришлите скриншот вкладки "Состояние сервера".

gl_ingener@nurzhanar.kz

Большое спасибо разобрался. Установили демо версию на 64 тега

gl_ingener@nurzhanar.kz

#1676
Данный скрипт запускал по событию Изменились переменные. Добавил в список скрипта необходимые переменные которые нужно передавать в БД в кол. 10-15 шт. Все работает, а как теперь при перезагрузке scada системы записать последние данные из БД в эти переменные обратно. у меня все сбрасывается.
Код: pascal
var
  aQuery: string;
begin
  // запрос на вставку в БД значения переменной vrTemperature
  aQuery := 'INSERT IGNORE INTO `my_archive` (`timestamp`, `value`) ' +
            'VALUES (NOW(), ' + QuotedStr(vrTemperature.AsStr) + ')';
  RunSQL(aQuery, nil, 0);
end.
Хотим обвязать данной системой Емкости брожения пива
заранее спасибо

Simple_Scada

Здравствуйте.

Пришлите на support@simple-scada.com текущую версию Вашего проекта из директории "..\Simple-Scada 2\Projects\" и подробно опишите, какую именно задачу Вы пытаетесь решить. Переменные внешние (с OPC-сервера) или внутренние?

aMster

#1678
Подскажите ( к сожалению с ходу 112 страниц не осилил)
отрабатываем индикацию аварии ( приходит с OPC в булевой переменной)
Имеется "изображение" которому по изменению переменной на 1, скриптом меняем цвет Color:=clRed, а при изменении на 0 возвращаем цвет обратно Color:=clWhite.
только пока "изображение" было белым, все было прекрасно, но вот когда добавилось "изображение" серого цвета, картинка поломалось. после запуска серое изображение становится белым, а при изменении переменной красным.
Можно ли каким-то образом вернуть цвет "по умолчанию" который прописан в редакторе? или на каждый основной цвет надо собственный скрипт делать?

Simple Scada

Здравствуйте.

Чтобы вернуть изначальный цвет объекта, можно использовать процедуру "SetInitialColor".
Код: pascal
begin
  if Sender is TM_Image then    // проверяем, что Sender это изображение
    with Sender as TM_Image do  // приводим Sender к типу "TM_Image"
      if AsBool then            // если значение переменной изображения равно True/1, то
        Color := clRed          // изменить цвет изображения на красный
      else                      // иначе
        SetInitialColor;        // вернуть изначальный цвет
end.