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

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

Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - teplocom

Страницы: [1] 2 3 4
1
Добрый!
Если правильно понял, Вам нужно что-то вроде этого. Способ 3:

https://simple-scada.com/help/script/comm-control.html

2
Иерархия сети..
ПЛК не имеет выхода в интернет, подключен к SimpleSCADA через RS485. Как некое компромиссное решение с "администратором сети", используется шлюз ПМ210 (хотя и от наличия ПМ210"администратор" не в восторге), который подключен к ПК (также не имеющего выход в интернет) по RS485 и забирает в облако то, что насобирала SCADA.
Поэтому и приходится "синхронизировать" все через SimpleSCADA.

3
Доброго!
Стоит задача "изменение уставки котла" из трех разных мест:
-на ПЛК (сетевая переменная А)
-на SimpleSCADA (та же переменная А, в ПЛК синхронизируется с внутренней переменной, эта часть работает давно)
-на OwenCloud (для упрощения - регистр задания t через облако у меня можно представлять как еще одно ModBus slave-утсройство, которое опрашивается SimpleSCADA)
Правильно ли будет реализовать "синхронизацию данных" этой уставки, которая может поменяться в любом из этих мест, через скрипт "Изменилась переменная":
Изменилась переменная А, тогда скрипт:
B.Value:=A.Value;
Если случилось изменение переменной B скрипт:
А.Value:=В.Value;

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

4
Cпасибо за подсказку, всё завелось.
Так и знал, что в школе нужно было хорошо учиться.  ;D

5
В общем добились, того, что нужно, но вариант получился такой:
Код: (delphi)
var q,w,e,r,t,y,u,i,o,p,a,s,d,f,g,h,j,k,l,q1,w1,e1,r1,t1,y1,u1,i1,o1,p1,a1,s1,d1,f1,g1,h1,j1,k1,l1,z1,c1 : Integer;
 begin
 q:=bit_00.Value; w:=bit_01.Value; e:=bit_02.Value; r:=bit_03.Value; t:=bit_04.Value; y:=bit_05.Value; u:=bit_06.Value;
 i:=bit_07.Value; o:=bit_08.Value; p:=bit_09.Value; a:=bit_10.Value; s:=bit_11.Value; d:=bit_12.Value; f:=bit_13.Value;
 g:=bit_14.Value; h:=bit_15.Value; j:=bit_16.Value; k:=bit_17.Value; l:=bit_18.Value;
 Bitmaska.Value:=Abs(q)*Power(2,0)
+Abs(w)*Power(2,1)
+ 0*Power(2,2)
+ 0*Power(2,3)
+Abs(e)*Power(2,4)
+Abs(r)*Power(2,5)
+Abs(t)*Power(2,6)
+Abs(y)*Power(2,7)
+Abs(u)*Power(2,8)
+Abs(i)*Power(2,9)
+Abs(o)*Power(2,10)
+ 0*Power(2,1)
+ 0*Power(2,12)
+Abs(p)*Power(2,13)
+ 0*Power(2,14)
+ 0*Power(2,15)
+ 0*Power(2,16)
+ 0*Power(2,17)
+Abs(a)*Power(2,18)
+ 0*Power(2,19)
+ 0*Power(2,20)
+Abs(s)*Power(2,21)
+Abs(d)*Power(2,22)
+Abs(f)*Power(2,23)
+Abs(g)*Power(2,24)
+Abs(h)*Power(2,25)
+Abs(j)*Power(2,26)
+Abs(k)*Power(2,27)
+Abs(l)*Power(2,28)
+0*Power(2,29)
+0*Power(2,30)
+0*Power(2,31) ;
 Bitmaska.Value shr 1;

внешние биты стали правильно записываться в маску, только при присвоении их через промежуточные локальные переменные
значения должны быть взяты по модулю (потому что экспериментальным путем было замечено, что в них вместо значения 1, записывалось -1)
и в конце сдвиг регистра вправо на 1 бит.

6
На данный момент удалось решить проблему вычисления добавлением строчки в конце:
Bitmaska.Value shr 1;

Но всё-равно не получилось решить задачу сбора.
С локальными/внутренними битовыми переменными маску собирает работает корректно, а с внешними переменными (битами из @bit00) все по нулям, при ненулевых внешних битах.

Такой вариант тоже работает только с внутренним переменными
Код: (delphi)
begin
 SetBit(Bitmaska.Value,0,bit0.Value)
 SetBit(Bitmaska.Value,1,bit1.Value)
 SetBit(Bitmaska.Value,2,bit2.Value)
 SetBit(Bitmaska.Value,3,bit3.Value)
 SetBit(Bitmaska.Value,4,bit4.Value)
...
 SetBit(Bitmaska.Value,31,bit31.Value)
end.

