Commit a2756ef7 authored by Pavel Vainerman's avatar Pavel Vainerman

testing

parent 2cebcea4
...@@ -146,19 +146,19 @@ int main( int argc, char **argv ) ...@@ -146,19 +146,19 @@ int main( int argc, char **argv )
} }
break; break;
case 'i': case 'i':
iaddr = string(optarg); iaddr = string(optarg);
break; break;
case 'p': case 'p':
port = atoi(optarg); port = atoi(optarg);
break; break;
case 't': case 't':
tout = atoi(optarg); tout = atoi(optarg);
break; break;
case 'a': case 'a':
myaddr = ModbusRTU::str2mbAddr(optarg); myaddr = ModbusRTU::str2mbAddr(optarg);
break; break;
...@@ -178,198 +178,201 @@ int main( int argc, char **argv ) ...@@ -178,198 +178,201 @@ int main( int argc, char **argv )
cout << "(init): ip=" << iaddr << ":" << port cout << "(init): ip=" << iaddr << ":" << port
<< " myaddr=" << ModbusRTU::addr2str(myaddr) << " myaddr=" << ModbusRTU::addr2str(myaddr)
<< " timeout=" << tout << " msec " << " timeout=" << tout << " msec "
<< endl; << endl;
}
ModbusTCPMaster mb;
if( verb )
dlog.addLevel( Debug::type(Debug::CRIT | Debug::WARN | Debug::INFO) ); dlog.addLevel( Debug::type(Debug::CRIT | Debug::WARN | Debug::INFO) );
}
ModbusTCPMaster mb;
mb.setLog(dlog); mb.setLog(dlog);
ost::Thread::setException(ost::Thread::throwException); // ost::Thread::setException(ost::Thread::throwException);
ost::InetAddress ia(iaddr.c_str()); ost::InetAddress ia(iaddr.c_str());
mb.connect(ia,port);
mb.setTimeout(tout); mb.setTimeout(tout);
mb.connect(ia,port);
while( 1)
switch(cmd)
{ {
case cmdRead01:
switch(cmd)
{ {
if( verb ) case cmdRead01:
{ {
cout << "read01: slaveaddr=" << ModbusRTU::addr2str(slaveaddr) if( verb )
<< " reg=" << ModbusRTU::dat2str(reg) {
<< " count=" << ModbusRTU::dat2str(count) cout << "read01: slaveaddr=" << ModbusRTU::addr2str(slaveaddr)
<< endl; << " reg=" << ModbusRTU::dat2str(reg)
} << " count=" << ModbusRTU::dat2str(count)
<< endl;
}
ModbusRTU::ReadCoilRetMessage ret = mb.read01(slaveaddr,reg,count); ModbusRTU::ReadCoilRetMessage ret = mb.read01(slaveaddr,reg,count);
if( verb ) if( verb )
cout << "(reply): " << ret << endl; cout << "(reply): " << ret << endl;
cout << "(reply): count=" << (int)ret.bcnt << endl; cout << "(reply): count=" << (int)ret.bcnt << endl;
for( int i=0; i<ret.bcnt; i++ ) for( int i=0; i<ret.bcnt; i++ )
{ {
ModbusRTU::DataBits b(ret.data[i]); ModbusRTU::DataBits b(ret.data[i]);
cout << i <<": (" << ModbusRTU::dat2str( reg + i ) << ") = (" cout << i <<": (" << ModbusRTU::dat2str( reg + i ) << ") = ("
<< ModbusRTU::b2str(ret.data[i]) << ") " << b << endl; << ModbusRTU::b2str(ret.data[i]) << ") " << b << endl;
}
} }
} break;
break;
case cmdRead02: case cmdRead02:
{
if( verb )
{ {
cout << "read02: slaveaddr=" << ModbusRTU::addr2str(slaveaddr) if( verb )
{
cout << "read02: slaveaddr=" << ModbusRTU::addr2str(slaveaddr)
<< " reg=" << ModbusRTU::dat2str(reg) << " reg=" << ModbusRTU::dat2str(reg)
<< " count=" << ModbusRTU::dat2str(count) << " count=" << ModbusRTU::dat2str(count)
<< endl; << endl;
} }
ModbusRTU::ReadInputStatusRetMessage ret = mb.read02(slaveaddr,reg,count); ModbusRTU::ReadInputStatusRetMessage ret = mb.read02(slaveaddr,reg,count);
if( verb ) if( verb )
cout << "(reply): " << ret << endl; cout << "(reply): " << ret << endl;
cout << "(reply): count=" << (int)ret.bcnt << endl; cout << "(reply): count=" << (int)ret.bcnt << endl;
for( int i=0; i<ret.bcnt; i++ ) for( int i=0; i<ret.bcnt; i++ )
{ {
ModbusRTU::DataBits b(ret.data[i]); ModbusRTU::DataBits b(ret.data[i]);
cout << i <<": (" << ModbusRTU::dat2str( reg + i ) << ") = (" cout << i <<": (" << ModbusRTU::dat2str( reg + i ) << ") = ("
<< ModbusRTU::b2str(ret.data[i]) << ") " << b << endl; << ModbusRTU::b2str(ret.data[i]) << ") " << b << endl;
}
} }
} break;
break;
case cmdRead03: case cmdRead03:
{
if( verb )
{ {
cout << "read03: slaveaddr=" << ModbusRTU::addr2str(slaveaddr) if( verb )
<< " reg=" << ModbusRTU::dat2str(reg) {
<< " count=" << ModbusRTU::dat2str(count) cout << "read03: slaveaddr=" << ModbusRTU::addr2str(slaveaddr)
<< endl; << " reg=" << ModbusRTU::dat2str(reg)
} << " count=" << ModbusRTU::dat2str(count)
<< endl;
}
ModbusRTU::ReadOutputRetMessage ret = mb.read03(slaveaddr,reg,count); ModbusRTU::ReadOutputRetMessage ret = mb.read03(slaveaddr,reg,count);
if( verb ) if( verb )
cout << "(reply): " << ret << endl; cout << "(reply): " << ret << endl;
cout << "(reply): count=" << ModbusRTU::dat2str(ret.count) << endl; cout << "(reply): count=" << ModbusRTU::dat2str(ret.count) << endl;
for( int i=0; i<ret.count; i++ ) for( int i=0; i<ret.count; i++ )
{ {
cout << i <<": (" << ModbusRTU::dat2str( reg + i ) << ") = " << (int)(ret.data[i]) cout << i <<": (" << ModbusRTU::dat2str( reg + i ) << ") = " << (int)(ret.data[i])
<< " (" << " ("
<< ModbusRTU::dat2str(ret.data[i]) << ModbusRTU::dat2str(ret.data[i])
<< ")" << ")"
<< endl; << endl;
}
} }
} break;
break;
case cmdRead04: case cmdRead04:
{
if( verb )
{ {
cout << "read04: slaveaddr=" << ModbusRTU::addr2str(slaveaddr) if( verb )
<< " reg=" << ModbusRTU::dat2str(reg) {
<< " count=" << ModbusRTU::dat2str(count) cout << "read04: slaveaddr=" << ModbusRTU::addr2str(slaveaddr)
<< endl; << " reg=" << ModbusRTU::dat2str(reg)
} << " count=" << ModbusRTU::dat2str(count)
<< endl;
}
ModbusRTU::ReadInputRetMessage ret = mb.read04(slaveaddr,reg,count); ModbusRTU::ReadInputRetMessage ret = mb.read04(slaveaddr,reg,count);
if( verb ) if( verb )
cout << "(reply): " << ret << endl; cout << "(reply): " << ret << endl;
cout << "(reply): count=" << ModbusRTU::dat2str(ret.count) << endl; cout << "(reply): count=" << ModbusRTU::dat2str(ret.count) << endl;
for( int i=0; i<ret.count; i++ ) for( int i=0; i<ret.count; i++ )
{ {
cout << i <<": (" << ModbusRTU::dat2str( reg + i ) << ") = " << (int)(ret.data[i]) cout << i <<": (" << ModbusRTU::dat2str( reg + i ) << ") = " << (int)(ret.data[i])
<< " (" << " ("
<< ModbusRTU::dat2str(ret.data[i]) << ModbusRTU::dat2str(ret.data[i])
<< ")" << ")"
<< endl; << endl;
}
} }
} break;
break;
case cmdWrite05: case cmdWrite05:
{
if( verb )
{ {
cout << "write05: slaveaddr=" << ModbusRTU::addr2str(slaveaddr) if( verb )
<< " reg=" << ModbusRTU::dat2str(reg) {
<< " val=" << ModbusRTU::dat2str(val) cout << "write05: slaveaddr=" << ModbusRTU::addr2str(slaveaddr)
<< endl; << " reg=" << ModbusRTU::dat2str(reg)
<< " val=" << ModbusRTU::dat2str(val)
<< endl;
}
ModbusRTU::ForceSingleCoilRetMessage ret = mb.write05(slaveaddr,reg,(bool)val);
if( verb )
cout << "(reply): " << ret << endl;
} }
break;
ModbusRTU::ForceSingleCoilRetMessage ret = mb.write05(slaveaddr,reg,(bool)val);
if( verb )
cout << "(reply): " << ret << endl;
}
break;
case cmdWrite06: case cmdWrite06:
{
if( verb )
{ {
cout << "write06: slaveaddr=" << ModbusRTU::addr2str(slaveaddr) if( verb )
<< " reg=" << ModbusRTU::dat2str(reg) {
<< " val=" << ModbusRTU::dat2str(val) cout << "write06: slaveaddr=" << ModbusRTU::addr2str(slaveaddr)
<< endl; << " reg=" << ModbusRTU::dat2str(reg)
<< " val=" << ModbusRTU::dat2str(val)
<< endl;
}
ModbusRTU::WriteSingleOutputRetMessage ret = mb.write06(slaveaddr,reg,val);
if( verb )
cout << "(reply): " << ret << endl;
} }
break;
ModbusRTU::WriteSingleOutputRetMessage ret = mb.write06(slaveaddr,reg,val);
if( verb )
cout << "(reply): " << ret << endl;
}
break;
case cmdWrite0F: case cmdWrite0F:
{
if( verb )
{ {
cout << "write0F: slaveaddr=" << ModbusRTU::addr2str(slaveaddr) if( verb )
<< " reg=" << ModbusRTU::dat2str(reg) {
<< " val=" << ModbusRTU::dat2str(val) cout << "write0F: slaveaddr=" << ModbusRTU::addr2str(slaveaddr)
<< endl; << " reg=" << ModbusRTU::dat2str(reg)
<< " val=" << ModbusRTU::dat2str(val)
<< endl;
}
ModbusRTU::ForceCoilsMessage msg(slaveaddr,reg);
ModbusRTU::DataBits16 b(val);
msg.addData(b);
ModbusRTU::ForceCoilsRetMessage ret = mb.write0F(msg);
if( verb )
cout << "(reply): " << ret << endl;
} }
break;
ModbusRTU::ForceCoilsMessage msg(slaveaddr,reg);
ModbusRTU::DataBits16 b(val);
msg.addData(b);
ModbusRTU::ForceCoilsRetMessage ret = mb.write0F(msg);
if( verb )
cout << "(reply): " << ret << endl;
}
break;
case cmdWrite10: case cmdWrite10:
{
if( verb )
{ {
cout << "write06: slaveaddr=" << ModbusRTU::addr2str(slaveaddr) if( verb )
<< " reg=" << ModbusRTU::dat2str(reg) {
<< " val=" << ModbusRTU::dat2str(val) cout << "write06: slaveaddr=" << ModbusRTU::addr2str(slaveaddr)
<< endl; << " reg=" << ModbusRTU::dat2str(reg)
<< " val=" << ModbusRTU::dat2str(val)
<< endl;
}
ModbusRTU::WriteOutputMessage msg(slaveaddr,reg);
msg.addData(val);
ModbusRTU::WriteOutputRetMessage ret = mb.write10(msg);
if( verb )
cout << "(reply): " << ret << endl;
} }
break;
ModbusRTU::WriteOutputMessage msg(slaveaddr,reg);
msg.addData(val); case cmdNOP:
ModbusRTU::WriteOutputRetMessage ret = mb.write10(msg); default:
if( verb ) cerr << "No command. Use -h for help." << endl;
cout << "(reply): " << ret << endl; return 1;
} }
break;
case cmdNOP: msleep(200);
default: } // end of while
cerr << "No command. Use -h for help." << endl;
return 1;
}
mb.disconnect(); mb.disconnect();
} }
catch( ModbusRTU::mbException& ex ) catch( ModbusRTU::mbException& ex )
......
...@@ -93,7 +93,7 @@ ...@@ -93,7 +93,7 @@
<sensors name="Sensors"> <sensors name="Sensors">
<item name="Input1_S" textname=" 1" node="" iotype="DI" priority="Medium" default="1" /> <item name="Input1_S" textname=" 1" node="" iotype="DI" priority="Medium" default="1" />
<item name="Input2_S" textname=" 2" node="" iotype="DI" priority="Medium" mbtype="rtu" mbaddr="0x31" mbfunc="0x04" mbreg="0x02" rs="1" /> <item name="Input2_S" textname=" 2" node="" iotype="DI" priority="Medium" mbtype="rtu" mbaddr="0x31" mbfunc="0x04" mbreg="0x02" rs="1" />
<item name="Input3_S" textname=" 3" node="" iotype="DI" priority="Medium" udp="1"/> <item name="Input3_S" textname=" 3" node="" iotype="DI" priority="Medium" mbtcp="1" mbaddr="0x31" mbfunc="0x04" mbreg="0x02"/>
<item name="Input4_S" textname=" 4" node="" iotype="DI" priority="Medium" udp="1"/> <item name="Input4_S" textname=" 4" node="" iotype="DI" priority="Medium" udp="1"/>
<item name="Input5_S" textname=" 5" node="" iotype="DI" priority="Medium" udp="2"/> <item name="Input5_S" textname=" 5" node="" iotype="DI" priority="Medium" udp="2"/>
<item name="Input6_S" textname=" 6" node="" iotype="DI" priority="Medium" udp="2"> <item name="Input6_S" textname=" 6" node="" iotype="DI" priority="Medium" udp="2">
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
using namespace std; using namespace std;
using namespace UniSetTypes; using namespace UniSetTypes;
using namespace UniSetExtentions; using namespace UniSetExtentions;
using namespace ModbusRTU;
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
MBMaster::MBMaster( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmId, SharedMemory* ic, MBMaster::MBMaster( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmId, SharedMemory* ic,
std::string prefix): std::string prefix):
...@@ -18,6 +19,7 @@ maxItem(0), ...@@ -18,6 +19,7 @@ maxItem(0),
mb(0), mb(0),
shm(0), shm(0),
initPause(0), initPause(0),
mbregFromID(false),
force(false), force(false),
force_out(false), force_out(false),
activated(false), activated(false),
...@@ -55,13 +57,16 @@ prefix(prefix) ...@@ -55,13 +57,16 @@ prefix(prefix)
recv_timeout = atoi(conf->getArgParam("--" + prefix + "-recv-timeout",it.getProp("recv_timeout")).c_str()); recv_timeout = atoi(conf->getArgParam("--" + prefix + "-recv-timeout",it.getProp("recv_timeout")).c_str());
if( recv_timeout <= 0 ) if( recv_timeout <= 0 )
recv_timeout = 100; recv_timeout = 2000;
string saddr = conf->getArgParam("--" + prefix + "-my-addr",it.getProp("addr")); string saddr = conf->getArgParam("--" + prefix + "-my-addr",it.getProp("addr"));
myaddr = ModbusRTU::str2mbAddr(saddr); myaddr = ModbusRTU::str2mbAddr(saddr);
if( saddr.empty() ) if( saddr.empty() )
myaddr = 0x00; myaddr = 0x00;
mbregFromID = atoi(conf->getArgParam("--" + prefix + "-reg-from-id",it.getProp("reg_from_id")).c_str());
dlog[Debug::INFO] << myname << "(init): mbregFromID=" << mbregFromID << endl;
polltime = atoi(conf->getArgParam("--" + prefix + "-polltime",it.getProp("polltime")).c_str()); polltime = atoi(conf->getArgParam("--" + prefix + "-polltime",it.getProp("polltime")).c_str());
if( !polltime ) if( !polltime )
polltime = 100; polltime = 100;
...@@ -133,6 +138,8 @@ prefix(prefix) ...@@ -133,6 +138,8 @@ prefix(prefix)
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
MBMaster::~MBMaster() MBMaster::~MBMaster()
{ {
if( mb )
mb->disconnect();
delete mb; delete mb;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
...@@ -205,6 +212,7 @@ void MBMaster::init_mb() ...@@ -205,6 +212,7 @@ void MBMaster::init_mb()
mb = new ModbusTCPMaster(); mb = new ModbusTCPMaster();
mb->connect(ia,port); mb->connect(ia,port);
mb->setTimeout(recv_timeout); mb->setTimeout(recv_timeout);
mb->setLog(dlog);
} }
catch( Exception& ex ) catch( Exception& ex )
{ {
...@@ -241,24 +249,23 @@ void MBMaster::poll() ...@@ -241,24 +249,23 @@ void MBMaster::poll()
{ {
if( it->stype == UniversalIO::AnalogInput ) if( it->stype == UniversalIO::AnalogInput )
{ {
long val = callItem(it); long val = readReg(it);
IOBase::processingAsAI( ib, val, shm, force ); IOBase::processingAsAI( ib, val, shm, force );
} }
else if( it->stype == UniversalIO::DigitalInput ) else if( it->stype == UniversalIO::DigitalInput )
{ {
bool set = callItem(it) ? true : false; bool set = readReg(it) ? true : false;
IOBase::processingAsDI( ib, set, shm, force ); IOBase::processingAsDI( ib, set, shm, force );
} }
else if( it->stype == UniversalIO::AnalogOutput ) else if( it->stype == UniversalIO::AnalogOutput )
{ {
cerr << myname << "(poll): AnalogOutput !!! (sid=" << it->si.id << ")" << endl; long val = IOBase::processingAsAO(ib,shm,force_out);
// IOBase::processingAO( &ib, val ); writeReg(it,val);
} }
else if( it->stype == UniversalIO::DigitalOutput ) else if( it->stype == UniversalIO::DigitalOutput )
{ {
// if( force_out ) long val = IOBase::processingAsDO(ib,shm,force_out) ? 1 : 0;
// it->value = shm->localGetState(it->dit,it->si.id); writeReg(it,val);
// bool set IOBase::processingAO( &ib, val );
} }
} }
catch(ModbusRTU::mbException& ex ) catch(ModbusRTU::mbException& ex )
...@@ -293,25 +300,82 @@ void MBMaster::poll() ...@@ -293,25 +300,82 @@ void MBMaster::poll()
} }
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
long MBMaster::callItem( MBMap::iterator& p ) long MBMaster::readReg( MBMap::iterator& p )
{ {
unsigned short v1=0, v2=0; try
if( p->mbfunc == ModbusRTU::fnReadInputRegisters )
{ {
ModbusRTU::ReadInputRetMessage ret = mb->read04(p->mbaddr, p->mbreg,1); if( p->mbfunc == ModbusRTU::fnReadInputRegisters )
return ret.data[0]; {
// if( dlog.debugging(Debug::LEVEL3) )
// dlog[Debug::LEVEL3] << " read from " << ModbusRTU::addr2str(p->mbaddr) << " reg=" << ModbusRTU::dat2str(p->mbreg) << endl;
cerr << " read from " << ModbusRTU::addr2str(p->mbaddr) << " reg=" << ModbusRTU::dat2str(p->mbreg) << endl;
ModbusRTU::ReadInputRetMessage ret = mb->read04(p->mbaddr,p->mbreg,1);
return ret.data[0];
}
if( p->mbfunc == ModbusRTU::fnReadOutputRegisters )
{
ModbusRTU::ReadOutputRetMessage ret = mb->read03(p->mbaddr,p->mbreg,1);
return ret.data[0];
}
cerr << myname << "(readReg): " << (int)p->mbfunc << endl;
} }
else if( p->mbfunc == ModbusRTU::fnReadOutputRegisters ) catch( ModbusRTU::mbException& ex )
{ {
ModbusRTU::ReadOutputRetMessage ret = mb->read03(p->mbaddr, p->mbreg,1); dlog[Debug::CRIT] << "(readReg): " << ex << endl;
return ret.data[0];
} }
else catch(SystemError& err)
cerr << myname << "(callItem): " << (int)p->mbfunc << endl; {
// return 0; dlog[Debug::CRIT] << "(readReg): " << err << endl;
}
catch(Exception& ex)
{
dlog[Debug::CRIT] << "(readReg): " << ex << endl;
}
catch( ost::SockException& e )
{
dlog[Debug::CRIT] << "(readReg): " << e.getString() << ": " << e.getSystemErrorString() << endl;
}
return 0; return 0;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
bool MBMaster::writeReg( MBMap::iterator& p, long val )
{
if( p->mbfunc == fnWriteOutputRegisters )
{
ModbusRTU::WriteOutputMessage msg(p->mbaddr,p->mbreg);
msg.addData(val);
ModbusRTU::WriteOutputRetMessage ret = mb->write10(msg);
return true;
}
if( p->mbfunc == ModbusRTU::fnForceSingleCoil )
{
ModbusRTU::ForceSingleCoilRetMessage ret = mb->write05(p->mbaddr,p->mbreg,(bool)val);
return false;
}
if( p->mbfunc == fnWriteOutputSingleRegister )
{
ModbusRTU::WriteSingleOutputRetMessage ret = mb->write06(p->mbaddr,p->mbreg,val);
return true;
}
if( p->mbfunc == fnForceMultipleCoils )
{
ModbusRTU::ForceCoilsMessage msg(p->mbaddr,p->mbreg);
ModbusRTU::DataBits16 b(val);
msg.addData(b);
ModbusRTU::ForceCoilsRetMessage ret = mb->write0F(msg);
return true;
}
cerr << myname << "(writeReg): " << (int)p->mbfunc << endl;
return false;
}
// -----------------------------------------------------------------------------
void MBMaster::processingMessage(UniSetTypes::VoidMessage *msg) void MBMaster::processingMessage(UniSetTypes::VoidMessage *msg)
{ {
try try
...@@ -365,6 +429,13 @@ void MBMaster::sysCommand(UniSetTypes::SystemMessage *sm) ...@@ -365,6 +429,13 @@ void MBMaster::sysCommand(UniSetTypes::SystemMessage *sm)
{ {
case SystemMessage::StartUp: case SystemMessage::StartUp:
{ {
if( mbmap.empty() )
{
dlog[Debug::CRIT] << myname << "(sysCommand): mbmap EMPTY! terminated..." << endl;
raise(SIGTERM);
return;
}
waitSMReady(); waitSMReady();
// ģ // ģ
...@@ -393,7 +464,7 @@ void MBMaster::sysCommand(UniSetTypes::SystemMessage *sm) ...@@ -393,7 +464,7 @@ void MBMaster::sysCommand(UniSetTypes::SystemMessage *sm)
// //
if( !force ) if( !force )
{ {
uniset_mutex_lock l(pollMutex,2000); uniset_mutex_lock l(pollMutex,2000);
force = true; force = true;
poll(); poll();
force = false; force = false;
...@@ -461,9 +532,7 @@ void MBMaster::initOutput() ...@@ -461,9 +532,7 @@ void MBMaster::initOutput()
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void MBMaster::askSensors( UniversalIO::UIOCommand cmd ) void MBMaster::askSensors( UniversalIO::UIOCommand cmd )
{ {
#warning testid if( !shm->waitSMworking(test_id,activateTimeout,50) )
UniSetTypes::ObjectId testid = 4100; // (notRespondSensor!=DefaultObjectId) ? notRespondSensor : 4100; //TestMode_S
if( !shm->waitSMworking(testid,activateTimeout,50) )
{ {
ostringstream err; ostringstream err;
err << myname err << myname
...@@ -498,7 +567,27 @@ void MBMaster::askSensors( UniversalIO::UIOCommand cmd ) ...@@ -498,7 +567,27 @@ void MBMaster::askSensors( UniversalIO::UIOCommand cmd )
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void MBMaster::sensorInfo( UniSetTypes::SensorMessage* sm ) void MBMaster::sensorInfo( UniSetTypes::SensorMessage* sm )
{ {
MBMap::iterator it=mbmap.begin();
for( ; it!=mbmap.end(); ++it )
{
if( it->stype != UniversalIO::DigitalOutput && it->stype!=UniversalIO::AnalogOutput )
continue;
if( it->si.id == sm->id )
{
if( it->stype == UniversalIO::DigitalOutput )
{
uniset_spin_lock lock(it->val_lock);
it->value = sm->state ? 1 : 0;
}
else if( it->stype == UniversalIO::AnalogOutput )
{
uniset_spin_lock lock(it->val_lock);
it->value = sm->value;
}
break;
}
}
} }
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
bool MBMaster::activateObject() bool MBMaster::activateObject()
...@@ -600,28 +689,54 @@ bool MBMaster::readItem( UniXML& xml, UniXML_iterator& it, xmlNode* sec ) ...@@ -600,28 +689,54 @@ bool MBMaster::readItem( UniXML& xml, UniXML_iterator& it, xmlNode* sec )
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
bool MBMaster::initItem( UniXML_iterator& it ) bool MBMaster::initItem( UniXML_iterator& it )
{ {
cerr << "********** init item *************" << endl;
MBProperty p; MBProperty p;
if( !IOBase::initItem( static_cast<IOBase*>(&p),it,shm,&dlog,myname) ) if( !IOBase::initItem( static_cast<IOBase*>(&p),it,shm,&dlog,myname) )
return false; return false;
cerr << "********** init item(2) *************" << endl;
string addr = it.getProp("mbaddr"); string addr = it.getProp("mbaddr");
if( addr.empty() ) if( addr.empty() )
return true; return true;
if( mbregFromID )
p.mbreg = p.si.id;
else
{
string r = it.getProp("mbreg");
if( r.empty() )
{
dlog[Debug::CRIT] << myname << "(initItem): Unknown 'mbreg' for " << it.getProp("name") << endl;
return false;
}
p.mbreg = ModbusRTU::str2mbData(r);
}
p.mbaddr = ModbusRTU::str2mbAddr(addr); p.mbaddr = ModbusRTU::str2mbAddr(addr);
if( p.stype == UniversalIO::AnalogInput ) string stype( it.getProp("mb_iotype") );
if( stype.empty() )
stype = it.getProp("iotype");
if( stype == "AI" )
{
p.stype = UniversalIO::AnalogInput;
p.mbfunc = ModbusRTU::fnReadInputRegisters; p.mbfunc = ModbusRTU::fnReadInputRegisters;
else if ( p.stype == UniversalIO::DigitalInput ) }
else if ( stype == "DI" )
{
p.stype = UniversalIO::DigitalInput;
p.mbfunc = ModbusRTU::fnReadInputRegisters; p.mbfunc = ModbusRTU::fnReadInputRegisters;
else if ( p.stype == UniversalIO::AnalogOutput ) }
else if ( stype == "AO" )
{
p.stype = UniversalIO::AnalogOutput;
p.mbfunc = ModbusRTU::fnWriteOutputRegisters; p.mbfunc = ModbusRTU::fnWriteOutputRegisters;
else if ( p.stype == UniversalIO::DigitalOutput ) }
else if ( stype == "DO" )
{
p.stype = UniversalIO::DigitalOutput;
p.mbfunc = ModbusRTU::fnWriteOutputRegisters; p.mbfunc = ModbusRTU::fnWriteOutputRegisters;
}
string f = it.getProp("mbfunc"); string f = it.getProp("mbfunc");
if( !f.empty() ) if( !f.empty() )
...@@ -629,13 +744,33 @@ bool MBMaster::initItem( UniXML_iterator& it ) ...@@ -629,13 +744,33 @@ bool MBMaster::initItem( UniXML_iterator& it )
p.mbfunc = (ModbusRTU::SlaveFunctionCode)UniSetTypes::uni_atoi(f.c_str()); p.mbfunc = (ModbusRTU::SlaveFunctionCode)UniSetTypes::uni_atoi(f.c_str());
if( p.mbfunc == ModbusRTU::fnUnknown ) if( p.mbfunc == ModbusRTU::fnUnknown )
{ {
dlog[Debug::CRIT] << myname << "(initCommParam): mbfunc ='" << f dlog[Debug::CRIT] << myname << "(initItem): mbfunc ='" << f
<< "' " << it.getProp("name") << endl; << "' " << it.getProp("name") << endl;
return false; return false;
} }
} }
if( p.mbfunc == ModbusRTU::fnReadCoilStatus ||
p.mbfunc == ModbusRTU::fnReadInputStatus )
{
string nb = it.getProp("nbit");
if( nb.empty() )
{
dlog[Debug::CRIT] << myname << "(initItem): Unknown nbit. for "
<< it.getProp("name")
<< " mbfunc=" << p.mbfunc
<< endl;
return false;
}
p.nbit = UniSetTypes::uni_atoi(nb.c_str());
}
if( dlog.debugging(Debug::INFO) )
dlog[Debug::INFO] << myname << "(initItem): add " << p << endl;
// //
// 10 ( ) // 10 ( )
// resize // resize
......
...@@ -43,10 +43,11 @@ class MBMaster: ...@@ -43,10 +43,11 @@ class MBMaster:
ModbusRTU::ModbusAddr mbaddr; /*!< */ ModbusRTU::ModbusAddr mbaddr; /*!< */
ModbusRTU::ModbusData mbreg; /*!< */ ModbusRTU::ModbusData mbreg; /*!< */
ModbusRTU::SlaveFunctionCode mbfunc; /*!< / */ ModbusRTU::SlaveFunctionCode mbfunc; /*!< / */
short nbit; /*!< bit number (for func=[0x01,0x02]) */
MBProperty(): MBProperty():
mbaddr(0),mbreg(0), mbaddr(0),mbreg(0),
mbfunc(ModbusRTU::fnUnknown) mbfunc(ModbusRTU::fnUnknown),nbit(0)
{} {}
friend std::ostream& operator<<( std::ostream& os, MBProperty& p ); friend std::ostream& operator<<( std::ostream& os, MBProperty& p );
...@@ -80,7 +81,8 @@ class MBMaster: ...@@ -80,7 +81,8 @@ class MBMaster:
void askSensors( UniversalIO::UIOCommand cmd ); void askSensors( UniversalIO::UIOCommand cmd );
void initOutput(); void initOutput();
void waitSMReady(); void waitSMReady();
long callItem( MBMap::iterator& p ); long readReg( MBMap::iterator& p );
bool writeReg( MBMap::iterator& p, long val );
virtual bool activateObject(); virtual bool activateObject();
...@@ -100,6 +102,7 @@ class MBMaster: ...@@ -100,6 +102,7 @@ class MBMaster:
bool initPause; bool initPause;
UniSetTypes::uniset_mutex mutex_start; UniSetTypes::uniset_mutex mutex_start;
bool mbregFromID;
bool force; /*!< , SM, */ bool force; /*!< , SM, */
bool force_out; /*!< , */ bool force_out; /*!< , */
int polltime; /*!< , [] */ int polltime; /*!< , [] */
...@@ -113,6 +116,7 @@ class MBMaster: ...@@ -113,6 +116,7 @@ class MBMaster:
Trigger trTimeout; Trigger trTimeout;
PassiveTimer ptTimeout; PassiveTimer ptTimeout;
bool activated; bool activated;
int activateTimeout; int activateTimeout;
std::string prefix; std::string prefix;
......
#!/bin/sh #!/bin/sh
uniset-start.sh -f ./uniset-mbtcpmaster --mbtcp-name MBMaster1 --confile test.xml \ uniset-start.sh -f ./uniset-mbtcpmaster --mbtcp-name MBMaster1 --confile test.xml \
--dlog-add-levels info,crit,warn --mbtcp-reg-from-id 1 \ --dlog-add-levels info,crit,warn \
--mbtcp-iaddr 127.0.0.1 --mbtcp-port 30000 --mbtcp-iaddr 127.0.0.1 --mbtcp-port 2048 \
--mbtcp-filter-field mbtcp --mbtcp-filter-value 1
#--mbtcp-reg-from-id 1
\ No newline at end of file
...@@ -13,7 +13,8 @@ using namespace UniSetTypes; ...@@ -13,7 +13,8 @@ using namespace UniSetTypes;
using namespace UniSetExtentions; using namespace UniSetExtentions;
using namespace ModbusRTU; using namespace ModbusRTU;
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
MBSlave::MBSlave( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmId, SharedMemory* ic ): MBSlave::MBSlave( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmId,
SharedMemory* ic, string prefix ):
UniSetObject_LT(objId), UniSetObject_LT(objId),
mbslot(0), mbslot(0),
shm(0), shm(0),
...@@ -21,8 +22,8 @@ initPause(0), ...@@ -21,8 +22,8 @@ initPause(0),
activated(false), activated(false),
pingOK(true), pingOK(true),
force(false), force(false),
force_out(false), mbregFromID(false),
mbregFromID(false) prefix(prefix)
{ {
cout << "$Id: MBSlave.cc,v 1.1 2009/01/11 19:08:45 vpashka Exp $" << endl; cout << "$Id: MBSlave.cc,v 1.1 2009/01/11 19:08:45 vpashka Exp $" << endl;
...@@ -39,36 +40,35 @@ mbregFromID(false) ...@@ -39,36 +40,35 @@ mbregFromID(false)
UniXML_iterator it(cnode); UniXML_iterator it(cnode);
// //
s_field = conf->getArgParam("--mbs-s-filter-field"); s_field = conf->getArgParam("--" + prefix + "-filter-field");
s_fvalue = conf->getArgParam("--mbs-s-filter-value"); s_fvalue = conf->getArgParam("--" + prefix + "-filter-value");
dlog[Debug::INFO] << myname << "(init): read s_field='" << s_field dlog[Debug::INFO] << myname << "(init): read s_field='" << s_field
<< "' s_fvalue='" << s_fvalue << "'" << endl; << "' s_fvalue='" << s_fvalue << "'" << endl;
force = atoi(conf->getArgParam("--mbs-force",it.getProp("force")).c_str()); force = atoi(conf->getArgParam("--" + prefix + "-force",it.getProp("force")).c_str());
force_out = atoi(conf->getArgParam("--mbs-force-out",it.getProp("force_out")).c_str());
int recv_timeout = atoi(conf->getArgParam("--mbs-recv-timeout",it.getProp("recv_timeout")).c_str()); int recv_timeout = atoi(conf->getArgParam("--" + prefix + "-recv-timeout",it.getProp("recv_timeout")).c_str());
string saddr = conf->getArgParam("--mbs-my-addr",it.getProp("addr")); string saddr = conf->getArgParam("--" + prefix + "-my-addr",it.getProp("addr"));
if( saddr.empty() ) if( saddr.empty() )
addr = 0x01; addr = 0x01;
else else
addr = ModbusRTU::str2mbAddr(saddr); addr = ModbusRTU::str2mbAddr(saddr);
mbregFromID = atoi(conf->getArgParam("--mbs-reg-from-id",it.getProp("reg_from_id")).c_str()); mbregFromID = atoi(conf->getArgParam("--" + prefix + "-reg-from-id",it.getProp("reg_from_id")).c_str());
dlog[Debug::INFO] << myname << "(init): mbregFromID=" << mbregFromID << endl; dlog[Debug::INFO] << myname << "(init): mbregFromID=" << mbregFromID << endl;
string stype = conf->getArgParam("--mbs-type",it.getProp("type")); string stype = conf->getArgParam("--" + prefix + "-type",it.getProp("type"));
if( stype == "RTU" ) if( stype == "RTU" )
{ {
// ---------- init RS ---------- // ---------- init RS ----------
string dev = conf->getArgParam("--mbs-dev",it.getProp("device")); string dev = conf->getArgParam("--" + prefix + "-dev",it.getProp("device"));
if( dev.empty() ) if( dev.empty() )
throw UniSetTypes::SystemError(myname+"(MBSlave): Unknown device..."); throw UniSetTypes::SystemError(myname+"(MBSlave): Unknown device...");
string speed = conf->getArgParam("--mbs-speed",it.getProp("speed")); string speed = conf->getArgParam("--" + prefix + "-speed",it.getProp("speed"));
if( speed.empty() ) if( speed.empty() )
speed = "38400"; speed = "38400";
...@@ -87,11 +87,11 @@ mbregFromID(false) ...@@ -87,11 +87,11 @@ mbregFromID(false)
} }
else if( stype == "TCP" ) else if( stype == "TCP" )
{ {
string iaddr = conf->getArgParam("--mbs-inet-addr",it.getProp("iaddr")); string iaddr = conf->getArgParam("--" + prefix + "-inet-addr",it.getProp("iaddr"));
if( iaddr.empty() ) 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: --mbs-inet-addr [ XXX.XXX.XXX.XXX| hostname ]");
int port = atoi(conf->getArgParam("--mbs-inet-port",it.getProp("iport")).c_str()); int port = atoi(conf->getArgParam("--" + prefix + "-inet-port",it.getProp("iport")).c_str());
if( port <=0 ) if( port <=0 )
port = 502; port = 502;
...@@ -122,7 +122,7 @@ mbregFromID(false) ...@@ -122,7 +122,7 @@ mbregFromID(false)
// mbslot->connectRemoteService( sigc::mem_fun(this, &MBSlave::remoteService) ); // mbslot->connectRemoteService( sigc::mem_fun(this, &MBSlave::remoteService) );
// ------------------------------- // -------------------------------
initPause = atoi(conf->getArgParam("--mbs-initPause",it.getProp("initPause")).c_str()); initPause = atoi(conf->getArgParam("--" + prefix + "-initPause",it.getProp("initPause")).c_str());
if( !initPause ) if( !initPause )
initPause = 3000; initPause = 3000;
...@@ -135,7 +135,7 @@ mbregFromID(false) ...@@ -135,7 +135,7 @@ mbregFromID(false)
ic->addReadItem( sigc::mem_fun(this,&MBSlave::readItem) ); ic->addReadItem( sigc::mem_fun(this,&MBSlave::readItem) );
// ********** HEARTBEAT ************* // ********** HEARTBEAT *************
string heart = conf->getArgParam("--mbs-heartbeat-id",it.getProp("heartbeat_id")); string heart = conf->getArgParam("--" + prefix + "-heartbeat-id",it.getProp("heartbeat_id"));
if( !heart.empty() ) if( !heart.empty() )
{ {
sidHeartBeat = conf->getSensorID(heart); sidHeartBeat = conf->getSensorID(heart);
...@@ -153,7 +153,7 @@ mbregFromID(false) ...@@ -153,7 +153,7 @@ mbregFromID(false)
else else
ptHeartBeat.setTiming(UniSetTimer::WaitUpTime); ptHeartBeat.setTiming(UniSetTimer::WaitUpTime);
maxHeartBeat = atoi(conf->getArgParam("--mbs-heartbeat-max",it.getProp("heartbeat_max")).c_str()); maxHeartBeat = atoi(conf->getArgParam("--" + prefix + "-heartbeat-max",it.getProp("heartbeat_max")).c_str());
if( maxHeartBeat <=0 ) if( maxHeartBeat <=0 )
maxHeartBeat = 10; maxHeartBeat = 10;
...@@ -177,11 +177,11 @@ mbregFromID(false) ...@@ -177,11 +177,11 @@ mbregFromID(false)
if( wait_msec < 500 ) if( wait_msec < 500 )
wait_msec = 500; wait_msec = 500;
activateTimeout = atoi(conf->getArgParam("--activate-timeout").c_str()); activateTimeout = atoi(conf->getArgParam("--" + prefix + "-activate-timeout").c_str());
if( activateTimeout<=0 ) if( activateTimeout<=0 )
activateTimeout = 20000; activateTimeout = 20000;
int msec = atoi(conf->getArgParam("--mbs-timeout",it.getProp("timeout")).c_str()); int msec = atoi(conf->getArgParam("--" + prefix + "-timeout",it.getProp("timeout")).c_str());
if( msec <=0 ) if( msec <=0 )
msec = 3000; msec = 3000;
...@@ -249,7 +249,7 @@ MBSlave::~MBSlave() ...@@ -249,7 +249,7 @@ MBSlave::~MBSlave()
void MBSlave::waitSMReady() void MBSlave::waitSMReady()
{ {
// waiting for SM is ready... // waiting for SM is ready...
int ready_timeout = atoi(conf->getArgParam("--mbs-sm-ready-timeout","15000").c_str()); int ready_timeout = atoi(conf->getArgParam("--" + prefix + "-sm-ready-timeout","15000").c_str());
if( ready_timeout == 0 ) if( ready_timeout == 0 )
ready_timeout = 15000; ready_timeout = 15000;
else if( ready_timeout < 0 ) else if( ready_timeout < 0 )
...@@ -374,6 +374,13 @@ void MBSlave::processingMessage(UniSetTypes::VoidMessage *msg) ...@@ -374,6 +374,13 @@ void MBSlave::processingMessage(UniSetTypes::VoidMessage *msg)
} }
break; break;
case Message::SensorInfo:
{
SensorMessage sm( msg );
sensorInfo(&sm);
}
break;
default: default:
break; break;
} }
...@@ -478,7 +485,6 @@ void MBSlave::sysCommand(UniSetTypes::SystemMessage *sm) ...@@ -478,7 +485,6 @@ void MBSlave::sysCommand(UniSetTypes::SystemMessage *sm)
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
void MBSlave::askSensors( UniversalIO::UIOCommand cmd ) void MBSlave::askSensors( UniversalIO::UIOCommand cmd )
{ {
#warning testid
if( !shm->waitSMworking(test_id,activateTimeout,50) ) if( !shm->waitSMworking(test_id,activateTimeout,50) )
{ {
ostringstream err; ostringstream err;
...@@ -491,17 +497,19 @@ void MBSlave::askSensors( UniversalIO::UIOCommand cmd ) ...@@ -491,17 +497,19 @@ void MBSlave::askSensors( UniversalIO::UIOCommand cmd )
throw SystemError(err.str()); throw SystemError(err.str());
} }
if( force )
return;
IOMap::iterator it=iomap.begin(); IOMap::iterator it=iomap.begin();
for( ; it!=iomap.end(); ++it ) for( ; it!=iomap.end(); ++it )
{ {
IOProperty* p(&it->second); IOProperty* p(&it->second);
if( p->stype != UniversalIO::DigitalOutput && p->stype != UniversalIO::AnalogOutput ) // if( p->stype != UniversalIO::DigitalOutput && p->stype != UniversalIO::AnalogOutput )
continue; // continue;
if( p->safety == NoSafetyState )
continue;
// if( p->safety == NoSafetyState )
// continue;
try try
{ {
shm->askSensor(p->si.id,cmd); shm->askSensor(p->si.id,cmd);
...@@ -519,18 +527,17 @@ void MBSlave::sensorInfo( UniSetTypes::SensorMessage* sm ) ...@@ -519,18 +527,17 @@ void MBSlave::sensorInfo( UniSetTypes::SensorMessage* sm )
IOMap::iterator it=iomap.begin(); IOMap::iterator it=iomap.begin();
for( ; it!=iomap.end(); ++it ) for( ; it!=iomap.end(); ++it )
{ {
if( it->second.stype != UniversalIO::DigitalOutput && it->second.stype!=UniversalIO::AnalogOutput )
continue;
if( it->second.si.id == sm->id ) if( it->second.si.id == sm->id )
{ {
IOProperty* p(&it->second); IOProperty* p(&it->second);
if( p->stype == UniversalIO::DigitalOutput ) if( p->stype == UniversalIO::DigitalOutput ||
p->stype == UniversalIO::DigitalInput )
{ {
uniset_spin_lock lock(p->val_lock); uniset_spin_lock lock(p->val_lock);
p->value = sm->state ? 1 : 0; p->value = sm->state ? 1 : 0;
} }
else if( p->stype == UniversalIO::AnalogOutput ) else if( p->stype == UniversalIO::AnalogOutput ||
p->stype == UniversalIO::AnalogInput )
{ {
uniset_spin_lock lock(p->val_lock); uniset_spin_lock lock(p->val_lock);
p->value = sm->value; p->value = sm->value;
...@@ -621,45 +628,23 @@ bool MBSlave::initItem( UniXML_iterator& it ) ...@@ -621,45 +628,23 @@ bool MBSlave::initItem( UniXML_iterator& it )
{ {
IOProperty p; IOProperty p;
string sname(it.getProp("name")); if( !IOBase::initItem( static_cast<IOBase*>(&p),it,shm,&dlog,myname) )
ObjectId sid = DefaultObjectId;
if( it.getProp("id").empty() )
sid = conf->getSensorID(sname);
else
{
sid = UniSetTypes::uni_atoi(it.getProp("id").c_str());
if( sid <=0 )
sid = DefaultObjectId;
}
if( sid == DefaultObjectId )
{
dlog[Debug::CRIT] << myname << "(readItem): (-1) ID : "
<< sname << endl;
return false; return false;
}
if( mbregFromID ) if( mbregFromID )
p.mbreg = sid; p.mbreg = p.si.id;
else else
{ {
string r = it.getProp("mbreg"); string r = it.getProp("mbreg");
if( r.empty() ) if( r.empty() )
{ {
dlog[Debug::CRIT] << myname << "(initItem): Unknown 'mbreg' for " << sname << endl; dlog[Debug::CRIT] << myname << "(initItem): Unknown 'mbreg' for " << it.getProp("name") << endl;
return false; return false;
} }
p.mbreg = ModbusRTU::str2mbData(r);
} }
p.si.id = sid;
p.si.node = conf->getLocalNode();
p.value = atoi(it.getProp("default").c_str());
p.ignore = atoi(it.getProp("ignore").c_str());
p.safety = atoi(it.getProp("safety").c_str());
p.invert = atoi(it.getProp("invert").c_str());
string stype( it.getProp("mb_iotype") ); string stype( it.getProp("mb_iotype") );
if( stype.empty() ) if( stype.empty() )
stype = it.getProp("iotype"); stype = it.getProp("iotype");
...@@ -705,30 +690,6 @@ bool MBSlave::initItem( UniXML_iterator& it ) ...@@ -705,30 +690,6 @@ bool MBSlave::initItem( UniXML_iterator& it )
} }
} }
p.cal.minRaw = 0;
p.cal.maxRaw = 0;
p.cal.minCal = 0;
p.cal.maxCal = 0;
p.cal.sensibility = 0;
p.cal.precision = 0;
p.cdiagram = 0;
if( p.stype == UniversalIO::AnalogInput || p.stype == UniversalIO::AnalogOutput )
{
p.cal.minRaw = atoi( it.getProp("rmin").c_str() );
p.cal.maxRaw = atoi( it.getProp("rmax").c_str() );
p.cal.minCal = atoi( it.getProp("cmin").c_str() );
p.cal.maxCal = atoi( it.getProp("cmax").c_str() );
p.cal.sensibility = atoi( it.getProp("sensibility").c_str() );
p.cal.precision = atoi( it.getProp("precision").c_str() );
std::string caldiagram( it.getProp("caldiagram") );
if( !caldiagram.empty() )
p.cdiagram = buildCalibrationDiagram( caldiagram );
}
shm->initAIterator(p.ait);
shm->initDIterator(p.dit);
iomap[p.mbreg] = p; iomap[p.mbreg] = p;
if( dlog.debugging(Debug::INFO) ) if( dlog.debugging(Debug::INFO) )
...@@ -751,29 +712,31 @@ void MBSlave::initIterators() ...@@ -751,29 +712,31 @@ void MBSlave::initIterators()
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void MBSlave::help_print( int argc, char* argv[] ) void MBSlave::help_print( int argc, char* argv[] )
{ {
cout << "--mbs-heartbeat-id - heartbeat-." << endl; cout << "Default: prefix='mbtcp'" << endl;
cout << "--mbs-heartbeat-max - heartbeat-ޣ . 10." << endl; cout << "--prefix-heartbeat-id - heartbeat-." << endl;
cout << "--mbs-ready-timeout - SM , . (-1 - '')" << endl; cout << "--prefix-heartbeat-max - heartbeat-ޣ . 10." << endl;
cout << "--mbs-initPause - ( )" << endl; cout << "--prefix-ready-timeout - SM , . (-1 - '')" << endl;
cout << "--mbs-notRespondSensor - " << endl; cout << "--prefix-initPause - ( )" << endl;
cout << "--mbs-sm-ready-timeout - SM" << endl; cout << "--prefix-notRespondSensor - " << endl;
cout << "--mbs-recv-timeout - ." << endl; cout << "--prefix-sm-ready-timeout - SM" << endl;
cout << "--mbs-allow-setdatetime - On set date and time (0x50) modbus function" << endl; cout << "--prefix-recv-timeout - ." << endl;
cout << "--mbs-my-addr - " << endl; cout << "--prefix-allow-setdatetime - On set date and time (0x50) modbus function" << endl;
cout << "--mbs-type [RTU|TCP] - modbus server type." << endl; cout << "--prefix-my-addr - " << endl;
cout << "--prefix-type [RTU|TCP] - modbus server type." << endl;
cout << " RTU: " << endl; cout << " RTU: " << endl;
cout << "--mbs-dev devname - " << endl; cout << "--prefix-dev devname - " << endl;
cout << "--mbs-speed - (9600,19920,38400,57600,115200)." << endl; cout << "--prefix-speed - (9600,19920,38400,57600,115200)." << endl;
cout << " TCP: " << endl; cout << " TCP: " << endl;
cout << "--mbs-inet-addr [xxx.xxx.xxx.xxx | hostname ] - this modbus server address" << endl; cout << "--prefix-inet-addr [xxx.xxx.xxx.xxx | hostname ] - this modbus server address" << endl;
cout << "--mbs-inet-port num - this modbus server port. Default: 502" << endl; cout << "--prefix-inet-port num - this modbus server port. Default: 502" << endl;
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
MBSlave* MBSlave::init_mbslave( int argc, char* argv[], UniSetTypes::ObjectId icID, SharedMemory* ic ) MBSlave* MBSlave::init_mbslave( int argc, char* argv[], UniSetTypes::ObjectId icID, SharedMemory* ic,
string prefix )
{ {
string name = conf->getArgParam("--mbs-name","MBSlave1"); string name = conf->getArgParam("--" + prefix + "-name","MBSlave1");
if( name.empty() ) if( name.empty() )
{ {
cerr << "(mbslave): name'" << endl; cerr << "(mbslave): name'" << endl;
...@@ -1001,7 +964,7 @@ ModbusRTU::mbErrCode MBSlave::real_read( ModbusRTU::ModbusData reg, ...@@ -1001,7 +964,7 @@ ModbusRTU::mbErrCode MBSlave::real_read( ModbusRTU::ModbusData reg,
{ {
if( dlog.debugging(Debug::INFO) ) if( dlog.debugging(Debug::INFO) )
{ {
dlog[Debug::INFO] << myname << "(read): read mbID=" dlog[Debug::INFO] << myname << "(real_read): read mbID="
<< ModbusRTU::dat2str(reg) << endl; << ModbusRTU::dat2str(reg) << endl;
} }
...@@ -1033,29 +996,29 @@ ModbusRTU::mbErrCode MBSlave::real_read( ModbusRTU::ModbusData reg, ...@@ -1033,29 +996,29 @@ ModbusRTU::mbErrCode MBSlave::real_read( ModbusRTU::ModbusData reg,
} }
catch( UniSetTypes::NameNotFound& ex ) catch( UniSetTypes::NameNotFound& ex )
{ {
dlog[Debug::WARN] << myname << "(read): " << ex << endl; dlog[Debug::WARN] << myname << "(real_read): " << ex << endl;
return ModbusRTU::erBadDataAddress; return ModbusRTU::erBadDataAddress;
} }
catch( UniSetTypes::OutOfRange& ex ) catch( UniSetTypes::OutOfRange& ex )
{ {
dlog[Debug::WARN] << myname << "(read): " << ex << endl; dlog[Debug::WARN] << myname << "(real_read): " << ex << endl;
return ModbusRTU::erBadDataValue; return ModbusRTU::erBadDataValue;
} }
catch( Exception& ex ) catch( Exception& ex )
{ {
if( pingOK ) if( pingOK )
dlog[Debug::CRIT] << myname << "(read): " << ex << endl; dlog[Debug::CRIT] << myname << "(real_read): " << ex << endl;
} }
catch( CORBA::SystemException& ex ) catch( CORBA::SystemException& ex )
{ {
if( pingOK ) if( pingOK )
dlog[Debug::CRIT] << myname << "(read): ORBA::SystemException: " dlog[Debug::CRIT] << myname << "(real_read): CORBA::SystemException: "
<< ex.NP_minorString() << endl; << ex.NP_minorString() << endl;
} }
catch(...) catch(...)
{ {
if( pingOK ) if( pingOK )
dlog[Debug::CRIT] << myname << "(read) catch ..." << endl; dlog[Debug::CRIT] << myname << "(real_read) catch ..." << endl;
} }
pingOK = false; pingOK = false;
......
...@@ -13,7 +13,6 @@ ...@@ -13,7 +13,6 @@
#include "PassiveTimer.h" #include "PassiveTimer.h"
#include "Trigger.h" #include "Trigger.h"
#include "Mutex.h" #include "Mutex.h"
#include "Calibration.h"
#include "SMInterface.h" #include "SMInterface.h"
#include "SharedMemory.h" #include "SharedMemory.h"
#include "IOBase.h" #include "IOBase.h"
...@@ -23,12 +22,13 @@ class MBSlave: ...@@ -23,12 +22,13 @@ class MBSlave:
public UniSetObject_LT public UniSetObject_LT
{ {
public: public:
MBSlave( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmID, SharedMemory* ic=0 ); MBSlave( UniSetTypes::ObjectId objId, UniSetTypes::ObjectId shmID, SharedMemory* ic=0, std::string prefix="mbs" );
virtual ~MBSlave(); virtual ~MBSlave();
/*! */ /*! */
static MBSlave* init_mbslave( int argc, char* argv[], static MBSlave* init_mbslave( int argc, char* argv[],
UniSetTypes::ObjectId shmID, SharedMemory* ic=0 ); UniSetTypes::ObjectId shmID, SharedMemory* ic=0,
std::string prefix="mbs" );
/*! help- */ /*! help- */
static void help_print( int argc, char* argv[] ); static void help_print( int argc, char* argv[] );
...@@ -172,12 +172,12 @@ class MBSlave: ...@@ -172,12 +172,12 @@ class MBSlave:
bool pingOK; bool pingOK;
int wait_msec; int wait_msec;
bool force; /*!< , SM, */ bool force; /*!< , SM, */
bool force_out; /*!< , */
bool mbregFromID; bool mbregFromID;
typedef std::map<int,std::string> FileList; typedef std::map<int,std::string> FileList;
FileList flist; FileList flist;
std::string prefix;
}; };
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
#endif // _MBSlave_H_ #endif // _MBSlave_H_
......
#!/bin/sh #!/bin/sh
uniset-start.sh -f ./uniset-mbslave --mbs-name MBSlave1 --confile test.xml --dlog-add-levels info,crit,warn \ uniset-start.sh -f ./uniset-mbslave --mbs-name MBSlave1 --confile test.xml --dlog-add-levels info,crit,warn \
--mbs-type TCP --mbs-inet-addr 127.0.0.2 --mbs-inet-port 2048 --mbs-reg-from-id 1 --mbs-type TCP --mbs-inet-addr 127.0.0.1 --mbs-inet-port 2048 \
\ No newline at end of file --mbs-filter-field rs --mbs-filter-value 1
# --mbs-force 1
#--mbs-reg-from-id 1 \
\ No newline at end of file
...@@ -252,18 +252,20 @@ bool IOBase::initItem( IOBase* b, UniXML_iterator& it, SMInterface* shm, ...@@ -252,18 +252,20 @@ bool IOBase::initItem( IOBase* b, UniXML_iterator& it, SMInterface* shm,
{ {
string sname( it.getProp("name") ); string sname( it.getProp("name") );
ObjectId sid = UniSetTypes::uni_atoi(it.getProp("id").c_str()); ObjectId sid = DefaultObjectId;
if( sid <=0 ) if( it.getProp("id").empty() )
sid = conf->getSensorID(sname);
else
{ {
if( dlog ) sid = UniSetTypes::uni_atoi(it.getProp("id").c_str());
dlog[Debug::CRIT] << myname << "(readItem): ID : " if( sid <=0 )
<< sname << endl; sid = DefaultObjectId;
return false;
} }
if( sid == DefaultObjectId ) if( sid == DefaultObjectId )
{ {
dlog[Debug::CRIT] << myname << "(readItem): (-1) ID : " if( dlog )
dlog[Debug::CRIT] << myname << "(readItem): (-1) ID : "
<< sname << endl; << sname << endl;
return false; return false;
} }
......
...@@ -439,16 +439,16 @@ void SMInterface::initAIterator( IOController::AIOStateList::iterator& it ) ...@@ -439,16 +439,16 @@ void SMInterface::initAIterator( IOController::AIOStateList::iterator& it )
{ {
if( ic ) if( ic )
it = ic->aioEnd(); it = ic->aioEnd();
else // else
cerr << "(SMInterface::initAIterator): ic=NULL" << endl; // cerr << "(SMInterface::initAIterator): ic=NULL" << endl;
} }
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
void SMInterface::initDIterator( IOController::DIOStateList::iterator& it ) void SMInterface::initDIterator( IOController::DIOStateList::iterator& it )
{ {
if( ic ) if( ic )
it = ic->dioEnd(); it = ic->dioEnd();
else // else
cerr << "(SMInterface::initDIterator): ic=NULL" << endl; // cerr << "(SMInterface::initDIterator): ic=NULL" << endl;
} }
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
bool SMInterface::waitSMready( int ready_timeout, int pmsec ) bool SMInterface::waitSMready( int ready_timeout, int pmsec )
......
...@@ -24,6 +24,8 @@ class ModbusTCPMaster: ...@@ -24,6 +24,8 @@ class ModbusTCPMaster:
bool isConnection(); bool isConnection();
protected: protected:
void reconnect();
virtual int getNextData( unsigned char* buf, int len ); virtual int getNextData( unsigned char* buf, int len );
virtual void setChannelTimeout( int msec ); virtual void setChannelTimeout( int msec );
...@@ -35,6 +37,8 @@ class ModbusTCPMaster: ...@@ -35,6 +37,8 @@ class ModbusTCPMaster:
ost::TCPStream* tcp; ost::TCPStream* tcp;
static int nTransaction; static int nTransaction;
std::queue<unsigned char> qrecv; std::queue<unsigned char> qrecv;
PassiveTimer ptTimeout;
std::string iaddr;
}; };
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
#endif // ModbusTCPMaster_H_ #endif // ModbusTCPMaster_H_
......
...@@ -13,7 +13,8 @@ using namespace ModbusRTU; ...@@ -13,7 +13,8 @@ using namespace ModbusRTU;
using namespace UniSetTypes; using namespace UniSetTypes;
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
ModbusTCPMaster::ModbusTCPMaster(): ModbusTCPMaster::ModbusTCPMaster():
tcp(0) tcp(0),
iaddr("")
{ {
setCRCNoCheckit(true); setCRCNoCheckit(true);
} }
...@@ -46,13 +47,16 @@ int ModbusTCPMaster::nTransaction = 0; ...@@ -46,13 +47,16 @@ int ModbusTCPMaster::nTransaction = 0;
mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg, mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg,
ModbusMessage& reply, int timeout ) ModbusMessage& reply, int timeout )
{ {
if( !isConnection() )
// if( !isConnection() )
if( iaddr.empty() )
{ {
dlog[Debug::WARN] << "(query): not connection to server..." << endl; dlog[Debug::WARN] << "(query): not connection to server..." << endl;
return erHardwareError; return erHardwareError;
} }
PassiveTimer ptTimeout; reconnect();
if( timeout<=0 || timeout == UniSetTimer::WaitUpTime ) if( timeout<=0 || timeout == UniSetTimer::WaitUpTime )
{ {
...@@ -66,6 +70,9 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg, ...@@ -66,6 +70,9 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg,
try try
{ {
if( nTransaction >= numeric_limits<int>::max() )
nTransaction = 0;
ModbusTCP::MBAPHeader mh; ModbusTCP::MBAPHeader mh;
mh.tID = ++nTransaction; mh.tID = ++nTransaction;
mh.pID = 0; mh.pID = 0;
...@@ -89,7 +96,7 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg, ...@@ -89,7 +96,7 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg,
mbErrCode res = send(msg); mbErrCode res = send(msg);
if( res!=erNoError ) if( res!=erNoError )
return res; return res;
if( !tcp->isPending(ost::Socket::pendingOutput,timeout) ) if( !tcp->isPending(ost::Socket::pendingOutput,timeout) )
return erTimeOut; return erTimeOut;
...@@ -159,6 +166,17 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg, ...@@ -159,6 +166,17 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg,
return erHardwareError; return erHardwareError;
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
void ModbusTCPMaster::reconnect()
{
if( tcp )
{
tcp->disconnect();
delete tcp;
}
tcp = new ost::TCPStream(iaddr.c_str());
}
// -------------------------------------------------------------------------
void ModbusTCPMaster::connect( ost::InetAddress addr, int port ) void ModbusTCPMaster::connect( ost::InetAddress addr, int port )
{ {
if( !tcp ) if( !tcp )
...@@ -169,7 +187,8 @@ void ModbusTCPMaster::connect( ost::InetAddress addr, int port ) ...@@ -169,7 +187,8 @@ void ModbusTCPMaster::connect( ost::InetAddress addr, int port )
if( dlog.debugging(Debug::INFO) ) if( dlog.debugging(Debug::INFO) )
dlog[Debug::INFO] << "(ModbusTCPMaster): connect to " << s.str() << endl; dlog[Debug::INFO] << "(ModbusTCPMaster): connect to " << s.str() << endl;
tcp = new ost::TCPStream(s.str().c_str()); iaddr = s.str();
tcp = new ost::TCPStream(iaddr.c_str());
} }
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
......
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