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

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

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

Миханик

  • Постоялец
  • ***
  • Сообщений: 180
    • Просмотр профиля
    • www.vpa-dv.ru
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #405 : 21 Июня 2017, 12:11:55 »
Simple-Scada, а ориентировочную дату внедрения данного функционала можете назвать?

Teodor

  • Старожил
  • ****
  • Сообщений: 256
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #406 : 21 Июня 2017, 16:11:33 »
Ex - OPC
Value - внутренняя
Есть такие 2 скрипта (упрощенно):

OnChangeEx
Код
begin
  if not (Sender is TM_Object) then Exit;
    with Sender as TM_Object do
      if (Variable <> nil) and (VariableEx <> nil) then
        Value := VariableEx.Value;
end.
и
OnChange
Код
begin
  if not (Sender is TM_Object) then Exit;
  with Sender as TM_Object do
    if (Variable <> nil) and (VariableEx <> nil) then
      VariableEx.Value := Value;                                                                                         
end.

В общем все работает вроде не плохо, но есть вопрос.

Что происходит при старте в случае если ЕХ в ОРС не 0? Какова вероятность того, что она может быть перезаписана 0 из свежеинициализированной внутренней переменной?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #407 : 22 Июня 2017, 09:34:47 »
Simple-Scada, а ориентировочную дату внедрения данного функционала можете назвать?
Точную дату трудно назвать. Скорее всего в ближайшие две недели.

Что происходит при старте в случае если ЕХ в ОРС не 0? Какова вероятность того, что она может быть перезаписана 0 из свежеинициализированной внутренней переменной?
Точно! Есть вероятность перезаписи на ноль, причем довольно большая, т.к. виртуальная переменная скорее всего сделает OnChange первой. Поэтому здесь нужно игнорировать первый DataChange по внутренней переменной. Вот только как это сделать не используя доп. переменных.

Teodor

  • Старожил
  • ****
  • Сообщений: 256
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #408 : 22 Июня 2017, 10:06:34 »
Simple-Scada, а ориентировочную дату внедрения данного функционала можете назвать?
Точную дату трудно назвать. Скорее всего в ближайшие две недели.

Что происходит при старте в случае если ЕХ в ОРС не 0? Какова вероятность того, что она может быть перезаписана 0 из свежеинициализированной внутренней переменной?
Точно! Есть вероятность перезаписи на ноль, причем довольно большая, т.к. виртуальная переменная скорее всего сделает OnChange первой. Поэтому здесь нужно игнорировать первый DataChange по внутренней переменной. Вот только как это сделать не используя доп. переменных.
Тогда еще вопрос. Качество OPC переменной. Когда оно установится в TRUE? Точнее, когда на ней пропадет nil? Это одновременные явления? Теоретически, хоть вирт. переменная и установится в 0 первой, а ОРС еще считать надо, то этот скрипт не выполнится, ибо ОРС все еще nil (или уже не nil, но еще не считана?)   В общем если в условие поставить качество, а не иннициализацию, что либо изменится?
« Изменён: 22 Июня 2017, 10:20:14 от Teodor »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #409 : 23 Июня 2017, 09:02:13 »
Использовать качество, это хорошая идея. Тогда скрипт по изменению внутренней переменной (в Вашем случае OnDataChange), нужно изменить так:

Код
begin
  if not (Sender is TM_Object) then Exit;
  with Sender as TM_Object do
    if (Variable <> nil) and (VariableEx <> nil) then
      if VariableEx.IsGoodQuality then
        VariableEx.Value := Value;                                                                                         
end.

В теории это должно сработать.

Teodor

  • Старожил
  • ****
  • Сообщений: 256
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #410 : 23 Июня 2017, 10:07:56 »
Кстати, да... А что будет если присвоить нечто некачественной ОРС переменной? Зачем проверять и качество и нил, она может быть качественной и нил одновременно?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #411 : 24 Июня 2017, 10:14:13 »
А что будет если присвоить нечто некачественной ОРС переменной?
Просто будет попытка выполнить присвоение в эту переменную, а пройдёт она, или нет, зависит от OPC-сервера.

Зачем проверять и качество и нил, она может быть качественной и нил одновременно?
Проверка ""if Variable <> nil then" не имеет отношения к качеству переменной, или к её значению. Эта проверка позволяет убедиться в том, что разработчик проекта не забыл выбрать переменную у данного объекта.  Допустим есть два поля Field1 и Field2. Поле Field1 связано с переменной A, а поле Field2 не связано с переменными. На событие OnDataChange у этих полей ставим такой универсальный скрипт:

Код
begin
  if not (Sender is TM_Object) then Exit;
  TM_Object(Sender).Variable.Value := 10;
end.

Для поля Field1 скрипт будет работать. А для поля Field2 будет давать ошибку, т.к. оно не связано с переменной (Variable = nil), а в скрипте мы пытаемся изменить Variable.Value, т.е. обращается в несуществующей переменной.

Поэтому в скрипте из предыдущего сообщения мы сначала убедились, что у объекта выбрана доп. переменная и только потом начинаем работать с ней, проверяя качество, или изменяя её значение.
« Изменён: 24 Июня 2017, 10:15:22 от Simple-Scada »

