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

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

Автор Тема: Вопрос по архитектуре проекта.  (Прочитано 5647 раз)

Pavell

  • Новичок
  • *
  • Сообщений: 20
    • Просмотр профиля
Есть желание связать объект с группой переменных - например на одной странице отображается общий вид техпроцесса. На общем виде есть объект с текстурой например агрегат (генератор), с генератора приходит на ОРС сервер много переменных. и как сделать так чтобы объект с текстурой на общем виде начинал мигать например при выходе одной из этих переменных за границы, либо если пропала связь с тем же генератором (плохое качество переменных) (мы тыкаем по объекту и попадаем на страницу, подстраницу или окно где видим что конкретно заставило его мигать). и прекращал мигать когда все пришло в норму?
Так не получится?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: Вопрос по архитектуре проекта.
« Ответ #1 : 18 Мая 2017, 14:39:17 »
Здравствуйте.

Это возможно, но только "вручную", собственными скриптами. Например есть агрегат, у него есть своя переменная в которой каждый бит отвечает за какую-то определенную аварию. Тогда по клику на агрегат можно пройти по битам аварийной переменной и в зависимости от аварии выполнить переход на страницу, на которой видно что привело к аварии. Также в скрипте можно включать/выключать мигание объекта если есть хотя бы одна авария.

Pavell

  • Новичок
  • *
  • Сообщений: 20
    • Просмотр профиля
Re: Вопрос по архитектуре проекта.
« Ответ #2 : 18 Мая 2017, 18:12:53 »
Понял, спасибо. Геморненько)

Pavell

  • Новичок
  • *
  • Сообщений: 20
    • Просмотр профиля
Re: Вопрос по архитектуре проекта.
« Ответ #3 : 18 Мая 2017, 19:53:48 »
Ну хорошо. Теперь я надеюсь сделать универсальный скрипт для этого.
Как я себе это представляю:
Я получаю имя переменной прикрепленной к сендеру как строку.
Нахожу позицию вхождения в имя например знака нижнего подчеркивания , после которого идет цифра.
Достаю эту цифру , перевожу ее из текста в число.
и если переменная имеет плохое качество, либо вышла за границы, то я выставляю в виртуальной переменной бит с номером полученным из имени переменной и соответственно при нормальных условиях очищаю этот бит.
Это возможно?
Сейчас в редакторе скриптов ввожу имя поля, нажимаю точку, нажимаю Ctrl+Пробел и ничего.. никаких автодополнений не выходит. Это нормально или нет? По идее должны предложиться возможные свойства объекта. У меня что-то не работает?

Teodor

  • Старожил
  • ****
  • Сообщений: 256
    • Просмотр профиля
Re: Вопрос по архитектуре проекта.
« Ответ #4 : 19 Мая 2017, 09:36:03 »
А покажите тот скрипт?

Так бывает если у вас перед тем была строчка with Sender as TM_Object
тогда вместо названия Поле. надо писать сразу свойство того поля, что запустило скрипт.


По вашему случаю, я бы пользовался тегами объектов.
Это не сильно правильно, но работает.

делаете по полю для каждого параметра, тег для каждого поля соответствует № агрегата. На их изменение делаете некий скрипт.

В скрипте определяете процедуру, которой передаете все переменные данного агрегата в зависимости от тега. Я скину то шото похожее, надеюсь разберетесь :)
Код
procedure DiffTemp(VarIn1, VarIn2, VarOut :TM_Variable);
  begin
  if VarIn1.IsGoodQuality = true and VarIn2.IsGoodQuality = true then begin
    VarOut.Value := VarIn2.Value - VarIn1.Value;
  end;   
end;

begin
case Sender.Tag of
1:  begin
       DiffTemp(Temp11,Temp12,DT_1);
     end;
2:  begin
       DiffTemp(Temp21,Temp22,DT_2);
     end;
3:  ...
...
end;
end.

В вашем случае процерура будет посложнее, но в общем как-то так.
« Изменён: 19 Мая 2017, 09:56:40 от Teodor »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: Вопрос по архитектуре проекта.
« Ответ #5 : 19 Мая 2017, 10:32:18 »
Teodor верно все описал. Посмотрите пример проекта во вложении.

Цитировать
Сейчас в редакторе скриптов ввожу имя поля, нажимаю точку, нажимаю Ctrl+Пробел и ничего.. никаких автодополнений не выходит. Это нормально или нет?
Если в коде выше курсора есть ошибки, то список методов может не отобразиться, т.к. не пройдёт предкомпиляция и из кода не будут извлечены методы.
Вторая причина, как уже написал Teodor, это использование конструкции with..do выше по коду. В следующем обновлении список методов будет появляться даже с использованием этой конструкции.

Pavell

  • Новичок
  • *
  • Сообщений: 20
    • Просмотр профиля
