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