[Devel] [АСУ]
Evgeny Sinelnikov
sin на etersoft.ru
Чт Сен 30 16:41:15 MSD 2010
30 сентября 2010 г. 16:24 пользователь Vadim Makarov
<vadmak на etersoft.ru> написал:
> Я так понимаю, проект standpm - явно не последний с настройками в
> конф.файле xml-вида.
>
> Помаявшись с заполнением этого чуда, я подумал, что было бе неплохо
> несколько поменять структуру этого файла и способ "парсинга" оного.
> Рассмотрим следующий кусочек из конф.файла проекта standpm:
>
> ......
> <!-- Индикаторы для ПЧ1 -->
> <item id="10000" group_pc1="1" name="PC1_U_AS" pc1_alarm="1"
> rss_a1_alarm="1"
> textname="ПЧ1: Напряжение" iotype="AI" tcp_mbtype="mtr"
> mtrtype="T5" tcp_mbaddr="0x01" tcp_mbfunc="0x04" tcp_mbreg="0x4A"
> mbtcp="VRS_Gateway" group_mtr_pc1="1"/>
>
> <item id="10001" group_pc1="1" name="PC1_P_AS" pc1_alarm="1"
> rss_a1_alarm="1"
> textname="ПЧ1: Мощность" iotype="AI" tcp_mbtype="mtr"
> mtrtype="T6" tcp_mbaddr="0x01" tcp_mbfunc="0x04" tcp_mbreg="0x5A"
> mbtcp="VRS_Gateway" group_mtr_pc1="1"/>
>
> <item id="10002" group_pc1="1" name="PC1_I_AS" pc1_alarm="1"
> rss_a1_alarm="1"
> textname="ПЧ1: Сила тока" iotype="AI" tcp_mbtype="mtr"
> mtrtype="T5" tcp_mbaddr="0x01" tcp_mbfunc="0x04" tcp_mbreg="0x4C"
> mbtcp="VRS_Gateway" group_mtr_pc1="1"/>
> .... и т.д.
> <!-- ПЧ1 -->
> <item id="2000" group_pc1="1" name="PC1_R_AS" pc1_alarm="1"
> rss_a1_alarm="1" mbtcp="VRS_MasterController"
> textname="ПЧ1: реальная частота" iotype="AI" tcp_mbtype="rtu"
> tcp_mbaddr="0x01" tcp_mbfunc="0x04" tcp_mbreg="0x01" group_ctrl_vrs="1"/>
>
> <item id="2001" group_pc1="1" name="PC1_S_AS" pc1_alarm="1"
> rss_a1_alarm="1" mbtcp="VRS_MasterController"
> textname="ПЧ1: заданная частота" iotype="AI" tcp_mbtype="rtu"
> tcp_mbaddr="0x01" tcp_mbfunc="0x04" tcp_mbreg="0x02" atype="2"
> group_ctrl_vrs="1">
> .......
> <ObjectsGroups>
> <!-- *********** Группы датчиков (логические объекты) ************ -->
> <groups name="groups" section="Groups">
> <item name="PC1" textname="ПЧ1" type="PC"
> subsystem="Generating" filter="group_pc1"/>
> .....
> <item name="MTR_PC1" textname="МТР: ПЧ1"
> subsystem="Generating" filter="group_mtr_pc1"/>
> .....
> <item name="Ctrl_VRS" textname="Контроллер: ВРЩ" subsystem="Generating"
> filter="group_ctrl_vrs"/>
> .....
> </groups>
> </ObjectGroups>
>
> Как видно, сведения о датчиках содержат уйму дублирующей друг друга
> информации, которую довольно муторно редактировать и задавать.
> Собственно, идея в том, чтобы вынести общие и для всех датчиков параметры
> в группы (подчеркиваю, именно группы), чтобы можно было с этими группами
> взаимодействовать, как с классами в С++: наследовать данные от
> группы-"предка" и "перегружать" их по необходимости.
> Мы же не "набиваем" схожие по функциональности классы одинаковыми методами
> с одинаковой реализацией, а пользуемся наследованием.
>
> Вот в данном случае мы имеет такую ситуацию: Имеется несколько датчиков,
> входящих в группу ПЧ1, которая подразделяется на группы датчиков, значения
> которых снимаются с МТР, и датчиков, значения которых снимаются с
> контроллера.
> Так почему бы, например, создать иерархию примерно следующего вида: группа
> "ПЧ1" задает параметры, такие как iotype, tcp_mbfunc и ссылки на другие
> группы, и содержит в себе группы "МТР" и "Контроллер" (упрощенно), которые
> задают собственно tcp_mbaddr, tcp_mbtype, mbtcp и другие. А уже датчики,
> находящиеся в этих группах содержат свои уникальные параметры. Само собой,
> они могут содержать в себе и "перегруженные" значения "отнаследованных"
> параметров.
>
> Как я понял во время исследования классов UniXML и UniXML_iterator,
> изменить способ "парсинга" не должно составить большого труда. Например,
> "спускаясь вниз" кешировать встреченные параметры.
> Таким образом, "парсер" для такой структуры должен работать и в случае
> текущего стиля конф.файла.
>
> Надеюсь, смог доходчиво изложить свою мысль.
> Объективная критика приветствуется. :)
Думаю, что это здравая идея. Причём реализовать её можно небольшой
кровью. Самое трудоёмкое, по времени, здесь продумать. Иерархию,
которая бы была удовлетворительна.
Я вижу, что кроме глобального списка <sensors/> можно дать возможность
обрабатывать те же объекты <item/> в другой части, например:
<group>
<item>
<sensors> <-- Обычная секция sensors, но своя для каждой группы
<item>
</item>
</sensors>
</item>
</group>
Детально продумать этот вопрос - это время. А времени на это, увы,
нет. Ни для стенда, ни для Яузы.
Виталик, кстати, давно предлагает сделать загрузку нескольких файлов.
Для этого нужно посмотреть как делается объединение двух корневых
узлов DOM-дерева в libxml2 и добавить возможность последовательной
загрузки нескольких файлов в код uniset, отвечающий за загрузку
configure.xml.
Возможность такой загруки настроек из нескольких файлов позволит:
- разбить настройки на группы по файлам;
- более корректно организовать разные настройки для разных
контроллеров при финальной сборке проекта. Сейчас у нас sed
используется.
В общем, добавить загрузку настроек из несколькоих файлов более полезно сейчас.
--
Sin (Sinelnikov Evgeny)
Подробная информация о списке рассылки Devel