Commit 2c15e774 authored by Pavel Vainerman's avatar Pavel Vainerman

Сделал новый режим для ModbusSlave: "отвечать на любой адрес"

parent 575753cb
...@@ -20,6 +20,8 @@ class MBTCPServer ...@@ -20,6 +20,8 @@ class MBTCPServer
verbose = state; verbose = state;
} }
inline void setAnyAddressMode(bool set){ if( sslot ) sslot->setAnyAddressMode(set); }
void execute(); /*!< основной цикл работы */ void execute(); /*!< основной цикл работы */
......
...@@ -16,6 +16,7 @@ static struct option longopts[] = { ...@@ -16,6 +16,7 @@ static struct option longopts[] = {
{ "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' },
{ "any-address", no_argument, 0, 'b' },
{ NULL, 0, 0, 0 } { NULL, 0, 0, 0 }
}; };
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
...@@ -27,6 +28,7 @@ static void print_help() ...@@ -27,6 +28,7 @@ static void print_help()
printf("[-i|--iaddr] ip - Server listen ip. Default 127.0.0.1\n"); printf("[-i|--iaddr] ip - Server listen 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 - Server port. Default: 502.\n"); printf("[-p|--port] port - Server port. Default: 502.\n");
printf("[-b|--any-address] - Respond for any RTU address. Ignore [--myaddr|-a]\n");
printf("[-v|--verbose] - Print all messages to stdout\n"); printf("[-v|--verbose] - Print all messages to stdout\n");
} }
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
...@@ -36,6 +38,7 @@ int main( int argc, char **argv ) ...@@ -36,6 +38,7 @@ int main( int argc, char **argv )
int opt = 0; int opt = 0;
int verb = 0; int verb = 0;
int port = 502; int port = 502;
int anyaddr = 0;
string iaddr("127.0.0.1"); string iaddr("127.0.0.1");
ModbusRTU::ModbusAddr myaddr = 0x01; ModbusRTU::ModbusAddr myaddr = 0x01;
int tout = 2000; int tout = 2000;
...@@ -45,7 +48,7 @@ int main( int argc, char **argv ) ...@@ -45,7 +48,7 @@ int main( int argc, char **argv )
try try
{ {
while( (opt = getopt_long(argc, argv, "ht:va:p:i:",longopts,&optindex)) != -1 ) while( (opt = getopt_long(argc, argv, "ht:va:p:i:b",longopts,&optindex)) != -1 )
{ {
switch (opt) switch (opt)
{ {
...@@ -73,6 +76,10 @@ int main( int argc, char **argv ) ...@@ -73,6 +76,10 @@ int main( int argc, char **argv )
verb = 1; verb = 1;
break; break;
case 'b':
anyaddr = 1;
break;
case '?': case '?':
default: default:
printf("? argumnet\n"); printf("? argumnet\n");
...@@ -83,7 +90,7 @@ int main( int argc, char **argv ) ...@@ -83,7 +90,7 @@ int main( int argc, char **argv )
if( verb ) if( verb )
{ {
cout << "(init): iaddr: " << iaddr << ":" << port cout << "(init): iaddr: " << iaddr << ":" << port
<< " myaddr=" << ModbusRTU::addr2str(myaddr) << " myaddr=" << ( anyaddr ? "'any'" : ModbusRTU::addr2str(myaddr) )
<< " timeout=" << tout << " msec " << " timeout=" << tout << " msec "
<< endl; << endl;
...@@ -93,6 +100,7 @@ int main( int argc, char **argv ) ...@@ -93,6 +100,7 @@ int main( int argc, char **argv )
MBTCPServer mbs(myaddr,iaddr,port,verb); MBTCPServer mbs(myaddr,iaddr,port,verb);
mbs.setLog(dlog); mbs.setLog(dlog);
mbs.setVerbose(verb); mbs.setVerbose(verb);
mbs.setAnyAddressMode(anyaddr);
mbs.execute(); mbs.execute();
} }
catch( ModbusRTU::mbException& ex ) catch( ModbusRTU::mbException& ex )
......
...@@ -49,6 +49,9 @@ class ModbusServer ...@@ -49,6 +49,9 @@ class ModbusServer
inline void setBroadcastMode( bool set ){ onBroadcast = set; } inline void setBroadcastMode( bool set ){ onBroadcast = set; }
inline bool getBroadcastMode(){ return onBroadcast; } inline bool getBroadcastMode(){ return onBroadcast; }
inline void setAnyAddressMode( bool set ){ anyAddr = set; }
inline bool getAnyAddressMode(){ return anyAddr; }
/*! Вспомогательная функция реализующая обработку запроса на установку времени. /*! Вспомогательная функция реализующая обработку запроса на установку времени.
Основана на использовании gettimeofday и settimeofday. Основана на использовании gettimeofday и settimeofday.
...@@ -202,6 +205,7 @@ class ModbusServer ...@@ -202,6 +205,7 @@ class ModbusServer
timeout_t replyTimeout_ms; /*!< таймаут на формирование ответа */ timeout_t replyTimeout_ms; /*!< таймаут на формирование ответа */
timeout_t aftersend_msec; /*!< пауза после посылки ответа */ timeout_t aftersend_msec; /*!< пауза после посылки ответа */
bool onBroadcast; /*!< включен режим работы с broadcst-сообщениями */ bool onBroadcast; /*!< включен режим работы с broadcst-сообщениями */
bool anyAddr; /*!< режим обработки запросов на любой адрес устройства */
bool crcNoCheckit; bool crcNoCheckit;
void printProcessingTime(); void printProcessingTime();
......
...@@ -18,6 +18,7 @@ ModbusServer::ModbusServer(): ...@@ -18,6 +18,7 @@ ModbusServer::ModbusServer():
replyTimeout_ms(2000), replyTimeout_ms(2000),
aftersend_msec(0), aftersend_msec(0),
onBroadcast(false), onBroadcast(false),
anyAddr(false),
crcNoCheckit(false) crcNoCheckit(false)
{ {
tmProcessing.setTiming(replyTimeout_ms); tmProcessing.setTiming(replyTimeout_ms);
...@@ -470,7 +471,7 @@ mbErrCode ModbusServer::recv( ModbusRTU::ModbusAddr addr, ModbusMessage& rbuf, t ...@@ -470,7 +471,7 @@ mbErrCode ModbusServer::recv( ModbusRTU::ModbusAddr addr, ModbusMessage& rbuf, t
while( !tmAbort.checkTime() ) while( !tmAbort.checkTime() )
{ {
bcnt = getNextData((unsigned char*)(&rbuf),sizeof(ModbusAddr)); bcnt = getNextData((unsigned char*)(&rbuf),sizeof(ModbusAddr));
if( bcnt>0 && ( rbuf.addr==addr || (onBroadcast && rbuf.addr==BroadcastAddr) ) ) if( bcnt>0 && ( rbuf.addr==addr || anyAddr || (onBroadcast && rbuf.addr==BroadcastAddr) ) )
{ {
begin = true; begin = true;
break; break;
......
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