УкраїнськаEnglishmRussian
Вход/Новый
В теме нет новых постов

Представление для массива однотипных объектов


Автор Сообщение
Сообщение создано: 22. 12. 2016 [12:59]
kantv
Антон Калюк
Создатель темы
Зарегистрирован(а) с: 29.11.2016
Сообщения: 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 есть более правильные способы решения подобной задачи.

Заранее спасибо всем.
Вложенный файл

schema.png (Тип файла: image/png, Размер: 13.11 килобайт) — 1524 загрузок
Сообщение создано: 22. 12. 2016 [17:50]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 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.
Сообщение создано: 16. 07. 2018 [17:10]
sansa
Sergey Stroev
Зарегистрирован(а) с: 16.07.2018
Сообщения: 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).

Никто не мешает подобным образом к атрибутам обращаться, хотя смысла в этом близко к нулю. Просто делается шаблонный кадр, которых затем создается сколько нужно и каждый вяжется к соответствующему параметру. В ДемоБД масса примеров этому!

Я может не правильно понял ваш, Роман, ответ, или плохо искал, но не нашел примера массивов в демке. Дайте намек, пожалуйста (текст, который можно найти, или общее указание).


[Сообщение редактировалось 1 раз(а), в последний раз 16.07.2018 в 17:11.]
Вложенный файл

Screen Shot 07-16-18 at 05.03 PM.PNG (Тип файла: image/png, Размер: 25.76 килобайт) — 1427 загрузок
Сообщение создано: 17. 07. 2018 [12:55]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
"sansa" wrote:

Я может не правильно понял ваш, Роман, ответ, или плохо искал, но не нашел примера массивов в демке. Дайте намек, пожалуйста (текст, который можно найти, или общее указание).

Не нашли таблицу виджета "Main.objProps"?
Где:
JAVASCRIPT
...
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, где:
JAVASCRIPT
...
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.
Сообщение создано: 20. 07. 2018 [12:35]
sansa
Sergey Stroev
Зарегистрирован(а) с: 16.07.2018
Сообщения: 6
Спасибо. Нашел, изучаю.

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



16026