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,
if( verbose )
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.conformity = 0;
reply.addData(rdiVendorName,"etersoft");
reply.addData(rdiProductCode, PACKAGE_NAME);
reply.addData(rdiMajorMinorRevision,PACKAGE_VERSION);
reply.mf = 0xFF;
reply.conformity = rdevBasicDevice;
reply.addData(query.objID,"etersoft");
// reply.addData(rdiProductCode, PACKAGE_NAME);
// reply.addData(rdiMajorMinorRevision,PACKAGE_VERSION);
return erNoError;
}
else if( query.devID == rdiProductCode )
else if( query.objID == rdiProductCode )
{
reply.mf = 0;
reply.conformity = 0;
reply.addData(rdiProductCode,PACKAGE_NAME);
reply.mf = 0xFF;
reply.conformity = rdevBasicDevice;
reply.addData(query.objID,PACKAGE_NAME);
return erNoError;
}
else if( query.devID == rdiMajorMinorRevision )
else if( query.objID == rdiMajorMinorRevision )
{
reply.mf = 0;
reply.conformity = 0;
reply.addData(rdiMajorMinorRevision,PACKAGE_VERSION);
reply.mf = 0xFF;
reply.conformity = rdevBasicDevice;
reply.addData(query.objID,PACKAGE_VERSION);
return erNoError;
}
return ModbusRTU::erOperationFailed;
else if( query.objID == rdiVendorURL )
{
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,
if( verbose )
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.conformity = 0;
reply.addData(rdiVendorName,"etersoft");
reply.addData(rdiProductCode, PACKAGE_NAME);
reply.addData(rdiMajorMinorRevision,PACKAGE_VERSION);
reply.mf = 0xFF;
reply.conformity = rdevBasicDevice;
reply.addData(query.objID,"etersoft");
// reply.addData(rdiProductCode, PACKAGE_NAME);
// reply.addData(rdiMajorMinorRevision,PACKAGE_VERSION);
return erNoError;
}
else if( query.devID == rdiProductCode )
else if( query.objID == rdiProductCode )
{
reply.mf = 0;
reply.conformity = 0;
reply.addData(rdiProductCode,PACKAGE_NAME);
reply.mf = 0xFF;
reply.conformity = rdevBasicDevice;
reply.addData(query.objID,PACKAGE_NAME);
return erNoError;
}
else if( query.devID == rdiMajorMinorRevision )
else if( query.objID == rdiMajorMinorRevision )
{
reply.mf = 0;
reply.conformity = 0;
reply.addData(rdiMajorMinorRevision,PACKAGE_VERSION);
reply.mf = 0xFF;
reply.conformity = rdevBasicDevice;
reply.addData(query.objID,PACKAGE_VERSION);
return erNoError;
}
return ModbusRTU::erOperationFailed;
else if( query.objID == rdiVendorURL )
{
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
// 0x07 .. 0x7F - reserved
// 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 )
{
os << endl;
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;
......@@ -2633,7 +2633,7 @@ std::ostream& ModbusRTU::operator<<(std::ostream& os,RDIObjectList& dlist )
if( !dlist.empty() )
{
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;
......@@ -3493,3 +3493,31 @@ void ModbusTCP::MBAPHeader::swapdata()
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