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

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

Автор Тема: Вопросы по скриптам в Simple-Scada 2  (Прочитано 530291 раз)

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3202
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1515 : 29 Мая 2024, 16:25:16 »
Цитировать
В документации написано, что в нем содержится параметр SQLErrorData c тремя свойствами. Но при компиляции кода примера подобного скрипта из документации выдается ошибка - он не знает такого параметра.
Значит Вы используете старую версию ПО, в которой этого параметра ещё не было. Обновитесь до последней версии, либо используйте руководство, которое соответствует используемой Вами версии (руководство устанавливается вместе со скадой).

Цитировать
есть ли что то подобное с установкой значения переменной через готовую процедуру типа SetValue?
Можно использовать метод Inc - см. описание и примеры в руководстве. Также, следует учитывать, что если у кнопки в свойстве "Переменная" указана переменная, то при нажатии кнопка будет изменять значение этой переменной в соответствии с установленными значениями в свойстве "Состояния". В этом случае, нет смысла пытаться записать значение в переменную кнопки через скрипт. Переменную следует указать в свойстве кнопки "Доп. переменная", после чего можно использовать свойство переменной VariableEx. Пример скрипта на событие "OnClick":
Код: (delphi)
begin
  if Sender is TM_Object then   // проверяем, что Sender это объект
    with Sender as TM_Object do // приводим Sender к типу "TM_Object"
      { увеличить значение доп. переменной на 1
        не нарушая максимальную границу переменной }
      VariableEx.Inc(1);
end.
« Изменён: 29 Мая 2024, 16:37:34 от Simple_Scada »

teplocom

  • Новичок
  • *
  • Сообщений: 47
  • с чувством уверенности в завтрашнем дне
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1516 : 01 Июня 2024, 23:08:52 »
Доброго!
Стоит задача "изменение уставки котла" из трех разных мест:
-на ПЛК (сетевая переменная А)
-на SimpleSCADA (та же переменная А, в ПЛК синхронизируется с внутренней переменной, эта часть работает давно)
-на OwenCloud (для упрощения - регистр задания t через облако у меня можно представлять как еще одно ModBus slave-утсройство, которое опрашивается SimpleSCADA)
Правильно ли будет реализовать "синхронизацию данных" этой уставки, которая может поменяться в любом из этих мест, через скрипт "Изменилась переменная":
Изменилась переменная А, тогда скрипт:
B.Value:=A.Value;
Если случилось изменение переменной B скрипт:
А.Value:=В.Value;

Не будет ли зацикливания и сбоев? Когда например нет связи и с ОРС приходит В=0.
Или на такие случаи лучше писать условие: если плохое качество А или В или переменные вне зоны здравого смысла (<40 или >100) тогда не выполнять обновление?

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1369
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1517 : 02 Июня 2024, 23:46:08 »
Здравствуйте.

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

teplocom

  • Новичок
  • *
  • Сообщений: 47
  • с чувством уверенности в завтрашнем дне
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1518 : 03 Июня 2024, 09:29:01 »
Иерархия сети..
ПЛК не имеет выхода в интернет, подключен к SimpleSCADA через RS485. Как некое компромиссное решение с "администратором сети", используется шлюз ПМ210 (хотя и от наличия ПМ210"администратор" не в восторге), который подключен к ПК (также не имеющего выход в интернет) по RS485 и забирает в облако то, что насобирала SCADA.
Поэтому и приходится "синхронизировать" все через SimpleSCADA.
« Изменён: 03 Июня 2024, 12:36:50 от Simple_Scada »

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1369
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1519 : 04 Июня 2024, 17:13:11 »
Для надежной реализации управления уставкой из нескольких мест, должна использоваться одна переменная, которая хранится на ПЛК. Все клиенты (скада, OwenCloud и т.д.) должны напрямую использовать эту переменную, без каких-либо промежуточных переменных и их синхронизации. Исходя из Вашего описания, рекомендуем вместо скады подключить шлюз ПМ210 к ПЛК и читать данные в OwenCloud напрямую с ПЛК. Тогда из всех перечисленных мест будет прямой доступ к управлению переменной уставки и не потребуется ничего синхронизировать.

