<?xml version="1.0" encoding="windows-1251"?>
<rss version="2.0">
<channel>
<title>FreeSource - Etersoft/UniSet</title>
<link>http://freesource.info/wiki/Etersoft/UniSet</link>
<description>History/revisions of FreeSource/Etersoft/UniSet</description>
<language>en-us</language>
<item>
<title>2005-08-01 21:03:34</title>
<link>http://freesource.info/wiki/Etersoft/UniSet/show?time=2005-08-01+21%3A03%3A34</link>
<description>&lt;div class="pageBefore">&lt;img src="http://freesource.info/wiki/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" />&lt;/div>&lt;div class="page">
&lt;b>Сравнение версий &lt;a name=".etersoft.uniset" href="http://freesource.info/wiki/Etersoft/UniSet&amp;" class="">/Etersoft&amp;nbsp;/&amp;nbsp;Uni&amp;nbsp;Set&lt;/a> за &lt;a href="http://freesource.info/wiki/Etersoft/UniSet?time=2005-08-01+21%3A03%3A34">2005-08-01 21:03:34&lt;/a> и &lt;a href="http://freesource.info/wiki/Etersoft/UniSet">2006-06-02 12:48:25&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">&lt;a name="h962-1">&lt;/a>&lt;h2> Дополнительно &lt;/h2>
&lt;span class="missingpage">!/Описание&amp;nbsp;COMEDI&lt;/span>&lt;a href="http://freesource.info/wiki/ОписаниеCOMEDI/edit?add=1&amp;" title="Создать эту страницу">?&lt;/a>&lt;/div>&lt;/div>
</description>
</item>
<item>
<title>2005-07-20 00:22:51</title>
<link>http://freesource.info/wiki/Etersoft/UniSet/show?time=2005-07-20+00%3A22%3A51</link>
<description>&lt;div class="pageBefore">&lt;img src="http://freesource.info/wiki/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" />&lt;/div>&lt;div class="page">
&lt;b>Сравнение версий &lt;a  href="http://freesource.info/wiki/Etersoft/UniSet&amp;" class="">/Etersoft&amp;nbsp;/&amp;nbsp;Uni&amp;nbsp;Set&lt;/a> за &lt;a href="http://freesource.info/wiki/Etersoft/UniSet?time=2005-07-20+00%3A22%3A51">2005-07-20 00:22:51&lt;/a> и &lt;a href="http://freesource.info/wiki/Etersoft/UniSet?time=2005-08-01+21%3A03%3A34">2005-08-01 21:03:34&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">&lt;a name="h962-1">&lt;/a>&lt;h2> Структура &lt;/h2>
&lt;img src="http://etersoft.ru/download/UniSetStruct.png" alt="http://etersoft.ru/download/UniSetStruct.png" title="http://etersoft.ru/download/UniSetStruct.png" />&lt;/div>&lt;/div>
</description>
</item>
<item>
<title>2005-07-20 00:18:57</title>
<link>http://freesource.info/wiki/Etersoft/UniSet/show?time=2005-07-20+00%3A18%3A57</link>
<description>&lt;div class="pageBefore">&lt;img src="http://freesource.info/wiki/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" />&lt;/div>&lt;div class="page">
&lt;b>Сравнение версий &lt;a  href="http://freesource.info/wiki/Etersoft/UniSet&amp;" class="">/Etersoft&amp;nbsp;/&amp;nbsp;Uni&amp;nbsp;Set&lt;/a> за &lt;a href="http://freesource.info/wiki/Etersoft/UniSet?time=2005-07-20+00%3A18%3A57">2005-07-20 00:18:57&lt;/a> и &lt;a href="http://freesource.info/wiki/Etersoft/UniSet?time=2005-07-20+00%3A22%3A51">2005-07-20 00:22:51&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">&lt;a name="h962-1">&lt;/a>&lt;h2> Подразделы &lt;/h2>
&lt;span class="missingpage">!/Запуск&amp;nbsp;Процесса&lt;/span>&lt;a href="http://freesource.info/wiki/ЗапускПроцесса/edit?add=1&amp;" title="Создать эту страницу">?&lt;/a>&lt;/div>&lt;br />
&lt;b>Удалено:&lt;/b>&lt;br />
&lt;div class="deletions">&lt;a name="h962-1">&lt;/a>&lt;h1>Об интерфейсах объектов системы управления &lt;span class="missingpage">Uni&amp;nbsp;Set&lt;/span>&lt;a href="http://freesource.info/wiki/UniSet/edit?add=1&amp;" title="Создать эту страницу">?&lt;/a>&lt;/h1>
Далее изложение предполагает наличие у&amp;nbsp;читателя представления о&amp;nbsp;том, как&amp;nbsp;была организована работа с&amp;nbsp;сообщениями, датчиками и&amp;nbsp;выходными сигналами в&amp;nbsp;последней версии &lt;span class="missingpage">Uni&amp;nbsp;Set&lt;/span>&lt;a href="http://freesource.info/wiki/UniSet/edit?add=1&amp;" title="Создать эту страницу">?&lt;/a> (применённой в&amp;nbsp;Имитаторе), где&amp;nbsp;был опробован отказ от&amp;nbsp;вкомпилированных числовых идентификаторов.&lt;br />
Просьба сторонним читателям не&amp;nbsp;особо беспокоиться по&amp;nbsp;поводу данного текста.&lt;br />
&lt;!--notypo-->{{TableOfContents page="" title="" numerate=""}}&lt;!--/notypo-->&lt;a name="h962-2">&lt;/a>&lt;h2> Основные положения&lt;/h2>&lt;a name="h962-3">&lt;/a>&lt;h3> Детали реализации &lt;/h3>!!
 Этот раздел надо распилить!!&lt;br />
