Commit f47ec246 authored by Pavel Vaynerman's avatar Pavel Vaynerman

01,02,05,0F

parent 5598a5d2
#!/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 ../../conf/test.xml test.xml
......@@ -108,32 +108,18 @@ ModbusRTU::mbErrCode MBSlave::readCoilStatus( ReadCoilMessage& query,
d.b[4] = 1;
d.b[6] = 1;
if( query.count <= 1 )
{
if( replyVal )
reply.addData(replyVal);
else
reply.addData(d);
return ModbusRTU::erNoError;
}
// :
int num=0; //
ModbusData reg = query.start;
for( ; num<query.count; num++, reg++ )
int bcnt = query.count / ModbusRTU::BitsPerByte;
if( (query.count % ModbusRTU::BitsPerByte) > 0 )
bcnt++;
for( int i=0; i<bcnt; i++ )
{
if( replyVal )
reply.addData(replyVal);
else
reply.addData(d);
}
// , ۣ
// ...
if( reply.bcnt < query.count )
{
cerr << "(readCoilStatus): . "
<< " " << query.count << " " << reply.bcnt << endl;
}
return ModbusRTU::erNoError;
}
......@@ -149,32 +135,16 @@ ModbusRTU::mbErrCode MBSlave::readInputStatus( ReadInputStatusMessage& query,
d.b[3] = 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 )
reply.addData(replyVal);
else
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;
......
......@@ -78,65 +78,60 @@
</consumers>
</item>
<item id="465001" name="HC_in" textname="HC_in"
<item id="1" name="HC_in" textname="HC_in"
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>
</item>
<item id="465002" name="HC_out" textname="HC_out"
iotype="DO" character="Info"
rs="1" mbtype="rtu" mbaddr="0x02" mbreg="0x3000" mbfunc="0x06">
<item id="2" name="HC_out" textname="HC_out"
iotype="DI" character="Info"
rs="2" mbtype="rtu" mbaddr="0x02" mbreg="0x3001" mbfunc="0x02">
<consumers>
</consumers>
</item>
<item id="465003" name="connect" textname="connect"
iotype="DI" character="Info" default="1">
<consumers>
</consumers>
</item>
<item id="465004" name="connect_signal" textname="connect_signal"
iotype="AI" character="Info">
<consumers>
</consumers>
</item>
<item id="000001" name="test1" textname="test1"
iotype="AI" character="Info" default="1">
<consumers>
</consumers>
<item id="3" name="HC_in" textname="HC_in"
iotype="DI" character="Info"
rs="2" mbtype="rtu" mbaddr="0x02" mbreg="0x3000" mbfunc="0x02">
<consumers>
</consumers>
</item>
<item id="000002" name="test2" textname="test2"
iotype="AI" character="Info">
<consumers>
</consumers>
<item id="4" name="HC_out" textname="HC_out"
iotype="DO" character="Info"
rs="2" mbtype="rtu" mbaddr="0x02" mbreg="0x301" mbfunc="0x05">
<consumers>
</consumers>
</item>
<item id="000003" name="test3" textname="test3"
iotype="AI" character="Info">
<consumers>
</consumers>
<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>
</item>
<item id="000004" name="test4" textname="test4"
iotype="DI" character="Info">
<consumers>
</consumers>
<item id="6" name="HC_out" textname="HC_out"
iotype="DI" character="Info"
rs="2" mbtype="rtu" mbaddr="0x02" mbreg="0x304" mbfunc="0x05">
<consumers>
</consumers>
</item>
<item id="000005" name="EU_Mode_AS" textname=" "
iotype="AI" character="Info" default="10">
<item id="465003" name="connect" textname="connect"
iotype="DI" character="Info" default="1">
<consumers>
</consumers>
</item>
<item id="000006" name="No_Signal_S" textname=" "
iotype="DI" character="Info">
<item id="465004" name="connect_signal" textname="connect_signal"
iotype="AI" character="Info">
<consumers>
</consumers>
</item>
<!-- //************ ****************************- -->
......
......@@ -378,8 +378,17 @@ bool RTUExchange::pollRTU( RTUDevice* dev, RegMap::iterator& it )
case ModbusRTU::fnReadInputStatus:
{
ModbusRTU::ReadInputStatusRetMessage ret = mb->read02(dev->mbaddr,p->mbreg+p->offset,p->q_count);
for( int i=0; i<p->q_count; i++,it++ )
it->second->mbval = ret.data[i];
int m=0;
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--;
}
break;
......@@ -387,8 +396,17 @@ bool RTUExchange::pollRTU( RTUDevice* dev, RegMap::iterator& it )
case ModbusRTU::fnReadCoilStatus:
{
ModbusRTU::ReadCoilRetMessage ret = mb->read01(dev->mbaddr,p->mbreg+p->offset,p->q_count);
for( int i=0; i<p->q_count; i++,it++ )
it->second->mbval = ret.data[i];
int m = 0;
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--;
}
break;
......@@ -398,7 +416,7 @@ bool RTUExchange::pollRTU( RTUDevice* dev, RegMap::iterator& it )
if( p->q_count != 1 )
{
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;
}
ModbusRTU::WriteSingleOutputRetMessage ret = mb->write06(dev->mbaddr,p->mbreg+p->offset,p->mbval);
......@@ -414,6 +432,36 @@ bool RTUExchange::pollRTU( RTUDevice* dev, RegMap::iterator& it )
ModbusRTU::WriteOutputRetMessage ret = mb->write10(msg);
}
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:
{
......@@ -1543,6 +1591,16 @@ void RTUExchange::rtuQueryOptimization( RTUDeviceMap& m )
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() )
break;
......@@ -1557,9 +1615,7 @@ void RTUExchange::updateRTU( RegMap::iterator& rit )
RegInfo* r(rit->second);
using namespace ModbusRTU;
bool save = false;
if( r->mbfunc == fnWriteOutputRegisters || r->mbfunc == fnWriteOutputSingleRegister )
save = true;
bool save = isWriteFunction( r->mbfunc );
// if( !force_out_up && save )
// return;
......@@ -1574,10 +1630,9 @@ void RTUExchange::updateRSProperty( RSProperty* p, bool write_only )
using namespace ModbusRTU;
RegInfo* r(p->reg->rit->second);
bool save = false;
if( r->mbfunc == fnWriteOutputRegisters || r->mbfunc == fnWriteOutputSingleRegister )
save = true;
else if( write_only )
bool save = isWriteFunction( r->mbfunc );
if( !save && write_only )
return;
try
......@@ -1613,7 +1668,6 @@ void RTUExchange::updateRSProperty( RSProperty* p, bool write_only )
dlog[Debug::CRIT] << myname << "(updateRSProperty): IGNORE item: rnum=" << p->rnum
<< " > 1 ?!! for id=" << p->si.id << endl;
return;
}
else if( p->vType == VTypes::vtByte )
......@@ -1717,9 +1771,7 @@ void RTUExchange::updateMTR( RegMap::iterator& rit )
{
RegInfo* r(rit->second);
using namespace ModbusRTU;
bool save = false;
if( r->mbfunc == fnWriteOutputRegisters || r->mbfunc == fnWriteOutputSingleRegister )
save = true;
bool save = isWriteFunction( r->mbfunc );
{
for( PList::iterator it=r->slst.begin(); it!=r->slst.end(); ++it )
......@@ -1918,7 +1970,7 @@ void RTUExchange::updateRTU188( RegMap::iterator& it )
using namespace ModbusRTU;
// bool save = false;
if( r->mbfunc == fnWriteOutputRegisters || r->mbfunc == fnWriteOutputSingleRegister )
if( isWriteFunction(r->mbfunc) )
{
// save = true;
cerr << myname << "(updateRTU188): write reg(" << dat2str(r->mbreg) << ") to RTU188 NOT YET!!!" << endl;
......
#!/bin/sh
uniset-start.sh -f ./uniset-rtuexchange --confile test.xml \
--rs-dev /dev/ttyS0 \
--rs-dev /dev/cbsideA0 \
--rs-name RSExchange \
--rs-speed 38400 \
--rs-filter-field rs \
--rs-filter-value 3 \
--rs-filter-value 2 \
--dlog-add-levels info,crit,warn \
--rs-force 0 \
--rs-force-out 0 \
......
......@@ -3,6 +3,6 @@
ulimit -Sc 1000000000000
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
......@@ -74,6 +74,8 @@ namespace ModbusRTU
// -------------------------------------------------------------------------
float dat2f( const ModbusData dat1, const ModbusData dat2 );
// -------------------------------------------------------------------------
bool isWriteFunction( SlaveFunctionCode c );
// -------------------------------------------------------------------------
/*! */
struct ModbusHeader
{
......@@ -240,18 +242,18 @@ namespace ModbusRTU
bool setBit( unsigned char dnum, unsigned char bnum, bool state );
/*! .
* \param dnum -
* \param bnum -
* \param d -
* \return TRUE -
* \return FALSE -
*/
bool getData( unsigned char dnum, DataBits& d );
bool getData( unsigned char bnum, DataBits& d );
/*! */
void clear();
/*! */
inline bool isFull()
inline bool isFull()
{
return ( bcnt >= MAXLENPACKET );
}
......@@ -259,7 +261,7 @@ namespace ModbusRTU
/*! ( ) */
int szData();
/*! */
/*! */
ModbusMessage transport_msg();
};
......
......@@ -155,6 +155,17 @@ ModbusCRC ModbusRTU::checkCRC( ModbusByte* buf, int len )
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 )
{
// '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