Commit febdab20 authored by Vitaly Lipatov's avatar Vitaly Lipatov

recode all files to utf8, fix doxygen input encoding

parent 1e9c8d73
......@@ -164,17 +164,17 @@
2007-03-21 19:12 vpashka
* include/modbus/ModbusSlave.h,
src/Communications/Modbus/ModbusSlave.cc:
broadcast
src/Communications/Modbus/ModbusSlave.cc: отключил по умолчанию
работу с broadcast
2007-02-24 17:03 vpashka
* include/: PosixThread.h: (
cygwin)
* include/: PosixThread.h: подправил ошибку (проявившуюся при
компиляции в cygwin)
2007-02-20 00:54 vpashka
* src/Services/InfoServer.cc:
* src/Services/InfoServer.cc: немного оптимизировал вывод лога
2007-02-18 14:01 vpashka
......@@ -353,8 +353,8 @@
2007-01-12 18:01 vpashka
* include/ComPort.h, src/IOs/ComPort.cc:
* include/ComPort.h, src/IOs/ComPort.cc: Встроил предварительную
версию функции очистки буфера
2007-01-12 01:22 vpashka
......@@ -597,8 +597,8 @@
2007-01-03 22:22 vpashka
* include/IONotifyController.h,
src/Processes/IONotifyController.cc:
src/Processes/IONotifyController.cc: удалил неиспользуемый
параметр функции
2007-01-03 20:02 vpashka
......@@ -918,8 +918,8 @@
2006-10-27 16:57 vitlav
* src/Timers/PassiveTimer.cc: CLK_TCK (
)
* src/Timers/PassiveTimer.cc: замечание по CLK_TCK (не
использовать)
2006-10-14 20:53 vpashka
......@@ -937,7 +937,7 @@
2006-10-01 14:55 vpashka
* src/ObjectRepository/UniSetObject.cc, include/UniSetObject.h:
)
Переделана функция очистки очереди (введён прямой доступ)
2006-07-30 17:10 vitlav
......@@ -957,7 +957,7 @@
2006-05-26 21:44 vitlav
* src/IOs/ComPort.cc:
* src/IOs/ComPort.cc: добавлены комментарии по коду
2006-05-19 01:10 vpashka
......@@ -1632,7 +1632,7 @@
Communications/Modbus/ModbusRTUExchange.cc,
IOs/AnalogCard_AI165A.cc, IOs/ComPort.cc,
IOs/DigitalCard_O5600.cc, IOs/Makefile, IOs/Makefile.am,
IOs/___IO.txt, Interfaces/DBInterface.cc,
IOs/предложение_по_организации_IO.txt, Interfaces/DBInterface.cc,
Interfaces/Makefile, Interfaces/Makefile.am,
Interfaces/UniversalIOController.cc,
Interfaces/UniversalInterface.cc: update to current version
......@@ -1928,8 +1928,8 @@
src/Various/MessageType.cc, src/Various/Mutex.cc,
src/Various/RunLock.cc, src/Various/SViewer.cc,
src/Various/SystemGuard.cc, src/Various/TextFileIndex.cc,
src/Various/TextIndex.cc, src/Various/UniXML.cc:
src/Various/TextIndex.cc, src/Various/UniXML.cc: Очередной виток
исправлений и дополнений
2004-03-28 14:27 vpashka
......@@ -1964,8 +1964,8 @@
ObjectRepository/ProxyManager.cc,
ObjectRepository/ServiceActivator.cc,
ObjectRepository/UniSetObject.cc, Processes/IOController.cc,
Processes/IONotifyController.cc:
Processes/IONotifyController.cc: Измененены комментарии
Подправлены ошибки
2004-03-27 00:27 vpashka
......@@ -1983,17 +1983,17 @@
TriggerAND.h, TriggerAND_template.h, TriggerOR.h,
TriggerOR_template.h, TriggerOutput.h, TriggerOutput_template.h,
UniSetObject.h, UniXML.h, UniversalIOController.h,
UniversalInterface.h, config.h, config.h.in:
,
UniversalInterface.h, config.h, config.h.in: Внесены новые
коментарии, а также исправлены некоторые ошибки
2004-03-27 00:23 vpashka
* include/BaseObjectTypes.hh: ,
.. IDL
* include/BaseObjectTypes.hh: добавлен в репозиторий по ошибке,
он не нужен т.к. генерируется из IDL
2004-03-27 00:22 vpashka
* src/ObjectRepository/ObjectIndex.cc.new: ̣
* src/ObjectRepository/ObjectIndex.cc.new: Удалён за ненадобностью
2004-03-11 01:44 vitlav
......@@ -2015,7 +2015,7 @@
conf/setting, lib/Makefile, src/Makefile,
src/IOs/AnalogCard_AI165A.cc, src/IOs/ComPort.cc,
src/IOs/DigitalCard_O5600.cc, src/IOs/Makefile,
src/IOs/___IO.txt,
src/IOs/предложение_по_организации_IO.txt,
src/Interfaces/DBInterface.cc, src/Interfaces/Makefile,
src/Interfaces/UniversalIOController.cc,
src/Interfaces/UniversalInterface.cc,
......@@ -2101,7 +2101,7 @@
conf/setting, lib/Makefile, src/Makefile,
src/IOs/AnalogCard_AI165A.cc, src/IOs/ComPort.cc,
src/IOs/DigitalCard_O5600.cc, src/IOs/Makefile,
src/IOs/___IO.txt,
src/IOs/предложение_по_организации_IO.txt,
src/Interfaces/DBInterface.cc, src/Interfaces/Makefile,
src/Interfaces/UniversalIOController.cc,
src/Interfaces/UniversalInterface.cc,
......
......@@ -2,11 +2,11 @@
# This file is part of the UniSet library #
############################################################################
# CC- HH-
# Каталоги для размещения генерируемых CC- и HH-файлов соответственно
CCDIR=$(top_builddir)/src/Processes
HHDIR=$(top_builddir)/include
# IDL
# Исходные файлы IDL
IDLFILES=IOController_i.idl
#UniSetObserver_i.idl
......
......@@ -30,11 +30,11 @@
// --------------------------------------------------------------------------------------------------------------
/*!
* \interface UniSetObserver_i
* \brief ""
* \brief шаблон "Наблюдатель"
*/
interface UniSetObserver_i
{
//
// исключения
exception NameNotFound
{
string err;
......
......@@ -31,11 +31,11 @@
// --------------------------------------------------------------------------
/*!
* \interface DBServer_i
* \brief éÎÔÅÒÆÅÊÓ ÓÅÒ×ÅÒÁ ÂÁÚÙ ÄÁÎÎÙÈ ÓÉÓÔÅÍÙ
* \brief Интерфейс сервера базы данных системы
*/
interface DBServer_i: UniSetObject_i
{
// ÉÓËÌÀÞÅÎÉÑ
// исключения
exception DBError
{
string errmsg;
......
......@@ -31,26 +31,26 @@
// --------------------------------------------------------------------------
/*!
* \interface InfoServer_i
* \brief
* \brief Интерфейс к серверу сообщений
*/
interface InfoServer_i: UniSetObject_i
{
//
// исключения
exception MsgNotFound
{
UniSetTypes::MessageCode bad_code;
};
//
// исключения
exception MsgBadRange
{
};
/*! */
/*! Заказ информации о приходе сообщения */
void ackMessage(in UniSetTypes::MessageCode mid, in UniSetTypes::ConsumerInfo ci,
in UniversalIO::UIOCommand cmd, in boolean acknotify ) raises(MsgNotFound);
/*! */
/*! Заказ информации о приходе сообщений из диапазона */
void ackMessageRange(in UniSetTypes::MessageCode from, in UniSetTypes::MessageCode to,
in UniSetTypes::ConsumerInfo ci,
in UniversalIO::UIOCommand cmd, in boolean acknotify ) raises(MsgNotFound,MsgBadRange);
......
......@@ -2,11 +2,11 @@
# This file is part of the UniSet library #
############################################################################
# CC- HH-
# Каталоги для размещения генерируемых CC- и HH-файлов соответственно
CCDIR=$(top_builddir)/src/Services
HHDIR=$(top_builddir)/include
# IDL
# Исходные файлы IDL
IDLFILES=TimerService_i.idl InfoServer_i.idl
include $(top_builddir)/conf/idl.mk
......
......@@ -30,15 +30,15 @@
// --------------------------------------------------------------------------------------------------------------
/*!
* \interface RepositoryAgent_i
* \brief
* .
* ,
* , . .
* \brief Интерфейс агента репозитория
* Агент репозитрория предназначен для получения доступа к объектам с удаленных узлов.
* Он запускается на каждом узле, и с других узлов через него можно получить доступ
* к процессам, датчикам и т.п на данном узле.
*/
interface RepositoryAgent_i: UniSetObject_i
{
//
// исключения
exception NameNotFound
{
string errmsg;
......
......@@ -34,23 +34,23 @@
*/
interface TimerService_i: UniSetObject_i
{
/*!
*
/*! Превышения максимально возможного
* количества таймеров
*/
exception LimitTimers
{
long maxTimers;
};
/*! id
* ( )
/*! Таймер с таким id уже заказан
* (от данного заказчика)
*/
exception TimerAlreadyExist
{
};
/*!
* ۣ
/*! Задан интервал меньше
* минимально разрешённого
*/
exception TimeMSLowLimit
{
......@@ -58,7 +58,7 @@ interface TimerService_i: UniSetObject_i
};
/*! */
/*! Информация о таймере */
struct Timer
{
UniSetTypes::TimerId timerid;
......@@ -68,7 +68,7 @@ interface TimerService_i: UniSetObject_i
};
/*! */
/*! заказ таймера */
void askTimer( in Timer ti, in UniSetTypes::ConsumerInfo ci )
raises(LimitTimers, TimerAlreadyExist, TimeMSLowLimit);
......
......@@ -2,11 +2,11 @@
# This file is part of the UniSet library #
############################################################################
# CC- HH-
# Каталоги для размещения генерируемых CC- и HH-файлов соответственно
CCDIR=$(top_builddir)/src/ObjectRepository
HHDIR=$(top_builddir)/include
# IDL
# Исходные файлы IDL
IDLFILES=UniSetTypes_i.idl UniSetObject_i.idl ObjectsManager_i.idl
include $(top_builddir)/conf/idl.mk
......
......@@ -34,33 +34,33 @@
/*!
* \interface ObjectsManager_i
* \brief
* \brief Интерфейс менеджера объектов
* \author Pavel Vainerman
* \version
* \date September 2001-
*
* .
* .
* Базовый класс для менеджеров объектов. Позволяет посылать сообщение
* ко всем объектам сразу.
*/
interface ObjectsManager_i : UniSetObject_i
{
/*!< */
/*!< распространить сообщение всем подчиненным объектам */
void broadcast(in UniSetTypes::TransportMessage msg);
/*! ()
* \param MaxLength -
* SimpleInfo.
* \note
* MaxLength,
* MaxLength . <=,
* .
* \note .
* ,
*
* .. .. ... MaxLength
* .
* \todo ,
* ( >1000 ) ...
/*! получение информации о состоянии подчиненных объектов(менеджеров)
* \param MaxLength - ограничение размера возвращаемой
* последовательности структур SimpleInfo.
* \note Если у менеджера количество подчиненных объектов
* больше MaxLength, то он вернет информацию только
* о первых MaxLength объектах. Если <=, то количество
* равное количеству объектов.
* \note Возвращаемые данные содержат в себе инфо. о всех
* подчиненных объектах данного менеджера, а также объектах
* подчиненных данному менеджеру менеджерах и их объектах
* и т.п. и т.п. рекурсивно... Так что MaxLength должно быть
* достаточным.
* \todo Подумать насчет применения итератора, при слишком
* большом( >1000 ) количестве подчиненных объектов...
*/
UniSetTypes::SimpleInfoSeq getObjectsInfo( in long MaxLength );
};
......
......@@ -33,21 +33,21 @@
//{
/*!
* \interface UniSetObject_i
* \brief
* \brief Базовый интерфес для всех объектов
* \author Pavel Vainerman
*
* . .
* Первичный базовый класс. Праролитель всех объектов в системе.
*
*/
interface UniSetObject_i
{
UniSetTypes::ObjectId getId(); /*!< */
UniSetTypes::ObjectType getType(); /*!< */
UniSetTypes::SimpleInfo getInfo(); /*!< */
UniSetTypes::ObjectId getId(); /*!< получение идентификатора объекта */
UniSetTypes::ObjectType getType(); /*!< получение типа объекта */
UniSetTypes::SimpleInfo getInfo(); /*!< получение информации о внутреннем состоянии объекта */
boolean exist(); /*!< */
boolean exist(); /*!< проверка существования объекта */
/*! */
/*! Функция посылки сообщения объекту */
void push(in UniSetTypes::TransportMessage msg);
};
......
......@@ -31,20 +31,20 @@
module UniSetTypes
{
typedef string<100> BaseObjectName;
typedef long ObjectId; /*!< */
typedef long MessageCode; /*!< */
typedef long ThresholdId; /*!< */
typedef long TimerId; /*!< */
typedef string<30> ObjectType; /*!< */
typedef long ObjectId; /*!< идентификатор объекта */
typedef long MessageCode; /*!< код сообщения */
typedef long ThresholdId; /*!< идентификатор порога */
typedef long TimerId; /*!< идентификатор таймера */
typedef string<30> ObjectType; /*!< тип объекта */
typedef octet ByteOfMessage; /*!< */
typedef ByteOfMessage RawDataOfTransportMessage[100]; /*!< */
typedef octet ByteOfMessage; /*!< тип для одного байта сообщения */
typedef ByteOfMessage RawDataOfTransportMessage[100]; /*!< данные в сообщении */
/*!
*
* Структура пакета предназначенного для пересылки по сети
* \par
* .
* .
* Сообщения любого типа должны непосредственно перед отправкой приводится к этому типу.
* Все функции занимающиеся фактической пересылкой сообщений должны работать с этим типом сообщения.
*/
struct TransportMessage
{
......@@ -53,7 +53,7 @@
/*!
*
* Информация об узле
*/
struct NodeInfo
{
......@@ -65,7 +65,7 @@
string port;
};
/*! */
/*! информация об объекте */
struct SimpleInfo
{
ObjectId id;
......@@ -75,15 +75,15 @@
typedef sequence<SimpleInfo> SimpleInfoSeq;
/*! */
/*! Информация о заказчике */
struct ConsumerInfo
{
ObjectId id; /*!< */
ObjectId node; /*!< */
ObjectId id; /*!< идентификатор заказчика */
ObjectId node; /*!< узел на котором он находится */
};
/*! */
/*! Список идентификаторов */
typedef sequence<ObjectId> IDSeq;
......@@ -93,7 +93,7 @@
module UniversalIO
{
/*!
* /
* Типы входов/выходов
*/
enum IOTypes
{
......@@ -104,13 +104,13 @@
AnalogOutput
};
/*! / */
/*! Разрешенные команды для всех контроллеров ввода/вывода */
enum UIOCommand
{
UIONotify, /*!< */
UIODontNotify, /*!< */
UIONotifyChange, /*!< , ( ) */
UIONotifyFirstNotNull /*!< . , "0" */
UIONotify, /*!< заказать получение информации */
UIODontNotify, /*!< отказаться от получения информации */
UIONotifyChange, /*!< заказ информации, только после изменения (без первого уведомления о текущем состоянии) */
UIONotifyFirstNotNull /*!< заказ информации. Первое уведомление, только если датчик не "0" */
};
}; // end of module UniversalIO
......
()
UniXML ,
LDFLAGS configure
LIBS
Компиляция с отладкой
Сделать возможность вывода в программе вывода версии (коммита) сборки
Перевести использование UniXML на итератор, итератор должен быть нормальным
убрать из LDFLAGS в configure библиотеки
ввести для этих целей LIBS
PLCNet
Внести в проект реализацию PLCNet
- "uniset-check"
(saveState/Value, getState/Value), setState/Value ..)
- написать "uniset-check" автоматический тест основных функций
(saveState/Value, getState/Value), setState/Value и т.п.)
- , Debug syslog ( ݣ )
- сделать, чтобы можно было Debug пускать через syslog (да ещё и на другую машину)
- (IOR) ...
( IORFile omniNames).
- Подумать и реализовать механизм хранения ссылок (IOR) с использованием разделяемой памяти...
(сейчас есть IORFile и omniNames).
- ObjectIndex_ArrayXML. .. vector, XML.
- Сделать ObjectIndex_ArrayXML. т.е. использовать vector, при этом считывая индексы из XML.
- sstream str(), ss.rdbuf()->freeze(0);
- Везде где используется sstream и вызов str(), надо делать ss.rdbuf()->freeze(0);
(http://www.intuit.ru/department/pl/cpp/17/2.html)
IOController_i::SensorInfo UniSetTypes
( ConsumerInfo ..). uniset-codegen,
SensorInfo ObjectId.
Вынести IOController_i::SensorInfo просто в UniSetTypes
(там же где ConsumerInfo и т.п.). И перевести uniset-codegen,
на использование структуры SensorInfo вместо ObjectId.
----------
smonit: processing "precision"
admin: processing "precision"
Встроить в SM возможность заказать переодичность уведомления по аналоговым
(или любым) датчикам.
\ No newline at end of file
п▓я│я┌я─п╬п╦я┌я▄ п╡ SM п╡п╬п╥п╪п╬п╤п╫п╬я│я┌я▄ п╥п╟п╨п╟п╥п╟я┌я▄ п©п╣я─п╣п╬п╢п╦я┤п╫п╬я│я┌я▄ я┐п╡п╣п╢п╬п╪п╩п╣п╫п╦я▐ п©п╬ п╟п╫п╟п╩п╬пЁп╬п╡я▀п╪
(п╦п╩п╦ п╩я▌п╠я▀п╪) п╢п╟я┌я┤п╦п╨п╟п╪.
\ No newline at end of file
#!/bin/sh
#
# Создание необходимых ссылок
ln -s -f admin.sh start
ln -s -f admin.sh exist
......
......@@ -94,7 +94,7 @@ bool DBInterface::query(const string q)
lastQ = q;
result = mysql_store_result(mysql); // _use_result - _num_rows
result = mysql_store_result(mysql); // _use_result - некорректно работает с _num_rows
if( numRows()==0 )
{
queryok=false;
......@@ -222,8 +222,8 @@ bool DBInterface::ping()
if(!mysql)
return false;
// mysql_ping 0
// ӣ .... ( )
// внимание mysql_ping возвращает 0
// если всё хорошо.... (поэтому мы инвертируем)
return !mysql_ping(mysql);
}
// -----------------------------------------------------------------------------------------
......
......@@ -28,7 +28,7 @@
// ---------------------------------------------------------------------------
#include <string>
#include <iostream>
//#warning mysql_create define USE_OLD_FUNCTIONS
//#warning Для использования mysql_create нужен define USE_OLD_FUNCTIONS
//#define USE_OLD_FUNCTIONS
#include <mysql/mysql.h>
using std::string;
......@@ -56,12 +56,12 @@ class DBInterface
string addslashes(const string& str);
/*!
.
...
проверка связи с БД.
в случае отсутсвия попытка восстановить...
*/
bool ping();
/*! () */
/*! связь с БД установлена (была) */
bool isConnection();
bool nextRecord();
......@@ -88,7 +88,7 @@ class DBInterface
MYSQL_RES *result;
MYSQL *mysql;
string lastQ;
bool queryok; //
bool queryok; // успешность текущего запроса
};
// ----------------------------------------------------------------------------------
#endif
......@@ -18,7 +18,7 @@
*/
// --------------------------------------------------------------------------
/*! \file
* \brief DB-
* \brief файл реализации DB-сервера
* \author Pavel Vainerman
* \date $Date: 2009/02/26 19:55:37 $
* \version $Id: DBServer_MySQL.cc,v 1.10 2009/02/26 19:55:37 vpashka Exp $
......@@ -51,7 +51,7 @@ DBServer_MySQL::DBServer_MySQL(ObjectId id):
if( getId() == DefaultObjectId )
{
ostringstream msg;
msg << "(DBServer_MySQL): ! ObjectId !!!!!\n";
msg << "(DBServer_MySQL): Запуск невозможен! НЕ ОПРЕДЕЛЁН ObjectId !!!!!\n";
// unideb[Debug::CRIT] << msg.str() << endl;
throw Exception(msg.str());
}
......@@ -69,7 +69,7 @@ DBServer_MySQL::DBServer_MySQL():
if( getId() == DefaultObjectId )
{
ostringstream msg;
msg << "(DBServer_MySQL): ! ObjectId !!!!!\n";
msg << "(DBServer_MySQL): Запуск невозможен! Для данного узла НЕ ОПРЕДЕЛЁН ObjectId !!!!!\n";
// unideb[Debug::CRIT] << msg.str() << endl;
throw Exception(msg.str());
}
......@@ -133,7 +133,7 @@ void DBServer_MySQL::parse( UniSetTypes::DBMessage* dbm )
{
if( dbm->tblid == UniSetTypes::Message::Unused )
{
unideb[Debug::CRIT] << myname << "(dbmessage): tblId...\n";
unideb[Debug::CRIT] << myname << "(dbmessage): не задан tblId...\n";
return;
}
......@@ -173,7 +173,7 @@ void DBServer_MySQL::parse( UniSetTypes::InfoMessage* im )
if( !message.empty() )
message = db->addslashes(message);
// ( )!!!
// Прежде чем формировать строку обязательно смотрите формат базы данных(порядок полей таблицы)!!!
ostringstream ostr;
ostr << "INSERT INTO " << tblName(im->type);
ostr << "(num,node,id,date,time,time_usec,code,text,haracter,type,confirm,causeid) VALUES(";
......@@ -200,7 +200,7 @@ void DBServer_MySQL::parse( UniSetTypes::AlarmMessage* am )
if( !message.empty() )
message = db->addslashes(message);
// ( )!!!
// Прежде чем формировать строку обязательно смотрите формат базы данных(порядок полей таблицы)!!!
ostringstream ostr;
ostr << "INSERT INTO " << tblName(am->type);
ostr << "(num,node,id,date,time,time_usec,code,text,haracter,type,confirm,causeid) VALUES(";
......@@ -219,7 +219,7 @@ void DBServer_MySQL::parse( UniSetTypes::AlarmMessage* am )
//--------------------------------------------------------------------------------------------
void DBServer_MySQL::parse( UniSetTypes::ConfirmMessage* am )
{
//
// Сохраняем ПОДТВЕРЖДЕНИЕ в базу
ostringstream query;
query << "UPDATE " << tblName(am->orig_type) << " SET ";
query << "confirm='" << ui.timeToString(am->tm.tv_sec,":") << "'";
......@@ -246,17 +246,17 @@ bool DBServer_MySQL::writeToBase( const string& query )
// cout << "DBServer_MySQL: " << query << endl;
if( !db || !connect_ok )
{
unideb[Debug::CRIT] << myname << "(writeToBase): \n"
unideb[Debug::CRIT] << myname << "(writeToBase): соединение с БД не установлено\n"
<< myname << "(writeToBase): lost query: "
<< query << endl;
return false;
}
db->query( query );
// INSERT UPDATE
// db->query() false
//
// . DBInterface::query.
// Дело в том что на INSERT И UPDATE запросы
// db->query() может возвращать false и надо самому
// отдельно проверять действительно ли произошла ошибка
// см. DBInterface::query.
string err(db->error());
if( err.empty() )
{
......@@ -271,17 +271,17 @@ void DBServer_MySQL::parse( UniSetTypes::SensorMessage *si )
{
try
{
// ( )
// если время не было выставлено (указываем время сохранения в БД)
if( !si->tm.tv_sec )
{
struct timezone tz;
gettimeofday(&si->tm,&tz);
}
// . DBTABLE AnalogSensors, DigitalSensors
// см. DBTABLE AnalogSensors, DigitalSensors
ostringstream data;
data << " VALUES( ";
//
// Поля таблицы
data << "NULL,'"<< si->node << "','"; // num, node
data << si->id << "','"; // id (sensorid)
data << ui.dateToString(si->sm_tv_sec,"/") << "','"; // date
......@@ -309,7 +309,7 @@ void DBServer_MySQL::parse( UniSetTypes::SensorMessage *si )
break;
default:
unideb[Debug::WARN] << myname << "(log sensor): ....( )" << endl;
unideb[Debug::WARN] << myname << "(log sensor): неизвестный тип датчика....(сообщение игнорировано)" << endl;
return;
}
......@@ -327,7 +327,7 @@ void DBServer_MySQL::parse( UniSetTypes::SensorMessage *si )
}
catch( ... )
{
unideb[Debug::CRIT] << myname << "(parse SensorMessage): ..." << endl;
unideb[Debug::CRIT] << myname << "(parse SensorMessage): неизвестное исключние..." << endl;
}
}
......@@ -347,17 +347,17 @@ void DBServer_MySQL::init_dbserver()
if( conf->getDBServer() == UniSetTypes::DefaultObjectId )
{
ostringstream msg;
msg << myname << "(init): DBServer - ޣ."
<< " " << conf->getConfFileName()
<< " dbserver=''";
msg << myname << "(init): на данном узле DBServer - отключён."
<< " В " << conf->getConfFileName()
<< " для данного узла указан параметр dbserver=''";
throw NameNotFound(msg.str());
}
xmlNode* node = conf->getNode("LocalDBServer");
if( !node )
throw NameNotFound(string(myname+"(init): LocalDBServer"));
throw NameNotFound(string(myname+"(init): в конфигурационном файле не найден раздел LocalDBServer"));
unideb[Debug::INFO] << myname << "(init): " << endl;
unideb[Debug::INFO] << myname << "(init): инициализируем соединение" << endl;
string dbname(conf->getProp(node,"dbname"));
string dbnode(conf->getProp(node,"dbnode"));
string user(conf->getProp(node,"dbuser"));
......@@ -382,9 +382,9 @@ void DBServer_MySQL::init_dbserver()
{
// ostringstream err;
unideb[Debug::CRIT] << myname
<< "(init): err:\n"
<< "(init): не смог создать соединение с БД err:\n"
<< db->error() << endl;
// throw Exception( string(myname+"(init): "+db->error()) );
// throw Exception( string(myname+"(init): не смогли создать соединение с БД "+db->error()) );
askTimer(DBServer_MySQL::ReconnectTimer,ReconnectTime);
}
else
......@@ -404,7 +404,7 @@ void DBServer_MySQL::createTables( DBInterface *db )
UniXML_iterator it( conf->getNode("Tables") );
if(!it)
{
unideb[Debug::CRIT] << myname << ": Tables...."<< endl;
unideb[Debug::CRIT] << myname << ": не найден раздел Tables...."<< endl;
throw Exception();
}
......@@ -412,7 +412,7 @@ void DBServer_MySQL::createTables( DBInterface *db )
{
if( it.getName() != "comment" )
{
unideb[Debug::INFO] << myname << "(createTables): " << it.getName() << endl;
unideb[Debug::INFO] << myname << "(createTables): создаем " << it.getName() << endl;
ostringstream query;
query << "CREATE TABLE " << conf->getProp(it,"name") << "(" << conf->getProp(it,"create") << ")";
if( !db->query(query.str()) )
......@@ -429,7 +429,7 @@ void DBServer_MySQL::timerInfo( UniSetTypes::TimerMessage* tm )
{
if( !db->ping() )
{
unideb[Debug::WARN] << myname << "(timerInfo): " << endl;
unideb[Debug::WARN] << myname << "(timerInfo): потеряно соединение с сервером БД" << endl;
connect_ok = false;
askTimer(DBServer_MySQL::PingTimer,0);
askTimer(DBServer_MySQL::ReconnectTimer,ReconnectTime);
......@@ -454,7 +454,7 @@ void DBServer_MySQL::timerInfo( UniSetTypes::TimerMessage* tm )
askTimer(DBServer_MySQL::PingTimer,PingTime);
}
connect_ok = false;
unideb[Debug::WARN] << myname << "(timerInfo): " << endl;
unideb[Debug::WARN] << myname << "(timerInfo): нет связи с БД" << endl;
}
else
init_dbserver();
......@@ -462,7 +462,7 @@ void DBServer_MySQL::timerInfo( UniSetTypes::TimerMessage* tm )
break;
default:
unideb[Debug::WARN] << myname << "(timerInfo): tid=" << tm->id << endl;
unideb[Debug::WARN] << myname << "(timerInfo): неизвестный таймер tid=" << tm->id << endl;
break;
}
}
......
......@@ -32,47 +32,47 @@
#include "DBServer.h"
//------------------------------------------------------------------------------------------
/*!
\page page_DBServer_MySQL (DBServer_MySQL) MySQL
\page page_DBServer_MySQL (DBServer_MySQL) Реализация сервиса ведения БД на основе MySQL
- \ref sec_DBS_Comm
- \ref sec_DBS_Conf
- \ref sec_DBS_Tables
\section sec_DBS_Comm DBServer_MySQL
MySQL.
.
,
..
, ,
, mysql .
\section sec_DBS_Comm Общее описание работы DBServer_MySQL
Сервис предназначен для работы с БД MySQL. В его задачи входит
сохранение всех событий происходищих в системе в БД. К этим
событиям относятся изменение состояния датчиков, различные логи
работы процессов и т.п.
К моменту запуска, подразумевается, что неободимые таблицы уже
созданы, все необходимые настройки mysql сделаны.
\par
, .
ģ (web-).
При работе с БД, сервис в основном пишет в БД. Обработка накопленных данных
ведётся уже другими программами (web-интерфейс).
\par
DBServer ( DBServer_MySQL::PingTimer ) .
( ) DBServer ( DBServer::ReconnectTimer )
. , -.
\warning DBServer . .
.
Для повышения надежности DBServer переодически ( DBServer_MySQL::PingTimer ) проверяет наличие связи с сервером БД.
В случае если связь пропала (или не была установлена при старте) DBServer пытается вновь переодически ( DBServer::ReconnectTimer )
произвести соединение. При этом все запросы которые поступают для запии в БД, пишутся в лог-файл.
\warning При каждой попытке восстановить соединение DBServer заново читает конф. файл. Поэтому он может подхватить
новые настройки.
\todo , ... ( )
\todo Может не сохранять текст, если задан код... (для экономии в БД)
\section sec_DBS_Conf DBServer
DBServer ң \b<LocalDBServer>.
:
\section sec_DBS_Conf Настройка DBServer
Объект DBServer берёт настройки из конфигурационного файла из секции \b<LocalDBServer>.
Возможно задать следующие параметры:
- \b dbname -
- \b dbnode -
- \b dbuser -
- \b dbpass -
- \b pingTime - MySQL
- \b reconnectTime -
- \b dbname - название БД
- \b dbnode - узел БД
- \b dbuser - пользователь
- \b dbpass - пароль для доступа к БД
- \b pingTime - период проверки связи с сервером MySQL
- \b reconnectTime - время повторной попытки соединения с БД
\section sec_DBS_Tables MySQL
:
\section sec_DBS_Tables Таблицы MySQL
К основным таблицам относятся следующие:
\code
DROP TABLE IF EXISTS ObjectsMap;
......@@ -150,7 +150,7 @@ class DBServer_MySQL:
virtual void timerInfo( UniSetTypes::TimerMessage* tm );
virtual void sysCommand( UniSetTypes::SystemMessage* sm );
//
// Функции обработки пришедших сообщений
virtual void parse( UniSetTypes::SensorMessage* sm );
virtual void parse( UniSetTypes::DBMessage* dbmsg );
virtual void parse( UniSetTypes::InfoMessage* imsg );
......@@ -168,15 +168,15 @@ class DBServer_MySQL:
enum Timers
{
PingTimer, /*!< */
ReconnectTimer /*!< ( ) */
PingTimer, /*!< таймер на переодическую проверку соединения с сервером БД */
ReconnectTimer /*!< таймер на повторную попытку соединения с сервером БД (или восстановления связи) */
};
DBInterface *db;
int PingTime;
int ReconnectTime;
bool connect_ok; /*! */
bool connect_ok; /*! признак наличия соеднинения с сервером БД */
bool activate;
......
......@@ -4,9 +4,9 @@
-- ------------------------------------------------------
-- Server version 4.0.18-log
-- dbadmin-
-- Создание пользователя для dbadmin-а
GRANT SELECT,INSERT,UPDATE,DELETE,INDEX,LOCK TABLES,CREATE,DROP ON TESTBASE.* TO dbadmin@localhost IDENTIFIED BY 'dbadmin';
--
-- Создание пользователя для просмотра
GRANT SELECT ON TESTBASE.* TO dbreader@"%" IDENTIFIED BY 'dbreader';
--
......
DELETE FROM DigitalSensors WHERE date<=DATE_SUB(NOW(),INTERVAL 10 DAY);
DELETE FROM AnalogSensors WHERE date<=DATE_SUB(NOW(),INTERVAL 10 DAY);
DELETE FROM Messages WHERE date<=DATE_SUB(NOW(),INTERVAL 10 DAY);
DELETE FROM RSChannel WHERE date<=DATE_SUB(NOW(),INTERVAL 10 DAY);
DELETE FROM Network WHERE date<=DATE_SUB(NOW(),INTERVAL 10 DAY);
DELETE FROM DigitalSensors WHERE date<кTE_SUB(NOW(),INTERVAL 10 DAY);
DELETE FROM AnalogSensors WHERE date<кTE_SUB(NOW(),INTERVAL 10 DAY);
DELETE FROM Messages WHERE date<кTE_SUB(NOW(),INTERVAL 10 DAY);
DELETE FROM RSChannel WHERE date<кTE_SUB(NOW(),INTERVAL 10 DAY);
DELETE FROM Network WHERE date<кTE_SUB(NOW(),INTERVAL 10 DAY);
......@@ -27,28 +27,28 @@ int main(int argc, char** argv)
ObjectId ID = conf->getDBServer();
// ID
// определяем ID объекта
string name = conf->getArgParam("--name");
if( !name.empty())
{
if( ID != UniSetTypes::DefaultObjectId )
{
unideb[Debug::WARN] << "(DBServer::main): ID "
unideb[Debug::WARN] << "(DBServer::main): переопределяем ID заданнй в "
<< conf->getConfFileName() << endl;
}
ID = conf->oind->getIdByName(conf->getServicesSection()+"/"+name);
if( ID == UniSetTypes::DefaultObjectId )
{
cerr << "(DBServer::main): '" << name
<< "' . !"
<< " " << conf->getServicesSection() << endl;
cerr << "(DBServer::main): идентификатор '" << name
<< "' не найден в конф. файле!"
<< " в секции " << conf->getServicesSection() << endl;
return 1;
}
}
else if( ID == UniSetTypes::DefaultObjectId )
{
cerr << "(DBServer::main): " << endl;
cerr << "(DBServer::main): Не удалось определить ИДЕНТИФИКАТОР сервера" << endl;
short_usage();
return 1;
}
......
......@@ -29,33 +29,33 @@ int main(int argc, char** argv)
ObjectId ID = conf->getInfoServer();
// ID
// определяем ID объекта
string name = conf->getArgParam("--name");
if( !name.empty() )
{
if( ID != UniSetTypes::DefaultObjectId )
{
unideb[Debug::WARN] << "(InfoServer::main): ID "
unideb[Debug::WARN] << "(InfoServer::main): переопределяем ID заданнй в "
<< conf->getConfFileName() << endl;
}
ID = conf->oind->getIdByName(conf->getServicesSection()+"/"+name);
if( ID == UniSetTypes::DefaultObjectId )
{
cerr << "(InfoServer): '" << name
<< "' . !"
<< " " << conf->getServicesSection() << endl;
cerr << "(InfoServer): идентификатор '" << name
<< "' не найден в конф. файле!"
<< " в секции " << conf->getServicesSection() << endl;
return 1;
}
}
else if( ID == UniSetTypes::DefaultObjectId )
{
cerr << "(DBServer::main): " << endl;
cerr << "(DBServer::main): Не удалось определить ИДЕНТИФИКАТОР сервера" << endl;
short_usage();
return 1;
}
// ask-
// определяем ask-файл
string askfile = conf->getArgParam("--askfile",conf->getConfFileName());
if( askfile.empty() )
......
......@@ -70,15 +70,15 @@ void MBSlave::setLog( DebugStream& dlog )
// -------------------------------------------------------------------------
void MBSlave::execute()
{
// ...
// Работа...
while(1)
{
ModbusRTU::mbErrCode res = rscomm->receive( addr, UniSetTimer::WaitUpTime );
#if 0
//
// собираем статистику обмена
if( prev!=ModbusRTU::erTimeOut )
{
//
// с проверкой на переполнение
askCount = askCount>=numeric_limits<long>::max() ? 0 : askCount+1;
if( res!=ModbusRTU::erNoError )
errmap[res]++;
......@@ -108,7 +108,7 @@ ModbusRTU::mbErrCode MBSlave::readCoilStatus( ReadCoilMessage& query,
d.b[4] = 1;
d.b[6] = 1;
// :
// Фомирование ответа:
int bcnt = query.count / ModbusRTU::BitsPerByte;
if( (query.count % ModbusRTU::BitsPerByte) > 0 )
bcnt++;
......@@ -165,8 +165,8 @@ mbErrCode MBSlave::readInputRegisters( ReadInputMessage& query,
return ModbusRTU::erNoError;
}
// :
int num=0; //
// Фомирование ответа:
int num=0; // добавленное количество данных
ModbusData reg = query.start;
for( ; num<query.count; num++, reg++ )
{
......@@ -176,12 +176,12 @@ mbErrCode MBSlave::readInputRegisters( ReadInputMessage& query,
reply.addData(reg);
}
// , ۣ
// ...
// Если мы в начале проверили, что запрос входит в разрешёный диапазон
// то теоретически этой ситуации возникнуть не может...
if( reply.count < query.count )
{
cerr << "(readInputRegisters): . "
<< " " << query.count << " " << reply.count << endl;
cerr << "(readInputRegisters): Получили меньше чем ожидали. "
<< " Запросили " << query.count << " получили " << reply.count << endl;
}
return ModbusRTU::erNoError;
......@@ -202,8 +202,8 @@ ModbusRTU::mbErrCode MBSlave::readOutputRegisters(
return ModbusRTU::erNoError;
}
// :
int num=0; //
// Фомирование ответа:
int num=0; // добавленное количество данных
ModbusData reg = query.start;
for( ; num<query.count; num++, reg++ )
{
......@@ -212,12 +212,12 @@ ModbusRTU::mbErrCode MBSlave::readOutputRegisters(
else
reply.addData(reg);
}
// , ۣ
// ...
// Если мы в начале проверили, что запрос входит в разрешёный диапазон
// то теоретически этой ситуации возникнуть не может...
if( reply.count < query.count )
{
cerr << "(readOutputRegisters): . "
<< " " << query.count << " " << reply.count << endl;
cerr << "(readOutputRegisters): Получили меньше чем ожидали. "
<< " Запросили " << query.count << " получили " << reply.count << endl;
}
return ModbusRTU::erNoError;
......@@ -293,10 +293,10 @@ ModbusRTU::mbErrCode MBSlave::journalCommand( ModbusRTU::JournalCommandMessage&
}
break;
case 2: // write modbus
case 2: // write по modbus пока не поддерживается
default:
{
//
// формируем ответ
ModbusRTU::JournalCommandRetOK::set(reply,2,1);
return ModbusRTU::erNoError;
}
......@@ -312,8 +312,8 @@ ModbusRTU::mbErrCode MBSlave::setDateTime( ModbusRTU::SetDateTimeMessage& query,
if( verbose )
cout << "(setDateTime): " << query << endl;
//
// ...
// подтверждаем сохранение
// в ответе возвращаем установленное время...
ModbusRTU::SetDateTimeRetMessage::cpy(reply,query);
return ModbusRTU::erNoError;
}
......@@ -360,7 +360,7 @@ ModbusRTU::mbErrCode MBSlave::fileTransfer( ModbusRTU::FileTransferMessage& quer
return ModbusRTU::erOperationFailed;
}
// ""
// вычисляем общий размер файла в "пакетах"
// (void)lseek(fd,0,SEEK_END);
// int numpacks = lseek(fd,0,SEEK_CUR) / ModbusRTU::FileTransferRetMessage::MaxDataLen;
// if( lseek(fd,0,SEEK_CUR) % ModbusRTU::FileTransferRetMessage::MaxDataLen )
......
......@@ -8,7 +8,7 @@
#include "modbus/ModbusRTUSlaveSlot.h"
// -------------------------------------------------------------------------
/*! MBSlave */
/*! Ничего не делающая реализация MBSlave для тестирования */
class MBSlave
{
public:
......@@ -25,56 +25,56 @@ class MBSlave
replyVal = val;
}
void execute(); /*!< */
void execute(); /*!< основной цикл работы */
void setLog( DebugStream& dlog );
protected:
//
// действия при завершении работы
void sigterm( int signo );
/*! 0x01 */
/*! обработка 0x01 */
ModbusRTU::mbErrCode readCoilStatus( ModbusRTU::ReadCoilMessage& query,
ModbusRTU::ReadCoilRetMessage& reply );
/*! 0x02 */
/*! обработка 0x02 */
ModbusRTU::mbErrCode readInputStatus( ModbusRTU::ReadInputStatusMessage& query,
ModbusRTU::ReadInputStatusRetMessage& reply );
/*! 0x03 */
/*! обработка 0x03 */
ModbusRTU::mbErrCode readOutputRegisters( ModbusRTU::ReadOutputMessage& query,
ModbusRTU::ReadOutputRetMessage& reply );
/*! 0x04 */
/*! обработка 0x04 */
ModbusRTU::mbErrCode readInputRegisters( ModbusRTU::ReadInputMessage& query,
ModbusRTU::ReadInputRetMessage& reply );
/*! 0x05 */
/*! обработка 0x05 */
ModbusRTU::mbErrCode forceSingleCoil( ModbusRTU::ForceSingleCoilMessage& query,
ModbusRTU::ForceSingleCoilRetMessage& reply );
/*! 0x0F */
/*! обработка 0x0F */
ModbusRTU::mbErrCode forceMultipleCoils( ModbusRTU::ForceCoilsMessage& query,
ModbusRTU::ForceCoilsRetMessage& reply );
/*! 0x10 */
/*! обработка 0x10 */
ModbusRTU::mbErrCode writeOutputRegisters( ModbusRTU::WriteOutputMessage& query,
ModbusRTU::WriteOutputRetMessage& reply );
/*! 0x06 */
/*! обработка 0x06 */
ModbusRTU::mbErrCode writeOutputSingleRegister( ModbusRTU::WriteSingleOutputMessage& query,
ModbusRTU::WriteSingleOutputRetMessage& reply );
/*! */
/*! обработка запросов на чтение ошибок */
ModbusRTU::mbErrCode journalCommand( ModbusRTU::JournalCommandMessage& query,
ModbusRTU::JournalCommandRetMessage& reply );
/*! */
/*! обработка запроса на установку времени */
ModbusRTU::mbErrCode setDateTime( ModbusRTU::SetDateTimeMessage& query,
ModbusRTU::SetDateTimeRetMessage& reply );
/*! ̣ */
/*! обработка запроса удалённого сервиса */
ModbusRTU::mbErrCode remoteService( ModbusRTU::RemoteServiceMessage& query,
ModbusRTU::RemoteServiceRetMessage& reply );
......@@ -82,20 +82,20 @@ class MBSlave
ModbusRTU::FileTransferRetMessage& reply );
/*! ModbusRTUSlave RS */
/*! интерфейс ModbusRTUSlave для обмена по RS */
ModbusRTUSlaveSlot* rscomm;
ModbusRTU::ModbusAddr addr; /*!< */
ModbusRTU::ModbusAddr addr; /*!< адрес данного узла */
bool verbose;
#if 0
typedef std::map<ModbusRTU::mbErrCode,unsigned int> ExchangeErrorMap;
ExchangeErrorMap errmap; /*!< */
ExchangeErrorMap errmap; /*!< статистика обмена */
ModbusRTU::mbErrCode prev;
// unsigned,
// long.
long askCount; /*!< */
// можно было бы сделать unsigned, но аналоговые датчики у нас имеют
// тип long. А это число передаётся в графику в виде аналогового датчика
long askCount; /*!< количество принятых запросов */
typedef std::map<int,std::string> FileList;
......
......@@ -69,15 +69,15 @@ void MBTCPServer::setLog( DebugStream& dlog )
// -------------------------------------------------------------------------
void MBTCPServer::execute()
{
// ...
// Работа...
while(1)
{
ModbusRTU::mbErrCode res = sslot->receive( addr, UniSetTimer::WaitUpTime );
#if 0
//
// собираем статистику обмена
if( prev!=ModbusRTU::erTimeOut )
{
//
// с проверкой на переполнение
askCount = askCount>=numeric_limits<long>::max() ? 0 : askCount+1;
if( res!=ModbusRTU::erNoError )
errmap[res]++;
......@@ -113,18 +113,18 @@ ModbusRTU::mbErrCode MBTCPServer::readCoilStatus( ReadCoilMessage& query,
return ModbusRTU::erNoError;
}
// :
int num=0; //
// Фомирование ответа:
int num=0; // добавленное количество данных
ModbusData reg = query.start;
for( ; num<query.count; num++, reg++ )
reply.addData(d);
// , ۣ
// ...
// Если мы в начале проверили, что запрос входит в разрешёный диапазон
// то теоретически этой ситуации возникнуть не может...
if( reply.bcnt < query.count )
{
cerr << "(readCoilStatus): . "
<< " " << query.count << " " << reply.bcnt << endl;
cerr << "(readCoilStatus): Получили меньше чем ожидали. "
<< " Запросили " << query.count << " получили " << reply.bcnt << endl;
}
return ModbusRTU::erNoError;
......@@ -148,18 +148,18 @@ ModbusRTU::mbErrCode MBTCPServer::readInputStatus( ReadInputStatusMessage& query
return ModbusRTU::erNoError;
}
// :
int num=0; //
// Фомирование ответа:
int num=0; // добавленное количество данных
ModbusData reg = query.start;
for( ; num<query.count; num++, reg++ )
reply.addData(d);
// , ۣ
// ...
// Если мы в начале проверили, что запрос входит в разрешёный диапазон
// то теоретически этой ситуации возникнуть не может...
if( reply.bcnt < query.count )
{
cerr << "(readInputStatus): . "
<< " " << query.count << " " << reply.bcnt << endl;
cerr << "(readInputStatus): Получили меньше чем ожидали. "
<< " Запросили " << query.count << " получили " << reply.bcnt << endl;
}
return ModbusRTU::erNoError;
......@@ -177,18 +177,18 @@ mbErrCode MBTCPServer::readInputRegisters( ReadInputMessage& query,
return ModbusRTU::erNoError;
}
// :
int num=0; //
// Фомирование ответа:
int num=0; // добавленное количество данных
ModbusData reg = query.start;
for( ; num<query.count; num++, reg++ )
reply.addData(reg);
// , ۣ
// ...
// Если мы в начале проверили, что запрос входит в разрешёный диапазон
// то теоретически этой ситуации возникнуть не может...
if( reply.count < query.count )
{
cerr << "(readInputRegisters): . "
<< " " << query.count << " " << reply.count << endl;
cerr << "(readInputRegisters): Получили меньше чем ожидали. "
<< " Запросили " << query.count << " получили " << reply.count << endl;
}
return ModbusRTU::erNoError;
......@@ -206,18 +206,18 @@ ModbusRTU::mbErrCode MBTCPServer::readOutputRegisters(
return ModbusRTU::erNoError;
}
// :
int num=0; //
// Фомирование ответа:
int num=0; // добавленное количество данных
ModbusData reg = query.start;
for( ; num<query.count; num++, reg++ )
reply.addData(reg);
// , ۣ
// ...
// Если мы в начале проверили, что запрос входит в разрешёный диапазон
// то теоретически этой ситуации возникнуть не может...
if( reply.count < query.count )
{
cerr << "(readOutputRegisters): . "
<< " " << query.count << " " << reply.count << endl;
cerr << "(readOutputRegisters): Получили меньше чем ожидали. "
<< " Запросили " << query.count << " получили " << reply.count << endl;
}
return ModbusRTU::erNoError;
......@@ -293,10 +293,10 @@ ModbusRTU::mbErrCode MBTCPServer::journalCommand( ModbusRTU::JournalCommandMessa
}
break;
case 2: // write modbus
case 2: // write по modbus пока не поддерживается
default:
{
//
// формируем ответ
ModbusRTU::JournalCommandRetOK::set(reply,2,1);
return ModbusRTU::erNoError;
}
......@@ -312,8 +312,8 @@ ModbusRTU::mbErrCode MBTCPServer::setDateTime( ModbusRTU::SetDateTimeMessage& qu
if( verbose )
cout << "(setDateTime): " << query << endl;
//
// ...
// подтверждаем сохранение
// в ответе возвращаем установленное время...
ModbusRTU::SetDateTimeRetMessage::cpy(reply,query);
return ModbusRTU::erNoError;
}
......@@ -360,7 +360,7 @@ ModbusRTU::mbErrCode MBTCPServer::fileTransfer( ModbusRTU::FileTransferMessage&
return ModbusRTU::erOperationFailed;
}
// ""
// вычисляем общий размер файла в "пакетах"
// (void)lseek(fd,0,SEEK_END);
// int numpacks = lseek(fd,0,SEEK_CUR) / ModbusRTU::FileTransferRetMessage::MaxDataLen;
// if( lseek(fd,0,SEEK_CUR) % ModbusRTU::FileTransferRetMessage::MaxDataLen )
......
......@@ -8,7 +8,7 @@
#include "modbus/ModbusTCPServerSlot.h"
// -------------------------------------------------------------------------
/*! MBTCPServer */
/*! Ничего не делающая реализация MBTCPServer для тестирования */
class MBTCPServer
{
public:
......@@ -20,56 +20,56 @@ class MBTCPServer
verbose = state;
}
void execute(); /*!< */
void execute(); /*!< основной цикл работы */
void setLog( DebugStream& dlog );
protected:
//
// действия при завершении работы
void sigterm( int signo );
/*! 0x01 */
/*! обработка 0x01 */
ModbusRTU::mbErrCode readCoilStatus( ModbusRTU::ReadCoilMessage& query,
ModbusRTU::ReadCoilRetMessage& reply );
/*! 0x02 */
/*! обработка 0x02 */
ModbusRTU::mbErrCode readInputStatus( ModbusRTU::ReadInputStatusMessage& query,
ModbusRTU::ReadInputStatusRetMessage& reply );
/*! 0x03 */
/*! обработка 0x03 */
ModbusRTU::mbErrCode readOutputRegisters( ModbusRTU::ReadOutputMessage& query,
ModbusRTU::ReadOutputRetMessage& reply );
/*! 0x04 */
/*! обработка 0x04 */
ModbusRTU::mbErrCode readInputRegisters( ModbusRTU::ReadInputMessage& query,
ModbusRTU::ReadInputRetMessage& reply );
/*! 0x05 */
/*! обработка 0x05 */
ModbusRTU::mbErrCode forceSingleCoil( ModbusRTU::ForceSingleCoilMessage& query,
ModbusRTU::ForceSingleCoilRetMessage& reply );
/*! 0x0F */
/*! обработка 0x0F */
ModbusRTU::mbErrCode forceMultipleCoils( ModbusRTU::ForceCoilsMessage& query,
ModbusRTU::ForceCoilsRetMessage& reply );
/*! 0x10 */
/*! обработка 0x10 */
ModbusRTU::mbErrCode writeOutputRegisters( ModbusRTU::WriteOutputMessage& query,
ModbusRTU::WriteOutputRetMessage& reply );
/*! 0x06 */
/*! обработка 0x06 */
ModbusRTU::mbErrCode writeOutputSingleRegister( ModbusRTU::WriteSingleOutputMessage& query,
ModbusRTU::WriteSingleOutputRetMessage& reply );
/*! */
/*! обработка запросов на чтение ошибок */
ModbusRTU::mbErrCode journalCommand( ModbusRTU::JournalCommandMessage& query,
ModbusRTU::JournalCommandRetMessage& reply );
/*! */
/*! обработка запроса на установку времени */
ModbusRTU::mbErrCode setDateTime( ModbusRTU::SetDateTimeMessage& query,
ModbusRTU::SetDateTimeRetMessage& reply );
/*! ̣ */
/*! обработка запроса удалённого сервиса */
ModbusRTU::mbErrCode remoteService( ModbusRTU::RemoteServiceMessage& query,
ModbusRTU::RemoteServiceRetMessage& reply );
......@@ -77,20 +77,20 @@ class MBTCPServer
ModbusRTU::FileTransferRetMessage& reply );
/*! ModbusSlave RS */
/*! интерфейс ModbusSlave для обмена по RS */
ModbusTCPServerSlot* sslot;
ModbusRTU::ModbusAddr addr; /*!< */
ModbusRTU::ModbusAddr addr; /*!< адрес данного узла */
bool verbose;
#if 0
typedef std::map<ModbusRTU::mbErrCode,unsigned int> ExchangeErrorMap;
ExchangeErrorMap errmap; /*!< */
ExchangeErrorMap errmap; /*!< статистика обмена */
ModbusRTU::mbErrCode prev;
// unsigned,
// long.
long askCount; /*!< */
// можно было бы сделать unsigned, но аналоговые датчики у нас имеют
// тип long. А это число передаётся в графику в виде аналогового датчика
long askCount; /*!< количество принятых запросов */
typedef std::map<int,std::string> FileList;
......
......@@ -13,13 +13,13 @@ static void short_usage()
{
cout << "Usage: uniset-nullController"
<< " --name ObjectId [--confile configure.xml] [--askfile filename] \n"
<< " --s-filter-field name - \n"
<< " --s-filter-value value - \n"
<< " --c-filter-field name - \n"
<< " --c-filter-value value - \n"
<< " --d-filter-field name - \n"
<< " --d-filter-value value - \n"
<< " --dbDumping [0,1] - dump- \n";
<< " --s-filter-field name - поле для фильтрования списка датчиков\n"
<< " --s-filter-value value - значение для поля фильтрования списка датчиков \n"
<< " --c-filter-field name - поле для фильтрования списка заказчиков по каждому датчику\n"
<< " --c-filter-value value - значение для поля фильтрования списка заказчиков по каждому датчику\n"
<< " --d-filter-field name - поле для фильтрования списка зависимостей по каждому датчику\n"
<< " --d-filter-value value - значение для поля фильтрования списка зависимостей по каждому датчику\n"
<< " --dbDumping [0,1] - создавать ли dump-файл \n";
}
// --------------------------------------------------------------------------
int main(int argc, char** argv)
......@@ -28,7 +28,7 @@ int main(int argc, char** argv)
{
if( argc <=1 )
{
cerr << "\n \n\n";
cerr << "\nНе указаны необходимые параметры\n\n";
short_usage();
return 0;
}
......@@ -42,29 +42,29 @@ int main(int argc, char** argv)
uniset_init(argc,argv,"configure.xml");
// ID
// определяем ID объекта
string name = conf->getArgParam("--name");
if( name.empty())
{
cerr << "(nullController): ObjectId!!! (--name)\n";
cerr << "(nullController): не задан ObjectId!!! (--name)\n";
return 0;
}
ObjectId ID = conf->oind->getIdByName(conf->getControllersSection()+"/"+name);
if( ID == UniSetTypes::DefaultObjectId )
{
cerr << "(nullController): '" << name
<< "' . !"
<< " " << conf->getControllersSection() << endl;
cerr << "(nullController): идентификатор '" << name
<< "' не найден в конф. файле!"
<< " в секции " << conf->getControllersSection() << endl;
return 0;
}
// ask-
// определяем ask-файл
string askfile = conf->getArgParam("--askfile");
if( askfile.empty())
askfile = conf->getConfFileName();
//
// определяем фильтр
string s_field = conf->getArgParam("--s-filter-field");
string s_fvalue = conf->getArgParam("--s-filter-value");
string c_field = conf->getArgParam("--c-filter-field");
......@@ -72,7 +72,7 @@ int main(int argc, char** argv)
string d_field = conf->getArgParam("--d-filter-field");
string d_fvalue = conf->getArgParam("--d-filter-value");
//
// надо ли писать изменения в БД
bool dbDumping = conf->getArgInt("--dbDumping");
NullController nc(ID,askfile,s_field,s_fvalue,c_field,c_fvalue,d_field,d_fvalue,dbDumping);
......
......@@ -8,12 +8,12 @@ using namespace UniSetTypes;
// -----------------------------------------------------------------------------
void help_print()
{
cout << endl << "--help - " << endl;
cout << endl << "--help - Помощь по утилите" << endl;
cout << "--sid id1,..,idXX - sensors ID (AnalogInput)" << endl;
cout << "--min val - . 0" << endl;
cout << "--max val - . 100 " << endl;
cout << "--step val - . 1" << endl;
cout << "--pause msec - . 200 " << endl << endl;
cout << "--min val - Нижняя граница датчика. По умолчанию 0" << endl;
cout << "--max val - Верхняя граница датчика. По умолчанию 100 " << endl;
cout << "--step val - Шаг датчика. По умолчанию 1" << endl;
cout << "--pause msec - Пауза. По умолчанию 200 мсек" << endl << endl;
}
int main( int argc, char **argv )
......@@ -60,19 +60,19 @@ int main( int argc, char **argv )
int astep = conf->getArgInt("--step", "1");
if( astep<=0 )
{
cerr << endl << ", --step val - " << endl << endl;
cerr << endl << "Ошибка, используйте --step val - любое положительное число" << endl << endl;
return 1;
}
int amsec = conf->getArgInt("--pause", "200");
if(amsec<=10)
{
cerr << endl << ", --pause val - > 10" << endl << endl;
cerr << endl << "Ошибка, используйте --pause val - любое положительное число > 10" << endl << endl;
return 1;
}
cout << endl << "------------------------------" << endl;
cout << " :" << endl;
cout << " Вы ввели следующие параметры:" << endl;
cout << "------------------------------" << endl;
cout << " sid = " << sid << endl;
cout << " min = " << amin << endl;
......@@ -89,7 +89,7 @@ int main( int argc, char **argv )
if(i>=amax)
{
j -= astep;
if(j<amin) //
if(j<amin) // Принудительная установка нижней границы датчика
j = amin;
cout << "\r" << " i = " << j <<" "<< flush;
......@@ -114,7 +114,7 @@ int main( int argc, char **argv )
else
{
i += astep;
if(i>amax) //
if(i>amax) // Принудительная установка верхней границы датчика
i = amax;
cout << "\r" << " i = " << i <<" "<< flush;
......
......@@ -29,9 +29,9 @@ int main( int argc, const char **argv )
ID = conf->getObjectID(name);
if( ID == UniSetTypes::DefaultObjectId )
{
cerr << "(main): '" << name
<< "' . !"
<< " " << conf->getObjectsSection() << endl;
cerr << "(main): идентификатор '" << name
<< "' не найден в конф. файле!"
<< " в секции " << conf->getObjectsSection() << endl;
return 0;
}
......@@ -49,7 +49,7 @@ int main( int argc, const char **argv )
}
catch(...)
{
cout << "(main): !!!!"<< endl;
cout << "(main): Неизвестное исключение!!!!"<< endl;
}
return 0;
......
......@@ -42,7 +42,7 @@ int main(int argc, const char **argv)
timeout_t timeMS = conf->getArgInt("--polltime");
if( timeMS )
{
cout << "(main): " << timeMS << "[]" << endl;
cout << "(main): просматриваем с периодом " << timeMS << "[мсек]" << endl;
sv.monitor(timeMS);
}
else
......@@ -50,11 +50,11 @@ int main(int argc, const char **argv)
}
catch(Exception& ex )
{
cerr << "(main): " << ex << endl;
cerr << "(main): Поймали исключение " << ex << endl;
}
catch(...)
{
cerr << "(main): !!!!"<< endl;
cerr << "(main): Неизвестное исключение!!!!"<< endl;
}
return 0;
......
......@@ -4,7 +4,7 @@
<xsl:import href="ctl-cpp-common.xsl"/>
<xsl:output method="text" indent="yes" encoding="koi8-r"/>
<!-- cc- -->
<!-- Генерирование cc-файла -->
<xsl:variable name="CLASSNAME">
<xsl:call-template name="settings-alone"><xsl:with-param name="varname" select="'class-name'"/></xsl:call-template>
......@@ -18,7 +18,7 @@
<xsl:template match="/">
<!-- BEGIN CC-FILE -->
//
// Метод с использованием заказа датчиков
// --------------------------------------------------------------------------
<xsl:call-template name="COMMON-CC-HEAD"/>
// --------------------------------------------------------------------------
......@@ -32,7 +32,7 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::callback()
return;
try
{
#warning TestMode !
#warning Сделать работу с TestMode на основе заказа!
isTestMode = checkTestMode();
if( trTestMode.change(isTestMode) )
testMode(isTestMode);
......@@ -46,39 +46,39 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::callback()
return;
}
//
// проверка таймеров
checkTimers(this);
#warning ResetMsg askTimer!
#warning Сделать работу с ResetMsg на основе askTimer!
if( resetMsgTime&gt;0 &amp;&amp; trResetMsg.hi(ptResetMsg.checkTime()) )
{
// cout &lt;&lt; myname &lt;&lt; ": ********* reset messages *********" &lt;&lt; endl;
resetMsg();
}
// ( ..)
// обработка сообщений (таймеров и т.п.)
for( int i=0; i&lt;<xsl:call-template name="settings-alone"><xsl:with-param name="varname" select="'msg-count'"/></xsl:call-template>; i++ )
{
if( !receiveMessage(msg) )
break;
processingMessage(&amp;msg);
//
// обновление выходов
updateOutputs(false);
updatePreviousValues();
}
//
// Выполнение шага программы
step();
// ""
// "сердцебиение"
if( idHeartBeat!=DefaultObjectId &amp;&amp; ptHeartBeat.checkTime() )
{
ui.saveValue(idHeartBeat,maxHeartBeat,UniversalIO::AnalogInput);
ptHeartBeat.reset();
}
//
// обновление выходов
updateOutputs(false);
updatePreviousValues();
}
......@@ -88,7 +88,7 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::callback()
}
catch(CORBA::SystemException&amp; ex)
{
unideb[Debug::CRIT] &lt;&lt; myname &lt;&lt; "(execute): ORBA::SystemException: "
unideb[Debug::CRIT] &lt;&lt; myname &lt;&lt; "(execute): СORBA::SystemException: "
&lt;&lt; ex.NP_minorString() &lt;&lt; endl;
}
catch(...)
......@@ -169,7 +169,7 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::askSensors( UniversalIO::UIOCommand
{
unideb[Debug::CRIT] &lt;&lt; myname &lt;&lt; "(askSensors): catch(...)" &lt;&lt; endl;
}
#warning .
#warning Сделать паузу между заказами настраиваемой из конф. файла
msleep(2000);
}
}
......@@ -242,7 +242,7 @@ bool <xsl:value-of select="$CLASSNAME"/>_SK::getState( UniSetTypes::ObjectId sid
</xsl:if>
</xsl:if>
</xsl:for-each>
unideb[Debug::CRIT] &lt;&lt; myname &lt;&lt; "(getState): sid="
unideb[Debug::CRIT] &lt;&lt; myname &lt;&lt; "(getState): Обращение к неизвестному ДИСКРЕТНОМУ датчику sid="
&lt;&lt; sid &lt;&lt; endl;
return false;
......@@ -289,7 +289,7 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::updateOutputs( bool force )
// -----------------------------------------------------------------------------
void <xsl:value-of select="$CLASSNAME"/>_SK::setMsg( UniSetTypes::ObjectId code, bool state )
{
// (.. )
// блокируем сброс (т.к. он автоматически по таймеру)
if( !state )
{
ptResetMsg.reset();
......
......@@ -4,7 +4,7 @@
<xsl:import href="ctl-cpp-common.xsl"/>
<xsl:output method="text" indent="yes" encoding="koi8-r"/>
<!-- cc- -->
<!-- Генерирование cc-файла -->
<xsl:variable name="CLASSNAME">
<xsl:call-template name="settings-alone"><xsl:with-param name="varname" select="'class-name'"/></xsl:call-template>
......@@ -30,8 +30,8 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::callback()
return;
try
{
// NOTE: ?!!
//
// NOTE: Нужно ли здесь опрашивать текущее значение выходов?!!
// Опрос входов
updateValues();
if( idLocalTestMode_S != DefaultObjectId )
......@@ -50,7 +50,7 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::callback()
}
}
//
// проверка таймеров
checkTimers(this);
if( resetMsgTime&gt;0 &amp;&amp; trResetMsg.hi(ptResetMsg.checkTime()) )
......@@ -59,7 +59,7 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::callback()
resetMsg();
}
// ( ..)
// обработка сообщений (таймеров и т.п.)
for( int i=0; i&lt;<xsl:call-template name="settings-alone"><xsl:with-param name="varname" select="'msg-count'"/></xsl:call-template>; i++ )
{
if( !receiveMessage(msg) )
......@@ -67,23 +67,23 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::callback()
processingMessage(&amp;msg);
}
//
// Проверка изменения состояния датчиков
checkSensors();
//
// Выполнение шага программы
step();
// ""
// "сердцебиение"
if( idHeartBeat!=DefaultObjectId &amp;&amp; ptHeartBeat.checkTime() )
{
ui.saveValue(idHeartBeat,maxHeartBeat,UniversalIO::AnalogInput);
ptHeartBeat.reset();
}
//
// обновление выходов
updateOutputs(false);
//
// обновление списка предыдущих состояний
updatePreviousValues();
}
catch( Exception&amp; ex )
......@@ -92,7 +92,7 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::callback()
}
catch(CORBA::SystemException&amp; ex)
{
unideb[Debug::CRIT] &lt;&lt; myname &lt;&lt; "(execute): ORBA::SystemException: "
unideb[Debug::CRIT] &lt;&lt; myname &lt;&lt; "(execute): СORBA::SystemException: "
&lt;&lt; ex.NP_minorString() &lt;&lt; endl;
}
catch(...)
......@@ -108,7 +108,7 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::callback()
// -----------------------------------------------------------------------------
void <xsl:value-of select="$CLASSNAME"/>_SK::askSensors( UniversalIO::UIOCommand cmd )
{
//
// имитируем изменения для посылки сообщений при старте
if( cmd == UniversalIO::UIONotify )
{
<xsl:for-each select="//sensors/item/consumers/consumer">
......@@ -127,7 +127,7 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::preSensorInfo( UniSetTypes::SensorM
// -----------------------------------------------------------------------------
void <xsl:value-of select="$CLASSNAME"/>_SK::askState( UniSetTypes::ObjectId sid, UniversalIO::UIOCommand cmd, UniSetTypes::ObjectId node )
{
// #warning ...
// #warning НЕ РЕАЛИЗОВАНА...
if( cmd == UniversalIO::UIONotify )
{
SensorMessage sm( sid, (bool)ui.getState(sid,node) );
......@@ -139,7 +139,7 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::askState( UniSetTypes::ObjectId sid
// -----------------------------------------------------------------------------
void <xsl:value-of select="$CLASSNAME"/>_SK::askValue( UniSetTypes::ObjectId sid, UniversalIO::UIOCommand cmd, UniSetTypes::ObjectId node )
{
// #warning ..
// #warning НЕ РЕАЛИЗОВАНА..
if( cmd == UniversalIO::UIONotify )
{
SensorMessage sm( sid, (long)ui.getValue(sid,node) );
......@@ -187,7 +187,7 @@ bool <xsl:value-of select="$CLASSNAME"/>_SK::getState( UniSetTypes::ObjectId sid
</xsl:if>
</xsl:for-each>
unideb[Debug::CRIT] &lt;&lt; myname &lt;&lt; "(getState): sid="
unideb[Debug::CRIT] &lt;&lt; myname &lt;&lt; "(getState): Обращение к неизвестному ДИСКРЕТНОМУ датчику sid="
&lt;&lt; sid &lt;&lt; endl;
return false;
......@@ -211,7 +211,7 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::updateOutputs( bool force )
// -----------------------------------------------------------------------------
void <xsl:value-of select="$CLASSNAME"/>_SK::setMsg( UniSetTypes::ObjectId code, bool state )
{
// (.. )
// блокируем сброс (т.к. он автоматически по таймеру)
if( !state )
{
ptResetMsg.reset();
......
......@@ -15,11 +15,11 @@
<xsl:call-template name="settings"><xsl:with-param name="varname" select="'ID'"/></xsl:call-template>
</xsl:variable>
<!-- cc- -->
<!-- Генерирование cc-файла -->
<xsl:template match="/">
<!-- BEGIN CC-FILE -->
//
// Метод с использованием заказа датчиков
// --------------------------------------------------------------------------
<xsl:call-template name="COMMON-CC-HEAD"/>
// --------------------------------------------------------------------------
......@@ -33,7 +33,7 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::callback()
return;
try
{
#warning TestMode !
#warning Сделать работу с TestMode на основе заказа!
isTestMode = checkTestMode();
if( trTestMode.change(isTestMode) )
testMode(isTestMode);
......@@ -47,17 +47,17 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::callback()
return;
}
//
// проверка таймеров
checkTimers(this);
#warning ResetMsg askTimer!
#warning Сделать работу с ResetMsg на основе askTimer!
if( resetMsgTime&gt;0 &amp;&amp; trResetMsg.hi(ptResetMsg.checkTime()) )
{
// cout &lt;&lt; myname &lt;&lt; ": ********* reset messages *********" &lt;&lt; endl;
resetMsg();
}
// ( ..)
// обработка сообщений (таймеров и т.п.)
for( int i=0; i&lt;<xsl:call-template name="settings"><xsl:with-param name="varname" select="'msg-count'"/></xsl:call-template>; i++ )
{
if( !receiveMessage(msg) )
......@@ -67,17 +67,17 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::callback()
updatePreviousValues();
}
//
// Выполнение шага программы
step();
// ""
// "сердцебиение"
if( idHeartBeat!=DefaultObjectId &amp;&amp; ptHeartBeat.checkTime() )
{
ui.saveValue(idHeartBeat,maxHeartBeat,UniversalIO::AnalogInput);
ptHeartBeat.reset();
}
//
// обновление выходов
updateOutputs(false);
updatePreviousValues();
}
......@@ -87,7 +87,7 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::callback()
}
catch(CORBA::SystemException&amp; ex)
{
unideb[Debug::CRIT] &lt;&lt; myname &lt;&lt; "(execute): ORBA::SystemException: "
unideb[Debug::CRIT] &lt;&lt; myname &lt;&lt; "(execute): СORBA::SystemException: "
&lt;&lt; ex.NP_minorString() &lt;&lt; endl;
}
catch(...)
......@@ -207,7 +207,7 @@ bool <xsl:value-of select="$CLASSNAME"/>_SK::getState( UniSetTypes::ObjectId sid
</xsl:choose>
}
</xsl:for-each>
unideb[Debug::CRIT] &lt;&lt; myname &lt;&lt; "(getState): sid="
unideb[Debug::CRIT] &lt;&lt; myname &lt;&lt; "(getState): Обращение к неизвестному ДИСКРЕТНОМУ датчику sid="
&lt;&lt; sid &lt;&lt; endl;
return false;
......@@ -257,14 +257,14 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::askSensors( UniversalIO::UIOCommand
{
unideb[Debug::CRIT] &lt;&lt; myname &lt;&lt; "(askSensors): catch(...)" &lt;&lt; endl;
}
#warning .
#warning Сделать паузу между заказами настраиваемой из конф. файла
msleep(2000);
}
}
// -----------------------------------------------------------------------------
void <xsl:value-of select="$CLASSNAME"/>_SK::setMsg( UniSetTypes::ObjectId code, bool state )
{
// (.. )
// блокируем сброс (т.к. он автоматически по таймеру)
if( !state )
{
ptResetMsg.reset();
......
......@@ -15,7 +15,7 @@
<xsl:call-template name="settings"><xsl:with-param name="varname" select="'ID'"/></xsl:call-template>
</xsl:variable>
<!-- cc- -->
<!-- Генерирование cc-файла -->
<xsl:template match="/">
<!-- BEGIN CC-FILE -->
......@@ -32,8 +32,8 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::callback()
return;
try
{
// NOTE: ?!!
//
// NOTE: Нужно ли здесь опрашивать текущее значение выходов?!!
// Опрос входов
updateValues();
if( idLocalTestMode_S != DefaultObjectId )
......@@ -54,7 +54,7 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::callback()
checkSensors();
//
// проверка таймеров
checkTimers(this);
if( resetMsgTime&gt;0 &amp;&amp; trResetMsg.hi(ptResetMsg.checkTime()) )
......@@ -63,7 +63,7 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::callback()
resetMsg();
}
// ( ..)
// обработка сообщений (таймеров и т.п.)
for( int i=0; i&lt;<xsl:call-template name="settings"><xsl:with-param name="varname" select="'msg-count'"/></xsl:call-template>; i++ )
{
if( !receiveMessage(msg) )
......@@ -71,17 +71,17 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::callback()
processingMessage(&amp;msg);
}
//
// Выполнение шага программы
step();
// ""
// "сердцебиение"
if( idHeartBeat!=DefaultObjectId &amp;&amp; ptHeartBeat.checkTime() )
{
ui.saveValue(idHeartBeat,maxHeartBeat,UniversalIO::AnalogInput);
ptHeartBeat.reset();
}
//
// Формирование выходов
updateOutputs(false);
updatePreviousValues();
......@@ -92,7 +92,7 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::callback()
}
catch(CORBA::SystemException&amp; ex)
{
unideb[Debug::CRIT] &lt;&lt; myname &lt;&lt; "(execute): ORBA::SystemException: "
unideb[Debug::CRIT] &lt;&lt; myname &lt;&lt; "(execute): СORBA::SystemException: "
&lt;&lt; ex.NP_minorString() &lt;&lt; endl;
}
catch(...)
......@@ -159,7 +159,7 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::askSensors( UniversalIO::UIOCommand
// -----------------------------------------------------------------------------
void <xsl:value-of select="$CLASSNAME"/>_SK::askState( UniSetTypes::ObjectId sid, UniversalIO::UIOCommand cmd, UniSetTypes::ObjectId node )
{
// #warning ...
// #warning НЕ РЕАЛИЗОВАНА...
if( cmd == UniversalIO::UIONotify )
{
SensorMessage sm( sid, (bool)ui.getState(sid,node) );
......@@ -171,7 +171,7 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::askState( UniSetTypes::ObjectId sid
// -----------------------------------------------------------------------------
void <xsl:value-of select="$CLASSNAME"/>_SK::askValue( UniSetTypes::ObjectId sid, UniversalIO::UIOCommand cmd, UniSetTypes::ObjectId node )
{
// #warning ..
// #warning НЕ РЕАЛИЗОВАНА..
if( cmd == UniversalIO::UIONotify )
{
SensorMessage sm( sid, (long)ui.getValue(sid,node) );
......@@ -188,7 +188,7 @@ bool <xsl:value-of select="$CLASSNAME"/>_SK::getState( UniSetTypes::ObjectId sid
return <xsl:call-template name="setprefix"/><xsl:value-of select="@name"/>;
</xsl:for-each>
unideb[Debug::CRIT] &lt;&lt; myname &lt;&lt; "(getState): sid="
unideb[Debug::CRIT] &lt;&lt; myname &lt;&lt; "(getState): Обращение к неизвестному ДИСКРЕТНОМУ датчику sid="
&lt;&lt; sid &lt;&lt; endl;
return false;
}
......@@ -200,7 +200,7 @@ void <xsl:value-of select="$CLASSNAME"/>_SK::preSensorInfo( UniSetTypes::SensorM
// -----------------------------------------------------------------------------
void <xsl:value-of select="$CLASSNAME"/>_SK::setMsg( UniSetTypes::ObjectId code, bool state )
{
// (.. )
// блокируем сброс (т.к. он автоматически по таймеру)
if( !state )
{
ptResetMsg.reset();
......
......@@ -16,15 +16,15 @@
</xsl:variable>
<!-- -->
<!-- Генерирование заголовочного файла -->
<xsl:template match="/">
// --------------------------------------------------------------------------
/*
DO NOT EDIT THIS FILE. IT IS AUTOGENERATED FILE.
ALL YOUR CHANGES WILL BE LOST.
. .
.
НЕ РЕДАКТИРУЙТЕ ЭТОТ ФАЙЛ. ЭТОТ ФАЙЛ СОЗДАН АВТОМАТИЧЕСКИ.
ВСЕ ВАШИ ИЗМЕНЕНИЯ БУДУТ ПОТЕРЯНЫ.
*/
// --------------------------------------------------------------------------
// generate timestamp: <xsl:value-of select="date:date()"/>
......@@ -56,14 +56,14 @@ class <xsl:value-of select="$CLASSNAME"/>_SK:
<xsl:call-template name="COMMON-HEAD-PUBLIC"/>
//
// Используемые идентификаторы
<xsl:for-each select="//sensors/item">
<xsl:call-template name="setvar">
<xsl:with-param name="GENTYPE" select="'H'"/>
</xsl:call-template>
</xsl:for-each>
//
// Используемые идентификаторы сообщений
<xsl:for-each select="//sensors/item">
<xsl:call-template name="setmsg">
<xsl:with-param name="GENTYPE" select="'H'"/>
......
......@@ -15,15 +15,15 @@
<xsl:call-template name="settings"><xsl:with-param name="varname" select="'ID'"/></xsl:call-template>
</xsl:variable>
<!-- -->
<!-- Генерирование заголовочного файла -->
<xsl:template match="/">
// --------------------------------------------------------------------------
/*
DO NOT EDIT THIS FILE. IT IS AUTOGENERATED FILE.
ALL YOUR CHANGES WILL BE LOST.
. .
.
НЕ РЕДАКТИРУЙТЕ ЭТОТ ФАЙЛ. ЭТОТ ФАЙЛ СОЗДАН АВТОМАТИЧЕСКИ.
ВСЕ ВАШИ ИЗМЕНЕНИЯ БУДУТ ПОТЕРЯНЫ.
*/
// --------------------------------------------------------------------------
// generate timestamp: <xsl:value-of select="date:date()"/>
......@@ -54,20 +54,20 @@ class <xsl:value-of select="$CLASSNAME"/>_SK:
<xsl:call-template name="COMMON-HEAD-PUBLIC"/>
//
// Используемые идентификаторы
<xsl:for-each select="//smap/item">const UniSetTypes::ObjectId <xsl:value-of select="@name"/>; /*!&lt; <xsl:value-of select="@comment"/> */
const UniSetTypes::ObjectId node_<xsl:value-of select="@name"/>;
</xsl:for-each>
//
// Используемые идентификаторы сообщений
<xsl:for-each select="//msgmap/item">
const UniSetTypes::ObjectId <xsl:value-of select="@name"/>; /*!&lt; <xsl:value-of select="@comment"/> */
const UniSetTypes::ObjectId node_<xsl:value-of select="@name"/>;
bool m_<xsl:value-of select="@name"/>; /*!&lt; /> */
bool prev_m_<xsl:value-of select="@name"/>; /*!&lt; /> */
bool m_<xsl:value-of select="@name"/>; /*!&lt; текущее состояние /> */
bool prev_m_<xsl:value-of select="@name"/>; /*!&lt; предыдущее состояние /> */
</xsl:for-each>
//
// Текущее значение и предыдущее значение
<xsl:for-each select="//smap/item">
<xsl:call-template name="settype"><xsl:with-param name="iotype" select="@iotype"/></xsl:call-template><xsl:text> </xsl:text><xsl:call-template name="setprefix"/><xsl:value-of select="@name"/>;
<xsl:call-template name="settype"><xsl:with-param name="iotype" select="@iotype"/></xsl:call-template><xsl:text> prev_</xsl:text><xsl:call-template name="setprefix"/><xsl:value-of select="@name"/>;
......
......@@ -16,15 +16,15 @@
</xsl:variable>
<!-- main UniSet_FSM -->
<!-- Генерирование main для UniSet_FSM -->
<xsl:template match="/">
// --------------------------------------------------------------------------
/*
DO NOT EDIT THIS FILE. IT IS AUTOGENERATED FILE.
ALL YOUR CHANGES WILL BE LOST.
. .
.
НЕ РЕДАКТИРУЙТЕ ЭТОТ ФАЙЛ. ЭТОТ ФАЙЛ СОЗДАН АВТОМАТИЧЕСКИ.
ВСЕ ВАШИ ИЗМЕНЕНИЯ БУДУТ ПОТЕРЯНЫ.
*/
// --------------------------------------------------------------------------
// generate timestamp: <xsl:value-of select="date:date()"/>
......@@ -42,9 +42,9 @@ int main( int argc,char* argv[] )
{
if( argc>1 &amp;&amp; !strcmp(argv[1],"--help") )
{
cout &lt;&lt; "--name name - ID . IOController1." &lt;&lt; endl;
cout &lt;&lt; "--confile fname - . . configure.xml" &lt;&lt; endl;
cout &lt;&lt; "--logfile fname - fname. <xsl:value-of select="$CLASSNAME"/>.log" &lt;&lt; endl;
cout &lt;&lt; "--name name - ID процесса. По умолчанию IOController1." &lt;&lt; endl;
cout &lt;&lt; "--confile fname - Конф. файл. по умолчанию configure.xml" &lt;&lt; endl;
cout &lt;&lt; "--logfile fname - выводить логи в файл fname. По умолчанию <xsl:value-of select="$CLASSNAME"/>.log" &lt;&lt; endl;
return 0;
}
......@@ -58,7 +58,7 @@ int main( int argc,char* argv[] )
string logname( conf->getLogDir() + logfilename );
unideb.logFile( logname.c_str() );
// ID
// определяем ID объекта
ObjectId ID(DefaultObjectId);
string name = conf->getArgParam("--name","<xsl:value-of select="normalize-space($OID)"/>");
if( !name.empty() )
......@@ -66,9 +66,9 @@ int main( int argc,char* argv[] )
if( ID == UniSetTypes::DefaultObjectId )
{
cerr &lt;&lt; "(main): '" &lt;&lt; name
&lt;&lt; "' . !"
&lt;&lt; " " &lt;&lt; conf->getObjectsSection() &lt;&lt; endl;
cerr &lt;&lt; "(main): идентификатор '" &lt;&lt; name
&lt;&lt; "' не найден в конф. файле!"
&lt;&lt; " в секции " &lt;&lt; conf->getObjectsSection() &lt;&lt; endl;
return 1;
}
......@@ -80,7 +80,7 @@ int main( int argc,char* argv[] )
SystemMessage sm(SystemMessage::StartUp);
act.broadcast( sm.transport_msg() );
act.run(false);
pause(); // ,
pause(); // пауза, чтобы дочерние потоки успели завершить работу
}
catch(Exception&amp; ex)
{
......
......@@ -15,7 +15,7 @@
<xsl:call-template name="settings"><xsl:with-param name="varname" select="'ID'"/></xsl:call-template>
</xsl:variable>
<!-- main UniSet_FSM -->
<!-- Генерирование main для UniSet_FSM -->
<xsl:template match="/">
// --------------------------------------------------------------------------
......@@ -23,8 +23,8 @@
DO NOT EDIT THIS FILE. IT IS AUTOGENERATED FILE.
ALL YOUR CHANGES WILL BE LOST.
. .
.
НЕ РЕДАКТИРУЙТЕ ЭТОТ ФАЙЛ. ЭТОТ ФАЙЛ СОЗДАН АВТОМАТИЧЕСКИ.
ВСЕ ВАШИ ИЗМЕНЕНИЯ БУДУТ ПОТЕРЯНЫ.
*/
// --------------------------------------------------------------------------
// generate timestamp: <xsl:value-of select="date:date()"/>
......@@ -42,9 +42,9 @@ int main( int argc, const char** argv )
{
if( argc>1 &amp;&amp; strcmp(argv[1],"--help")==0 )
{
cout &lt;&lt; "--name name - ID . <xsl:value-of select="$CLASSNAME"/>." &lt;&lt; endl;
cout &lt;&lt; "--confile fname - . . configure.xml" &lt;&lt; endl;
cout &lt;&lt; "--logfile fname - fname. <xsl:value-of select="$CLASSNAME"/>.log" &lt;&lt; endl;
cout &lt;&lt; "--name name - ID процесса. По умолчанию <xsl:value-of select="$CLASSNAME"/>." &lt;&lt; endl;
cout &lt;&lt; "--confile fname - Конф. файл. по умолчанию configure.xml" &lt;&lt; endl;
cout &lt;&lt; "--logfile fname - выводить логи в файл fname. По умолчанию <xsl:value-of select="$CLASSNAME"/>.log" &lt;&lt; endl;
return 0;
}
......@@ -62,7 +62,7 @@ int main( int argc, const char** argv )
<xsl:value-of select="$CLASSNAME"/> obj;
</xsl:if>
<xsl:if test="normalize-space(//@OID)=''">
// ID
// определяем ID объекта
ObjectId ID(DefaultObjectId);
string name = conf->getArgParam("--name","<xsl:value-of select="$CLASSNAME"/>");
if( !name.empty() )
......@@ -70,9 +70,9 @@ int main( int argc, const char** argv )
ID = conf->getObjectID(name);
if( ID == UniSetTypes::DefaultObjectId )
{
cerr &lt;&lt; "(main): '" &lt;&lt; name
&lt;&lt; "' . !"
&lt;&lt; " " &lt;&lt; conf->getObjectsSection() &lt;&lt; endl;
cerr &lt;&lt; "(main): идентификатор '" &lt;&lt; name
&lt;&lt; "' не найден в конф. файле!"
&lt;&lt; " в секции " &lt;&lt; conf->getObjectsSection() &lt;&lt; endl;
return 0;
}
}
......@@ -85,7 +85,7 @@ int main( int argc, const char** argv )
SystemMessage sm(SystemMessage::StartUp);
act.broadcast( sm.transport_msg() );
act.run(false);
pause(); // ,
pause(); // пауза, чтобы дочерние потоки успели завершить работ
}
catch(Exception&amp; ex)
{
......
<?xml version="1.0" encoding="koi8-r"?>
<!--
name -
msgcount -
sleep_msec -
name - название класса
msgcount - сколько сообщений обрабатывается за один раз
sleep_msec - пауза между итерациями в работе процесса
type
====
in - ( )
out - ()
io -
in - входные регистры (только для чтения)
out - выходные регистры (запись)
io - запись и чтение
-->
<GlobalConfigure>
......
<?xml version="1.0" encoding="koi8-r"?>
<!--
name -
msgcount -
sleep_msec -
name - название класса
msgcount - сколько сообщений обрабатывается за один раз
sleep_msec - пауза между итерациями в работе процесса
type
====
in - ( )
out - ()
io -
in - входные регистры (только для чтения)
out - выходные регистры (запись)
io - запись и чтение
-->
<Test>
<settings>
......@@ -17,14 +17,14 @@
<set name="sleep-msec" val="150"/>
</settings>
<smap>
<!-- name - . -->
<!-- name - название переменной в конф. файле -->
<item name="input1_s" vartype="in" iotype="DI" comment="comment for input1" />
<item name="input2_s" vartype="in" iotype="DI" comment="comment for input2" />
<item name="output1_c" vartype="out" iotype="DO" omment="comment for output1" />
</smap>
<msgmap>
<!-- name - . -->
<!-- name - название переменной в конф. файле -->
<item name="mid_Message1" comment="comment for Message 1" />
</msgmap>
</Test>
......@@ -3,7 +3,7 @@
USERID=0
BASEOMNIPORT=2809
#
# Получаем наш внутренний номер пользователя
function get_userid()
{
USERID=$(expr $UID + 50000)
......@@ -15,19 +15,19 @@ function standart_control()
if [ -z $TMPDIR ]
then
TMPDIR=$HOME/tmp
echo TMPDIR. $TMPDIR
echo Не определена переменная окружения TMPDIR. Используем $TMPDIR
else
echo TMPDIR=$TMPDIR
echo Определена TMPDIR=$TMPDIR
fi
if [ $1 = 1 ]; then
TMPDIR=/var/tmp
echo Omni: $BASEOMNIPORT $TMPDIR
echo Используем стандартный порт Omni: $BASEOMNIPORT и временный каталог $TMPDIR
else
get_userid
if [ $USERID = 0 ]
then
echo $(whoami) uid=$UID
echo Не разрешено запускать пользователю $(whoami) с uid=$UID
exit 0
fi
fi
......@@ -54,10 +54,10 @@ function set_omni_port
function set_omni
{
# omniORB
# Каталог для хранения записей omniORB
OMNILOG=$TMPDIR/omniORB
#
# Файл для хранения перечня запущенных в фоновом режиме процессов
RANSERVICES=$OMNILOG/ran.list
touch $RANSERVICES
......@@ -69,15 +69,15 @@ function set_omni
then
if [ $USERID = 0 ]
then
echo INFO: $OMNIPORT /etc/services.
echo INFO: Запись о порте $OMNIPORT присутствует в /etc/services.
else
echo , $OMNIPORT /etc/services.
echo omniNames .
echo
echo Извините, порт $OMNIPORT уже присутствует в /etc/services.
echo Запуск omniNames невозможен.
echo Завершаемся
exit 0
fi
fi
[ -e $(which $OMNINAME) ] || { echo Error: $OMNINAME ; exit 0; }
[ -e $(which $OMNINAME) ] || { echo Error: Команда $OMNINAME не найдена ; exit 0; }
}
......@@ -94,29 +94,29 @@ function runOmniNames()
if [ $omniTest \> 0 ];
then
echo $OMNINAME . #.
echo $OMNINAME уже запущен. #Прерываем.
return 0;
fi
if [ ! -d $OMNILOG ]
then
mkdir -p $OMNILOG
echo omniNames $OMNIPORT
echo Запуск omniNames первый раз с портом $OMNIPORT
$OMNINAME -start $OMNIPORT -logdir $OMNILOG &>$OMNILOG/background.output &
pid=$!
echo
echo Создание структуры репозитория объектов
else
echo omniNames. , $OMNILOG
echo Обычный запуск omniNames. Если есть проблемы, сотрите $OMNILOG
$OMNINAME -logdir $OMNILOG &>$OMNILOG/background.output &
pid=$!
fi
RET=$?
if [ $RET = 0 ]; then
if [ $WITH_PID = 1 ]; then
echo $pid >"$RUNDIR/$OMNINAME.pid" # pid-
echo $pid >"$RUNDIR/$OMNINAME.pid" # создаём pid-файл
fi;
else
echo omniNames
echo Запуск omniNames не удался
return 1;
fi
#echo $! $OMNINAME >>$RANSERVICES
......@@ -126,10 +126,10 @@ function runOmniNames()
echo 0 $OMNINAME >>$RANSERVICES
fi
# omniNames -
# Проверка на запуск omniNames -а
yes=$(echo $* | grep omniNames )
if [ -n "$yes" ]; then
echo omniNames [ OK ]
echo Запуск omniNames [ OK ]
$RETVAL=0
fi
......
#!/bin/sh
#
# общие функции
. uniset-functions.sh
WITH_PID=0
......@@ -17,21 +17,21 @@ case $1 in
COMLINE=$*
if [ -z "$COMLINE" ]
then
echo " "
echo "Не указана команда для запуска"
exit 0
fi
COMLINE="$COMLINE --uniset-port $OMNIPORT"
echo "$COMLINE"
echo Запускаем "$COMLINE"
$COMLINE
echo
echo Выходим
exit 1
;;
esac
if [ -z "$*" ]
then
echo " "
echo "Не указана команда для запуска"
exit 0
fi
......@@ -45,14 +45,14 @@ fi
PIDFILE="$RUNDIR/$(basename $NAMEPROG).pid"
fi
echo -n $NAMEPROG ...
echo -n Запускаем $NAMEPROG в фоновом режиме...
echo ""
ulimit -S -c 0 >/dev/null 2>&1
# $* --uniset-port $OMNIPORT &
echo : "$* --uniset-port $OMNIPORT"
echo ЗАПУСК: "$* --uniset-port $OMNIPORT"
pid=$!
echo $pid >$PIDFILE # pid-
echo $pid >$PIDFILE # создаём pid-файл
PROGLINE=$(ps -x | grep -q $(basename $NAMEPROG) | grep -v $0 | grep -v grep)
......
......@@ -3,8 +3,8 @@
SIG=-TERM
ARGS=$1
# ,
# ţ :) (. makefile :install)
# внимание при сборке пакета эта строка меняется,
# поэтому лучше её не трогать :) (см. makefile :install)
. uniset-functions.sh
std=0
......@@ -28,14 +28,14 @@ fi
if [ ! -e $RANSERVICES ]
then
echo $RANSERVICES
echo Не существует $RANSERVICES с запущенными сервисами
exit -1
fi
for i in $(tac $RANSERVICES | cut -d " " -f 2)
do
TOKILL=$(basename $i)
echo -n $TOKILL...
echo -n Завершаем $TOKILL...
if [ $(ps ax | grep $TOKILL | wc -l) = 0 ]
then
echo " already stoppped [ OK ]"
......
# This file is a part of the NCS project. (c) 1999-2002 All rights reserved.
# $Id: idl.mk,v 1.2 2006/10/14 16:53:22 vpashka Exp $
# IDL
# , omniidl
# - ,
# IDL
# Общий файл для IDL
# Нужно иметь в виду, что когда порождаемые omniidl файлы
# будут кем-либо изменены, они перегенерируются только
# при изменении исходного IDL
IDLFLAGS = -I$(top_builddir)/IDL
#
# Получения списков генерируемых файлов
HHTARG=$(patsubst %.idl, ${HHDIR}/%.hh, ${IDLFILES})
CCTARG=$(patsubst %.idl, ${CCDIR}/%SK.cc, ${IDLFILES})
......
#!/bin/sh
# rpm-
# Вспомогательный скрипт для подготовки и сборки rpm-пакета с системой
ETERBUILDVERSION=163
. /usr/share/eterbuild/eterbuild
......@@ -38,9 +38,9 @@ function send_notify()
export EMAIL="$USER@$MAILDOMAIN"
CURDATE=`date`
MAILTO="devel@$MAILDOMAIN"
# FIXME:
# FIXME: проверка отправки
mutt $MAILTO -s "[$PROJECT] New build: $BUILDNAME" <<EOF
: $BUILDNAME
Готова новая сборка: $BUILDNAME
--
your $0
$CURDATE
......@@ -71,9 +71,9 @@ cp2ftp
rpmbs $SPECNAME
#send_notify
#
# Увеличиваем релиз и запоминаем спек после успешной сборки
inc_release $SPECNAME
#
# и запоминаем спек после успешной сборки
#cvs commit -m "Auto updated by $0 for $BUILDNAME" $SPECNAME || fatal "Can't commit spec"
# Note: we in topscrdir
......
......@@ -2,7 +2,7 @@
<UNISETPLC>
<UserData></UserData>
<!-- () UniSet -->
<!-- Общие(стартовые) параметры по UniSet -->
<UniSet>
<NameService host="localhost" port="2809"/>
<LocalNode name="LocalhostNode"/>
......@@ -12,16 +12,16 @@
<RepeatCount name="3"/>
<RepeatTimeoutMS name="50"/>
<WatchDogTime name="0"/> <!-- [] -->
<PingNodeTime name="0"/> <!-- [] -->
<AutoStartUpTime name="1"/> <!-- [] -->
<DumpStateTime name="10"/><!-- [] -->
<SleepTickMS name="500"/><!-- [] -->
<WatchDogTime name="0"/> <!-- [мин] -->
<PingNodeTime name="0"/> <!-- [сек] -->
<AutoStartUpTime name="1"/> <!-- [сек] -->
<DumpStateTime name="10"/><!-- [сек] -->
<SleepTickMS name="500"/><!-- [мсек] -->
<!-- Debug, logs -->
<UniSetDebug name="unideb" levels="crit,warn" file=""/>
<!-- , -->
<!-- Если не указано, то считается текущий каталог -->
<ConfDir name=""/>
<DataDir name=""/>
<BinDir name=""/>
......@@ -68,11 +68,11 @@
aftersend-pause="0" levels="info,warn,crit" poll_time="200" reply_timeout="60"
>
<filelist>
<!-- ۣ modbus
directory - .
'ConfDir' - ң (. )
'DataDir' - ң (. )
'xxx' -
<!-- Список файлов разрешённых для передачи по modbus
directory - каталог где лежит файл. Можно не задавать
'ConfDir' - берётся из настроек (см. начало этого файла)
'DataDir' - берётся из настроек (см. начало этого файла)
'xxx' - прямое указание каталога
-->
<item id="1" name="configure.xml" directory="ConfDir"/>
<item id="2" name="VERSION" directory="ConfDir"/>
......@@ -95,27 +95,27 @@
<ObjectsMap idfromfile="0">
<!--
'sensors'
Краткие пояснения к полям секции 'sensors'
==========================================
node -
iotype -
priority -
textname -
node - узел на котором физически находится данный датчик
iotype - тип датчика
priority - приоритет сообщения об изменении данного датчика
textname - текстовое имя датчика
-->
<nodes port="2809">
<item name="LocalhostNode" alias="" textname=" " ip="127.0.0.1" infserver="InfoServer" dbserver=""/>
<item name="Node2" alias="" textname=" " ip="127.0.0.1" infserver="InfoServer" dbserver=""/>
<item name="LocalhostNode" alias="" textname="Локальный узел" ip="127.0.0.1" infserver="InfoServer" dbserver=""/>
<item name="Node2" alias="" textname="Локальный узел" ip="127.0.0.1" infserver="InfoServer" dbserver=""/>
</nodes>
<!-- ************************ ********************** -->
<!-- ************************ Датчики ********************** -->
<sensors name="Sensors">
<item name="Input1_S" textname=" 1" node="" iotype="DI" priority="Medium" default="1" />
<item name="Input2_S" textname=" 2" node="" iotype="DI" priority="Medium" mbtype="rtu" mbaddr="0x01" mbfunc="0x04" mbreg="0x02" rs="2" />
<item name="Input3_S" textname=" 3" node="" iotype="DI" priority="Medium"
<item name="Input1_S" textname="Команда 1" node="" iotype="DI" priority="Medium" default="1" />
<item name="Input2_S" textname="Команда 2" node="" iotype="DI" priority="Medium" mbtype="rtu" mbaddr="0x01" mbfunc="0x04" mbreg="0x02" rs="2" />
<item name="Input3_S" textname="Команда 3" node="" iotype="DI" priority="Medium"
mbtcp="1" tcp_mbtype="rtu" tcp_mbaddr="0x02" tcp_mbfunc="0x06" tcp_mbreg="0x02" tcp_preinit="1" />
<item name="Input4_S" textname=" 4" node="" iotype="DI" priority="Medium" mbtype="rtu" mbaddr="0x02" mbfunc="0x04" mbreg="0x02" rs="2" />
<item name="Input5_S" textname=" 5" node="" iotype="DI" priority="Medium" udp="2"/>
<item name="Input6_S" textname=" 6" node="" iotype="DI" priority="Medium" udp="2">
<item name="Input4_S" textname="Команда 4" node="" iotype="DI" priority="Medium" mbtype="rtu" mbaddr="0x02" mbfunc="0x04" mbreg="0x02" rs="2" />
<item name="Input5_S" textname="Команда 5" node="" iotype="DI" priority="Medium" udp="2"/>
<item name="Input6_S" textname="Команда 6" node="" iotype="DI" priority="Medium" udp="2">
<depends>
<depend name="Input4_S"/>
</depends>
......@@ -132,7 +132,7 @@
<consumer name="PLCProcessor" type="objects"/>
</consumers>
</item>
<item name="Threshold1_S" textname="" node="" iotype="DI" priority="Medium"/>
<item name="Threshold1_S" textname="Порог" node="" iotype="DI" priority="Medium"/>
<item name="TestMode_S" textname="test" node="" iotype="DI" priority="Medium"/>
<item name="RespondRTU_S" textname="respond rtu" node="" iotype="DI"/>
......@@ -168,7 +168,7 @@
<item name="UniExchange2"/>
</controllers>
<!-- ******************* ***************** -->
<!-- ******************* Идентификаторы сервисов ***************** -->
<services name="Services">
<item name="InfoServer"/>
<item name="DBServer"/>
......@@ -176,7 +176,7 @@
<item name="TimeService"/>
</services>
<!-- ******************* ***************** -->
<!-- ******************* Идентификаторы объектов ***************** -->
<objects name="UniObjects">
<item name="TestProc"/>
<item name="LProcessor"/>
......
/*!
\page ConfigurationPage
\page ConfigurationPage Конфигурирование системы
- \ref ConfigurationPage_secCommon
- \ref ConfigurationPage_secConfFile
\section ConfigurationPage_secCommon
\section ConfigurationPage_secCommon Общее описание
( "configure.xml").
UniSetTypes::conf (. UniSetTypes::Configuration).
UniSetTypes::conf->oind (. UniSetTypes::Configuration::oind),
UniSetTypes::conf->mi (. UniSetTypes::Configuration::mi),
...
Для конфигурирования сиситемы используется файл (обычно "configure.xml").
Все параметры програмно можно получить при помощи указателя на конфигуратор UniSetTypes::conf (см. UniSetTypes::Configuration).
Он позволяет работать с картой объектов при помощи вызова UniSetTypes::conf->oind (см. UniSetTypes::Configuration::oind),
картой сообщений при помощи вызова UniSetTypes::conf->mi (см. UniSetTypes::Configuration::mi),
получать идентификаторы сервисов...
UniSetTypes::conf .
main. :
Указатель UniSetTypes::conf должен быть обязательно инициализирован. Обычно это происходит в начале
функции main. Например так:
\code
...
#include "ObjectsMap.h"
......@@ -29,24 +29,24 @@ int main(int argc, char **argv)
}
catch(Exception& ex )
{
unideb[Debug::CRIT] << "(main): " << ex << endl;
unideb[Debug::CRIT] << "(main): Поймали исключение " << ex << endl;
}
catch(...)
{
unideb[Debug::CRIT] << " !!!!"<< endl;
unideb[Debug::CRIT] << "Неизвестное исключение!!!!"<< endl;
}
...
}
\endcode
\section ConfigurationPage_secConfFile
\section ConfigurationPage_secConfFile Пример конфигурационного файла
\code
<?xml version = '1.0' encoding = 'koi8-r' ?>
<UniSetTestConfiguration>
<!-- UniSet -->
<!-- Общие параметры по UniSet -->
<UniSet>
<LocalNode name="LocalhostNode"/>
<RootSection name="UniSet"/>
......@@ -57,14 +57,14 @@ int main(int argc, char **argv)
<RepeatTimeoutMS name="50"/>
<UniSetDebug name="unideb" levels="crit,warn" file=""/>
<!-- SystemGuard -->
<WatchDogTime name="0"/> <!-- [] -->
<PingNodeTime name="15"/> <!-- [] -->
<AutoStartUpTime name="1"/> <!-- [] -->
<DumpStateTime name="0"/><!-- [] -->
<SleepTickMS name="2000"/><!-- [] -->
<!-- параметры для SystemGuard -->
<WatchDogTime name="0"/> <!-- [мин] -->
<PingNodeTime name="15"/> <!-- [сек] -->
<AutoStartUpTime name="1"/> <!-- [сек] -->
<DumpStateTime name="0"/><!-- [сек] -->
<SleepTickMS name="2000"/><!-- [мсек] -->
<!-- , -->
<!-- Если не указано, то считается текущий каталог -->
<ConfDir name=""/>
<DataDir name=""/>
<BinDir name=""/>
......@@ -89,12 +89,12 @@ int main(int argc, char **argv)
</Services>
<!-- -->
<!-- список узлов в сиситеме -->
<ListOfNodes>
<!--
:
infserver - id - ( "", )
dbnode - id db- DB( "", )
Параметры:
infserver - id инфо-сервера на данном узле(если указать "", значит нет)
dbnode - id db-сервера на данном узле DB(если указать "", значит нет)
-->
<Node name="LocalhostNode" infserver="InfoServer1" dbserver="DBServer1"/>
......
/* OBSOLETE DOC!!!
\page ControlProcessPage
\page ControlProcessPage Как писать процесс управления
- \ref pgCP_secDeclareIDL
- \ref pgCP_secImplementation
......@@ -7,15 +7,15 @@
- \ref pgCP_secLT_Object
- \ref pgCP_secRecomendation
UniSetObject.
Все рядовые процессы управления должны наследоваться от класса UniSetObject.
\par
\c on() \c off().
IDL.
Рассмотрим процесс написания на примере самого простого процесса управления реализующего
две функции \c on() и \c off(). Чтобы эти функции были доступны другим процессам необходимо
объявить интерфейс на языке IDL.
\section pgCP_secDeclareIDL IDL
UniSetObject, IDL-.
\section pgCP_secDeclareIDL Объявление интерфейса на IDL
Как писалось выше процесс управления должен наследоваться UniSetObject, это касается и IDL-интерфейса.
Пример объявления
\code
#ifndef TestActiveProcess_i_IDL_
#define TestActiveProcess_i_IDL_
......@@ -31,18 +31,18 @@ interface TestActiveProcess_i: UniSetObject_i
\endcode
\par
:
После компиляции автоматически генерируются следующие файлы:
- TestActiveProcess_iSK.cc
- TestActiveProcess_iSK.hh
++.
На основе этих файлов вы реализуете свой интерфейс на С++.
\section pgCP_secImplementation C++
.
. \ref UniSetLibStylePage.
\section pgCP_secImplementation Реализация интерфейса на C++
Необходимо создать класс реализующий объявленный интерфейс. Формирование названия класса и правила наследования
см. \ref UniSetLibStylePage.
\par
UniSetObject_i UniSetObject.
.
Базовые функции интерфейса UniSetObject_i уже реализованы в классе UniSetObject. Поэтому остается только
наследоваться от него и реализавать недостающие функции. В итоге получаем
\code
#ifndef TestActiveProcess_H_
#define TestActiveProcess_H_
......@@ -57,17 +57,17 @@ interface TestActiveProcess_i: UniSetObject_i
{
public:
// ------- ---------------
// ------- Конструктор с заданием обязательных параметров ---------------
TestActiveProcess( UniSetTypes::ObjectId id );
virtual ~TestActiveProcess();
// ------- IDL( ) ---------
// ------- функции объевленные в IDL(интерфейс данного объекта) ---------
virtual void on();
virtual void off();
protected:
// ( )
// Основная функция процесса (обработка приходящих сообщений)
virtual void processingMessage( UniSetTypes::VoidMessage *msg );
virtual void askSensors(UniversalIO::UIOCommand cmd);
......@@ -76,12 +76,12 @@ interface TestActiveProcess_i: UniSetObject_i
virtual void timerInfo( UniSetTypes::TimerMessage* tm );
virtual void sigterm( int signo );
// protected
//
// Сделан protected чтобы нельзя было создать объект класса
// не задав обязательных параметров
TestActiveProcess();
};
\endcode
:
Реализация функций может выглядеть примерно следующим образом:
\code
// ------------------------------------------------------------------------------------------
......@@ -119,7 +119,7 @@ interface TestActiveProcess_i: UniSetObject_i
}
default:
cout << myname << ": "<< msg->type << endl;
cout << myname << ": неизвестное сообщение "<< msg->type << endl;
break;
}
......@@ -136,11 +136,11 @@ interface TestActiveProcess_i: UniSetObject_i
{
try
{
//
// дискретные датчики
ui.askState(Sens1, cmd);
ui.askState(Sens2, cmd);
ui.askState(Sens3, cmd, remotenode);
//
// аналоговые датчики
ui.askValue(ASens1, cmd);
ui.askValue(ASens2, cmd);
}
......@@ -195,7 +195,7 @@ interface TestActiveProcess_i: UniSetObject_i
\endcode
\section pgCP_secMain main()
\section pgCP_secMain Написание функции main() для подключения процесса
\code
......@@ -226,7 +226,7 @@ interface TestActiveProcess_i: UniSetObject_i
}
catch(...)
{
cout << " !!!!"<< endl;
cout << "Неизвестное исключение!!!!"<< endl;
}
return 0;
......@@ -234,10 +234,10 @@ interface TestActiveProcess_i: UniSetObject_i
\endcode
\section pgCP_secLT_Object , TimerService-
, , .
UniSetObject, UniSetObject_LT.
.. :
\section pgCP_secLT_Object Создание автономного объекта, не зависящего от TimerService-а
Для повышения автономности работы, можно создать процесс, который сам будет реализовывать таймеры.
Для этого достаточно при создании своего процесса наследоватся не от UniSetObject, а от UniSetObject_LT.
Т.е. код будет выглядеть так:
\code
...
......@@ -251,7 +251,7 @@ interface TestActiveProcess_i: UniSetObject_i
\endcode
\a ui.askTimer(...), \a askTimer(...).
И при заказе таймеров надо использовать не \a ui.askTimer(...), а просто \a askTimer(...).
\code
function my_func()
......@@ -261,28 +261,28 @@ interface TestActiveProcess_i: UniSetObject_i
...
}
\endcode
UniSetObject_LT::askTimer() UniversalInterface::askTimer().
, UniSetObject::callback(),
, .
Функция UniSetObject_LT::askTimer() повторяет интерфейс UniversalInterface::askTimer().
Реализация построена, на переопределении функции UniSetObject::callback(), поэтому если поток
не будет создан, таймеры работать не будут.
\sa LT_Object, UniSetObject_LT, ObjectsManager_LT
\section pgCP_secRecomendation
\section pgCP_secRecomendation Некоторые общие рекомендации
-# .
-# () .
. UniSetObject::sigterm().
-#
-# , \b \a startUp
.
-# , , UniversalInterface.
(UniSetObject::ui), .
-# Все функции и параметры должны быть откоментированы.
-# При обработке завершающих(прерывающих) сигналов желательно производить отказ от заказанных датчиков.
см. UniSetObject::sigterm().
-# Желательно при выходе не забывать отказываться от датчиков
-# Заказ датчиков необходимых для работы процесса, \b ДОЛЖЕН происходить после прихода сообщения \a startUp
или другого подобного признака означающего разрешение на работу.
-# Заказ датчиков, таймеров, работа с информацией в основном происходит при помощи UniversalInterface. В каждом
классе имеется объект этого интерфейса (UniSetObject::ui), поэтому необходимости в отдельном его создании нет.
\warning ( ) \b .
.
\warning Заказ датчиков может (и должен) происходить \b только после активизации. Ваш процесс НЕ будет доступен
для приема команд и сообщений пока он не активизирован.
\par
...
Вот вроде и все пока...
*/
\ No newline at end of file
/*! \page DebugPage
/*! \page DebugPage Описание использования функций отладки
DebugStream.
,
̣ ̣ .
Класс для вывода отладочных сообщений называется DebugStream.
Сообщения могут выводится на экран и в файл, отбираться по
определённым критериям и до определённого уровня.
- \ref subUsing
- \ref subConf
\subsection subUsing
DebugStream
UniSetTypes::unideb.
, logFile(char const *f);
\subsection subUsing Использование
Для использования нужно создать свой объект класса DebugStream или
использовать глобальный объект UniSetTypes::unideb.
Для переключения вывода отладки в файл, используйте функцию logFile(char const *f);
DebugStream.h
.
Описание всех имеющихся функций находится в файле DebugStream.h
на английском языке.
unideb[...] .
unideb(...) ( ).
Функция unideb[...] по умолчанию выводит в строку дату и время.
Функция unideb(...) просто выводит строку (в конец предыдущему потоку).
\par :
\par Пример использования:
\code
#include "Debug.h"
#include "Configuration.h"
using namespace UniSetTypes;
...
unideb << " ";
unideb.addLevel(Debug::CRIT); // CRIT
unideb << "Этот текст будет выведен на экран в любом случае";
unideb.addLevel(Debug::CRIT); // показывать CRIT
unideb[Debug::CRIT] << " CRIT";
unideb.delLevel(Debug::CRIT); // CRIT
unideb[Debug::CRIT] << "Этот текст будет выведен при разрешении выводить сообщения уровня CRIT";
unideb.delLevel(Debug::CRIT); // больше не показывать CRIT
// INFO CRIT"
unideb[Debug::type(Debug::INFO | Debug::CRIT)] << " ";
// Отладочное сообщение будет выводиться при установленном уровне INFO или CRIT"
unideb[Debug::type(Debug::INFO | Debug::CRIT)] << "Отладочное сообщение";
//
unideb[Debug::INFO] << " ";
unideb(Debug::INFO) << " " << endl;
// Вывод многострочного сообщения
unideb[Debug::INFO] << " вывод с датой и временем ";
unideb(Debug::INFO) << " продолжение вывода без даты и времени " << endl;
\endcode
, :
Если вы хотите использовать отладочный вывод из критичного к времени
кода, используйте следующую конструкцию:
\code
if (unideb.debugging(Debug::INFO)) {
......@@ -50,15 +50,15 @@
\endcode
\subsection subConf
, .
\subsection subConf Конфигурирование логов
Конфигурирование логов можно производить, при помощи файла конфигурации или через командную строку.
UniSetTypes::unideb :
Например UniSetTypes::unideb настраивается в конфигурационном файле следующим образом:
\code
<UniSetDebug name="unideb" levels="crit,warn" file=""/>
\endcode
"--help"
При запуске программ используйте ключ "--help" для получения подробной информации
о настройке логов из командной строки
*/
/*!
\page MutexHowToPage uniset_mutex uniset_mutex_lock
\page MutexHowToPage Как пользоваться uniset_mutex и uniset_mutex_lock
\par
""(mutex) - . Mutual Exclusive. ( "")
"мьютекс"(mutex) - получено от англ. Mutual Exclusive. (нечто вроде "взаимоисключение")
\par
, , lock unlock.
()
Основными операциями для мьютексов, помимо создания и уничтожения, являются операции lock и unlock.
Логически работа с мьютексом могла бы выглядеть так (псевдокод)
\code
Mutex mutex;
......@@ -15,39 +15,39 @@
mutex.unlock();
\endcode
, .. \c DoSomething() ,
\c mutex.unlock() . \c try...catch, ,
. \b uniset_mutex_lock.
( ):
Но в общем случае это ни к чему хорошему не приведет, т.к. если в \c DoSomething() возникнет исключение, то
\c mutex.unlock() уже не выполнится. Конечно можно использовать \c try...catch, но желательно, чтобы
код работал независимо от ситуации. Для этого введен класс \b uniset_mutex_lock. При его использовании получается
следующий код (один из вариантов использования):
\code
using namespase UniSetTypes;
...
uniset_mutex mutex;
...
{
uniset_mutex_lock lock(mutex); // mutex.lock()
uniset_mutex_lock lock(mutex); // вызов mutex.lock() как часть кода конструктора
DoSomething();
} // <-- lock- mutex.unlock()
} // <-- Заканчивается зона видимости lock-а и происходит вызов mutex.unlock() как часть кода деструктора
\endcode
, \c DoSomethig()
. ...
В этом случае, даже если в \c DoSomethig() будет сгенерировано исключение ресурс будет освобожден
при вызове деструктора. Вот и все решение...
\par
...
Главное не забывайте ставить скобочки...
\par
\c mutex.lock() \c uniset_mutex.unlock() ,
\b uniset_mutex_lock. (. \ref secWarning).
Желательно не использовать \c mutex.lock() и \c uniset_mutex.unlock() в чистом виде, а только совместно с
\b uniset_mutex_lock. Кроме особых случаев (см. \ref secWarning).
\par
, \b , ,
. .
Следует помнить, что мьютексы \b фактически никаких ресурсов не захватывают, это только флаг означающий,
что ресурс занят. Поэтому работать с ними надо внимательно и не забывать блокировать ресурс там где это надо.
\par
. UniSetTypes::uniset_mutex UniSetTypes::uniset_mutex_lock
Описания классов см. UniSetTypes::uniset_mutex и UniSetTypes::uniset_mutex_lock
\section secWarning
\c DoSomethig() \c exit(0), \c abort() - ,
unlock . \c unlock() ,
, \a protected \a public.
\section secWarning Особые случаи
Если в \c DoSomethig() будет вызвана \c exit(0), \c abort() или что-нибудь подобное,
то unlock не произойдет. В таком случае следовало бы напрямую вызывать \c unlock() до вызова сигнала, но эти случаи редкие и если
возникнет необходимость, то можно будет вместо \a protected сделать их \a public.
\note . " CORBA ".
\note Описание составлено на основе описания мьютексов из книги А.Цимбала "Технология CORBA для профессионалов".
*/
/* OBSOLETE DOC!!!
\page ObjectRepositoryPage
\page ObjectRepositoryPage Репозиторий объектов
,
. ...
Репозиторий объектов предназначен для хранения и получения ссылок на объекты, с целью дальнейшего
использования функций предоставленных этими объектами. Объекты регистрирующиеся в репозитории могут быть удаленными...
- \ref subRegCommon
- \ref subReg
- \ref subResolve
\section subRegCommon
UniSetObject ( ) .
.
\section subRegCommon Вводная
При наследовании от UniSetObject (и его потомков) регистрация в репозитории происходит автоматически.
Поэтому регистрироватся отдельно нет необходимости.
\section subReg
.
\section subReg Регистрация
Для регистрации существует следующие функции.
По текстовому имени
- void ObjectRepository::registration(const ObjectName name, const ObjectPtr oRef, const string section)
- void ObjectRepository::registration(const ObjectName fullName, const ObjectPtr oRef)
По идентификатору
- void UniversalInterface::registered(UniSetTypes::ObjectId id, const UniSetTypes::ObjectPtr oRef)throw(ORepFailed);
- void UniversalInterface::registered(UniSetTypes::ObjectId id, UniSetTypes::ObjectId node, const UniSetTypes::ObjectPtr oRef)throw(ORepFailed);
:
Пример:
\code
#include "ObjectRepository.h"
......@@ -41,12 +41,12 @@
}
cacth(ORepFailed)
{
cerr << " " << endl;
cerr << "Не удалось зарегестировать объект " << endl;
}
\endcode
UniverslaInterface
Или при помощи UniverslaInterface
\code
class MyObject:
public UniSetObject
......@@ -72,16 +72,16 @@
\endcode
\section subResolve
\section subResolve Получение ссылки на объект
Для получения ссылки лучше всего пользоваться
- UniSetTypes::ObjectPtr UniversalInterface::resolve( UniSetTypes::ObjectId id )
- UniSetTypes::ObjectPtr UniversalInterface::resolve( UniSetTypes::ObjectId id, UniSetTypes::ObjectId nodeName, int timeoutMS=UniversalIO::defaultTimeOut)
throw(ResolveNameError, TimeOut);
.. UniversalInterface::resolve() , .
т.к. UniversalInterface::resolve() пытается получиться ссылку, в том числе через резервный каналы связи.
:
Пример:
\code
...
......
// h-
// эти разделы сформируются автоматически из описаний сделанных в соответствующих h-файлах
/*!
\page ServicesPage
\page ServicesPage Сервисы
- \ref secDBServer
- \ref secInfoService
- \ref secTimerService
\section secDBServer
\section secDBServer Сервер БД
\sa \ref page_DBServer_MySQL
*/
/* OBSOLETE DOC!!!
\page UniversalInterfacePage
\page UniversalInterfacePage Универсальный интерфейс
( ), , ..
,
( , ).
Этот интерфейс позволяет получать доступ к объекту по индентификатору(или имени), заказывать датчики, и т.п.
Для работы с удаленными объктами необходимо указывать идентификатор узла, на котором
находится этот объект(если он не задан, идет обращение к локальному).
- \ref secIOControl
- \ref subAsk
......@@ -14,43 +14,43 @@
\sa UniversalInterface
\section secIOControl /
\section secIOControl Функции работы с вводом/выводом
\subsection subAsk
\subsection subAsk Заказ датчиков
:
Заказ датчиков осуществляется при помощи функций:
для дискретных датчиков
- \ref void UniversalInterface::askState(...)
для аналоговых датчиков
- \ref void UniversalInterface::askValue(...)
\subsection subGet
:
\subsection subGet Получение информации о текущем состоянии датчика
Информацию о состоянии датчика можно получить при помощи функций:
для дискретных датчиков
- \ref void UniversalInterface::getState(...)
для аналоговых датчиков
- \ref void UniversalInterface::getValue(...)
\subsection subSet
\subsection subSet Управление выходными сигналом
для дискретных датчиков
- \ref void UniversalInterface::setState(...)
для аналоговых датчиков
- \ref void UniversalInterface::setValue(...)
\section secORep
\section secORep Функции работы с репозиторием объектов
- \ref void UniversalInterface::registered(...)
- \ref void UniversalInterface::unregister(...)
- \ref void UniversalInterface::resolve(...)
- \ref ObjectId UniversalInterface::getIdByName(...)
- \ref const char* UniversalInterface::getNameById(...)
\section secTimers
\section secTimers Заказ таймеров
- \ref void UniversalInterface::askTimer(...)
*/
/*!
\page DependsPage
\page DependsPage Зависимости между датчиками
IOController.
configure.xml
Механизм зависимостей реализован в классе IOController.
В configure.xml настривается
<item textname="...." iotype="..." .../>
<consumers>
<consumers>
......@@ -12,10 +12,10 @@
</depends>
</item>
. .
При считывании конф. файла можно задавать фильтры.
!
.. <depend> .
ПОКА РЕАЛИЗОВАНА ЗАВИСИМОСТЬ ТОЛЬКО ОТ ОДНОГО ДАТЧИКА!
т.е. <depend> может быть только один.
*/
......@@ -3,7 +3,7 @@
\image html uniset.png
\section MainSection
\section MainSection Оглавление
- \ref CommitPage
- \ref page_Concept
......
/*!
\page ToDoPage
\page ToDoPage Необходимо доделать
-#
-# "" ORB .
-# xml
-# IOController- XML- (,)
-#
( , , ..)
-#
( "UniSetTypes::ObjectId conf->getService(const string name)" )
-# " "
-# UniSetObject::getType string-
( )
-# , .
-# ObjectId
-# UniSetObject- .
-# API( php), web- .
-# InfoServer- routeList- , .
, ,
....
-# IOController- . (, ..)
, (, STL-, ..). ..
֣ STL-.
-# Mutex ( omni_mutex-) . RWMutex RMutex.
-# ( )
-# , .. ( )
-# NotifyController- calibrate ( )
-# утилиты мониторинга работы системы
-# настройку "политик" для ORB сделать из конф. файла
-# по максимуму переход на xml
-# дополнить описание IOController-ов разделом про XML-файл заказчков(создание,работа)
-# сделать описание принципов и деталей межобъектного взаимодействия
(об ограничениях на размер сообщений, очередь сообщений, приоритеты и т.п.)
-# попытатся сделать работу с сервисами более универсальной
(что то типа "UniSetTypes::ObjectId conf->getService(const string name)" )
-# откорректировать и дописать "общее описание" библиотеки
-# сделать тип в UniSetObject::getType string-ом
(для универсальности и простоты будущих расширений)
-# переписать тестовые примеры, под текущую ситуацию.
-# в будущем попытатся отказатся от ObjectId и перейти на строки
-# перенести настройки размера очереди сообщений для UniSetObject-ов в конф.файл
-# разработать API(на php), для web-интерфейса накопленной статистикики и журналов.
-# в InfoServer-е по routeList-у сообщения пересылаются, только если они локальные.
Надо переделать механизм, чтобы можно было отделять тех кому пересылать все сообщения,
от тех кому пересылать только локальные....
-# Для IOController-ов разработать спец. интерфейс для работы с датчиками (сохранение, получение состояния и т.п.)
Для того, чтобы можно было использовать разные способы хранения (БД, STL-контейнеры, файлы и т.п.). Т.к. сейчас
жёсткая реализация на STL-контейнерах.
-# дописать Mutex как надо (или перейти на omni_mutex-ы) . Сделать RWMutex и RMutex.
-# стартовые скрипты для локальной отладки (откорректировать старые)
-# управление очередью сообщений, очистка по фильтру и т.п. (может перейти на несколько очередей по приоритетам)
-# У NotifyController-а две функции с название calibrate (надо переименовать)
*/
......@@ -20,7 +20,7 @@
# iconv built into libc) for the transcoding. See
# http://www.gnu.org/software/libiconv for the list of possible encodings.
DOXYFILE_ENCODING = KOI8-R
DOXYFILE_ENCODING = UTF-8
# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
# by quotes) that should identify the project.
......@@ -527,7 +527,7 @@ INPUT = DocPages/ \
# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for
# the list of possible encodings.
INPUT_ENCODING = KOI8-R
INPUT_ENCODING = UTF-8
# If the value of the INPUT tag contains directories, you can use the
# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
......
......@@ -20,7 +20,7 @@
# iconv built into libc) for the transcoding. See
# http://www.gnu.org/software/libiconv for the list of possible encodings.
DOXYFILE_ENCODING = KOI8-R
DOXYFILE_ENCODING = UTF-8
# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
# by quotes) that should identify the project.
......@@ -526,7 +526,7 @@ INPUT = ../include/ \
# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for
# the list of possible encodings.
INPUT_ENCODING = KOI8-R
INPUT_ENCODING = UTF-8
# If the value of the INPUT tag contains directories, you can use the
# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
......
<?xml version = '1.0' encoding = 'koi8-r' ?>
<UNISETPLC>
<UserData></UserData>
<!-- () UniSet -->
<!-- Общие(стартовые) параметры по UniSet -->
<Configure>
<NameService host="localhost" port="2817"/>
<LocalNode name="LocalhostNode"/>
......@@ -11,16 +11,16 @@
<RepeatCount name="2"/>
<RepeatTimeoutMS name="50"/>
<WatchDogTime name="0"/> <!-- [] -->
<PingNodeTime name="0"/> <!-- [] -->
<AutoStartUpTime name="1"/> <!-- [] -->
<DumpStateTime name="10"/><!-- [] -->
<SleepTickMS name="500"/><!-- [] -->
<WatchDogTime name="0"/> <!-- [мин] -->
<PingNodeTime name="0"/> <!-- [сек] -->
<AutoStartUpTime name="1"/> <!-- [сек] -->
<DumpStateTime name="10"/><!-- [сек] -->
<SleepTickMS name="500"/><!-- [мсек] -->
<!-- Debug, logs -->
<UniSetDebug name="unideb" levels="crit,warn" file=""/>
<!-- , -->
<!-- Если не указано, то считается текущий каталог -->
<ConfDir name=""/>
<DataDir name=""/>
<BinDir name=""/>
......@@ -35,20 +35,20 @@
<LocalPrintServer device="/dev/lp0" checkTime="5000" />
</Services>
<!-- SimpleObject -->
<!-- Настройки для SimpleObject -->
<SimpleObject OnTime="1000" OffTime="2000" CommandTime="500"/>
</Configure>
<ObjectsMap>
<!--
'sensors'
Краткие пояснения к полям секции 'sensors'
==========================================
usedby - .
"consumer" , .
',' ...
usedby - указание на каком узле используются данные настройки.
Для "consumer" если не указан, генерируется для всех узлов. Иначе можно указать
через ',' для каких узлов генерить...
pageid - GUI,
pageid - идентификатор экрана GUI, с которым связан данный датчик
matrix -
channel -
......@@ -56,31 +56,31 @@
lamptest -
blink -
node -
iotype -
priority -
textname -
node - узел на котором физически находится данный датчик
iotype - тип датчика
priority - приоритет сообщения об изменении данного датчика
textname - текстовое имя датчика
-->
<nodes port="2817">
<item name="LocalhostNode" alias="" textname=" " ip="127.0.0.1" infserver="InfoServer" dbserver=""/>
<item name="LocalhostNode" alias="" textname="Локальный узел" ip="127.0.0.1" infserver="InfoServer" dbserver=""/>
</nodes>
<!-- ************************ ********************** -->
<!-- ************************ Датчики ********************** -->
<sensors name="Sensors">
<item name="Input1_S" textname=" 1" node="" iotype="DI" priority="Medium"/>
<item name="Input2_S" textname=" 2" node="" iotype="DI" priority="Medium"/>
<item name="Input3_S" textname=" 3" node="" iotype="DI" priority="Medium"/>
<item name="Input4_S" textname=" 4" node="" iotype="DI" priority="Medium"/>
<item name="Input5_S" textname=" 5" node="" iotype="DI" priority="Medium"/>
<item name="Input6_S" textname=" 6" node="" iotype="DI" priority="Medium"/>
<item name="Input1_S" textname="Команда 1" node="" iotype="DI" priority="Medium"/>
<item name="Input2_S" textname="Команда 2" node="" iotype="DI" priority="Medium"/>
<item name="Input3_S" textname="Команда 3" node="" iotype="DI" priority="Medium"/>
<item name="Input4_S" textname="Команда 4" node="" iotype="DI" priority="Medium"/>
<item name="Input5_S" textname="Команда 5" node="" iotype="DI" priority="Medium"/>
<item name="Input6_S" textname="Команда 6" node="" iotype="DI" priority="Medium"/>
</sensors>
<controllers name="Controllers">
<item name="IOCardController"/>
</controllers>
<!-- ******************* ***************** -->
<!-- ******************* Идентификаторы сервисов ***************** -->
<services name="Services">
<item name="InfoServer"/>
<item name="DBServer"/>
......@@ -88,7 +88,7 @@
<item name="TimerService"/>
</services>
<!-- ******************* ***************** -->
<!-- ******************* Идентификаторы объектов ***************** -->
<objects name="UniObjects">
<item name="TestObject"/>
<item name="TestObject2"/>
......@@ -96,31 +96,31 @@
</ObjectsMap>
<map-settings>
<!--
:
string -
Поддерживаемые типы:
string - строка
bool - {1|0}
int -
'int' :
digits -
step -
min -
max -
list -
'list'
section - ( )
NODES -
OBJECTS -
SENSORS -
ALL_OBJECTS -
\todo
multi="1" - (
int - число
Для 'int' можно дополнительно задать поля:
digits - количество цифр после запятой
step - шаг изменения
min - минимальное число
max - максимальное число
list - список
Для 'list' обязательно необходимо задать
section - секция содержащая список (в этом файле)
NODES - список узлов
OBJECTS - список объектов
SENSORS - список датчиков
ALL_OBJECTS - список объектов и контроллеров
\todo Для всех списков можно задать свойство
multi="1" - разрешение выбора нескольких элементов списка (будут перечислены через запятую
-->
<nodes>
<!-- 'name' - -->
<!-- 'name' - является обязательным параметром и добавляется автоматически -->
<item name="ip" default="localhost"/>
<item name="port" default="" type="int" min="1024" max="65535"/>
<item name="textname" default=""/>
......@@ -132,7 +132,7 @@
<item name="priority" type="list" section="priority"/>
<item name="character" type="list" section="characters"/>
</sensors>
<!-- -->
<!-- Типы для списков -->
<iotypes>
<item name="DI" default="1"/>
<item name="DO"/>
......@@ -150,17 +150,17 @@
<item name="Normal"/>
</characters>
<controllers>
<!-- 'name' - -->
<!-- 'name' - является обязательным параметром и добавляется автоматически -->
<item name="node" type="NODES"/>
</controllers>
<objects>
<!-- 'name' - -->
<!-- 'name' - является обязательным параметром и добавляется автоматически -->
</objects>
<services>
<!-- 'name' - -->
<!-- 'name' - является обязательным параметром и добавляется автоматически -->
</services>
<consumers>
<!-- 'name' - -->
<!-- 'name' - является обязательным параметром и добавляется автоматически -->
<item name="usedby" default="" type="NODES" multi="1"/>
</consumers>
</map-settings>
......
......@@ -7,7 +7,7 @@
#include <comedilib.h>
#include "Exceptions.h"
// -----------------------------------------------------------------------------
/*! / */
/*! Интерфейс для работы с в/в */
class ComediInterface
{
public:
......@@ -27,7 +27,7 @@ class ComediInterface
throw(UniSetTypes::Exception);
// /
// Конфигурирование входов / выходов
enum ChannelType
{
DI = INSN_CONFIG_DIO_INPUT,
......@@ -57,7 +57,7 @@ class ComediInterface
protected:
comedi_t* card; /*!< / */
comedi_t* card; /*!< интерфейс для работы с картами в/в */
std::string dname;
private:
......
......@@ -15,8 +15,8 @@ int main(int argc, const char **argv)
{
if( argc>1 && strcmp(argv[1],"--help")==0 )
{
cout << "--io-confile - . . configure.xml" << endl;
cout << "--io-logfile fname - fname. iocontrol.log" << endl;
cout << "--io-confile - Использовать указанный конф. файл. По умолчанию configure.xml" << endl;
cout << "--io-logfile fname - выводить логи в файл fname. По умолчанию iocontrol.log" << endl;
IOControl::help_print(argc,argv);
return 0;
}
......@@ -50,7 +50,7 @@ int main(int argc, const char **argv)
IOControl* ic = IOControl::init_iocontrol(argc,argv,shmID);
if( !ic )
{
dlog[Debug::CRIT] << "(iocontrol): init ۣ..." << endl;
dlog[Debug::CRIT] << "(iocontrol): init не прошёл..." << endl;
return 1;
}
......
......@@ -90,10 +90,10 @@ int main(int argc, char* argv[])
printf(" 2 - analog ref = differential\n");
printf(" 3 - analog ref = other (undefined)\n");
printf("range:\n");
printf(" 0 - -10 - 10\n");
printf(" 1 - -5 - 5\n");
printf(" 2 - -2.5 - 2.5\n");
printf(" 3 - -1.25 - 1.25\n");
printf(" 0 - -10В - 10В\n");
printf(" 1 - -5В - 5В\n");
printf(" 2 - -2.5В - 2.5В\n");
printf(" 3 - -1.25В - 1.25В\n");
printf("[--blink] - (blink output): ONLY FOR 'write': 0-1-0-1-0-...\n");
printf("[--blink-msec] val - Blink pause [msec]. Default: 300 msec\n");
return 0;
......@@ -224,7 +224,7 @@ int main(int argc, char* argv[])
exret = EXIT_FAILURE;
}
}
//
// реализация мигания
while(1)
{
for( int k=0; chan[k]!=-1; k++ )
......
......@@ -12,7 +12,7 @@ void Element::addChildOut( Element* el, int num )
if( el == this )
{
ostringstream msg;
msg << "(" << myid << "): !!!";
msg << "(" << myid << "): ПОПТКА СДЕЛАТь ССЫЛКУ НА САМОГО СЕБЯ!!!";
throw LogicException(msg.str());
}
......@@ -22,18 +22,18 @@ void Element::addChildOut( Element* el, int num )
if( it->el == el )
{
ostringstream msg;
msg << "(" << myid << "):" << el->getId() << " ( )...";
msg << "(" << myid << "):" << el->getId() << " уже есть в списке дочерних(такое соединение уже есть)...";
throw LogicException(msg.str());
}
}
//
// el myid
// проверка на циклическую зависимость
// el не должен содержать в своих потомках myid
if( el->find(myid) != NULL )
{
ostringstream msg;
msg << "(" << myid << "): !!!\n";
msg << " id" << el->getId() << " '' Element id=" << myid << endl;
msg << "(" << myid << "): ПОПЫТКА СОЗДАТЬ ЦИКЛИЧЕКУЮ ЗАВИСИМОСТЬ!!!\n";
msg << " id" << el->getId() << " имеет в своих 'потомках' Element id=" << myid << endl;
throw LogicException(msg.str());
}
......@@ -88,7 +88,7 @@ void Element::addInput(int num, bool state)
if( it->num == num )
{
ostringstream msg;
msg << "(" << myid << "): input N" << num;
msg << "(" << myid << "): попытка второй раз добавить input N" << num;
throw LogicException(msg.str());
}
}
......
......@@ -33,9 +33,9 @@ class Element
virtual ~Element(){};
/*!< ,
.
.
/*!< функция вызываемая мастером для элементов, которым требуется
работа во времени.
По умолчанию ничего не делает.
*/
virtual void tick(){}
......@@ -67,7 +67,7 @@ class Element
}
protected:
Element():myid(DefaultElementID){}; // id
Element():myid(DefaultElementID){}; // нельзя создать элемент без id
struct ChildInfo
{
......@@ -142,7 +142,7 @@ class TAND:
};
// ---------------------------------------------------------------------------
//
// элемент с одним входом и выходом
class TNOT:
public Element
{
......@@ -153,7 +153,7 @@ class TNOT:
virtual bool getOut(){ return myout; }
/* num , ..
/* num игнорируется, т.к. элемент с одним входом
*/
virtual void setIn( int num, bool state );
virtual std::string getType(){ return "NOT"; }
......
......@@ -51,14 +51,14 @@ void LProcessor::build( const string& lfile )
{
sch.read(lfile);
//
// , name
// составляем карту внешних входов
// считая, что в поле name записано название датчика
for( Schema::EXTiterator it=sch.extBegin(); it!=sch.extEnd(); ++it )
{
UniSetTypes::ObjectId sid = conf->getSensorID(it->name);
if( sid == DefaultObjectId )
{
cerr << " : " << it->name << endl;
cerr << "НЕ НАЙДЕН ИДЕНТИФИКАТОР ДАТЧИКА: " << it->name << endl;
continue;
}
......@@ -66,7 +66,7 @@ void LProcessor::build( const string& lfile )
ei.sid = sid;
ei.state = false;
ei.lnk = &(*it);
#warning
#warning Пока тип сделан принудительно
ei.iotype = UniversalIO::DigitalInput;
extInputs.push_front(ei);
}
......@@ -76,14 +76,14 @@ void LProcessor::build( const string& lfile )
UniSetTypes::ObjectId sid = conf->getSensorID(it->name);
if( sid == DefaultObjectId )
{
cerr << " : " << it->name << endl;
cerr << "НЕ НАЙДЕН ИДЕНТИФИКАТОР ВЫХОДА: " << it->name << endl;
continue;
}
EXTOutInfo ei;
ei.sid = sid;
ei.lnk = &(*it);
#warning
#warning Пока тип сделан принудительно
ei.iotype = UniversalIO::DigitalOutput;
extOuts.push_front(ei);
......@@ -92,9 +92,9 @@ void LProcessor::build( const string& lfile )
}
// -------------------------------------------------------------------------
/*!
. .
. ..
, . ,
Опрос всех датчиков. Являющхся входами для логических элементов.
Исключение специально НЕ ловится. Т.к. если не удалось опросить хотя бы один
датчик, то проверку вообще лучше прервать. Иначе схема может работать не так, как надо
*/
void LProcessor::getInputs()
......@@ -110,18 +110,18 @@ void LProcessor::getInputs()
// -------------------------------------------------------------------------
void LProcessor::processing()
{
// c
// выcтавляем все внешние входы
for( EXTList::iterator it=extInputs.begin(); it!=extInputs.end();++it )
it->lnk->to->setIn(it->lnk->numInput,it->state);
//
// проходим по всем элементам
for( Schema::iterator it=sch.begin(); it!=sch.end(); ++it )
it->second->tick();
}
// -------------------------------------------------------------------------
void LProcessor::setOuts()
{
// c
// выcтавляем выходы
for( OUTList::iterator it=extOuts.begin(); it!=extOuts.end(); ++it )
{
try
......@@ -137,7 +137,7 @@ void LProcessor::setOuts()
break;
default:
cerr << "(LProcessor::setOuts): iotype=" << it->iotype << endl;
cerr << "(LProcessor::setOuts): неподдерживаемый тип iotype=" << it->iotype << endl;
break;
}
}
......
......@@ -107,11 +107,11 @@ void PassiveLProcessor::sysCommand( UniSetTypes::SystemMessage *sm )
case SystemMessage::WatchDog:
{
// ( )
// ģ
// (.. RTUExchange SharedMemory2)
// WatchDog , .. ģ SM
// , SM , (RTUExchange)
// ОПТИМИЗАЦИЯ (защита от двойного перезаказа при старте)
// Если идёт локальная работа
// (т.е. RTUExchange запущен в одном процессе с SharedMemory2)
// то обрабатывать WatchDog не надо, т.к. мы и так ждём готовности SM
// при заказе датчиков, а если SM вылетит, то вместе с этим процессом(RTUExchange)
if( shm->isLocalwork() )
break;
......@@ -121,7 +121,7 @@ void PassiveLProcessor::sysCommand( UniSetTypes::SystemMessage *sm )
case SystemMessage::LogRotate:
{
//
// переоткрываем логи
unideb << myname << "(sysCommand): logRotate" << std::endl;
string fname = unideb.getLogFile();
if( !fname.empty() )
......@@ -147,7 +147,7 @@ void PassiveLProcessor::sysCommand( UniSetTypes::SystemMessage *sm )
// -------------------------------------------------------------------------
void PassiveLProcessor::setOuts()
{
// c
// выcтавляем выходы
for( OUTList::iterator it=extOuts.begin(); it!=extOuts.end(); ++it )
{
try
......@@ -163,7 +163,7 @@ void PassiveLProcessor::setOuts()
break;
default:
cerr << "(LProcessor::setOuts): iotype=" << it->iotype << endl;
cerr << "(LProcessor::setOuts): неподдерживаемый тип iotype=" << it->iotype << endl;
break;
}
}
......@@ -195,7 +195,7 @@ void PassiveLProcessor::sigterm( int signo )
break;
default:
cerr << "(LProcessor::sigterm): iotype=" << it->iotype << endl;
cerr << "(LProcessor::sigterm): неподдерживаемый тип iotype=" << it->iotype << endl;
break;
}
}
......
......@@ -39,7 +39,7 @@ class PassiveLProcessor:
void askSensors( UniversalIO::UIOCommand cmd );
// void initOutput();
//
// действия при завершении работы
virtual void sigterm( int signo );
SMInterface* shm;
......
......@@ -30,7 +30,7 @@ void Schema::link(Element::ElementID rootID, Element::ElementID childID, int num
if( it == emap.end() )
{
ostringstream msg;
msg << "Schema: id=" << rootID << " !!!";
msg << "Schema: элемент id=" << rootID << " НЕ НАЙДЕН!!!";
throw LogicException(msg.str());
}
e1 = it->second;
......@@ -39,14 +39,14 @@ void Schema::link(Element::ElementID rootID, Element::ElementID childID, int num
if( it == emap.end() )
{
ostringstream msg;
msg << "Schema: id=" << childID << " !!!";
msg << "Schema: элемент id=" << childID << " НЕ НАЙДЕН!!!";
throw LogicException(msg.str());
}
e2 = it->second;
e1->addChildOut(e2, numIn);
//
// сохраняем в список соединений
inLinks.push_front(INLink(e1,e2,numIn));
}
// -------------------------------------------------------------------------
......@@ -59,7 +59,7 @@ void Schema::unlink( Element::ElementID rootID, Element::ElementID childID )
if( it == emap.end() )
{
ostringstream msg;
msg << "Schema: id=" << rootID << " !!!";
msg << "Schema: элемент id=" << rootID << " НЕ НАЙДЕН!!!";
throw LogicException(msg.str());
}
e1 = it->second;
......@@ -68,14 +68,14 @@ void Schema::unlink( Element::ElementID rootID, Element::ElementID childID )
if( it == emap.end() )
{
ostringstream msg;
msg << "Schema: id=" << childID << " !!!";
msg << "Schema: элемент id=" << childID << " НЕ НАЙДЕН!!!";
throw LogicException(msg.str());
}
e2 = it->second;
e1->delChildOut(e2);
//
// удаляем из списка соединений
for( InternalList::iterator lit=inLinks.begin(); lit!=inLinks.end(); ++lit )
{
if( lit->from == e1 && lit->to == e2 )
......@@ -92,17 +92,17 @@ void Schema::extlink(string name, Element::ElementID childID, int numIn )
if( it == emap.end() )
{
ostringstream msg;
msg << "Schema: id=" << childID << " !!!";
msg << "Schema: элемент id=" << childID << " НЕ НАЙДЕН!!!";
throw LogicException(msg.str());
}
Element* el(it->second);
//
// добавляем новое соединение
// el->addInput(numIn);
//
// уже должен быть
//
// заносим в список
extLinks.push_front( EXTLink(name,el,numIn) );
}
// -------------------------------------------------------------------------
......@@ -127,7 +127,7 @@ void Schema::remove( Element* el )
}
}
//
// помечаем внутренние связи
for( InternalList::iterator lit=inLinks.begin(); lit!=inLinks.end(); ++lit )
{
if( lit->from == el )
......@@ -137,7 +137,7 @@ void Schema::remove( Element* el )
lit->to = 0;
}
//
// помечаем внешние связи
for( ExternalList::iterator lit=extLinks.begin(); lit!=extLinks.end(); ++lit )
{
if( lit->to == el )
......@@ -160,7 +160,7 @@ bool Schema::getOut( Element::ElementID ID )
return it->second->getOut();
ostringstream msg;
msg << "Schema: id=" <<ID << " !!!";
msg << "Schema: элемент id=" <<ID << " НЕ НАЙДЕН!!!";
throw LogicException(msg.str());
}
// -------------------------------------------------------------------------
......@@ -174,7 +174,7 @@ Element* Schema::find(Element::ElementID id)
// -------------------------------------------------------------------------
Element* Schema::findExtLink(const string name)
{
//
// помечаем внешние связи
for( ExternalList::iterator it=extLinks.begin(); it!=extLinks.end(); ++it )
{
if( it->name == name )
......
......@@ -14,8 +14,8 @@ class Schema
Element* manage( Element* el );
void remove( Element* el );
//
//
// внутренее соединения
// между элементами
struct INLink
{
INLink(Element* f, Element* t, int ni):
......@@ -27,8 +27,8 @@ class Schema
int numInput;
};
//
// -
// внешнее соединение
// что-то на вход элемента
struct EXTLink
{
EXTLink(std::string n, Element* t, int ni):
......@@ -40,7 +40,7 @@ class Schema
int numInput;
};
//
// наружный выход
struct EXTOut
{
EXTOut(std::string n, Element* f):
......@@ -98,7 +98,7 @@ class Schema
Element* findOut(const std::string name);
protected:
ElementMap emap; //
ElementMap emap; // список элеметов
InternalList inLinks;
ExternalList extLinks;
OutputsList outList;
......
......@@ -33,16 +33,16 @@ void SchemaXML::read( const string xmlfile )
if( !root )
{
ostringstream msg;
msg << "(SchemaXML::read): " << sec;
msg << "(SchemaXML::read): не нашли корневого раздела " << sec;
throw LogicException(msg.str());
}
//
// Считываем список элементов
UniXML_iterator it(root);
if( !it.goChildren() )
{
ostringstream msg;
msg << "(SchemaXML::read): " << sec;
msg << "(SchemaXML::read): не удалось перейти к списку элементов " << sec;
throw LogicException(msg.str());
}
......@@ -69,17 +69,17 @@ void SchemaXML::read( const string xmlfile )
else
{
ostringstream msg;
msg << "(SchemaXML::read): -->" << type;
msg << "(SchemaXML::read): НЕИЗВЕСТНЫЙ ТИП ЭЛЕМЕНТА -->" << type;
throw LogicException(msg.str());
}
}
//
// Строим связи
xmlNode* conNode( xml.findNode(xml.getFirstNode(),conn_sec) );
if( !conNode )
{
ostringstream msg;
msg << "(SchemaXML::read): " << conn_sec;
msg << "(SchemaXML::read): не нашли корневого раздела " << conn_sec;
throw LogicException(msg.str());
}
......@@ -87,7 +87,7 @@ void SchemaXML::read( const string xmlfile )
if( !it.goChildren() )
{
ostringstream msg;
msg << "(SchemaXML::read): " << conn_sec;
msg << "(SchemaXML::read): не удалось перейти к списку элементов " << conn_sec;
throw LogicException(msg.str());
}
......@@ -114,7 +114,7 @@ void SchemaXML::read( const string xmlfile )
if( el== 0 )
{
ostringstream msg;
msg << "(SchemaXML::read): ID=" << fID;
msg << "(SchemaXML::read): НЕ НАЙДЕН ЭЛЕМЕНТ С ID=" << fID;
throw LogicException(msg.str());
}
......
......@@ -21,7 +21,7 @@ void TAND::setIn( int num, bool state )
if( it->num == num )
{
if( it->state == state )
return; //
return; // вход не менялся можно вообще прервать проверку
it->state = state;
break;
......@@ -29,10 +29,10 @@ void TAND::setIn( int num, bool state )
}
bool prev = myout;
bool brk = false; //
bool brk = false; // признак досрочного завершения проверки
//
// 'AND' 0
// проверяем изменился ли выход
// для тригера 'AND' проверка до первого 0
for( InputList::iterator it=ins.begin(); it!=ins.end(); ++it )
{
if( !it->state )
......
......@@ -10,7 +10,7 @@ TDelay::TDelay( Element::ElementID id, int delayMS, int inCount):
{
if( inCount!=0 )
{
//
// создаём заданное количество входов
for( int i=1;i<=inCount;i++ )
ins.push_front(InputInfo(i,false)); // addInput(i,st);
}
......@@ -23,7 +23,7 @@ TDelay::~TDelay()
void TDelay::setIn( int num, bool state )
{
bool prev = myout;
//
// сбрасываем сразу
if( !state )
{
pt.setTiming(0); // reset timer
......@@ -36,7 +36,7 @@ void TDelay::setIn( int num, bool state )
// if( state )
//
// выставляем без задержки
if( delay <= 0 )
{
pt.setTiming(0); // reset timer
......@@ -47,8 +47,8 @@ void TDelay::setIn( int num, bool state )
return;
}
// , ݣ
if( !myout && !prev ) // .. !myout && prev != myout
// засекаем, если ещё не установлен таймер
if( !myout && !prev ) // т.е. !myout && prev != myout
{
cout << this << ": set timer " << delay << " [msec]" << endl;
pt.setTiming(delay);
......
......@@ -11,7 +11,7 @@ TOR::TOR(ElementID id, int num, bool st):
{
if( num!=0 )
{
//
// создаём заданное количество входов
for( int i=1;i<=num;i++ )
{
ins.push_front(InputInfo(i,st)); // addInput(i,st);
......@@ -34,7 +34,7 @@ void TOR::setIn( int num, bool state )
if( it->num == num )
{
if( it->state == state )
return; //
return; // вход не менялся можно вообще прервать проверку
it->state = state;
break;
......@@ -42,10 +42,10 @@ void TOR::setIn( int num, bool state )
}
bool prev = myout;
bool brk = false; //
bool brk = false; // признак досрочного завершения проверки
//
// 'OR'
// проверяем изменился ли выход
// для тригера 'OR' проверка до первой единицы
for( InputList::iterator it=ins.begin(); it!=ins.end(); ++it )
{
if( it->state )
......
......@@ -53,16 +53,16 @@ int main(int argc, const char **argv)
string name = conf->getArgParam("--name","LProcessor");
if( name.empty() )
{
cerr << "(plogicproc): name'" << endl;
cerr << "(plogicproc): Не задан name'" << endl;
return 1;
}
ObjectId ID = conf->getObjectID(name);
if( ID == UniSetTypes::DefaultObjectId )
{
cerr << "(plogicproc): '" << name
<< "' . !"
<< " " << conf->getObjectsSection() << endl;
cerr << "(plogicproc): идентификатор '" << name
<< "' не найден в конф. файле!"
<< " в секции " << conf->getObjectsSection() << endl;
return 1;
}
......
......@@ -26,12 +26,12 @@ class MBSlave:
MBSlave( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmID, SharedMemory* ic=0, std::string prefix="mbs" );
virtual ~MBSlave();
/*! */
/*! глобальная функция для инициализации объекта */
static MBSlave* init_mbslave( int argc, const char* const* argv,
UniSetTypes::ObjectId shmID, SharedMemory* ic=0,
std::string prefix="mbs" );
/*! help- */
/*! глобальная функция для вывода help-а */
static void help_print( int argc, const char* const* argv );
static const int NoSafetyState=-1;
......@@ -46,7 +46,7 @@ class MBSlave:
struct IOProperty:
public IOBase
{
ModbusRTU::ModbusData mbreg; /*!< */
ModbusRTU::ModbusData mbreg; /*!< регистр */
AccessMode amode;
VTypes::VType vtype; /*!< type of value */
......@@ -62,47 +62,47 @@ class MBSlave:
protected:
/*! 0x01 */
/*! обработка 0x01 */
ModbusRTU::mbErrCode readCoilStatus( ModbusRTU::ReadCoilMessage& query,
ModbusRTU::ReadCoilRetMessage& reply );
/*! 0x02 */
/*! обработка 0x02 */
ModbusRTU::mbErrCode readInputStatus( ModbusRTU::ReadInputStatusMessage& query,
ModbusRTU::ReadInputStatusRetMessage& reply );
/*! 0x03 */
/*! обработка 0x03 */
ModbusRTU::mbErrCode readOutputRegisters( ModbusRTU::ReadOutputMessage& query,
ModbusRTU::ReadOutputRetMessage& reply );
/*! 0x04 */
/*! обработка 0x04 */
ModbusRTU::mbErrCode readInputRegisters( ModbusRTU::ReadInputMessage& query,
ModbusRTU::ReadInputRetMessage& reply );
/*! 0x05 */
/*! обработка 0x05 */
ModbusRTU::mbErrCode forceSingleCoil( ModbusRTU::ForceSingleCoilMessage& query,
ModbusRTU::ForceSingleCoilRetMessage& reply );
/*! 0x0F */
/*! обработка 0x0F */
ModbusRTU::mbErrCode forceMultipleCoils( ModbusRTU::ForceCoilsMessage& query,
ModbusRTU::ForceCoilsRetMessage& reply );
/*! 0x10 */
/*! обработка 0x10 */
ModbusRTU::mbErrCode writeOutputRegisters( ModbusRTU::WriteOutputMessage& query,
ModbusRTU::WriteOutputRetMessage& reply );
/*! 0x06 */
/*! обработка 0x06 */
ModbusRTU::mbErrCode writeOutputSingleRegister( ModbusRTU::WriteSingleOutputMessage& query,
ModbusRTU::WriteSingleOutputRetMessage& reply );
/*! */
/*! обработка запросов на чтение ошибок */
// ModbusRTU::mbErrCode journalCommand( ModbusRTU::JournalCommandMessage& query,
// ModbusRTU::JournalCommandRetMessage& reply );
/*! */
/*! обработка запроса на установку времени */
ModbusRTU::mbErrCode setDateTime( ModbusRTU::SetDateTimeMessage& query,
ModbusRTU::SetDateTimeRetMessage& reply );
/*! ̣ */
/*! обработка запроса удалённого сервиса */
ModbusRTU::mbErrCode remoteService( ModbusRTU::RemoteServiceMessage& query,
ModbusRTU::RemoteServiceRetMessage& reply );
......@@ -110,17 +110,17 @@ class MBSlave:
ModbusRTU::FileTransferRetMessage& reply );
/*! .
(06 10)
/*! Проверка корректности регистра перед сохранением.
Вызывается для каждого регистра не зависимо от используемой функции (06 или 10)
*/
virtual ModbusRTU::mbErrCode checkRegister( ModbusRTU::ModbusData reg, ModbusRTU::ModbusData& val )
{ return ModbusRTU::erNoError; }
typedef std::map<ModbusRTU::ModbusData,IOProperty> IOMap;
IOMap iomap; /*!< / */
IOMap iomap; /*!< список входов/выходов */
ModbusServerSlot* mbslot;
ModbusRTU::ModbusAddr addr; /*!< */
ModbusRTU::ModbusAddr addr; /*!< адрес данного узла */
UniSetTypes::uniset_mutex mbMutex;
......@@ -140,7 +140,7 @@ class MBSlave:
virtual bool activateObject();
//
// действия при завершении работы
virtual void sigterm( int signo );
void initIterators();
......@@ -172,13 +172,13 @@ class MBSlave:
ModbusRTU::mbErrCode prev;
long askCount;
typedef std::map<ModbusRTU::mbErrCode,unsigned int> ExchangeErrorMap;
ExchangeErrorMap errmap; /*!< */
ExchangeErrorMap errmap; /*!< статистика обмена */
bool activated;
int activateTimeout;
bool pingOK;
timeout_t wait_msec;
bool force; /*!< , SM, */
bool force; /*!< флаг означающий, что надо сохранять в SM, даже если значение не менялось */
bool mbregFromID;
......
......@@ -61,7 +61,7 @@ int main(int argc, const char **argv)
MBSlave* s = MBSlave::init_mbslave(argc,argv,shmID);
if( !s )
{
dlog[Debug::CRIT] << "(mbslave): init ۣ..." << endl;
dlog[Debug::CRIT] << "(mbslave): init не прошёл..." << endl;
return 1;
}
......
......@@ -28,11 +28,11 @@ class RTUExchange:
RTUExchange( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmID, SharedMemory* ic=0 );
virtual ~RTUExchange();
/*! */
/*! глобальная функция для инициализации объекта */
static RTUExchange* init_rtuexchange( int argc, const char* const* argv,
UniSetTypes::ObjectId shmID, SharedMemory* ic=0 );
/*! help- */
/*! глобальная функция для вывода help-а */
static void help_print( int argc, const char* const* argv );
static const int NoSafetyState=-1;
......@@ -44,7 +44,7 @@ class RTUExchange:
enum DeviceType
{
dtUnknown, /*!< */
dtUnknown, /*!< неизвестный */
dtRTU, /*!< RTU (default) */
dtRTU188, /*!< RTU188 (Fastwell) */
dtMTR /*!< MTR (DEIF) */
......@@ -91,12 +91,12 @@ class RTUExchange:
{}
ModbusRTU::ModbusData mbval;
ModbusRTU::ModbusData mbreg; /*!< */
ModbusRTU::SlaveFunctionCode mbfunc; /*!< / */
ModbusRTU::ModbusData mbreg; /*!< регистр */
ModbusRTU::SlaveFunctionCode mbfunc; /*!< функция для чтения/записи */
PList slst;
// only for MTR
MTR::MTRType mtrType; /*!< ( MTR) */
MTR::MTRType mtrType; /*!< тип регистра (согласно спецификации на MTR) */
// only for RTU188
RTUStorage::RTUJack rtuJack;
......@@ -140,10 +140,10 @@ class RTUExchange:
ComPort::Speed speed;
bool respnond;
ModbusRTU::ModbusAddr mbaddr; /*!< */
ModbusRTU::ModbusAddr mbaddr; /*!< адрес устройства */
RegMap regmap;
DeviceType dtype; /*!< */
DeviceType dtype; /*!< тип устройства */
UniSetTypes::ObjectId resp_id;
IOController::DIOStateList::iterator resp_dit;
......@@ -206,7 +206,7 @@ class RTUExchange:
virtual bool activateObject();
//
// действия при завершении работы
virtual void sigterm( int signo );
void initMB( bool reopen=false );
......@@ -239,10 +239,10 @@ class RTUExchange:
bool initPause;
UniSetTypes::uniset_mutex mutex_start;
bool force; /*!< , SM, */
bool force_out; /*!< , */
bool force; /*!< флаг означающий, что надо сохранять в SM, даже если значение не менялось */
bool force_out; /*!< флаг означающий, принудительного чтения выходов */
bool mbregFromID;
int polltime; /*!< , [] */
int polltime; /*!< переодичность обновления данных, [мсек] */
PassiveTimer ptHeartBeat;
UniSetTypes::ObjectId sidHeartBeat;
......
......@@ -43,7 +43,7 @@ void RTUStorage::poll( ModbusRTUMaster* mb )
{
pingOK = true;
//
// опрос АЦП
if( pollADC )
{
ModbusRTU::ReadInputRetMessage ret = mb->read04( addr,1016, 16 );
......@@ -51,7 +51,7 @@ void RTUStorage::poll( ModbusRTUMaster* mb )
adc[k] = ModbusRTU::dat2f(ret.data[i],ret.data[i+1]);
}
// -----------------------------------
// 16 DI
// опрос 16 DI
if( pollDI )
{
ModbusRTU::ReadInputStatusRetMessage ret = mb->read02( addr,0,16 );
......@@ -66,7 +66,7 @@ void RTUStorage::poll( ModbusRTUMaster* mb )
}
}
// -----------------------------------
// 16DIO DO
// опрос 16DIO DO
if( pollDIO )
{
{
......@@ -82,7 +82,7 @@ void RTUStorage::poll( ModbusRTUMaster* mb )
}
}
// -----------------------------------
// 16DIO DI
// опрос 16DIO DI
{
ModbusRTU::ReadInputStatusRetMessage ret = mb->read02( addr,16,16 );
ModbusRTU::DataBits bits;
......@@ -96,7 +96,7 @@ void RTUStorage::poll( ModbusRTUMaster* mb )
}
}
// -----------------------------------
// 16DIO AI
// опрос 16DIO AI
{
ModbusRTU::ReadInputRetMessage ret = mb->read04( addr, 1000, 16 );
int k = 0;
......@@ -104,7 +104,7 @@ void RTUStorage::poll( ModbusRTUMaster* mb )
dio_ai[k] = ModbusRTU::dat2f(ret.data[i],ret.data[i+1]);
}
// -----------------------------------
// 16DIO AO
// опрос 16DIO AO
{
ModbusRTU::ReadOutputRetMessage ret = mb->read03( addr, 1000, 16 );
int k = 0;
......@@ -114,7 +114,7 @@ void RTUStorage::poll( ModbusRTUMaster* mb )
// -----------------------------------
}
// UNIO48 DO
// опрос UNIO48 DO
if( pollUNIO )
{
{
......@@ -130,7 +130,7 @@ void RTUStorage::poll( ModbusRTUMaster* mb )
}
}
// -----------------------------------
// UNIO48 DI
// опрос UNIO48 DI
{
ModbusRTU::ReadInputStatusRetMessage ret = mb->read02( addr,32,48 );
ModbusRTU::DataBits bits;
......@@ -144,7 +144,7 @@ void RTUStorage::poll( ModbusRTUMaster* mb )
}
}
// -----------------------------------
// UNIO48 AI
// опрос UNIO48 AI
{
ModbusRTU::ReadInputRetMessage ret = mb->read04( addr, 1032, 48 );
int k = 0;
......@@ -152,7 +152,7 @@ void RTUStorage::poll( ModbusRTUMaster* mb )
unio_ai[k] = ModbusRTU::dat2f(ret.data[i],ret.data[i+1]);
}
// -----------------------------------
// UNIO48 AO
// опрос UNIO48 AO
{
ModbusRTU::ReadOutputRetMessage ret = mb->read03( addr, 1016, 48 );
int k = 0;
......@@ -359,16 +359,16 @@ ModbusRTU::ModbusData RTUStorage::getRegister( RTUJack jack, unsigned short chan
std::ostream& operator<<(std::ostream& os, RTUStorage& m )
{
os << "-------------------" << endl
<< " (8 ): " << endl;
for( int i=0; i<8; i++ ) //
<< " АЦП (8 каналов): " << endl;
for( int i=0; i<8; i++ ) // номера каналов
os << setw(12) << i << "|";
os << endl;
for( int i=0; i<8; i++ )
os << setw(12) << m.adc[i] << "|";
os << endl;
os << "-------------------" << endl
<< " DI (16 ): " << endl;
for( int i=0; i<16; i++ ) //
<< " DI (16 каналов): " << endl;
for( int i=0; i<16; i++ ) // номера каналов
os << setw(2) << i << "|";
os << endl;
for( int i=0; i<16; i++ )
......@@ -376,8 +376,8 @@ std::ostream& operator<<(std::ostream& os, RTUStorage& m )
os << endl;
os << "-------------------" << endl
<< " DIO DO(16 ): " << endl;
for( int i=0; i<16; i++ ) //
<< " DIO DO(16 каналов): " << endl;
for( int i=0; i<16; i++ ) // номера каналов
os << setw(2) << i << " | ";
os << endl;
for( int i=0; i<16; i++ )
......@@ -385,8 +385,8 @@ std::ostream& operator<<(std::ostream& os, RTUStorage& m )
os << endl;
os << "-------------------" << endl
<< " DIO DI(16 ): " << endl;
for( int i=0; i<16; i++ ) //
<< " DIO DI(16 каналов): " << endl;
for( int i=0; i<16; i++ ) // номера каналов
os << setw(2) << i << " | ";
os << endl;
for( int i=0; i<16; i++ )
......@@ -394,8 +394,8 @@ std::ostream& operator<<(std::ostream& os, RTUStorage& m )
os << endl;
os << "-------------------" << endl
<< " DIO AI (16 ): " << endl;
for( int i=0; i<16; i++ ) //
<< " DIO AI (16 каналов): " << endl;
for( int i=0; i<16; i++ ) // номера каналов
os << setw(2) << i << " | ";
os << endl;
for( int i=0; i<16; i++ )
......@@ -403,8 +403,8 @@ std::ostream& operator<<(std::ostream& os, RTUStorage& m )
os << endl;
os << "-------------------" << endl
<< " DIO AO (16 ): " << endl;
for( int i=0; i<16; i++ ) //
<< " DIO AO (16 каналов): " << endl;
for( int i=0; i<16; i++ ) // номера каналов
os << setw(2) << i << " | ";
os << endl;
for( int i=0; i<16; i++ )
......@@ -413,13 +413,13 @@ std::ostream& operator<<(std::ostream& os, RTUStorage& m )
os << "-------------------" << endl
<< " UNIO48 DI: " << endl;
for( int i=0; i<24; i++ ) //
for( int i=0; i<24; i++ ) // номера каналов
os << setw(2) << i << " | ";
os << endl;
for( int i=0; i<24; i++ )
os << setw(2) << m.unio_di[i] << " | ";
os << endl;
for( int i=24; i<48; i++ ) //
for( int i=24; i<48; i++ ) // номера каналов
os << setw(2) << i << " | ";
os << endl;
for( int i=24; i<48; i++ )
......@@ -428,13 +428,13 @@ std::ostream& operator<<(std::ostream& os, RTUStorage& m )
os << "-------------------" << endl
<< " UNIO48 DO: " << endl;
for( int i=0; i<24; i++ ) //
for( int i=0; i<24; i++ ) // номера каналов
os << setw(2) << i << " | ";
os << endl;
for( int i=0; i<24; i++ )
os << setw(2) << m.unio_do[i] << " | ";
os << endl;
for( int i=24; i<48; i++ ) //
for( int i=24; i<48; i++ ) // номера каналов
os << setw(2) << i << " | ";
os << endl;
for( int i=24; i<48; i++ )
......@@ -443,13 +443,13 @@ std::ostream& operator<<(std::ostream& os, RTUStorage& m )
os << "-------------------" << endl
<< " UNIO48 AI: " << endl;
for( int i=0; i<12; i++ ) //
for( int i=0; i<12; i++ ) // номера каналов
os << setw(6) << i << " | ";
os << endl;
for( int i=0; i<12; i++ )
os << setw(6) << m.unio_ai[i] << " | ";
os << endl;
for( int i=12; i<24; i++ ) //
for( int i=12; i<24; i++ ) // номера каналов
os << setw(6) << i << " | ";
os << endl;
for( int i=12; i<24; i++ )
......@@ -458,13 +458,13 @@ std::ostream& operator<<(std::ostream& os, RTUStorage& m )
os << "-------------------" << endl
<< " UNIO48 AO: " << endl;
for( int i=0; i<12; i++ ) //
for( int i=0; i<12; i++ ) // номера каналов
os << setw(6) << i << " | ";
os << endl;
for( int i=0; i<12; i++ )
os << setw(6) << m.unio_ao[i] << " | ";
os << endl;
for( int i=12; i<24; i++ ) //
for( int i=12; i<24; i++ ) // номера каналов
os << setw(6) << i << " | ";
os << endl;
for( int i=12; i<24; i++ )
......
......@@ -34,8 +34,8 @@ class RTUStorage
nJ1, // UNIO48 (FPGA0)
nJ2, // UNIO48 (FPGA1)
nJ5, // DIO 16
nX1, // (8)
nX2, // (8)
nX1, // АЦП (8)
nX2, // АЦП (8)
nX4, // DI (8)
nX5 // DI (8)
};
......@@ -49,7 +49,7 @@ class RTUStorage
static ModbusRTU::ModbusData getRegister( RTUJack jack, unsigned short channel, UniversalIO::IOTypes t );
// : setState, setValue
// ДОДЕЛАТЬ: setState, setValue
void print();
friend std::ostream& operator<<(std::ostream& os, RTUStorage& m );
......@@ -65,16 +65,16 @@ class RTUStorage
bool pollUNIO;
float adc[8]; //
bool di[16]; // 16DI
bool dio_do[16]; // 16DIO DO
bool dio_di[16]; // 16DIO DI
float dio_ai[16]; // 16DIO AI
float dio_ao[16]; // 16DIO AO
bool unio_do[48]; // UNIO48 DO
bool unio_di[48]; // UNIO48 DI
float unio_ai[24]; // UNIO48 AI
float unio_ao[24]; // UNIO48 AO
float adc[8]; // АЦП
bool di[16]; // Порт 16DI
bool dio_do[16]; // Порт 16DIO DO
bool dio_di[16]; // Порт 16DIO DI
float dio_ai[16]; // Порт 16DIO AI
float dio_ao[16]; // Порт 16DIO AO
bool unio_do[48]; // Порт UNIO48 DO
bool unio_di[48]; // Порт UNIO48 DI
float unio_ai[24]; // Порт UNIO48 AI
float unio_ao[24]; // Порт UNIO48 AO
};
// --------------------------------------------------------------------------
#endif // _RTUSTORAGE_H_
......
......@@ -54,7 +54,7 @@ int main( int argc, char** argv )
RTUExchange* rs = RTUExchange::init_rtuexchange(argc,argv,shmID);
if( !rs )
{
dlog[Debug::CRIT] << "(rtuexchange): init ۣ..." << endl;
dlog[Debug::CRIT] << "(rtuexchange): init не прошёл..." << endl;
return 1;
}
......
......@@ -15,12 +15,12 @@ class SMDBServer:
const std::string prefix="dbserver" );
virtual ~SMDBServer();
/*! */
/*! глобальная функция для инициализации объекта */
static SMDBServer* init_smdbserver( int argc, const char* const* argv,
UniSetTypes::ObjectId shmID, SharedMemory* ic=0,
const std::string prefix="dbserver" );
/*! help- */
/*! глобальная функция для вывода help-а */
static void help_print( int argc, const char* const* argv );
protected:
......
......@@ -56,7 +56,7 @@ int main( int argc, const char** argv )
SMDBServer* db = SMDBServer::init_smdbserver(argc,argv,shmID);
if( !db )
{
dlog[Debug::CRIT] << "(smdbserver): init ۣ..." << endl;
dlog[Debug::CRIT] << "(smdbserver): init не прошёл..." << endl;
return 1;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment