22 #include <unordered_map>
27 #include "modbus/ModbusTypes.h"
33 class ModbusRTUMaster;
58 std::string type2str( MTRType t );
59 MTRType str2type(
const std::string& s );
60 size_t wsize( MTRType t );
63 const ModbusRTU::ModbusData regModelNumber = 0x01;
64 const ModbusRTU::ModbusData regSerialNumber = 0x09;
66 std::string getModelNumber( ModbusRTUMaster* mb, ModbusRTU::ModbusAddr addr );
67 std::string getSerialNumber( ModbusRTUMaster* mb, ModbusRTU::ModbusAddr addr );
70 const ModbusRTU::ModbusData regUpdateConfiguration = 53;
71 const ModbusRTU::ModbusData regAddress = 55;
72 const ModbusRTU::ModbusData regBaudRate = 56;
73 const ModbusRTU::ModbusData regStopBit = 57;
74 const ModbusRTU::ModbusData regParity = 58;
75 const ModbusRTU::ModbusData regDataBits = 59;
102 bool setAddress( ModbusRTUMaster* mb, ModbusRTU::ModbusAddr addr, ModbusRTU::ModbusAddr newAddr );
103 bool setBaudRate( ModbusRTUMaster* mb, ModbusRTU::ModbusAddr addr, mtrBaudRate br );
104 bool setStopBit( ModbusRTUMaster* mb, ModbusRTU::ModbusAddr addr,
bool state );
105 bool setParity( ModbusRTUMaster* mb, ModbusRTU::ModbusAddr addr, mtrParity p );
106 bool setDataBits( ModbusRTUMaster* mb, ModbusRTU::ModbusAddr addr, mtrDataBits d );
107 ComPort::Parity get_parity( ModbusRTU::ModbusData data );
108 ComPort::Speed get_speed( ModbusRTU::ModbusData data );
118 std::ostream& operator<<(std::ostream& os, MTRError& e );
120 MTRError update_configuration( ModbusRTUMaster* mb, ModbusRTU::ModbusAddr addr,
121 const std::string& mtrconfile,
int verbose = 0 );
124 typedef std::list<ModbusRTU::ModbusData> DataList;
125 typedef std::unordered_map<ModbusRTU::ModbusData, DataList> DataMap;
126 const int attempts = 3;
127 static const ModbusRTU::ModbusData skip[] = {48, 49, 59};
129 bool send_param( ModbusRTUMaster* mb, DataMap& dmap, ModbusRTU::ModbusAddr addr,
int verb );
130 bool read_param(
const std::string& str, std::string& str1, std::string& str2 );
131 DataMap read_confile(
const std::string& f );
132 void update_communication_params( ModbusRTU::ModbusAddr reg, ModbusRTU::ModbusData data,
133 ModbusRTUMaster* mb, ModbusRTU::ModbusAddr& addr,
int verb );
135 static const size_t u2size = 2;
141 T1(
unsigned short v ): val(v) {}
142 T1(
const ModbusRTU::ModbusData* data ): val(data[0]) {}
158 std::ostream& operator<<(std::ostream& os, T1& t );
164 T2(
signed short v ): val(v) {}
165 T2(
const ModbusRTU::ModbusData* data ): val(data[0]) {}
181 std::ostream& operator<<(std::ostream& os, T2& t );
190 unsigned short v[u2size];
197 memset(raw.v, 0,
sizeof(raw.v));
205 T3(
unsigned short v1,
unsigned short v2 )
211 T3(
const ModbusRTU::ModbusData* data,
size_t size )
242 std::ostream& operator<<(std::ostream& os, T3& t );
249 T4(): sval(
""), raw(0) {}
250 T4( uint16_t v1 ): raw(v1)
255 sval = std::string(c);
258 T4(
const ModbusRTU::ModbusData* data ):
262 memcpy(c, &(data[0]), 2);
264 sval = std::string(c);
283 std::ostream& operator<<(std::ostream& os, T4& t );
292 unsigned short v[u2size];
295 unsigned int val: 24;
297 } __attribute__( ( packed ) ) u2;
304 memset(raw.v, 0,
sizeof(raw.v));
306 T5(
unsigned short v1,
unsigned short v2 )
310 val = raw.u2.val * pow( (
long)10, (
long)raw.u2.exp );
316 val = raw.u2.val * pow( (
long)10, (
long)raw.u2.exp );
319 T5(
const ModbusRTU::ModbusData* data,
size_t size ): val(0)
326 val = raw.u2.val * pow( (
long)10, (
long)raw.u2.exp );
346 std::ostream& operator<<(std::ostream& os, T5& t );
355 unsigned short v[u2size];
367 memset(raw.v, 0,
sizeof(raw.v));
369 T6(
unsigned short v1,
unsigned short v2 )
373 val = raw.u2.val * pow( (
long)10, (
long)raw.u2.exp );
379 val = raw.u2.val * pow( (
long)10, (
long)raw.u2.exp );
382 T6(
const ModbusRTU::ModbusData* data,
size_t size )
389 val = raw.u2.val * pow( (
long)10, (
long)raw.u2.exp );
406 double val = { 0.0 };
409 std::ostream& operator<<(std::ostream& os, T6& t );
418 unsigned short v[u2size];
421 unsigned int val: 16;
424 } __attribute__( ( packed ) ) u2;
431 memset(raw.v, 0,
sizeof(raw.v));
433 T7(
unsigned short v1,
unsigned short v2 )
437 val = raw.u2.val * pow( (
long)10, (
long) - 4 );
442 val = raw.u2.val * pow( (
long)10, (
long) - 4 );
445 T7(
const ModbusRTU::ModbusData* data,
size_t size )
452 val = raw.u2.val * pow( (
long)10, (
long) - 4 );
469 double val = { 0.0 };
472 std::ostream& operator<<(std::ostream& os, T7& t );
481 unsigned short v[u2size];
484 unsigned short mon: 8;
485 unsigned short day: 8;
486 unsigned short hour: 8;
487 unsigned short min: 8;
488 } __attribute__( ( packed ) ) u2;
494 memset(raw.v, 0,
sizeof(raw.v));
496 T8(
unsigned short v1,
unsigned short v2 )
502 T8(
const ModbusRTU::ModbusData* data,
size_t size )
512 inline unsigned short day()
516 inline unsigned short mon()
520 inline unsigned short hour()
524 inline unsigned short min()
544 std::ostream& operator<<(std::ostream& os, T8& t );
553 unsigned short v[u2size];
556 unsigned short hour: 8;
557 unsigned short min: 8;
558 unsigned short sec: 8;
559 unsigned short ssec: 8;
560 } __attribute__( ( packed ) ) u2;
566 memset(raw.v, 0,
sizeof(raw.v));
568 T9(
unsigned short v1,
unsigned short v2 )
574 T9(
const ModbusRTU::ModbusData* data,
size_t size )
584 inline unsigned short hour()
588 inline unsigned short min()
592 inline unsigned short sec()
596 inline unsigned short ssec()
616 std::ostream& operator<<(std::ostream& os, T9& t );
625 unsigned short v[u2size];
628 unsigned short year: 16;
629 unsigned short mon: 8;
630 unsigned short day: 8;
631 } __attribute__( ( packed ) ) u2;
637 memset(raw.v, 0,
sizeof(raw.v));
639 T10(
unsigned short v1,
unsigned short v2 )
645 T10(
const ModbusRTU::ModbusData* data,
size_t size )
655 inline unsigned short year()
659 inline unsigned short mon()
663 inline unsigned short day()
683 std::ostream& operator<<(std::ostream& os, T10& t );
690 T16(
unsigned short v ): val(v)
692 fval = (float)(val) / 100.0;
694 T16(
const ModbusRTU::ModbusData* data ): val(data[0])
696 fval = (float)(val) / 100.0;
698 T16(
float f ): fval(f)
700 val = lroundf(fval * 100);
720 operator unsigned short()
725 unsigned short val = { 0 };
726 float fval = { 0.0 };
728 std::ostream& operator<<(std::ostream& os, T16& t );
734 T17(
signed short v ): val(v)
736 fval = (float)(v) / 100.0;
738 T17(
unsigned short v ): val(v)
740 fval = (float)( (
signed short)(v) ) / 100.0;
743 T17(
const ModbusRTU::ModbusData* data ): val(data[0])
745 fval = (float)(val) / 100.0;
747 T17(
float f ): fval(f)
749 val = lroundf(fval * 100);
768 operator signed short()
773 signed short val = { 0 };
776 std::ostream& operator<<(std::ostream& os, T17& t );
792 memset(raw.v, 0,
sizeof(raw.v));
794 F1(
unsigned short v1,
unsigned short v2 )
805 F1(
const ModbusRTU::ModbusData* data,
size_t size )
834 return lroundf(raw.val);
839 std::ostream& operator<<(std::ostream& os, F1& t );
850 ModbusRTU::ModbusData data[8];
852 for(
int i = 0; i < 8; i++ )
853 data[i] = ModbusRTU::SWAPSHORT(ret.
data[i]);
855 memcpy(c, &data, 16);
857 sval = std::string(c);
875 std::ostream& operator<<(std::ostream& os, T_Str16& t );
887 ModbusRTU::ModbusData data[4];
889 for(
int i = 0; i < 4; i++ )
890 data[i] = ModbusRTU::SWAPSHORT(ret.
data[i]);
894 sval = std::string(c);
912 std::ostream& operator<<(std::ostream& os, T_Str8& t );