Каждый объект в&amp;nbsp;системе должен иметь уникальное имя, с&amp;nbsp;которым он&amp;nbsp;регистрируется в&amp;nbsp;репозитории. По&amp;nbsp;этому имени к&amp;nbsp;объекту можно обратиться (получив по&amp;nbsp;его имени специальную ссылку). Идеология примерно как&amp;nbsp;в&amp;nbsp;интернете, где&amp;nbsp;по&amp;nbsp;web-адресу обращаешься к&amp;nbsp;нужной странице.&lt;br />
В&amp;nbsp;системе существуют разные объекты:&lt;br />
&lt;ul>&lt;li> процессы управления
&lt;/li>&lt;li> процессы ввода/вывода
&lt;/li>&lt;li> процессы обмена с&amp;nbsp;каким-либо оборудованием
&lt;/li>&lt;li> датчики (каждый датчик имеет уникальное имя&amp;nbsp;и&amp;nbsp;является объектом)&lt;/li>&lt;/ul>
В&amp;nbsp;общем случае репозиторий представляет из&amp;nbsp;себя древовидную структуру наподобие каталогов и&amp;nbsp;файлов. Никто конечно не&amp;nbsp;запрещает всем объектам регистрироваться сразу в&amp;nbsp;&amp;laquo;корневом каталоге&amp;raquo;. Тогда они&amp;nbsp;будут иметь самые короткие имена "&lt;span class="missingpage">Корень&amp;nbsp;/&amp;nbsp;Имя&amp;nbsp;Объекта&lt;/span>&lt;a href="http://freesource.info/wiki/Корень/ИмяОбъекта/edit?add=1&amp;" title="Создать эту страницу">?&lt;/a>".&lt;br />
Но&amp;nbsp;мы у&amp;nbsp;себя используем следующую структуру (пока негласную):&lt;br />
&amp;ndash; Корень(Имя проекта)&lt;br />
        - Объекты&lt;br />
                - О1&lt;br />
                - О2&lt;br />
                ...&lt;br />
        - Процессы ввод/вывода&lt;br />
                - IO1&lt;br />
                - IO2&lt;br />
                ...&lt;br />
        - Датчики&lt;br />
                - S1&lt;br />
                - S2&lt;br />
                ...&lt;br />
        - Сервисы&lt;br />
                - &lt;span class="missingpage">Info&amp;nbsp;Server&amp;nbsp;1&lt;/span>&lt;a href="http://freesource.info/wiki/InfoServer1/edit?add=1&amp;" title="Создать эту страницу">?&lt;/a>&lt;br />
                - DBServer1&lt;br />
                ...&lt;br />