Цитировать
Правильно ли будет реализовать "синхронизацию данных" этой уставки, которая может поменяться в любом из этих мест, через скрипт "Изменилась переменная":
Изменилась переменная А, тогда скрипт:
B.Value:=A.Value;
Если случилось изменение переменной B скрипт:
А.Value:=В.Value;
Такая реализация может привести к потенциальному зацикливанию скриптов друг на друга и бесконечному росту очереди скриптов - подробнее см. по ссылке. Поэтому рекомендуем использовать способ описанный выше.

avtzarenko

  • Новичок
  • *
  • Сообщений: 10
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1520 : 21 Июня 2024, 11:51:33 »
Добрый день.

Требуется при наступлении определенного времени (в моём случае начало смены - 00:00:01, 08:00:01, 16:00:01) в переменные записывалось значение 0,
переменные - vrStartCount_Botle, vrStartCount_Tunnel, vrStartCount_Foil,  vrStartCount_label

написал скрипт на исполнение в 1 сек, но ругается при компиляции на then.
Подскажите как исправить скрипт?
Код: (delphi)
var
  dt1: TDateTime;
  dt2: TDateTime;
  dt3: TDateTime;
begin
  dt1 := Now;
  dt2 := Now;
  dt3 := Now;
  { если часы, минуты и секунды равны началу смены}
  if ((HourOf(dt1) = '00' and      (MinuteOf(dt1) = '00' and     (SecondOf(dt1) = '01') or
     (((HourOf(dt2) = '08' and     (MinuteOf(dt2) = '00' and     (SecondOf(dt2) = '01') or
     ((HourOf(dt3) = '16' and      (MinuteOf(dt3) = '00' and     (SecondOf(dt3) = '01')  then
 begin
    vrStartCount_Botle.Value := 0 ;
    vrStartCount_Tunnel.Value  := 0 ;
    vrStartCount_Foil.Value := 0    ;
    vrStartCount_label.Value := 0  ;
  end;
end.
« Изменён: 21 Июня 2024, 12:06:42 от Simple_Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3202
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1521 : 22 Июня 2024, 17:25:54 »
avtzarenko, не используйте такой код в реальных проектах, т.к. он ненадёжен. Скрипт не учитывает, что на ПК может использоваться синхронизации времени с интернет-сервером и первая секунда может быть пропущена (т.е. условие "SecondOf(dt1) = 1" может никогда не выполниться). Аналогично ПК может просто подтормозить из-за выполнения каких-то тяжелых задач и т.п.

Вот корректное решение задачи:
1. Создать скрипт с типом события "Начало часа";
2. Написать в нём такой код:
Код: (delphi)
var
  aHour: Word;
begin
  aHour := HourOf(Now);
  if (aHour = 0) or (aHour = 8) or (aHour = 16) then
  begin
    vrStartCount_Botle.Value := 0;
    vrStartCount_Tunnel.Value  := 0;
    vrStartCount_Foil.Value := 0;
    vrStartCount_label.Value := 0;
  end;
end.

URIY

  • Новичок
  • *
  • Сообщений: 1
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1522 : 10 Июля 2024, 14:48:53 »
Добрый день.
Подскажите как из списка взять переменную и отправить в ОРС и как сократить код если 60 списков в 60 переменных.

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1369
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1523 : 12 Июля 2024, 13:29:18 »
Здравствуйте.

Если требуется записывать значение в переменную, связанную с компонентом "Список", то писать скрипты не требуется. Свяжите компонент "Список" с переменной (см. свойство "Переменная") и заполните соответствующими строками (см. свойство "Строка"). Теперь при выборе нужной строки в переменную будет записываться соответствующее значение.

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

Egor2000

  • Новичок
  • *
  • Сообщений: 1
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1524 : 16 Июля 2024, 15:41:14 »
Здравствуйте. Процедура ArchiveAverage (архивирует средневзвешенное значение):
если в диапазоне данных есть числа больше нуля - итоговое число подсчитывается (например за 20 минут) и оно больше нуля, а если в этот диапазон попадает ноль или отрицательное число, то итоговое число становится равно 0, несмотря на то, что положительные числа тоже были в этом диапазоне.
Ноль или отрицательное число в итоге влияет на результат, который становится равным нулю?
« Изменён: 16 Июля 2024, 15:54:56 от Egor2000 »

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1369
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1525 : 17 Июля 2024, 12:40:11 »
Здравствуйте.

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

ymaksyuta

  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1526 : 23 Июля 2024, 14:07:15 »
Можно ли создавать контролы динамически?
Точнее, создать можно, например:
button := TM_Button.Create()
Вопрос в том, как поместить на нужную страницу/окно?

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1369
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1527 : 23 Июля 2024, 15:06:19 »
Здравствуйте.

Такой возможности нет.

Lordhmen

  • Новичок
  • *
  • Сообщений: 12
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1528 : 24 Июля 2024, 16:19:09 »
Здравствуйте!

Опишу ситуацию: есть ПЛК, который управляет станком. За один производственный цикл, на этом ПЛК используется 2 прошивки. Тоесть начинается цикл на одной прошивке, в серидине останавливаем, перепрошиваем ПЛК и прододжаем цикл. в OPC сервере реализовал один ПЛК, как два разных устройства. В скаде создал таблицу и в ячейки назначаю в основную переменную - переменнные из первой прошивке, а в доп переменную ячейки я назначаю переменные из второй прошивке.
Как сделать переключение между основной и дополнительной переменной в ячеки таблицы? В OPC два разных устройства, тоесть нужно как то проверять если первое устройство передает данные, то выводи значения с основной переменной, а если второе устройство передает, то с доп переменной.
И еще вопрос с границами переменных, к примеру я указываю минимальную границу - 10, а если устройство не передает данные, то переменная приравнивается к 0 и вылазит авария по границам. Как сделать чтобы аварии по границам не выводились если переменная не передается OPC сервером?

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1369
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #1529 : 25 Июля 2024, 10:59:08 »
Здравствуйте.

Цитировать
Как сделать переключение между основной и дополнительной переменной в ячеки таблицы?
Если в ячейки таблицы требуется выводить значения разных переменных, то можно использовать способ с подменной переменных. Например, можно создать скрипт с типом события "Изменились переменные", добавить в него одну из переменных и по ее качеству выполнять переключение между наборами переменных:
Код: (delphi)
begin
  if Variable.IsGoodQuality then // если качество переменной хорошее,
  begin                          // то используем первый набор переменных
    Table1.GetCell(0, 0).Variable := MyVar_1_1;
    Table1.GetCell(1, 0).Variable := MyVar_2_1;
    Table1.GetCell(2, 0).Variable := MyVar_3_1;
  end else                       // иначе, используем второй набор переменных
  begin
    Table1.GetCell(0, 0).Variable := MyVar_1_2;
    Table1.GetCell(1, 0).Variable := MyVar_2_2;
    Table1.GetCell(2, 0).Variable := MyVar_3_2;
  end;
end.

Цитировать
Как сделать чтобы аварии по границам не выводились если переменная не передается OPC сервером?
1. Возможно, в OPC-сервере можно настроить поведение при обрыве связи. Например, в arOPC можно задать опцию "Значения тегов при отказе" = "Оставить последнее достоверное значение" (см. скриншот во вложении). Тогда при обрыве связи с ПЛК значения переменных не будут обнуляться и соответственно не будут выдаваться сообщения по нулевым значениям. Возможно, подобные настройки имеются в Вашем OPC-сервере.
2. Используя свойство LimitType, можно изменять тип границ переменной или отключить границы, например:
Код: (delphi)
myVariable.LimitType := ltNone;              // отключить границы переменной
myVariable.LimitType := ltAlarmsOnly;        // активировать только аварийные границы переменной
myVariable.LimitType := ltAlarmsAndWarnings; // активировать аварийные и предупреждающие границы переменной