Commit 55ad1f17 authored by Pavel Vainerman's avatar Pavel Vainerman

(MBTCPMaster): Реализация без "offset". Разрешающая указывать одни и те же регистры,

но разные функции..
parent d1530a2b
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
#include <cmath> #include <cmath>
#include <limits>
#include <sstream> #include <sstream>
#include <Exceptions.h> #include <Exceptions.h>
#include <extensions/Extensions.h> #include <extensions/Extensions.h>
...@@ -357,7 +358,6 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it ) ...@@ -357,7 +358,6 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it )
dlog[Debug::LEVEL3] << myname << "(pollRTU): poll " dlog[Debug::LEVEL3] << myname << "(pollRTU): poll "
<< " mbaddr=" << ModbusRTU::addr2str(dev->mbaddr) << " mbaddr=" << ModbusRTU::addr2str(dev->mbaddr)
<< " mbreg=" << ModbusRTU::dat2str(p->mbreg) << " mbreg=" << ModbusRTU::dat2str(p->mbreg)
<< " mboffset=" << p->offset
<< " mbfunc=" << p->mbfunc << " mbfunc=" << p->mbfunc
<< " q_count=" << p->q_count << " q_count=" << p->q_count
<< " mb_init=" << p->mb_init << " mb_init=" << p->mb_init
...@@ -385,7 +385,7 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it ) ...@@ -385,7 +385,7 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it )
{ {
case ModbusRTU::fnReadInputRegisters: case ModbusRTU::fnReadInputRegisters:
{ {
ModbusRTU::ReadInputRetMessage ret = mb->read04(dev->mbaddr,p->mbreg+p->offset,p->q_count); ModbusRTU::ReadInputRetMessage ret = mb->read04(dev->mbaddr,p->mbreg,p->q_count);
for( int i=0; i<p->q_count; i++,it++ ) for( int i=0; i<p->q_count; i++,it++ )
it->second->mbval = ret.data[i]; it->second->mbval = ret.data[i];
it--; it--;
...@@ -394,7 +394,7 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it ) ...@@ -394,7 +394,7 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it )
case ModbusRTU::fnReadOutputRegisters: case ModbusRTU::fnReadOutputRegisters:
{ {
ModbusRTU::ReadOutputRetMessage ret = mb->read03(dev->mbaddr, p->mbreg+p->offset,p->q_count); ModbusRTU::ReadOutputRetMessage ret = mb->read03(dev->mbaddr, p->mbreg,p->q_count);
for( int i=0; i<p->q_count; i++,it++ ) for( int i=0; i<p->q_count; i++,it++ )
it->second->mbval = ret.data[i]; it->second->mbval = ret.data[i];
it--; it--;
...@@ -403,7 +403,7 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it ) ...@@ -403,7 +403,7 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it )
case ModbusRTU::fnReadInputStatus: case ModbusRTU::fnReadInputStatus:
{ {
ModbusRTU::ReadInputStatusRetMessage ret = mb->read02(dev->mbaddr,p->mbreg+p->offset,p->q_count); ModbusRTU::ReadInputStatusRetMessage ret = mb->read02(dev->mbaddr,p->mbreg,p->q_count);
int m=0; int m=0;
for( int i=0; i<ret.bcnt; i++ ) for( int i=0; i<ret.bcnt; i++ )
{ {
...@@ -417,7 +417,7 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it ) ...@@ -417,7 +417,7 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it )
case ModbusRTU::fnReadCoilStatus: case ModbusRTU::fnReadCoilStatus:
{ {
ModbusRTU::ReadCoilRetMessage ret = mb->read01(dev->mbaddr,p->mbreg+p->offset,p->q_count); ModbusRTU::ReadCoilRetMessage ret = mb->read01(dev->mbaddr,p->mbreg,p->q_count);
int m = 0; int m = 0;
for( int i=0; i<ret.bcnt; i++ ) for( int i=0; i<ret.bcnt; i++ )
{ {
...@@ -442,13 +442,13 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it ) ...@@ -442,13 +442,13 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it )
return true; return true;
// cerr << "**** mbreg=" << ModbusRTU::dat2str(p->mbreg) << " val=" << ModbusRTU::dat2str(p->mbval) << endl; // cerr << "**** mbreg=" << ModbusRTU::dat2str(p->mbreg) << " val=" << ModbusRTU::dat2str(p->mbval) << endl;
ModbusRTU::WriteSingleOutputRetMessage ret = mb->write06(dev->mbaddr,p->mbreg+p->offset,p->mbval); ModbusRTU::WriteSingleOutputRetMessage ret = mb->write06(dev->mbaddr,p->mbreg,p->mbval);
} }
break; break;
case ModbusRTU::fnWriteOutputRegisters: case ModbusRTU::fnWriteOutputRegisters:
{ {
ModbusRTU::WriteOutputMessage msg(dev->mbaddr,p->mbreg+p->offset); ModbusRTU::WriteOutputMessage msg(dev->mbaddr,p->mbreg);
for( int i=0; i<p->q_count; i++,it++ ) for( int i=0; i<p->q_count; i++,it++ )
msg.addData(it->second->mbval); msg.addData(it->second->mbval);
...@@ -470,7 +470,7 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it ) ...@@ -470,7 +470,7 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it )
return true; return true;
// cerr << "****(coil) mbreg=" << ModbusRTU::dat2str(p->mbreg) << " val=" << ModbusRTU::dat2str(p->mbval) << endl; // cerr << "****(coil) mbreg=" << ModbusRTU::dat2str(p->mbreg) << " val=" << ModbusRTU::dat2str(p->mbval) << endl;
ModbusRTU::ForceSingleCoilRetMessage ret = mb->write05(dev->mbaddr,p->mbreg+p->offset,p->mbval); ModbusRTU::ForceSingleCoilRetMessage ret = mb->write05(dev->mbaddr,p->mbreg,p->mbval);
} }
break; break;
...@@ -492,7 +492,7 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it ) ...@@ -492,7 +492,7 @@ bool MBTCPMaster::pollRTU( RTUDevice* dev, RegMap::iterator& it )
return true; return true;
} }
#endif #endif
ModbusRTU::ForceCoilsMessage msg(dev->mbaddr,p->mbreg+p->offset); ModbusRTU::ForceCoilsMessage msg(dev->mbaddr,p->mbreg);
for( int i=0; i<p->q_count; i++,it++ ) for( int i=0; i<p->q_count; i++,it++ )
msg.addBit( (it->second->mbval ? true : false) ); msg.addBit( (it->second->mbval ? true : false) );
...@@ -1217,23 +1217,23 @@ MBTCPMaster::RTUDevice* MBTCPMaster::addDev( RTUDeviceMap& mp, ModbusRTU::Modbus ...@@ -1217,23 +1217,23 @@ MBTCPMaster::RTUDevice* MBTCPMaster::addDev( RTUDeviceMap& mp, ModbusRTU::Modbus
return d; return d;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
MBTCPMaster::RegInfo* MBTCPMaster::addReg( RegMap& mp, ModbusRTU::ModbusData r, MBTCPMaster::RegInfo* MBTCPMaster::addReg( RegMap& mp, RegID id, ModbusRTU::ModbusData r,
UniXML_iterator& xmlit, MBTCPMaster::RTUDevice* dev, UniXML_iterator& xmlit, MBTCPMaster::RTUDevice* dev,
MBTCPMaster::RegInfo* rcopy ) MBTCPMaster::RegInfo* rcopy )
{ {
RegMap::iterator it = mp.find(r); RegMap::iterator it = mp.find(id);
if( it != mp.end() ) if( it != mp.end() )
{ {
if( !it->second->dev ) if( !it->second->dev )
{ {
dlog[Debug::CRIT] << myname << "(addReg): for reg=" << ModbusRTU::dat2str(r) dlog[Debug::CRIT] << myname << "(addReg): for " << xmlit.getProp("name")
<< " dev=0!!!! " << endl; << " dev=0!!!! " << endl;
return 0; return 0;
} }
if( it->second->dev->dtype != dev->dtype ) if( it->second->dev->dtype != dev->dtype )
{ {
dlog[Debug::CRIT] << myname << "(addReg): OTHER mbtype=" << dev->dtype << " for reg=" << ModbusRTU::dat2str(r) dlog[Debug::CRIT] << myname << "(addReg): OTHER mbtype=" << dev->dtype << " for " << xmlit.getProp("name")
<< ". Already used devtype=" << it->second->dev->dtype << " for " << it->second->dev << endl; << ". Already used devtype=" << it->second->dev->dtype << " for " << it->second->dev << endl;
return 0; return 0;
} }
...@@ -1265,9 +1265,11 @@ MBTCPMaster::RegInfo* MBTCPMaster::addReg( RegMap& mp, ModbusRTU::ModbusData r, ...@@ -1265,9 +1265,11 @@ MBTCPMaster::RegInfo* MBTCPMaster::addReg( RegMap& mp, ModbusRTU::ModbusData r,
} }
ri->mbreg = r; ri->mbreg = r;
} }
ri->id = id;
mp.insert(RegMap::value_type(r,ri)); mp.insert(RegMap::value_type(id,ri));
ri->rit = mp.find(r); ri->rit = mp.find(id);
return ri; return ri;
} }
...@@ -1375,7 +1377,6 @@ bool MBTCPMaster::initRegInfo( RegInfo* r, UniXML_iterator& it, MBTCPMaster::RT ...@@ -1375,7 +1377,6 @@ bool MBTCPMaster::initRegInfo( RegInfo* r, UniXML_iterator& it, MBTCPMaster::RT
{ {
r->dev = dev; r->dev = dev;
r->mbval = it.getIntProp("default"); r->mbval = it.getIntProp("default");
r->offset = it.getIntProp("tcp_mboffset");
r->mb_init = it.getIntProp("tcp_mbinit"); r->mb_init = it.getIntProp("tcp_mbinit");
if( dev->dtype == MBTCPMaster::dtRTU ) if( dev->dtype == MBTCPMaster::dtRTU )
...@@ -1466,7 +1467,15 @@ bool MBTCPMaster::initRTUDevice( RTUDevice* d, UniXML_iterator& it ) ...@@ -1466,7 +1467,15 @@ bool MBTCPMaster::initRTUDevice( RTUDevice* d, UniXML_iterator& it )
return true; return true;
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
MBTCPMaster::RegID MBTCPMaster::genRegID( const ModbusRTU::ModbusData mbreg, const int fn )
{
// формула для вычисления ID
// требования:
// - ID > диапазона возможных регитров
// - разные функции должны давать разный ID
return numeric_limits<ModbusRTU::ModbusData>::max() + mbreg + fn;
}
// ------------------------------------------------------------------------------------------
bool MBTCPMaster::initItem( UniXML_iterator& it ) bool MBTCPMaster::initItem( UniXML_iterator& it )
{ {
RSProperty p; RSProperty p;
...@@ -1504,7 +1513,15 @@ bool MBTCPMaster::initItem( UniXML_iterator& it ) ...@@ -1504,7 +1513,15 @@ bool MBTCPMaster::initItem( UniXML_iterator& it )
mbreg = ModbusRTU::str2mbData(reg); mbreg = ModbusRTU::str2mbData(reg);
} }
RegInfo* ri = addReg(dev->regmap,mbreg,it,dev); int fn = it.getIntProp("tcp_mbfunc");
// формула для вычисления ID
// требования:
// - ID > диапазона возможных регитров
// - разные функции должны давать разный ID
RegID rID = genRegID(mbreg,fn);
RegInfo* ri = addReg(dev->regmap,rID,mbreg,it,dev);
if( dev->dtype == dtMTR ) if( dev->dtype == dtMTR )
{ {
...@@ -1566,7 +1583,10 @@ bool MBTCPMaster::initItem( UniXML_iterator& it ) ...@@ -1566,7 +1583,10 @@ bool MBTCPMaster::initItem( UniXML_iterator& it )
if( p1->rnum > 1 ) if( p1->rnum > 1 )
{ {
for( int i=1; i<p1->rnum; i++ ) for( int i=1; i<p1->rnum; i++ )
addReg(dev->regmap,mbreg+i,it,dev,ri); {
RegID id1 = genRegID(mbreg+i,fn);
addReg(dev->regmap,id1,mbreg+i,it,dev,ri);
}
} }
...@@ -1585,12 +1605,6 @@ bool MBTCPMaster::initItem( UniXML_iterator& it ) ...@@ -1585,12 +1605,6 @@ bool MBTCPMaster::initItem( UniXML_iterator& it )
else else
ii.mbreg = ri->mbreg; ii.mbreg = ri->mbreg;
string s_offset(it.getProp("tcp_init_offset"));
if( !s_offset.empty() )
ii.mbreg += uni_atoi(s_offset);
else
ii.mbreg += ri->offset;
string s_mbfunc(it.getProp("tcp_init_mbfunc")); string s_mbfunc(it.getProp("tcp_init_mbfunc"));
if( !s_mbfunc.empty() ) if( !s_mbfunc.empty() )
{ {
...@@ -1848,7 +1862,8 @@ std::ostream& operator<<( std::ostream& os, MBTCPMaster::RTUDevice& d ) ...@@ -1848,7 +1862,8 @@ std::ostream& operator<<( std::ostream& os, MBTCPMaster::RTUDevice& d )
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
std::ostream& operator<<( std::ostream& os, MBTCPMaster::RegInfo& r ) std::ostream& operator<<( std::ostream& os, MBTCPMaster::RegInfo& r )
{ {
os << " mbreg=" << ModbusRTU::dat2str(r.mbreg) os << " id=" << r.id
<< " mbreg=" << ModbusRTU::dat2str(r.mbreg)
<< " mbfunc=" << r.mbfunc << " mbfunc=" << r.mbfunc
<< " q_num=" << r.q_num << " q_num=" << r.q_num
<< " q_count=" << r.q_count << " q_count=" << r.q_count
...@@ -1875,14 +1890,14 @@ void MBTCPMaster::rtuQueryOptimization( RTUDeviceMap& m ) ...@@ -1875,14 +1890,14 @@ void MBTCPMaster::rtuQueryOptimization( RTUDeviceMap& m )
for( MBTCPMaster::RegMap::iterator it=d->regmap.begin(); it!=d->regmap.end(); ++it ) for( MBTCPMaster::RegMap::iterator it=d->regmap.begin(); it!=d->regmap.end(); ++it )
{ {
MBTCPMaster::RegMap::iterator beg = it; MBTCPMaster::RegMap::iterator beg = it;
ModbusRTU::ModbusData reg = it->second->mbreg + it->second->offset; ModbusRTU::ModbusData reg = it->second->mbreg;
beg->second->q_num = 1; beg->second->q_num = 1;
beg->second->q_count = 1; beg->second->q_count = 1;
it++; it++;
for( ;it!=d->regmap.end(); ++it ) for( ;it!=d->regmap.end(); ++it )
{ {
if( (it->second->mbreg + it->second->offset - reg) > 1 ) if( (it->second->mbreg - reg) > 1 )
break; break;
if( beg->second->mbfunc != it->second->mbfunc ) if( beg->second->mbfunc != it->second->mbfunc )
...@@ -1893,7 +1908,7 @@ void MBTCPMaster::rtuQueryOptimization( RTUDeviceMap& m ) ...@@ -1893,7 +1908,7 @@ void MBTCPMaster::rtuQueryOptimization( RTUDeviceMap& m )
if( beg->second->q_count >= ModbusRTU::MAXDATALEN ) if( beg->second->q_count >= ModbusRTU::MAXDATALEN )
break; break;
reg = it->second->mbreg + it->second->offset; reg = it->second->mbreg;
it->second->q_num = beg->second->q_count; it->second->q_num = beg->second->q_count;
it->second->q_count = 0; it->second->q_count = 0;
} }
......
...@@ -214,12 +214,14 @@ class MBTCPMaster: ...@@ -214,12 +214,14 @@ class MBTCPMaster:
typedef std::list<RSProperty> PList; typedef std::list<RSProperty> PList;
static std::ostream& print_plist( std::ostream& os, PList& p ); static std::ostream& print_plist( std::ostream& os, PList& p );
typedef std::map<ModbusRTU::ModbusData,RegInfo*> RegMap; typedef unsigned long RegID;
typedef std::map<RegID,RegInfo*> RegMap;
struct RegInfo struct RegInfo
{ {
RegInfo(): RegInfo():
mbval(0),mbreg(0),mbfunc(ModbusRTU::fnUnknown), mbval(0),mbreg(0),mbfunc(ModbusRTU::fnUnknown),
dev(0),offset(0),mtrType(MTR::mtUnknown), id(0),dev(0),mtrType(MTR::mtUnknown),
q_num(0),q_count(1),sm_init(false),mb_init(false) q_num(0),q_count(1),sm_init(false),mb_init(false)
{} {}
...@@ -227,11 +229,10 @@ class MBTCPMaster: ...@@ -227,11 +229,10 @@ class MBTCPMaster:
ModbusRTU::ModbusData mbreg; /*!< регистр */ ModbusRTU::ModbusData mbreg; /*!< регистр */
ModbusRTU::SlaveFunctionCode mbfunc; /*!< функция для чтения/записи */ ModbusRTU::SlaveFunctionCode mbfunc; /*!< функция для чтения/записи */
PList slst; PList slst;
RegID id;
RTUDevice* dev; RTUDevice* dev;
int offset;
// only for MTR // only for MTR
MTR::MTRType mtrType; /*!< тип регистра (согласно спецификации на MTR) */ MTR::MTRType mtrType; /*!< тип регистра (согласно спецификации на MTR) */
...@@ -242,8 +243,8 @@ class MBTCPMaster: ...@@ -242,8 +243,8 @@ class MBTCPMaster:
RegMap::iterator rit; RegMap::iterator rit;
// начальная инициалиазция // начальная инициалиазция
bool sm_init; /*!< что инициализировалось ли значение в SM */ bool sm_init; /*!< инициализировалось ли значение в SM */
bool mb_init; /*!< требуется или нет */ bool mb_init; /*!< инициализировалось ли в обмене */
}; };
friend std::ostream& operator<<( std::ostream& os, RegInfo& r ); friend std::ostream& operator<<( std::ostream& os, RegInfo& r );
...@@ -359,9 +360,9 @@ class MBTCPMaster: ...@@ -359,9 +360,9 @@ class MBTCPMaster:
void initDeviceList(); void initDeviceList();
void initOffsetList(); void initOffsetList();
static RegID genRegID( const ModbusRTU::ModbusData r, const int fn );
RTUDevice* addDev( RTUDeviceMap& dmap, ModbusRTU::ModbusAddr a, UniXML_iterator& it ); RTUDevice* addDev( RTUDeviceMap& dmap, ModbusRTU::ModbusAddr a, UniXML_iterator& it );
RegInfo* addReg( RegMap& rmap, ModbusRTU::ModbusData r, UniXML_iterator& it, RegInfo* addReg( RegMap& rmap, RegID id, ModbusRTU::ModbusData r, UniXML_iterator& it,
RTUDevice* dev, RegInfo* rcopy=0 ); RTUDevice* dev, RegInfo* rcopy=0 );
RSProperty* addProp( PList& plist, RSProperty& p ); RSProperty* addProp( PList& plist, RSProperty& p );
......
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