Commit f47ec246 authored by Pavel Vaynerman's avatar Pavel Vaynerman

01,02,05,0F

parent 5598a5d2
#!/bin/sh #!/bin/sh
#
ln -s -f admin.sh start
ln -s -f admin.sh exist
ln -s -f admin.sh finish
ln -s -f admin.sh foldUp
ln -s -f admin.sh info
ln -s -f admin.sh alarm
ln -s -f admin.sh create
#ln -s -f admin.sh setState
#ln -s -f admin.sh dbcreate
#ln -s -f admin.sh statistic
#ln -s -f admin.sh database
ln -s -f admin.sh logrotate
ln -s -f admin.sh omap
ln -s -f admin.sh msgmap
ln -s -f admin.sh anotify
ln -s -f admin.sh dnotify
ln -s -f admin.sh saveValue
ln -s -f admin.sh saveState
ln -s -f admin.sh setValue
ln -s -f admin.sh setState
ln -s -f admin.sh getValue
ln -s -f admin.sh getState
ln -s -f admin.sh getRawValue
ln -s -f admin.sh getCalibrate
ln -s -f admin.sh help
ln -s -f admin.sh oinfo
ln -s -f /usr/bin/uniset-stop.sh stop.sh ln -s -f /usr/bin/uniset-stop.sh stop.sh
ln -s -f ../../conf/test.xml test.xml ln -s -f ../../conf/test.xml test.xml
...@@ -108,32 +108,18 @@ ModbusRTU::mbErrCode MBSlave::readCoilStatus( ReadCoilMessage& query, ...@@ -108,32 +108,18 @@ ModbusRTU::mbErrCode MBSlave::readCoilStatus( ReadCoilMessage& query,
d.b[4] = 1; d.b[4] = 1;
d.b[6] = 1; d.b[6] = 1;
if( query.count <= 1 )
{
if( replyVal )
reply.addData(replyVal);
else
reply.addData(d);
return ModbusRTU::erNoError;
}
// : // :
int num=0; // int bcnt = query.count / ModbusRTU::BitsPerByte;
ModbusData reg = query.start; if( (query.count % ModbusRTU::BitsPerByte) > 0 )
for( ; num<query.count; num++, reg++ ) bcnt++;
for( int i=0; i<bcnt; i++ )
{ {
if( replyVal ) if( replyVal )
reply.addData(replyVal); reply.addData(replyVal);
else else
reply.addData(d); reply.addData(d);
} }
// , ۣ
// ...
if( reply.bcnt < query.count )
{
cerr << "(readCoilStatus): . "
<< " " << query.count << " " << reply.bcnt << endl;
}
return ModbusRTU::erNoError; return ModbusRTU::erNoError;
} }
...@@ -149,32 +135,16 @@ ModbusRTU::mbErrCode MBSlave::readInputStatus( ReadInputStatusMessage& query, ...@@ -149,32 +135,16 @@ ModbusRTU::mbErrCode MBSlave::readInputStatus( ReadInputStatusMessage& query,
d.b[3] = 1; d.b[3] = 1;
d.b[7] = 1; d.b[7] = 1;
int bcnt = query.count / ModbusRTU::BitsPerByte;
if( (query.count % ModbusRTU::BitsPerByte) > 0 )
bcnt++;
if( query.count <= 1 ) for( int i=0; i<bcnt; i++ )
{ {
if( replyVal ) if( replyVal )
reply.addData(replyVal); reply.addData(replyVal);
else else
reply.addData(d); reply.addData(d);
return ModbusRTU::erNoError;
}
// :
int num=0; //
ModbusData reg = query.start;
for( ; num<query.count; num++, reg++ )
{
if( replyVal )
reply.addData(replyVal);
else
reply.addData(d);
}
// , ۣ
// ...
if( reply.bcnt < query.count )
{
cerr << "(readInputStatus): . "
<< " " << query.count << " " << reply.bcnt << endl;
} }
return ModbusRTU::erNoError; return ModbusRTU::erNoError;
......
...@@ -78,66 +78,61 @@ ...@@ -78,66 +78,61 @@
</consumers> </consumers>
</item> </item>
<item id="465001" name="HC_in" textname="HC_in" <item id="1" name="HC_in" textname="HC_in"
iotype="DI" character="Info" iotype="DI" character="Info"
rs="1" mbtype="rtu" mbaddr="0x02" mbreg="0x3050" mbfunc="0x03"> rs="2" mbtype="rtu" mbaddr="0x02" mbreg="0x3000" mbfunc="0x02">
<consumers> <consumers>
</consumers> </consumers>
</item> </item>
<item id="465002" name="HC_out" textname="HC_out" <item id="2" name="HC_out" textname="HC_out"
iotype="DO" character="Info" iotype="DI" character="Info"
rs="1" mbtype="rtu" mbaddr="0x02" mbreg="0x3000" mbfunc="0x06"> rs="2" mbtype="rtu" mbaddr="0x02" mbreg="0x3001" mbfunc="0x02">
<consumers> <consumers>
</consumers> </consumers>
</item> </item>
<item id="465003" name="connect" textname="connect" <item id="3" name="HC_in" textname="HC_in"
iotype="DI" character="Info" default="1"> iotype="DI" character="Info"
<consumers> rs="2" mbtype="rtu" mbaddr="0x02" mbreg="0x3000" mbfunc="0x02">
</consumers>
</item>
<item id="465004" name="connect_signal" textname="connect_signal"
iotype="AI" character="Info">
<consumers> <consumers>
</consumers> </consumers>
</item> </item>
<item id="000001" name="test1" textname="test1" <item id="4" name="HC_out" textname="HC_out"
iotype="AI" character="Info" default="1"> iotype="DO" character="Info"
<consumers> rs="2" mbtype="rtu" mbaddr="0x02" mbreg="0x301" mbfunc="0x05">
</consumers>
</item>
<item id="000002" name="test2" textname="test2"
iotype="AI" character="Info">
<consumers> <consumers>
</consumers> </consumers>
</item> </item>
<item id="000003" name="test3" textname="test3"
iotype="AI" character="Info"> <item id="5" name="HC_in" textname="HC_in"
iotype="DI" character="Info"
rs="2" mbtype="rtu" mbaddr="0x02" mbreg="0x302" mbfunc="0x05">
<consumers> <consumers>
</consumers> </consumers>
</item> </item>
<item id="000004" name="test4" textname="test4" <item id="6" name="HC_out" textname="HC_out"
iotype="DI" character="Info"> iotype="DI" character="Info"
rs="2" mbtype="rtu" mbaddr="0x02" mbreg="0x304" mbfunc="0x05">
<consumers> <consumers>
</consumers> </consumers>
</item> </item>
<item id="000005" name="EU_Mode_AS" textname=" " <item id="465003" name="connect" textname="connect"
iotype="AI" character="Info" default="10"> iotype="DI" character="Info" default="1">
<consumers> <consumers>
</consumers> </consumers>
</item> </item>
<item id="465004" name="connect_signal" textname="connect_signal"
<item id="000006" name="No_Signal_S" textname=" " iotype="AI" character="Info">
iotype="DI" character="Info">
<consumers> <consumers>
</consumers> </consumers>
</item> </item>
<!-- //************ ****************************- --> <!-- //************ ****************************- -->
<item id="101" name="valve_K1-1_in" textname="valve_K1-1_in" <item id="101" name="valve_K1-1_in" textname="valve_K1-1_in"
......
...@@ -378,8 +378,17 @@ bool RTUExchange::pollRTU( RTUDevice* dev, RegMap::iterator& it ) ...@@ -378,8 +378,17 @@ bool RTUExchange::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->offset,p->q_count);
for( int i=0; i<p->q_count; i++,it++ ) int m=0;
it->second->mbval = ret.data[i]; for( int i=0; i<ret.bcnt; i++ )
{
ModbusRTU::DataBits b(ret.data[i]);
for( int k=0;k<ModbusRTU::BitsPerByte && m<p->q_count; k++,it++,m++ )
{
// cerr << "(read02): save mbreg=" << ModbusRTU::dat2str(it->second->mbreg)
// << " val=" << (int)(b[k]) << endl;
it->second->mbval = b[k];
}
}
it--; it--;
} }
break; break;
...@@ -387,8 +396,17 @@ bool RTUExchange::pollRTU( RTUDevice* dev, RegMap::iterator& it ) ...@@ -387,8 +396,17 @@ bool RTUExchange::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->offset,p->q_count);
for( int i=0; i<p->q_count; i++,it++ ) int m = 0;
it->second->mbval = ret.data[i]; for( int i=0; i<ret.bcnt; i++ )
{
ModbusRTU::DataBits b(ret.data[i]);
for( int k=0;k<ModbusRTU::BitsPerByte && m<p->q_count; k++,it++,m++ )
{
// cerr << "(read01): save mbreg=" << ModbusRTU::dat2str(it->second->mbreg)
// << " val=" << (int)(b[k]) << endl;
it->second->mbval = b[k] ? 1 : 0;
}
}
it--; it--;
} }
break; break;
...@@ -398,7 +416,7 @@ bool RTUExchange::pollRTU( RTUDevice* dev, RegMap::iterator& it ) ...@@ -398,7 +416,7 @@ bool RTUExchange::pollRTU( RTUDevice* dev, RegMap::iterator& it )
if( p->q_count != 1 ) if( p->q_count != 1 )
{ {
dlog[Debug::CRIT] << myname << "(pollRTU): mbreg=" << ModbusRTU::dat2str(p->mbreg) dlog[Debug::CRIT] << myname << "(pollRTU): mbreg=" << ModbusRTU::dat2str(p->mbreg)
<< " IGNORE WRITE SINGLE REGISTER q_count=" << p->q_count << " ..." << endl; << " IGNORE WRITE SINGLE REGISTER (0x06) q_count=" << p->q_count << " ..." << endl;
return false; return false;
} }
ModbusRTU::WriteSingleOutputRetMessage ret = mb->write06(dev->mbaddr,p->mbreg+p->offset,p->mbval); ModbusRTU::WriteSingleOutputRetMessage ret = mb->write06(dev->mbaddr,p->mbreg+p->offset,p->mbval);
...@@ -415,6 +433,36 @@ bool RTUExchange::pollRTU( RTUDevice* dev, RegMap::iterator& it ) ...@@ -415,6 +433,36 @@ bool RTUExchange::pollRTU( RTUDevice* dev, RegMap::iterator& it )
} }
break; break;
case ModbusRTU::fnForceSingleCoil:
{
if( p->q_count != 1 )
{
dlog[Debug::CRIT] << myname << "(pollRTU): mbreg=" << ModbusRTU::dat2str(p->mbreg)
<< " IGNORE FORCE SINGLE COIL (0x05) q_count=" << p->q_count << " ..." << endl;
return false;
}
ModbusRTU::ForceSingleCoilRetMessage ret = mb->write05(dev->mbaddr,p->mbreg+p->offset,p->mbval);
}
break;
case ModbusRTU::fnForceMultipleCoils:
{
ModbusRTU::ForceCoilsMessage msg(dev->mbaddr,p->mbreg+p->offset);
for( int i=0; i<p->q_count; i++ )
{
ModbusRTU::DataBits16 d;
for( int k=0; k<ModbusRTU::BitsPerData && i<p->q_count; k++,i++,it++ )
d.set(k, (it->second->mbval ? true : false) );
msg.addData(d);
}
it--;
ModbusRTU::ForceCoilsRetMessage ret = mb->write0F(msg);
}
break;
default: default:
{ {
if( dlog.debugging(Debug::INFO) ) if( dlog.debugging(Debug::INFO) )
...@@ -1543,6 +1591,16 @@ void RTUExchange::rtuQueryOptimization( RTUDeviceMap& m ) ...@@ -1543,6 +1591,16 @@ void RTUExchange::rtuQueryOptimization( RTUDeviceMap& m )
beg->second->mbfunc = ModbusRTU::fnWriteOutputRegisters; beg->second->mbfunc = ModbusRTU::fnWriteOutputRegisters;
} }
else if( beg->second->q_count>1 && beg->second->mbfunc==ModbusRTU::fnForceSingleCoil )
{
dlog[Debug::WARN] << myname << "(rtuQueryOptimization): "
<< " optimization change func=" << ModbusRTU::fnForceSingleCoil
<< " <--> func=" << ModbusRTU::fnForceMultipleCoils
<< " for mbaddr=" << ModbusRTU::addr2str(d->mbaddr)
<< " mbreg=" << ModbusRTU::dat2str(beg->second->mbreg);
beg->second->mbfunc = ModbusRTU::fnForceMultipleCoils;
}
if( it==d->regmap.end() ) if( it==d->regmap.end() )
break; break;
...@@ -1557,9 +1615,7 @@ void RTUExchange::updateRTU( RegMap::iterator& rit ) ...@@ -1557,9 +1615,7 @@ void RTUExchange::updateRTU( RegMap::iterator& rit )
RegInfo* r(rit->second); RegInfo* r(rit->second);
using namespace ModbusRTU; using namespace ModbusRTU;
bool save = false; bool save = isWriteFunction( r->mbfunc );
if( r->mbfunc == fnWriteOutputRegisters || r->mbfunc == fnWriteOutputSingleRegister )
save = true;
// if( !force_out_up && save ) // if( !force_out_up && save )
// return; // return;
...@@ -1574,10 +1630,9 @@ void RTUExchange::updateRSProperty( RSProperty* p, bool write_only ) ...@@ -1574,10 +1630,9 @@ void RTUExchange::updateRSProperty( RSProperty* p, bool write_only )
using namespace ModbusRTU; using namespace ModbusRTU;
RegInfo* r(p->reg->rit->second); RegInfo* r(p->reg->rit->second);
bool save = false; bool save = isWriteFunction( r->mbfunc );
if( r->mbfunc == fnWriteOutputRegisters || r->mbfunc == fnWriteOutputSingleRegister )
save = true; if( !save && write_only )
else if( write_only )
return; return;
try try
...@@ -1613,7 +1668,6 @@ void RTUExchange::updateRSProperty( RSProperty* p, bool write_only ) ...@@ -1613,7 +1668,6 @@ void RTUExchange::updateRSProperty( RSProperty* p, bool write_only )
dlog[Debug::CRIT] << myname << "(updateRSProperty): IGNORE item: rnum=" << p->rnum dlog[Debug::CRIT] << myname << "(updateRSProperty): IGNORE item: rnum=" << p->rnum
<< " > 1 ?!! for id=" << p->si.id << endl; << " > 1 ?!! for id=" << p->si.id << endl;
return; return;
} }
else if( p->vType == VTypes::vtByte ) else if( p->vType == VTypes::vtByte )
...@@ -1717,9 +1771,7 @@ void RTUExchange::updateMTR( RegMap::iterator& rit ) ...@@ -1717,9 +1771,7 @@ void RTUExchange::updateMTR( RegMap::iterator& rit )
{ {
RegInfo* r(rit->second); RegInfo* r(rit->second);
using namespace ModbusRTU; using namespace ModbusRTU;
bool save = false; bool save = isWriteFunction( r->mbfunc );
if( r->mbfunc == fnWriteOutputRegisters || r->mbfunc == fnWriteOutputSingleRegister )
save = true;
{ {
for( PList::iterator it=r->slst.begin(); it!=r->slst.end(); ++it ) for( PList::iterator it=r->slst.begin(); it!=r->slst.end(); ++it )
...@@ -1918,7 +1970,7 @@ void RTUExchange::updateRTU188( RegMap::iterator& it ) ...@@ -1918,7 +1970,7 @@ void RTUExchange::updateRTU188( RegMap::iterator& it )
using namespace ModbusRTU; using namespace ModbusRTU;
// bool save = false; // bool save = false;
if( r->mbfunc == fnWriteOutputRegisters || r->mbfunc == fnWriteOutputSingleRegister ) if( isWriteFunction(r->mbfunc) )
{ {
// save = true; // save = true;
cerr << myname << "(updateRTU188): write reg(" << dat2str(r->mbreg) << ") to RTU188 NOT YET!!!" << endl; cerr << myname << "(updateRTU188): write reg(" << dat2str(r->mbreg) << ") to RTU188 NOT YET!!!" << endl;
......
#!/bin/sh #!/bin/sh
uniset-start.sh -f ./uniset-rtuexchange --confile test.xml \ uniset-start.sh -f ./uniset-rtuexchange --confile test.xml \
--rs-dev /dev/ttyS0 \ --rs-dev /dev/cbsideA0 \
--rs-name RSExchange \ --rs-name RSExchange \
--rs-speed 38400 \ --rs-speed 38400 \
--rs-filter-field rs \ --rs-filter-field rs \
--rs-filter-value 3 \ --rs-filter-value 2 \
--dlog-add-levels info,crit,warn \ --dlog-add-levels info,crit,warn \
--rs-force 0 \ --rs-force 0 \
--rs-force-out 0 \ --rs-force-out 0 \
......
...@@ -3,6 +3,6 @@ ...@@ -3,6 +3,6 @@
ulimit -Sc 1000000000000 ulimit -Sc 1000000000000
uniset-start.sh -f ./uniset-smemory --smemory-id SharedMemory1 \ uniset-start.sh -f ./uniset-smemory --smemory-id SharedMemory1 \
--confile test.xml --datfile /etc/AEU/configure.xml \ --confile test.xml --datfile test.xml \
--unideb-add-levels info,crit,warn,level9,system --unideb-add-levels info,crit,warn,level9,system
...@@ -74,6 +74,8 @@ namespace ModbusRTU ...@@ -74,6 +74,8 @@ namespace ModbusRTU
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
float dat2f( const ModbusData dat1, const ModbusData dat2 ); float dat2f( const ModbusData dat1, const ModbusData dat2 );
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
bool isWriteFunction( SlaveFunctionCode c );
// -------------------------------------------------------------------------
/*! */ /*! */
struct ModbusHeader struct ModbusHeader
{ {
...@@ -240,12 +242,12 @@ namespace ModbusRTU ...@@ -240,12 +242,12 @@ namespace ModbusRTU
bool setBit( unsigned char dnum, unsigned char bnum, bool state ); bool setBit( unsigned char dnum, unsigned char bnum, bool state );
/*! . /*! .
* \param dnum - * \param bnum -
* \param d - * \param d -
* \return TRUE - * \return TRUE -
* \return FALSE - * \return FALSE -
*/ */
bool getData( unsigned char dnum, DataBits& d ); bool getData( unsigned char bnum, DataBits& d );
/*! */ /*! */
void clear(); void clear();
......
...@@ -155,6 +155,17 @@ ModbusCRC ModbusRTU::checkCRC( ModbusByte* buf, int len ) ...@@ -155,6 +155,17 @@ ModbusCRC ModbusRTU::checkCRC( ModbusByte* buf, int len )
return crc; return crc;
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
bool ModbusRTU::isWriteFunction( SlaveFunctionCode c )
{
if( c == fnWriteOutputRegisters ||
c == fnWriteOutputSingleRegister ||
c == fnForceSingleCoil ||
c == fnForceMultipleCoils )
return true;
return false;
}
// -------------------------------------------------------------------------
std::ostream& ModbusRTU::mbPrintMessage( std::ostream& os, ModbusByte* m, int len ) std::ostream& ModbusRTU::mbPrintMessage( std::ostream& os, ModbusByte* m, int len )
{ {
// 'os' // 'os'
......
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