10 #include "ModbusRTUErrors.h" 28 typedef uint8_t ModbusByte;
29 const size_t BitsPerByte = 8;
30 typedef uint8_t ModbusAddr;
31 typedef uint16_t ModbusData;
32 const size_t BitsPerData = 16;
33 typedef uint16_t ModbusCRC;
37 enum SlaveFunctionCode
40 fnReadCoilStatus = 0x01,
41 fnReadInputStatus = 0x02,
42 fnReadOutputRegisters = 0x03,
43 fnReadInputRegisters = 0x04,
44 fnForceSingleCoil = 0x05,
45 fnWriteOutputSingleRegister = 0x06,
47 fnForceMultipleCoils = 0x0F,
48 fnWriteOutputRegisters = 0x10,
49 fnReadFileRecord = 0x14,
50 fnWriteFileRecord = 0x15,
53 fnRemoteService = 0x53,
54 fnJournalCommand = 0x65,
59 enum DiagnosticsSubFunction
67 dgClearCounters = 0x0A,
70 dgBusExceptCount = 0x0D,
71 dgMsgSlaveCount = 0x0E,
72 dgNoNoResponseCount = 0x0F,
73 dgSlaveNAKCount = 0x10,
74 dgSlaveBusyCount = 0x11,
75 dgBusCharOverrunCount = 0x12,
77 dgClearOverrunCounter = 0x14
82 typedef unsigned long RegID;
90 RegID genRegID(
const ModbusRTU::ModbusData r,
const int fn );
94 ssize_t szRequestDiagnosticData( DiagnosticsSubFunction f );
100 rdiProductCode = 0x1,
101 rdiMajorMinorRevision = 0x2,
103 rdiProductName = 0x4,
105 rdiUserApplicationName = 0x6
111 enum RDIRequestDeviceID
114 rdevBasicDevice = 0x1,
115 rdevRegularDevice = 0x2,
116 rdevExtentedDevice = 0x3,
117 rdevSpecificDevice = 0x4,
121 std::string rdi2str(
int id );
137 const unsigned char MBErrMask = 0x80;
139 uint16_t SWAPSHORT( uint16_t x );
142 ModbusCRC checkCRC( ModbusByte* start,
size_t len );
143 const size_t szCRC =
sizeof(ModbusCRC);
146 std::ostream& mbPrintMessage(std::ostream& os, ModbusByte* b,
size_t len );
148 ModbusAddr str2mbAddr(
const std::string& val );
149 ModbusData str2mbData(
const std::string& val );
150 std::string dat2str(
const ModbusData dat );
151 std::string addr2str(
const ModbusAddr addr );
152 std::string b2str(
const ModbusByte b );
154 float dat2f(
const ModbusData dat1,
const ModbusData dat2 );
155 size_t numBytes(
const size_t nbits );
157 bool isWriteFunction( SlaveFunctionCode c );
158 bool isReadFunction( SlaveFunctionCode c );
167 } __attribute__((packed));
171 std::ostream& operator<<(std::ostream& os,
const ModbusHeader& m );
172 std::ostream& operator<<(std::ostream& os,
const ModbusHeader* m );
176 ModbusRTU::ModbusData
tID;
177 ModbusRTU::ModbusData
pID;
178 ModbusRTU::ModbusData
len;
184 } __attribute__((packed));
186 std::ostream& operator<<(std::ostream& os,
const MBAPHeader& m );
201 inline ModbusByte
func()
const 205 inline ModbusAddr
addr()
const 209 inline ModbusRTU::ModbusData tID()
const 213 inline ModbusRTU::ModbusData pID()
const 217 inline ModbusRTU::ModbusData aduLen()
const 223 ModbusRTU::ModbusData len()
const;
225 void makeMBAPHeader( ModbusRTU::ModbusData tID,
bool noCRC =
true, ModbusRTU::ModbusData pID = 0 );
227 ModbusRTU::ModbusData pduLen()
const;
228 ModbusCRC pduCRC(
size_t len )
const;
229 static size_t maxSizeOfMessage();
235 ModbusByte data[MAXLENPACKET + szCRC];
239 } __attribute__((packed));
241 std::ostream& operator<<(std::ostream& os,
const ModbusMessage& m );
242 std::ostream& operator<<(std::ostream& os,
const ModbusMessage* m );
248 ModbusByte ecode = { erNoError };
249 ModbusCRC crc = { 0 };
257 ErrorRetMessage( ModbusAddr _from, ModbusByte _func, ModbusByte ecode );
267 return sizeof(ModbusByte) + szCRC;
280 const DataBits& operator=(
const ModbusByte& r);
282 operator ModbusByte();
285 bool operator[](
const size_t i )
289 void set(
int n,
bool s )
294 std::bitset<BitsPerByte> b;
297 std::ostream& operator<<(std::ostream& os,
DataBits& m );
298 std::ostream& operator<<(std::ostream& os,
DataBits* m );
306 const DataBits16& operator=(
const ModbusData& r);
308 operator ModbusData();
309 ModbusData mdata()
const;
311 bool operator[](
const size_t i )
315 void set(
int n,
bool s )
320 std::bitset<BitsPerData> b;
323 std::ostream& operator<<(std::ostream& os,
DataBits16& m );
324 std::ostream& operator<<(std::ostream& os,
DataBits16* m );
330 ModbusData start = { 0 };
331 ModbusData count = { 0 };
332 ModbusCRC crc = { 0 };
347 return sizeof(ModbusData) * 2 + szCRC;
350 } __attribute__((packed));
361 ModbusByte bcnt = { 0 };
362 ModbusByte data[MAXLENPACKET];
374 return sizeof(ModbusByte);
379 ModbusCRC crc = { 0 };
397 bool setBit( uint8_t dnum, uint8_t bnum,
bool state );
405 bool getData( uint8_t bnum,
DataBits& d )
const;
413 return ( (
int)bcnt >= MAXPDULEN );
417 size_t szData()
const;
430 ModbusData start = { 0 };
431 ModbusData count = { 0 };
432 ModbusCRC crc = { 0 };
449 return sizeof(ModbusData) * 2 + szCRC;
452 } __attribute__((packed));
461 ModbusByte bcnt = { 0 };
462 ModbusByte data[MAXLENPACKET];
474 return sizeof(ModbusByte);
479 ModbusCRC crc = { 0 };
497 bool setBit( uint8_t dnum, uint8_t bnum,
bool state );
505 bool getData( uint8_t dnum,
DataBits& d )
const;
513 return ( (
int)bcnt >= MAXPDULEN );
517 size_t szData()
const;
531 ModbusData start = { 0 };
532 ModbusData count = { 0 };
533 ModbusCRC crc = { 0 };
548 return sizeof(ModbusData) * 2 + szCRC;
551 } __attribute__((packed));
560 ModbusByte bcnt = { 0 };
561 ModbusData data[MAXLENPACKET /
sizeof(ModbusData)];
573 return sizeof(ModbusByte);
578 ModbusCRC crc = { 0 };
587 bool addData( ModbusData d );
595 return ( count *
sizeof(ModbusData) >= MAXLENPACKET );
599 size_t szData()
const;
609 size_t count = { 0 };
619 ModbusData start = { 0 };
620 ModbusData count = { 0 };
621 ModbusCRC crc = { 0 };
636 return sizeof(ModbusData) * 2 + szCRC;
639 } __attribute__((packed));
649 ModbusByte bcnt = { 0 };
650 ModbusData data[MAXLENPACKET /
sizeof(ModbusData)];
662 return sizeof(ModbusByte);
667 ModbusCRC crc = { 0 };
676 bool addData( ModbusData d );
684 return ( count *
sizeof(ModbusData) >= MAXLENPACKET );
700 size_t count = { 0 };
710 ModbusData start = { 0 };
711 ModbusData quant = { 0 };
712 ModbusByte bcnt = { 0 };
714 ModbusByte data[MAXLENPACKET -
sizeof(ModbusData) * 2 -
sizeof(ModbusByte)];
715 ModbusCRC crc = { 0 };
730 int addBit(
bool state );
732 bool setBit( uint8_t nbit,
bool state );
734 inline size_t last()
const 745 bool getData( uint8_t dnum,
DataBits& d );
748 inline bool isFull()
const 750 return ( (
int)bcnt >= MAXPDULEN );
759 size_t szData()
const;
767 return sizeof(ModbusData) * 2 +
sizeof(ModbusByte);
776 bool checkFormat()
const;
778 } __attribute__((packed));
787 ModbusData start = { 0 };
788 ModbusData quant = { 0 };
789 ModbusCRC crc = { 0 };
805 void set( ModbusData start, ModbusData quant );
815 return sizeof(ModbusData) * 2 +
sizeof(ModbusCRC);
827 ModbusData start = { 0 };
828 ModbusData quant = { 0 };
829 ModbusByte bcnt = { 0 };
831 ModbusData data[MAXLENPACKET /
sizeof(ModbusData) -
sizeof(ModbusData) * 2 -
sizeof(ModbusByte)];
832 ModbusCRC crc = { 0 };
839 bool addData( ModbusData d );
841 inline bool isFull()
const 843 return ( quant >= MAXDATALEN );
852 size_t szData()
const;
860 return sizeof(ModbusData) * 2 +
sizeof(ModbusByte);
869 bool checkFormat()
const;
871 } __attribute__((packed));
881 ModbusData start = { 0 };
882 ModbusData quant = { 0 };
888 ModbusCRC crc = { 0 };
899 void set( ModbusData start, ModbusData quant );
909 return sizeof(ModbusData) * 2 +
sizeof(ModbusCRC);
920 ModbusData start = { 0 };
921 ModbusData data = { 0 };
922 ModbusCRC crc = { 0 };
927 return (data & 0xFF00);
941 size_t szData()
const;
948 return sizeof(ModbusData);
959 bool checkFormat()
const;
960 } __attribute__((packed));
971 ModbusData start = { 0 };
972 ModbusData data = { 0 };
973 ModbusCRC crc = { 0 };
978 return (data & 0xFF00);
994 void set( ModbusData start,
bool cmd );
1004 return 2 *
sizeof(ModbusData) +
sizeof(ModbusCRC);
1016 ModbusData start = { 0 };
1017 ModbusData data = { 0 };
1018 ModbusCRC crc = { 0 };
1032 size_t szData()
const;
1039 return sizeof(ModbusData);
1051 } __attribute__((packed));
1062 ModbusData start = { 0 };
1063 ModbusData data = { 0 };
1064 ModbusCRC crc = { 0 };
1080 void set( ModbusData start, ModbusData data );
1090 return 2 *
sizeof(ModbusData) +
sizeof(ModbusCRC);
1101 ModbusData subf = { 0 };
1102 ModbusData data[MAXLENPACKET /
sizeof(ModbusData)];
1113 return sizeof(ModbusData);
1118 ModbusCRC crc = { 0 };
1121 DiagnosticMessage( ModbusAddr _from, DiagnosticsSubFunction subf, ModbusData d = 0 );
1127 bool addData( ModbusData d );
1136 return ( 1 + count >= MAXDATALEN );
1140 size_t szData()
const;
1150 size_t count = { 0 };
1175 ModbusCRC crc = { 0 };
1192 return sizeof(ModbusByte) * 3;
1198 return sizeof(ModbusByte) * 3 + szCRC;
1202 bool checkFormat()
const;
1204 } __attribute__((packed));
1206 std::ostream& operator<<(std::ostream& os,
MEIMessageRDI& m );
1207 std::ostream& operator<<(std::ostream& os,
MEIMessageRDI* m );
1213 RDIObjectInfo( ModbusByte
id,
const std::string& v ): id(
id), val(v) {}
1214 RDIObjectInfo( ModbusByte
id,
const ModbusByte* dat, ModbusByte len );
1220 typedef std::list<RDIObjectInfo> RDIObjectList;
1233 RDIObjectList dlist;
1234 ModbusCRC crc = { 0 };
1248 return sizeof(ModbusByte) * 6;
1255 MEIMessageRetRDI( ModbusAddr _from, ModbusByte devID, ModbusByte conformity, ModbusByte mf, ModbusByte objID );
1261 bool addData( ModbusByte
id,
const std::string& value );
1270 return ( bcnt >= MAXPDULEN );
1274 size_t szData()
const;
1279 size_t bcnt = { 0 };
1284 std::ostream& operator<<(std::ostream& os, RDIObjectList& dl );
1285 std::ostream& operator<<(std::ostream& os, RDIObjectList* dl );
1293 ModbusData cmd = { 0 };
1294 ModbusData num = { 0 };
1295 ModbusCRC crc = { 0 };
1304 return sizeof(ModbusByte) * 4 + szCRC;
1307 } __attribute__((packed));
1316 ModbusByte bcnt = { 0 };
1322 ModbusData data[MAXLENPACKET /
sizeof(ModbusData)];
1333 bool setData( ModbusByte* b,
int len );
1341 return ( count >= MAXDATALEN );
1345 size_t szData()
const;
1355 size_t count = { 0 };
1369 void set( ModbusData cmd, ModbusData ecode );
1381 ModbusByte hour = { 0 };
1382 ModbusByte min = { 0 };
1383 ModbusByte sec = { 0 };
1384 ModbusByte day = { 1 };
1385 ModbusByte mon = { 1 };
1386 ModbusByte year = { 0 };
1387 ModbusByte century = { 20 };
1389 ModbusCRC crc = { 0 };
1401 bool checkFormat()
const;
1406 return sizeof(ModbusByte) * 7 + szCRC;
1409 } __attribute__((packed));
1439 ModbusByte bcnt = { 0 };
1442 ModbusByte data[MAXLENPACKET -
sizeof(ModbusByte)];
1443 ModbusCRC crc = { 0 };
1451 size_t szData()
const;
1458 return sizeof(ModbusByte);
1464 } __attribute__((packed));
1472 ModbusByte bcnt = { 0 };
1474 ModbusByte data[MAXLENPACKET -
sizeof(ModbusByte)];
1484 bool setData( ModbusByte* b,
int len );
1492 return ( count >=
sizeof(data) );
1496 size_t szData()
const;
1504 size_t count = { 0 };
1517 } __attribute__((packed));
1519 ModbusByte bcnt = { 0 };
1523 ModbusCRC crc = { 0 };
1531 size_t szData()
const;
1538 return sizeof(ModbusByte);
1545 bool checkFormat()
const;
1548 size_t count = { 0 };
1558 ModbusData numfile = { 0 };
1559 ModbusData numpacket = { 0 };
1560 ModbusCRC crc = { 0 };
1574 return sizeof(ModbusData) * 2 + szCRC;
1577 } __attribute__((packed));
1588 static const size_t MaxDataLen = MAXLENPACKET -
sizeof(ModbusData) * 3 -
sizeof(ModbusByte) * 2;
1595 ModbusByte data[MaxDataLen];
1602 ModbusCRC crc = { 0 };
1603 static size_t szHead()
1605 return sizeof(ModbusByte);
1615 bool set( ModbusData numfile, ModbusData file_num_packets, ModbusData packet, ModbusByte* b, ModbusByte len );
1621 size_t szData()
const;
1634 #endif // ModbusTypes_H_ static size_t szHead()
Definition: ModbusTypes.h:570
Definition: ModbusTypes.h:1436
Definition: ModbusTypes.h:1013
ModbusByte reftype
Definition: ModbusTypes.h:1513
static int szHead()
Definition: ModbusTypes.h:372
Definition: CallbackTimer.h:29
ModbusData numfile
Definition: ModbusTypes.h:1591
Definition: ModbusTypes.h:1059
ModbusByte dlen
Definition: ModbusTypes.h:1594
Definition: ModbusTypes.h:824
ModbusData numrec
Definition: ModbusTypes.h:1515
Definition: ModbusTypes.h:1469
Definition: ModbusTypes.h:327
static size_t szHead()
Definition: ModbusTypes.h:1536
Definition: ModbusTypes.h:784
bool isFull() const
Definition: ModbusTypes.h:1268
static size_t szData()
Definition: ModbusTypes.h:265
bool isFull() const
Definition: ModbusTypes.h:1490
ModbusByte bcnt
Definition: ModbusTypes.h:1590
Definition: ModbusTypes.h:878
static size_t szHead()
Definition: ModbusTypes.h:764
static size_t szHead()
Definition: ModbusTypes.h:1037
Definition: ModbusTypes.h:274
Definition: ModbusTypes.h:1555
Definition: ModbusTypes.h:1098
ModbusByte devID
Definition: ModbusTypes.h:1227
Definition: ModbusTypes.h:1168
ModbusByte objNum
Definition: ModbusTypes.h:1231
ModbusData numpacks
Definition: ModbusTypes.h:1592
Definition: ModbusTypes.h:1583
Definition: ModbusTypes.h:968
static size_t szHead()
Definition: ModbusTypes.h:1246
Definition: ModbusTypes.h:1156
Definition: ModbusTypes.h:1210
ModbusByte conformity
Definition: ModbusTypes.h:1228
ModbusData reglen
Definition: ModbusTypes.h:1516
ModbusByte mf
Definition: ModbusTypes.h:1229
static size_t szData()
Definition: ModbusTypes.h:1196
ModbusByte type
Definition: ModbusTypes.h:1171
bool cmd()
Definition: ModbusTypes.h:925
bool isFull() const
Definition: ModbusTypes.h:1339
Definition: ModbusTypes.h:358
static size_t szData()
Definition: ModbusTypes.h:1002
static size_t szHead()
Definition: ModbusTypes.h:946
static size_t szHead()
Definition: ModbusTypes.h:857
Definition: ModbusTypes.h:1223
ModbusByte objID
Definition: ModbusTypes.h:1230
static size_t szData()
Definition: ModbusTypes.h:546
static size_t szHead()
Definition: ModbusTypes.h:1190
Definition: ModbusTypes.h:707
ModbusByte devID
Definition: ModbusTypes.h:1172
static size_t szData()
Definition: ModbusTypes.h:1404
static size_t szData()
Definition: ModbusTypes.h:907
Definition: ModbusTypes.h:1290
Definition: ModbusTypes.h:1364
Definition: ModbusTypes.h:1511
static size_t szData()
Definition: ModbusTypes.h:1572
Definition: ModbusTypes.h:557
static size_t szData()
Definition: ModbusTypes.h:813
static size_t szData()
Definition: ModbusTypes.h:1302
bool isFull() const
Definition: ModbusTypes.h:1133
static size_t szData()
Definition: ModbusTypes.h:345
Definition: ModbusTypes.h:245
Definition: ModbusTypes.h:192
ModbusByte objID
Definition: ModbusTypes.h:1173
bool cmd() const
Definition: ModbusTypes.h:976
ModbusByte type
Definition: ModbusTypes.h:1226
ModbusData packet
Definition: ModbusTypes.h:1593
static size_t szHead()
Definition: ModbusTypes.h:1111
Definition: ModbusTypes.h:300
bool isFull() const
Definition: ModbusTypes.h:593
Definition: ModbusTypes.h:528
Definition: ModbusTypes.h:1378
static size_t szData()
Definition: ModbusTypes.h:1088
Definition: ModbusTypes.h:917
Definition: ModbusTypes.h:1416
bool isFull() const
Definition: ModbusTypes.h:411
Definition: ModbusTypes.h:1508
static size_t szHead()
Definition: ModbusTypes.h:1456
Definition: ModbusTypes.h:1313
ModbusData numfile
Definition: ModbusTypes.h:1514