Commit c08f2b19 authored by Pavel Vainerman's avatar Pavel Vainerman

Merge remote-tracking branch '1.x/master'

Conflicts: Utilities/MBTester/mbrtuslave.cc Utilities/MBTester/mbtcpserver.cc conf/libuniset2.spec extensions/IOControl/IOControl.cc extensions/ModbusMaster/MBExchange.cc extensions/ModbusSlave/MBSlave.cc extensions/include/IOBase.h extensions/lib/IOBase.cc
parents cacbe071 7b66aa44
......@@ -96,7 +96,6 @@ int main( int argc, char **argv )
{
cout << "(init): dev=" << dev << " speed=" << speed
<< " myaddr=" << ModbusRTU::addr2str(myaddr)
<< " timeout=" << tout << " msec "
<< endl;
dlog.addLevel( Debug::type(Debug::CRIT | Debug::WARN | Debug::INFO) );
......
......@@ -90,7 +90,6 @@ int main( int argc, char **argv )
{
cout << "(init): iaddr: " << iaddr << ":" << port
<< " myaddr=" << ModbusRTU::addr2str(myaddr)
<< " timeout=" << tout << " msec "
<< endl;
dlog.addLevel( Debug::ANY );
......
......@@ -716,8 +716,10 @@ bool IOControl::initIOItem( UniXML_iterator& it )
else
inf.subdev = DefaultSubdev;
}
std::string prop_prefix( prefix+"_" );
if( !IOBase::initItem(&inf,it,shm,&dlog,myname,filtersize,filterT) )
if( !IOBase::initItem(&inf,it,shm,prop_prefix,false,&dlog,myname,filtersize,filterT) )
return false;
// если вектор уже заполнен
......@@ -727,7 +729,7 @@ bool IOControl::initIOItem( UniXML_iterator& it )
if( maxItem >= iomap.size() )
iomap.resize(maxItem+30);
int prior = it.getIntProp("iopriority");
int prior = IOBase::initIntProp(it,"iopriority",prop_prefix,false);
if( prior > 0 )
{
IOPriority p(prior,maxItem);
......@@ -747,7 +749,7 @@ bool IOControl::initIOItem( UniXML_iterator& it )
<< " for '" << conf->oind->getNameById(inf.t_ai) << endl;
return true;
}
inf.channel = it.getIntProp("channel");
inf.channel = IOBase::initIntProp(it,"channel",prop_prefix,false);
if( inf.channel < 0 || inf.channel > 32 )
{
dwarn << myname << "(readItem): Unknown channel: " << inf.channel
......@@ -756,16 +758,16 @@ bool IOControl::initIOItem( UniXML_iterator& it )
}
inf.lamp = it.getIntProp("lamp");
inf.no_testlamp = it.getIntProp("no_iotestlamp");
inf.enable_testmode = it.getIntProp("enable_testmode");
inf.disable_testmode = it.getIntProp("disable_testmode");
inf.lamp = IOBase::initIntProp(it,"lamp",prop_prefix,false);
inf.no_testlamp = IOBase::initIntProp(it,"no_iotestlamp",prop_prefix,false);
inf.enable_testmode = IOBase::initIntProp(it,"enable_testmode",prop_prefix,false);
inf.disable_testmode = IOBase::initIntProp(it,"disable_testmode",prop_prefix,false);
inf.aref = 0;
inf.range = 0;
if( inf.stype == UniversalIO::AI || inf.stype == UniversalIO::AO )
{
inf.range = it.getIntProp("range");
inf.range = IOBase::initIntProp(it,"range",prop_prefix,false);
if( inf.range < 0 || inf.range > 3 )
{
dcrit << myname << "(readItem): Unknown 'range': " << inf.range
......@@ -774,7 +776,7 @@ bool IOControl::initIOItem( UniXML_iterator& it )
return false;
}
inf.aref = it.getIntProp("aref");
inf.aref = IOBase::initIntProp(it,"aref",prop_prefix,false);
if( inf.aref < 0 || inf.aref > 3 )
{
dcrit << myname << "(readItem): Unknown 'aref': " << inf.aref
......
......@@ -137,6 +137,9 @@
<br>\b enable_testmode - включить в работу во время тестового режима tmConfigEnable
<br>\b disable_testmode - исключить из работы в тестовом режиме tmConfigDisable.
\note Помимо этого для конкретного процесса можно переопределять настройки используя "prefix_" (префикс плюс подчёркивание).
Где "prefix" - это префикс это префикс заданный в конструкторе IOControl.
\section sec_IOC_ConfList Список датчиков для процесса в/в
\section sec_IOC_TestMode Тестовый режим
......
......@@ -1869,7 +1869,7 @@ MBExchange::RSProperty* MBExchange::addProp( PList& plist, RSProperty&& p )
// ------------------------------------------------------------------------------------------
bool MBExchange::initRSProperty( RSProperty& p, UniXML_iterator& it )
{
if( !IOBase::initItem(&p,it,shm,&dlog,myname) )
if( !IOBase::initItem(&p,it,shm,prop_prefix,false,&dlog,myname) )
return false;
// проверяем не пороговый ли это датчик (т.е. не связанный с обменом)
......@@ -1892,18 +1892,6 @@ bool MBExchange::initRSProperty( RSProperty& p, UniXML_iterator& it )
p.cdiagram = 0;
}
string stype( it.getProp(prop_prefix + "iotype") );
if( !stype.empty() )
{
p.stype = UniSetTypes::getIOType(stype);
if( p.stype == UniversalIO::UnknownIOType )
{
dcrit << myname << "(IOBase::readItem): неизвестный iotype=: "
<< stype << " for " << it.getProp("name") << endl;
return false;
}
}
string sbit(it.getProp(prop_prefix + "nbit"));
if( !sbit.empty() )
{
......
......@@ -140,7 +140,7 @@
Помимо этого можно задавать следующие параметры:
- \b tcp_vtype - тип переменной. см VTypes::VType.
- \b tcp_rawdata - [0|1] - игнорировать или нет параметры калибровки
- \b tcp_rawdata - [0|1] - игнорировать или нет параметры калибровки (cmin,cmax,rmin,rmax,presicion,caldiagram)
- \b tcp_iotype - [DI,DO,AI,AO] - переназначить тип датчика. По умолчанию используется поле iotype.
- \b tcp_nbit - номер бита в слове. Используется для DI,DO в случае когда для опроса используется
функция читающая слова (03
......
......@@ -806,43 +806,55 @@ bool MBSlave::readItem( const UniXML& xml, UniXML_iterator& it, xmlNode* sec )
bool MBSlave::initItem( UniXML_iterator& it )
{
IOProperty p;
string prop_prefix(prefix+"_");
if( !IOBase::initItem( static_cast<IOBase*>(&p),it,shm,&dlog,myname) )
if( !IOBase::initItem( static_cast<IOBase*>(&p),it,shm,prop_prefix,false,&dlog,myname) )
return false;
if( it.getIntProp(prop_prefix + "rawdata") )
{
p.cal.minRaw = 0;
p.cal.maxRaw = 0;
p.cal.minCal = 0;
p.cal.maxCal = 0;
p.cal.precision = 0;
p.cdiagram = 0;
}
if( mbregFromID )
p.mbreg = p.si.id;
else
{
string r = it.getProp("mbreg");
string r = IOBase::initProp(it,"mbreg",prop_prefix,false);
if( r.empty() )
{
dcrit << myname << "(initItem): Unknown 'mbreg' for " << it.getProp("name") << endl;
dcrit << myname << "(initItem): Unknown 'mbreg' for " << IOBase::initProp(it,"name",prop_prefix,false) << endl;
return false;
}
p.mbreg = ModbusRTU::str2mbData(r);
}
string stype( it.getProp("mb_iotype") );
string stype( IOBase::initProp(it,"mb_iotype",prop_prefix,false) );
if( stype.empty() )
stype = it.getProp("iotype");
stype = IOBase::initProp(it,"iotype",prop_prefix,false);
p.stype = UniSetTypes::getIOType(stype);
if( p.stype == UniversalIO::UnknownIOType )
{
dcrit << myname << "(initItem): Unknown 'iotype' or 'mb_iotype' for " << it.getProp("name") << endl;
dcrit << myname << "(initItem): Unknown 'iotype' or 'mb_iotype' for " << IOBase::initProp(it,"name",prop_prefix,false) << endl;
return false;
}
p.amode = MBSlave::amRW;
string am(it.getProp("mb_accessmode"));
string am(IOBase::initProp(it,"mb_accessmode",prop_prefix,false));
if( am == "ro" )
p.amode = MBSlave::amRO;
else if( am == "rw" )
p.amode = MBSlave::amRW;
string vt(it.getProp("mb_vtype"));
string vt(IOBase::initProp(it,"mb_vtype",prop_prefix,false));
if( vt.empty() )
{
p.vtype = VTypes::vtUnknown;
......@@ -856,7 +868,7 @@ bool MBSlave::initItem( UniXML_iterator& it )
if( v == VTypes::vtUnknown )
{
dcrit << myname << "(initItem): Unknown rtuVType=" << vt << " for "
<< it.getProp("name")
<< IOBase::initProp(it,"name",prop_prefix,false)
<< endl;
return false;
......
......@@ -126,11 +126,21 @@ static const int NoSafety = -1;
static float processingFasAO( IOBase* it, SMInterface* shm, bool force );
static bool processingAsDO( IOBase* it, SMInterface* shm, bool force );
static void processingThreshold( IOBase* it, SMInterface* shm, bool force );
/*! \param initPrefixOnly - TRUE - инициализировать только свойста с prefix (или брать значения по умолчанию).
FALSE - сперва искать свойство с prefix, если не найдено брать без prefix.
*/
static bool initItem( IOBase* b, UniXML_iterator& it, SMInterface* shm,
const std::string& prefix, bool init_prefix_only,
DebugStream* dlog=0, std::string myname="",
int def_filtersize=0, float def_filterT=0.0,
float def_lsparam=0.2, float def_iir_coeff_prev=0.5,
float def_iir_coeff_new=0.5 );
// helpes
static std::string initProp( UniXML_iterator& it, const std::string& prop, const std::string& prefix, bool prefonly, const std::string& defval="" );
static int initIntProp( UniXML_iterator& it, const std::string& prop, const std::string& prefix, bool prefonly, const int defval=0 );
};
......
......@@ -372,20 +372,50 @@ void IOBase::processingThreshold( IOBase* it, SMInterface* shm, bool force )
processingAsDI(it,set,shm,force);
}
// -----------------------------------------------------------------------------
std::string IOBase::initProp( UniXML_iterator& it, const std::string& prop, const std::string& prefix, bool prefonly, const std::string& defval )
{
if( !it.getProp(prefix+prop).empty() )
return it.getProp(prefix+prop);
if( prefonly )
return defval;
if( !it.getProp(prop).empty() )
return it.getProp(prop);
bool IOBase::initItem( IOBase* b, UniXML_iterator& it, SMInterface* shm,
return defval;
}
// -----------------------------------------------------------------------------
int IOBase::initIntProp( UniXML_iterator& it, const std::string& prop, const std::string& prefix, bool prefonly, const int defval )
{
string pp(prefix+prop);
if( !it.getProp(pp).empty() )
return it.getIntProp(pp);
if( prefonly )
return defval;
if( !it.getProp(prop).empty() )
return it.getIntProp(prop);
return defval;
}
// -----------------------------------------------------------------------------
bool IOBase::initItem( IOBase* b, UniXML_iterator& it, SMInterface* shm, const std::string& prefix,
bool init_prefix_only,
DebugStream* dlog, std::string myname,
int def_filtersize, float def_filterT, float def_lsparam,
float def_iir_coeff_prev, float def_iir_coeff_new )
{
string sname( it.getProp("name") );
string sname( initProp(it,"name",prefix,init_prefix_only) );
ObjectId sid = DefaultObjectId;
if( it.getProp("id").empty() )
if( initProp(it,"id",prefix,init_prefix_only).empty() )
sid = conf->getSensorID(sname);
else
{
sid = it.getPIntProp("id", DefaultObjectId);
sid = initIntProp(it,"id",prefix,init_prefix_only,DefaultObjectId);
}
if( sid == DefaultObjectId )
......@@ -401,26 +431,26 @@ bool IOBase::initItem( IOBase* b, UniXML_iterator& it, SMInterface* shm,
b->si.id = sid;
b->si.node = conf->getLocalNode();
b->nofilter = it.getIntProp("nofilter");
b->ignore = it.getIntProp("ioignore");
b->invert = it.getIntProp("ioinvert");
b->defval = it.getIntProp("default");
b->noprecision = it.getIntProp("noprecision");
b->nofilter = initIntProp(it,"nofilter",prefix,init_prefix_only);
b->ignore = initIntProp(it,"ioignore",prefix,init_prefix_only);
b->invert = initIntProp(it,"ioinvert",prefix,init_prefix_only);
b->defval = initIntProp(it,"default",prefix,init_prefix_only);
b->noprecision = initIntProp(it,"noprecision",prefix,init_prefix_only);
b->value = b->defval;
b->breaklim = it.getIntProp("breaklim");
b->breaklim = initIntProp(it,"breaklim",prefix,init_prefix_only);
long msec = it.getPIntProp("debouncedelay", UniSetTimer::WaitUpTime);
long msec = initIntProp(it,"debouncedelay",prefix,init_prefix_only, UniSetTimer::WaitUpTime);
b->ptDebounce.setTiming(msec);
msec = it.getPIntProp("ondelay", UniSetTimer::WaitUpTime);
msec = initIntProp(it,"ondelay",prefix,init_prefix_only, UniSetTimer::WaitUpTime);
b->ptOnDelay.setTiming(msec);
msec = it.getPIntProp("offdelay", UniSetTimer::WaitUpTime);
msec = initIntProp(it,"offdelay",prefix,init_prefix_only, UniSetTimer::WaitUpTime);
b->ptOffDelay.setTiming(msec);
b->front = false;
std::string front_t( it.getProp("iofront") );
std::string front_t( initProp(it,"iofront",prefix,init_prefix_only) );
if( !front_t.empty() )
{
if( front_t == "01" )
......@@ -442,14 +472,14 @@ bool IOBase::initItem( IOBase* b, UniXML_iterator& it, SMInterface* shm,
}
}
b->safety = it.getPIntProp("safety", NoSafety);
b->safety = initIntProp(it,"safety",prefix,init_prefix_only, NoSafety);
b->stype = UniSetTypes::getIOType(it.getProp("iotype"));
b->stype = UniSetTypes::getIOType(initProp(it,"iotype",prefix,init_prefix_only));
if( b->stype == UniversalIO::UnknownIOType )
{
if( dlog && dlog->is_crit() )
dlog->crit() << myname << "(IOBase::readItem): неизвестный iotype=: "
<< it.getProp("iotype") << " для " << sname << endl;
<< initProp(it,"iotype",prefix,init_prefix_only) << " для " << sname << endl;
return false;
}
......@@ -467,17 +497,17 @@ bool IOBase::initItem( IOBase* b, UniXML_iterator& it, SMInterface* shm,
if( b->stype == UniversalIO::AI || b->stype == UniversalIO::AO )
{
b->cal.minRaw = it.getIntProp("rmin");
b->cal.maxRaw = it.getIntProp("rmax");
b->cal.minCal = it.getIntProp("cmin");
b->cal.maxCal = it.getIntProp("cmax");
b->cal.precision = it.getIntProp("precision");
b->cal.minRaw = initIntProp(it,"rmin",prefix,init_prefix_only);
b->cal.maxRaw = initIntProp(it,"rmax",prefix,init_prefix_only);
b->cal.minCal = initIntProp(it,"cmin",prefix,init_prefix_only);
b->cal.maxCal = initIntProp(it,"cmax",prefix,init_prefix_only);
b->cal.precision = initIntProp(it,"precision",prefix,init_prefix_only);
int f_size = def_filtersize;
float f_T = def_filterT;
float f_lsparam = def_lsparam;
int f_median = it.getIntProp("filtermedian");
int f_iir = it.getIntProp("iir_thr");
int f_median = initIntProp(it,"filtermedian",prefix,init_prefix_only);
int f_iir = initIntProp(it,"iir_thr",prefix,init_prefix_only);
float f_iir_coeff_prev = def_iir_coeff_prev;
float f_iir_coeff_new = def_iir_coeff_new;
......@@ -490,29 +520,29 @@ bool IOBase::initItem( IOBase* b, UniXML_iterator& it, SMInterface* shm,
{
if( f_iir > 0 )
b->f_filter_iir = true;
if( !it.getProp("filtersize").empty() )
f_size = it.getPIntProp("filtersize",def_filtersize);
if( !initProp(it,"filtersize",prefix,init_prefix_only).empty() )
f_size = initIntProp(it,"filtersize",prefix,init_prefix_only,def_filtersize);
}
if( !it.getProp("filterT").empty() )
if( !initProp(it,"filterT",prefix,init_prefix_only).empty() )
{
f_T = atof(it.getProp("filterT").c_str());
f_T = atof(initProp(it,"filterT",prefix,init_prefix_only).c_str());
if( f_T < 0 )
f_T = 0.0;
}
if( !it.getProp("leastsqr").empty() )
if( !initProp(it,"leastsqr",prefix,init_prefix_only).empty() )
{
b->f_ls = true;
f_lsparam = atof(it.getProp("leastsqr").c_str());
f_lsparam = atof(initProp(it,"leastsqr",prefix,init_prefix_only).c_str());
if( f_lsparam < 0 )
f_lsparam = def_lsparam;
}
if( !it.getProp("iir_coeff_prev").empty() )
f_iir_coeff_prev = atof(it.getProp("iir_coeff_prev").c_str());
if( !it.getProp("iir_coeff_new").empty() )
f_iir_coeff_new = atof(it.getProp("iir_coeff_new").c_str());
if( !initProp(it,"iir_coeff_prev",prefix,init_prefix_only).empty() )
f_iir_coeff_prev = atof(initProp(it,"iir_coeff_prev",prefix,init_prefix_only).c_str());
if( !initProp(it,"iir_coeff_new",prefix,init_prefix_only).empty() )
f_iir_coeff_new = atof(initProp(it,"iir_coeff_new",prefix,init_prefix_only).c_str());
if( b->stype == UniversalIO::AI )
b->df.setSettings( f_size, f_T, f_lsparam, f_iir,
......@@ -520,19 +550,19 @@ bool IOBase::initItem( IOBase* b, UniXML_iterator& it, SMInterface* shm,
b->df.init(b->defval);
std::string caldiagram( it.getProp("caldiagram") );
std::string caldiagram( initProp(it,"caldiagram",prefix,init_prefix_only) );
if( !caldiagram.empty() )
{
b->cdiagram = UniSetExtensions::buildCalibrationDiagram(caldiagram);
if( !it.getProp("cal_cachesize").empty() )
b->cdiagram->setCacheSize(it.getIntProp("cal_cachesize"));
if( !it.getProp("cal_cacheresort").empty() )
b->cdiagram->setCacheResortCycle(it.getIntProp("cal_cacheresort"));
if( !initProp(it,"cal_cachesize",prefix,init_prefix_only).empty() )
b->cdiagram->setCacheSize(initIntProp(it,"cal_cachesize",prefix,init_prefix_only));
if( !initProp(it,"cal_cacheresort",prefix,init_prefix_only).empty() )
b->cdiagram->setCacheResortCycle(initIntProp(it,"cal_cacheresort",prefix,init_prefix_only));
}
}
else if( b->stype == UniversalIO::DI || b->stype == UniversalIO::DO )
{
string tai(it.getProp("threshold_aid"));
string tai(initProp(it,"threshold_aid",prefix,init_prefix_only));
if( !tai.empty() )
{
b->t_ai = conf->getSensorID(tai);
......@@ -544,9 +574,9 @@ bool IOBase::initItem( IOBase* b, UniXML_iterator& it, SMInterface* shm,
return false;
}
b->ti.lowlimit = it.getIntProp("lowlimit");
b->ti.hilimit = it.getIntProp("hilimit");
b->ti.invert = it.getIntProp("threshold_invert");
b->ti.lowlimit = initIntProp(it,"lowlimit",prefix,init_prefix_only);
b->ti.hilimit = initIntProp(it,"hilimit",prefix,init_prefix_only);
b->ti.invert = initIntProp(it,"threshold_invert",prefix,init_prefix_only);
shm->initIterator(b->t_ait);
}
}
......
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