Commit a5eb2517 authored by Pavel Vainerman's avatar Pavel Vainerman

(modbus0x08): сделал в утилитах для тестирования "ответы на разные subfunction".

parent dc386c5d
...@@ -404,6 +404,33 @@ ModbusRTU::mbErrCode MBSlave::diagnostics( ModbusRTU::DiagnosticMessage& query, ...@@ -404,6 +404,33 @@ ModbusRTU::mbErrCode MBSlave::diagnostics( ModbusRTU::DiagnosticMessage& query,
return ModbusRTU::erNoError; return ModbusRTU::erNoError;
} }
if( query.subf == ModbusRTU::dgBusErrCount )
{
reply = query;
reply.data[0] = 10;
return ModbusRTU::erNoError;
}
if( query.subf == ModbusRTU::dgMsgSlaveCount || query.subf == ModbusRTU::dgBusMsgCount )
{
reply = query;
reply.data[0] = 10;
return ModbusRTU::erNoError;
}
if( query.subf == ModbusRTU::dgSlaveNAKCount )
{
reply = query;
reply.data[0] = 10;
return ModbusRTU::erNoError;
}
if( query.subf == ModbusRTU::dgClearCounters )
{
reply = query;
return ModbusRTU::erNoError;
}
return ModbusRTU::erOperationFailed; return ModbusRTU::erOperationFailed;
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
......
...@@ -40,6 +40,7 @@ MBTCPServer::MBTCPServer( ModbusAddr myaddr, const string inetaddr, int port, bo ...@@ -40,6 +40,7 @@ MBTCPServer::MBTCPServer( ModbusAddr myaddr, const string inetaddr, int port, bo
sslot->connectForceCoils( sigc::mem_fun(this, &MBTCPServer::forceMultipleCoils) ); sslot->connectForceCoils( sigc::mem_fun(this, &MBTCPServer::forceMultipleCoils) );
sslot->connectWriteOutput( sigc::mem_fun(this, &MBTCPServer::writeOutputRegisters) ); sslot->connectWriteOutput( sigc::mem_fun(this, &MBTCPServer::writeOutputRegisters) );
sslot->connectWriteSingleOutput( sigc::mem_fun(this, &MBTCPServer::writeOutputSingleRegister) ); sslot->connectWriteSingleOutput( sigc::mem_fun(this, &MBTCPServer::writeOutputSingleRegister) );
sslot->connectDiagnostics( sigc::mem_fun(this, &MBTCPServer::diagnostics) );
sslot->connectJournalCommand( sigc::mem_fun(this, &MBTCPServer::journalCommand) ); sslot->connectJournalCommand( sigc::mem_fun(this, &MBTCPServer::journalCommand) );
sslot->connectSetDateTime( sigc::mem_fun(this, &MBTCPServer::setDateTime) ); sslot->connectSetDateTime( sigc::mem_fun(this, &MBTCPServer::setDateTime) );
sslot->connectRemoteService( sigc::mem_fun(this, &MBTCPServer::remoteService) ); sslot->connectRemoteService( sigc::mem_fun(this, &MBTCPServer::remoteService) );
...@@ -393,3 +394,43 @@ ModbusRTU::mbErrCode MBTCPServer::fileTransfer( ModbusRTU::FileTransferMessage& ...@@ -393,3 +394,43 @@ ModbusRTU::mbErrCode MBTCPServer::fileTransfer( ModbusRTU::FileTransferMessage&
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
ModbusRTU::mbErrCode MBTCPServer::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] = 10;
return ModbusRTU::erNoError;
}
if( query.subf == ModbusRTU::dgMsgSlaveCount || query.subf == ModbusRTU::dgBusMsgCount )
{
reply = query;
reply.data[0] = 10;
return ModbusRTU::erNoError;
}
if( query.subf == ModbusRTU::dgSlaveNAKCount )
{
reply = query;
reply.data[0] = 10;
return ModbusRTU::erNoError;
}
if( query.subf == ModbusRTU::dgClearCounters )
{
reply = query;
return ModbusRTU::erNoError;
}
return ModbusRTU::erOperationFailed;
}
// -------------------------------------------------------------------------
...@@ -63,6 +63,10 @@ class MBTCPServer ...@@ -63,6 +63,10 @@ class MBTCPServer
ModbusRTU::mbErrCode writeOutputSingleRegister( ModbusRTU::WriteSingleOutputMessage& query, ModbusRTU::mbErrCode writeOutputSingleRegister( ModbusRTU::WriteSingleOutputMessage& query,
ModbusRTU::WriteSingleOutputRetMessage& reply ); ModbusRTU::WriteSingleOutputRetMessage& reply );
ModbusRTU::mbErrCode diagnostics( ModbusRTU::DiagnosticMessage& query,
ModbusRTU::DiagnosticRetMessage& reply );
/*! обработка запросов на чтение ошибок */ /*! обработка запросов на чтение ошибок */
ModbusRTU::mbErrCode journalCommand( ModbusRTU::JournalCommandMessage& query, ModbusRTU::mbErrCode journalCommand( ModbusRTU::JournalCommandMessage& query,
ModbusRTU::JournalCommandRetMessage& reply ); ModbusRTU::JournalCommandRetMessage& reply );
......
...@@ -19,7 +19,7 @@ static struct option longopts[] = { ...@@ -19,7 +19,7 @@ static struct option longopts[] = {
{ "write06", required_argument, 0, 'z' }, { "write06", required_argument, 0, 'z' },
{ "write0F", required_argument, 0, 'm' }, { "write0F", required_argument, 0, 'm' },
{ "write10", required_argument, 0, 'w' }, { "write10", required_argument, 0, 'w' },
{"diag08", required_argument, 0, 'o' }, { "diag08", required_argument, 0, 'o' },
// { "readfile14", required_argument, 0, 'g' }, // { "readfile14", required_argument, 0, 'g' },
// { "writefile15", required_argument, 0, 'p' }, // { "writefile15", required_argument, 0, 'p' },
{ "filetransfer66", required_argument, 0, 'u' }, { "filetransfer66", required_argument, 0, 'u' },
......
...@@ -18,12 +18,14 @@ static struct option longopts[] = { ...@@ -18,12 +18,14 @@ static struct option longopts[] = {
{ "write06", required_argument, 0, 'z' }, { "write06", required_argument, 0, 'z' },
{ "write0F", required_argument, 0, 'm' }, { "write0F", required_argument, 0, 'm' },
{ "write10", required_argument, 0, 'w' }, { "write10", required_argument, 0, 'w' },
{ "diag08", required_argument, 0, 'd' },
{ "iaddr", required_argument, 0, 'i' }, { "iaddr", required_argument, 0, 'i' },
{ "verbose", no_argument, 0, 'v' }, { "verbose", no_argument, 0, 'v' },
{ "myaddr", required_argument, 0, 'a' }, { "myaddr", required_argument, 0, 'a' },
{ "port", required_argument, 0, 'p' }, { "port", required_argument, 0, 'p' },
{ "persistent-connection", no_argument, 0, 'o' }, { "persistent-connection", no_argument, 0, 'o' },
{ "num-cycles", required_argument, 0, 'l' }, { "num-cycles", required_argument, 0, 'l' },
{ NULL, 0, 0, 0 } { NULL, 0, 0, 0 }
}; };
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
...@@ -38,6 +40,7 @@ static void print_help() ...@@ -38,6 +40,7 @@ static void print_help()
printf("[--read02] slaveaddr reg count - read from reg (from slaveaddr). Default: count=1\n"); printf("[--read02] slaveaddr reg count - read from reg (from slaveaddr). Default: count=1\n");
printf("[--read03] slaveaddr reg count - read from reg (from slaveaddr). Default: count=1\n"); printf("[--read03] slaveaddr reg count - read from reg (from slaveaddr). Default: count=1\n");
printf("[--read04] slaveaddr reg count - read from reg (from slaveaddr). Default: count=1\n"); printf("[--read04] slaveaddr reg count - read from reg (from slaveaddr). Default: count=1\n");
printf("[--diag08] slaveaddr subfunc [dat] - diagnostics request\n");
printf("[-i|--iaddr] ip - Modbus server ip. Default: 127.0.0.1\n"); printf("[-i|--iaddr] ip - Modbus server ip. Default: 127.0.0.1\n");
printf("[-a|--myaddr] addr - Modbus address for master. Default: 0x01.\n"); printf("[-a|--myaddr] addr - Modbus address for master. Default: 0x01.\n");
printf("[-p|--port] port - Modbus server port. Default: 502.\n"); printf("[-p|--port] port - Modbus server port. Default: 502.\n");
...@@ -57,7 +60,8 @@ enum Command ...@@ -57,7 +60,8 @@ enum Command
cmdWrite05, cmdWrite05,
cmdWrite06, cmdWrite06,
cmdWrite0F, cmdWrite0F,
cmdWrite10 cmdWrite10,
cmdDiag
}; };
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
static char* checkArg( int ind, int argc, char* argv[] ); static char* checkArg( int ind, int argc, char* argv[] );
...@@ -77,13 +81,15 @@ int main( int argc, char **argv ) ...@@ -77,13 +81,15 @@ int main( int argc, char **argv )
ModbusRTU::ModbusData count = 1; ModbusRTU::ModbusData count = 1;
ModbusRTU::ModbusAddr myaddr = 0x01; ModbusRTU::ModbusAddr myaddr = 0x01;
ModbusRTU::ModbusAddr slaveaddr = 0x00; ModbusRTU::ModbusAddr slaveaddr = 0x00;
ModbusRTU::DiagnosticsSubFunction subfunc = ModbusRTU::subEcho;
ModbusRTU::ModbusData dat = 0;
int tout = 2000; int tout = 2000;
DebugStream dlog; DebugStream dlog;
int ncycles = -1; int ncycles = -1;
try try
{ {
while( (opt = getopt_long(argc, argv, "hva:w:z:r:x:c:b:d:s:t:p:i:ol:",longopts,&optindex)) != -1 ) while( (opt = getopt_long(argc, argv, "hva:w:z:r:x:c:b:d:s:t:p:i:ol:d:",longopts,&optindex)) != -1 )
{ {
switch (opt) switch (opt)
{ {
...@@ -189,6 +195,23 @@ int main( int argc, char **argv ) ...@@ -189,6 +195,23 @@ int main( int argc, char **argv )
ncycles = uni_atoi(optarg); ncycles = uni_atoi(optarg);
break; break;
case 'd':
cmd = cmdDiag;
slaveaddr = ModbusRTU::str2mbAddr( optarg );
if( !checkArg(optind,argc,argv) )
{
cerr << "diagnostic command error: bad or no arguments..." << endl;
return 1;
}
else
subfunc = (ModbusRTU::DiagnosticsSubFunction)uni_atoi(argv[optind]);
if( checkArg(optind+1,argc,argv) )
dat = uni_atoi(argv[optind+1]);
break;
case '?': case '?':
default: default:
printf("? argumnet\n"); printf("? argumnet\n");
...@@ -403,6 +426,31 @@ int main( int argc, char **argv ) ...@@ -403,6 +426,31 @@ int main( int argc, char **argv )
} }
break; break;
case cmdDiag:
{
if( verb )
{
cout << "diag08: slaveaddr=" << ModbusRTU::addr2str(slaveaddr)
<< " subfunc=" << ModbusRTU::dat2str(subfunc) << "(" << (int)subfunc << ")"
<< " dat=" << ModbusRTU::dat2str(dat) << "(" << (int)dat << ")"
<< endl;
}
ModbusRTU::DiagnosticRetMessage ret = mb.diag08(slaveaddr,subfunc,dat);
if( verb )
cout << "(reply): " << ret << endl;
cout << "(reply): count=" << ModbusRTU::dat2str(ret.count) << endl;
for( int i=0; i<ret.count; i++ )
{
cout << i <<": (" << ModbusRTU::dat2str( reg + i ) << ") = " << (int)(ret.data[i])
<< " ("
<< ModbusRTU::dat2str(ret.data[i])
<< ")"
<< endl;
}
}
break;
case cmdNOP: case cmdNOP:
default: default:
cerr << "No command. Use -h for help." << endl; cerr << "No command. Use -h for help." << endl;
......
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