Commit 9b195da5 authored by Ivan Donchevskiy's avatar Ivan Donchevskiy

Merge branch 'master' of git.eter:/projects/uniset into utf8

Conflicts: IDL/Processes/IOController_i.idl conf/libuniset.spec extensions/ModbusSlave/MBSlave.cc extensions/lib/IOBase.cc src/Various/NCRestorer_XML.cc
parents 0337d45f 86b7fd9a
......@@ -291,6 +291,7 @@ interface IONotifyController_i : IOController_i
ThresholdState state;
long tv_sec; /*!< время последнего изменения датчика, секунды (gettimeofday) */
long tv_usec; /*!< время последнего изменения датчика, мксек (gettimeofday) */
boolean inverse; /*!< инверсная логика */
};
typedef sequence<ThresholdInfo> ThresholdInfoSeq;
......
......@@ -2,8 +2,8 @@
%define oname uniset
Name: libuniset
Version: 0.98
Release: eter1
Version: 0.97
Release: eter56
Summary: UniSet - library for building distributed industrial control systems
License: GPL
Group: Development/C++
......@@ -183,8 +183,9 @@ rm -f %buildroot%_libdir/*.la
%exclude %_pkgconfigdir/libUniSet.pc
%changelog
* Wed Mar 03 2010 Ilya Shpigor <elly@altlinux.org> 0.98-eter1
- new build for Sisyphus with utf8 support
* Fri Mar 12 2010 Pavel Vainerman <pv@altlinux.ru> 0.97-eter55
- new build
* Sat Feb 13 2010 Pavel Vainerman <pv@altlinux.ru> 0.97-eter54
- fixed bug in codegen
......
......@@ -21,6 +21,8 @@ shm(0),
initPause(0),
test_id(DefaultObjectId),
askcount_id(DefaultObjectId),
respond_id(DefaultObjectId),
respond_invert(false),
askCount(0),
activated(false),
activateTimeout(500),
......@@ -63,6 +65,9 @@ prefix(prefix)
mbregFromID = conf->getArgInt("--" + prefix + "-reg-from-id",it.getProp("reg_from_id"));
dlog[Debug::INFO] << myname << "(init): mbregFromID=" << mbregFromID << endl;
respond_id = conf->getSensorID(conf->getArgParam("--" + prefix + "-respond-id",it.getProp("respond_id")));
respond_invert = conf->getArgInt("--" + prefix + "-respond-invert",it.getProp("respond_invert"));
string stype = conf->getArgParam("--" + prefix + "-type",it.getProp("type"));
if( stype == "RTU" )
......@@ -96,16 +101,18 @@ prefix(prefix)
{
string iaddr = conf->getArgParam("--" + prefix + "-inet-addr",it.getProp("iaddr"));
if( iaddr.empty() )
throw UniSetTypes::SystemError(myname+"(MBSlave): Unknown TCP server address. Use: --mbs-inet-addr [ XXX.XXX.XXX.XXX| hostname ]");
throw UniSetTypes::SystemError(myname+"(MBSlave): Unknown TCP server address. Use: --prefix-inet-addr [ XXX.XXX.XXX.XXX| hostname ]");
int port = conf->getArgPInt("--" + prefix + "-inet-port",it.getProp("iport"), 502);
dlog[Debug::INFO] << myname << "(init): type=TCP myaddr=" << ModbusRTU::addr2str(addr)
<< " inet=" << iaddr << " port=" << port << endl;
ost::InetAddress ia(iaddr.c_str());
mbslot = new ModbusTCPServerSlot(ia,port);
thr = new ThreadCreator<MBSlave>(this,&MBSlave::execute_tcp);
dlog[Debug::INFO] << myname << "(init): type=TCP myaddr=" << ModbusRTU::addr2str(addr)
<< " inet=" << iaddr << " port=" << port << endl;
dlog[Debug::INFO] << myname << "(init): init TCP connection ok. " << " inet=" << iaddr << " port=" << port << endl;
}
else
throw UniSetTypes::SystemError(myname+"(MBSlave): Unknown slave type. Use: --mbs-type [RTU|TCP]");
......@@ -119,7 +126,7 @@ prefix(prefix)
mbslot->connectWriteOutput( sigc::mem_fun(this, &MBSlave::writeOutputRegisters) );
mbslot->connectWriteSingleOutput( sigc::mem_fun(this, &MBSlave::writeOutputSingleRegister) );
if( findArgParam("--mbs-allow-setdatetime",conf->getArgc(),conf->getArgv())!=-1 )
if( findArgParam("--" + prefix + "-allow-setdatetime",conf->getArgc(),conf->getArgv())!=-1 )
mbslot->connectSetDateTime( sigc::mem_fun(this, &MBSlave::setDateTime) );
mbslot->connectFileTransfer( sigc::mem_fun(this, &MBSlave::fileTransfer) );
......@@ -306,6 +313,23 @@ void MBSlave::execute_rtu()
}
}
if( respond_id != DefaultObjectId )
{
bool state = ptTimeout.checkTime() ? false : true;
if( respond_invert )
state ^= true;
try
{
shm->localSaveState(ditRespond,respond_id,state,getId());
}
catch(Exception& ex)
{
dlog[Debug::CRIT] << myname
<< "(execute_rtu): (respond) " << ex << std::endl;
}
}
if( askcount_id!=DefaultObjectId )
{
try
......@@ -370,6 +394,22 @@ void MBSlave::execute_tcp()
}
}
if( respond_id != DefaultObjectId )
{
bool state = ptTimeout.checkTime() ? false : true;
if( respond_invert )
state ^= true;
try
{
shm->localSaveState(ditRespond,respond_id,state,getId());
}
catch(Exception& ex)
{
dlog[Debug::CRIT] << myname
<< "(execute_rtu): (respond) " << ex << std::endl;
}
}
if( askcount_id!=DefaultObjectId )
{
try
......@@ -729,6 +769,7 @@ void MBSlave::initIterators()
shm->initAIterator(aitHeartBeat);
shm->initAIterator(aitAskCount);
shm->initDIterator(ditRespond);
}
// -----------------------------------------------------------------------------
void MBSlave::help_print( int argc, const char* const* argv )
......@@ -738,9 +779,11 @@ void MBSlave::help_print( int argc, const char* const* argv )
cout << "--prefix-heartbeat-max - Максимальное значение heartbeat-счётчика для данного процесса. По умолчанию 10." << endl;
cout << "--prefix-ready-timeout - Время ожидания готовности SM к работе, мсек. (-1 - ждать 'вечно')" << endl;
cout << "--prefix-initPause - Задержка перед инициализацией (время на активизация процесса)" << endl;
cout << "--prefix-notRespondSensor - датчик связи для данного процесса " << endl;
cout << "--prefix-respond-id - respond sensor id" << endl;
cout << "--prefix-respond-invert [0|1] - invert respond logic" << endl;
cout << "--prefix-sm-ready-timeout - время на ожидание старта SM" << endl;
cout << "--prefix-recv-timeout - Таймаут на ожидание ответа." << endl;
cout << "--prefix-timeout msec - timeout for check link" << endl;
cout << "--prefix-allow-setdatetime - On set date and time (0x50) modbus function" << endl;
cout << "--prefix-my-addr - адрес текущего узла" << endl;
cout << "--prefix-type [RTU|TCP] - modbus server type." << endl;
......@@ -774,7 +817,7 @@ MBSlave* MBSlave::init_mbslave( int argc, const char* const* argv, UniSetTypes::
}
dlog[Debug::INFO] << "(mbslave): name = " << name << "(" << ID << ")" << endl;
return new MBSlave(ID,icID,ic);
return new MBSlave(ID,icID,ic,prefix);
}
// -----------------------------------------------------------------------------
std::ostream& operator<<( std::ostream& os, MBSlave::IOProperty& p )
......
......@@ -168,6 +168,10 @@ class MBSlave:
IOController::AIOStateList::iterator aitAskCount;
UniSetTypes::ObjectId askcount_id;
IOController::DIOStateList::iterator ditRespond;
UniSetTypes::ObjectId respond_id;
bool respond_invert;
PassiveTimer ptTimeout;
ModbusRTU::mbErrCode prev;
long askCount;
......
......@@ -369,10 +369,20 @@ void IOBase::processingThreshold( IOBase* it, SMInterface* shm, bool force )
// cout << "val=" << val << " set=" << set << endl;
// Проверка нижнего предела
// значение должно быть меньше lowLimit-чуствительность
if( val <= (it->ti.lowlimit-it->ti.sensibility) )
set = false;
else if( val >= (it->ti.hilimit+it->ti.sensibility) )
set = true;
if (it->ti.inverse)
{
if( val <= (it->ti.lowlimit-it->ti.sensibility) )
set = true;
else if( val >= (it->ti.hilimit+it->ti.sensibility) )
set = false;
}
else
{
if( val <= (it->ti.lowlimit-it->ti.sensibility) )
set = false;
else if( val >= (it->ti.hilimit+it->ti.sensibility) )
set = true;
}
// cout << "thresh: set=" << set << endl;
processingAsDI(it,set,shm,force);
......@@ -527,6 +537,7 @@ bool IOBase::initItem( IOBase* b, UniXML_iterator& it, SMInterface* shm,
b->ti.lowlimit = it.getIntProp("lowlimit");
b->ti.hilimit = it.getIntProp("hilimit");
b->ti.sensibility = it.getIntProp("sensibility");
b->ti.inverse = it.getIntProp("inverse");
}
}
// else
......
......@@ -469,7 +469,7 @@ bool NCRestorer_XML::getThresholdInfo( UniXML& xml,xmlNode* node,
bool NCRestorer_XML::check_thresholds_item( UniXML_iterator& it )
{
// формат тот же как и <sensors>
return check_list_item(it);
return check_consumer_item(it);
}
// ------------------------------------------------------------------------------------------
void NCRestorer_XML::setReadThresholdItem( ReaderSlot sl )
......
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