7
Доброго
Задача вручную собрать битовую маску из разных битовых переменных.
Код и результат ниже. Почему не 4294967295?
Bitmaska тип данных LongWord, bit0...31 это bool.
Код: (delphi)
begin
 Bitmaska.Value:=bit0.Value*Power(2,0)
+bit1.Value*Power(2,1)
+bit2.Value*Power(2,2)
+bit3.Value*Power(2,3)
+bit4.Value*Power(2,4)
+bit5.Value*Power(2,5)
+bit6.Value*Power(2,6)
+bit7.Value*Power(2,7)
+bit8.Value*Power(2,8)
+bit9.Value*Power(2,9)
+bit10.Value*Power(2,10)
+bit11.Value*Power(2,11)
+bit12.Value*Power(2,12)
+bit13.Value*Power(2,13)
+bit14.Value*Power(2,14)
+bit15.Value*Power(2,15)
+bit16.Value*Power(2,16)
+bit17.Value*Power(2,17)
+bit18.Value*Power(2,18)
+bit19.Value*Power(2,19)
+bit20.Value*Power(2,20)
+bit21.Value*Power(2,21)
+bit22.Value*Power(2,22)
+bit23.Value*Power(2,23)
+bit24.Value*Power(2,24)
+bit25.Value*Power(2,25)
+bit26.Value*Power(2,26)
+bit27.Value*Power(2,27)
+bit28.Value*Power(2,28)
+bit29.Value*Power(2,29)
+bit30.Value*Power(2,30)
+bit31.Value*Power(2,31);
end.

8
https://simple-scada.com/help/manual/extvarbits.html
А для OPC-UA данный способ разбития на битовые переменные работает? Пробовал, не получалось.

9
Необходимо визуально по картинке бункера понимать, что с ним происходит в данный момент. Это три состояния: наполнение, опорожнение, бездействие.
Приветствую!
А что есть из переменных от нижнего уровня? Масса бункера или уровень?
Или у Вас прям состояния приходят от некоего ПЛК: наполнение, опорожнение, бездействие.
Стрелки, как мне кажется, норм вариант. Я бы добавил у стрелки (Элемент "Линия" из стандартной палитры, изменить окончание линии на "стрелка") свойство "Цвет мигания" (например черный/серый, чтобы привлечь внимание, если это необходимо) и управлял через скрипты Visible := True/False
То есть в состоянии "бездействие" обе стрелки Visible :=False.

10
Хмм.. А если я для переменной А (где не нужен звук) укажу только Верхняя/нижняя граница предупреждения в Настройки для сообщений о нарушении границ А также укажу в поле: Сообщение для нарушения границ: не выдавать сообщения.
В этом случае для переменной А у меня останется только индикация поля (желтым по-моему) при выходе значений за предупредительные границы без выдачи любых сообщений?

11
Код: (delphi)
var
  aTemp, aZad: TM_Variable;
begin
  // выполняем скрипт только для столбца с уставками и проверяем, что ячейки связаны с переменными
  if (Cell.Col = 2) and (Cell.Variable <> nil) and (Cell.VariableEx <> nil) then
  begin
    aTemp := Cell.VariableEx;             // переменная температуры
    aZad := Cell.Variable;                // переменная задания

    aTemp.HighAlarm := aZad.AsFloat + 3;  // верхняя авар. граница = задание + 3
    aTemp.LowAlarm := aZad.AsFloat - 3;   // нижняя авар. граница = задание - 3
  end;
end.

Элегантно, у себя попробую такое сделать. Спасибо.

Подскажите, раз уж в тему:
Если у переменной включены аварийные границы, то де-факто будет и звуковое оповещение и сообщения при нарушении границ переменных в строке активных аварий в журнале.
Есть ли возможность не выдавать звуковое сообщение пользуясь стандартными средствами для определенных переменных (не всех) при их "выходах" за аварийные границы, чтобы например для переменной А формировались только активные аварии в журнале без звука, а для переменной В и звуковое оповещение и активные аварии в журнале.

12
да)) есть такой минус, сортирую при добавлении новых объектов вручную.
Начинал проект, когда еще не было шаблонных объектов, сейчас бы через них сделал такую "таблицу" (строки в виде ш.объектов).

13
Да, делал таблицей, а "поверх" нее в столбце "Адрес теплоузла" слой "Текст" с названием объекта

14
День добрый.
1.Создайте общую обзорную страницу с параметрами всех объектов. (скрин 1)
2. Создайте окно с мнемосхемой каждого объекта (можно через шаблоны) (скрин 2)
3. Названия объекта - это поле "Текст", у этого поля укажите в свойствах ссылку-переход на окно объекта (скрин 1 - в моем случае это Suvorova_25)

15
Помогло удаление "задвоившихся" переменных в конфигурации орс-сервера -> ... Кто создавал ошибку, скада или орс, я так и не понял.
Скада создавать и редактировать конфигурацию орс-сервера еще не научилась  ;D

Страницы: [1] 2 3 4