Представление для массива однотипных объектов
Author |
Message |
Written on: 22. 12. 2016 [12:59]
|
kantv
Антон Калюк
Topic creator
registered since: 29.11.2016
Posts: 17
|
Добрый день.
Прошу помощи в разработке своего первого проекта в SCADA. Сначала опишу оборудование с которым приходится работать. Сразу прошу прощения если моя терминология не будет строго соответствовать принятой в документации на OpenSCADA, поскольку я только начинаю свое знакомство с этой системой. Итак:
схема
Имеется 6 водозаборных скважин, которыми управляют однотипные шкафы автоматики на основе ПЛК Овен (смотрите приложенную схему). Данные о состоянии скважин (давление, температура, уровень воды, расход, параметры электропитания и т.д.) периодически собираются на центральный шкаф управления (ПЛК Мастер). Центральный шкаф позволяет оператору в одном месте посмотреть состояние сразу всех скважин не бегая между ними. Необходимо разработать SCADA систему, позволяющую просматривать текущее состояние всех скважин водоснабжения. Обмен данными между контроллерами скважин и центральным контроллером производится по протоколу Modbus-RTU, передача данных в SCADA также осуществляется по Modbus-RTU.
Используя имеющуюся документацию удалось установить систему SCADA, настроить подключение по MODBUS к центральному контроллеру и получить значения регистров. Также получилось создать шаблон параметра и представление параметров центрального контроллера на логическом уровне. Также удалось сделать минималистичный интерфейс оператора для отображения значений в интерфейсе пользователя.
Вопрос у меня возникает когда я пытаюсь придумать как мне лучше отобразить на логическом уровне состояние всех 6 скважин. Поясню - шкафу управления скважинами являются абсолютно одинаковыми, отличаются только их адреса в сети Modbus. Естественно, что состояние шкафов управления скважинами описывается одинаковым набором параметров. Планируя структуры данных в SCADA хотелось бы получить некий объект который отражал бы в SCADA текущее состояние всей системы (центрального шкафа и шкафов управления скважинами). Насколько я понимаю на данный момент архитектуру SCADA системы, такой объект нужно создать на "логическом уровне" представления. Собственно я и создал на логическом уровне контроллер с параметром и атрибутами отражающими состояние центрального ПЛК, но вот дальше я не могу придумать, как мне добавить в этот контроллер МАССИВ из 6 одинаковых атрибутов для отображения состояния всех 6 скважин. Я понимаю, что можно добавить 6 отдельных одинаковых атрибутов основанных на одном и том же шаблоне, но мне кажется что архитектурно это было бы не совсем верно по следующим причинам:
1. Если бы скважины были представлены на логическом уровне в виде массива, то в дальнейшем можно было бы обращаться к значениям атрибутов различных скважин изменяя всего лишь порядковый номер элемента в массиве (например проверка значения одного и того же параметра на разных скважинах - простой перебор в цикле по массиву скважин, что-то вроде well[n].preasure или well[n].temperature).
2. На центральном контроллере адресное пространство Modbus ограничено и не позволяет отобразить состояние сразу всех параметров на всех скважинах, поэтому приходится использовать один и тот же диапазон адресов Modbus для отображения на него состояния скважин по очереди. То есть, сначала SCADA запрашивает состояние какой-то скважины записывая в определенный регистр центрального контроллера номер нужной скважины, после этого центральный контроллер устанавливает значения регистров Modbus в соответствии с текущим состоянием указанной скважины. Таким образом, SCADA считывает состояния разных скважин по одним и тем же адресам modbus центрального контроллера. Получается, что в SCADA системе на уровне логического представления я не могу задать жесткого соответствия регистра Modbus центрального контроллера и параметра какой-то скважины, потому что один и тот же регистр Modbus центрального контроллера будет отражать состояние одного и того же параметра, но для РАЗНЫХ скважин в разное время. Поэтому мне представляется, что опрос центрального контроллера должен происходить в цикле (перебор по номерам всех скважин) в котором считывается состояние регистров Modbus центрального контроллера и полученные значения "раскладываются" в системе SCADA в соответствующий элемент массива скважин.
Еще раз прошу подсказки - как можно в SACDA на логическом уровне представить массив из одинаковых объектов (массив объектов "скважина", где сам объект "скважина" содержит несколько десятков параметров)? Или возможно в SACDA есть более правильные способы решения подобной задачи.
Заранее спасибо всем.
Attachment
schema.png (File type: image/png, Size: 13.11 kilobytes) — 1504 downloads
|
Written on: 22. 12. 2016 [17:50]
|
roman
Roman Savochenko
Moderator Contributor Developer
registered since: 12.12.2007
Posts: 3750
|
"kantv" wrote:
Вопрос у меня возникает когда я пытаюсь придумать как мне лучше отобразить на логическом уровне состояние всех 6 скважин. Поясню - шкафу управления скважинами являются абсолютно одинаковыми, отличаются только их адреса в сети Modbus. Естественно, что состояние шкафов управления скважинами описывается одинаковым набором параметров. Планируя структуры данных в SCADA хотелось бы получить некий объект который отражал бы в SCADA текущее состояние всей системы (центрального шкафа и шкафов управления скважинами). Насколько я понимаю на данный момент архитектуру SCADA системы, такой объект нужно создать на "логическом уровне" представления.
Можно и прямо в DAQ.ModBus, логическим параметром.
"kantv" wrote:
Собственно я и создал на логическом уровне контроллер с параметром и атрибутами отражающими состояние центрального ПЛК, но вот дальше я не могу придумать, как мне добавить в этот контроллер МАССИВ из 6 одинаковых атрибутов для отображения состояния всех 6 скважин. Я понимаю, что можно добавить 6 отдельных одинаковых атрибутов основанных на одном и том же шаблоне, но мне кажется что архитектурно это было бы не совсем верно по следующим причинам:
6 это не то число, когда нужно начинать думать о массивах, тем более если их нужно будет архивировать, для чего однозначно потребуются атрибуты.
"kantv" wrote:
1. Если бы скважины были представлены на логическом уровне в виде массива, то в дальнейшем можно было бы обращаться к значениям атрибутов различных скважин изменяя всего лишь порядковый номер элемента в массиве (например проверка значения одного и того же параметра на разных скважинах - простой перебор в цикле по массиву скважин, что-то вроде well[n].preasure или well[n].temperature).
Никто не мешает подобным образом к атрибутам обращаться, хотя смысла в этом близко к нулю. Просто делается шаблонный кадр, которых затем создается сколько нужно и каждый вяжется к соответствующему параметру. В ДемоБД масса примеров этому!
"kantv" wrote:
2. На центральном контроллере адресное пространство Modbus ограничено и не позволяет отобразить состояние сразу всех параметров на всех скважинах,
Странный контроллер! Это сколько-же там реально параметров если ему адресного пространства в 65536 регистров/параметров не хватило и сколько верхняя система по ModBus/RTU это будет выкачивать, а значит и насколько низкокачественные там будут данные (высокая периодичность). В ModBus/TCP же есть логический адрес за которым можно спрятать 256*65536 регистров, что 16MB!
"kantv" wrote:
Еще раз прошу подсказки - как можно в SACDA на логическом уровне представить массив из одинаковых объектов (массив объектов "скважина", где сам объект "скважина" содержит несколько десятков параметров)? Или возможно в SACDA есть более правильные способы решения подобной задачи.
Если там просто масса данных, которые не рассматриваются как отдельные теги (типично для SCADA-систем хотя у OpenSCADA такого понятия и нет) тогда можно всё это в объект собрать и таблицей представить, как обычно делается для данных UPS, HDD Smart, SNMP, сервисы и т.д. И всё это предоставляется и даже управляется через таблицу виджета "Main.objProps".
Learn, learn and learn better than work, work and work.
|
Written on: 16. 07. 2018 [17:10]
|
sansa
Sergey Stroev
registered since: 16.07.2018
Posts: 6
|
Добрый день.
Тоже начинаю изучать OpenSCADA и так же столкнулся желанием адресовать переменные массивом.
Первый раз попробовал массивы в B&R Automation Studio и очень понравилось их применение.
"roman" wrote:
"kantv" wrote:
Собственно я и создал на логическом уровне контроллер с параметром и атрибутами отражающими состояние центрального ПЛК, но вот дальше я не могу придумать, как мне добавить в этот контроллер МАССИВ из 6 одинаковых атрибутов для отображения состояния всех 6 скважин. Я понимаю, что можно добавить 6 отдельных одинаковых атрибутов основанных на одном и том же шаблоне, но мне кажется что архитектурно это было бы не совсем верно по следующим причинам:
6 это не то число, когда нужно начинать думать о массивах, тем более если их нужно будет архивировать, для чего однозначно потребуются атрибуты.
Во вложении кусок кода. Число дозаторов от 6 до 18 в разных проектах. Если писать этот код без массивов - строчки становятся очень длинными, плюс при изменении числа дозаторов необходимо лезть в код и переписывать его (с массивами достаточно переопределить константу или def).
"roman" wrote:
"kantv" wrote:
1. Если бы скважины были представлены на логическом уровне в виде массива, то в дальнейшем можно было бы обращаться к значениям атрибутов различных скважин изменяя всего лишь порядковый номер элемента в массиве (например проверка значения одного и того же параметра на разных скважинах - простой перебор в цикле по массиву скважин, что-то вроде well[n].preasure или well[n].temperature).
Никто не мешает подобным образом к атрибутам обращаться, хотя смысла в этом близко к нулю. Просто делается шаблонный кадр, которых затем создается сколько нужно и каждый вяжется к соответствующему параметру. В ДемоБД масса примеров этому!
Я может не правильно понял ваш, Роман, ответ, или плохо искал, но не нашел примера массивов в демке. Дайте намек, пожалуйста (текст, который можно найти, или общее указание).
[This article was edited 1 times, at last 16.07.2018 at 17:11.]
Attachment
|
Written on: 17. 07. 2018 [12:55]
|
roman
Roman Savochenko
Moderator Contributor Developer
registered since: 12.12.2007
Posts: 3750
|
"sansa" wrote:
Я может не правильно понял ваш, Роман, ответ, или плохо искал, но не нашел примера массивов в демке. Дайте намек, пожалуйста (текст, который можно найти, или общее указание).
Не нашли таблицу виджета "Main.objProps"?
Где:
...
if(!objItems.isEVal()) {
//Load table with variables
tbl = "<tbl sel='row' colsWdthFit='1'>\n"
"<h><s width='0px'>"+tr("Property")+"</s><s width='55%'>"+tr("Description")+"</s><s width='30%'>"+tr("Value")+"</s></h>";
for(var aIt in objItems) {
it = objItems[aIt];
if(it.alarm == 1) tbl += "<r color='yellow'>";
else if(it.alarm == 2) tbl += "<r color='red'>";
else tbl += "<r>";
tbl += "<s>"+aIt+"</s><s>"+strEnc2HTML(it.descr)+"</s><s>"+strEnc2HTML(it.val)+"</s></r>\n";
}
tbl += "</tbl>";
props_items = tbl;
...
}
Или, скажем шаблон данных UPS, где:
...
for(i_n = 0; i_n < nLst.length; i_n++) {
aId = nLst[i_n].slice(2);
aNd = srcPrm[nLst[i_n]];
if(items[aId].isEVal()) {
items[aId] = itW = new Object();
itW.descr = aNd.descr();
// Writeable check
//SYS.messInfo("UPS test", aId+": aNd.flg()="+aNd.flg());
if((itW.wr=!(aNd.flg()&0x04)) && aNd.flg()&0x01) {
itW.wr = "";
for(off = 0, pos = 0; (selId=aNd.values().parse(0,";",off)).length; pos++)
itW.wr += ((selId==(selNm=aNd.selNames().parse(pos,";")))?selId:(selNm+" ("+selId+")"))+";";
}
itW.alarm = 0;
}
items[aId].val = aNd.get();
}
...
Learn, learn and learn better than work, work and work.
|
Written on: 20. 07. 2018 [12:35]
|
sansa
Sergey Stroev
registered since: 16.07.2018
Posts: 6
|
Спасибо. Нашел, изучаю.
Пока вроде все получается.
Поразили возможности для создания интерфейса оператора. Из того, что пробовал за карьеру (а пробовал много) - одна из самых лучших.
Пока осталось непонятным, как создать библиотеки, что бы они были общими для нескольких проектов, но и документацию еще не дочитал всю.
|
|
|