Т.е. для&amp;nbsp;того, чтобы получить ссылку на&amp;nbsp;объект О1 необходимо использовать полное имя&amp;nbsp;"&lt;span class="missingpage">Корень&amp;nbsp;/&amp;nbsp;Объекты&amp;nbsp;/&amp;nbsp;О&amp;nbsp;1&lt;/span>&lt;a href="http://freesource.info/wiki/Корень/Объекты/О1/edit?add=1&amp;" title="Создать эту страницу">?&lt;/a>".&lt;br />
Чем&amp;nbsp;удобна такая структура (если её зафиксировать):&lt;br />
&lt;ul>&lt;li> На&amp;nbsp;этом построены средства отладки. Например просмотрщик состояния датчиков обращается к&amp;nbsp;разделу "&lt;span class="missingpage">Корень&amp;nbsp;/&amp;nbsp;Датчики&lt;/span>&lt;a href="http://freesource.info/wiki/Корень/Датчики/edit?add=1&amp;" title="Создать эту страницу">?&lt;/a>" и&amp;nbsp;получает полный список всех датчиков доступных сейчас в&amp;nbsp;системе. В&amp;nbsp;другом случае ему&amp;nbsp;пришлось бы&amp;nbsp;пройтись по&amp;nbsp;всему репозиторию и&amp;nbsp;обращаться к&amp;nbsp;каждому объекту, чтобы выяснить &amp;laquo;датчик&amp;raquo; он&amp;nbsp;или &amp;laquo;не датчик&amp;raquo;...
&lt;/li>&lt;li> Наличие &amp;laquo;Корня&amp;raquo; позволяет работать(отладка) одновременно двум проектам. Т.к. каждый имеет свой корень и&amp;nbsp;они не&amp;nbsp;пересекаются.
&lt;/li>&lt;li> Ну&amp;nbsp;в принципе информация становится структурированной, с&amp;nbsp;ней легче работать.  Потом планировалось написать универсальный (графический) просмотрщик репозитория. С&amp;nbsp;возможностью узнавать информацию о&amp;nbsp;любом объекте и&amp;nbsp;посылать любые сообщения выбранному объекту, естественно он&amp;nbsp;выглядел бы&amp;nbsp;в виде древовидной структуры.&lt;/li>&lt;/ul>
Конечно все&amp;nbsp;эти вещи можно решить и&amp;nbsp;без обязательной древовидной структуры, но&amp;nbsp;пока проблемм особых она&amp;nbsp;не&amp;nbsp;вызывала, да&amp;nbsp;и &amp;laquo;внутренне&amp;raquo; мне&amp;nbsp;как-то больше нравится именно такое разбиение, чем&amp;nbsp;&amp;laquo;валить всё в&amp;nbsp;кучу&amp;raquo;.&lt;br />
Раньше мы&amp;nbsp;использовали статический массив и&amp;nbsp;автоматическое генерирование enum-а. Конечно использование выглядело лучше conf-&amp;gt;oind-&amp;gt;getNameById(&lt;span class="missingpage">Sensor&amp;nbsp;1&lt;/span>&lt;a href="http://freesource.info/wiki/Sensor1/edit?add=1&amp;" title="Создать эту страницу">?&lt;/a>).&lt;br />
Но&amp;nbsp;статическая компиляция не&amp;nbsp;позволяет:&lt;br />
&amp;ndash; без&amp;nbsp;перекомпиляции добавлять новые датчик или&amp;nbsp;объекты&lt;br />
&amp;ndash; генерировать имена на&amp;nbsp;ходу&lt;br />
Глобальный вопрос использования числовых идентификаторов.&lt;br />
Т.е. в&amp;nbsp;CORBA все&amp;nbsp;ссылки являются строками (по крайней мере имеют функции преобразования в&amp;nbsp;строку и&amp;nbsp;обратно). И&amp;nbsp;в &amp;laquo;числе&amp;raquo; ей&amp;nbsp;для работы нет&amp;nbsp;необходимости. ЧИСЛО (ID) придумали мы. &lt;br />
Числовые идентификаторы объектов имеют следующие плюсы:&lt;br />
&lt;ul>&lt;li> экономия места в&amp;nbsp;сообщения (указание адресата, от&amp;nbsp;кого и&amp;nbsp;т.п.)
&lt;/li>&lt;li> в&amp;nbsp;сетях типа CAN, вообще не&amp;nbsp;предусмотрена передача тестовых сообщений (ну по&amp;nbsp;крайней мере штатным быстрым способом).
&lt;/li>&lt;li> с&amp;nbsp;числами легче устраивать всякие там&amp;nbsp;циклы(for), применять какие-то формулы вычисления идентификатора и&amp;nbsp;т.п.
&lt;/li>&lt;li> с&amp;nbsp;числами работа более оптимальна по&amp;nbsp;быстродействию&lt;/li>&lt;/ul>
К&amp;nbsp;минусам приходится отнести только усложнение механизма работы и&amp;nbsp;возможно некоторое неудобство при&amp;nbsp;программировании (по крайней мере визуально). Т.е. получается &amp;ndash; что&amp;nbsp;надо каким-то образом каждому объекту присваивать уникальный идентификатор&lt;br />
&lt;ul>&lt;li> внутри (при вызовах) частенько происходит преобразование ID&amp;nbsp;-&amp;gt; текстовое имя&amp;nbsp;-&amp;gt; ID.
&lt;/li>&lt;li> сложности в&amp;nbsp;синхронизации ID&amp;nbsp;на разных узлах (необходимо следить, чтобы на&amp;nbsp;двух разных узлах идентификаторы одного и&amp;nbsp;того же&amp;nbsp;объекта совпадали. Это&amp;nbsp;достигается либо статической компиляцией, либо (как сейчас) требуется следить, чтобы на&amp;nbsp;узлах был&amp;nbsp;одинаковый исходный xml-файл настроек проекта).&lt;/li>&lt;/ul>&lt;a name="h962-4">&lt;/a>&lt;h3> Объекты и&amp;nbsp;интерфейсы&lt;/h3>
Объект регистрируется в&amp;nbsp;репозитории с&amp;nbsp;уникальным именем и&amp;nbsp;только после этого может взаимодействовать с&amp;nbsp;другими объектами.&lt;br />
Активный объект представлен классом (в С++) и&amp;nbsp;имеет свойства, которые хранятся в&amp;nbsp;конф.  файле проекта и&amp;nbsp;определяют тип&amp;nbsp;интерфейса объекта.&lt;br />
Существует ряд&amp;nbsp;базовых типов интерфейса:(&lt;span class="missingpage">Uni&amp;nbsp;Set&amp;nbsp;Object&lt;/span>&lt;a href="http://freesource.info/wiki/UniSetObject/edit?add=1&amp;" title="Создать эту страницу">?&lt;/a>, &lt;span class="missingpage">Objects&amp;nbsp;Manager&lt;/span>&lt;a href="http://freesource.info/wiki/ObjectsManager/edit?add=1&amp;" title="Создать эту страницу">?&lt;/a>,  IONotifyController, для&amp;nbsp;каждого из&amp;nbsp;которых определён набор допустимых над&amp;nbsp;ним операций.&lt;br />
&lt;ul>&lt;li> &lt;span class="missingpage">Uni&amp;nbsp;Set&amp;nbsp;Object&lt;/span>&lt;a href="http://freesource.info/wiki/UniSetObject/edit?add=1&amp;" title="Создать эту страницу">?&lt;/a>  позволяет ему&amp;nbsp;посылать сообщения
&lt;/li>&lt;li> &lt;span class="missingpage">Objects&amp;nbsp;Manager&lt;/span>&lt;a href="http://freesource.info/wiki/ObjectsManager/edit?add=1&amp;" title="Создать эту страницу">?&lt;/a>  свойства &lt;span class="missingpage">Uni&amp;nbsp;Set&amp;nbsp;Object&lt;/span>&lt;a href="http://freesource.info/wiki/UniSetObject/edit?add=1&amp;" title="Создать эту страницу">?&lt;/a> + позволяет через него посылать сообщения подчинённым ему&amp;nbsp;объектам, гарантируя доставку
&lt;/li>&lt;li> IONotifyController позволяет узнавать значения входов и&amp;nbsp;управлять выходами&lt;/li>&lt;/ul>
Названия типов, хранящиеся в&amp;nbsp;конф. файле, соответствуют названию классов в&amp;nbsp;С++.&lt;br />
Для&amp;nbsp;каждого активного объекта на&amp;nbsp;основе конф. файла генерируется базовый класс, который наследован от&amp;nbsp;одного из&amp;nbsp;базовых классов, в&amp;nbsp;зависимости от&amp;nbsp;типа его&amp;nbsp;интерфейса. Класс записывается в&amp;nbsp;отдельный файл и&amp;nbsp;содержит в&amp;nbsp;секции protected переменные состояния датчиков и&amp;nbsp;идентификаторы датчиков. Для&amp;nbsp;этого класса формируется функция, отвечающая за&amp;nbsp;обновление переменных с&amp;nbsp;состояниями датчиков. Также указывается название объекта (уникальное для&amp;nbsp;данного узла). В&amp;nbsp;конструкторе класса происходит получение необходимых идентификаторов.&lt;br />
В&amp;nbsp;конфигурационном файле для&amp;nbsp;каждого объекта перечислены объекты, с&amp;nbsp;которыми он&amp;nbsp;взаимодействует. Для&amp;nbsp;датчиков &amp;ndash; перечислены заказчики, для&amp;nbsp;выходов &amp;ndash; перечислены управляющие им&amp;nbsp;объекты, для&amp;nbsp;активных объектов &amp;ndash; объекты, имеющие право отправлять сообщения. Программа проверки должна проверять корректность этих ссылок. Этот механизм позволяет генерировать локальные переменные, содержащие идентификаторы используемых объектов (получаемые на&amp;nbsp;основании имени) и&amp;nbsp;контролировать допустимость взаимодействия, то&amp;nbsp;есть право использования.&lt;a name="h962-5">&lt;/a>&lt;h3> Текстовое название объекта &lt;/h3>
&lt;span class="cite">На перспективу:&lt;/span>&lt;br />
Полный путь объекта имеет вид&lt;br />
&lt;a href="file://///узел/Корень/Вид">\\узел\Корень\Вид&lt;/a> объекта\Устройство\Название объекта на&amp;nbsp;устройстве&lt;br />
(допустимы любые символы в&amp;nbsp;названии, кроме \0, \\ и&amp;nbsp;'.'&lt;br />
Этот путь является полностью уникальных в&amp;nbsp;пределах системы.&lt;br />
Локальный путь к&amp;nbsp;объекту имеет вид&lt;br />
\Корень\Вид объекта\Название объекта&lt;br />
Для&amp;nbsp;разных узлов сети адрес может повторяться.&lt;br />
Название объекта может повторяться для&amp;nbsp;различных видов объектов.&lt;br />
&lt;span class="cite">Требует обсуждения, нужно ли&amp;nbsp;что-то кодировать в&amp;nbsp;названии объекта&lt;/span>&lt;a name="h962-6">&lt;/a>&lt;h3> Числовой код&amp;nbsp;объекта &lt;/h3>
Для&amp;nbsp;пересылки и&amp;nbsp;обработки использоваться числовой код&amp;nbsp;(идентификатор) объекта, имеющий однозначное взаимное соответствие с&amp;nbsp;путём к&amp;nbsp;объекту.&lt;br />
Должен предлагаться дешёвый механизм по&amp;nbsp;преобразованию код-&amp;gt;путь-&amp;gt;код.&lt;br />
Конкретных реализаций может быть несколько: от&amp;nbsp;непосредственного задания кода в&amp;nbsp;XML-файле до&amp;nbsp;создания хэш-функции.&lt;br />
Принятым рабочим вариантом является хранение всей информации об&amp;nbsp;объектах в&amp;nbsp;XML-файлах, копируемых на&amp;nbsp;все узлы сети&lt;br />
В&amp;nbsp;использовании констант, обозначающих код&amp;nbsp;объекта, необходимости не&amp;nbsp;найдено.&lt;a name="h962-7">&lt;/a>&lt;h3> Способы обмена информацией между объектами &lt;/h3>
&lt;ul>&lt;li> Получение сообщения о&amp;nbsp;состоянии (датчика)
&lt;/li>&lt;li> Передача извещения (сообщения с&amp;nbsp;командой)
&lt;/li>&lt;li> Установка выходного значения&lt;/li>&lt;/ul>
&lt;span class="cite">Надо дополнить&lt;/span>&lt;a name="h962-8">&lt;/a>&lt;h2> Основные предлагаемые изменения &lt;/h2>
Далее будут приведено подробное обоснование предлагаемых изменений, сделанное на&amp;nbsp;основании обсуждений ситуации 13.07.2005 и&amp;nbsp;14.07.2005.&lt;br />
Изменения ставят целью создание простого, завершённого интерфейса для&amp;nbsp;написания алгоритмов управления, а&amp;nbsp;также графических интерфейсов и&amp;nbsp;процессов ввода-вывода. &lt;br />
Все&amp;nbsp;допустимые взаимодействия между объектами должно быть жёстко указано, не&amp;nbsp;должно быть возможно несанкционированное вмешательство в&amp;nbsp;объект из&amp;nbsp;кода, к&amp;nbsp;нему не&amp;nbsp;относящегося. Это&amp;nbsp;относится к&amp;nbsp;удалённому вызову функций, удалённому изменению состояния датчиков.&lt;br />
При&amp;nbsp;написании/проектировании интерфейсов следует предусматривать разделение на&amp;nbsp;уровни &amp;ndash; интерфейс, предоставляемый пользователю и&amp;nbsp;интерфейс, нужный самой системе.&lt;a name="h962-9">&lt;/a>&lt;h3> Отмена функций askState/askValue &lt;/h3>
Поскольку информация о&amp;nbsp;заказываемых датчиков для&amp;nbsp;надёжности перенесена в&amp;nbsp;конф. файл, необходимости заказывать датчики напрямую в&amp;nbsp;приложении нет. Чтобы сделать API&amp;nbsp;стройным, функция заказа датчиков упраздняется.&lt;br />
&lt;em>2pv: Чтобы собрать сведения, что&amp;nbsp;заказывает объект, нужно просмотреть весь конф. файл?&lt;/em>&lt;br />
&lt;div class="indent">Для того, чтобы собрать сведения о&amp;nbsp;том, какой датчик нужен какому объекту достаточно просмотреть секцию sensors конфигурационного файла.&lt;/div>
На&amp;nbsp;данный момент отказатся от&amp;nbsp;этих функций не&amp;nbsp;представляется возможным. Даже если считать, что&amp;nbsp;список заказа формируется в&amp;nbsp;конф. файле, то&amp;nbsp;остаётся вопрос о&amp;nbsp;событии &lt;span class="missingpage">ЗапускПроцесса&lt;/span>&lt;a href="http://freesource.info/wiki/UniSet/ZapuskProcessa/edit?add=1&amp;" title="Создать эту страницу">?&lt;/a>&lt;a name="h962-10">&lt;/a>&lt;h3> Функции saveState/Value &lt;/h3>
&lt;span class="cite">Это способ управления состоянием фиктивных входных датчиков? Такой способ применяться не&amp;nbsp;должен.&lt;/span>&lt;br />
saveState НЕ&amp;nbsp;должен быть доступен снаружи объекта.&lt;br />
Функция сохранения состояния не&amp;nbsp;должна быть использована вне&amp;nbsp;процесса, владеющего объектом, для&amp;nbsp;которого меняется состояние. Поэтому из&amp;nbsp;&lt;span class="missingpage">Universal&amp;nbsp;Interface&lt;/span>&lt;a href="http://freesource.info/wiki/UniversalInterface/edit?add=1&amp;" title="Создать эту страницу">?&lt;/a> она&amp;nbsp;должна быть вынесена. ?&lt;a name="h962-11">&lt;/a>&lt;h3> Упразднение разделения датчиков на&amp;nbsp;виды&lt;/h3>
Исторически сложилось, что&amp;nbsp;введены понятия аналоговых (принимающих значение в&amp;nbsp;определённом диапазоне) и&amp;nbsp;дискретных (имеющих два&amp;nbsp;состояния &amp;ndash; 1 и&amp;nbsp;0) датчиков. Для&amp;nbsp;каждого вида датчиков реализован свой набор функций.&lt;br />
&lt;ul>&lt;li> Предлагается упразднить разделение аналоговых и&amp;nbsp;цифровых датчиков/выходов при&amp;nbsp;обращении с&amp;nbsp;ним. Для&amp;nbsp;двоичных по&amp;nbsp;природе датчиков состояние 0 будет кодироваться значением 0, состояние 1 &amp;ndash; ненулевым значением.
&lt;/li>&lt;li> В&amp;nbsp;сообщениях поле state будет упразднено (при желании можно сделать совмещение полей state и&amp;nbsp;value)
&lt;/li>&lt;li> Предлагется ввести код&amp;nbsp;состояния датчика (или кодировать его&amp;nbsp;состояние в&amp;nbsp;value). Это&amp;nbsp;позволит узнавать об&amp;nbsp;обрыве/замыкании датчика.&lt;/li>&lt;/ul>
Соответственно функции семейства *State упраздняются.&lt;a name="h962-12">&lt;/a>&lt;h3> Отмена функций getState/Value &lt;/h3>
Функция получения текущего значения часто используется в&amp;nbsp;алгоритмах. В&amp;nbsp;данный момент использование это&amp;nbsp;выглядит очень неуклюже, стоимость вызова достаточно велика, вызов вносит дополнительные задержки, загромождает код&amp;nbsp;и&amp;nbsp;не обеспечивает когерентность (одновременное измерение) запрашиваемых датчиков.&lt;br />
Поэтому предлагается функцию для&amp;nbsp;прямого получения состояния (значения) отменить. Информация об&amp;nbsp;изменении значений будет доставляться заказанными извещениями о&amp;nbsp;изменении состояния датчиков. Для&amp;nbsp;хранения информации о&amp;nbsp;состоянии в&amp;nbsp;класс вводятся локальные переменные, значение которых заполняется специальной функцией, действующей перед обычным вызовом processingMessage, таким образом, что&amp;nbsp;в&amp;nbsp;любой момент при&amp;nbsp;обращении к&amp;nbsp;этим переменным их&amp;nbsp;значения будут максимально актуальны.&lt;br />
Для&amp;nbsp;облегчения программирования добавление необходимого кода в&amp;nbsp;класс будет осуществляться автоматически. Для&amp;nbsp;каждого заказанного датчика будут созданы локальные переменные name (хранящая состояние датчика) и&amp;nbsp;id_name (хранящая идентификатор датчика).&lt;br />
Для&amp;nbsp;указания конкретного имени переменной, соответствующей датчику, его&amp;nbsp;необходимо явно указать в&amp;nbsp;конф. файле, иначе оно&amp;nbsp;будет сгенерировано по&amp;nbsp;умолчанию (нужно сформулировать правила). Способ передачи имени переменной в&amp;nbsp;конф. файл обсуждается.&lt;a name="h962-13">&lt;/a>&lt;h3> Тип&amp;nbsp;сообщения &lt;/h3>
Предлагается убрать доступ к&amp;nbsp;полю типа сообщения (датчик/выход дискретный/аналоговый), поскольку информация о&amp;nbsp;содержании датчика должна быть интерпретирована программистом на&amp;nbsp;основании его&amp;nbsp;названия.&lt;br />
&lt;em> Пока не&amp;nbsp;будет чётко определён механизм разделения интерфейсов на&amp;nbsp;доступные конечным разработчикам и&amp;nbsp;доступные библиотечным классам(объектам) это&amp;nbsp;поле предлагаю оставить. Т.к. оно&amp;nbsp;используется в&amp;nbsp;реализации DBServer и&amp;nbsp;по нему определяется в&amp;nbsp;какую таблицу необходимо сохранить запись об&amp;nbsp;изменении состояния датчика. Для&amp;nbsp;БД&amp;nbsp;разделение на&amp;nbsp;аналоговые и&amp;nbsp;дискретные существенно, т.к. связано с&amp;nbsp;оптимизацией хранения (Cейчас аналоговые и&amp;nbsp;дискретные датчики хранятся в&amp;nbsp;разных таблицах. Более того, изменение аналоговых датчиков просиходит чаще). &lt;/em>&lt;a name="h962-14">&lt;/a>&lt;h3> Конфигурационный файл &lt;/h3>
&lt;ul>&lt;li> В&amp;nbsp;систему должен быть встроен механизм контроля одинаковости конф. файлов на&amp;nbsp;основе номера версии.
&lt;/li>&lt;li> По-хорошему должен быть добавлен алгоритм подписи файла, чтобы его&amp;nbsp;модификация была исключена.&lt;/li>&lt;/ul>&lt;a name="h962-15">&lt;/a>&lt;h3> Получение идентификатора объекта &lt;/h3>
Применённое в&amp;nbsp;Имитаторе получение ID&amp;nbsp;выглядит ужасно:&lt;br />
conf-&amp;gt;oind-&amp;gt;getIdByName(conf-&amp;gt;getObjectsSection() + &amp;laquo;/GUI&amp;raquo;);&lt;br />
Предлагается ввести функцию&lt;br />
&lt;span class="missingpage">Uni&amp;nbsp;Set&amp;nbsp;Types&lt;/span>&lt;a href="http://freesource.info/wiki/UniSetTypes/edit?add=1&amp;" title="Создать эту страницу">?&lt;/a>::getObjectID("&lt;span class="missingpage">/Sensors&amp;nbsp;/&amp;nbsp;Send&amp;nbsp;Server&lt;/span>&lt;a href="http://freesource.info/wiki/Sensors/SendServer/edit?add=1&amp;" title="Создать эту страницу">?&lt;/a>")&lt;br />
Функции&lt;br />
&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">inline string getSensorsSection() const { return secSensors; }&lt;br />
inline string getObjectsSection() const { return secObjects; }&lt;br />
inline string getControllersSection() const { return secControlles; }&lt;br />
inline string getServicesSection() const { return secServices; }&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>
упразднить или&amp;nbsp;обосновать их&amp;nbsp;существование&lt;a name="h962-16">&lt;/a>&lt;h3> Предопределённые каталоги &lt;/h3>
Должны формироватся configure пути к&amp;nbsp;используемым каталогам, и&amp;nbsp;получаться стандартными средствами, как&amp;nbsp;это делается в&amp;nbsp;других программах.&lt;br />
Функции&lt;br />
&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">&lt;div class="indent">inline const string getConfDir() const { return confDir; }&lt;br />
inline const string getDataDir() const { return dataDir; }&lt;br />
inline const string getBinDir() const { return binDir; }&lt;br />
inline const string getLogDir() const { return logDir; }&lt;br />
inline const string getLockDir() const { return lockDir; }&lt;br />
inline const string getDocDir() const { return docDir; }&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>&lt;/div>
по&amp;nbsp;возможности упразднить.&lt;/div>&lt;/div>
</description>
</item>
<item>
<title>2005-07-19 23:40:24</title>
<link>http://freesource.info/wiki/Etersoft/UniSet/show?time=2005-07-19+23%3A40%3A24</link>
<description>&lt;div class="pageBefore">&lt;img src="http://freesource.info/wiki/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" />&lt;/div>&lt;div class="page">
&lt;b>Сравнение версий &lt;a  href="http://freesource.info/wiki/Etersoft/UniSet&amp;" class="">/Etersoft&amp;nbsp;/&amp;nbsp;Uni&amp;nbsp;Set&lt;/a> за &lt;a href="http://freesource.info/wiki/Etersoft/UniSet?time=2005-07-19+23%3A40%3A24">2005-07-19 23:40:24&lt;/a> и &lt;a href="http://freesource.info/wiki/Etersoft/UniSet?time=2005-07-20+00%3A18%3A57">2005-07-20 00:18:57&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">&lt;a name="h962-1">&lt;/a>&lt;h1> Библиотека &lt;span class="missingpage">Uni&amp;nbsp;Set&lt;/span>&lt;a href="http://freesource.info/wiki/UniSet/edit?add=1&amp;" title="Создать эту страницу">?&lt;/a> &lt;/h1>&lt;a name="h962-2">&lt;/a>&lt;h2> Краткое описание&lt;/h2>
Библиотека &lt;span class="missingpage">Uni&amp;nbsp;Set&lt;/span>&lt;a href="http://freesource.info/wiki/UniSet/edit?add=1&amp;" title="Создать эту страницу">?&lt;/a> предназначена для&amp;nbsp;построения распределенных систем управления. В&amp;nbsp;ней собраны основные компоненты, из&amp;nbsp;которых строятся подобные системы:&lt;br />
 &lt;br />
&lt;ul>&lt;li> базовые интерфейсы для&amp;nbsp;реализации алгоритмов управления 
&lt;/li>&lt;li> цифровой и&amp;nbsp;аналоговый ввод/вывод (опрос физических датчиков, обмен с&amp;nbsp;другими устройствами) (COMEDI)
&lt;/li>&lt;li> механизм взаимодействия и&amp;nbsp;обмена сообщениями между процессами, основанный на&amp;nbsp;CORBA (omniORB)
&lt;/li>&lt;li> накопление и&amp;nbsp;хранение информации в&amp;nbsp;базе данных (&lt;span class="missingpage">My&amp;nbsp;SQL&lt;/span>&lt;a href="http://freesource.info/wiki/MySQL/edit?add=1&amp;" title="Создать эту страницу">?&lt;/a>)
&lt;/li>&lt;li> просмотр накопленной (статистической) информации (Apache+PHP)
&lt;/li>&lt;li> конфигурирование системы с&amp;nbsp;использованием XML&amp;nbsp;(libxml2)&lt;/li>&lt;/ul>
Основным языком проекта является C++, а&amp;nbsp;также IDL&amp;nbsp;для написания базовых интерфейсов. В&amp;nbsp;целом, построение системы допускает использование других языков. На&amp;nbsp;сегодняшний день библиотека собирается под&amp;nbsp;ОС&amp;nbsp;GNU/Linux (ALT Linux), на&amp;nbsp;её основе построено несколько коммерческих проектов. Одним из&amp;nbsp;принципов построения библиотеки &lt;span class="missingpage">Uni&amp;nbsp;Set&lt;/span>&lt;a href="http://freesource.info/wiki/UniSet/edit?add=1&amp;" title="Создать эту страницу">?&lt;/a> является максимальное использование сторонних свободных библиотек, которые при&amp;nbsp;помощи &lt;span class="missingpage">Uni&amp;nbsp;Set&lt;/span>&lt;a href="http://freesource.info/wiki/UniSet/edit?add=1&amp;" title="Создать эту страницу">?&lt;/a> объединяются в&amp;nbsp;единый интерфейс.&lt;br />
 &lt;br />
Исходный код&amp;nbsp;проекта опубликован на&amp;nbsp;сайте &lt;a href="http://sourceforge.net/projects/uniset/" target="_blank" title="Внешняя ссылка (откроется в новом окне)" class="outerlink">&lt;img src="http://freesource.info/wiki/themes/coffee/icons/web.gif" alt="" border="0" />http://sourceforge.net/projects/uniset/&lt;/a> и&amp;nbsp;доступен через CVS.&lt;br />
&lt;span class="missingpage">!/Объекты&amp;nbsp;Системы&lt;/span>&lt;a href="http://freesource.info/wiki/ОбъектыСистемы/edit?add=1&amp;" title="Создать эту страницу">?&lt;/a>&lt;br />
&lt;span class="missingpage">!/Предлагаемые&amp;nbsp;Изменения&amp;nbsp;В&amp;nbsp;Объектах&lt;/span>&lt;a href="http://freesource.info/wiki/ПредлагаемыеИзмененияВОбъектах/edit?add=1&amp;" title="Создать эту страницу">?&lt;/a>&lt;br />
&lt;span class="missingpage">!/Предлагаемые&amp;nbsp;Изменения&amp;nbsp;В&amp;nbsp;Системе&lt;/span>&lt;a href="http://freesource.info/wiki/ПредлагаемыеИзмененияВСистеме/edit?add=1&amp;" title="Создать эту страницу">?&lt;/a>&lt;/div>&lt;/div>
</description>
</item>
<item>
<title>2005-07-18 20:18:36</title>
<link>http://freesource.info/wiki/Etersoft/UniSet/show?time=2005-07-18+20%3A18%3A36</link>
<description>&lt;div class="pageBefore">&lt;img src="http://freesource.info/wiki/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" />&lt;/div>&lt;div class="page">
&lt;b>Сравнение версий &lt;a  href="http://freesource.info/wiki/Etersoft/UniSet&amp;" class="">/Etersoft&amp;nbsp;/&amp;nbsp;Uni&amp;nbsp;Set&lt;/a> за &lt;a href="http://freesource.info/wiki/Etersoft/UniSet?time=2005-07-18+20%3A18%3A36">2005-07-18 20:18:36&lt;/a> и &lt;a href="http://freesource.info/wiki/Etersoft/UniSet?time=2005-07-19+23%3A40%3A24">2005-07-19 23:40:24&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">На&amp;nbsp;данный момент отказатся от&amp;nbsp;этих функций не&amp;nbsp;представляется возможным. Даже если считать, что&amp;nbsp;список заказа формируется в&amp;nbsp;конф. файле, то&amp;nbsp;остаётся вопрос о&amp;nbsp;событии &lt;span class="missingpage">ЗапускПроцесса&lt;/span>&lt;a href="http://freesource.info/wiki/UniSet/ZapuskProcessa/edit?add=1&amp;" title="Создать эту страницу">?&lt;/a>&lt;/div>&lt;br />
&lt;b>Удалено:&lt;/b>&lt;br />
&lt;div class="deletions">На&amp;nbsp;данный момент отказатся от&amp;nbsp;этих функций не&amp;nbsp;представляется возможным. Даже если считать, что&amp;nbsp;список заказа формируется в&amp;nbsp;конф. файле, то&amp;nbsp;остаётся вопрос о&amp;nbsp;событии &lt;span class="missingpage">Запуск&amp;nbsp;Процесса&lt;/span>&lt;a href="http://freesource.info/wiki/ЗапускПроцесса/edit?add=1&amp;" title="Создать эту страницу">?&lt;/a>&lt;/div>&lt;/div>
</description>
</item>
<item>
<title>2005-07-18 02:41:48</title>
<link>http://freesource.info/wiki/Etersoft/UniSet/show?time=2005-07-18+02%3A41%3A48</link>
<description>&lt;div class="pageBefore">&lt;img src="http://freesource.info/wiki/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" />&lt;/div>&lt;div class="page">
&lt;b>Сравнение версий &lt;a  href="http://freesource.info/wiki/Etersoft/UniSet&amp;" class="">/Etersoft&amp;nbsp;/&amp;nbsp;Uni&amp;nbsp;Set&lt;/a> за &lt;a href="http://freesource.info/wiki/Etersoft/UniSet?time=2005-07-18+02%3A41%3A48">2005-07-18 02:41:48&lt;/a> и &lt;a href="http://freesource.info/wiki/Etersoft/UniSet?time=2005-07-18+20%3A18%3A36">2005-07-18 20:18:36&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">На&amp;nbsp;данный момент отказатся от&amp;nbsp;этих функций не&amp;nbsp;представляется возможным. Даже если считать, что&amp;nbsp;список заказа формируется в&amp;nbsp;конф. файле, то&amp;nbsp;остаётся вопрос о&amp;nbsp;событии &lt;span class="missingpage">Запуск&amp;nbsp;Процесса&lt;/span>&lt;a href="http://freesource.info/wiki/ЗапускПроцесса/edit?add=1&amp;" title="Создать эту страницу">?&lt;/a>&lt;/div>&lt;/div>
</description>
</item>
<item>
<title>2005-07-18 00:27:04</title>
<link>http://freesource.info/wiki/Etersoft/UniSet/show?time=2005-07-18+00%3A27%3A04</link>
<description>&lt;div class="pageBefore">&lt;img src="http://freesource.info/wiki/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" />&lt;/div>&lt;div class="page">
&lt;b>Сравнение версий &lt;a  href="http://freesource.info/wiki/Etersoft/UniSet&amp;" class="">/Etersoft&amp;nbsp;/&amp;nbsp;Uni&amp;nbsp;Set&lt;/a> за &lt;a href="http://freesource.info/wiki/Etersoft/UniSet?time=2005-07-18+00%3A27%3A04">2005-07-18 00:27:04&lt;/a> и &lt;a href="http://freesource.info/wiki/Etersoft/UniSet?time=2005-07-18+02%3A41%3A48">2005-07-18 02:41:48&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">&lt;em> Пока не&amp;nbsp;будет чётко определён механизм разделения интерфейсов на&amp;nbsp;доступные конечным разработчикам и&amp;nbsp;доступные библиотечным классам(объектам) это&amp;nbsp;поле предлагаю оставить. Т.к. оно&amp;nbsp;используется в&amp;nbsp;реализации DBServer и&amp;nbsp;по нему определяется в&amp;nbsp;какую таблицу необходимо сохранить запись об&amp;nbsp;изменении состояния датчика. Для&amp;nbsp;БД&amp;nbsp;разделение на&amp;nbsp;аналоговые и&amp;nbsp;дискретные существенно, т.к. связано с&amp;nbsp;оптимизацией хранения (Cейчас аналоговые и&amp;nbsp;дискретные датчики хранятся в&amp;nbsp;разных таблицах. Более того, изменение аналоговых датчиков просиходит чаще). &lt;/em>&lt;/div>&lt;br />
&lt;b>Удалено:&lt;/b>&lt;br />
&lt;div class="deletions">&lt;em> Пока не&amp;nbsp;будет чётко определён механизм разделения интерфейсов на&amp;nbsp;доступные конечным разработчикам и&amp;nbsp;доступные библиотечным классам(объектам) это&amp;nbsp;поле предлагаю оставить. Т.к. оно&amp;nbsp;используется в&amp;nbsp;реализации DBServer и&amp;nbsp;по нему определяется в&amp;nbsp;какую таблицу необходимо сохранить запись об&amp;nbsp;изменении состояния датчика. Для&amp;nbsp;БД&amp;nbsp;разделение на&amp;nbsp;аналоговые и&amp;nbsp;дискретные существенно, т.к. связано с&amp;nbsp;оптимизацией хранения. Сейчас аналоговые и&amp;nbsp;дискретные датчики хранятся в&amp;nbsp;разных таблицах. Более того, изменение аналоговых датчиков просиходит чаще. &lt;/em>&lt;/div>&lt;/div>
</description>
</item>
<item>
<title>2005-07-18 00:16:48</title>
<link>http://freesource.info/wiki/Etersoft/UniSet/show?time=2005-07-18+00%3A16%3A48</link>
<description>&lt;div class="pageBefore">&lt;img src="http://freesource.info/wiki/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" />&lt;/div>&lt;div class="page">
&lt;b>Сравнение версий &lt;a  href="http://freesource.info/wiki/Etersoft/UniSet&amp;" class="">/Etersoft&amp;nbsp;/&amp;nbsp;Uni&amp;nbsp;Set&lt;/a> за &lt;a href="http://freesource.info/wiki/Etersoft/UniSet?time=2005-07-18+00%3A16%3A48">2005-07-18 00:16:48&lt;/a> и &lt;a href="http://freesource.info/wiki/Etersoft/UniSet?time=2005-07-18+00%3A27%3A04">2005-07-18 00:27:04&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">&lt;em> Пока не&amp;nbsp;будет чётко определён механизм разделения интерфейсов на&amp;nbsp;доступные конечным разработчикам и&amp;nbsp;доступные библиотечным классам(объектам) это&amp;nbsp;поле предлагаю оставить. Т.к. оно&amp;nbsp;используется в&amp;nbsp;реализации DBServer и&amp;nbsp;по нему определяется в&amp;nbsp;какую таблицу необходимо сохранить запись об&amp;nbsp;изменении состояния датчика. Для&amp;nbsp;БД&amp;nbsp;разделение на&amp;nbsp;аналоговые и&amp;nbsp;дискретные существенно, т.к. связано с&amp;nbsp;оптимизацией хранения. Сейчас аналоговые и&amp;nbsp;дискретные датчики хранятся в&amp;nbsp;разных таблицах. Более того, изменение аналоговых датчиков просиходит чаще. &lt;/em>&lt;/div>&lt;br />
&lt;b>Удалено:&lt;/b>&lt;br />
&lt;div class="deletions">&lt;div class="indent">//Пока не&amp;nbsp;будет чётко определён механизм разделения интерфейсов на&amp;nbsp;доступные конечным разработчикам и&amp;nbsp;доступные библиотечным классам(объектам) это&amp;nbsp;поле&lt;/div>
предлагаю оставить. Т.к. оно&amp;nbsp;используется в&amp;nbsp;реализации DBServer и&amp;nbsp;по нему определяется в&amp;nbsp;какую таблицу необходимо сохранить запись об&amp;nbsp;изменении состояния датчика.&lt;br />
Для&amp;nbsp;БД&amp;nbsp;разделение на&amp;nbsp;аналоговые и&amp;nbsp;дискретные существенно, т.к. связано с&amp;nbsp;оптимизацией хранения. Сейчас аналоговые и&amp;nbsp;дискретные датчики хранятся в&amp;nbsp;разных таблицах.&lt;br />
Более того, изменение аналоговых датчиков просиходит чаще.&lt;/div>&lt;/div>
</description>
</item>
<item>
<title>2005-07-15 20:00:39</title>
<link>http://freesource.info/wiki/Etersoft/UniSet/show?time=2005-07-15+20%3A00%3A39</link>
<description>&lt;div class="pageBefore">&lt;img src="http://freesource.info/wiki/images/z.gif" width="1" height="1" border="0" alt="" style="display:block" align="top" />&lt;/div>&lt;div class="page">
&lt;b>Сравнение версий &lt;a  href="http://freesource.info/wiki/Etersoft/UniSet&amp;" class="">/Etersoft&amp;nbsp;/&amp;nbsp;Uni&amp;nbsp;Set&lt;/a> за &lt;a href="http://freesource.info/wiki/Etersoft/UniSet?time=2005-07-15+20%3A00%3A39">2005-07-15 20:00:39&lt;/a> и &lt;a href="http://freesource.info/wiki/Etersoft/UniSet?time=2005-07-18+00%3A16%3A48">2005-07-18 00:16:48&lt;/a>&lt;/b>&lt;br />
&lt;br />
&lt;b>Добавлено:&lt;/b>&lt;br />
&lt;div class="additions">&lt;div class="indent">//Пока не&amp;nbsp;будет чётко определён механизм разделения интерфейсов на&amp;nbsp;доступные конечным разработчикам и&amp;nbsp;доступные библиотечным классам(объектам) это&amp;nbsp;поле&lt;/div>
предлагаю оставить. Т.к. оно&amp;nbsp;используется в&amp;nbsp;реализации DBServer и&amp;nbsp;по нему определяется в&amp;nbsp;какую таблицу необходимо сохранить запись об&amp;nbsp;изменении состояния датчика.&lt;br />
Для&amp;nbsp;БД&amp;nbsp;разделение на&amp;nbsp;аналоговые и&amp;nbsp;дискретные существенно, т.к. связано с&amp;nbsp;оптимизацией хранения. Сейчас аналоговые и&amp;nbsp;дискретные датчики хранятся в&amp;nbsp;разных таблицах.&lt;br />
Более того, изменение аналоговых датчиков просиходит чаще.&lt;/div>&lt;/div>
</description>
</item>
</channel>
</rss>