st-legal

  • Новичок
  • *
  • Сообщений: 18
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #412 : 26 Июня 2017, 09:42:27 »
Доброе утро, ув. форумчане. В продолжении темы Есть 2 модуля, каждый со своим адресом. Имеется кнопка которая активирует выход модуля.
vrSync-Value
bout-Ex
OnDataChange
Код
begin
if not (Sender is TM_Object) then Exit;
  with Sender as TM_object do
    if(Variable <> nil) and (VariableEx <> nil) then
    VariableEx.Value:= Value;
end.
Все тут работает нормально. При перезапуске проекта внутренние переменные обнуляются и соответственно обнуляют за собой OPC переменные. Для решения этой проблемы было создано скрытое Поле:
vrSync-Value
bout-Ex
OnDataChange
Код
begin
if not (Sender is TM_object) then Exit;
with Sender as TM_object do
if (Variable <> nil) and (VariableEx <> nil) then
if Variable.IsGoodQuality then
Value:=VariableEx.Value;
end.

OnDataChangeEx:
Код
begin
  if not (Sender is TM_Object) then Exit;
    with Sender as TM_Object do
      if (Variable <> nil) and (VariableEx <> nil) then
        Value := VariableEx.Value;
end.
Проблема состоит в следующем: Все вроде не плохо, но первый перезапуск проекта все норм. Последующие перезапуски творят чудеса. Выхода могут сброситься в ноль, могут начать сбрасываться и возвращаться в активное состояние. И еще если модуль не один, то на модуле с низшим Modbus адресом при перезагрузке проекта значения сохраняются, а на последующих модулях либо сбрасываются либо начинают моргать.
Вопрос, в чем тут загвоздка. Всем за ранее спасибо!!

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #413 : 26 Июня 2017, 10:11:55 »
Здравствуйте. Данные скрипты Вы добавляли для того чтобы обойти проблему присвоения разных битов в одну и ту же переменную. В версии 2.2.2.0 мы улучшили систему присвоений во внешние теги и теперь Вы можете удалить эти скрипты. Присвоения должны выполняться правильно без использования доп. скриптов.

st-legal

  • Новичок
  • *
  • Сообщений: 18
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #414 : 26 Июня 2017, 10:41:04 »
К сожалению, после того как я убрал внутреннюю переменную проблема присвоения разных битов одной и той же переменной осталась. У меня версия 2.2.2.0
« Изменён: 26 Июня 2017, 11:22:49 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #415 : 26 Июня 2017, 10:43:04 »
Можете выслать текущую версию проекта (после того, как убрали внутреннюю переменную) на support@simple-scada.com?

st-legal

  • Новичок
  • *
  • Сообщений: 18
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #416 : 26 Июня 2017, 10:47:30 »
Конечно, и ещё кое-что. Имеется кнопка, которая активирует сразу все 4 выхода модуля. Так вот она сначала устанавливает все биты в 1 (слово =15), а затем сразу сбрасывает все выходы в ноль, кроме первого (слово =1).
« Изменён: 26 Июня 2017, 11:22:38 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #417 : 26 Июня 2017, 11:11:11 »
и ещё кое-что. Имеется кнопка, которая активирует сразу все 4 выхода модуля. Так вот она сначала устанавливает все биты в 1 (слово =15), а затем сразу сбрасывает все выходы в ноль, кроме первого (слово =1).
Конечно сбрасывает. Это же кнопка и в этом принцип её работы. Если вы создаёте кнопку и связываете её с переменной, то по нажатию на кнопку в переменную будет производиться запись единицы. У вас так и получается. Вы нажимаете кнопку, выполняется скрипт Value := 15 и сразу после этого кнопка выполняет своё предназначение и записывает в эту же переменную единицу. Если Вы хотите выполнять присвоения только скриптом, то нужно разорвать связь кнопки с любыми переменными.

Т.е. для Вашего проекта нужно разорвать связь кнопок "Включить все" и "Выключит все" с переменной bout, а скрипты изменить так:

"Включить все":
Код
begin
  bout.Value := 15;
end.

"Выключить все":
Код
begin
  bout.Value := 0;
end.
« Изменён: 26 Июня 2017, 11:16:22 от Simple-Scada »

st-legal

  • Новичок
  • *
  • Сообщений: 18
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #418 : 26 Июня 2017, 11:16:30 »
согласен, не доглядел. А с первым вопросом как быть?
« Изменён: 26 Июня 2017, 11:17:01 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #419 : 26 Июня 2017, 11:22:01 »
Вы уверены, что проблема с быстрым присвоением битов в одну переменную существует после того как Вы убрали внутреннюю переменную? Мы сейчас делаем очень быстрые клики в Вашем проекте по кнопкам "Выход 1" .. "Выход 4" и присвоения всегда выполняются правильно. Может быть Вы во время кликов по кнопкам производите нажатие в зоне кнопки, а отпускаете мышь уже за её пределами? В таком случае присвоение не выполнится и может создастся впечатление, будто нажатие было, а присвоение не выполнилось.