Commit a2acf2dd authored by Pavel Vainerman's avatar Pavel Vainerman

(Modus): добавил разрешённые коды DeviceID для функции 43/14.

Подправил реализацию echo-сервера.
parent 37afca41
...@@ -475,31 +475,61 @@ ModbusRTU::mbErrCode MBSlave::read4314( ModbusRTU::MEIMessageRDI& query, ...@@ -475,31 +475,61 @@ ModbusRTU::mbErrCode MBSlave::read4314( ModbusRTU::MEIMessageRDI& query,
if( verbose ) if( verbose )
cout << "(read4314): " << query << endl; cout << "(read4314): " << query << endl;
if( query.devID == rdiVendorName ) if( query.devID <= rdevMinNum || query.devID >= rdevMaxNum )
return erOperationFailed;
if( query.objID == rdiVendorName )
{ {
reply.mf = 0; reply.mf = 0xFF;
reply.conformity = 0; reply.conformity = rdevBasicDevice;
reply.addData(rdiVendorName,"etersoft"); reply.addData(query.objID,"etersoft");
reply.addData(rdiProductCode, PACKAGE_NAME); // reply.addData(rdiProductCode, PACKAGE_NAME);
reply.addData(rdiMajorMinorRevision,PACKAGE_VERSION); // reply.addData(rdiMajorMinorRevision,PACKAGE_VERSION);
return erNoError; return erNoError;
} }
else if( query.devID == rdiProductCode ) else if( query.objID == rdiProductCode )
{ {
reply.mf = 0; reply.mf = 0xFF;
reply.conformity = 0; reply.conformity = rdevBasicDevice;
reply.addData(rdiProductCode,PACKAGE_NAME); reply.addData(query.objID,PACKAGE_NAME);
return erNoError; return erNoError;
} }
else if( query.devID == rdiMajorMinorRevision ) else if( query.objID == rdiMajorMinorRevision )
{ {
reply.mf = 0; reply.mf = 0xFF;
reply.conformity = 0; reply.conformity = rdevBasicDevice;
reply.addData(rdiMajorMinorRevision,PACKAGE_VERSION); reply.addData(query.objID,PACKAGE_VERSION);
return erNoError; return erNoError;
} }
else if( query.objID == rdiVendorURL )
return ModbusRTU::erOperationFailed; {
reply.mf = 0xFF;
reply.conformity = rdevRegularDevice;
reply.addData(query.objID,PACKAGE_URL);
return erNoError;
}
else if( query.objID == rdiProductName )
{
reply.mf = 0xFF;
reply.conformity = rdevRegularDevice;
reply.addData(query.objID,PACKAGE_NAME);
return erNoError;
}
else if( query.objID == rdiModelName )
{
reply.mf = 0xFF;
reply.conformity = rdevRegularDevice;
reply.addData(query.objID,"MBSlaveEcho");
return erNoError;
}
else if( query.objID == rdiUserApplicationName )
{
reply.mf = 0xFF;
reply.conformity = rdevRegularDevice;
reply.addData(query.objID,"uniset-mbrtuslave-echo");
return erNoError;
}
return ModbusRTU::erBadDataAddress;
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
......
...@@ -467,31 +467,61 @@ ModbusRTU::mbErrCode MBTCPServer::read4314( ModbusRTU::MEIMessageRDI& query, ...@@ -467,31 +467,61 @@ ModbusRTU::mbErrCode MBTCPServer::read4314( ModbusRTU::MEIMessageRDI& query,
if( verbose ) if( verbose )
cout << "(read4314): " << query << endl; cout << "(read4314): " << query << endl;
if( query.devID == rdiVendorName ) if( query.devID <= rdevMinNum || query.devID >= rdevMaxNum )
return erOperationFailed;
if( query.objID == rdiVendorName )
{ {
reply.mf = 0; reply.mf = 0xFF;
reply.conformity = 0; reply.conformity = rdevBasicDevice;
reply.addData(rdiVendorName,"etersoft"); reply.addData(query.objID,"etersoft");
reply.addData(rdiProductCode, PACKAGE_NAME); // reply.addData(rdiProductCode, PACKAGE_NAME);
reply.addData(rdiMajorMinorRevision,PACKAGE_VERSION); // reply.addData(rdiMajorMinorRevision,PACKAGE_VERSION);
return erNoError; return erNoError;
} }
else if( query.devID == rdiProductCode ) else if( query.objID == rdiProductCode )
{ {
reply.mf = 0; reply.mf = 0xFF;
reply.conformity = 0; reply.conformity = rdevBasicDevice;
reply.addData(rdiProductCode,PACKAGE_NAME); reply.addData(query.objID,PACKAGE_NAME);
return erNoError; return erNoError;
} }
else if( query.devID == rdiMajorMinorRevision ) else if( query.objID == rdiMajorMinorRevision )
{ {
reply.mf = 0; reply.mf = 0xFF;
reply.conformity = 0; reply.conformity = rdevBasicDevice;
reply.addData(rdiMajorMinorRevision,PACKAGE_VERSION); reply.addData(query.objID,PACKAGE_VERSION);
return erNoError; return erNoError;
} }
else if( query.objID == rdiVendorURL )
return ModbusRTU::erOperationFailed; {
reply.mf = 0xFF;
reply.conformity = rdevRegularDevice;
reply.addData(query.objID,PACKAGE_URL);
return erNoError;
}
else if( query.objID == rdiProductName )
{
reply.mf = 0xFF;
reply.conformity = rdevRegularDevice;
reply.addData(query.objID,PACKAGE_NAME);
return erNoError;
}
else if( query.objID == rdiModelName )
{
reply.mf = 0xFF;
reply.conformity = rdevRegularDevice;
reply.addData(query.objID,"MBTCPSlaveEcho");
return erNoError;
}
else if( query.objID == rdiUserApplicationName )
{
reply.mf = 0xFF;
reply.conformity = rdevRegularDevice;
reply.addData(query.objID,"uniset-mbtcpslave-echo");
return erNoError;
}
return ModbusRTU::erBadDataAddress;
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
...@@ -91,6 +91,19 @@ namespace ModbusRTU ...@@ -91,6 +91,19 @@ namespace ModbusRTU
// 0x07 .. 0x7F - reserved // 0x07 .. 0x7F - reserved
// 0x80 .. 0xFF - optionaly defined (product dependant) // 0x80 .. 0xFF - optionaly defined (product dependant)
}; };
/*! Read Device Identification ObjectID (0x2B/0xE) */
enum RDIRequestDeviceID
{
rdevMinNum = 0,
rdevBasicDevice = 0x1, // request to get the basic device identification (stream access)
rdevRegularDevice = 0x2, // request to get the regular device identification (stream access)
rdevExtentedDevice = 0x3, // request to get the extended device identification (stream access)
rdevSpecificDevice = 0x4, // request to get the extended device identification (stream access)
rdevMaxNum = 0x5
};
std::string rdi2str( int id );
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
/*! различные базовые константы */ /*! различные базовые константы */
......
...@@ -2617,7 +2617,7 @@ std::ostream& ModbusRTU::operator<<(std::ostream& os, MEIMessageRetRDI& m ) ...@@ -2617,7 +2617,7 @@ std::ostream& ModbusRTU::operator<<(std::ostream& os, MEIMessageRetRDI& m )
{ {
os << endl; os << endl;
for( RDIObjectList::iterator it=m.dlist.begin(); it!=m.dlist.end(); it++ ) for( RDIObjectList::iterator it=m.dlist.begin(); it!=m.dlist.end(); it++ )
os << " " << (int)(it->id) << " : " << it->val << endl; os << " " << rdi2str(it->id) << " : " << it->val << endl;
} }
return os; return os;
...@@ -2633,7 +2633,7 @@ std::ostream& ModbusRTU::operator<<(std::ostream& os,RDIObjectList& dlist ) ...@@ -2633,7 +2633,7 @@ std::ostream& ModbusRTU::operator<<(std::ostream& os,RDIObjectList& dlist )
if( !dlist.empty() ) if( !dlist.empty() )
{ {
for( RDIObjectList::iterator it=dlist.begin(); it!=dlist.end(); it++ ) for( RDIObjectList::iterator it=dlist.begin(); it!=dlist.end(); it++ )
os << " " << (int)(it->id) << " : " << it->val << endl; os << " " << rdi2str(it->id) << " : " << it->val << endl;
} }
return os; return os;
...@@ -3493,3 +3493,31 @@ void ModbusTCP::MBAPHeader::swapdata() ...@@ -3493,3 +3493,31 @@ void ModbusTCP::MBAPHeader::swapdata()
len = SWAPSHORT(len); len = SWAPSHORT(len);
} }
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
std::string ModbusRTU::rdi2str( int id )
{
if( id == rdiVendorName )
return "VendorName";
if( id == rdiProductCode )
return "ProductName";
if( id == rdiMajorMinorRevision )
return "MajorMinorRevision";
if( id == rdiVendorURL )
return "VendorURL";
if( id == rdiProductName )
return "ProductName";
if( id == rdiModelName )
return "ModelName";
if( id == rdiUserApplicationName )
return "UserApplicationName";
ostringstream s;
s << id;
return s.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