UniSet
1.4.0
|
В библиотеке uniset имеется ряд основопологающих кубиков (терминов), из которых складывается библиотека, и которые используются во многих местах данной документации. Здесь приводятся определения этих терминов.
В разных местах описаний, в зависимости от контекста, под "объектом" подразумевается либо объект класса так или иначе наследующегося от базового класса библиотеки UniSetObject, либо некий концептуальный программный объект способный получать и обрабатывать сообщения.
В библиотеке произведено условное деление на следующие типы объектов:
Вся система взаимодейтсвия между объектами в основном построена на использовании сообщений (передаваемых путём удаленного вызова специальных функций, посредством CORBA). При этом основные типы сообщений объявлены в файле MessageType.h. Каждое сообщение имеет свой уникальный идентификатор (enum). См. UniSetTypes::Message::TypeOfMessage.
Для разработчиков систем на основе libuniset, заложена возможность определять свои типы сообщений, при этом их идентификаторы должны начинатся от значения UniSetTypes::Message::TheLastFieldOfTypeOfMessage.
enum MyMessageTypes
{
myBegin = UniSetTypes::Message::TheLastFieldOfTypeOfMessage,
myMessgeType1,
myMessgeType2,
myMessgeType3,
...
};
Каждый объект, которому необходимо взаимодействовать с другими объектами (в том числе датчиками см. Датчик) должен обладать уникальным идентификатором. В качестве идентификатора выступает любое число типа UniSetTypes::ObjectId. Зарезервированным числом является UniSetTypes::DefaultObjectId. Минимальное требование - это уникальность в рамках одного узла. Так как полный идентификатор объекта формируется парой <id,node> Где node - такое же число, являющееся идентификатором узла. При этом приветствуется использование идентификатора уникального в рамках всей создаваемой системы. Т.к. в последствии возможен уход от использования параметра node.
На текущий момент существует два основных способа задать идентификатор объекта.
<Configurations> ... <ObjectsMap idfromfile="0"> <nodes port="2809"> <item name="LocalhostNode" alias="" textname="Локальный узел" ip="127.0.0.1" infserver="InfoServer" dbserver=""/> <item name="Node2" alias="" textname="Локальный узел" ip="127.0.0.1" infserver="InfoServer" dbserver=""/> </nodes> <sensors> <item name="Input1_S" textname="Команда 1" node="" iotype="DI" priority="Medium" default="1" /> <item name="Input2_S" textname="Команда 2" node="" iotype="DI" priority="Medium" mbtype="rtu" mbaddr="0x01" mbfunc="0x04" mbreg="0x02" rs="2" /> </sensors> <controllers name="Controllers"> <item name="SharedMemory"/> <item name="UniExchange"/> <item name="UniExchange2"/> </controllers> <!-- ******************* Идентификаторы сервисов ***************** --> <services name="Services"> <item name="InfoServer"/> <item name="DBServer"/> <item name="PrintServer"/> <item name="TimeService"/> </services> <!-- ******************* Идентификаторы объектов ***************** --> <objects name="UniObjects"> <item name="TestProc1"/> <item name="TestProc2"/> </objects> </ObjectsMap> ... </Configurations>
<Configurations> ... <ObjectsMap idfromfile="1"> <nodes port="2809"> <item id="1000" name="LocalhostNode" alias="" textname="Локальный узел" ip="127.0.0.1" infserver="InfoServer" dbserver=""/> <item id="1001" name="Node2" alias="" textname="Локальный узел" ip="127.0.0.1" infserver="InfoServer" dbserver=""/> </nodes> <sensors> <item id="1" name="Input1_S" textname="Команда 1" node="" iotype="DI" priority="Medium" default="1" /> <item id="10" name="Input2_S" textname="Команда 2" node="" iotype="DI" priority="Medium" mbtype="rtu" mbaddr="0x01" mbfunc="0x04" mbreg="0x02" rs="2" /> </sensors> <controllers name="Controllers"> <item id="100" name="SharedMemory"/> <item id="101" name="UniExchange"/> <item id="102" name="UniExchange2"/> </controllers> <!-- ******************* Идентификаторы сервисов ***************** --> <services name="Services"> <item id="500" name="InfoServer"/> <item id="501" name="DBServer"/> <item id="502" name="PrintServer"/> <item id="503" name="TimeService"/> </services> <!-- ******************* Идентификаторы объектов ***************** --> <objects name="UniObjects"> <item id="200" name="TestProc1"/> <item id="201" name="TestProc2"/> </objects> </ObjectsMap> ... </Configurations>
Датчик - это одно из базовых понятий при построении систем на основе libuniset. Датчик - это информационная единица. Практически любая информация (о событиях, о состоянии того или иного процесса, объекта, сообщение оператору и т.п.) передаётся через состояние "датчика". В библиотеке предусмотрено четыре типа датчиков.
Исходно данные типы используются непосредственно процессами ввода/вывода. "Выходы"(DO,AO) - это, команды "от системы управления" "Входы"(DI,AI) - это информация от объекта "в систему управления". Помимо этого, датчики не обязательно должны быть "живыми" входами или выходами. При помощи этих четырёх типов, можно кодировать любую информацию, Например можно передавать сообщения оператору, заранее создавая для каждого сообщения свой "датчик" и в случае необходимости послать сообщение выставлять его в "1". Удобство и универсальность датчиков (цифр) позволяет использовать для передачи данных большое число различных протоколов, расчитанных на передачу цифровой информации (не текстовой). Например CAN, ModbusRTU, ModbusTCP и т.п.
Под процессом в документации чаще всего подразумевается системный процесс (запущенная программа) выполняющий те или иные функции управления и обменивающийся для этого с другими процессами сообщениями или удалённо вызывающий функции других объектов. Чаще всего понятия процесс и объект совпадают. В некоторых случаях процесс может содержать несколько взаимодействующих объектов. Все процессы в системе - многопоточные. Так как для взаимодействия с другими объектами (процессами) в обязательном порядке создаются потоки для CORBA, а также у каждого объекта создаётся свой поток обработки сообщений (если его специально не отключить).
Если в документации речь идёт о "процессе", как последовательности действий во времени, это должно быть очевидно из контекста.