Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
U
uniset2
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
1
Issues
1
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
UniSet project repositories
uniset2
Commits
90f84c13
Commit
90f84c13
authored
Dec 12, 2018
by
Vitaly Lipatov
Committed by
Pavel Vainerman
Dec 12, 2018
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix spell errors (via aspell based script)
parent
9f61b75d
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
80 changed files
with
209 additions
and
209 deletions
+209
-209
IOController_i.idl
IDL/Processes/IOController_i.idl
+6
-6
UniSetObject_i.idl
IDL/UniSetTypes/UniSetObject_i.idl
+1
-1
UniSetTypes_i.idl
IDL/UniSetTypes/UniSetTypes_i.idl
+1
-1
TODO
TODO
+1
-1
ctl-cpp-common.xsl
Utilities/codegen/ctl-cpp-common.xsl
+1
-1
Concept.dox
docs/DocPages/Concept.dox
+7
-7
Configuration.dox
docs/DocPages/Configuration.dox
+3
-3
ControlProcess.dox
docs/DocPages/ControlProcess.dox
+4
-4
IOConfigure.dox
docs/DocPages/IOConfigure.dox
+6
-6
NotifyController.dox
docs/DocPages/NotifyController.dox
+6
-6
ObjectRepository.dox
docs/DocPages/ObjectRepository.dox
+2
-2
ObjectsMap.dox
docs/DocPages/ObjectsMap.dox
+6
-6
UniversalInterface.dox
docs/DocPages/UniversalInterface.dox
+2
-2
commonpage.dox
docs/DocPages/commonpage.dox
+10
-10
depends.dox
docs/DocPages/depends.dox
+1
-1
libuniset.dox
docs/DocPages/libuniset.dox
+8
-8
todo.dox
docs/DocPages/todo.dox
+3
-3
uniset-codegen.dox
docs/DocPages/uniset-codegen.dox
+0
-0
uniset-configure-example.xml
docs/examples/uniset-configure-example.xml
+1
-1
BackendOpenTSDB.h
extensions/Backend-OpenTSDB/BackendOpenTSDB.h
+2
-2
DBServer_MySQL.h
extensions/DBServer-MySQL/DBServer_MySQL.h
+9
-9
MySQLInterface.h
extensions/DBServer-MySQL/MySQLInterface.h
+1
-1
DBServer_PostgreSQL.h
extensions/DBServer-PostgreSQL/DBServer_PostgreSQL.h
+4
-4
DBServer_SQLite.h
extensions/DBServer-SQLite/DBServer_SQLite.h
+9
-9
IOControl.cc
extensions/IOControl/IOControl.cc
+2
-2
IOControl.h
extensions/IOControl/IOControl.h
+9
-9
FakeIOControl.h
extensions/IOControl/tests/FakeIOControl.h
+1
-1
LogDB.h
extensions/LogDB/LogDB.h
+2
-2
LProcessor.h
extensions/LogicProcessor/LProcessor.h
+1
-1
PassiveLProcessor.cc
extensions/LogicProcessor/PassiveLProcessor.cc
+1
-1
Schema.h
extensions/LogicProcessor/Schema.h
+2
-2
MQTTPublisher.h
extensions/MQTTPublisher/MQTTPublisher.h
+1
-1
MBExchange.cc
extensions/ModbusMaster/MBExchange.cc
+3
-3
MBExchange.h
extensions/ModbusMaster/MBExchange.h
+4
-4
MBTCPMaster.h
extensions/ModbusMaster/MBTCPMaster.h
+2
-2
MBTCPMultiMaster.h
extensions/ModbusMaster/MBTCPMultiMaster.h
+5
-5
MBSlave.cc
extensions/ModbusSlave/MBSlave.cc
+1
-1
MBSlave.h
extensions/ModbusSlave/MBSlave.h
+3
-3
SharedMemory.cc
extensions/SharedMemory/SharedMemory.cc
+1
-1
SharedMemory.h
extensions/SharedMemory/SharedMemory.h
+14
-14
UDPPacket.h
extensions/UNetUDP/UDPPacket.h
+2
-2
UNetExchange.h
extensions/UNetUDP/UNetExchange.h
+2
-2
UNetReceiver.h
extensions/UNetUDP/UNetReceiver.h
+8
-8
UNetSender.h
extensions/UNetUDP/UNetSender.h
+1
-1
UniExchange.cc
extensions/UniNetwork/UniExchange.cc
+1
-1
Calibration.h
extensions/include/Calibration.h
+4
-4
DigitalFilter.h
extensions/include/DigitalFilter.h
+2
-2
IOBase.h
extensions/include/IOBase.h
+1
-1
MTR.h
extensions/include/MTR.h
+1
-1
PID.h
extensions/include/PID.h
+1
-1
UObject_SK.h
extensions/include/UObject_SK.h
+1
-1
test_ui.cc
extensions/tests/test_ui.cc
+1
-1
Configuration.h
include/Configuration.h
+1
-1
DBServer.h
include/DBServer.h
+1
-1
DebugStream.h
include/DebugStream.h
+1
-1
EventLoopServer.h
include/EventLoopServer.h
+1
-1
HourGlass.h
include/HourGlass.h
+2
-2
IOConfig_XML.h
include/IOConfig_XML.h
+3
-3
IOController.h
include/IOController.h
+3
-3
IONotifyController.h
include/IONotifyController.h
+3
-3
LogAgregator.h
include/LogAgregator.h
+1
-1
LogServer.h
include/LogServer.h
+1
-1
MessageType.h
include/MessageType.h
+1
-1
ObjectRepository.h
include/ObjectRepository.h
+1
-1
PassiveTimer.h
include/PassiveTimer.h
+1
-1
Pulse.h
include/Pulse.h
+1
-1
UHelpers.h
include/UHelpers.h
+1
-1
UniSetActivator.h
include/UniSetActivator.h
+1
-1
UniSetManager.h
include/UniSetManager.h
+1
-1
UniSetObject.h
include/UniSetObject.h
+1
-1
ModbusRTUErrors.h
include/modbus/ModbusRTUErrors.h
+1
-1
ModbusRTUSlave.h
include/modbus/ModbusRTUSlave.h
+1
-1
ModbusTCPServer.h
include/modbus/ModbusTCPServer.h
+4
-4
ModbusTCPSession.h
include/modbus/ModbusTCPSession.h
+1
-1
ModbusTypes.h
include/modbus/ModbusTypes.h
+1
-1
ModbusTypes.cc
src/Communications/Modbus/ModbusTypes.cc
+1
-1
UniXML.cc
src/Various/UniXML.cc
+1
-1
test_delaytimer.cc
tests/test_delaytimer.cc
+1
-1
UModbus.h
wrappers/core/UModbus.h
+1
-1
UProxyObject.h
wrappers/core/UProxyObject.h
+1
-1
No files found.
IDL/Processes/IOController_i.idl
View file @
90f84c13
...
...
@@ -88,7 +88,7 @@ interface IOController_i : UniSetManager_i
void
calibrate
(
in
uniset
::
ObjectId
sid
,
in
CalibrateInfo
ci
,
in
uniset
::
ObjectId
adminId
)
raises
(
NameNotFound
)
;
CalibrateInfo
getCalibrateInfo
(
in
uniset
::
ObjectId
sid
)
raises
(
NameNotFound
)
;
//
---
Интерфес
получения
информации
о
всех
датчиках
---
//
---
Интерфе
й
с
получения
информации
о
всех
датчиках
---
/*
!
Информация
датчике
*/
struct
SensorIOInfo
{
...
...
@@ -139,7 +139,7 @@ interface IOController_i : UniSetManager_i
{
long
value
;
//
могут
быть
проблем
м
ы
в
64b
it
-
ных
//
могут
быть
проблемы
в
64b
it
-
ных
unsigned
long
tv_sec
; /*!< время последнего изменения датчика, секунды (clock_gettime(CLOCK_REALTIME) */
unsigned
long
tv_nsec
; /*!< время последнего изменения датчика, nanosec (clock_gettime(CLOCK_REALTIME) */
uniset
::
ObjectId
supplier
; /*!< идентификатор того, кто менял датчик (последний раз) */
...
...
@@ -178,7 +178,7 @@ interface IONotifyController_i : IOController_i
{
}
;
/*
!
Универсальная
функция
заказа
уведомления
об
изменнии
датчика.
/*
!
Универсальная
функция
заказа
уведомления
об
измен
е
нии
датчика.
*
\
sa
UniversalIO
::
UniversalIOController
::
askSensor
()
*/
void
askSensor
(
in
uniset
::
ObjectId
sid
,
in
uniset
::
ConsumerInfo
ci
,
in
UniversalIO
::
UIOCommand
cmd
)
raises
(
NameNotFound
,
IOBadParam
)
;
...
...
@@ -205,7 +205,7 @@ interface IONotifyController_i : IOController_i
{
uniset
::
ThresholdId
id
;
long
hilimit
; /*!< верхняя граница срабатывания */
long
lowlimit
; /*!< нижняя грани
й
а срабатывания */
long
lowlimit
; /*!< нижняя грани
ц
а срабатывания */
ThresholdState
state
;
unsigned
long
tv_sec
; /*!< время последнего изменения датчика, секунды (clock_gettime(CLOCK_REALTIME) */
unsigned
long
tv_nsec
; /*!< время последнего изменения датчика, nanosec (clock_gettime(CLOCK_REALTIME) */
...
...
@@ -217,7 +217,7 @@ interface IONotifyController_i : IOController_i
/*
!
Заказ
порогового
датчика
*
\
sa
UniversalIO
::
UniversalIOController
::
askThreshold
()
*
\
param
tid
-
идентификатор
порога
*
\
param
lowLimit
-
нижний
порог
срабатыания
*
\
param
lowLimit
-
нижний
порог
срабаты
в
ания
*
\
param
hiLimit
-
верхний
порог
срабатывания
*
\
param
invert
-
инвертировать
логику
срабатывания
*
Если
invert
=
false
,
порог
срабатывает
при
условии
>=
hilimit
и
отпускается
при
<=
lowlimit
...
...
@@ -243,7 +243,7 @@ interface IONotifyController_i : IOController_i
typedef
sequence
<
ThresholdList
>
ThresholdsListSeq
;
/*
!
получить
список
порогов
для
датчка
"si"
*/
/*
!
получить
список
порогов
для
датч
и
ка
"si"
*/
ThresholdList
getThresholds
(
in
uniset
::
ObjectId
sid
)
raises
(
NameNotFound
)
;
/*
!
получить
список
ВСЕХ
датчиков
по
которым
созданы
пороги
*/
...
...
IDL/UniSetTypes/UniSetObject_i.idl
View file @
90f84c13
...
...
@@ -28,7 +28,7 @@
//{
/*
!
*
\
interface
UniSetObject_i
*
\
brief
Базовый
интерфес
для
всех
объектов
*
\
brief
Базовый
интерфе
й
с
для
всех
объектов
*
\
author
Pavel
Vainerman
*
*
Первичный
базовый
класс.
Прародитель
всех
объектов
в
системе.
...
...
IDL/UniSetTypes/UniSetTypes_i.idl
View file @
90f84c13
...
...
@@ -74,7 +74,7 @@
struct
ConsumerInfo
{
ObjectId
id
; /*!< идентификатор заказчика */
ObjectId
node
; /*!< узел на котором он находится */
ObjectId
node
; /*!< узел
,
на котором он находится */
}
;
...
...
TODO
View file @
90f84c13
- сделать, чтобы можно было Debug пускать через syslog (да ещё и на другую машину)
- (IONotifyController): Разработать механизм заказа пер
е
одических уведомлений (msec), независимо от того, менялись ли датчики..
- (IONotifyController): Разработать механизм заказа пер
и
одических уведомлений (msec), независимо от того, менялись ли датчики..
- (IONotifyController): Разработать механизм заказа группы датчиков сразу (и ответ тоже группой)
- циклическое хранилище для аварийных следов на основе SQLite
...
...
Utilities/codegen/ctl-cpp-common.xsl
View file @
90f84c13
...
...
@@ -340,7 +340,7 @@
int askPause; /*!
<
пауза между неудачными попытками заказать датчики */
IOController_i::SensorInfo si;
bool forceOut; /*!
<
флаг принудительного обн
о
ления "выходов" */
bool forceOut; /*!
<
флаг принудительного обн
у
ления "выходов" */
std::shared_ptr
<
uniset::LogAgregator
>
loga;
std::shared_ptr
<
DebugStream
>
mylog;
...
...
docs/DocPages/Concept.dox
View file @
90f84c13
/*! \page page_Concept Основные понятия
В библиотеке \b uniset имеется ряд основопол
о
гающих кубиков (терминов),
В библиотеке \b uniset имеется ряд основопол
а
гающих кубиков (терминов),
из которых складывается библиотека, и которые используются во многих
местах данной документации. Здесь приводятся определения этих терминов.
...
...
@@ -29,7 +29,7 @@
но обладают уникальным идентификатором.
\section sec_Concept_Message Сообщения
Вся система взаимодей
тс
вия между объектами в основном
Вся система взаимодей
ст
вия между объектами в основном
построена на использовании сообщений (передаваемых
путём удаленного вызова специальных функций,
посредством CORBA). При этом основные
...
...
@@ -39,7 +39,7 @@
Для разработчиков систем на основе libuniset, заложена
возможность определять свои типы сообщений, при этом их
идентификаторы \b должны начинатся от значения
идентификаторы \b должны начинат
ь
ся от значения
UniSetTypes::Message::TheLastFieldOfTypeOfMessage.
\code
enum MyMessageTypes
...
...
@@ -108,10 +108,10 @@ UniSetTypes::Message::TheLastFieldOfTypeOfMessage.
будет присвоен идентификатор (просто по порядку). См. \ref UniSetTypes::ObjectIndex_XML
\note Следует иметь ввиду, что автоматическое присвоение идентификаторов,
\b зависит \b от \b положения описания объекта в конфигурацинном файле.
\b зависит \b от \b положения описания объекта в конфигураци
о
нном файле.
Поэтому если вставить новый объект в любой секции, то все идентификаторы после него,
станут недействительными (сместятся на единицу). Т.е. необходимо отслеживать,
что конфигурационные файлы на всех узлах со
б
впадают между собой.
что конфигурационные файлы на всех узлах совпадают между собой.
\note Из-за не надёжности это способ не рекомендуется к использованию.
...
...
@@ -161,7 +161,7 @@ UniSetTypes::Message::TheLastFieldOfTypeOfMessage.
</Configurations>
\endcode
\note При этом за уникальностью(отсутсвием дублей) идентификаторов должен
\note При этом за уникальностью(отсутс
т
вием дублей) идентификаторов должен
следить сам разработчик (хотя эта проверка может быть автоматизирована
не сложными скриптами).
...
...
@@ -187,7 +187,7 @@ UniSetTypes::Message::TheLastFieldOfTypeOfMessage.
сообщения свой "датчик" и в случае необходимости послать сообщение
выставлять его в "1".
Удобство и универсальность датчиков (цифр) позволяет использовать для
передачи данных большое число различных протоколов, расчитанных
передачи данных большое число различных протоколов, рас
с
читанных
на передачу цифровой информации (не текстовой).
Например CAN, ModbusRTU, ModbusTCP и т.п.
...
...
docs/DocPages/Configuration.dox
View file @
90f84c13
...
...
@@ -5,8 +5,8 @@
\section ConfigurationPage_secCommon Общее описание
Для конфигурирования сис
и
темы используется файл (обычно "configure.xml").
Конфигурация является глобальным объектом. Для получения доступа к ней используется фун
у
ция auto conf = uniset_conf();
Для конфигурирования системы используется файл (обычно "configure.xml").
Конфигурация является глобальным объектом. Для получения доступа к ней используется фун
к
ция auto conf = uniset_conf();
До начала работы, обычно в функции main(), конфигурация должна быть инициализирована при помощи функции uniset_init().
При этом третий параметр, указывающий название конфигурационного файла, является не обязательным.
По умолчанию обрабатывается аргумент командной строки --confile filename.
...
...
@@ -42,7 +42,7 @@ int main(int argc, char **argv)
Для возможности задать напрямую параметры для omniORB заложена специальная секция <omniORB>.
В данную секцию можно записывать любые параметры поддерживаемые библиотекой omniORB.
Формат и наз
а
вание параметров см. документацию по omniORB.
Формат и название параметров см. документацию по omniORB.
Пример:
\code
...
...
docs/DocPages/ControlProcess.dox
View file @
90f84c13
...
...
@@ -38,11 +38,11 @@ interface TestActiveProcess_i: UniSetObject_i
На основе этих файлов вы реализуете свой интерфейс на С++.
\section pgCP_secImplementation Реализация интерфейса на C++
Необходимо создать класс реализующий объявлен
н
ый интерфейс. Формирование названия класса и правила наследования
Необходимо создать класс реализующий объявленый интерфейс. Формирование названия класса и правила наследования
см. \ref UniSetLibStylePage.
\par
Базовые функции интерфейса UniSetObject_i уже реализованы в классе UniSetObject. Поэтому остается только
наследоваться от него и реализ
а
вать недостающие функции. В итоге получаем
наследоваться от него и реализ
о
вать недостающие функции. В итоге получаем
\code
#ifndef TestActiveProcess_H_
#define TestActiveProcess_H_
...
...
@@ -62,7 +62,7 @@ interface TestActiveProcess_i: UniSetObject_i
virtual ~TestActiveProcess();
// ------- функции объ
евлен
ные в IDL(интерфейс данного объекта) ---------
// ------- функции объ
явле
ные в IDL(интерфейс данного объекта) ---------
virtual void on();
virtual void off();
...
...
@@ -236,7 +236,7 @@ interface TestActiveProcess_i: UniSetObject_i
\section pgCP_secLT_Object Создание автономного объекта, не зависящего от TimerService-а
Для повышения автономности работы, можно создать процесс, который сам будет реализовывать таймеры.
Для этого достаточно при создании своего процесса наследоватся не от UniSetObject, а от UniSetObject_LT.
Для этого достаточно при создании своего процесса наследоват
ь
ся не от UniSetObject, а от UniSetObject_LT.
Т.е. код будет выглядеть так:
\code
...
...
...
docs/DocPages/IOConfigure.dox
View file @
90f84c13
...
...
@@ -24,7 +24,7 @@
- \b AO - аналоговый выход
\section pgIOC_secAskFile Конфигурацонные ask-файлы
\section pgIOC_secAskFile Конфигурац
и
онные ask-файлы
Формат файла имеет следующий вид:
\code
<IOConf readonly="1" dumptime="Wed Mar 23 14:14:42 2005">
...
...
@@ -98,7 +98,7 @@
- \a node - название узла. Если не задано, то считается Localhost.
- \a iotype - Тип входа/выхода.( см. \ref pgIOC_secIOTypes )
Следующие поля необ
затя
ельны:
Следующие поля необ
язат
ельны:
- \a default - [1|0] значение по умолчанию. Т.е. значение на момент начального запуска.
По умолчанию имеет значение "0".
- \a priority - Приоритет посылаемого уведомления (UniSetTypes::SensorMessage) об изменении
...
...
@@ -125,7 +125,7 @@
- \a rmin - Минимальное "cырое" значение. ("сырое" - т.е. непосредственно получаемое)
- \a rmax - Максимальное "сырое" значение
Следующие поля необ
затя
ельны:
Следующие поля необ
язат
ельны:
- \a default - значение по умолчанию. Т.е. значение на момент начального запуска.
По умолчанию имеет значение "0".
- \a priority - Приоритет посылаемого уведомления (UniSetTypes::SensorMessage) об изменении
...
...
@@ -161,14 +161,14 @@
TRUE - при значении больше верхнего порога
FALSE - при значении меньше нижнего порога
- \a id - идентификатор порога(число). Значение которое используется для передачи
в сообщении SensorMessage как идентифи
ф
катор сработавшего порога. Должен
в сообщении SensorMessage как идентификатор сработавшего порога. Должен
быть разный (уникальным) для разных порогов у одного аналогового датчика.
В случае использования "sid" id указывать необязательно.
- \a inverse - [1|0] позволяет инвертировать логику для датчика, указанного в поле sid.
В общем случае "пороги" не имеют отдельных уникальных идентификаторов. И каждый процесс
может заказать(сделать) себе любое количество "порогов" из одного аналогового датчика.
Но существует возможность связать дискр
те
ный датчик (в данном случае это будет фиктивный дискретный датчик)
Но существует возможность связать дискр
ет
ный датчик (в данном случае это будет фиктивный дискретный датчик)
с пороговым значением. Для этого прописывается следующая запись:
\code
<sensor name="MyProject/Sensors/AnalogSensor1_AS" node="" iotype="AI">
...
...
@@ -185,7 +185,7 @@
UniSetTypes::SensorMessage об изменении данного датчика. Заказывать уведомления
можно об изменении не только "входов", но и "выходов".
\section pgIOC_secSensorMessage Формат уведомления об изменнии состояния (значения)
\section pgIOC_secSensorMessage Формат уведомления об измен
е
нии состояния (значения)
Для уведомления используется сообщение UniSetTypes::SensorMessage.
- \a state - текущее значение для дискретного датчика
- \a value - текущее значения для аналогового датчика
...
...
docs/DocPages/NotifyController.dox
View file @
90f84c13
...
...
@@ -7,7 +7,7 @@
- \ref pgIONC_secLT_Object
- \ref pgIONC_secRecomendation
Все i/o процессы должны наследоватся от класса IOController. Если вам необходимо написать i/o процесс, который
Все i/o процессы должны наследоват
ь
ся от класса IOController. Если вам необходимо написать i/o процесс, который
помимо операций i/o еще и уведомляет об изменении состояния входов(выходов), то наследуйтесь от класса IONotifyController.
Эти классы объявляют минимальный(базовый) интерфейс для IOController-ов, который вы можете расширять.
...
...
@@ -17,7 +17,7 @@
\section pgIONC_secDeclareIDL Объявление интерфейса на IDL
\note Написание интерфейса на IDL требуется, только если вам необходимо расширить базовый набор
IDL-функций. Все функции об
яъвленные здесь станут доступны внешним объекта (локальный
м и удалённым).
IDL-функций. Все функции об
ъявленные здесь станут доступны внешним объекта (локальны
м и удалённым).
При написании интерфейса на IDL действуют те же правила, а именно наследование от соответствующего интерфейса.
Пример объявления:
...
...
@@ -48,7 +48,7 @@
На основе этих файлов вы реализуете свой интерфейс на С++.
\section pgIONC_secImplementation Реализация интерфейса на C++
Необходимо создать класс реализующий объявлен
н
ый интерфейс. Формирование названия класса и правила наследования
Необходимо создать класс реализующий объявленый интерфейс. Формирование названия класса и правила наследования
см. \ref UniSetLibStylePage.
\par
Базовые функции интерфейса IONotifyController_i уже реализованы в классе IONotifyController. Поэтому остается только
...
...
@@ -72,11 +72,11 @@
MyNotifyController( ObjectId id );
~MyNotifyController();
// ------- функции объ
евлен
ные в IDL(интерфейс данного объекта) ---------
// ------- функции объ
явле
ные в IDL(интерфейс данного объекта) ---------
virtual MyNotifyController_i::CardIOTypes getCardIOType();
// ------- обязательные для реализации функции -------------------------
// т.к. они объявлен
н
ы в базовых классах как чисто виртуальные
// т.к. они объявлены в базовых классах как чисто виртуальные
virtual void processingMessage( UniSetTypes::VoidMessage *msg);
virtual void setState( ObjectId id, CORBA::Boolean state);
...
...
@@ -180,7 +180,7 @@
\section pgIONC_secLT_Object Создание автономного процесса, не зависящего от TimerService-а
Для повышения автономности работы, можно создать процесс, который сам будет реализовывать таймеры.
Для этого достаточно при создании своего процесса наследоватся не от IONotifyController, а от IONotifyController_LT.
Для этого достаточно при создании своего процесса наследоват
ь
ся не от IONotifyController, а от IONotifyController_LT.
Т.е. код будет выглядеть так:
\code
...
...
...
docs/DocPages/ObjectRepository.dox
View file @
90f84c13
...
...
@@ -11,7 +11,7 @@
\section subRegCommon Вводная
При наследовании от UniSetObject (и его потомков) регистрация в репозитории происходит автоматически.
Поэтому регистрироватся отдельно нет необходимости.
Поэтому регистрироват
ь
ся отдельно нет необходимости.
\section subReg Регистрация
...
...
@@ -41,7 +41,7 @@
}
cacth(ORepFailed)
{
cerr << "Не удалось зарег
ест
ировать объект " << endl;
cerr << "Не удалось зарег
истр
ировать объект " << endl;
}
\endcode
...
...
docs/DocPages/ObjectsMap.dox
View file @
90f84c13
...
...
@@ -12,10 +12,10 @@
\section OMAP_secCommon Общее описание карты объектов
Карта объектов задает и
н
дентификаторы объектов, узлов сети и координаты их размещения в репозитории.
Карта объектов задает идентификаторы объектов, узлов сети и координаты их размещения в репозитории.
Идентификатор объекта должен быть уникальным в пределах одного узла.
Идентификаторы являются неотрицательными числами, что \a минимизирует и \a упрощает передачу по
сетям раз
д
ичного типа (ethernet, CAN, profibus и т.п.). Хотя в использовании конечно удобнее
сетям раз
л
ичного типа (ethernet, CAN, profibus и т.п.). Хотя в использовании конечно удобнее
применять текстовые строки.
В данной реализации возможно использовать два способа задания карты объектов
...
...
@@ -25,7 +25,7 @@
\section OMAP_secStatic Статическая карта объектов
\subsection OMAP_subStatic_Create Создание карты
Статическую кар
ут
проще всего создать на основе препроцессора.
Статическую кар
ту
проще всего создать на основе препроцессора.
\par ObjectsMap.h
Заголовочный файл формируется при помощи препроцессора на основе файла ObjectsMapSource.h.
...
...
@@ -98,7 +98,7 @@ const UniSetTypes::ObjectInfo ObjectsMap[MAX_NUMOBJECTS] =
\par ObjectsMapSource.h
Это собственно карта объектов, в которой прописыва
е
ются все объекты имеющие уникальные идентификаторы.
Это собственно карта объектов, в которой прописываются все объекты имеющие уникальные идентификаторы.
\code
// Sensors
...
...
@@ -154,7 +154,7 @@ const UniSetTypes::ObjectInfo ObjectsMap[MAX_NUMOBJECTS] =
\subsection OMAP_subStatic_Node Настройка узлов сети
Для того чтобы задать узлы сети помимо идентификатора необходимо внести информацию о них в настройки CORB-ы("omniORB.cfg").
Если узел доступен по нескольким сетям, то узлы должны называтся (NodeName1...NodeNameX). NodeName - должно совпадать с именем realname в ObjectMap.
Если узел доступен по нескольким сетям, то узлы должны называт
ь
ся (NodeName1...NodeNameX). NodeName - должно совпадать с именем realname в ObjectMap.
В ObjectsMap вносится только имя NodeName1(основной сети), остальные вносятся \b только в конф. файл.
При этом в UniversalInterface::resolve() автоматически будет пытаться связаться с другими узлами используя
резервные каналы NodeName2...NodeNameX.
...
...
@@ -190,7 +190,7 @@ const UniSetTypes::ObjectInfo ObjectsMap[MAX_NUMOBJECTS] =
и \a ObjectsMap.cc (содержащий массив. Этот файл необходимо компилировать).
\par
При использовании статического способа в функции \a main при создании Configure используйте
сл
у
дующий способ:
сл
е
дующий способ:
\code
\#include <Configure.h>
\#include <ObjectsActivator.h>
...
...
docs/DocPages/UniversalInterface.dox
View file @
90f84c13
/* OBSOLETE DOC!!!
\page UniversalInterfacePage Универсальный интерфейс
Этот интерфейс позволяет получать доступ к объекту по и
н
дентификатору(или имени), заказывать датчики, и т.п.
Для работы с удаленными объктами необходимо указывать идентификатор узла, на котором
Этот интерфейс позволяет получать доступ к объекту по идентификатору(или имени), заказывать датчики, и т.п.
Для работы с удаленными объ
е
ктами необходимо указывать идентификатор узла, на котором
находится этот объект(если он не задан, идет обращение к локальному).
- \ref secIOControl
...
...
docs/DocPages/commonpage.dox
View file @
90f84c13
...
...
@@ -20,26 +20,26 @@
\section secSection1 Назначение
Библиотека предназначена для разработки распределенных систем управления. В ней собраны основные компоненты из которых
строятся подобные системы (базовые интерфейсы для разработки процессов управления, процессов управления вводом/выводом,
менеджеров сообщений и т.п.). Любую систему управления можно поделить на относительно независимые объекты ре
щ
ающие
менеджеров сообщений и т.п.). Любую систему управления можно поделить на относительно независимые объекты ре
ш
ающие
следующие задачи:
- ввод/вывод (опрос физических датчиков, обмен с другими устройствами)
- алгоритмы управления тем или иным устройст
о
в или группой устройств
- алгоритмы управления тем или иным устройств или группой устройств
- отображение информации (графический интерфейс пользователя)
- накопление и хранение информации
- просмотр накопленной информации
\par
Для каждой из задач в библиотеке разработан определенный компонент(группа компонентов).
И разработаны универсальные механизмы взаимдействия объектов между собой.
И разработаны универсальные механизмы взаим
о
действия объектов между собой.
\section secSection2 Общие принципы работы
Библиотека позволяет объектам системы обмениватся сообщениями, а так же непосредственно вызывать функции друг-друга. В системе объектами
Библиотека позволяет объектам системы обмениват
ь
ся сообщениями, а так же непосредственно вызывать функции друг-друга. В системе объектами
управляют менеджеры. Которые позволяют управлять (через этот) менеджер сразу набором подчиненных ему объектов. Менеджер может
содержать в себе в качестве подчиненного объекта другой менеджер, что позволяет строить довольно гибкую иерархическую структуру
управления. Всё взаимодей
тс
вие объектов( сетевое и межпроцессовое) строится на базе CORBA-ы.
управления. Всё взаимодей
ст
вие объектов( сетевое и межпроцессовое) строится на базе CORBA-ы.
\subsection subTransfer Взаимодействие объектов системы
Взаимодействие объектов между собой происходит через ObjectRepository. Каждый объект становится доступным другим объектам только
после регистрации в репозитории. Для получения доступа к другому объекту (даже удаленному) необхоимо знать его идентификатор(UniSetTypes::ObjectId)
после регистрации в репозитории. Для получения доступа к другому объекту (даже удаленному) необхо
д
имо знать его идентификатор(UniSetTypes::ObjectId)
и при помощи репозитория получить на него ссылку, с которой можно работать как с указателем на объект.
...
Каждый узел по возможности должен работать с максимальной автономностью. Т.е. все основные сервисы (TimerService, InfoServer, DBServer)
...
...
@@ -60,25 +60,25 @@
Это унифицированный интерфейс для сохранения и получения информации о состоянии дискретных и
аналоговых датчиков.
\par IONotifyController
Раширение IOController-а. Предоставляющее интерфейс для заказа уведомлений об изменении состояния датчиков.
Ра
с
ширение IOController-а. Предоставляющее интерфейс для заказа уведомлений об изменении состояния датчиков.
\subsection UniSetGraphics Графический интерфейс пользователя
...
\subsection UniDiag Просмотр накопленной информации
Для большей универсальности слежение за работой системы, диагностирование и просмотр накопленной информации
сделаны в виде web-интерфейса написанного на PHP. \a в \a процессе \a разработ
а
ки...
сделаны в виде web-интерфейса написанного на PHP. \a в \a процессе \a разработки...
\section secDetail Подробности
\subsection subObjects Объекты, Менеджеры, Активаторы
\par Объекты (UniSetObject)
Объекты являются пасивными единицами, так как не могут функционировать без менеджера или активатора. Для того, чтобы объект
Объекты являются пас
с
ивными единицами, так как не могут функционировать без менеджера или активатора. Для того, чтобы объект
мог принимать сообщения и предоставлять свои функции другим объектам он должен быть зарегистрирован в менеджере объектов
(ObjectsManager) или напрямую в активаторе (ObjectsActivator) при помощи функции ObjectsManager::addObject(...).
\par Менеджеры (ObjectsManager)
Менеджеры используются для управления сразу группой объектов, а также сами являются объектами и могут быть
зареги
тстрированы в другом менеджере (или активаторе). Они тоже являются па
сивными единицами, так как не могут функционировать без
зареги
стрированы в другом менеджере (или активаторе). Они тоже являются пас
сивными единицами, так как не могут функционировать без
активатора.
\par Активаторы (ObjectsActivator)
Активатор предназначен для активизации объектов и менеджеров. Он обладает свойствами менеджера (позволяет регистрировать в себе
...
...
docs/DocPages/depends.dox
View file @
90f84c13
...
...
@@ -46,6 +46,6 @@
\code
<item textname="...." iotype="..." ... depend="OtherSensor_AS" depend_value="2" />
\endcode
В данном случае подразумевается, что разре
щ
ающим датчиком является OtherSensor_AS=2.
В данном случае подразумевается, что разре
ш
ающим датчиком является OtherSensor_AS=2.
*/
docs/DocPages/libuniset.dox
View file @
90f84c13
...
...
@@ -13,7 +13,7 @@
В основу положена технология CORBA (omniORB - реализация AT&T).
Но основе вызовов CORBA построено всё взаимодействие. При этом API библиотеки,
"ма
кс
ирует" взаимодействие через CORBA и при необходимости
"ма
ск
ирует" взаимодействие через CORBA и при необходимости
взаимодействие может быть переписано на основе других механизмов.
В библиотеке реализованы наиболее распространённые интерфейсы обмена,
...
...
@@ -21,7 +21,7 @@
реализующий обмен по протоколу UDP.
Для взаимодействия с базами данных, реализован базовый DBInterface,
на основе которго можно писать интерфейсы для подключения uniset
на основе котор
о
го можно писать интерфейсы для подключения uniset
к различным СУБД. В самой libuniset реализовано взаимодействие с MySQL.
Помимо собственно единого интерфейса, в библиотеке реализованы \b "готовые компоненты"
...
...
@@ -29,12 +29,12 @@
- \b SharedMemory - хранение "переменных"
- \b IOControl - работа с картами ввода/вывода
- \b Modbus TCP/RTU slave и master режимы
- \b UNetExchange - взаимоде
ц
ствие по протоколу UDP
- \b UNetExchange - взаимоде
й
ствие по протоколу UDP
- \b LogicProcessor - компонент, позволяющий описывать алгоритмы на основе, логических схем
(записываемых в xml-файле).
\b Готовые \b компоненты - представляют из себя уже законченные программы (процессы),
которые "умеют" взаимодейсвовать с SharedMemory и позволяют легко
которые "умеют" взаимодейс
т
вовать с SharedMemory и позволяют легко
"развёртывать" распределённые системы.
Всё взаимодействие в libuniset построено на понятии "датчик". Это некоторая
...
...
@@ -58,10 +58,10 @@
Все процессы условно можно разделить на два типа \b "активные" и \b "пассивные".
\b Пассивные процессы - это процессы которые большую часть времени "спят" ожидая,
событий изменения датчиков. В основном к таким процессам относят
ь
ся процессы управления.
событий изменения датчиков. В основном к таким процессам относятся процессы управления.
\b Активные процессы - это процессы которые постоянно выполняют какую-то работу.
К таким процессам относят
ь
ся:
К таким процессам относятся:
- процессы обмена по сети (в данном случае CAN)
- процессы работы с картами ввода/вывода (IOControl)
- процессы обмена с какими-то внешними устройствами (RS485 или ModbusTCP)
...
...
@@ -87,10 +87,10 @@
Для обеспечения \b "прозрачности сети" всё взаимодействие построено на
использовании \b SharedMemory \b(SM), хранящей состояние датчиков во \b ВСЕЙ системе.
При этом на каждом узле запускатся своя копия \b SM. "прозрачность" при этом
При этом на каждом узле запускат
ь
ся своя копия \b SM. "прозрачность" при этом
обеспечивают процессы обмена между узлами по соответствующему протоколу
(на рисунке это CAN и UNET). Узлы \b постоянно обмениваются между собой
датчиками обеспечивая \b "одинаковост
т
ь" хранимой в SM информации.
датчиками обеспечивая \b "одинаковость" хранимой в SM информации.
Каждый процесс обмена получает от других узлов информацию о находящихся у них датчиков,
и в свою очередь посылает другим узлам информацию о датчиках находящихся у него на узле.
...
...
docs/DocPages/todo.dox
View file @
90f84c13
...
...
@@ -4,16 +4,16 @@
-# утилиты мониторинга работы системы
-# настройку "политик" для ORB сделать из конф. файла
-# по максимуму переход на xml
-# дополнить описание IOController-ов разделом про XML-файл заказчков(создание,работа)
-# дополнить описание IOController-ов разделом про XML-файл заказч
и
ков(создание,работа)
-# сделать описание принципов и деталей межобъектного взаимодействия
(об ограничениях на размер сообщений, очередь сообщений, приоритеты и т.п.)
-# попытатся сделать работу с сервисами более универсальной
-# попытат
ь
ся сделать работу с сервисами более универсальной
(что то типа "UniSetTypes::ObjectId conf->getService(const string name)" )
-# откорректировать и дописать "общее описание" библиотеки
-# сделать тип в UniSetObject::getType string-ом
(для универсальности и простоты будущих расширений)
-# переписать тестовые примеры, под текущую ситуацию.
-# в будущем попытат
ся отказат
ся от ObjectId и перейти на строки (это надо ещё обдумать)
-# в будущем попытат
ься отказать
ся от ObjectId и перейти на строки (это надо ещё обдумать)
-# в InfoServer-е по routeList-у сообщения пересылаются, только если они локальные.
Надо переделать механизм, чтобы можно было отделять тех кому пересылать все сообщения,
от тех кому пересылать только локальные....
...
...
docs/DocPages/uniset-codegen.dox
View file @
90f84c13
This diff is collapsed.
Click to expand it.
docs/examples/uniset-configure-example.xml
View file @
90f84c13
<?xml version = '1.0' encoding = 'koi8-r' ?>
<UNISETPLC>
<UserData></UserData>
<!-- Общие(стартовые) параметры по UniSet -->
<!-- Общие
(стартовые) параметры по UniSet -->
<Configure>
<NameService
host=
"localhost"
port=
"2817"
/>
<LocalNode
name=
"LocalhostNode"
/>
...
...
extensions/Backend-OpenTSDB/BackendOpenTSDB.h
View file @
90f84c13
...
...
@@ -42,7 +42,7 @@ namespace uniset
"OpenTSDB" - time series database. Специальная БД оптимизированная
для хранения временных рядов (по простому: данных с временными метками).
Класс реализует пересылку указанных (настроенных) дачиков в БД поддерживающую
Класс реализует пересылку указанных (настроенных) да
т
чиков в БД поддерживающую
интерфейс совместимый с OpenTSDB. В текущей реализации используется посылка
строк в формате Telnet
\code
...
...
@@ -85,7 +85,7 @@ namespace uniset
\section sec_OpenTSDB_Queue Буфер на запись в БД
В данной реализации встроен специальный буфер, который накапливает данные и скидывает их
пачкой в БД. Так же он является защитным механизом на случай если БД временно недоступна.
пачкой в БД. Так же он является защитным механиз
м
ом на случай если БД временно недоступна.
Параметры буфера задаются аргументами командной строки или в конфигурационном файле.
Доступны следующие параметры:
- \b bufSize - размер буфера, при заполнении которого происходит посылка данных в БД
...
...
extensions/DBServer-MySQL/DBServer_MySQL.h
View file @
90f84c13
...
...
@@ -41,19 +41,19 @@ namespace uniset
\section sec_DBS_Comm Общее описание работы DBServer_MySQL
Сервис предназначен для работы с БД MySQL. В его задачи входит
сохранение всех событий происход
и
щих в системе в БД. К этим
сохранение всех событий происход
я
щих в системе в БД. К этим
событиям относятся изменение состояния датчиков, различные логи
работы процессов и т.п.
К моменту запуска, подразумевается, что неободимые таблицы уже
К моменту запуска, подразумевается, что необ
х
одимые таблицы уже
созданы, все необходимые настройки mysql сделаны.
\par
При работе с БД, сервис в основном пишет в БД. Обработка накопленных данных
ведётся уже другими программами (web-интерфейс).
\par
Для повышения надежности DBServer пер
е
одически ( DBServer_MySQL::PingTimer ) проверяет наличие связи с сервером БД.
Для повышения надежности DBServer пер
и
одически ( DBServer_MySQL::PingTimer ) проверяет наличие связи с сервером БД.
В случае если связь пропала (или не была установлена при старте) DBServer пытается вновь каждые DBServer::ReconnectTimer
произвести соединение. При этом все запросы которые поступают для запи
и в БД, но не м
гут быть записаны складываются
произвести соединение. При этом все запросы которые поступают для запи
си в БД, но не мо
гут быть записаны складываются
в буфер (см. \ref sec_DBS_Buffer).
\warning При каждой попытке восстановить соединение DBServer заново читает конф. файл. Поэтому он может подхватить
новые настройки.
...
...
@@ -73,14 +73,14 @@ namespace uniset
\section sec_DBS_Buffer Защита от потери данных
Для того, чтобы на момент отсутствия связи с БД данные по возможности не потерялись,
сделан "кольцевой" буфер. Размер которго можно регулировать параметром "--dbserver-buffer-size"
сделан "кольцевой" буфер. Размер котор
о
го можно регулировать параметром "--dbserver-buffer-size"
или параметром \b bufferSize=".." в конфигурационном файле секции "<LocalDBSErver...>".
Механизм построен на том, что если связь с mysql сервером отсутствует или пропала,
то сообщения помещаются в
ко
левой буфер, который "опустошается" как только она восстановится.
то сообщения помещаются в
ну
левой буфер, который "опустошается" как только она восстановится.
Если связь не восстановилась, а буфер достиг максимального заданного размера, то удаляются
более ранние сообщения. Эту логику можно сменить, если указать параметр "--dbserver-buffer-last-remove"
или \b bufferLastRemove="1", то терятся будут сообщения добавляемые в конец.
или \b bufferLastRemove="1", то терят
ь
ся будут сообщения добавляемые в конец.
\section sec_DBS_Tables Таблицы MySQL
К основным таблицам относятся следующие:
...
...
@@ -180,7 +180,7 @@ namespace uniset
enum
Timers
{
PingTimer
,
/*!< таймер на переодическую проверку соединения с сервером БД */
PingTimer
,
/*!< таймер на пере
одическую проверку соединения с сервером БД */
ReconnectTimer
,
/*!< таймер на повторную попытку соединения с сервером БД (или восстановления связи) */
lastNumberOfTimer
};
...
...
@@ -188,7 +188,7 @@ namespace uniset
std
::
unique_ptr
<
MySQLInterface
>
db
;
int
PingTime
=
{
15000
};
int
ReconnectTime
=
{
30000
};
bool
connect_ok
=
{
false
};
/*! признак наличия соед
н
инения с сервером БД */
bool
connect_ok
=
{
false
};
/*! признак наличия соединения с сервером БД */
bool
activate
=
{
false
};
...
...
extensions/DBServer-MySQL/MySQLInterface.h
View file @
90f84c13
...
...
@@ -59,7 +59,7 @@ namespace uniset
/*!
проверка связи с БД.
в случае отсутсвия попытка восстановить...
в случае отсутс
т
вия попытка восстановить...
*/
virtual
bool
ping
()
const
override
;
...
...
extensions/DBServer-PostgreSQL/DBServer_PostgreSQL.h
View file @
90f84c13
...
...
@@ -45,7 +45,7 @@ namespace uniset
* Во первых надо иметь ввиду, что буфер - это то, что потеряется если вдруг произойдёт сбой
* по питанию или программа вылетит. Поэтому если он большой, то будет потеряно много данных.
* И второе, т.к. это vector - то идёт выделение "непрерывного куска памяти", поэтому у ОС могут
* быть проблем
м
ы найти "большой непрерывный кусок".
* быть проблемы найти "большой непрерывный кусок".
* Тем не менее реализация сделана на vector-е чтобы избежать лишних "перевыделений" (и сегментации) памяти во время работы.
*
* \warning Временно, для обратной совместимости поле 'time_usec' в таблицах оставлено с таким названием,
...
...
@@ -100,7 +100,7 @@ namespace uniset
enum
Timers
{
PingTimer
,
/*!< таймер на переодическую проверку соединения с сервером БД */
PingTimer
,
/*!< таймер на пере
одическую проверку соединения с сервером БД */
ReconnectTimer
,
/*!< таймер на повторную попытку соединения с сервером БД (или восстановления связи) */
FlushInsertBuffer
,
/*!< таймер на сброс Insert-буфера */
lastNumberOfTimer
...
...
@@ -127,7 +127,7 @@ namespace uniset
int
PingTime
=
{
15000
};
int
ReconnectTime
=
{
30000
};
bool
connect_ok
=
{
false
};
/*! признак наличия соед
н
инения с сервером БД */
bool
connect_ok
=
{
false
};
/*! признак наличия соединения с сервером БД */
QueryBuffer
qbuf
;
size_t
qbufSize
=
{
200
};
// размер буфера сообщений.
...
...
@@ -138,7 +138,7 @@ namespace uniset
size_t
ibufSize
=
{
0
};
size_t
ibufMaxSize
=
{
2000
};
timeout_t
ibufSyncTimeout
=
{
15000
};
float
ibufOverflowCleanFactor
=
{
0
.
5
};
// коэфициент {0...1} чистки буфера при переполнении
float
ibufOverflowCleanFactor
=
{
0
.
5
};
// коэф
ф
ициент {0...1} чистки буфера при переполнении
};
// ----------------------------------------------------------------------------------
}
// end of namespace uniset
...
...
extensions/DBServer-SQLite/DBServer_SQLite.h
View file @
90f84c13
...
...
@@ -41,19 +41,19 @@ namespace uniset
\section sec_DBS_Comm Общее описание работы DBServer_SQLite
Сервис предназначен для работы с БД SQLite. В его задачи входит
сохранение всех событий происход
и
щих в системе в БД. К этим
сохранение всех событий происход
я
щих в системе в БД. К этим
событиям относятся изменение состояния датчиков, различные логи
работы процессов и т.п.
К моменту запуска, подразумевается, что неободимые таблицы уже
К моменту запуска, подразумевается, что необ
х
одимые таблицы уже
созданы, все необходимые настройки mysql сделаны.
\par
При работе с БД, сервис в основном пишет в БД. Обработка накопленных данных
ведётся уже другими программами (web-интерфейс).
\par
Для повышения надежности DBServer пер
е
одически ( DBServer_SQLite::PingTimer ) проверяет наличие связи с сервером БД.
Для повышения надежности DBServer пер
и
одически ( DBServer_SQLite::PingTimer ) проверяет наличие связи с сервером БД.
В случае если связь пропала (или не была установлена при старте) DBServer пытается вновь каждые DBServer::ReconnectTimer
произвести соединение. При этом все запросы которые поступают для запи
и в БД, но не м
гут быть записаны складываются
произвести соединение. При этом все запросы которые поступают для запи
си в БД, но не мо
гут быть записаны складываются
в буфер (см. \ref sec_DBS_Buffer).
\warning При каждой попытке восстановить соединение DBServer заново читает конф. файл. Поэтому он может подхватить
новые настройки.
...
...
@@ -73,14 +73,14 @@ namespace uniset
\section sec_DBS_Buffer Защита от потери данных
Для того, чтобы на момент отсутствия связи с БД данные по возможности не потерялись,
сделан "кольцевой" буфер. Размер которго можно регулировать параметром "--dbserver-buffer-size"
сделан "кольцевой" буфер. Размер котор
о
го можно регулировать параметром "--dbserver-buffer-size"
или параметром \b bufferSize=".." в конфигурационном файле секции "<LocalDBSErver...>".
Механизм построен на том, что если связь с mysql сервером отсутствует или пропала,
то сообщения помещаются в
ко
левой буфер, который "опустошается" как только она восстановится.
то сообщения помещаются в
ну
левой буфер, который "опустошается" как только она восстановится.
Если связь не восстановилась, а буфер достиг максимального заданного размера, то удаляются
более ранние сообщения. Эту логику можно сменить, если указать параметр "--dbserver-buffer-last-remove"
или \b bufferLastRemove="1", то терятся будут сообщения добавляемые в конец.
или \b bufferLastRemove="1", то терят
ь
ся будут сообщения добавляемые в конец.
\section sec_DBS_Tables Таблицы SQLite
К основным таблицам относятся следующие (описание в формате MySQL!):
...
...
@@ -180,7 +180,7 @@ namespace uniset
enum
Timers
{
PingTimer
,
/*!< таймер на переодическую проверку соединения с сервером БД */
PingTimer
,
/*!< таймер на пере
одическую проверку соединения с сервером БД */
ReconnectTimer
,
/*!< таймер на повторную попытку соединения с сервером БД (или восстановления связи) */
lastNumberOfTimer
};
...
...
@@ -189,7 +189,7 @@ namespace uniset
int
PingTime
=
{
300000
};
int
ReconnectTime
=
{
180000
};
bool
connect_ok
=
{
false
};
/*! признак наличия соед
н
инения с сервером БД */
bool
connect_ok
=
{
false
};
/*! признак наличия соединения с сервером БД */
bool
activate
=
{
false
};
typedef
std
::
queue
<
std
::
string
>
QueryBuffer
;
...
...
extensions/IOControl/IOControl.cc
View file @
90f84c13
...
...
@@ -1261,7 +1261,7 @@ namespace uniset
cout
<<
" Разрешены: TBI0_24,TBI24_0,TBI16_8"
<<
endl
;
cout
<<
"--prefix-default_cardnum - Номер карты по умолчанию. По умолчанию -1."
<<
endl
;
cout
<<
" Если задать, то он будет использоватся для датчиков"
<<
endl
;
cout
<<
" Если задать, то он будет использоват
ь
ся для датчиков"
<<
endl
;
cout
<<
" у которых не задано поле 'card'."
<<
endl
;
cout
<<
"--prefix-test-lamp - Для данного узла в качестве датчика кнопки 'ТестЛамп' использовать указанный датчик."
<<
endl
;
...
...
@@ -1274,7 +1274,7 @@ namespace uniset
cout
<<
"--prefix-blink-time msec - Частота мигания, мсек. По умолчанию в configure.xml"
<<
endl
;
cout
<<
"--prefix-blink2-time msec - Вторая частота мигания (lmpBLINK2), мсек. По умолчанию в configure.xml"
<<
endl
;
cout
<<
"--prefix-blink3-time msec - Вторая частота мигания (lmpBLINK3), мсек. По умолчанию в configure.xml"
<<
endl
;
cout
<<
"--prefix-heartbeat-id - Данный процесс связан с указанным аналоговым heartbeat-дачиком."
<<
endl
;
cout
<<
"--prefix-heartbeat-id - Данный процесс связан с указанным аналоговым heartbeat-да
т
чиком."
<<
endl
;
cout
<<
"--prefix-heartbeat-max - Максимальное значение heartbeat-счётчика для данного процесса. По умолчанию 10."
<<
endl
;
cout
<<
"--prefix-ready-timeout - Время ожидания готовности SM к работе, мсек. (-1 - ждать 'вечно')"
<<
endl
;
cout
<<
"--prefix-force - Сохранять значения в SM, независимо от, того менялось ли значение"
<<
endl
;
...
...
extensions/IOControl/IOControl.h
View file @
90f84c13
...
...
@@ -74,7 +74,7 @@ namespace uniset
Разрешены: TBI0_24,TBI24_0,TBI16_8
<br>\b --io-default_cardnum - Номер карты по умолчанию. По умолчанию -1.
Если задать, то он будет использоватся для датчиков
Если задать, то он будет использоват
ь
ся для датчиков
у которых не задано поле 'card'.
<br>\b --io-test-lamp - Для данного узла в качестве датчика кнопки 'ТестЛамп' использовать указанный датчик.
...
...
@@ -87,7 +87,7 @@ namespace uniset
<br>\b --io-blink-time msec - Частота мигания, мсек. По умолчанию в configure.xml
<br>\b --io-blink2-time msec - Вторая частота мигания (lmpBLINK2), мсек. По умолчанию в configure.xml
<br>\b --io-blink3-time msec - Вторая частота мигания (lmpBLINK3), мсек. По умолчанию в configure.xml
<br>\b --io-heartbeat-id - Данный процесс связан с указанным аналоговым heartbeat-дачиком.
<br>\b --io-heartbeat-id - Данный процесс связан с указанным аналоговым heartbeat-да
т
чиком.
<br>\b --io-heartbeat-max - Максимальное значение heartbeat-счётчика для данного процесса. По умолчанию 10.
<br>\b --io-ready-timeout - Время ожидания готовности SM к работе, мсек. (-1 - ждать 'вечно')
<br>\b --io-force - Сохранять значения в SM, независимо от, того менялось ли значение
...
...
@@ -106,7 +106,7 @@ namespace uniset
но будет его присылать в SensorMessage)
<br>\b cal_nocrop - не обрезать значение по крайним точкам по при калибровке.
<br>\b breaklim - пороговое значение для определения об
ыр
ва датчика (используется для AI).
<br>\b breaklim - пороговое значение для определения об
ры
ва датчика (используется для AI).
Если значение ниже этого порога, то выставляется признак обрыва датчика.
<br>\b debouncedelay - защита от дребезга. Задержка на дребезг, мсек.
<br>\b ondelay - задержка на срабатывание, мсек.
...
...
@@ -125,7 +125,7 @@ namespace uniset
<br>\b rmax - максимальное "сырое" значение
<br>\b cmin - минимальное "калиброванное" значение
<br>\b cmax - максимальное "калиброванное" значение
<br>\b precision - Точность. Задаёт количство знаков после запятой.
<br>\b precision - Точность. Задаёт колич
е
ство знаков после запятой.
<br>Т.е. при считывании из канала, значение домножается
<br>на 10^precision и уже таким сохраняется.
<br>А в SensorMessage присылается присылается precision.
...
...
@@ -140,8 +140,8 @@ namespace uniset
<br>\b threshold_aid - идентификатор аналогового датчика по которому формируется порог.
Используется для DI.
<br>\b lowlimit - нижний порог
о
срабатывания.
<br>\b hilimit - верхний порог
о
срабатывания.
<br>\b lowlimit - нижний порог срабатывания.
<br>\b hilimit - верхний порог срабатывания.
<br>\b card - номер карты
<br>\b subdev - номер подустройства
...
...
@@ -170,7 +170,7 @@ namespace uniset
\section sec_IOC_ConfList Список датчиков для процесса в/в
\section sec_IOC_TestMode Тестовый режим
В IOControl встроена возможнось переводить его в один из тестовых режимов.
В IOControl встроена возможнос
т
ь переводить его в один из тестовых режимов.
Для этого необходимо указать для IOControl аналоговый датчик в который будет записан "код"
режима работы. Датчик можно задать либо аргументом командной строки
--io-test-mode ID либо в конфигурационном файле testmode_as="ID"
...
...
@@ -269,7 +269,7 @@ namespace uniset
int
channel
;
/*!< (UNIO) канал [0...23] */
int
ncard
;
/*!< номер карты [1|2]. -1 - не определена. */
/*! Вид поключения
/*! Вид по
д
ключения
0 - analog ref = analog ground
1 - analog ref = analog common
2 - analog ref = differential
...
...
@@ -348,7 +348,7 @@ namespace uniset
xmlNode
*
confnode
=
{
0
};
/*!< xml-узел в настроечном файле */
int
polltime
=
{
150
};
/*!< пер
е
одичность обновления данных (опроса карт в/в), [мсек] */
int
polltime
=
{
150
};
/*!< пер
и
одичность обновления данных (опроса карт в/в), [мсек] */
CardList
cards
;
/*!< список карт - массив созданных ComediInterface */
bool
noCards
=
{
false
};
...
...
extensions/IOControl/tests/FakeIOControl.h
View file @
90f84c13
...
...
@@ -59,7 +59,7 @@ namespace uniset
virtual
void
configureChannel
(
int
subdev
,
int
channel
,
ChannelType
type
,
int
range
=
0
,
int
aref
=
0
)
const
override
;
};
// --------------------------------------------------------------------------
/*! Специальный IOControl для тестирвания подменяющий все карты в/в на FakeComediInterface */
/*! Специальный IOControl для тестир
о
вания подменяющий все карты в/в на FakeComediInterface */
class
FakeIOControl
:
public
IOControl
{
...
...
extensions/LogDB/LogDB.h
View file @
90f84c13
...
...
@@ -88,7 +88,7 @@ namespace uniset
\section sec_LogDB_DB LogDB: Работа с БД
Для оптимизации, запись в БД сделана не по каждому сообщению, а через промежуточнй буфер.
Для оптимизации, запись в БД сделана не по каждому сообщению, а через промежуточн
ы
й буфер.
Т.е. только после того как в буфере скапливается \a qbufSize сообщений (строк) буфер скидывается в базу.
Помимо этого, встроен механизм "ротации БД". Если задан параметр maxRecords (--prefix-db-max-records),
то в БД будет поддерживаться ограниченное количество записей. При этом введён "гистерезис",
...
...
@@ -137,7 +137,7 @@ namespace uniset
\section sec_LogDB_DETAIL LogDB: Технические детали
Вся релизация построена на "однопоточном" eventloop. В нём происходит,
Вся ре
а
лизация построена на "однопоточном" eventloop. В нём происходит,
чтение данных от логсерверов, посылка сообщений в websockets, запись в БД.
При этом обработка запросов REST API реализуется отдельными потоками контролируемыми libpoco.
...
...
extensions/LogicProcessor/LProcessor.h
View file @
90f84c13
...
...
@@ -102,7 +102,7 @@
В текущей реализации в качестве датчиков разрешено использовать только типы DO или DI.
\note Следует иметь ввиду, что схема \b не \b обязательно должна быть \b "СВЯЗАННОЙ"
(все элементы связанны между собой). В файле может содержаться несколько схем вн
ту
ри тэга \b <Schema>.
(все элементы связанны между собой). В файле может содержаться несколько схем вн
ут
ри тэга \b <Schema>.
Логика исполняется в порядке следования в файле, сверху вниз (в порядке считывания из файла).
*/
// --------------------------------------------------------------------------
...
...
extensions/LogicProcessor/PassiveLProcessor.cc
View file @
90f84c13
...
...
@@ -274,7 +274,7 @@ void PassiveLProcessor::help_print( int argc, const char* const* argv )
cout
<<
"--prefix-confnode cnode - Возможность задать настроечный узел в configure.xml. По умолчанию: name"
<<
endl
;
cout
<<
endl
;
cout
<<
"--prefix-schema file - Файл с логической схемой."
<<
endl
;
cout
<<
"--prefix-heartbeat-id - Данный процесс связан с указанным аналоговым heartbeat-дачиком."
<<
endl
;
cout
<<
"--prefix-heartbeat-id - Данный процесс связан с указанным аналоговым heartbeat-да
т
чиком."
<<
endl
;
cout
<<
"--prefix-heartbeat-max - Максимальное значение heartbeat-счётчика для данного процесса. По умолчанию 10."
<<
endl
;
}
...
...
extensions/LogicProcessor/Schema.h
View file @
90f84c13
...
...
@@ -133,7 +133,7 @@ namespace uniset
std
::
shared_ptr
<
Element
>
findOut
(
const
std
::
string
&
name
);
// -----------------------------------------------
// внутренее соединения
// внутрен
н
ее соединения
// между элементами
struct
INLink
{
...
...
@@ -171,7 +171,7 @@ namespace uniset
};
protected
:
ElementMap
emap
;
// список элеметов
ElementMap
emap
;
// список элеме
н
тов
InternalList
inLinks
;
ExternalList
extLinks
;
OutputsList
outList
;
...
...
extensions/MQTTPublisher/MQTTPublisher.h
View file @
90f84c13
...
...
@@ -100,7 +100,7 @@ namespace uniset
- \b %rmin - минимальное значение диапазона (range min)
- \b %rmax - максимальное значение диапазона (range max)
\note Если заданные "одиночные" значения совпадают с диапазоном, то будет сгенерировано несколько сообщений. Т.е. диапазоны могут пересекатся.
\note Если заданные "одиночные" значения совпадают с диапазоном, то будет сгенерировано несколько сообщений. Т.е. диапазоны могут пересекат
ь
ся.
*/
class
MQTTPublisher
:
...
...
extensions/ModbusMaster/MBExchange.cc
View file @
90f84c13
...
...
@@ -261,8 +261,8 @@ namespace uniset
cout
<<
"--prefix-recv-timeout msec - Таймаут на приём одного сообщения"
<<
endl
;
cout
<<
"--prefix-timeout msec - Таймаут для определения отсутствия соединения"
<<
endl
;
cout
<<
"--prefix-aftersend-pause msec - Пауза после посылки запроса (каждого). По умолчанию: 0."
<<
endl
;
cout
<<
"--prefix-reopen-timeout msec - Таймаут для 'переоткрытия соединения' при отсутсвия соединения msec милисекунд. По умолчанию 10 сек."
<<
endl
;
cout
<<
"--prefix-heartbeat-id name - Данный процесс связан с указанным аналоговым heartbeat-дачиком."
<<
endl
;
cout
<<
"--prefix-reopen-timeout msec - Таймаут для 'переоткрытия соединения' при отсутс
т
вия соединения msec милисекунд. По умолчанию 10 сек."
<<
endl
;
cout
<<
"--prefix-heartbeat-id name - Данный процесс связан с указанным аналоговым heartbeat-да
т
чиком."
<<
endl
;
cout
<<
"--prefix-heartbeat-max val - Максимальное значение heartbeat-счётчика для данного процесса. По умолчанию 10."
<<
endl
;
cout
<<
"--prefix-ready-timeout msec - Время ожидания готовности SM к работе, мсек. (-1 - ждать 'вечно')"
<<
endl
;
cout
<<
"--prefix-force 0,1 - Сохранять значения в SM на каждом шаге, независимо от, того менялось ли значение"
<<
endl
;
...
...
@@ -2569,7 +2569,7 @@ namespace uniset
}
/*! приоритет опроса:
* 1...n - задаёт "часоту" опроса. Т.е. каждые 1...n циклов
* 1...n - задаёт "час
т
оту" опроса. Т.е. каждые 1...n циклов
*/
size_t
pollfactor
=
IOBase
::
initIntProp
(
it
,
"pollfactor"
,
prop_prefix
,
false
,
0
);
...
...
extensions/ModbusMaster/MBExchange.h
View file @
90f84c13
...
...
@@ -162,7 +162,7 @@ namespace uniset
RegMap
::
iterator
rit
;
// начальная инициали
аз
ция для "записываемых" регистров
// начальная инициали
за
ция для "записываемых" регистров
// Механизм:
// Если tcp_preinit="1", то сперва будет сделано чтение значения из устройства.
// при этом флаг mb_init=false пока не пройдёт успешной инициализации
...
...
@@ -206,7 +206,7 @@ namespace uniset
// safe mode
long
safeMode
=
{
safeNone
};
/*!< режим безопасного состояния см. SafeMode */
uniset
::
ObjectId
safemode_id
=
{
uniset
::
DefaultObjectId
};
/*!< иден
иден
тификатор для датчика безопасного режима */
uniset
::
ObjectId
safemode_id
=
{
uniset
::
DefaultObjectId
};
/*!< идентификатор для датчика безопасного режима */
IOController
::
IOStateList
::
iterator
safemode_it
;
long
safemode_value
=
{
1
};
...
...
@@ -340,7 +340,7 @@ namespace uniset
bool
force
=
{
false
};
/*!< флаг означающий, что надо сохранять в SM, даже если значение не менялось */
bool
force_out
=
{
false
};
/*!< флаг означающий, принудительного чтения выходов */
bool
mbregFromID
=
{
false
};
timeout_t
polltime
=
{
100
};
/*!< пер
е
одичность обновления данных, [мсек] */
timeout_t
polltime
=
{
100
};
/*!< пер
и
одичность обновления данных, [мсек] */
timeout_t
sleepPause_msec
=
{
10
};
size_t
maxQueryCount
=
{
ModbusRTU
::
MAXDATALEN
};
/*!< максимальное количество регистров для одного запроса */
...
...
@@ -350,7 +350,7 @@ namespace uniset
IOController
::
IOStateList
::
iterator
itHeartBeat
;
uniset
::
ObjectId
test_id
=
{
uniset
::
DefaultObjectId
};
uniset
::
ObjectId
sidExchangeMode
=
{
uniset
::
DefaultObjectId
};
/*!< иден
иден
тификатор для датчика режима работы */
uniset
::
ObjectId
sidExchangeMode
=
{
uniset
::
DefaultObjectId
};
/*!< идентификатор для датчика режима работы */
IOController
::
IOStateList
::
iterator
itExchangeMode
;
long
exchangeMode
=
{
emNone
};
/*!< режим работы см. ExchangeMode */
...
...
extensions/ModbusMaster/MBTCPMaster.h
View file @
90f84c13
...
...
@@ -87,7 +87,7 @@ namespace uniset
\b --xxx-recv-timeout или \b recv_timeout msec - таймаут на приём одного сообщения. По умолчанию 100 мсек.
\b --xxx-timeout или \b timeout msec - таймаут на определение отсутсвия связи
\b --xxx-timeout или \b timeout msec - таймаут на определение отсутс
т
вия связи
(после этого идёт попытка реинициализировать соединение)
По умолчанию 5000 мсек.
...
...
@@ -176,7 +176,7 @@ namespace uniset
- \b tcp_nbyte - [1|2] номер байта. Используется если tcp_vtype="byte".
- \b tcp_mboffset - "сдвиг"(может быть отрицательным) при опросе/записи.
Т.е. фактически будет опрошен/записан регистр "mbreg+mboffset".
- \b tcp_pollfactor - [0...n] Частота опроса. n задаёт "часоту" опроса. т.е. опрос каждые 1...n циклов
- \b tcp_pollfactor - [0...n] Частота опроса. n задаёт "час
т
оту" опроса. т.е. опрос каждые 1...n циклов
Для инициализации "выходов" (регистров которые пишутся) можно использовать поля:
- \b tcp_preinit - [0|1] считать регистр перед использованием (при запуске процесса)
...
...
extensions/ModbusMaster/MBTCPMultiMaster.h
View file @
90f84c13
...
...
@@ -89,7 +89,7 @@ namespace uniset
- \b priority - приоритет канала (чем больше число, тем выше приоритет)
- \b respond_invert - инвертировать датчик связи (DI)
- \b force [1,0] - "1" - обновлять значение датчика связи в SM принудительно на каждом цикле проверки ("0" - только по изменению).
- \b timeout - таймаут на определение отсутсвия связи для данного канала. По умолчанию берётся глобальный.
- \b timeout - таймаут на определение отсутс
т
вия связи для данного канала. По умолчанию берётся глобальный.
- \b checkFunc - Номер функции для проверки соединения
- \b checkAddr - Адрес устройства для проверки соединения
- \b checkReg - Регистр для проверки соединения
...
...
@@ -110,7 +110,7 @@ namespace uniset
\b --xxx-recv-timeout или \b recv_timeout msec - таймаут на приём одного сообщения. По умолчанию 100 мсек.
\b --xxx-timeout или \b timeout msec - таймаут на определение отсутсвия связи
\b --xxx-timeout или \b timeout msec - таймаут на определение отсутс
т
вия связи
(после этого идёт попытка реинициализировать соединение)
По умолчанию 5000 мсек.
...
...
@@ -207,7 +207,7 @@ namespace uniset
- \b tcp_nbyte - [1|2] номер байта. Используется если tcp_vtype="byte".
- \b tcp_mboffset - "сдвиг"(может быть отрицательным) при опросе/записи.
Т.е. фактически будет опрошен/записан регистр "mbreg+mboffset".
- \b tcp_pollfactor - [0...n] Частота опроса. n задаёт "часоту" опроса. т.е. опрос каждые 1...n циклов (зависит от общего polltime)
- \b tcp_pollfactor - [0...n] Частота опроса. n задаёт "час
т
оту" опроса. т.е. опрос каждые 1...n циклов (зависит от общего polltime)
Для инициализации "выходов" (регистров которые пишутся) можно использовать поля:
- \b tcp_preinit - [0|1] считать регистр перед использованием (при запуске процесса)
...
...
@@ -262,12 +262,12 @@ namespace uniset
соединения будет взят первый попавшийся регистр из списка обмена.
\warning Способ проверки при помощи "modbus-запроса" имеет ряд проблем: Если фактически производится
обмен с несколькими устройствами (несколько mbaddr) через TCP-шлюз, то может быть "ложное" срабатвание,
обмен с несколькими устройствами (несколько mbaddr) через TCP-шлюз, то может быть "ложное" срабат
ы
вание,
т.к. фактически состояние канала будет определяться только под связи с каким-то одним конкретным устройством.
И получается, что если обмен ведётся например с тремя устройствами, но
проверка канала происходит только по связи с первым, то если оно перестанет отвечать, это будет считаться
сбоем всего канала и этот канал будет исключён из обмена (!). Если ведётся обмен только с одним устройством,
такой проблем
м
ы не возникает.
такой проблемы не возникает.
Но к плюсам данного способа проверки связи ("modbus-запросом") является то, что соедиенение поддерживается
постоянным, в отличие от "первого способа" при котором оно создаётся и сразу рвётся и если проверка
настроена достаточно часто ( < TIME_WAIT для сокетов), то при длительной работе могут закончится дескрипторы
...
...
extensions/ModbusSlave/MBSlave.cc
View file @
90f84c13
...
...
@@ -1547,7 +1547,7 @@ namespace uniset
cout
<<
"--prefix-reg-from-id 0,1 - Использовать в качестве регистра sensor ID"
<<
endl
;
cout
<<
"--prefix-filter-field name - Считывать список опрашиваемых датчиков, только у которых есть поле field"
<<
endl
;
cout
<<
"--prefix-filter-value val - Считывать список опрашиваемых датчиков, только у которых field=value"
<<
endl
;
cout
<<
"--prefix-heartbeat-id - Данный процесс связан с указанным аналоговым heartbeat-дачиком."
<<
endl
;
cout
<<
"--prefix-heartbeat-id - Данный процесс связан с указанным аналоговым heartbeat-да
т
чиком."
<<
endl
;
cout
<<
"--prefix-heartbeat-max - Максимальное значение heartbeat-счётчика для данного процесса. По умолчанию 10."
<<
endl
;
cout
<<
"--prefix-initPause - Задержка перед инициализацией (время на активизация процесса)"
<<
endl
;
cout
<<
"--prefix-force 1 - Читать данные из SM каждый раз, а не по изменению."
<<
endl
;
...
...
extensions/ModbusSlave/MBSlave.h
View file @
90f84c13
...
...
@@ -145,7 +145,7 @@ namespace uniset
\b --xxx-default-mbaddr addr1 - slave-адрес по умолчанию для данного устройства. Если указан адрес 255 - ответ будет на любые сообщения.
\b --xxx-timeout или \b timeout msec - таймаут на определение отсутсвия связи.
\b --xxx-timeout или \b timeout msec - таймаут на определение отсутс
т
вия связи.
\b --xxx-reply-timeout msec - таймаут на формирование ответа.
...
...
@@ -363,7 +363,7 @@ namespace uniset
AccessMode
amode
;
VTypes
::
VType
vtype
;
/*!< type of value */
size_t
wnum
;
/*!< номер слова (для типов с размеров больше 2х байт */
size_t
nbyte
;
/*!< номер байта, который надо "сохранить" из "пришед
щ
его в запросе" слова. [1-2] */
size_t
nbyte
;
/*!< номер байта, который надо "сохранить" из "пришед
ш
его в запросе" слова. [1-2] */
std
::
shared_ptr
<
BitRegProperty
>
bitreg
;
/*!< указатель, как признак является ли данный регистр "сборным" из битовых */
ModbusRTU
::
RegID
regID
;
...
...
@@ -473,7 +473,7 @@ namespace uniset
ModbusRTU
::
mbErrCode
read4314
(
ModbusRTU
::
MEIMessageRDI
&
query
,
ModbusRTU
::
MEIMessageRetRDI
&
reply
);
// т.к. в функциях (much_real_read,nuch_real_write) рас
с
чёт на отсортированность IOMap
// т.к. в функциях (much_real_read,nuch_real_write) расчёт на отсортированность IOMap
// то использовать unordered_map нельзя
typedef
std
::
map
<
ModbusRTU
::
RegID
,
IOProperty
>
RegMap
;
...
...
extensions/SharedMemory/SharedMemory.cc
View file @
90f84c13
...
...
@@ -972,7 +972,7 @@ namespace uniset
try
{
#if 1
// Вариант через setValue...(заодно вн
ту
ри проверяются пороги)
// Вариант через setValue...(заодно вн
ут
ри проверяются пороги)
setValue
(
ii
.
si
.
id
,
ii
.
value
,
getId
());
#else
...
...
extensions/SharedMemory/SharedMemory.h
View file @
90f84c13
...
...
@@ -40,7 +40,7 @@ namespace uniset
{
// -----------------------------------------------------------------------------
/*! \page page_SharedMemory Реализация разделямой между процессами памяти (SharedMemory)
/*! \page page_SharedMemory Реализация разделя
е
мой между процессами памяти (SharedMemory)
\section sec_SM_Common Задачи решаемые объектом SharedMemory
...
...
@@ -121,14 +121,14 @@ namespace uniset
\section sec_SM_Event Уведомление о рестарте SM
В SM реализован механизм позволяющий задавать список объетов,
В SM реализован механизм позволяющий задавать список объе
к
тов,
которым присылается уведомление о старте/рестарте SM.
Параметр определяющий фильтр, по которому формируется список объектов
задаётся из командной строки \b --e-filter.
Параметр \b --e-startup-pause msec - задаёт паузу после старта SM,
после которой заданным объектам посылается уведомление.
Чтобы указать объект которому необходимо присылать уведомление,
необходимо для него в конфигура
й
ионном файле указать поле
необходимо для него в конфигура
ц
ионном файле указать поле
\b evnt_xxx="1", где \b xxx - имя заданное в качестве параметра
\b --e-filter.
Пример:
...
...
@@ -145,7 +145,7 @@ namespace uniset
\section sec_SM_Depends Механизм зависимостей между датчиками
В SM реализован механизм позволяющий задавать зависимости между датчиками. Т.е. датчик
будет равен "0" пока разрешающий датчик не будет рав
е
но "1". Ниже показан пример конфигурирования
будет равен "0" пока разрешающий датчик не будет равно "1". Ниже показан пример конфигурирования
зависимости.
\code
<item id="20050" iotype="AI" name="Sensor1"" textname="Зависящий датчик 1">
...
...
@@ -178,8 +178,8 @@ namespace uniset
аналоговый(счётчик) и дискретный. Во время работы, процесс периодически (время задаётся в настройках)
сохраняет в свой \b аналоговый датчик заданное значение (количество тактов).
В свою очередь процесс SM, каждый "такт"(время между шагами задаётся в настройках),
"отнимает" у этого значения 1 (декр
и
ментирует). Пока значение счётчика больше нуля, дискретный датчик
держит
ь
ся равным "1" (т.е. 1 - процесс "жив"). Если процесс "вылетает" и перестаёт обновлять свой счётчик,
"отнимает" у этого значения 1 (декр
е
ментирует). Пока значение счётчика больше нуля, дискретный датчик
держится равным "1" (т.е. 1 - процесс "жив"). Если процесс "вылетает" и перестаёт обновлять свой счётчик,
то через некоторое количество тактов его счётчик становится меньше нуля. Как только это происходит, SM фиксирует,
"недоступность" процесса, и выставляет дискретный датчик в ноль (т.е. 0 - процесс вылетел(недоступен)).
...
...
@@ -188,14 +188,14 @@ namespace uniset
и за заданное время процесс не перезапустился (не обновил свой счётчик), происходит
перезагрузка контроллера (SM перестаёт сбрасывать WDT-таймер).
У аналоговых датчиков "сердцебиения" в конфигура
й
ионном файле необходимо указывать \b heartbeat="1".
У аналоговых датчиков "сердцебиения" в конфигура
ц
ионном файле необходимо указывать \b heartbeat="1".
А также поля:
<br>\b heartbeat_ds_name - имя дискретного датчика, связанного с данным аналоговым
<br>\b heartbeat_node="ses" - фильтрующее поле (см. --heartbeat-node)
<br>\b heartbeat_reboot_msec - время ожидания перезапуска процесса. Это необязательный параметр, задаётся только в случае
необходимости перезапуска контроллера.
Пример задания датчиков "сердцеби
я
ния":
Пример задания датчиков "сердцеби
е
ния":
<br>_31_04_AS - аналоговый (счётчик)
<br>_41_04_S - дискретный ("доступность процесса")
...
...
@@ -241,8 +241,8 @@ namespace uniset
id - задаёт (внутренний) идентификатор "истории"
fuse_id - идентификатор датчика "детонатора"
fuse_value - значение срабатывания (для аналогового "детонатора")
fuse_invert - ивертировать (для дискретных "детонаторов").
Т.е. срабатвание на значение "0".
fuse_invert - и
н
вертировать (для дискретных "детонаторов").
Т.е. срабат
ы
вание на значение "0".
size - количество точек в хранимой истории
filter - поле используемое в качестве фильтра, определяющего датчики
...
...
@@ -251,7 +251,7 @@ namespace uniset
Каждый датчик может входить в любое количество групп (историй).
Механизм фу
кн
ционирует по следующей логике:
Механизм фу
нк
ционирует по следующей логике:
При запуске происходит считывание параметров секции <History>
и заполнение соответствующих структур хранения. При этом происходит
...
...
@@ -263,8 +263,8 @@ namespace uniset
а одно устаревшее удаляется, тем самым всегда поддерживается буфер не более
\b size точек.
Помимо этого в фу
кнци
иях изменения датчиков (семейство setValue) отслеживается
изменение состояния "детонаторов". Если срабатывает заданое условие для
Помимо этого в фу
нкц
иях изменения датчиков (семейство setValue) отслеживается
изменение состояния "детонаторов". Если срабатывает задан
н
ое условие для
"сброса" дампа, инициируется сигнал, в который передаётся идентификатор истории
и текущая накопленная история.
...
...
@@ -402,7 +402,7 @@ namespace uniset
typedef
std
::
list
<
HistoryInfo
>
History
;
// т.к. могут
ь
быть одинаковые "детонаторы" для разных "историй" то,
// т.к. могут быть одинаковые "детонаторы" для разных "историй" то,
// вводим не просто map, а "map списка историй".
// точнее итераторов-историй.
typedef
std
::
list
<
History
::
iterator
>
HistoryItList
;
...
...
extensions/UNetUDP/UDPPacket.h
View file @
90f84c13
...
...
@@ -27,7 +27,7 @@ namespace uniset
// -----------------------------------------------------------------------------
namespace
UniSetUDP
{
/*! Для оптимизации размера передаваемх данных, но с учётом того, что ID могут идти не подряд.
/*! Для оптимизации размера передаваем
ы
х данных, но с учётом того, что ID могут идти не подряд.
Сделан следующий формат:
Для аналоговых величин передаётся массив пар "id-value"(UDPAData).
Для булевых величин - отдельно массив ID и отдельно битовый массив со значениями,
...
...
@@ -41,7 +41,7 @@ namespace uniset
"ByteOrder"
============
В текущей версии протокола. В UDPHeader содержит
ь
ся информации о порядке байт.
В текущей версии протокола. В UDPHeader содержится информации о порядке байт.
Поэтому логика следующая:
- Узел который посылает, ничего не перекодирует и просто посылает данные так как хранит
(информация о порядке байт, если специально не выставить, будет выставлена при компиляции, см. конструктор)
...
...
extensions/UNetUDP/UNetExchange.h
View file @
90f84c13
...
...
@@ -92,7 +92,7 @@ namespace uniset
--prefix-nodes-confnode name. По умолчанию настройка ведётся по секции <nodes>
\section pgUNetUDP_Reserv Настройка резервного канала связи
В текущей реализации поддерживается возможность обмена по двум подсетям (
эзернет
-каналам).
В текущей реализации поддерживается возможность обмена по двум подсетям (
Ethernet
-каналам).
Она основана на том, что, для каждого узла помимо основного "читателя",
создаётся дополнительный "читатель"(поток) слушающий другой ip-адрес и порт.
А так же, для локального узла создаётся дополнительный "писатель"(поток),
...
...
@@ -119,7 +119,7 @@ namespace uniset
для каждого датчика. Суть механизма заключается в том, что для каждого датчика можно задать свойство
- \b prefix_sendfactor="N" Где N>1 - задаёт "делитель" относительно \b sendpause определяющий с какой частотой
информация о данном датчике будет посылаться. Например N=2 - каждый второй цикл, N=3 - каждый третий и т.п.
При загрузке все датчики (относщиеся к данному процессу) разбиваются на группы пакетов согласно своей частоте посылки.
При загрузке все датчики (относ
я
щиеся к данному процессу) разбиваются на группы пакетов согласно своей частоте посылки.
При этом внутри одной группы датчики разбиваются по пакетам согласно заданному максимальному размеру пакета
(см. конструктор класса UNetSender()).
...
...
extensions/UNetUDP/UNetReceiver.h
View file @
90f84c13
...
...
@@ -40,7 +40,7 @@ namespace uniset
* ===============
* Собственно реализация сделана так:
* В данных передаётся номер пакета. На случай если несколько пакетов придут не в той последовательности
* что были посланы, сделана очередь с приоритетом. В качестве приориета используется номер пакета
* что были посланы, сделана очередь с приоритетом. В качестве приори
т
ета используется номер пакета
* (чем меньше тем старше). При этом обработка ведётся только тех пакетов, которые идут "подряд",
* как только встречается "дырка" происходит ожидание её "заполения". Если в течение времени (lostTimeout)
* "дырка" не исчезает, увеличивается счётчик потерянных пакетов и обработка продолжается дальше..
...
...
@@ -60,12 +60,12 @@ namespace uniset
* Т.к. в общем случае, данные могут быть разбиты не несколько (много) пакетов, то для каждого из них выделен свой кэш и создан отдельный
* map, ключом в котором является идентификатор данных (см. UDPMessage::getDataID()).
* Кэш в map добавляется когда приходит пакет с новым UDPMessage::getDataID() и в дальнейшим используется для этого пакета.
* В текущей реализации размер map не контролируется (завязан на UDPMessage::getDataID()) и расчитан на статичность пакетов,
* В текущей реализации размер map не контролируется (завязан на UDPMessage::getDataID()) и рас
с
читан на статичность пакетов,
* т.е. на то что UNetSender не будет с течением времени менять структуру отправляемых пакетов.
*
* Обработка сбоя или переполнения счётчика пакетов(перехода через максимум)
* =========================================================================
* Для защиты от сбоя счётика сделана следующая логика:
* Для защиты от сбоя счёт
ч
ика сделана следующая логика:
* Если номер очередного пришедшего пакета отличается от последнего обработанного на maxDifferens, то считается,
* что произошёл сбой счётчика и происходит ожидание пока функция update, не обработает основную очередь полностью.
* При этом принимаемые пакеты складываются во временную очередь qtmp. Как только основная очередь пустеет,
...
...
@@ -176,7 +176,7 @@ namespace uniset
void
setUpdateStrategy
(
UpdateStrategy
set
);
// специальная обёртка, захватывающая или нет mutex в зависимости от стратегии
// (т.к. при evloop mutex захваты
т
вать не нужно)
// (т.к. при evloop mutex захватывать не нужно)
class
pack_guard
{
public
:
...
...
@@ -241,8 +241,8 @@ namespace uniset
private
:
UNetReceiver
();
timeout_t
recvpause
=
{
10
};
/*!< пауза ме
д
жду приёмами пакетов, [мсек] */
timeout_t
updatepause
=
{
100
};
/*!< пер
е
одичность обновления данных в SM, [мсек] */
timeout_t
recvpause
=
{
10
};
/*!< пауза между приёмами пакетов, [мсек] */
timeout_t
updatepause
=
{
100
};
/*!< пер
и
одичность обновления данных в SM, [мсек] */
std
::
unique_ptr
<
UDPReceiveU
>
udp
;
std
::
string
addr
;
...
...
@@ -300,13 +300,13 @@ namespace uniset
std
::
mutex
packMutex
;
/*!< mutex для работы с очередью */
size_t
pnum
=
{
0
};
/*!< текущий номер обработанного сообщения, для проверки непрерывности последовательности пакетов */
/*! максимальная разница межд номерами пакетов, при которой считается, что счётчик пакетов
/*! максимальная разница межд
у
номерами пакетов, при которой считается, что счётчик пакетов
* прошёл через максимум или сбился...
*/
size_t
maxDifferens
=
{
20
};
PacketQueue
qtmp
;
/*!< очередь на время обработки(очистки) основной очереди */
bool
waitClean
=
{
false
};
/*!< флаг означающий, что ждём очист
и
ки очереди до конца */
bool
waitClean
=
{
false
};
/*!< флаг означающий, что ждём очистки очереди до конца */
size_t
rnum
=
{
0
};
/*!< текущий номер принятого сообщения, для проверки "переполнения" или "сбоя" счётчика */
size_t
maxProcessingCount
=
{
100
};
/*!< максимальное число обрабатываемых за один раз сообщений */
...
...
extensions/UNetUDP/UNetSender.h
View file @
90f84c13
...
...
@@ -51,7 +51,7 @@ namespace uniset
* ОПТИМИЗАЦИЯ N1: Для оптимизации обработки посылаемых пакетов (на стороне UNetSender) сделана следующая логика:
* Номер очередного посылаемого пакета меняется (увеличивается) только, если изменились данные с момента
последней посылки. Для этого по данным каждый раз производится расчёт UNetUDP::makeCRC() и сравнивается с последним.
На стороне UNetReceiver пак
а
еты с повторными номерами (т.е. уже обработанные) - откидываются.
На стороне UNetReceiver пакеты с повторными номерами (т.е. уже обработанные) - откидываются.
*
*
* Создание соединения
...
...
extensions/UniNetwork/UniExchange.cc
View file @
90f84c13
...
...
@@ -470,7 +470,7 @@ bool UniExchange::initItem( UniXML::iterator& it )
void
UniExchange
::
help_print
(
int
argc
,
const
char
**
argv
)
{
cout
<<
"--unet-polltime msec - Пауза между опросами узлов. По умолчанию 200 мсек."
<<
endl
;
// cout << "--unet-heartbeat-id - Данный процесс связан с указанным аналоговым heartbeat-дачиком." << endl;
// cout << "--unet-heartbeat-id - Данный процесс связан с указанным аналоговым heartbeat-да
т
чиком." << endl;
// cout << "--unet-heartbeat-max - Максимальное значение heartbeat-счётчика для данного процесса. По умолчанию 10." << endl;
cout
<<
"--unet-sm-ready-timeout - время на ожидание старта SM"
<<
endl
;
}
...
...
extensions/include/Calibration.h
View file @
90f84c13
...
...
@@ -106,7 +106,7 @@ namespace uniset
{
return
minVal
;
}
/*! Возвращает максимальное значение 'x' втретившееся в диаграмме */
/*! Возвращает максимальное значение 'x' в
с
третившееся в диаграмме */
inline
long
getMaxValue
()
const
noexcept
{
return
maxVal
;
...
...
@@ -154,7 +154,7 @@ namespace uniset
return
rightRaw
;
}
/*! построение характерист
р
ики из конф. файла
/*! построение характеристики из конф. файла
\param name - название характеристики в файле
\param confile - файл содержащий данные
\param node - если node!=0, то используется этот узел...
...
...
@@ -225,8 +225,8 @@ namespace uniset
TypeOfValue
getY
(
const
TypeOfValue
&
x
)
const
noexcept
;
/*!< получить значение Y */
TypeOfValue
getX
(
const
TypeOfValue
&
y
)
const
noexcept
;
/*!< получить значение X */
TypeOfValue
calcY
(
const
TypeOfValue
&
x
)
const
noexcept
;
/*!< расчитать значение для x */
TypeOfValue
calcX
(
const
TypeOfValue
&
y
)
const
noexcept
;
/*!< расчитать значение для y */
TypeOfValue
calcY
(
const
TypeOfValue
&
x
)
const
noexcept
;
/*!< рас
с
читать значение для x */
TypeOfValue
calcX
(
const
TypeOfValue
&
y
)
const
noexcept
;
/*!< рас
с
читать значение для y */
inline
bool
operator
<
(
const
Part
&
p
)
const
noexcept
{
...
...
extensions/include/DigitalFilter.h
View file @
90f84c13
...
...
@@ -95,7 +95,7 @@ namespace uniset
// Вторая ступень фильтра, математическая реализация RC фильтра
double
secondLevel
(
double
val
);
double
Ti
;
// Постоянная времени для апериодического звена в милисекундах
double
Ti
;
// Постоянная времени для апериодического звена в мил
л
исекундах
double
val
;
// Текущее значение второй ступени фильтра
double
M
;
// Среднее арифметическое
double
S
;
// Среднеквадратичное отклонение
...
...
@@ -107,7 +107,7 @@ namespace uniset
typedef
std
::
vector
<
int
>
MedianVector
;
MedianVector
mvec
;
bool
mvec_sorted
;
// флаг, что mvec о
ст
ортирован (заполнен)
bool
mvec_sorted
;
// флаг, что mvec о
тс
ортирован (заполнен)
typedef
std
::
vector
<
double
>
Coeff
;
Coeff
w
;
// Вектор коэффициентов для filterIIR
...
...
extensions/include/IOBase.h
View file @
90f84c13
...
...
@@ -183,7 +183,7 @@ namespace uniset
static
bool
processingAsDO
(
IOBase
*
it
,
const
std
::
shared_ptr
<
SMInterface
>&
shm
,
bool
force
);
static
void
processingThreshold
(
IOBase
*
it
,
const
std
::
shared_ptr
<
SMInterface
>&
shm
,
bool
force
);
/*! \param initPrefixOnly - TRUE - инициализировать только свойста с prefix (или брать значения по умолчанию).
/*! \param initPrefixOnly - TRUE - инициализировать только свойст
в
а с prefix (или брать значения по умолчанию).
FALSE - сперва искать свойство с prefix, если не найдено брать без prefix.
*/
static
bool
initItem
(
IOBase
*
b
,
UniXML
::
iterator
&
it
,
const
std
::
shared_ptr
<
SMInterface
>&
shm
,
...
...
extensions/include/MTR.h
View file @
90f84c13
...
...
@@ -56,7 +56,7 @@ namespace uniset
mtT_Str8
};
// -------------------------------------------------------------------------
std
::
string
type2str
(
MTRType
t
);
/*!< преоразование строки в тип */
std
::
string
type2str
(
MTRType
t
);
/*!< прео
б
разование строки в тип */
MTRType
str2type
(
const
std
::
string
&
s
);
/*!< преобразование названия в строку */
size_t
wsize
(
MTRType
t
);
/*!< длина данных в словах */
// -------------------------------------------------------------------------
...
...
extensions/include/PID.h
View file @
90f84c13
...
...
@@ -27,7 +27,7 @@ namespace uniset
Формулы выведены на основе разностных уравнений
см. http://atm.h1.ru/root/theory/theory33.html
Он даёт неплохой результат и опимальнее по расчётам
Он даёт неплохой результат и оп
т
имальнее по расчётам
(содержит только умножение, не переполняется
т.к. учитывает только два последних шага)
*/
...
...
extensions/include/UObject_SK.h
View file @
90f84c13
...
...
@@ -216,7 +216,7 @@ class UObject_SK:
int
askPause
;
/*!< пауза между неудачными попытками заказать датчики */
IOController_i
::
SensorInfo
si
;
bool
forceOut
;
/*!< флаг принудительного обн
о
ления "выходов" */
bool
forceOut
;
/*!< флаг принудительного обн
у
ления "выходов" */
std
::
shared_ptr
<
uniset
::
LogAgregator
>
loga
;
std
::
shared_ptr
<
DebugStream
>
mylog
;
...
...
extensions/tests/test_ui.cc
View file @
90f84c13
...
...
@@ -176,7 +176,7 @@ TEST_CASE("UInterface", "[UInterface]")
REQUIRE_THROWS_AS
(
ui
.
askThreshold
(
aid
,
3
,
UniversalIO
::
UIONotify
,
50
,
20
,
false
,
testOID
),
IONotifyController_i
::
BadRange
);
IONotifyController_i
::
ThresholdsListSeq_var
slist
=
ui
.
getThresholdsList
(
aid
);
REQUIRE
(
slist
->
length
()
==
1
);
// количество датчиков с порог
о
ами = 1 (это aid)
REQUIRE
(
slist
->
length
()
==
1
);
// количество датчиков с порогами = 1 (это aid)
// 3 порога мы создали выше(askThreshold) + 1 который в настроечном файле в секции <thresholds>
REQUIRE
(
slist
[
0
].
tlist
.
length
()
==
4
);
...
...
include/Configuration.h
View file @
90f84c13
...
...
@@ -160,7 +160,7 @@ namespace uniset
/*! интерфейс к карте объектов */
std
::
shared_ptr
<
ObjectIndex
>
oind
;
/*! интерфейс к работе с локальным
м
и ior-файлами */
/*! интерфейс к работе с локальными ior-файлами */
std
::
shared_ptr
<
IORFile
>
iorfile
;
/*! указатель на конфигурационный xml */
...
...
include/DBServer.h
View file @
90f84c13
...
...
@@ -34,7 +34,7 @@ namespace uniset
\section secDBServer Сервис ведения БД
\subsection subDBS_common Общие сведения
Предназначен для работы с БД.
Основная задача это - сохрание информации о датчиках, ведение журнала сообщений.
Основная задача это - сохран
ен
ие информации о датчиках, ведение журнала сообщений.
\subsection subDBS_idea Сценарий работы
На узле, где ведётся БД запускается один экземпляр сервиса. Клиенты могут получить доступ, несколькими способами:
...
...
include/DebugStream.h
View file @
90f84c13
...
...
@@ -136,7 +136,7 @@ class DebugStream : public std::ostream
return
fname
;
}
// имя лог файла можно установить отдельно, но не вклчать запись..
// имя лог файла можно установить отдельно, но не вкл
ю
чать запись..
inline
void
setLogFile
(
const
std
::
string
&
n
)
noexcept
{
fname
=
n
;
...
...
include/EventLoopServer.h
View file @
90f84c13
...
...
@@ -29,7 +29,7 @@ namespace uniset
virtual
void
evfinish
()
{}
// подготовка перед запуском loop
// запусу своих ev::xxx.start()
// запус
к
у своих ev::xxx.start()
virtual
void
evprepare
()
{}
// Управление потоком событий
...
...
include/HourGlass.h
View file @
90f84c13
...
...
@@ -33,7 +33,7 @@ namespace uniset
песок сыплется... если весь пересыпался - срабатывает условие 'check()==true'.
Если во время работы условие изменилось (часы перевернули в обратную сторону), то
уже успевший пересыпаться песок, начинает пересыпаться в обратную сторону. Если опять
повернули часы... продолжает сыпаться опять (добвляясь к тому песку, что "не успел" высыпаться обратно).
повернули часы... продолжает сыпаться опять (доб
а
вляясь к тому песку, что "не успел" высыпаться обратно).
Т.е. до момента срабатывания уже меньше времени чем "полное время" и т.д.
Класс является "пассивным", т.е. требует периодического вызова функции rotate и check,
...
...
@@ -42,7 +42,7 @@ namespace uniset
\par Пример использования.
Допустим у вас есть сигнал "температура"(in_temp) и вам необходимо выставить какой-то
флаг о перегреве (isOverheating).
Если температура продержит
ь
ся выше порога в течение 10 секунд check() станет "true".
Если температура продержится выше порога в течение 10 секунд check() станет "true".
Если температура станет меньше порога через 6 секунд ("песок начнёт обратно пересыпаться"),
а потом опять станет выше, то до срабатывания check() == true уже останется 4 сек, а не 10 сек.
Получается, что для срабатывания check()=true сигнал должен не колеблясь держаться больше заданного времени.
...
...
include/IOConfig_XML.h
View file @
90f84c13
...
...
@@ -72,7 +72,7 @@ namespace uniset
UniXML::iterator& it, xmlNode* sec)
uxml - интерфейс для работы с xml-файлом
it - и
н
тератор(указатель) на текущий считываемый xml-узел (item)
it - итератор(указатель) на текущий считываемый xml-узел (item)
sec - указатель на корневой узел секции (SubscriberList)
*/
void
setReadItem
(
ReaderSlot
sl
);
...
...
@@ -86,7 +86,7 @@ namespace uniset
UniXML::iterator& it, xmlNode* sec)
uxml - интерфейс для работы с xml-файлом
it - и
н
тератор(указатель) на текущий считываемый xml-узел (<consumer>)
it - итератор(указатель) на текущий считываемый xml-узел (<consumer>)
sec - указатель на текущий узел сообщения (<item>)
*/
void
setReadConsumerItem
(
ReaderSlot
sl
);
...
...
@@ -118,7 +118,7 @@ namespace uniset
bool xxxMyClass::myfunc(UniXML& xml,
UniXML::iterator& it, xmlNode* sec)
uxml - интерфейс для работы с xml-файлом
it - и
н
тератор(указатель) на текущий считываемый xml-узел (<sensor>)
it - итератор(указатель) на текущий считываемый xml-узел (<sensor>)
sec - указатель на корневой узел секции (<threshold>)
*/
void
setReadThresholdItem
(
ReaderSlot
sl
);
...
...
include/IOController.h
View file @
90f84c13
...
...
@@ -118,7 +118,7 @@ namespace uniset
static
const
long
not_specified_value
=
{
std
::
numeric_limits
<
long
>::
max
()
};
// ================== Дост
пу
ные сигналы =================
// ================== Дост
уп
ные сигналы =================
/*!
// \warning В сигнале напрямую передаётся указатель на внутреннюю структуру!
// Это не очень хорошо, с точки зрения "архитектуры", но оптимальнее по быстродействию!
...
...
@@ -137,7 +137,7 @@ namespace uniset
ChangeUndefinedStateSignal
signal_change_undefined_state
(
uniset
::
ObjectId
sid
);
ChangeUndefinedStateSignal
signal_change_undefined_state
();
// -----------------------------------------------------------------------------------------
// полнейшее нарушение икапсуляции
// полнейшее нарушение и
н
капсуляции
// но пока, это попытка оптимизировать работу с IOController через указатель.
// Т.е. работая с датчиками через итераторы..
#if 1
...
...
@@ -313,7 +313,7 @@ namespace uniset
void
*
getUserData
(
size_t
index
);
void
setUserData
(
size_t
index
,
void
*
data
);
// сигнал для реализации механизма зависимост
и
ей..
// сигнал для реализации механизма зависимостей..
// (все зависимые датчики подключаются к нему (см. NCRestorer::init_depends_signals)
uniset
::
uniset_rwmutex
changeMutex
;
ChangeSignal
sigChange
;
...
...
include/IONotifyController.h
View file @
90f84c13
...
...
@@ -56,9 +56,9 @@ namespace uniset
"заказчики" уведомляют \b IONC об изменении какого именно датчика они хотят получать уведомление,
после чего, если данный датчик меняет своё состояние, заказчику посылается
сообщение uniset::SensorMessage содержащее информацию о текущем(новом) состоянии датчика,
времени изменения и т.п. В случае необходимости можно отказатся от уведомления.
времени изменения и т.п. В случае необходимости можно отказат
ь
ся от уведомления.
Для заказа датчиков предусмотрен ряд функций. На данный момент рекомендуется
пользоватся функцией IONotifyController::askSensor.
пользоват
ь
ся функцией IONotifyController::askSensor.
\b ConsumerMaxAttempts - максимальное число неудачных попыток послать сообщение "заказчику".
Настраивается в конфигурационном файле. По умолчанию = 5.
...
...
@@ -112,7 +112,7 @@ namespace uniset
в AI11_AS будет записано значение -50. Как только Input4_S=1 в AI11_AS - появиться его истинное значение.
\note Следует иметь ввиду, что для \b ЗАВИСИМОГО датчика функция setValue(..) действует как обычно и
даже если он "заблокирован", значение в него можно сохранять. Оно "появиться" как только снимет
ь
ся блокировка.
даже если он "заблокирован", значение в него можно сохранять. Оно "появиться" как только снимется блокировка.
\section sec_NC_Optimization Оптимизация работы со списком "заказчиков"
Для оптимизации поиска списка заказчиков для конкретного датчика используется поле userdata (void*) у USensorInfo!
...
...
include/LogAgregator.h
View file @
90f84c13
...
...
@@ -134,7 +134,7 @@ namespace uniset
{
public
:
const
std
::
string
sep
=
{
"/"
};
/*< разде
д
итель для имён подчинённых агрегаторов */
const
std
::
string
sep
=
{
"/"
};
/*< разде
л
итель для имён подчинённых агрегаторов */
explicit
LogAgregator
(
const
std
::
string
&
name
,
Debug
::
type
t
);
explicit
LogAgregator
(
const
std
::
string
&
name
=
""
);
...
...
include/LogServer.h
View file @
90f84c13
...
...
@@ -82,7 +82,7 @@ namespace uniset
...
\endcode
\warning Логи отдаются "клиентам" только цел
о
иком строкой. Т.е. по сети информация передаваться не будет пока не будет записан "endl".
\warning Логи отдаются "клиентам" только целиком строкой. Т.е. по сети информация передаваться не будет пока не будет записан "endl".
Это сделано для "оптимизации передачи" (чтобы не передавать каждый байт)
\warning Т.к. LogServer в основном только отдаёт "клиентам" логи, то он реализован с использованием CommonEventLoop,
...
...
include/MessageType.h
View file @
90f84c13
...
...
@@ -207,7 +207,7 @@ namespace uniset
// ------------------------------------------------------------------------
/*! Собщение о срабатывании таймера */
/*! Со
о
бщение о срабатывании таймера */
class
TimerMessage
:
public
Message
{
public
:
...
...
include/ObjectRepository.h
View file @
90f84c13
...
...
@@ -101,7 +101,7 @@ namespace uniset
*/
bool
list
(
const
std
::
string
&
section
,
uniset
::
ListObjectName
*
ls
,
size_t
how_many
=
300
)
const
;
/*! Получние списка how_many подсекций из секции in_section.
/*! Получ
е
ние списка how_many подсекций из секции in_section.
* throw(uniset::ORepFailed);
*/
bool
listSections
(
const
std
::
string
&
in_section
,
uniset
::
ListObjectName
*
ls
,
size_t
how_many
=
300
)
const
;
...
...
include/PassiveTimer.h
View file @
90f84c13
...
...
@@ -111,7 +111,7 @@ namespace uniset
virtual
void
terminate
()
noexcept
override
;
/*!< прервать работу таймера */
protected
:
timeout_t
t_msec
=
{
0
};
/*!< интервал таймера, в милисекундах (для "пользователей") */
timeout_t
t_msec
=
{
0
};
/*!< интервал таймера, в мил
л
исекундах (для "пользователей") */
// Т.к. НЕ ВЕСЬ КОД переведён на использование std::chrono
// везде используется timeout_t (и WaitUpTime)
...
...
include/Pulse.h
View file @
90f84c13
...
...
@@ -37,7 +37,7 @@ namespace uniset
public
:
// t1_msec - интервал "вкл"
// t0_msec - интер
ф
ал "откл"
// t0_msec - интер
в
ал "откл"
inline
void
run
(
timeout_t
_t1_msec
,
timeout_t
_t0_msec
)
noexcept
{
setTiming
(
_t1_msec
,
_t0_msec
,
true
);
...
...
include/UHelpers.h
View file @
90f84c13
...
...
@@ -79,7 +79,7 @@ namespace uniset
}
// -----------------------------------------------------------------------------
// Просто обёртка для удобства вывода сообщений об ошибке в лог "объекта"..
// "по задумке" позволяет не загром
а
ждать код..
// "по задумке" позволяет не загром
о
ждать код..
// T - тип создаваемого объекта
// M - (master) - класс который создаёт объект (подразумевается, что он UniSetManager)
// Использование
...
...
include/UniSetActivator.h
View file @
90f84c13
...
...
@@ -91,7 +91,7 @@ namespace uniset
#ifndef DISABLE_REST_API
// Подд
ре
жка REST API (IHttpRequestRegistry)
// Подд
ер
жка REST API (IHttpRequestRegistry)
virtual
Poco
::
JSON
::
Object
::
Ptr
httpGetByName
(
const
std
::
string
&
name
,
const
Poco
::
URI
::
QueryParameters
&
p
)
override
;
virtual
Poco
::
JSON
::
Array
::
Ptr
httpGetObjectsList
(
const
Poco
::
URI
::
QueryParameters
&
p
)
override
;
virtual
Poco
::
JSON
::
Object
::
Ptr
httpHelpByName
(
const
std
::
string
&
name
,
const
Poco
::
URI
::
QueryParameters
&
p
)
override
;
...
...
include/UniSetManager.h
View file @
90f84c13
...
...
@@ -68,7 +68,7 @@ namespace uniset
return
uniset
::
ObjectType
(
"UniSetManager"
);
}
// ------ функции объявлен
н
ые в интерфейсе(IDL) ------
// ------ функции объявленые в интерфейсе(IDL) ------
virtual
void
broadcast
(
const
uniset
::
TransportMessage
&
msg
)
override
;
virtual
uniset
::
SimpleInfoSeq
*
getObjectsInfo
(
CORBA
::
Long
MaxLength
=
300
,
const
char
*
userparam
=
0
)
override
;
...
...
include/UniSetObject.h
View file @
90f84c13
...
...
@@ -84,7 +84,7 @@ namespace uniset
UniSetObject
();
virtual
~
UniSetObject
();
// Функции объявлен
н
ые в IDL
// Функции объявленые в IDL
virtual
CORBA
::
Boolean
exist
()
override
;
virtual
uniset
::
ObjectId
getId
()
override
;
...
...
include/modbus/ModbusRTUErrors.h
View file @
90f84c13
...
...
@@ -34,7 +34,7 @@ namespace uniset
erBadCheckSum
=
112
,
/*!< У пакета не сошлась контрольная сумма */
erBadReplyNodeAddress
=
113
,
/*!< Ответ на запрос адресован не мне или от станции, которую не спрашивали */
erTimeOut
=
114
,
/*!< Тайм-аут при приеме ответа */
erPacketTooLong
=
115
,
/*!< пакет длинее буфера приема */
erPacketTooLong
=
115
,
/*!< пакет длин
н
ее буфера приема */
erSessionClosed
=
116
/*!< соединение закрыто */
};
...
...
include/modbus/ModbusRTUSlave.h
View file @
90f84c13
...
...
@@ -18,7 +18,7 @@ namespace uniset
Класс не самостоятельный и содержит "чисто" виртуальные функции
для реализации ответов на запросы.
\todo Разобратся с тем как отвечать на неправильные запросы!
\todo Разобрат
ь
ся с тем как отвечать на неправильные запросы!
Формат ответных сообщений!!! Коды ошибок!!!
\todo Доработать terminate, чтобы можно было прервать ожидание
\todo Перейти на libev..
...
...
include/modbus/ModbusTCPServer.h
View file @
90f84c13
...
...
@@ -20,11 +20,11 @@ namespace uniset
{
// -------------------------------------------------------------------------
/*! ModbusTCPServer
* Реализация сервера на основе libev. Подерживается "много" соединений (постоянных).
* Реализация сервера на основе libev. Под
д
ерживается "много" соединений (постоянных).
* Хоть класс и наследуется от ModbusServer на самом деле он не реализует его функции,
* каждое соединение обслуживается классом ModbusTCPSession.
* Но собственно реализаия функций одна на всех, это следует учитывать при реализации обработчиков,
* т.к.из многих "соединений" будут вызываться одни и те
же обработа
тчики.
* Но собственно реализа
ц
ия функций одна на всех, это следует учитывать при реализации обработчиков,
* т.к.из многих "соединений" будут вызываться одни и те
же обрабо
тчики.
*/
class
ModbusTCPServer
:
public
EventLoopServer
,
...
...
@@ -34,7 +34,7 @@ namespace uniset
ModbusTCPServer
(
const
std
::
string
&
addr
,
int
port
=
502
);
virtual
~
ModbusTCPServer
();
/*! Запуск сервера. Функция не возвращет управление.
/*! Запуск сервера. Функция не возвращ
а
ет управление.
* Но может быть прервана вызовом terminate()
* \return FALSE - если не удалось запустить
*/
...
...
include/modbus/ModbusTCPSession.h
View file @
90f84c13
...
...
@@ -28,7 +28,7 @@ namespace uniset
* а обработку делать по мере достаточного накопления данных во входной очереди, но это требует асинхронный
* парсинг данных протокола modbus (т.е. мы анализируем очередной байт и решаем сколько нам нужно ещё
* "подождать" данных.. чтобы пойти на следующий шаг), это в результате будет слишком сложная реализация.
* В конце-концов пока нет рас
с
чёта на >1000 подключений (хотя libev позволяет держать >10k).
* В конце-концов пока нет расчёта на >1000 подключений (хотя libev позволяет держать >10k).
*/
class
ModbusTCPSession
:
public
ModbusServerSlot
,
...
...
include/modbus/ModbusTypes.h
View file @
90f84c13
...
...
@@ -1544,7 +1544,7 @@ namespace uniset
/*! проверка корректности данных */
bool
checkFormat
()
const
;
// это поле служебное и не используется в ре
л
альном обмене
// это поле служебное и не используется в реальном обмене
size_t
count
=
{
0
};
/*!< фактическое количество данных */
};
...
...
src/Communications/Modbus/ModbusTypes.cc
View file @
90f84c13
...
...
@@ -3011,7 +3011,7 @@ namespace uniset
return
"Неожидаемый тип пакета"
;
case
erPacketTooLong
:
return
"пакет длинее буфера приема"
;
return
"пакет длин
н
ее буфера приема"
;
case
erHardwareError
:
return
"ошибка оборудования"
;
...
...
src/Various/UniXML.cc
View file @
90f84c13
...
...
@@ -255,7 +255,7 @@ xmlNode* UniXML::copyNode(xmlNode* node, int recursive)
спасает только такое вот дополнительное копирование списка свойств
\bug Непонятный параметр 'target'
- при указании NULL нормально работает
- при указании copynode - проблем
м
ы с русским при сохранении
- при указании copynode - проблемы с русским при сохранении
- при указании node - SEGFAULT при попытке удалить исходный(node) узел
\todo "Нужно тест написать на copyNode"
*/
...
...
tests/test_delaytimer.cc
View file @
90f84c13
...
...
@@ -130,7 +130,7 @@ TEST_CASE("[DelayTimer]: debounce", "[DelayTimer]" )
CHECK_FALSE
(
dt
.
check
(
false
)
);
CHECK_FALSE
(
dt
.
get
()
);
// проверяем срабатвание (одноразовый скачок)
// проверяем срабат
ы
вание (одноразовый скачок)
CHECK_FALSE
(
dt
.
check
(
true
)
);
CHECK_FALSE
(
dt
.
check
(
false
)
);
msleep
(
160
);
...
...
wrappers/core/UModbus.h
View file @
90f84c13
...
...
@@ -44,7 +44,7 @@ class UModbus
return
uniset
::
ModbusRTU
::
isWriteFunction
((
uniset
::
ModbusRTU
::
SlaveFunctionCode
)
mbfunc
);
}
// выставление паметров связи, без установления соединения (!)
// выставление па
ра
метров связи, без установления соединения (!)
void
prepare
(
const
std
::
string
&
ip
,
int
port
)
throw
(
UException
);
void
connect
(
const
std
::
string
&
ip
,
int
port
)
throw
(
UException
);
...
...
wrappers/core/UProxyObject.h
View file @
90f84c13
...
...
@@ -34,7 +34,7 @@ class UProxyObject_impl; // PIMPL
* Перед активацией объекта необходимо при помощи addToAsk() добавить список датчиков,
* за которыми требуется "следить". После активации ( см. PyUInterface uniset_activate_objects() )
* (в асинхронном режиме!) объект заказывает датчики и сохраняет у себя их состояние.
* При этом "снаружи" можно запросить значение ранее добавленного датчика при помощи фунции getValue().
* При этом "снаружи" можно запросить значение ранее добавленного датчика при помощи фун
к
ции getValue().
* Помимо этого можно изменять состояние датчиков (в SM!) при помощи setValue().
* По сути setValue() просто дублирует функциональность PyUInterface::setValue()
*/
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment