9 #include "ModbusRTUErrors.h"
27 typedef uint8_t ModbusByte;
28 const size_t BitsPerByte = 8;
29 typedef uint8_t ModbusAddr;
30 typedef uint16_t ModbusData;
31 const size_t BitsPerData = 16;
32 typedef uint16_t ModbusCRC;
36 enum SlaveFunctionCode
39 fnReadCoilStatus = 0x01,
40 fnReadInputStatus = 0x02,
41 fnReadOutputRegisters = 0x03,
42 fnReadInputRegisters = 0x04,
43 fnForceSingleCoil = 0x05,
44 fnWriteOutputSingleRegister = 0x06,
46 fnForceMultipleCoils = 0x0F,
47 fnWriteOutputRegisters = 0x10,
48 fnReadFileRecord = 0x14,
49 fnWriteFileRecord = 0x15,
52 fnRemoteService = 0x53,
53 fnJournalCommand = 0x65,
58 enum DiagnosticsSubFunction
66 dgClearCounters = 0x0A,
69 dgBusExceptCount = 0x0D,
70 dgMsgSlaveCount = 0x0E,
71 dgNoNoResponseCount = 0x0F,
72 dgSlaveNAKCount = 0x10,
73 dgSlaveBusyCount = 0x11,
74 dgBusCharOverrunCount = 0x12,
76 dgClearOverrunCounter = 0x14
81 typedef unsigned long RegID;
89 RegID genRegID(
const ModbusRTU::ModbusData r,
const int fn );
93 ssize_t szRequestDiagnosticData( DiagnosticsSubFunction f );
100 rdiMajorMinorRevision = 0x2,
102 rdiProductName = 0x4,
104 rdiUserApplicationName = 0x6
110 enum RDIRequestDeviceID
113 rdevBasicDevice = 0x1,
114 rdevRegularDevice = 0x2,
115 rdevExtentedDevice = 0x3,
116 rdevSpecificDevice = 0x4,
120 std::string rdi2str(
int id );
136 const unsigned char MBErrMask = 0x80;
138 uint16_t SWAPSHORT( uint16_t x );
141 ModbusCRC checkCRC( ModbusByte* start,
size_t len );
142 const size_t szCRC =
sizeof(ModbusCRC);
145 std::ostream& mbPrintMessage(std::ostream& os, ModbusByte* b,
size_t len );
147 ModbusAddr str2mbAddr(
const std::string& val );
148 ModbusData str2mbData(
const std::string& val );
149 std::string dat2str(
const ModbusData dat );
150 std::string addr2str(
const ModbusAddr addr );
151 std::string b2str(
const ModbusByte b );
153 float dat2f(
const ModbusData dat1,
const ModbusData dat2 );
155 bool isWriteFunction( SlaveFunctionCode c );
156 bool isReadFunction( SlaveFunctionCode c );
165 } __attribute__((packed));
169 std::ostream& operator<<(std::ostream& os,
const ModbusHeader& m );
170 std::ostream& operator<<(std::ostream& os,
const ModbusHeader* m );
174 ModbusRTU::ModbusData
tID;
175 ModbusRTU::ModbusData
pID;
176 ModbusRTU::ModbusData
len;
182 } __attribute__((packed));
184 std::ostream& operator<<(std::ostream& os,
const ADUHeader& m );
199 inline ModbusByte func()
const
203 inline ModbusAddr addr()
const
207 inline ModbusRTU::ModbusData tID()
const
211 inline ModbusRTU::ModbusData pID()
const
215 inline ModbusRTU::ModbusData aduLen()
const
220 unsigned char* buf();
221 ModbusRTU::ModbusData len()
const;
223 void makeHead( ModbusRTU::ModbusData tID,
bool noCRC =
true, ModbusRTU::ModbusData pID = 0 );
225 ModbusRTU::ModbusData pduLen()
const;
226 ModbusCRC pduCRC(
size_t len )
const;
227 static size_t maxSizeOfMessage();
233 ModbusByte
data[MAXLENPACKET + szCRC];
237 } __attribute__((packed));
239 std::ostream& operator<<(std::ostream& os,
const ModbusMessage& m );
240 std::ostream& operator<<(std::ostream& os,
const ModbusMessage* m );
246 ModbusByte ecode = { erNoError };
247 ModbusCRC crc = { 0 };
255 ErrorRetMessage( ModbusAddr _from, ModbusByte _func, ModbusByte ecode );
265 return sizeof(ModbusByte) + szCRC;
278 const DataBits& operator=(
const ModbusByte& r);
280 operator ModbusByte();
283 bool operator[](
const size_t i )
287 void set(
int n,
bool s )
292 std::bitset<BitsPerByte> b;
295 std::ostream& operator<<(std::ostream& os,
DataBits& m );
296 std::ostream& operator<<(std::ostream& os,
DataBits* m );
304 const DataBits16& operator=(
const ModbusData& r);
306 operator ModbusData();
307 ModbusData mdata()
const;
309 bool operator[](
const size_t i )
313 void set(
int n,
bool s )
318 std::bitset<BitsPerData> b;
321 std::ostream& operator<<(std::ostream& os,
DataBits16& m );
322 std::ostream& operator<<(std::ostream& os,
DataBits16* m );
328 ModbusData start = { 0 };
329 ModbusData count = { 0 };
330 ModbusCRC crc = { 0 };
345 return sizeof(ModbusData) * 2 + szCRC;
348 } __attribute__((packed));
372 return sizeof(ModbusByte);
377 ModbusCRC crc = { 0 };
395 bool setBit(
unsigned char dnum,
unsigned char bnum,
bool state );
411 return ( (
int)
bcnt >= MAXPDULEN );
428 ModbusData start = { 0 };
429 ModbusData count = { 0 };
430 ModbusCRC crc = { 0 };
447 return sizeof(ModbusData) * 2 + szCRC;
450 } __attribute__((packed));
472 return sizeof(ModbusByte);
477 ModbusCRC crc = { 0 };
495 bool setBit(
unsigned char dnum,
unsigned char bnum,
bool state );
511 return ( (
int)
bcnt >= MAXPDULEN );
529 ModbusData start = { 0 };
530 ModbusData count = { 0 };
531 ModbusCRC crc = { 0 };
546 return sizeof(ModbusData) * 2 + szCRC;
549 } __attribute__((packed));
559 ModbusData
data[MAXLENPACKET /
sizeof(ModbusData)];
571 return sizeof(ModbusByte);
576 ModbusCRC crc = { 0 };
593 return (
count *
sizeof(ModbusData) >= MAXLENPACKET );
617 ModbusData start = { 0 };
618 ModbusData count = { 0 };
619 ModbusCRC crc = { 0 };
634 return sizeof(ModbusData) * 2 + szCRC;
637 } __attribute__((packed));
648 ModbusData
data[MAXLENPACKET /
sizeof(ModbusData)];
660 return sizeof(ModbusByte);
665 ModbusCRC crc = { 0 };
682 return (
count *
sizeof(ModbusData) >= MAXLENPACKET );
712 ModbusByte
data[MAXLENPACKET -
sizeof(ModbusData) * 2 -
sizeof(ModbusByte)];
728 int addBit(
bool state );
730 bool setBit(
int nbit,
bool state );
732 inline size_t last()
const
745 bool getBit(
unsigned char bnum );
748 inline bool isFull()
const
750 return ( (
int)
bcnt >= MAXPDULEN );
754 ForceCoilsMessage(
const ModbusMessage& m );
755 ForceCoilsMessage& operator=(
const ModbusMessage& m );
756 void init(
const ModbusMessage& m );
767 return sizeof(ModbusData) * 2 +
sizeof(ModbusByte);
778 } __attribute__((packed));
789 ModbusCRC crc = { 0 };
805 void set( ModbusData
start, ModbusData
quant );
815 return sizeof(ModbusData) * 2 +
sizeof(ModbusCRC);
831 ModbusData
data[MAXLENPACKET /
sizeof(ModbusData) -
sizeof(ModbusData) * 2 -
sizeof(ModbusByte)];
839 bool addData( ModbusData d );
841 inline bool isFull()
const
843 return (
quant >= MAXDATALEN );
860 return sizeof(ModbusData) * 2 +
sizeof(ModbusByte);
871 } __attribute__((packed));
888 ModbusCRC crc = { 0 };
899 void set( ModbusData
start, ModbusData
quant );
909 return sizeof(ModbusData) * 2 +
sizeof(ModbusCRC);
927 return (
data & 0xFF00);
948 return sizeof(ModbusData);
960 } __attribute__((packed));
973 ModbusCRC crc = { 0 };
978 return (
data & 0xFF00);
994 void set( ModbusData
start,
bool cmd );
1004 return 2 *
sizeof(ModbusData) +
sizeof(ModbusCRC);
1039 return sizeof(ModbusData);
1051 } __attribute__((packed));
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 );
1136 return ( 1 +
count >= MAXDATALEN );
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;
1261 bool addData( ModbusByte
id,
const std::string& value );
1270 return ( bcnt >= MAXPDULEN );
1279 size_t bcnt = { 0 };
1282 std::ostream& operator<<(std::ostream& os, MEIMessageRetRDI& m );
1283 std::ostream& operator<<(std::ostream& os, MEIMessageRetRDI* m );
1284 std::ostream& operator<<(std::ostream& os, RDIObjectList& dl );
1285 std::ostream& operator<<(std::ostream& os, RDIObjectList* dl );
1295 ModbusCRC crc = { 0 };
1304 return sizeof(ModbusByte) * 4 + szCRC;
1307 } __attribute__((packed));
1322 ModbusData
data[MAXLENPACKET /
sizeof(ModbusData)];
1333 bool setData( ModbusByte* b,
int len );
1341 return (
count >= MAXDATALEN );
1369 void set( ModbusData cmd, ModbusData ecode );
1389 ModbusCRC crc = { 0 };
1401 bool checkFormat()
const;
1406 return sizeof(ModbusByte) * 7 + szCRC;
1409 } __attribute__((packed));
1442 ModbusByte
data[MAXLENPACKET -
sizeof(ModbusByte)];
1458 return sizeof(ModbusByte);
1464 } __attribute__((packed));
1474 ModbusByte
data[MAXLENPACKET -
sizeof(ModbusByte)];
1484 bool setData( ModbusByte* b,
int len );
1517 } __attribute__((packed));
1538 return sizeof(ModbusByte);
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 );
1627 std::ostream& operator<<(std::ostream& os, FileTransferRetMessage& m );
1628 std::ostream& operator<<(std::ostream& os, FileTransferRetMessage* m );
1634 #endif // ModbusTypes_H_