Commit e79adfca authored by Pavel Vainerman's avatar Pavel Vainerman

(modbus0x08): сделал реализацию 0x08 в штатном MBSlave. Исправил обнаруженные ошибки.

parent c425a208
...@@ -395,6 +395,9 @@ ModbusRTU::mbErrCode MBSlave::fileTransfer( ModbusRTU::FileTransferMessage& quer ...@@ -395,6 +395,9 @@ ModbusRTU::mbErrCode MBSlave::fileTransfer( ModbusRTU::FileTransferMessage& quer
ModbusRTU::mbErrCode MBSlave::diagnostics( ModbusRTU::DiagnosticMessage& query, ModbusRTU::mbErrCode MBSlave::diagnostics( ModbusRTU::DiagnosticMessage& query,
ModbusRTU::DiagnosticRetMessage& reply ) ModbusRTU::DiagnosticRetMessage& reply )
{ {
if( verbose )
cout << "(diagnostics): " << query << endl;
if( query.subf == ModbusRTU::subEcho ) if( query.subf == ModbusRTU::subEcho )
{ {
reply = query; reply = query;
......
...@@ -165,7 +165,7 @@ int main( int argc, char **argv ) ...@@ -165,7 +165,7 @@ int main( int argc, char **argv )
subfunc = (ModbusRTU::DiagnosticsSubFunction)uni_atoi(argv[optind]); subfunc = (ModbusRTU::DiagnosticsSubFunction)uni_atoi(argv[optind]);
if( checkArg(optind+1,argc,argv) ) if( checkArg(optind+1,argc,argv) )
count = uni_atoi(argv[optind+1]); dat = uni_atoi(argv[optind+1]);
break; break;
case 'f': case 'f':
...@@ -633,9 +633,9 @@ int main( int argc, char **argv ) ...@@ -633,9 +633,9 @@ int main( int argc, char **argv )
catch( ModbusRTU::mbException& ex ) catch( ModbusRTU::mbException& ex )
{ {
if( ex.err != ModbusRTU::erTimeOut ) if( ex.err != ModbusRTU::erTimeOut )
throw ex; throw ex;
cout << "timeout..." << endl; cout << "timeout..." << endl;
} }
if( ncycles > 0 ) if( ncycles > 0 )
......
...@@ -124,8 +124,10 @@ prefix(prefix) ...@@ -124,8 +124,10 @@ prefix(prefix)
if( findArgParam("--" + prefix + "-allow-setdatetime",conf->getArgc(),conf->getArgv())!=-1 ) if( findArgParam("--" + prefix + "-allow-setdatetime",conf->getArgc(),conf->getArgv())!=-1 )
mbslot->connectSetDateTime( sigc::mem_fun(this, &MBSlave::setDateTime) ); mbslot->connectSetDateTime( sigc::mem_fun(this, &MBSlave::setDateTime) );
mbslot->connectDiagnostics( sigc::mem_fun(this, &MBSlave::diagnostics) );
mbslot->connectFileTransfer( sigc::mem_fun(this, &MBSlave::fileTransfer) ); mbslot->connectFileTransfer( sigc::mem_fun(this, &MBSlave::fileTransfer) );
// mbslot->connectJournalCommand( sigc::mem_fun(this, &MBSlave::journalCommand) ); // mbslot->connectJournalCommand( sigc::mem_fun(this, &MBSlave::journalCommand) );
// mbslot->connectRemoteService( sigc::mem_fun(this, &MBSlave::remoteService) ); // mbslot->connectRemoteService( sigc::mem_fun(this, &MBSlave::remoteService) );
// ------------------------------- // -------------------------------
...@@ -1404,3 +1406,46 @@ ModbusRTU::mbErrCode MBSlave::forceSingleCoil( ModbusRTU::ForceSingleCoilMessage ...@@ -1404,3 +1406,46 @@ ModbusRTU::mbErrCode MBSlave::forceSingleCoil( ModbusRTU::ForceSingleCoilMessage
return ModbusRTU::erOperationFailed; return ModbusRTU::erOperationFailed;
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
ModbusRTU::mbErrCode MBSlave::diagnostics( ModbusRTU::DiagnosticMessage& query,
ModbusRTU::DiagnosticRetMessage& reply )
{
if( query.subf == ModbusRTU::subEcho )
{
reply = query;
return ModbusRTU::erNoError;
}
if( query.subf == ModbusRTU::dgBusErrCount )
{
reply = query;
reply.data[0] = errmap[ModbusRTU::erBadCheckSum];
return ModbusRTU::erNoError;
}
if( query.subf == ModbusRTU::dgMsgSlaveCount || query.subf == ModbusRTU::dgBusMsgCount )
{
reply = query;
reply.data[0] = askCount;
return ModbusRTU::erNoError;
}
if( query.subf == ModbusRTU::dgSlaveNAKCount )
{
reply = query;
reply.data[0] = errmap[erOperationFailed];
return ModbusRTU::erNoError;
}
if( query.subf == ModbusRTU::dgClearCounters )
{
askCount = 0;
errmap[erOperationFailed] = 0;
errmap[ModbusRTU::erBadCheckSum] = 0;
// другие счётчики пока не сбрасываем..
reply = query;
return ModbusRTU::erNoError;
}
return ModbusRTU::erOperationFailed;
}
// -------------------------------------------------------------------------
...@@ -111,6 +111,8 @@ class MBSlave: ...@@ -111,6 +111,8 @@ class MBSlave:
ModbusRTU::mbErrCode fileTransfer( ModbusRTU::FileTransferMessage& query, ModbusRTU::mbErrCode fileTransfer( ModbusRTU::FileTransferMessage& query,
ModbusRTU::FileTransferRetMessage& reply ); ModbusRTU::FileTransferRetMessage& reply );
ModbusRTU::mbErrCode diagnostics( ModbusRTU::DiagnosticMessage& query,
ModbusRTU::DiagnosticRetMessage& reply );
/*! Проверка корректности регистра перед сохранением. /*! Проверка корректности регистра перед сохранением.
Вызывается для каждого регистра не зависимо от используемой функции (06 или 10) Вызывается для каждого регистра не зависимо от используемой функции (06 или 10)
......
...@@ -61,7 +61,7 @@ namespace ModbusRTU ...@@ -61,7 +61,7 @@ namespace ModbusRTU
dgBusMsgCount = 0x0B, /*!< (11) Return Bus Message Count */ dgBusMsgCount = 0x0B, /*!< (11) Return Bus Message Count */
dgBusErrCount = 0x0C, /*!< (12) Return Bus Communication Error Count */ dgBusErrCount = 0x0C, /*!< (12) Return Bus Communication Error Count */
dgBusExceptCount = 0x0D, /*!< (13) Return Bus Exception Error Count */ dgBusExceptCount = 0x0D, /*!< (13) Return Bus Exception Error Count */
dgMsgslavecount = 0x0E, /*!< (14) Return Slave Message Count */ dgMsgSlaveCount = 0x0E, /*!< (14) Return Slave Message Count */
dgNoNoResponseCount = 0x0F, /*!< (15) Return Slave No Response Count */ dgNoNoResponseCount = 0x0F, /*!< (15) Return Slave No Response Count */
dgSlaveNAKCount = 0x10, /*!< (16) Return Slave NAK Count */ dgSlaveNAKCount = 0x10, /*!< (16) Return Slave NAK Count */
dgSlaveBusyCount = 0x11, /*!< (17) Return Slave Busy Count */ dgSlaveBusyCount = 0x11, /*!< (17) Return Slave Busy Count */
......
...@@ -2124,7 +2124,7 @@ int ModbusRTU::szRequestDiagnosticData( DiagnosticsSubFunction f ) ...@@ -2124,7 +2124,7 @@ int ModbusRTU::szRequestDiagnosticData( DiagnosticsSubFunction f )
if( f == dgBusExceptCount ) if( f == dgBusExceptCount )
return 1; return 1;
if( f == dgMsgslavecount ) if( f == dgMsgSlaveCount )
return 1; return 1;
if( f == dgNoNoResponseCount ) if( f == dgNoNoResponseCount )
...@@ -2175,7 +2175,7 @@ void DiagnosticMessage::init( ModbusMessage& m ) ...@@ -2175,7 +2175,7 @@ void DiagnosticMessage::init( ModbusMessage& m )
if( count < 0 ) if( count < 0 )
throw mbException(erBadDataValue); throw mbException(erBadDataValue);
memcpy(&data,&(m.data[1]),sizeof(ModbusData)*count); memcpy(&data,&(m.data[last]),sizeof(ModbusData)*count);
last +=sizeof(ModbusData)*count; last +=sizeof(ModbusData)*count;
// переворачиваем данные // переворачиваем данные
...@@ -2290,8 +2290,16 @@ DiagnosticRetMessage::DiagnosticRetMessage( ModbusAddr a, DiagnosticsSubFunction ...@@ -2290,8 +2290,16 @@ DiagnosticRetMessage::DiagnosticRetMessage( ModbusAddr a, DiagnosticsSubFunction
std::ostream& ModbusRTU::operator<<(std::ostream& os, DiagnosticMessage& m ) std::ostream& ModbusRTU::operator<<(std::ostream& os, DiagnosticMessage& m )
{ {
// return mbPrintMessage(os,(ModbusByte*)(&m), szModbusHeader + m.szData() ); // return mbPrintMessage(os,(ModbusByte*)(&m), szModbusHeader + m.szData() );
return os << "addr=" << addr2str(m.addr) os << "addr=" << addr2str(m.addr)
<< " subf=" << dat2str(m.subf); << " subf=" << dat2str(m.subf)
<< " data[" << m.count << "]={";
for( int i=0; i<m.count; i++ )
os << dat2str(m.data[i]) << " ";
os << "}";
return os;
} }
std::ostream& ModbusRTU::operator<<(std::ostream& os, DiagnosticMessage* m ) std::ostream& ModbusRTU::operator<<(std::ostream& os, DiagnosticMessage* m )
......
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