diff --git a/.gitignore b/.gitignore index 7033506..4ba957c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +Makefile.rules +config.h +testmodbus-client .project testmodbus-client.ui~ *.oo diff --git a/Makefile b/Makefile index 707e1de..601649d 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ VERSION = 1.0.1 -include Makefile.rules -OBJECTSCLI = client.oo tcp.oo nwthread.oo +OBJECTSCLI = client.oo tcp.oo nwthread.oo modbus.oo DISTNAME=testmodbus-client-$(VERSION) diff --git a/modbus.cc b/modbus.cc new file mode 100644 index 0000000..dfc100a --- /dev/null +++ b/modbus.cc @@ -0,0 +1,88 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// modbus.cc is part of TestModbus-Client. +// +///////////////////////////////////////////////////////////////////////////////// + +#include +#include +#include "modbus.h" + +#define PACK_INT8(__dstptr, __srci8) \ + memcpy(__dstptr, &__srci8, 1); \ + __dstptr += 1 + +#define UNPACK_INT8(__dsti8, __srcptr) \ + memcpy(&__dsti8, __srcptr, 1); \ + __srcptr += 1 + +#define PACK_INT16(__tmpi16, __dstptr, __srci16) \ + __tmpi16 = htons((uint16_t)__srci16); \ + memcpy(__dstptr, &__tmpi16, 2); \ + __dstptr += 2 + +#define UNPACK_INT16(__tmpi16, __dsti16, __srcptr) \ + memcpy(&__tmpi16, __srcptr, 2); \ + __srcptr += 2; \ + __dsti16 = ntohs((uint16_t)__tmpi16) + +/* + * packs the header into the buffer data and returns the lenght of the header + * returns NULL on error or points to end of data + */ +char * modbustcp_pkt_header (char *destbuffer, int bufsize, modbustcp_header *srcmbh) { + uint16_t tmp; + + // destination memory valid + if (destbuffer == NULL) { + errno = EFAULT; + return NULL; + } + if (bufsize < 12) { + errno = EOVERFLOW; + return NULL; + } + + char *pos = destbuffer; + + PACK_INT16(tmp, pos, srcmbh->transid); + PACK_INT16(tmp, pos, srcmbh->protid); + PACK_INT16(tmp, pos, srcmbh->length); + PACK_INT8(pos, srcmbh->uid); + PACK_INT8(pos, srcmbh->fc); + PACK_INT16(tmp, pos, srcmbh->offset); + PACK_INT16(tmp, pos, srcmbh->number); + + return pos; +} + + +/* + * unpacks the buffer into the header + * returns NULL on error or points to end of data + */ +char * modbustcp_unpkt_header (modbustcp_header *destmbh, char *srcbuffer, int bufsize) { + uint16_t tmp; + + // source memory valid + if (srcbuffer == NULL) { + errno = EFAULT; + return NULL; + } + if (bufsize < 12) { + errno = EOVERFLOW; + return NULL; + } + + char *src = srcbuffer; + + UNPACK_INT16(tmp, destmbh->transid, src); + UNPACK_INT16(tmp, destmbh->protid, src); + UNPACK_INT16(tmp, destmbh->length, src); + UNPACK_INT8(destmbh->uid, src); + UNPACK_INT8(destmbh->fc, src); + UNPACK_INT16(tmp, destmbh->offset, src); + UNPACK_INT16(tmp, destmbh->number, src); + + return src; +} diff --git a/modbus.h b/modbus.h new file mode 100644 index 0000000..2b598f1 --- /dev/null +++ b/modbus.h @@ -0,0 +1,33 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// modbus.h is part of TestModbus-Client. +// +///////////////////////////////////////////////////////////////////////////////// + +#ifndef _MODBUS_H_ +#define _MODBUS_H_ + +#include +#include +#include + +/* + * this file will only contain the encoding and decoding functions + */ + +struct { + uint16_t transid; // transaction id + uint16_t protid; // protocol id + uint16_t length; // number of bytes followed + uint8_t uid; // unit/slave id + uint8_t fc; // function code + uint16_t offset; // first register to read + uint16_t number; // number of registers to read +} typedef modbustcp_header; + + +char * modbustcp_pkt_header (char *destbuffer, int bufsize, modbustcp_header *srcmbh); +char * modbustcp_unpkt_header (modbustcp_header *destmbh, char *srcbuffer, int bufsize); + + +#endif diff --git a/nwthread.cc b/nwthread.cc index ac25229..c535392 100644 --- a/nwthread.cc +++ b/nwthread.cc @@ -36,6 +36,11 @@ NetworkThread::NetworkThread() { state = 0; host = ""; port = ""; + req_fc = -1; + req_offset = 0; + req_size = 0; + memset (&req_time, 0x0, sizeof (req_time)); + req_timeout = 0; }; NetworkThread::~NetworkThread() { diff --git a/testmodbus-client.ui b/testmodbus-client.ui index 54a4ec2..51bbcd7 100644 --- a/testmodbus-client.ui +++ b/testmodbus-client.ui @@ -2,6 +2,12 @@ + + 16 + + + 0 + False @@ -355,6 +361,7 @@ False True True + cli_FC1 False @@ -371,6 +378,7 @@ False True True + cli_FC1 False @@ -387,6 +395,7 @@ False True True + cli_FC1 False @@ -455,8 +464,10 @@ True True + entrybuffer_offset 5 5 + 0 1 @@ -467,8 +478,10 @@ True True + entrybuffer_numbers 5 5 + 16 1