Re: Вопрос по архитектуре проекта.
« Ответ #6 : 19 Мая 2017, 22:13:41 »
Teodor,Simple-Scada большое спасибо за помощь!
особенно за примеры. Путь реализации примерно вырисовывается. Вот оказывается как использовать тег.
А то что-то сходу не нашел функций для обработки строк  (хотя они наверное есть, я надеюсь) и начал нервничать:)

Pavell

  • Новичок
  • *
  • Сообщений: 20
    • Просмотр профиля
Re: Вопрос по архитектуре проекта.
« Ответ #7 : 19 Мая 2017, 22:24:27 »
Вопрос по редактору конечно, но задам его тут...
Код
var
fld: TM_Field;
begin
if Sender is TM_Field then
begin
fld:=Sender as TM_Field;
if not fld.Variable.IsGoodQuality  then
ImageCSGO.FlashColor:=clRed
else
ImageCSGO.FlashColor:=clNone
end;
end.
вот такой у меня скрипт, который компилируется нормально и работает , НО внутри второго begin не работает автодополнение...в чем у меня ошибка?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: Вопрос по архитектуре проекта.
« Ответ #8 : 20 Мая 2017, 09:39:59 »
Цитировать
А то что-то сходу не нашел функций для обработки строк
Для работы со строками можно использовать функции UTF8Copy, UTF8Length, UTF8Insert, UTF8UpperCase, UTF8LowerCase.

Цитировать
вот такой у меня скрипт, который компилируется нормально и работает , НО внутри второго begin не работает автодополнение...в чем у меня ошибка?
Странно. У нас с данным кодом автодополнение работает. Например если во втором "begin..end" написать "Sender." о откроется список доступных методов. Или по нажатию Ctrl + Пробел. В обновлении 2.2.1.1 значительно улучшили работу списка методов.
« Изменён: 21 Мая 2017, 09:41:34 от Simple-Scada »

Pavell

  • Новичок
  • *
  • Сообщений: 20
    • Просмотр профиля
Re: Вопрос по архитектуре проекта.
« Ответ #9 : 21 Мая 2017, 14:26:15 »
да. действительно.. теперь работает автодополнение. перезагрузить наверное надо было после обновления.
не дополняет конечно имена локальных переменных, но это не беда т.к. методы им все равно добавляет.
что-то никак не найду описание этих строковых функций в Руководстве по скриптам .. они там в разделе Глобальные процедуры и функции?  И поиска в строке нет?
ну по строкам ладно.. это пока не актуально.. ведь для задумки можно использовать теги.

Teodor

  • Старожил
  • ****
  • Сообщений: 256
    • Просмотр профиля
Re: Вопрос по архитектуре проекта.
« Ответ #10 : 22 Мая 2017, 09:34:34 »
Вопрос по редактору конечно, но задам его тут...
Код
var
fld: TM_Field;
begin
if Sender is TM_Field then
begin
fld:=Sender as TM_Field;
if not fld.Variable.IsGoodQuality  then
ImageCSGO.FlashColor:=clRed
else
ImageCSGO.FlashColor:=clNone
end;
end.
вот такой у меня скрипт, который компилируется нормально и работает , НО внутри второго begin не работает автодополнение...в чем у меня ошибка?
Простите. Это вы просто выдрали кусок из кода для примера, или просто так усложнили?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: Вопрос по архитектуре проекта.
« Ответ #11 : 22 Мая 2017, 19:38:55 »
Pavell, да, в разделе Глобальные процедуры и функции. Функцию поиска не вынесли в список доступных. Добавим в следующих обновлениях.

Pavell

  • Новичок
  • *
  • Сообщений: 20
    • Просмотр профиля
Re: Вопрос по архитектуре проекта.
« Ответ #12 : 23 Мая 2017, 07:59:09 »
Простите. Это вы просто выдрали кусок из кода для примера, или просто так усложнили?
ну это так - набросок..
а можно без локальной переменной типа TM_Field обойтись или обязательно надо? В автодополнении у Sender не выходит Variable также в автодополнении не выходят типы почему-то TM_Field, TM_Text  и т.д.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Re: Вопрос по архитектуре проекта.
« Ответ #13 : 24 Мая 2017, 09:02:20 »
Цитировать
В автодополнении у Sender не выходит Variable также в автодополнении не выходят типы почему-то TM_Field, TM_Text  и т.д.
Это верно, т.к. Sender имеет тип TM_Control, у него только базовые свойства. Если нужно получить доступ к другим свойствам, то нужно явно приводить Sender к нужному типу, как у Вас это сделано.

Цитировать
а можно без локальной переменной типа TM_Field обойтись или обязательно надо?
Без неё можно, но тогда придется либо писать так:

Код
begin
  if Sender is TM_Field then
    if not TM_Field(Sender).Variable.IsGoodQuality then
      ImageCSGO.FlashColor := clRed
    else
      ImageCSGO.FlashColor := clNone;
end.

Либо через with..do:

Код
begin
  if Sender is TM_Field then
    with Sender as TM_Field do
      if not Variable.IsGoodQuality then
        ImageCSGO.FlashColor := clRed
      else
        ImageCSGO.FlashColor := clNone;
end.