From 3366083d4220b59ae9b77f5b00fa114110fd0b87 Mon Sep 17 00:00:00 2001 From: judsonupchurch Date: Sun, 18 Jan 2026 17:21:47 -0600 Subject: [PATCH] Readme --- README.md | 130 ++++++ images/simulink_readall.png | Bin 0 -> 118205 bytes images/simulink_writeall.png | Bin 0 -> 74263 bytes modbus_tcp_client_old.cpp | 738 --------------------------------- modbus_tcp_client_old.h | 127 ------ modbus_tcp_client_old_old.cpp | 757 ---------------------------------- modbus_tcp_client_old_old.h | 115 ------ 7 files changed, 130 insertions(+), 1737 deletions(-) create mode 100644 images/simulink_readall.png create mode 100644 images/simulink_writeall.png delete mode 100644 modbus_tcp_client_old.cpp delete mode 100644 modbus_tcp_client_old.h delete mode 100644 modbus_tcp_client_old_old.cpp delete mode 100644 modbus_tcp_client_old_old.h diff --git a/README.md b/README.md index e69de29..372c483 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,130 @@ +# Purpose +The purpose of this library is to provide a lightweight, minimal import C++ structure for connecting to a MODBUS TCP client. + +Specifically, this library was created for use in PX4 development using the PX4 toolkit in Simulink. + +# Usage +There are two ways to use the class. The first method is to construct the class with the server's IP address and port. Then, the class provides functions for reading/writing coils, discrete inputs, and registers. The second, preferred method, has the constructor allocate memory for the coils, discrete inputs, and registers that should exist for the entire session. A separate set of functions are exposed that has the class update all values at once, saving on network throughput and latency. + +## Types +The following enum class is used internally for the class to create the correct packet for MODBUS TCP communication. +``` +enum class ModbusFunction : uint8_t { + READ_COIL = 0x01, + READ_DISCRETE_INPUT = 0x02, + READ_HOLDING_REGISTER = 0x03, + READ_INPUT_REGISTER = 0x04, + WRITE_SINGLE_COIL = 0x05, + WRITE_SINGLE_HOLDING_REGISTER = 0x06, + WRITE_MULTIPLE_COILS = 0x0F, + WRITE_MULTIPLE_HOLDING_REGISTERS = 0x10 +}; +``` + + +The ```ModbusError``` enum class is used for returning errors that could have occurred during function calls. +``` +enum class ModbusError { + NONE = 0, + TIMEOUT, + INVALID_RESPONSE, + CONNECTION_LOST, + EXCEPTION_RESPONSE, + INVALID_REQUEST +}; +``` + +## Method 1: Manual Control +The manual control method is best for when the client only needs to query a handful of coils/DI/registers at a time. For large server's, the automatic control method is preferred. + +The manual control constructor requires only the server's IP and port. +``` +ModbusTCPClient(const char* ip, int port); +``` + +The class then exposed the following functions for use. The first group provides read access to the server. The return types are all ```ModbusError``` and the data is stored in the final argument passed into the function call. This means the client must allocate a buffer before calling the read functions. For embedded devices, like STM32s, it is better to allocate the total expected size that the coils/DI/registers will take up and use the same buffer rather than allocating, freeing, re-allocating, .... + +``` +ModbusError readCoil(int address, bool &coilState); +ModbusError readMultipleCoils(int address, int count, bool coilStates[]); +ModbusError readDiscreteInput(int address, bool &discreteInput); +ModbusError readMultipleDiscreteInputs(int address, int count, bool discreteInputs[]); +ModbusError readHoldingRegister(int address, uint16_t &holdingRegister); +ModbusError readMultipleHoldingRegisters(int address, int count, uint16_t holdingRegisters[]); +ModbusError readInputRegister(int address, uint16_t &inputRegister); +ModbusError readMultipleInputRegisters(int address, int count, uint16_t inputRegisters[]); +``` + +The writing functions similarly return ```ModbusError``` and are straight-forward. +``` +ModbusError writeCoil(int address, bool value); +ModbusError writeMultipleCoils(int address, int count, const bool values[]); +ModbusError writeHoldingRegister(int address, uint16_t value); +ModbusError writeMultipleHoldingRegisters(int address, int count, const uint16_t values[]); +``` + + +## Method 2: Automatic Control (Preferred for Larger Number of Coils/DI/Registers) +The automatic control method is preferred for clients that need to request large amounts of data at a time, usually at fixed time intervals. This method ensures the use of the "multiple" read and write functions rather than reading/writing to a single coil/DI/register at a time. Additionally, this class allocates the memory to store all of the server's data on the client. This removes the need for the client to manually allocate space before every read. + +The automatic control constructor takes in the server IP and port, as well as the number of coils, discrete inputs (DI), input registers, holding registers, as well as the start offset for each. +``` +ModbusTCPClient(const char* ip, int port, int numCoils, int numDI, int numIR, int numHR, + int startCoils = 0, int startDI = 0, int startIR = 0, int startHR = 0); +``` + +The constructor initializes the following pointers for storing data from reads and for buffering the data before a write. These are all private and accessed through getters. +``` +bool* coilsRead; // Actual state from PLC +bool* coilsWrite; // Desired state to write +bool* discreteInputs; // Only read +uint16_t* inputRegisters; // Only read +uint16_t* holdingRegistersRead; // Actual values from PLC +uint16_t* holdingRegistersWrite; // Desired values to write +``` + +### Reading +In order to read data from the server, all the user must do is call ```ModbusError readAll();```. This will update all of the internal pointers to the data from the server. Then the getters can be used to retrieve the data for use elsewhere. + +The following getters are used for retrieving the values from the internal buffers. For retrieving single values, the return type is the type requested. For requests of multiple data elements, the return type is ```ModbusError``` but is limited to either ```ModbusError::NONE``` or ```ModbusError::INVALID_REQUEST``` if the user requested data out of range based on the constructor. +``` +bool getDiscreteInput(int address) const; +bool getCoil(int address) const; +bool getDesiredCoil(int address) const; +uint16_t getInputRegister(int address) const; +uint16_t getHoldingRegister(int address) const; +uint16_t getDesiredHoldingRegister(int address) const; + +ModbusError getMultipleCoils(int startAddress, int count, bool* destination) const; +ModbusError getMultipleDiscreteInputs(int startAddress, int count, bool* destination) const; +ModbusError getMultipleInputRegisters(int startAddress, int count, uint16_t* destination) const; +ModbusError getMultipleHoldingRegisters(int startAddress, int count, uint16_t* destination) const; +``` + + +### Writing +In order to write data to the server, the user must first set the internal buffers to the correct data before writing. This is achieved through the following functions. + +``` +void setCoil(int address, bool value); +void setHoldingRegister(int address, uint16_t value); +``` +TODO: Add setMultipleCoil and setMultipleHoldingRegisters + +Then, the user can call ```ModbusError writeAll();``` while will write the data from ```bool* coilsWrite;``` and ```uint16_t* holdingRegistersWrite;``` to the server. + + +# Example Simulink Setup +Add the header and source files into the code generation setup of the Simulink model. Then, create custom C blocks for reading and writing. In the context of PX4, the uORB topics are created for each of the data types. + +TODO: Add details on setting up uORB topics and Simulink code generation setup. + +## PX4 Reading Setup +The setup can easily be used to transfer the data from the coils, DI, and registers from the server into the client's (in this case a Pixhawk running PX4) uORB topic bus. This is very convenient as the uORB message bus is very well supported and provides incredible ease of use for data management and telemetry. + +![PX4 Simulink reading setup](images/simulink_readall.png) + +## PX4 Writing Setup +Likewise, it is convenient to take the values stored in the uORB message bus and write them to the server. + +![PX4 Simulink writing setup](images/simulink_writeall.png) diff --git a/images/simulink_readall.png b/images/simulink_readall.png new file mode 100644 index 0000000000000000000000000000000000000000..5a45dded08ecd2852ee7b095ff4f9c29bcdf375d GIT binary patch literal 118205 zcmcG$cRZKt9|x?Zk`N6_RD_TbS&34ST`4QsBPuId8I>|Z63Ui@N)jq$XJ%FiSy@TQ z-s^c^I=^T9@%-`p@toJ|yw2$yzTf-4ug~@Qyw`R6oKcb6Otq7Wf`VeR{OObDC@9w2 zQc$es+CYi_vhG2Z9R9J<`n1+{3JRKH^7pC`9-3Vg6niM-PaZ$-s5{u^WT(>`^=s5> z=+&e1+6vjcT8|GZKF;~fI82wLpU!CHvH9+owWm*rd}I1$?CidT%Y(BB;ZSxbxoR+55!@j(VX~siWa!*o;p?G={`5qSqa!pclfv4~0-ki3r zJvx0xQ`5U~KzVTAp@gB1{Fo3P4cp3t89(i_ZN!+Hu8IuW-;}H(R~slDh06}C4KrZu z`SpwZrhrkYU$JSR;807)k_e5LhrYmR0mfnhY8}2E>PZ(??yFquDekG~x^Xy1s-~Zx zANAPy_yI1i)8yMs%*>3!O(n~3cbZ=ii8vUWNUm?;0C|2cHA;0#t?afn0?I+B*+2dK zx##vVilm17MV(&;bn%FKc)v25{ks;Qh?6x;3Fh=PUK`i0Ub}jgr>Cd)$$kGGd<{K$ z=rKa;#BKS6s6Aq1_ueVo6MM!R|6-ULsyj^{u$fPSx(~iks(Ss8_I9qQsIzwpJHJwk z?0WuO^KT z>}IM>QJTrxG}<*RMFJbViq?7@UwxZ`CBW-6``F8W-!}Gj<@Rpxme|@el(BxpTBUDw z*BCv03~n`0C8@`&o$Gp@Dp<9&c$`C3rK`(V?XC8~wW}#rCBJ$!Q1NIalz2p5uJ8H% zm2P=yIJc*_dA2gY>fA#%vrD|&*>?KV`^);27>29w$8FheH@67!F5l7gImp1mVzr%v z+~@MQfsaku=mneJeXgCG%*7?2R(@~Ob<$h3W3aE-XYcA&9D z1#i5H@a0$Oec!ksx$MHf<5F;iQ0>Gan`ge2eB+P8#1|6X^!JoTA6+#yv`OH4LPX(l z|3`GBz?iPAJexu$PkCVrdY{nc)OYFf=N_#qa+LPg`dF`c$K9s0 z=?@(m)Z{I4rDdVEow)36(;XQcoQa!rFFm`mi;Q`{)N^kMeTGpOmE zd~y9uwbe(>cU<@C>pOpl%FC;7=T|Wp>tWY*ei;y9ITjc*TrkCY_`&?VQO;C&jQ*FO zrMrY`o3crDdi(9)8OXM8Y@Nec58cganlu|DR*_xC#!XpW_l5JuLX^_d+LwjgW~{w` z{GhvcPesIXu$O;npO7wV-^)a2ip+&E;hgqqjkokG8!Gh__DK1T*1H?|zQ305`=(g; zR4K#Q>X-;oKei^Hawa6oWDs?fGe?TMO6F+F6fRYfVg-HRUv`8X4X7 z^b|-iKc~m~YodR{bX()6D2HDULwXrq&ycU!GAo1f!1eaoUp&BTcTP7txM}S%GqbyR zkZg1UnM-p@9IEz$VxgZGr!xeNWDl8`@L7KREN5j!ozbG8sv7+KIYnyd=NzX4nQh@F zJS*$3PP!3O(Y`Gnn|IA!Hun*5cRN&N;+iA5CCTZo>`Km-n`jnZo-_p=xJsqqgT-u zD__~TiOI>Y&CT-1kFWat`Lky7$AFa$ZxlqWtUNiW=vlMCpw7PHQ7qbN2M+!we(@iDK#+(f^fgTwg3cx_#M{Ye!S8Z>I( z5&>$DD{rzqN4v|qZL?}5*L}>+c3K!MGdDNy%wL{fRyltB_=2Q_gv3k{>r%nrw(P9g zUlCy<*TVnR4pTa56Xj(VmX@UhlcjR$)YQ~pIywSs``8$%$1sW>GjOU1ps#T#g&yPG z-d*g&kTczWb7Ep*B-zT<_xW@7slRQCCr+#h2?^=x>oa1cJbLu#U`s~8$Bz^{P{bEn~0&*zhIXMgo*W8kk&tMnj`)ZgN1}evnb|37^TI`j-?FQ&ZpC+WZX|pC={;g@ySvSd<7WQ?6g% z|NHkIW}2Yza0OXeO3RFh%fb}}1r$R=LwL&gFa7=fVo@rFsf->T9`7G}S@e;=?4Vf}qe#$wqXlHJj>5Klmb z)b~>VU0EZaHobiH>Qk@nSzIaZG4s!>Br#kqW;wG%hpXrlJvVVCCZ>WB;a8IbjpHfH zb16FZ%_hMiA*;^l>el>eND33b&OuSA|L{__eX3=fMBd_%RW}wrOGha}#J|Ndd-JU~ zZ}@(+w1`{(q*=H=$$Il#kXWNrOWIYQ*?*RRLf=?jPK)$skn2h@HK51X}oxQ54S7|wCv zz=87`8fx0w3T9@UhYueX78S*60*Kt(wBwM$r?tG>H+j+QHtfiA#VY3L@>^!?!rG#0 zy=CK=#jJ0YmdZZ+%JuT)%k%2$hi?2i{|})Zx?lR(7xm>l@l{UTab!>6>9w~|+ha4` z0oZC4iu}37xRB7pSJWkoSCv;*c0W?&+snr0kx9Djw(qt4cS|wClJTQ_o_a|wgYe#;;@bvYb@-2U}`dB269FbR4G#YNt&6(-) zWtMh}Oum>g78J9vHlXYTzJfn@g8t%%tFh_nL0GcUa<%|Ef7#E~)xFJTF};CuEU_wKYDRLlCrJ44;ZEDEruSENU@!3l zjTH&d=c$nqBOYT8K;XUb8ReR&67}rG3vZNVu_;jC{{8zSC2nx*{+y|QsdlwF?Os9x z2RZ|Ostez5GWn;$*vzaB)eL~AdUSGYONJFEGfiDx-3c2T!7Gh#_M_rExrzquk6^Eo zD*?ZY#`rrNi24A0@VwSMulDhWiGiOZC&5n5%9*sBb2M%nEsV!p*kd#qY-n@JF zZewHPw~nKR3Ca(0Hr<+8w)?U9_A5Ttf3GdCpkRo8g|>R`(j{dv z=28LbXveONA3uJ4k&;p-K>a3v$@zQoMY)R?cde&o0nC+&rQ^?=*_Uow-4)TXz=7?E zIvR@_cJXp(ck;@*-sfiQNTArhK2}m$V`etlZD_l$zstAO2{Y~7`KjNoG~RcR)bTn7)Dbbh**Gxg&NuTJK}O?;WRQ0KuVzB|yg7(9p42 zho4~;U%f%UpWp^l}4Rym`T3Ff2`oKsWl9^!kl=}BeD!Hm{V3$x?5JFmZQzUsG2 z^Z_`D+d?;M-M4QtmoDwL%3l=0=jgaEPLhr`Kb#-){k!@DR_Pk_PjS~d;f96=GELBG z#uta(SuWO){7&A?z3TKjfvSHiD8>3T~g%!@84V3LB zV56Mt6#(Qu*2?Zt0Wq=Dd+46V#d%-{e(DsEmzRI7nR-WGp!|C6(J~(fPVW*!j8gJA z^4*T=raW;P|5f7gBsh30200fWpXvA4S~}OO4`Ykn*U)o4teakHn5v)AVj~fislx}5 zfFihCWDu!h=3+idtEQ=W+Q48hwwM`OYnYH(>HNiHbz588E*@onJcpNRiI1YARc_uq zVxJv#^ybu;@84yeoWv`i@S9ByHk0eHuxQG6mv+mK5x@S+dban85Lza7hnUNZKwDee zjEfYunC#iJTgn1h@fCDM0wc37`2L-{cA>A$EV_NL>QF&*6cP%ms!~FC5EmCG&-l)r z)#2gcr{(2m(;q9)dKHl-hJIUmWvf5>G~h$JRfm-G&71g;xF4s;Nb{9vBQ<1H9d+bM z)DZ_;;Fz?uG%>dYF-(M}A^Xw**4oCrsl&MLqFVQ*>)-0?z}~Q#R<9s{g$0+vDcZbV zc1}(q*Ezd4nO#(FivxN>fDD)zw~yV@&~;ju-$9$Bw=nZ@;EmD3%qZ)}lr5b71u-^arzzW1p@(Yog1R)vwebP;r!2ziV8bSLd5 zLez?bk^0f2N1vXZ@(mTWV!?L;ki5zMD}jm;!&JlsU}RwuGAgCcn~3K($Y{Y6)^Qmv z5o3Pfn9S%~A_Ekow>0)dka|r(nMYZ-0d^(x5qn-1349LKrcGKO?G89OIk9dKJ#^?0 z`AWhwKusRL^8KxO9S0_!AT^s5J%_k>81~3H zU0oFcM)vK#SQQyGiXA%EtMGt>A3r8QQ#lA_oo3xB!=Vy+8dvV35R6Ot{AfRf4P3+l zK0ZoMxwZaV<)Ven>9Kscg2#N9?w56U_IwV)@&Pn#+qNxJ=MAk(N{lSmRzq|)VPWC7 zX0fTT_#F$1o=k&!(h? zovhdFOgFPL>bAR%|EjM4{vA(Q#@6-_YG$xbr%|@7GLR_n4Tt=@9gXxD(Q3x z`&$nngY3)*%a1-eIgLW`6#4f0-~c?(3rJS z4Npljug>g!eDU|6KXW=3^Q6gV59dW38O{+(l_wiMa};(#>dr39G^n`&x@BVQ6D0bE1q# zmsAqR*-oTMhcsB2V3X#IRq&7wdjCEZCYTsnd{$N#`~Lj~shXewT`|kEF(?yLOh-F= zdt9$aU4QYwq-}@mG%D^>r1*6)r!jVd15TYfh1qF+{^6Rp77g6$Z*=6{+@zwSqTYS@ zK)@vhSV!e^`JfT!TvU)gBP9cel0G_dkr%DnrAz+Rrrlp+PZ*n+1O^42KoiC<0!@?- zY*R*O*kzStQ*T3hU(I^G!He+(Q`|xu%bRORA&{NdWJ zjCN-p(N^m<NiL%lC+jGeuO(+S`j@{ocKQzn|Hp=>+Z3;*uSD)H%`;X2nxOE!}E=|K`pA zotXl#Xumm}>)2uxaCG}J(sdt-;6f2rSTtcB1?{)yfGT^j5Mb%AI_Oxes_6iX9>P1zJZTkaQk!j-Kk4d z9dC4BY~uA`kaSK8%V|#uzzbKll{j32o8u<4<#d$KPM$2$8ut zbroeQNbS*G7I3}WUlhuy_>DhXyG#8E6^<0M>0*=K+SAi>=Iq%*{0BlTj~8k~hW zI6CV>c(ojh)7?frcXA<^pz_MfN4qx+D}vj6y1P*+N+M)%aB$|(FAR8h+lNAjK9zM^ zLkANL0x|e<;^awvv8pgZBTC@^=b4#esanQL^F&IZ_c_VP%*;-=p?JqNu@2b*ZX%?M z%Q@xhTINowCn$y8sq8fbjAHcM!nz;akxZpz{_NsV!JXQ+mR~yr z#T)O*#Ljp}2GaGp+-&0^_aB%UnDxu-5VZ&RuS$%RGPo9+K49gq+8EVy=f1tji+Qif zTMB(+r{1=KtAG0YV?TU&jK7LG0&A5lEV!@#s=}Nxc(09_Pi5azYse_u#SwVD;`BrG zU1$NBZGXrA-bh(7GnTOI)$WTa%OOK88Ffufr!mac5>-sPihX=8NnZ!%l^iW*@QJ9s zZ&dbRG(Bd~Pqf1&2#XD4A-!gJx_i=@pkM51fNJan`|P7Ef4p6^V@!=@*bV7uA|hv* znk+MZ+G@Sk^eigY|59MM%B$#3wa7xauyT+lwanf%87(_IXy|;yPVOt}dl+oDv^6HA z*2_HnuFPJj^M(3!s7v1MYAZ!+%i&vcr>JvANw&~M8*>{~tpHkB7gH^)j3OXS5ju&3 zVS2gNHh)n`+nMHSxZF4$@Y><<0v<`d~oLCk>Y||w;QPJj~JW&IB>uw zFwDHD6H3B~P!3`o%tE`~{_JefuU{L=9^4BRG;if<3`cCKW4QmQsdV9 z%u2$JtB5gk?DXfb7w=o~nF0mb=r#yk|D_at^KVvhLONOvkW$kAo4rCiK<>-S3k3XT z>`v7QV|ki}KAwD1TlTBkE!z3j`diS*@5)eKyLMLlBHKcpw7*eJX@&T z0ud-@UHX~$qI^q??*4sdF>lUcCK^}0)lNQt{=AE6Wwd+vfsOmjPVjCo8lGm@uoim; zc#L>GzGGQ7S+8eY?BUV)?dp5}t{(H6{>F_HcZ(i|TXg?Ps)Ii=-g-S(a$JcvCFfh& zC5PTKI)lZXjM0>i5c}t+*1c`kZ_i1WUc7L!eP!>SEcJtt^!MWcA1Dq(#L`u5H=QLR zM$f{ZKlNSKJwDBT$AHoKU_~DXy`Y_ zq6#+ea(?;R?)qrSOR=b;$w-;K9?B656VtnRbq7oO>WXOtYah84{kvC9UT_0<)59kx zI<=&%%v6%c93^2&#AJW?u)%%CBL@HQG@z&6$w=91rv|c6G`%=vzlkLvM6>F763_i= zO8jeJc zfI$ta{-BJ>Qd3TJK2Z6;a)|it%OOIB_fqwyZf+CoFEu zUVJ5GQV0&!g`{ur#B96$!xnn=L`Hr^xIN~d9$OslE75pqVeT_hy2}mfSHZOmlM=Z} z@ABrjl^$109Z*&Tv>KGDb@JrWT6LbLtHoE^*r~jf-6oUl)6$1@oJ@9xg%z=~Dk@%D z81Zsyy{-yhLcS`p-zP@+~{;bwMfpV z3)(dwG9*y54jQ-Q$nOw>LWdZJO0$DQs_FP^p zswQBwAvCZGK(f*K#pm(ypkAH^55vMfSA_5Y<&>G$ZC#DWGV8Kpr=yE*_f3WF%9p=j zO964iajrj+!P)?aL^7%C`t#>cQ=aP) zs4{>4Sm1V`>Ml%W_04W5B0aOIn zxSvIVJYJ*!HTDAseDs#*8Yv*Tr#g+B(lCoX{4(INFYxrj6{u6t#^M z6yoZdHETi>!bYkLFd}vAzMgu0F@vT~71*VsWZlR_m_>Vt-;Sdgu$Dy|KiJ| z1EqSAoD5y$9&9sCkxH|IA^Y^}eJaRPteT0)pN()#?Ly(DLyUFo;Dm6^&=4CY16u5=ViEoPJ*>+lo263v66*H)gKyaQjl50RU+EgEId}~ldDRQ;x*o_;9 zeRuHxf>x|D$W1n9>Wb~gIW9o-(ZpJubX6J~7d&yfi$d#?g0^_UHr=|Aq;9}S35k(_-KiEUqi_zQ+|qavkqp9u zurje5u+DTF9zq8=d-kkL@hRb*y)b293_XNC3;2vufhSnk-mU_TP3{4+L3@rTlyL4rtFy6O8A zY!Tf3-Hi-lFz;}U8yPsxfNfy2XJkBqhK+m3%ZrBWP*G64UIoE|3?CQcNV$^w*#lFjNC4D=D4>j#6d=o(2H1;TJnB)< z6wvUjtPK|Vahh+Nf{reEt`Khzo+7O68^#?6>#|5Isjp*@X!hc;|U5T;*Bdwycl0kJK5~Wd~ zw@{)-77}I$?gz{}bls-y0_fG~S{|@4Etid-$Y5u_*2|Cn@k3jw&QCSvBPQzSni?{U zpa=UwGju1OBNn#!N}p!3I*Ow3qE+rGgayD#kL@Xdb;$6545hKrn(7vN{4;E$R}q>6 zWC9r8zwpZdro`f5v(a~)tB1}*o*d>|@RKKGm#C>R6zY%o9nIrMBRu819U(c0AZv-a zNt_&EVe7#rLAamrYN_B*`*`h!!Tsx(=@Lw&%}*-96V_qNkvhSnKqGC+aT2qdQ7Q&sdx!(*%|^ajVXrz1=v_E1EyMnJoY1 z%a`kC9qjGLNO}U9g)`6-;VctaK_pUq1-U*_7csRv^!_?S!NE=?do=ch*YCf7DLp;j zwq-kDvO#*GS4m{RWX4m&fRvmcOlR~wj;@T=G}G6=RajVfwvVj{{U6H0W++`dIu`#r z5Ey~2vRJ&g22~jbnI9Np^uR5&Ev(~P)9RgAc))PuzpYt7auBSr+kZa3Xc?Q9_6VC4 zJMC@D5LS+k#w!d0I@A{>$zVbZ%jS$V1h8bwu`u_mBSg!d+)dP5Hn2~>!swfzVTH>Neod3w)+N#gxp&()3zVfJ_(5oK#-IS z!UAM2pupi`(ICe_$`;S>Cv+3^ohLfB8?m-m+jGKh415nn=%TJ4dM@#vRiY*3@ldiI zhD}kSFv;3or!Qe+aUD2NXqiDAGAOSEx6zU?&T5MqHNNe zHwhmp zlRb4SkQxu3rddto#$zCDIeO3F zsSeuDzo7kuwh0f>rf}Vkk$N@N!06~2Y%bD`dV70;bOM8ePohLz*1ZnA@P@c`D684o zSwvC*UH};2N_#-AUQ=|+H&+)K0R4Ke0em)eJd%^hUz$w0-Ki}JuZpE!`JPr* z-hcS;g;mGzNFOekeJ8s*d?jEc#_SVuiqJ%VS(xZMw>>=qcVm9Md~-W#;C=6 z!&FTSHUN~Fn|bi5myfExRx~443_WIamJT{PtiA;E(rF=ESEE!-Bu_x)Acf5#WR^X_ZqjEXR~Zx09LKPp=6&(rfjB^{XESz6I7N z)=;EM-;3THIlgdW)x+g2&vTuh0eLDTdi2K|15k?a;amJ=F)Cm(ArT=Gv6*q{*0mKE z4Yp*reRdWmMi#Idm>PZrg@KgSuL!HsT2YKb&`qRRGW()$0xgctaS`w6PPLB|_h}3@ z0=A`T6YH3yRT=Z%GH7G#S-`aG`E-ei&M-RL79ci^L z+8j5<3Dzma

9xAQrd}%pP3G%NH;7fsCIgBpANe-bm?zadZ}LNZ3L?oqeIzq!-xY}n)&wE$iyOL*E0{<8gl{*Y)A z@1>7h9i^G?Ba$Rx=S>uFE4T3o!Zk4tfFO`~;@s&^gzLa@bpghnuX3!tFB79b2~cx$ zbHmYVMOdIJMmi>cX&^u0*|R&qMbS>bn8@Ft-i-NL=P)0{n12z!mtak_x1U6hU3Ux^ z@$2Q_HS1{}BFl%Nq>QYE;GY>Z9uIr;q}fsv@%QP*ae`u@Ah@E|Ke*sv#` zrKAKf37NjV{B<8Z+K$;8hndf+ZZg1kX#FI@g3*xXFx)=lCi~a84MxTSu>&w#Z!WyS z{2oVQ&j<(v!+#`q*foH4X~c`r4gyq$-IwQKV}d3_)|7-m&B~}XVS`0Czk0O?4)`a- z)VB~K|7Ld6z*RI@67AE9Oe){EFefgPHsK14iI)DBV+5vIGOd~^h&oQ>6M49#fZLIg%ow-m*d&XHHVJ0uG}Ua@{P6}4iBdufA!$F~lFQew z^}@U&MbK5c%gV2jn}?sjPfmL7tjpS~Sm-|KWpNmvN|9n)iUbg=FlbIQ(Q)bxp|HDg zW3-!fITX47(iB!%Y(!A2mq|%+$;q2zYULCaHzCmgW9aR*7V>{Ua0ff`Spk3``M-bv zo|=Z{kbuCgYEv?9VW|S+AX#Prbh~xOjv$y9u*@O64E}iUi=luy5-M!|?Zx=R>k%vY z(c-*Oe=DRHbW=oAH!{ANUGXhfqJyY)TYv$?zC2cPk_hx6#`-HsZ;@MX?%R{D!^RX? z!oLoFMKiwgjg6fla71wf=f!f50$a+@Zk`2Ah@yQ8XI+Q9)#&bS}UL;bST(0 z+!<~5yI`Uo0OJIqo1q(qzengWMqX<3Rg?!o&)9E*$_&s9AWT35iE$2o2u!7!2C)k8 zGxMKkhUFMTG*Hmtug+s$txsr%@+vB(NLfHSDoH%m*VlKw;ey5}wj22o>`;sf>`0^@ z*^zF_oG+>A5)wep|nm+fe2~&%beIo?Dqn3d1D_3}6u#raqv;Hx^UJV)& z*_f+H5(wHCs5P{L0^redKzexO1Wk7pZzO;XP%2S11`%BVwG&9WU~uvSUhhRz@> zT5<&M#e{cswE4C589EPgHgN1eS!R^+zr}4zTi=FfB?}!R@HD%dF55hGa$emWWK-xn zzTx zbyZVSlTk0E!ZHI4p4=2OO#pWV7v?A5z@I}|*kd>?=B!-s*nuJ-J3kX!Qi zWB)rmoS2{QUa!o#NB4YIa978+A!d*@CX zd~)Z&Rxn^BNV+jl+XZ_bA_>BhpW1V8lJSg8HG+Qgi#dx^Eo2VF#2|!L*l%|Z>WH#v z8!$c^mF>ce4ZgF=k4dPDO$YrI-vnHt?`TqkPb1+Y=)tv;xtUt&rlU}h#u2qRr=>-> z8ct6kNjnCV^A&1s?-M;01B1P2+?vTn?_H$so71Gc>a`Yw%t}D&LWADoHV|)w3uI!? zNIE{c9)sBvxV#oql^kxUs|#vkKa{X;^(yM3)2+OR5|GVFL#7NZ2f{W+02(fqgpG%1 z;6$SAeV51Be={ZgZiR@LWDb33(adoagzpc8?%re9Ds;oa;rj0{dm(CLKr>C=b~hFu zLR&>I2O}F}s$J+Jq8J1@6akVyFEDCR;g^M}3IHE*2+6Gopa#bZ@Z1=DPLfm|(XU0@ z>==kFik9*trNnSAs4F6-QHY{Sv&c;MB~I#=O#37m~VowlAeNR^s+%8dBU!kOH6Sb6+yU zPG`2df&h$0{@k{k(|>!3xrgXo!S5?ULVEdTc^?=8!e(aD&s@4x4bg0-%zZ(Qv`8|i zMXhut^)G<|qrZExx`krsZ7UK$ZV(M^snUIxAA6SQksz9wpR9}~4qs30NJYuCJN4~G zlR`Tn5(n$zZ#iOBtn$3_y&7Qr$lpv4sL6iLOWuKfrpCs_8l`tTw@F>%+X00IrzcBK zyf5A&zP)nf*(M6?LKq1nm3m9`IGu1UqpcLJn$SOdHck>OxKI6+l&qL*U7oo)b+FQy zBgj>6!`{1e8?LOTy0eLEwZ;3y_uuP`F7aKtcI|z`2kqo*lg!EQKUn5}JbUFm%kg6t z$EVUxY@oA$bZjb0>CxvZ;}0FI{gRI;w3BT&w5AM%`&Ny+nns&>7F4sxlPY_z>g*TqaF`aS}@4J{Qml1aneV|(_5P#bEhy*y8%YEPbcwON)KA2L7!vwTa@ zITsg6TB(^mxbPR}xgj9b45Z}O;E^+mS~7$2A$xSEzbo;p39#aBs z2b_vmd_qHIO9-8YM&r|MENzyeNUO=>U{iGbUAW_1Xh zFLDGUKELKAD4s6DB(iZ^LKI4nu>%hF(5;+sK5Cji%dng*wJ=iTnA?6l*T2eC2)$zO zR;n$#cW*vsU=U0Hw6I{l1OdN599rQHxgBtHiV-~zUk~|g1}XhyrI&{osZYwvR@A@p z^Fysz!a~s0vL_I+y1#mexH9hM>j`9Hd0<&QVdqftJTwWMQBs$vp&jEso(8DigSegLIkjxfEtLt=I ztK0k#JmoQ*JwH&El9bd9+rH=C4qYNwp`#(&Oi$>|_Y}R_@WWSTW^3Ia;EYPmk>Q@D z`4v3{EXg0i_vDQBim!2UD-y%fY~R;@J4x)Bs!%}>at;M&($iqe6L|&35DD_;V=RNi zcQds~ANXGu0FRTMoBKW?ZK%aDz}OMMhE*eRtc%`A?h84M8H2u*qH4))18=T8Acy?< z-J_$U#Jq>v7=m4x23vJ$p-*}oPUo66A`e_eD97WAa2^iCLQ91j+#YYhfx{3!xq+Ih=5E)&VE& zj6@<3c-;Mw$2m6|t5k1+nBi-Zr^V5Y0PJLF3&ygPV1HfVd~*h|N7B6?eW{drJ3 zE`EM999^o46eq}+#qsAVn1R9jb8FXyC`|GnzM1!M^#h@!4>t9W`qawaVcvUJtW0?4 zW_;PPJx?dpHfS6|bBfL0BzP5VLWzR`Z7k^X-OtA7?l3#W9q^18sUVqaT=X8gGvQI5 z`ApKgyo!z+8t%I}HP|_n(E&d#0^fU8q{V!BJ1{?z&1XIY>^yuQQA~Y(XAQ@XezI`} z;6X^dQQ)M;mx0NGW0S{Fa|U4M3YUXJLthBrZs@mz8>SWZ3km4B^JicMl_Ixby}kgp zS4hH3=-?H>+v2{K!y*Yjvlp!8?%lQePYv}^Bx@WB3SJ%Ue8~m`44k)WjiQihxUl@} z9-LBD#ZVF$Y2CJUE5#bt?}`cv@FyrJ6YB4tl9i=#ZigTsHR`lULlmJZo&aeHiEtuD ziI`R~_700k#?w%)euyIk+_i>RVG{Akqqp3-go`C_nAthwaJ7_D!;0LpVN3$Q&BOnQ68PEs)AMeb`@d((# zu&gLOI{nJF%D9N1k5xOuy>ai|nREAK_JZ33St8ocvm>Q3NjPJxVdgoUHW8nHxx=II zmP+E0VV>(E*M1boEH9XWjm_W!B<(bHPLdt6hE}owai$aCGnj;6N%2(VbQm^O8uT{x zWbJhr59^8G_K74a{6*VO%Ft|Ow&n(Eic_F)_TfNf9S z0fA~IQ9&$c6995;e{N zLS&ByHG<=;0NR$EoSfMD$BxqDHYx&hbauXDSw%x*2Vj>%OxPK&lLCw?XYXqKYS1YVIw*Wm^Y}fBnvI3y24>Z7}&Q`odwR0 zK6;bbH~8Opu(-yJ_hc%B69piTVnvipO%ukd(~3F^EZ%dgCEg`RHHhMl=my8$y|;ny zZ5JmSalEWvXi9gE-84N6YVmDgusfCf`FP30R($#G+j|nB1CX#VEG?iZWpFnjIdm{X zBP03Kr}c644kH_9Ish}yal7LNJ^!Jndx;?nJe%k4(#b4z2ryD(tw^$ef8;w&UgFAO zR3Ne8-#B1W?7fAk>+J08Tt`jN7lAUty>#6dZ{RB+U6TW3maUnpLn&;UGOHU#}U9)#3*PP7D1@x7J)O$Vr=B6#IHFIHFNa?6)LX_#tb2dLrYkc6XP9`=b#lK|w)}ge{)thybnbQtFm**-q)PD!Xkdi^sWEIQMYQ zo$W3m8jR2z~j?{$;7<_ul(Jtf7|AbTlxxx*5 zr9!~3rKMxA=V9yOPM~L2nT|6hx!tAHqah6F-%lhTY4v?-PqAA|cARA}%`z^V=VzYh6(W*A=<-1JYV*vFXNelH9 z-D(7tpkhg(nto5t#b&#A%K9-Lx3d$rn0#_^!{VQ$ltZW=EqYCSb7sN6hw8m48frM~ z4B-9;%;KL=UF4u6A^;Es128yaMbF~+9#|W(B}+;+?_N4@pS?ToE5bdrNVe$(_w_OfSs~+s)^r^jQM=2yGJpv( zHpsL;t?T!U{9Fb?0`mkB7o06XLIX1GrdxPZ1AYv{21MdnTwMR~Fi7ZGH8pbL-NwcS zmxy>KDOuC>Ky2kgeMlSIlhqZkUghNo+IS0_7;OR9tnmTklCEn!aE}~${yT^b0=*as zLMZm+jR)kQznINFeA5Ys^-qDf#>Q-+lp+`i_K0JWT-<36Bh$8dsu;m;+e;)s_$bkX|t=Q0cfva-IpeR{>Y$j`OGFr3V$k2S9{@=tz*E zV`(Zw94RuWI;P7@i(9vC+rq$b{retHM(Q+}x8O@&vT>l2srZ9wbvSXAc8OX(2RVWN z0?8B3J8lD;WW-UD9D{>1NH{rmw_rpy{7&)*NOZ+$9VDzq%t3hfB=LBqk&j3(7}!TA z>_|b5GLZtA`9vOzmX^3(I(lc!4>(geYI#Cb4No2?dm==xkx2>wiwvjNUr*V%LVW?O zBEJ4#$R;&5J1{iVyS8uF$1wDJV*5ckXhIluadELKLX;Nc0rvO|^cz{2x#Yg#F8S>~ z^7w#S0^W1s2ng{RFI>Q3Lz0~$?H7l;DWHL3IBq6cJ-{-;tyx)B&!6AA)8DjQ%Y~P2 z!gPGLTxC*!WAW`3?g0poLwNb0I1KL)%*4TneJ1LF?%ZKV=~1p~5-u|eLqg5Chg z3g_?$tINnLY=z>hBI95=0=7M;fj;n4hSPuBAZ@J1^!|T7Ey5TU0IZBLNKSa6(3X{; z#X&MYA<6^cxfzNbmGv+hU`tg)TV1+X;&tptstifv|zW=#%cXU${ zKYk1c+9w(^kPG}SxulScXwr%D6?K*G(doUwKpsVIl%|dMF5R+OyW9M=Xtz0Yl$+G$ zY?VZ|Lx&!1VUx8+)|76?jxxO8W&My)aN|Hpzg^d)vlk5{_~XXLJ)EA~!0};HQh*Kt z>!7AhS}ije7#P;v(oNwM5qS(h=1$?$G*wNmtys0qZ3{2aVUQXm0SDl&curODl_?)z zUp5H|?JP?HMj(Og0(fd(=zbBo^SVJ|4J5O+-2Ou8=Ei`1F zf!tf4!<55L{0q7S*L!VcbhqV6z2y?fn_zAx$j+Hj+p26A2HhLbP{3Lzza!wY@lLyJ>st)elcEpKB$hZxV)I*rHIR-%Z5N=H z+b%Corz1y$??E?A3x7;@@VfuA$)R1NRS+kVRCA}b%O7q9j1C30j%UyIMY~QlAHN`M z05qE3ENM4xW{Yqf((!mh1WE9c_=Ap)pL!BrY;gx-G31VrRO^QfG?qx2BvOh4*Z`S7 zjEwaAdYMEyAxLno`j(F-?SVCah=38~kRuL%VN9JBkAa;EU!5o(P}NCR>Bz*_J7aD5R;h$m=IGq0`Z_Xm#q1tQ`wm0&qk|=s4 zA1cOrfPSGHokI{8b3)+DU?!4=Xt7vZ%ojvTpoNjn4Z4NS4IJ#Ro1&3$(EPnNi&M`Q zR5sqSka+O6+bckuJY?D-(cQw-;Nb8CIY(ndLCLfQDzYO66#=_0wdxNi`dU1+W4JRtNw#uY5@)&`N@lpWSAA(XZQ)3Cqu;Pr>UznGOvk9jwp#??-4!zSoo{)+tAq?{v z@prSlD0MtRa&8|%UH9x&@94Td!SO00c~~$`yg}g%*WH!Q4wFt5K~eDVtF4(^aAw}; zI6(!?m~nVt(z%4ZKXwu@=}y!BnDp{kW0>H?niok@%zV@)lt6aH3Dc!Q>$A|L zHm~jiY_bHb$N$G`)FAFAtCMp(L-uRdG{kgLeL-@b1RD^+$J8skEZj9d`+I1pWO&-> zP+0K1eRi7*UKxchL7a)s>3J|j)BrjpUQCHGiuJ*}5TK%QZCzc^Ya81*5Tc-hw=}uC zOJgf2==a)52=4TU+6NqY3SE-CT>)MA7P{<$TmG1%YO*PPAOHVFN+KCB6*1f0=IUa& zTj1l(LW?g1@upn&6{lLUE{GkHC_f+o=C$kt=8e=7+aiz^m7Z^|4Q?SuvssMmW7sKR zjStk5;sM+d<%6(@3BNc$jqEhCb#V}>aGn|K1*}J2&43&&^hjd6gRA2YK#Iy>T*%Oo zgHnwCvd{@?fhlj@E*$~t#aKmJ=_ol;vWIRD6jmtNNcSD!=TF2&!XMBh9kky=7AE<9 z^hYcxAVUh_p9!_@2Wz}{p{1Uy|krxH3g#8Bj z3aJ5=NU=gh=fv=)8;Pg~w9*R?iK}q%;s>sbZGHSNR|WuiqBbg^W&aLvRJ?l$^up>d z3ugA?X`VK@e-PMC^1dvMOESF zkfEV1j6KQkfmuP$>ER3x6t(-Gji13YM{WGgUv`6Dg8)D`=D#rnb)aecFSGNDZb0kg z3=-pEi>>IIK=S|1PV6g z>ej;D!7Hr@sem_3UTy=V3UZ{7zt_es=wGWOGgQ2D(iz*M4@u8;l+IU}{ADe(heV(< zD_y$O_SBV@S*&0>Z~ACgSC>GT5($}5cueh5h(8zm^|H#vOIGzS&Jt{c(?#hhLTJ?_ znlBp{h}%W%8tzk>Y5Ljo=bx_?!y7gVu8OFgIRij#MqWnK(C`(f3!v=+(qImL#XGSe z_~HCc|E0RNHnPY=YyabO2=g(dYI=sTmhp}e>m$Bx@jevVyz^VHX zLnRFvFKq&;&cv%4DR-}@RG$%wsD9C4u|h0Xc@$DmpU=X_lB1%CY23PPZHi=>X7cyr zJZmUDjzjoEg^^%b#T4u;1Un(0t9>XeFskpjLwDGny7^%+@}fh}ad^+3;(vjgnX2Al)ykE6Z`cSN%ka0v3cf)< z>qzsgLH;3?7^fGvdm@2?l=(mvtf&*#Cr94f8-45;$l2YD3`bNPJS&bL@bqq6ifm>| z5H)4IW4J$Pk_@hY?x);PSX@+D!~v-gNEF+SwZ}EVp8$}v(6L&zY7lTI z5Dp)-VS~Y3RS*>4?q4ND>%-^I^9Th*NV@^KK@)esI<+ctRg}Ys08|z2O!CE zML!%^lk7J#d>+v4Jp8Z{GX026EP18sAfG%QIjJb!`D0k$;#PjJqO?K`LAAa+EbLUT z`0BGzIHJvkQS7uS@wQ*{jsf(n&>`IXhyXk}sQ0M!v|Dg2XCbf~*1ve}CN={?0x{%K zxxksTe$PoVQZvFAv{tj^vh z<-h+(AYy+0(3Rr@`s{i2HSJBQ@{3-{4IY381P5<=v9!yOV*xvMh-of9Zz2GqgcIH( zF-R~GRA`7+Ib;1mQbGGUWa3D_nS1z|F1V_s6LNtcwu#-cZQDFp91cl zpPye19-&DnvM#F3`QP4W1Cy{r+ro~ChE>iVcvU(r4gvztkFezM6!&-#nR|M+fBHOX zU0DcJ<|l?(x>Z~G9@}eAw_Pc6bPi9Fp$Z>%EuGA#BTccK>bBIhrrb38w6$jP@}FOp z`E=xVBgtqCT_M<{qO66ziO8Kk7&NL7D*f>F>!Aq1);-*R1K{fkG>g8RBn&R#3}`I`l{DdAk>K9Og#T_584ROr7)kFKx2{aycC-8*C1 z5Wk)z6<#z>U{$ui z>W4kMWl{ZNYoA%1J#CwcQ;AOnwbEpmX;!0QT@6+iY*mjh`oCO&J$>%PObBZkWfNOd z

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 U_FFbsf&WI?j2U*`+GWlE0z~LjK>z>% literal 0 HcmV?d00001 diff --git a/modbus_tcp_client_old.cpp b/modbus_tcp_client_old.cpp deleted file mode 100644 index 68f86e6..0000000 --- a/modbus_tcp_client_old.cpp +++ /dev/null @@ -1,738 +0,0 @@ -#include "modbus_tcp_client.h" -#include - -// --- Helper: Compute maximum read response size based on configured counts. -int ModbusTCPClient::computeMaxReadResponseSize() const { - // For registers: 9 + (count * 2) - int rIR = 9 + (numInputRegisters * 2); - int rHR = 9 + (numHoldingRegisters * 2); - // For coils/discrete: 9 + ceil(count/8) - int rCoils = 9 + ((numCoils + 7) / 8); - int rDI = 9 + ((numDiscreteInputs + 7) / 8); - int maxVal = rIR; - if (rHR > maxVal) maxVal = rHR; - if (rCoils > maxVal) maxVal = rCoils; - if (rDI > maxVal) maxVal = rDI; - return maxVal; -} - -// --- Helper: Compute maximum write request size based on configured counts. -int ModbusTCPClient::computeMaxWriteRequestSize() const { - // For write multiple holding registers: 13 + (numHoldingRegisters * 2) - int wHR = 13 + (numHoldingRegisters * 2); - // For write multiple coils: 13 + ceil(numCoils/8) - int wCoils = 13 + ((numCoils + 7) / 8); - return (wHR > wCoils) ? wHR : wCoils; -} - -// --- Constructors --- -ModbusTCPClient::ModbusTCPClient(const char* ip, int port, int numCoils, int numDI, int numIR, int numHR, - int startCoils, int startDI, int startIR, int startHR) - : serverIP(ip), serverPort(port), socketFD(-1), transactionID(1), - numCoils(numCoils), numDiscreteInputs(numDI), numInputRegisters(numIR), numHoldingRegisters(numHR), - startCoils(startCoils), startDiscreteInputs(startDI), startInputRegisters(startIR), startHoldingRegisters(startHR) { - - // Allocate internal storage for automatic readAll()/writeAll() mode. - coilsRead = new bool[numCoils](); - coilsWrite = new bool[numCoils](); - discreteInputs = new bool[numDI](); - inputRegisters = new uint16_t[numIR](); - holdingRegistersRead = new uint16_t[numHR](); - holdingRegistersWrite = new uint16_t[numHR](); - - // Allocate shared communication buffers. - commRequestBufferSize = computeMaxWriteRequestSize(); // Worst-case request size. - commResponseBufferSize = computeMaxReadResponseSize(); // Worst-case response size. - commRequestBuffer = new uint8_t[commRequestBufferSize]; - commResponseBuffer = new uint8_t[commResponseBufferSize]; - - // Initialize the socket mutex. - pthread_mutex_init(&socketMutex, NULL); -} - -ModbusTCPClient::ModbusTCPClient(const char* ip, int port) - : serverIP(ip), serverPort(port), socketFD(-1), transactionID(1) { - // This constructor is for manual MODBUS function calls; readAll/writeAll will not be available. - coilsRead = nullptr; - coilsWrite = nullptr; - discreteInputs = nullptr; - inputRegisters = nullptr; - holdingRegistersRead = nullptr; - holdingRegistersWrite = nullptr; - - // Allocate default communication buffers for simple operations. - commRequestBufferSize = 12; - commResponseBufferSize = 9 + (256 * 2); // Default for 256 registers worst-case. - commRequestBuffer = new uint8_t[commRequestBufferSize]; - commResponseBuffer = new uint8_t[commResponseBufferSize]; - - // Initialize the socket mutex. - pthread_mutex_init(&socketMutex, NULL); -} - -ModbusTCPClient::~ModbusTCPClient() { - delete[] coilsRead; - delete[] coilsWrite; - delete[] discreteInputs; - delete[] inputRegisters; - delete[] holdingRegistersRead; - delete[] holdingRegistersWrite; - - delete[] commRequestBuffer; - delete[] commResponseBuffer; - - // Destroy the pthread mutex. - pthread_mutex_destroy(&socketMutex); -} - -void ModbusTCPClient::setStartAddresses(int startCoils, int startDI, int startIR, int startHR) { - this->startCoils = startCoils; - this->startDiscreteInputs = startDI; - this->startInputRegisters = startIR; - this->startHoldingRegisters = startHR; -} - -// --- Connection Functions --- -bool ModbusTCPClient::connectServer() { - pthread_mutex_lock(&socketMutex); - if (socketFD != -1) { - pthread_mutex_unlock(&socketMutex); - return true; - } - for (int attempts = 0; attempts < 5; attempts++) { - socketFD = socket(AF_INET, SOCK_STREAM, 0); - if (socketFD < 0) { - printf("MODBUS_TCP_CLIENT: Could not create socket\n"); - pthread_mutex_unlock(&socketMutex); - return false; - } - struct sockaddr_in serverAddr; - serverAddr.sin_family = AF_INET; - serverAddr.sin_port = htons(serverPort); - inet_pton(AF_INET, serverIP, &serverAddr.sin_addr); - printf("MODBUS_TCP_CLIENT: Attempting to connect (Try %d)...\n", attempts + 1); - if (connect(socketFD, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == 0) { - printf("MODBUS_TCP_CLIENT: Connected to %s:%d\n", serverIP, serverPort); - pthread_mutex_unlock(&socketMutex); - return true; - } - printf("MODBUS_TCP_CLIENT: Connection failed, retrying...\n"); - pthread_mutex_unlock(&socketMutex); - disconnectServer(); - usleep(100000); - } - pthread_mutex_unlock(&socketMutex); - return false; -} - -void ModbusTCPClient::disconnectServer() { - pthread_mutex_lock(&socketMutex); - if (socketFD != -1) { - close(socketFD); - socketFD = -1; - printf("MODBUS_TCP_CLIENT: Disconnected from server\n"); - } - pthread_mutex_unlock(&socketMutex); -} - -bool ModbusTCPClient::isConnected() const { - return socketFD != -1; -} - -bool ModbusTCPClient::reconnectServer() { - disconnectServer(); - return connectServer(); -} - -void ModbusTCPClient::setTimeout(int milliseconds) { - timeoutMilliseconds = milliseconds; - printf("MODBUS_TCP_CLIENT: Timeout set to %d ms\n", timeoutMilliseconds); -} - -bool ModbusTCPClient::sendRequest(uint8_t* request, int requestSize) { - if (socketFD == -1) { - printf("MODBUS_TCP_CLIENT: Not connected. Cannot send request.\n"); - return false; - } - int bytesSent = write(socketFD, request, requestSize); - if (bytesSent <= 0) { - printf("MODBUS_TCP_CLIENT: Write failed, disconnecting...\n"); - disconnectServer(); - return false; - } - return bytesSent == requestSize; -} - -bool ModbusTCPClient::receiveResponse(uint8_t* response, int expectedSize) { - int totalBytesReceived = 0; - while (totalBytesReceived < expectedSize) { - struct timeval timeout; - timeout.tv_sec = timeoutMilliseconds / 1000; - timeout.tv_usec = (timeoutMilliseconds % 1000) * 1000; - fd_set read_fds; - FD_ZERO(&read_fds); - FD_SET(socketFD, &read_fds); - int ready = select(socketFD + 1, &read_fds, NULL, NULL, &timeout); - if (ready == 0) { - printf("MODBUS_TCP_CLIENT: Timeout waiting for response. Disconnecting...\n"); - disconnectServer(); - return false; - } else if (ready < 0) { - printf("MODBUS_TCP_CLIENT: Select failed. Disconnecting...\n"); - disconnectServer(); - return false; - } - int bytesReceived = read(socketFD, response + totalBytesReceived, expectedSize - totalBytesReceived); - if (bytesReceived <= 0) { - printf("MODBUS_TCP_CLIENT: Connection lost while reading. Disconnecting...\n"); - disconnectServer(); - return false; - } - totalBytesReceived += bytesReceived; - } - return true; -} - -// --- Message Building Functions --- -void ModbusTCPClient::buildReadRequest(uint8_t* buffer, ModbusFunction functionCode, uint16_t startAddr, uint16_t quantity) { - transactionID++; - - // Transaction ID - buffer[0] = transactionID >> 8; - buffer[1] = transactionID & 0xFF; - // Protocol ID, always 00 00 - buffer[2] = 0x00; - buffer[3] = 0x00; - // Length (remaining bytes after Unit ID) - buffer[4] = 0x00; - buffer[5] = 0x06; - // Unit ID (Slave Address) - buffer[6] = 0x01; - // Function code - buffer[7] = static_cast(functionCode); - // Start Address - buffer[8] = startAddr >> 8; - buffer[9] = startAddr & 0xFF; - // Quantity (How many coils/registers to read) - buffer[10] = quantity >> 8; - buffer[11] = quantity & 0xFF; -} - -void ModbusTCPClient::buildWriteSingleRequest(uint8_t* buffer, ModbusFunction functionCode, uint16_t address, uint16_t value) { - transactionID++; - buffer[0] = transactionID >> 8; - buffer[1] = transactionID & 0xFF; - buffer[2] = 0x00; - buffer[3] = 0x00; - buffer[4] = 0x00; - buffer[5] = 0x06; - buffer[6] = 0x01; - buffer[7] = static_cast(functionCode); - buffer[8] = address >> 8; - buffer[9] = address & 0xFF; - buffer[10] = value >> 8; - buffer[11] = value & 0xFF; -} - -void ModbusTCPClient::buildWriteMultipleRequest(uint8_t* buffer, ModbusFunction functionCode, uint16_t address, uint16_t count, const void* values, uint8_t byteCount) { - transactionID++; - - // MODBUS TCP Header - buffer[0] = transactionID >> 8; - buffer[1] = transactionID & 0xFF; - buffer[2] = 0x00; // Protocol ID (always 0x0000) - buffer[3] = 0x00; - buffer[4] = 0x00; // Length (remaining bytes after Unit ID) - buffer[5] = 7 + byteCount; - buffer[6] = 0x01; // Unit ID - buffer[7] = static_cast(functionCode); // Function Code (0x0F for coils, 0x10 for registers) - buffer[8] = address >> 8; // Start address high byte - buffer[9] = address & 0xFF; // Start address low byte - buffer[10] = count >> 8; // Quantity high byte - buffer[11] = count & 0xFF; // Quantity low byte - buffer[12] = byteCount; // Byte count - - // Copy data payload manually (instead of memcpy) - const uint8_t* data = (const uint8_t*)values; - for (uint8_t i = 0; i < byteCount; i++) { - buffer[13 + i] = data[i]; - } -} - -// --- High-Level Read/Write Functions --- - -ModbusError ModbusTCPClient::readCoil(int address, bool &coilState) { - pthread_mutex_lock(&socketMutex); - buildReadRequest(commRequestBuffer, ModbusFunction::READ_COIL, address, 1); - if (!sendRequest(commRequestBuffer, 12)) { - pthread_mutex_unlock(&socketMutex); - return ModbusError::TIMEOUT; - } - // Expect 10 bytes: header (9 bytes) + 1 byte data - int expectedSize = 9 + 1; - if (!receiveResponse(commResponseBuffer, expectedSize)) { - pthread_mutex_unlock(&socketMutex); - return ModbusError::TIMEOUT; - } - - // Handle MODBUS exception responses (0x80 + function code) - if (commResponseBuffer[7] & 0x80) { - printf("MODBUS_TCP_CLIENT: Exception Code %02X\n", commResponseBuffer[8]); - pthread_mutex_unlock(&socketMutex); - return ModbusError::EXCEPTION_RESPONSE; - } - // Ensure the function code in the response matches the request. - if (commResponseBuffer[7] != static_cast(ModbusFunction::READ_COIL)) { - pthread_mutex_unlock(&socketMutex); - return ModbusError::INVALID_RESPONSE; - } - // Set the internal coil state from the response - coilState = (commResponseBuffer[9] & 0x01) != 0; - pthread_mutex_unlock(&socketMutex); - return ModbusError::NONE; -} - -ModbusError ModbusTCPClient::readMultipleCoils(int address, int count, bool coilStates[]) { - if (count < 1 || count > 2000) { // MODBUS limits: 1-2000 coils per request - printf("MODBUS_TCP_CLIENT: Invalid coil count (1-2000 allowed)\n"); - return ModbusError::INVALID_RESPONSE; - } - pthread_mutex_lock(&socketMutex); - buildReadRequest(commRequestBuffer, ModbusFunction::READ_COIL, address, count); - if (!sendRequest(commRequestBuffer, 12)) { - pthread_mutex_unlock(&socketMutex); - return ModbusError::TIMEOUT; - } - // Expected response size: fixed header (9 bytes) + variable byte count. - int byteCount = (count + 7) / 8; // 1 byte per 8 coils - int expectedSize = 9 + byteCount; - if (!receiveResponse(commResponseBuffer, expectedSize)) { - pthread_mutex_unlock(&socketMutex); - return ModbusError::TIMEOUT; - } - // Handle MODBUS exception responses (0x80 + function code) - if (commResponseBuffer[7] & 0x80) { - printf("MODBUS_TCP_CLIENT: MODBUS Exception Code %02X\n", commResponseBuffer[8]); - pthread_mutex_unlock(&socketMutex); - return ModbusError::EXCEPTION_RESPONSE; - } - // Ensure the function code in the response matches the request. - if (commResponseBuffer[7] != static_cast(ModbusFunction::READ_COIL)) { - pthread_mutex_unlock(&socketMutex); - return ModbusError::INVALID_RESPONSE; - } - // Extract coil values: data starts at index 9. - for (int i = 0; i < count; i++) { - int byteIndex = 9 + (i / 8); - int bitIndex = i % 8; - coilStates[i] = (commResponseBuffer[byteIndex] >> bitIndex) & 0x01; - } - pthread_mutex_unlock(&socketMutex); - return ModbusError::NONE; -} - -ModbusError ModbusTCPClient::readDiscreteInput(int address, bool &discreteInput) { - pthread_mutex_lock(&socketMutex); - // Build a request for one discrete input (quantity = 1) - buildReadRequest(commRequestBuffer, ModbusFunction::READ_DISCRETE_INPUT, address, 1); - if (!sendRequest(commRequestBuffer, 12)) { - pthread_mutex_unlock(&socketMutex); - return ModbusError::TIMEOUT; - } - // Expect 10 bytes: header (9 bytes) + 1 byte data - int expectedSize = 9 + 1; - if (!receiveResponse(commResponseBuffer, expectedSize)) { - pthread_mutex_unlock(&socketMutex); - return ModbusError::TIMEOUT; - } - // Check for MODBUS exception response - if (commResponseBuffer[7] & 0x80) { - printf("MODBUS_TCP_CLIENT: Exception Code %02X\n", commResponseBuffer[8]); - pthread_mutex_unlock(&socketMutex); - return ModbusError::EXCEPTION_RESPONSE; - } - // Validate function code - if (commResponseBuffer[7] != static_cast(ModbusFunction::READ_DISCRETE_INPUT)) { - pthread_mutex_unlock(&socketMutex); - return ModbusError::INVALID_RESPONSE; - } - // Extract the discrete input state (first bit of the data byte at index 9) - discreteInput = (commResponseBuffer[9] & 0x01) != 0; - pthread_mutex_unlock(&socketMutex); - return ModbusError::NONE; -} - -ModbusError ModbusTCPClient::readMultipleDiscreteInputs(int address, int count, bool discreteInputsArray[]) { - if (count < 1 || count > 2000) { // MODBUS limits: 1-2000 discrete inputs per request - printf("MODBUS_TCP_CLIENT: Invalid discrete input count (1- allowed)\n"); - return ModbusError::INVALID_RESPONSE; - } - pthread_mutex_lock(&socketMutex); - buildReadRequest(commRequestBuffer, ModbusFunction::READ_DISCRETE_INPUT, address, count); - if (!sendRequest(commRequestBuffer, 12)) { - pthread_mutex_unlock(&socketMutex); - return ModbusError::TIMEOUT; - } - // Expected response: 9-byte header + ceil(count/8) bytes of data - int byteCount = (count + 7) / 8; - int expectedSize = 9 + byteCount; - if (!receiveResponse(commResponseBuffer, expectedSize)) { - pthread_mutex_unlock(&socketMutex); - return ModbusError::TIMEOUT; - } - if (commResponseBuffer[7] & 0x80) { - printf("MODBUS_TCP_CLIENT: Exception Code %02X\n", commResponseBuffer[8]); - pthread_mutex_unlock(&socketMutex); - return ModbusError::EXCEPTION_RESPONSE; - } - if (commResponseBuffer[7] != static_cast(ModbusFunction::READ_DISCRETE_INPUT)) { - pthread_mutex_unlock(&socketMutex); - return ModbusError::INVALID_RESPONSE; - } - // Extract each discrete input bit from the data starting at index 9 - for (int i = 0; i < count; i++) { - int byteIndex = 9 + (i / 8); - int bitIndex = i % 8; - discreteInputsArray[i] = (commResponseBuffer[byteIndex] >> bitIndex) & 0x01; - } - pthread_mutex_unlock(&socketMutex); - return ModbusError::NONE; -} - -ModbusError ModbusTCPClient::readHoldingRegister(int address, uint16_t &holdingRegister) { - pthread_mutex_lock(&socketMutex); - buildReadRequest(commRequestBuffer, ModbusFunction::READ_HOLDING_REGISTER, address, 1); - if (!sendRequest(commRequestBuffer, 12)) { - pthread_mutex_unlock(&socketMutex); - return ModbusError::TIMEOUT; - } - // For one register, expect 9-byte header + 2 bytes data = 11 bytes total - int expectedSize = 9 + 2; - if (!receiveResponse(commResponseBuffer, expectedSize)) { - pthread_mutex_unlock(&socketMutex); - return ModbusError::TIMEOUT; - } - if (commResponseBuffer[7] & 0x80) { - printf("MODBUS_TCP_CLIENT: Exception Code %02X\n", commResponseBuffer[8]); - pthread_mutex_unlock(&socketMutex); - return ModbusError::EXCEPTION_RESPONSE; - } - if (commResponseBuffer[7] != static_cast(ModbusFunction::READ_HOLDING_REGISTER)) { - pthread_mutex_unlock(&socketMutex); - return ModbusError::INVALID_RESPONSE; - } - // Extract the register value (big-endian: data at indices 9 and 10) - holdingRegister = (commResponseBuffer[9] << 8) | commResponseBuffer[10]; - pthread_mutex_unlock(&socketMutex); - return ModbusError::NONE; -} - -ModbusError ModbusTCPClient::readMultipleHoldingRegisters(int address, int count, uint16_t holdingRegistersArray[]) { - if (count < 1 || count > 125) { // MODBUS limits: 1-125 registers per request - printf("MODBUS_TCP_CLIENT: Invalid holding register count (1-125 allowed)\n"); - return ModbusError::INVALID_RESPONSE; - } - pthread_mutex_lock(&socketMutex); - buildReadRequest(commRequestBuffer, ModbusFunction::READ_HOLDING_REGISTER, address, count); - if (!sendRequest(commRequestBuffer, 12)) { - pthread_mutex_unlock(&socketMutex); - return ModbusError::TIMEOUT; - } - // For multiple registers: expected size = 9 + (count * 2) - int expectedSize = 9 + (count * 2); - if (!receiveResponse(commResponseBuffer, expectedSize)) { - pthread_mutex_unlock(&socketMutex); - return ModbusError::TIMEOUT; - } - if (commResponseBuffer[7] & 0x80) { - printf("MODBUS_TCP_CLIENT: Exception Code %02X\n", commResponseBuffer[8]); - pthread_mutex_unlock(&socketMutex); - return ModbusError::EXCEPTION_RESPONSE; - } - if (commResponseBuffer[7] != static_cast(ModbusFunction::READ_HOLDING_REGISTER)) { - pthread_mutex_unlock(&socketMutex); - return ModbusError::INVALID_RESPONSE; - } - // Extract each register value (each register is 2 bytes, big-endian) - for (int i = 0; i < count; i++) { - holdingRegistersArray[i] = (commResponseBuffer[9 + (i * 2)] << 8) | commResponseBuffer[10 + (i * 2)]; - } - pthread_mutex_unlock(&socketMutex); - return ModbusError::NONE; -} - -ModbusError ModbusTCPClient::readInputRegister(int address, uint16_t &inputRegister) { - pthread_mutex_lock(&socketMutex); - buildReadRequest(commRequestBuffer, ModbusFunction::READ_INPUT_REGISTER, address, 1); - if (!sendRequest(commRequestBuffer, 12)) { - pthread_mutex_unlock(&socketMutex); - return ModbusError::TIMEOUT; - } - // For one input register: expected size = 9 + 2 = 11 bytes - int expectedSize = 9 + 2; - if (!receiveResponse(commResponseBuffer, expectedSize)) { - pthread_mutex_unlock(&socketMutex); - return ModbusError::TIMEOUT; - } - if (commResponseBuffer[7] & 0x80) { - printf("MODBUS_TCP_CLIENT: Exception Code %02X\n", commResponseBuffer[8]); - pthread_mutex_unlock(&socketMutex); - return ModbusError::EXCEPTION_RESPONSE; - } - if (commResponseBuffer[7] != static_cast(ModbusFunction::READ_INPUT_REGISTER)) { - pthread_mutex_unlock(&socketMutex); - return ModbusError::INVALID_RESPONSE; - } - inputRegister = (commResponseBuffer[9] << 8) | commResponseBuffer[10]; - pthread_mutex_unlock(&socketMutex); - return ModbusError::NONE; -} - -ModbusError ModbusTCPClient::readMultipleInputRegisters(int address, int count, uint16_t inputRegistersArray[]) { - if (count < 1 || count > 125) { // MODBUS limits: 1-125 registers per request - printf("MODBUS_TCP_CLIENT: Invalid input register count (1-125 allowed)\n"); - return ModbusError::INVALID_RESPONSE; - } - pthread_mutex_lock(&socketMutex); - buildReadRequest(commRequestBuffer, ModbusFunction::READ_INPUT_REGISTER, address, count); - if (!sendRequest(commRequestBuffer, 12)) { - pthread_mutex_unlock(&socketMutex); - return ModbusError::TIMEOUT; - } - // For multiple registers: expected size = 9 + (count * 2) - int expectedSize = 9 + (count * 2); - if (!receiveResponse(commResponseBuffer, expectedSize)) { - pthread_mutex_unlock(&socketMutex); - return ModbusError::TIMEOUT; - } - if (commResponseBuffer[7] & 0x80) { - printf("MODBUS_TCP_CLIENT: Exception Code %02X\n", commResponseBuffer[8]); - pthread_mutex_unlock(&socketMutex); - return ModbusError::EXCEPTION_RESPONSE; - } - if (commResponseBuffer[7] != static_cast(ModbusFunction::READ_INPUT_REGISTER)) { - pthread_mutex_unlock(&socketMutex); - return ModbusError::INVALID_RESPONSE; - } - // Extract each register value (each register is 2 bytes, big-endian) - for (int i = 0; i < count; i++) { - inputRegistersArray[i] = (commResponseBuffer[9 + (i * 2)] << 8) | commResponseBuffer[10 + (i * 2)]; - } - pthread_mutex_unlock(&socketMutex); - return ModbusError::NONE; -} - -ModbusError ModbusTCPClient::writeCoil(int address, bool value) { - pthread_mutex_lock(&socketMutex); - buildWriteSingleRequest(commRequestBuffer, ModbusFunction::WRITE_SINGLE_COIL, address, value ? 0xFF00 : 0x0000); - if (!sendRequest(commRequestBuffer, 12)) { - pthread_mutex_unlock(&socketMutex); - return ModbusError::TIMEOUT; - } - if (!receiveResponse(commResponseBuffer, 12)) { - pthread_mutex_unlock(&socketMutex); - return ModbusError::TIMEOUT; - } - for (int i = 0; i < 12; i++) { - if (commRequestBuffer[i] != commResponseBuffer[i]) { - printf("MODBUS_TCP_CLIENT: Response does not match request!\n"); - pthread_mutex_unlock(&socketMutex); - return ModbusError::INVALID_RESPONSE; - } - } - pthread_mutex_unlock(&socketMutex); - return ModbusError::NONE; -} - -ModbusError ModbusTCPClient::writeMultipleCoils(int address, int count, const bool values[]) { - pthread_mutex_lock(&socketMutex); - - if (count < 1 || count > numCoils) { - printf("MODBUS_TCP_CLIENT: Invalid coil count (1-%d allowed)\n", numCoils); - pthread_mutex_unlock(&socketMutex); - return ModbusError::INVALID_RESPONSE; - } - - // Each coil is a bit; compute number of bytes required. - int byteCount = (count + 7) / 8; - uint8_t coilData[byteCount]; - // Initialize coilData to 0. - for (int i = 0; i < byteCount; i++) { - coilData[i] = 0; - } - // Pack each boolean value into the appropriate bit. - for (int i = 0; i < count; i++) { - if (values[i]) { - coilData[i / 8] |= (1 << (i % 8)); - } - } - // Build the write multiple coils request. - // Request size is 13 + byteCount. - int requestSize = 13 + byteCount; - buildWriteMultipleRequest(commRequestBuffer, ModbusFunction::WRITE_MULTIPLE_COILS, address, count, coilData, byteCount); - // Send the request. - if (!sendRequest(commRequestBuffer, requestSize)) { - pthread_mutex_unlock(&socketMutex); - return ModbusError::TIMEOUT; - } - - // The expected response size for a write multiple coils request is always 12 bytes. - int expectedResponseSize = 12; - if (!receiveResponse(commResponseBuffer, expectedResponseSize)) { - pthread_mutex_unlock(&socketMutex); - return ModbusError::TIMEOUT; - } - - // Validate that the response echoes the request correctly. - // According to MODBUS TCP, the response echoes the first 10 bytes (except byte 5, which is the length field). - for (int i = 0; i < 10; i++) { - if (i == 5) continue; // Skip the length field. - if (commRequestBuffer[i] != commResponseBuffer[i]) { - printf("MODBUS_TCP_CLIENT: Response does not match request at byte %d!\n", i); - pthread_mutex_unlock(&socketMutex); - return ModbusError::INVALID_RESPONSE; - } - } - pthread_mutex_unlock(&socketMutex); - return ModbusError::NONE; -} - -ModbusError ModbusTCPClient::writeHoldingRegister(int address, uint16_t value) { - pthread_mutex_lock(&socketMutex); - // Build the write single holding register request. - buildWriteSingleRequest(commRequestBuffer, ModbusFunction::WRITE_SINGLE_HOLDING_REGISTER, address, value); - // Send the 12-byte request. - if (!sendRequest(commRequestBuffer, 12)) { - pthread_mutex_unlock(&socketMutex); - return ModbusError::TIMEOUT; - } - // Expect a full 12-byte echo response. - if (!receiveResponse(commResponseBuffer, 12)) { - pthread_mutex_unlock(&socketMutex); - return ModbusError::TIMEOUT; - } - // Validate that the entire 12-byte response matches the request. - for (int i = 0; i < 12; i++) { - if (commRequestBuffer[i] != commResponseBuffer[i]) { - printf("MODBUS_TCP_CLIENT: Response does not match request at byte %d!\n", i); - pthread_mutex_unlock(&socketMutex); - return ModbusError::INVALID_RESPONSE; - } - } - pthread_mutex_unlock(&socketMutex); - return ModbusError::NONE; -} - -ModbusError ModbusTCPClient::writeMultipleHoldingRegisters(int address, int count, const uint16_t values[]) { - pthread_mutex_lock(&socketMutex); - if (count < 1 || count > numHoldingRegisters) { - printf("MODBUS_TCP_CLIENT: Invalid register count (1-%d allowed)\n", numHoldingRegisters); - pthread_mutex_unlock(&socketMutex); - return ModbusError::INVALID_RESPONSE; - } - // Each register is 2 bytes. - int byteCount = count * 2; - uint8_t registerData[byteCount]; - // Convert each register value into big-endian format. - for (int i = 0; i < count; i++) { - registerData[i * 2] = values[i] >> 8; // High byte - registerData[i * 2 + 1] = values[i] & 0xFF; // Low byte - } - // Build the write multiple holding registers request. - // Request size is 13 + byteCount. - int requestSize = 13 + byteCount; - buildWriteMultipleRequest(commRequestBuffer, ModbusFunction::WRITE_MULTIPLE_HOLDING_REGISTERS, address, count, registerData, byteCount); - // Send the request. - if (!sendRequest(commRequestBuffer, requestSize)) { - pthread_mutex_unlock(&socketMutex); - return ModbusError::TIMEOUT; - } - // The expected response size for a write multiple holding registers request is 12 bytes. - int expectedResponseSize = 12; - if (!receiveResponse(commResponseBuffer, expectedResponseSize)) { - pthread_mutex_unlock(&socketMutex); - return ModbusError::TIMEOUT; - } - // Validate the response: Compare the first 10 bytes, skipping byte 5 (length field). - for (int i = 0; i < 10; i++) { - if (i == 5) continue; // Skip the length field. - if (commRequestBuffer[i] != commResponseBuffer[i]) { - printf("MODBUS_TCP_CLIENT: Response does not match request at byte %d!\n", i); - pthread_mutex_unlock(&socketMutex); - return ModbusError::INVALID_RESPONSE; - } - } - pthread_mutex_unlock(&socketMutex); - return ModbusError::NONE; -} - -ModbusError ModbusTCPClient::readAll() { - // For brevity, call low-level functions that update internal storage. - ModbusError error = ModbusError::NONE; - if (coilsRead) { - error = readMultipleCoils(startCoils, numCoils, coilsRead); - if (error != ModbusError::NONE) return error; - } - if (discreteInputs) { - error = readMultipleDiscreteInputs(startDiscreteInputs, numDiscreteInputs, discreteInputs); - if (error != ModbusError::NONE) return error; - } - if (inputRegisters) { - error = readMultipleInputRegisters(startInputRegisters, numInputRegisters, inputRegisters); - if (error != ModbusError::NONE) return error; - } - if (holdingRegistersRead) { - error = readMultipleHoldingRegisters(startHoldingRegisters, numHoldingRegisters, holdingRegistersRead); - } - return error; -} - -ModbusError ModbusTCPClient::writeAll() { - ModbusError error = ModbusError::NONE; - if (coilsWrite) { - error = writeMultipleCoils(startCoils, numCoils, coilsWrite); - if (error != ModbusError::NONE) return error; - } - if (holdingRegistersWrite) { - error = writeMultipleHoldingRegisters(startHoldingRegisters, numHoldingRegisters, holdingRegistersWrite); - } - return error; -} - -// Setters for writing values (preferred to be used) -void ModbusTCPClient::setCoil(int address, bool value) { - if (address >= 0 && address < numCoils) { - coilsWrite[address] = value; - } -} - -void ModbusTCPClient::setHoldingRegister(int address, uint16_t value) { - if (address >= 0 && address < numHoldingRegisters) { - holdingRegistersWrite[address] = value; - } -} - -// Getters (preferred to be used as long as readAll is being called) -bool ModbusTCPClient::getCoil(int address) const { - return (address >= 0 && address < numCoils) ? coilsRead[address] : false; -} - -bool ModbusTCPClient::getDesiredCoil(int address) const { - return (address >= 0 && address < numCoils) ? coilsWrite[address] : false; -} - -bool ModbusTCPClient::getDiscreteInput(int address) const { - return (address >= 0 && address < numDiscreteInputs) ? discreteInputs[address] : false; -} - -uint16_t ModbusTCPClient::getHoldingRegister(int address) const { - return (address >= 0 && address < numHoldingRegisters) ? holdingRegistersRead[address] : 0; -} - -uint16_t ModbusTCPClient::getDesiredHoldingRegister(int address) const { - return (address >= 0 && address < numHoldingRegisters) ? holdingRegistersWrite[address] : 0; -} - -uint16_t ModbusTCPClient::getInputRegister(int address) const { - return (address >= 0 && address < numInputRegisters) ? inputRegisters[address] : 0; -} \ No newline at end of file diff --git a/modbus_tcp_client_old.h b/modbus_tcp_client_old.h deleted file mode 100644 index ce03591..0000000 --- a/modbus_tcp_client_old.h +++ /dev/null @@ -1,127 +0,0 @@ -#ifndef MODBUS_TCP_CLIENT_H -#define MODBUS_TCP_CLIENT_H - -#include -#include -#include -#include -#include -#include // Use mutexes - -// Enum class for MODBUS function codes -enum class ModbusFunction : uint8_t { - READ_COIL = 0x01, - READ_DISCRETE_INPUT = 0x02, - READ_HOLDING_REGISTER = 0x03, - READ_INPUT_REGISTER = 0x04, - WRITE_SINGLE_COIL = 0x05, - WRITE_SINGLE_HOLDING_REGISTER = 0x06, - WRITE_MULTIPLE_COILS = 0x0F, - WRITE_MULTIPLE_HOLDING_REGISTERS = 0x10 -}; - -// Enum class for error codes -enum class ModbusError { - NONE = 0, - TIMEOUT, - INVALID_RESPONSE, - CONNECTION_LOST, - EXCEPTION_RESPONSE, - INVALID_REQUEST -}; - -class ModbusTCPClient { -public: - // Constructor that allocates dynamic buffers based on provided counts and start addresses. - ModbusTCPClient(const char* ip, int port, int numCoils, int numDI, int numIR, int numHR, - int startCoils = 0, int startDI = 0, int startIR = 0, int startHR = 0); - // Simpler constructor for manual MODBUS function calls (without readAll/writeAll) - ModbusTCPClient(const char* ip, int port); - ~ModbusTCPClient(); - - // Set start addresses for each type. - void setStartAddresses(int startCoils, int startDI, int startIR, int startHR); - - // Connection functions - bool connectServer(); - void disconnectServer(); - bool isConnected() const; - bool reconnectServer(); - - // Set the timeout (in milliseconds) for receiving responses. - void setTimeout(int milliseconds); - - // Getters and setters for data values (if using the automatic mode). - void setCoil(int address, bool value); - void setHoldingRegister(int address, uint16_t value); - bool getCoil(int address) const; - bool getDesiredCoil(int address) const; - bool getDiscreteInput(int address) const; - uint16_t getHoldingRegister(int address) const; - uint16_t getDesiredHoldingRegister(int address) const; - uint16_t getInputRegister(int address) const; - - // High-level functions: readAll and writeAll update the internal buffers. - ModbusError readAll(); - ModbusError writeAll(); - - // Low-level MODBUS functions (manual calls) - ModbusError readCoil(int address, bool &coilState); - ModbusError readMultipleCoils(int address, int count, bool coilStates[]); - ModbusError readDiscreteInput(int address, bool &discreteInput); - ModbusError readMultipleDiscreteInputs(int address, int count, bool discreteInputs[]); - ModbusError readHoldingRegister(int address, uint16_t &holdingRegister); - ModbusError readMultipleHoldingRegisters(int address, int count, uint16_t holdingRegisters[]); - ModbusError readInputRegister(int address, uint16_t &inputRegister); - ModbusError readMultipleInputRegisters(int address, int count, uint16_t inputRegisters[]); - - ModbusError writeCoil(int address, bool value); - ModbusError writeMultipleCoils(int address, int count, const bool values[]); - ModbusError writeHoldingRegister(int address, uint16_t value); - ModbusError writeMultipleHoldingRegisters(int address, int count, const uint16_t values[]); - -private: - // TCP settings - const char* serverIP; - int serverPort; - int socketFD; - uint16_t transactionID; - int timeoutMilliseconds = 2000; // Default 2-second timeout - - // Start addresses for each data type - int startCoils, startDiscreteInputs, startInputRegisters, startHoldingRegisters; - // Number of items for each type - int numCoils, numDiscreteInputs, numInputRegisters, numHoldingRegisters; - - // Internal storage for automatic readAll()/writeAll() mode - bool* coilsRead; // Actual state from PLC - bool* coilsWrite; // Desired state to write - bool* discreteInputs; // Only read - uint16_t* inputRegisters; // Only read - uint16_t* holdingRegistersRead; // Actual values from PLC - uint16_t* holdingRegistersWrite; // Desired values to write - - // --- Communication buffers (shared for both reading and writing) - uint8_t* commRequestBuffer; // Preallocated request buffer - uint8_t* commResponseBuffer; // Preallocated response buffer - int commRequestBufferSize; // Maximum request size needed - int commResponseBufferSize; // Maximum response size needed - - // Global mutex to protect the TCP socket and communication buffers. - pthread_mutex_t socketMutex; - - // Low-level communication functions using the shared buffers. - bool sendRequest(uint8_t* request, int requestSize); - bool receiveResponse(uint8_t* response, int expectedSize); - - // Message building functions – they write into a provided buffer. - void buildReadRequest(uint8_t* buffer, ModbusFunction functionCode, uint16_t startAddr, uint16_t quantity); - void buildWriteSingleRequest(uint8_t* buffer, ModbusFunction functionCode, uint16_t address, uint16_t value); - void buildWriteMultipleRequest(uint8_t* buffer, ModbusFunction functionCode, uint16_t address, uint16_t count, const void* values, uint8_t byteCount); - - // Helper functions to compute maximum buffer sizes. - int computeMaxReadResponseSize() const; - int computeMaxWriteRequestSize() const; -}; - -#endif // MODBUS_TCP_CLIENT_H diff --git a/modbus_tcp_client_old_old.cpp b/modbus_tcp_client_old_old.cpp deleted file mode 100644 index 101c3a3..0000000 --- a/modbus_tcp_client_old_old.cpp +++ /dev/null @@ -1,757 +0,0 @@ -#include "modbus_tcp_client.h" -#include // For select() timeout - -ModbusTCPClient::ModbusTCPClient(const char* ip, int port, int numCoils, int numDI, int numIR, int numHR, - int startCoils, int startDI, int startIR, int startHR) - : serverIP(ip), serverPort(port), socketFD(-1), transactionID(1), - numCoils(numCoils), numDiscreteInputs(numDI), numInputRegisters(numIR), numHoldingRegisters(numHR), - startCoils(startCoils), startDiscreteInputs(startDI), startInputRegisters(startIR), startHoldingRegisters(startHR) { - - // Allocate memory dynamically based on provided sizes - coilsRead = new bool[numCoils](); - coilsWrite = new bool[numCoils](); - discreteInputs = new bool[numDiscreteInputs](); - - inputRegisters = new uint16_t[numInputRegisters](); - holdingRegistersRead = new uint16_t[numHoldingRegisters](); - holdingRegistersWrite = new uint16_t[numHoldingRegisters](); -} - -ModbusTCPClient::ModbusTCPClient(const char* ip, int port) - : serverIP(ip), serverPort(port), socketFD(-1) { - /* - This constructor is if the user manually wants to call MODBUS TCP functions and not - use readAll() and writeAll() and the setters/getters - */ - - // Set everything to nullptr so that readAll() and writeAll() won't work - coilsRead = nullptr; - coilsWrite = nullptr; - discreteInputs = nullptr; - - inputRegisters = nullptr; - holdingRegistersRead = nullptr; - holdingRegistersWrite = nullptr; -} - -ModbusTCPClient::~ModbusTCPClient() { - delete[] coilsRead; - delete[] coilsWrite; - delete[] discreteInputs; - - delete[] inputRegisters; - delete[] holdingRegistersRead; - delete[] holdingRegistersWrite; -} - -void ModbusTCPClient::setStartAddresses(int startCoils, int startDI, int startIR, int startHR) { - this->startCoils = startCoils; - this->startDiscreteInputs = startDI; - this->startInputRegisters = startIR; - this->startHoldingRegisters = startHR; -} - -bool ModbusTCPClient::connectServer() { - // Step 1: If socket is already open, verify it's still connected - if (socketFD != -1) { - struct timeval timeout; - timeout.tv_sec = 0; - timeout.tv_usec = 100000; // 100ms timeout for connection check - - fd_set read_fds; - FD_ZERO(&read_fds); - FD_SET(socketFD, &read_fds); - - int result = select(socketFD + 1, &read_fds, NULL, NULL, &timeout); - - if (result == 0) { - // No error in select, socket is still connected - printf("MODBUS_TCP_CLIENT: Already connected to MODBUS server\n"); - return true; - } else { - // Connection is broken, close and reset - printf("MODBUS_TCP_CLIENT: Warning: Connection lost, reconnecting...\n"); - disconnectServer(); - } - } - - // Step 2: Create a new socket - for (int attempts = 0; attempts < 5; attempts++) { // Retry up to 5 times - socketFD = socket(AF_INET, SOCK_STREAM, 0); - if (socketFD < 0) { - printf("MODBUS_TCP_CLIENT: Could not create socket\n"); - return false; - } - - struct sockaddr_in serverAddr; - serverAddr.sin_family = AF_INET; - serverAddr.sin_port = htons(serverPort); - inet_pton(AF_INET, serverIP, &serverAddr.sin_addr); - - // Step 3: Attempt to connect - printf("MODBUS_TCP_CLIENT: Attempting to connect to MODBUS server (Try %d)...\n", attempts + 1); - if (connect(socketFD, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == 0) { - printf("MODBUS_TCP_CLIENT: Connected to MODBUS server at %s:%d\n", serverIP, serverPort); - return true; - } - - printf("MODBUS_TCP_CLIENT: Connection failed, retrying...\n"); - disconnectServer(); // Close socket before retrying - usleep(100000); // Wait 100ms before retrying - } -} - -void ModbusTCPClient::disconnectServer() { - if (socketFD != -1) { - close(socketFD); - socketFD = -1; - printf("MODBUS_TCP_CLIENT: Disconnected from MODBUS server\n"); - } -} - -void ModbusTCPClient::setTimeout(int milliseconds) { - timeoutMilliseconds = milliseconds; - printf("MODBUS_TCP_CLIENT: Timeout set to %d ms\n", timeoutMilliseconds); -} - -bool ModbusTCPClient::isConnected() const { - return socketFD != -1; -} - -bool ModbusTCPClient::reconnectServer() { - printf("MODBUS_TCP_CLIENT: Attempting manual reconnection...\n"); - disconnectServer(); - return connectServer(); -} - -bool ModbusTCPClient::sendRequest(uint8_t* request, int requestSize) { - // Ensure we're connected before sending - if (socketFD == -1) { - printf("MODBUS_TCP_CLIENT: Connection lost. Attempting to reconnect...\n"); - if (!connectServer()) { - printf("MODBUS_TCP_CLIENT: Reconnection failed. Cannot send request.\n"); - return false; - } - } - - int bytesSent = write(socketFD, request, requestSize); - if (bytesSent <= 0) { // Detect broken connection during write - printf("MODBUS_TCP_CLIENT: Write failed, connection lost. Disconnecting...\n"); - disconnectServer(); - return false; - } - - return bytesSent == requestSize; - return bytesSent == requestSize; -} - -bool ModbusTCPClient::receiveResponse(uint8_t* response, int expectedSize) { - int totalBytesReceived = 0; - - while (totalBytesReceived < expectedSize) { - struct timeval timeout; - timeout.tv_sec = timeoutMilliseconds / 1000; // Convert ms to seconds - timeout.tv_usec = (timeoutMilliseconds % 1000) * 1000; // Convert remaining ms to µs - - fd_set read_fds; - FD_ZERO(&read_fds); - FD_SET(socketFD, &read_fds); - - // Use select() to wait for data before reading - int ready = select(socketFD + 1, &read_fds, NULL, NULL, &timeout); - if (ready == 0) { // Timeout case - printf("MODBUS_TCP_CLIENT: Timeout waiting for MODBUS response. Disconnecting...\n"); - disconnectServer(); // Close socket and reset socketFD - return false; - } else if (ready < 0) { // Select failed - printf("MODBUS_TCP_CLIENT: Select failed. Disconnecting...\n"); - disconnectServer(); // Close socket and reset socketFD - return false; - } - - // Read available data - int bytesReceived = read(socketFD, response + totalBytesReceived, expectedSize - totalBytesReceived); - if (bytesReceived <= 0) { // Connection lost or no data received - printf("MODBUS_TCP_CLIENT: Connection lost. Disconnecting...\n"); - disconnectServer(); // Close socket and reset socketFD - return false; - } - - totalBytesReceived += bytesReceived; - } - - return true; -} - -void ModbusTCPClient::buildReadRequest(uint8_t* buffer, ModbusFunction functionCode, uint16_t startAddr, uint16_t quantity) { - transactionID++; - - // Transaction ID - buffer[0] = transactionID >> 8; - buffer[1] = transactionID & 0xFF; - // Protocol ID, always 00 00 - buffer[2] = 0x00; - buffer[3] = 0x00; - // Length (remaining bytes after Unit ID) - buffer[4] = 0x00; - buffer[5] = 0x06; - // Unit ID (Slave Address) - buffer[6] = 0x01; - // Function code - buffer[7] = static_cast(functionCode); - // Start Address - buffer[8] = startAddr >> 8; - buffer[9] = startAddr & 0xFF; - // Quantity (How many coils to read) - buffer[10] = quantity >> 8; - buffer[11] = quantity & 0xFF; -} - -void ModbusTCPClient::buildWriteSingleRequest(uint8_t* buffer, ModbusFunction functionCode, uint16_t address, uint16_t value) { - transactionID++; - - buffer[0] = transactionID >> 8; - buffer[1] = transactionID & 0xFF; - buffer[2] = 0x00; - buffer[3] = 0x00; - buffer[4] = 0x00; - buffer[5] = 0x06; - buffer[6] = 0x01; - buffer[7] = static_cast(functionCode); - buffer[8] = address >> 8; - buffer[9] = address & 0xFF; - buffer[10] = value >> 8; - buffer[11] = value & 0xFF; -} - -void ModbusTCPClient::buildWriteMultipleRequest(uint8_t* buffer, ModbusFunction functionCode, uint16_t address, uint16_t count, const void* values, uint8_t byteCount) { - transactionID++; - - // MODBUS TCP Header - buffer[0] = transactionID >> 8; - buffer[1] = transactionID & 0xFF; - buffer[2] = 0x00; // Protocol ID (always 0x0000) - buffer[3] = 0x00; - buffer[4] = 0x00; // Length (remaining bytes after Unit ID) - buffer[5] = 7 + byteCount; - buffer[6] = 0x01; // Unit ID - buffer[7] = static_cast(functionCode); // Function Code (0x0F for coils, 0x10 for registers) - buffer[8] = address >> 8; // Start address high byte - buffer[9] = address & 0xFF; // Start address low byte - buffer[10] = count >> 8; // Quantity high byte - buffer[11] = count & 0xFF; // Quantity low byte - buffer[12] = byteCount; // Byte count - - // Copy data payload manually (instead of memcpy) - const uint8_t* data = (const uint8_t*)values; - for (uint8_t i = 0; i < byteCount; i++) { - buffer[13 + i] = data[i]; - } -} - -ModbusError ModbusTCPClient::readCoil(int address, bool &coilState) { - uint8_t request[12]; - buildReadRequest(request, ModbusFunction::READ_COIL, address, 1); - - sendRequest(request, 12); - - uint8_t response[10]; // Expecting 10 bytes - if (!receiveResponse(response, 10)) { - return ModbusError::TIMEOUT; - } - - // Handle MODBUS exception responses (0x80 + function code) - if (response[7] & 0x80) { - printf("MODBUS_TCP_CLIENT: MODBUS Exception Code %02X\n", response[8]); - return ModbusError::EXCEPTION_RESPONSE; - } - - // Ensure function code matches the request (allowing for server behavior) - if (response[7] != static_cast(ModbusFunction::READ_COIL)) { - printf("MODBUS_TCP_CLIENT: Warning: Unexpected function code (Expected: %02X, Got: %02X)\n", - static_cast(ModbusFunction::READ_COIL), response[7]); - return ModbusError::INVALID_RESPONSE; - } - - // Extract coil state (only first bit is used) - coilState = (response[9] & 0x01) != 0; // Adjusted index based on 10-byte response - return ModbusError::NONE; -} - -ModbusError ModbusTCPClient::readMultipleCoils(int address, int count, bool coilStates[]) { - if (count < 1 || count > 2000) { - printf("MODBUS_TCP_CLIENT: Invalid coil count (1-2000 allowed)\n"); - return ModbusError::INVALID_RESPONSE; - } - - uint8_t request[12]; - buildReadRequest(request, ModbusFunction::READ_COIL, address, count); - - sendRequest(request, 12); - - // Expected response size: Fixed header (9) + variable byte count - int byteCount = (count + 7) / 8; // 1 byte per 8 coils - int expectedSize = 9 + byteCount; - - uint8_t response[256]; // Ensure buffer is large enough - if (!receiveResponse(response, expectedSize)) { - return ModbusError::TIMEOUT; - } - - // Handle MODBUS exception responses (0x80 + function code) - if (response[7] & 0x80) { - printf("MODBUS_TCP_CLIENT: MODBUS Exception Code %02X\n", response[8]); - return ModbusError::EXCEPTION_RESPONSE; - } - - // Ensure the function code matches - if (response[7] != static_cast(ModbusFunction::READ_COIL)) { - printf("MODBUS_TCP_CLIENT: Warning: Unexpected function code (Expected: %02X, Got: %02X)\n", - static_cast(ModbusFunction::READ_COIL), response[7]); - return ModbusError::INVALID_RESPONSE; - } - - // Read coil values - for (int i = 0; i < count; i++) { - int byteIndex = 9 + (i / 8); // Data starts at index 9 - int bitIndex = i % 8; - coilStates[i] = (response[byteIndex] >> bitIndex) & 0x01; - } - - return ModbusError::NONE; -} - -ModbusError ModbusTCPClient::readDiscreteInput(int address, bool &discreteInput) { - uint8_t request[12]; - buildReadRequest(request, ModbusFunction::READ_DISCRETE_INPUT, address, 1); - - sendRequest(request, 12); - - uint8_t response[10]; // Expected response size - if (!receiveResponse(response, 10)) { - return ModbusError::TIMEOUT; - } - - // Handle MODBUS exception responses (0x80 + function code) - if (response[7] & 0x80) { - printf("MODBUS_TCP_CLIENT: MODBUS Exception Code %02X\n", response[8]); - return ModbusError::EXCEPTION_RESPONSE; - } - - // Ensure function code matches the request - if (response[7] != static_cast(ModbusFunction::READ_DISCRETE_INPUT)) { - printf("MODBUS_TCP_CLIENT: Warning: Unexpected function code (Expected: %02X, Got: %02X)\n", - static_cast(ModbusFunction::READ_DISCRETE_INPUT), response[7]); - return ModbusError::INVALID_RESPONSE; - } - - // Extract single discrete input state - discreteInput = (response[9] & 0x01) != 0; - return ModbusError::NONE; // Success -} - -ModbusError ModbusTCPClient::readMultipleDiscreteInputs(int address, int count, bool discreteInputs[]) { - if (count < 1 || count > 2000) { - printf("MODBUS_TCP_CLIENT: Invalid discrete input count (1-2000 allowed)\n"); - return ModbusError::INVALID_RESPONSE; - } - - uint8_t request[12]; - buildReadRequest(request, ModbusFunction::READ_DISCRETE_INPUT, address, count); - - sendRequest(request, 12); - - // Expected response size: Fixed header (9) + variable byte count - int byteCount = (count + 7) / 8; // 1 byte per 8 inputs - int expectedSize = 9 + byteCount; - - uint8_t response[256]; // Ensure buffer is large enough - if (!receiveResponse(response, expectedSize)) { - return ModbusError::TIMEOUT; - } - - // Handle MODBUS exception responses (0x80 + function code) - if (response[7] & 0x80) { - printf("MODBUS_TCP_CLIENT: MODBUS Exception Code %02X\n", response[8]); - return ModbusError::EXCEPTION_RESPONSE; - } - - // Ensure the function code matches - if (response[7] != static_cast(ModbusFunction::READ_DISCRETE_INPUT)) { - printf("MODBUS_TCP_CLIENT: Warning: Unexpected function code (Expected: %02X, Got: %02X)\n", - static_cast(ModbusFunction::READ_DISCRETE_INPUT), response[7]); - return ModbusError::INVALID_RESPONSE; - } - - // Read discrete input values - for (int i = 0; i < count; i++) { - int byteIndex = 9 + (i / 8); // Data starts at index 9 - int bitIndex = i % 8; - discreteInputs[i] = (response[byteIndex] >> bitIndex) & 0x01; - } - - return ModbusError::NONE; -} - -ModbusError ModbusTCPClient::readHoldingRegister(int address, uint16_t &holdingRegister) { - uint8_t request[12]; - buildReadRequest(request, ModbusFunction::READ_HOLDING_REGISTER, address, 1); - - sendRequest(request, 12); - - uint8_t response[11]; // Expected response size for reading 1 register - if (!receiveResponse(response, 11)) { - return ModbusError::TIMEOUT; - } - - // Handle MODBUS exception responses (0x80 + function code) - if (response[7] & 0x80) { - printf("MODBUS_TCP_CLIENT: MODBUS Exception Code %02X\n", response[8]); - return ModbusError::EXCEPTION_RESPONSE; - } - - // Ensure function code matches the request - if (response[7] != static_cast(ModbusFunction::READ_HOLDING_REGISTER)) { - printf("MODBUS_TCP_CLIENT: Warning: Unexpected function code (Expected: %02X, Got: %02X)\n", - static_cast(ModbusFunction::READ_HOLDING_REGISTER), response[7]); - return ModbusError::INVALID_RESPONSE; - } - - // Extract holding register value (Big-endian format) - holdingRegister = (response[9] << 8) | response[10]; - return ModbusError::NONE; // Success -} - -ModbusError ModbusTCPClient::readMultipleHoldingRegisters(int address, int count, uint16_t holdingRegisters[]) { - if (count < 1 || count > 125) { // MODBUS limits reading up to 125 registers per request - printf("MODBUS_TCP_CLIENT: Invalid holding register count (1-125 allowed)\n"); - return ModbusError::INVALID_RESPONSE; - } - - uint8_t request[12]; - buildReadRequest(request, ModbusFunction::READ_HOLDING_REGISTER, address, count); - - sendRequest(request, 12); - - // Expected response size: 9-byte header + 2 * count registers - int expectedSize = 9 + (count * 2); - uint8_t response[256]; // Ensure buffer is large enough - - if (!receiveResponse(response, expectedSize)) { - return ModbusError::TIMEOUT; - } - - // Handle MODBUS exception responses (0x80 + function code) - if (response[7] & 0x80) { - printf("MODBUS_TCP_CLIENT: MODBUS Exception Code %02X\n", response[8]); - return ModbusError::EXCEPTION_RESPONSE; - } - - // Ensure function code matches the request - if (response[7] != static_cast(ModbusFunction::READ_HOLDING_REGISTER)) { - printf("MODBUS_TCP_CLIENT: Warning: Unexpected function code (Expected: %02X, Got: %02X)\n", - static_cast(ModbusFunction::READ_HOLDING_REGISTER), response[7]); - return ModbusError::INVALID_RESPONSE; - } - - // Extract register values (each register is 2 bytes, big-endian) - for (int i = 0; i < count; i++) { - holdingRegisters[i] = (response[9 + (i * 2)] << 8) | response[10 + (i * 2)]; - } - - return ModbusError::NONE; -} - -ModbusError ModbusTCPClient::readInputRegister(int address, uint16_t &inputRegister) { - uint8_t request[12]; - buildReadRequest(request, ModbusFunction::READ_INPUT_REGISTER, address, 1); - - sendRequest(request, 12); - - uint8_t response[11]; // Expected response size for reading 1 register - if (!receiveResponse(response, 11)) { - return ModbusError::TIMEOUT; - } - - // Handle MODBUS exception responses (0x80 + function code) - if (response[7] & 0x80) { - printf("MODBUS_TCP_CLIENT: MODBUS Exception Code %02X\n", response[8]); - return ModbusError::EXCEPTION_RESPONSE; - } - - // Ensure function code matches the request - if (response[7] != static_cast(ModbusFunction::READ_INPUT_REGISTER)) { - printf("MODBUS_TCP_CLIENT: Warning: Unexpected function code (Expected: %02X, Got: %02X)\n", - static_cast(ModbusFunction::READ_INPUT_REGISTER), response[7]); - return ModbusError::INVALID_RESPONSE; - } - - // Extract input register value (Big-endian format) - inputRegister = (response[9] << 8) | response[10]; - return ModbusError::NONE; // Success -} - -ModbusError ModbusTCPClient::readMultipleInputRegisters(int address, int count, uint16_t inputRegisters[]) { - if (count < 1 || count > 125) { // MODBUS limits reading up to 125 registers per request - printf("MODBUS_TCP_CLIENT: Invalid input register count (1-125 allowed)\n"); - return ModbusError::INVALID_RESPONSE; - } - - uint8_t request[12]; - buildReadRequest(request, ModbusFunction::READ_INPUT_REGISTER, address, count); - - sendRequest(request, 12); - - // Expected response size: 9-byte header + 2 * count registers - int expectedSize = 9 + (count * 2); - uint8_t response[256]; // Ensure buffer is large enough - - if (!receiveResponse(response, expectedSize)) { - return ModbusError::TIMEOUT; - } - - // Handle MODBUS exception responses (0x80 + function code) - if (response[7] & 0x80) { - printf("MODBUS_TCP_CLIENT: MODBUS Exception Code %02X\n", response[8]); - return ModbusError::EXCEPTION_RESPONSE; - } - - // Ensure function code matches the request - if (response[7] != static_cast(ModbusFunction::READ_INPUT_REGISTER)) { - printf("MODBUS_TCP_CLIENT: Warning: Unexpected function code (Expected: %02X, Got: %02X)\n", - static_cast(ModbusFunction::READ_INPUT_REGISTER), response[7]); - return ModbusError::INVALID_RESPONSE; - } - - // Extract register values (each register is 2 bytes, big-endian) - for (int i = 0; i < count; i++) { - inputRegisters[i] = (response[9 + (i * 2)] << 8) | response[10 + (i * 2)]; - } - - return ModbusError::NONE; -} - -ModbusError ModbusTCPClient::writeCoil(int address, bool value) { - uint8_t request[12]; - buildWriteSingleRequest(request, ModbusFunction::WRITE_SINGLE_COIL, address, value ? 0xFF00 : 0x0000); - sendRequest(request, 12); - - // Receive response - uint8_t response[12]; - if (!receiveResponse(response, 12)) { - return ModbusError::TIMEOUT; // No response received - } - - // Check if response matches request (MODBUS TCP should echo back the same request) - for (int i = 0; i < 12; i++) { - if (request[i] != response[i]) { - printf("MODBUS_TCP_CLIENT: Response does not match request!\n"); - return ModbusError::INVALID_RESPONSE; - } - } - - return ModbusError::NONE; // Success -} - -ModbusError ModbusTCPClient::writeMultipleCoils(int address, int count, const bool values[]) { - if (count < 1 || count > 1968) { // MODBUS limit: max 1968 coils per request - printf("MODBUS_TCP_CLIENT: Invalid coil count (1-1968 allowed)\n"); - return ModbusError::INVALID_RESPONSE; - } - - int byteCount = (count + 7) / 8; // Each byte holds 8 coils - uint8_t coilData[byteCount]; - - // Initialize to 0 (since we may not use all bits) - for (int i = 0; i < byteCount; i++) { - coilData[i] = 0; - } - - // Pack coil data into bytes - for (int i = 0; i < count; i++) { - if (values[i]) { - coilData[i / 8] |= (1 << (i % 8)); - } - } - - uint8_t request[13 + byteCount]; - buildWriteMultipleRequest(request, ModbusFunction::WRITE_MULTIPLE_COILS, address, count, coilData, byteCount); - - sendRequest(request, 13 + byteCount); - - // The expected response is always **12 bytes** - uint8_t response[12]; - if (!receiveResponse(response, 12)) { - return ModbusError::TIMEOUT; - } - - // Ensure the response matches the **first 10 bytes**, except for byte 5 (message length byte) - for (int i = 0; i < 10; i++) { - if (i == 5) continue; // Skip byte 5 (message length field) - - if (request[i] != response[i]) { - printf("MODBUS_TCP_CLIENT: Response does not match request!\n"); - return ModbusError::INVALID_RESPONSE; - } - } - - return ModbusError::NONE; // Success -} - -ModbusError ModbusTCPClient::writeHoldingRegister(int address, uint16_t value) { - uint8_t request[12]; - buildWriteSingleRequest(request, ModbusFunction::WRITE_SINGLE_HOLDING_REGISTER, address, value); - - sendRequest(request, 12); - - // Expected response size = 12 bytes (full echo of the request) - uint8_t response[12]; - if (!receiveResponse(response, 12)) { - return ModbusError::TIMEOUT; - } - - // Ensure response matches request exactly (full 12 bytes) - for (int i = 0; i < 12; i++) { - if (request[i] != response[i]) { - printf("MODBUS_TCP_CLIENT: Response does not match request!\n"); - return ModbusError::INVALID_RESPONSE; - } - } - - return ModbusError::NONE; // Success -} - -ModbusError ModbusTCPClient::writeMultipleHoldingRegisters(int address, int count, const uint16_t values[]) { - if (count < 1 || count > 123) { // MODBUS limit: max 123 registers per request - printf("MODBUS_TCP_CLIENT: Invalid register count (1-123 allowed)\n"); - return ModbusError::INVALID_RESPONSE; - } - - int byteCount = count * 2; // Each register is 2 bytes - uint8_t registerData[byteCount]; - - // Convert register values to byte array (big-endian format) - for (int i = 0; i < count; i++) { - registerData[i * 2] = values[i] >> 8; // High byte - registerData[i * 2 + 1] = values[i] & 0xFF; // Low byte - } - - uint8_t request[13 + byteCount]; - buildWriteMultipleRequest(request, ModbusFunction::WRITE_MULTIPLE_HOLDING_REGISTERS, address, count, registerData, byteCount); - - sendRequest(request, 13 + byteCount); - - // Expected response size = 12 bytes (first 10 bytes + 2 bytes for number of registers written) - uint8_t response[12]; - if (!receiveResponse(response, 12)) { - return ModbusError::TIMEOUT; - } - - // Ensure response matches request (except for byte 5) - for (int i = 0; i < 10; i++) { - if (i == 5) continue; // Skip byte 5 (message length field) - - if (request[i] != response[i]) { - printf("MODBUS_TCP_CLIENT: Response does not match request!\n"); - return ModbusError::INVALID_RESPONSE; - } - } - - return ModbusError::NONE; // Success -} - -ModbusError ModbusTCPClient::readAll() { - /* - Reads every coil, discrete input, input register, and holding register - assuming that they start at address 0 - */ - - if (coilsRead == nullptr && discreteInputs == nullptr && - inputRegisters == nullptr && holdingRegistersRead == nullptr) { - printf("MODBUS_TCP_CLIENT: readAll() called, but wrong constructor was used.\n"); - return ModbusError::INVALID_REQUEST; - } - - ModbusError error = ModbusError::NONE; - if (coilsRead != nullptr) { - error = readMultipleCoils(startCoils, numCoils, coilsRead); - if (error != ModbusError::NONE) return error; - } - - if (discreteInputs != nullptr) { - error = readMultipleDiscreteInputs(startDiscreteInputs, numDiscreteInputs, discreteInputs); - if (error != ModbusError::NONE) return error; - } - - if (inputRegisters != nullptr) { - error = readMultipleInputRegisters(startInputRegisters, numInputRegisters, inputRegisters); - if (error != ModbusError::NONE) return error; - } - - if (holdingRegistersRead != nullptr) { - error = readMultipleHoldingRegisters(startHoldingRegisters, numHoldingRegisters, holdingRegistersRead); - - } - return error; -} - -ModbusError ModbusTCPClient::writeAll() { - /* - Reads every coil and holding register assuming that they start at address 0 - */ - if (coilsWrite == nullptr && holdingRegistersWrite) { - printf("MODBUS_TCP_CLIENT: writeAll() called, but wrong constructor was used.\n"); - return ModbusError::INVALID_REQUEST; - } - - ModbusError error = ModbusError::NONE; - if (coilsWrite != nullptr) { - error = writeMultipleCoils(startCoils, numCoils, coilsWrite); - if (error != ModbusError::NONE) return error; - } - - if (holdingRegistersWrite != nullptr) { - error = writeMultipleHoldingRegisters(startHoldingRegisters, numHoldingRegisters, holdingRegistersWrite); - } - - return error; -} - - -// Setters for writing values (preferred to be used) -void ModbusTCPClient::setCoil(int address, bool value) { - if (address >= 0 && address < numCoils) { - coilsWrite[address] = value; - } -} - -void ModbusTCPClient::setHoldingRegister(int address, uint16_t value) { - if (address >= 0 && address < numHoldingRegisters) { - holdingRegistersWrite[address] = value; - } -} - -// Getters (preferred to be used as long as readAll is being called) -bool ModbusTCPClient::getCoil(int address) const { - return (address >= 0 && address < numCoils) ? coilsRead[address] : false; -} - -bool ModbusTCPClient::getDesiredCoil(int address) const { - return (address >= 0 && address < numCoils) ? coilsWrite[address] : false; -} - -bool ModbusTCPClient::getDiscreteInput(int address) const { - return (address >= 0 && address < numDiscreteInputs) ? discreteInputs[address] : false; -} - -uint16_t ModbusTCPClient::getHoldingRegister(int address) const { - return (address >= 0 && address < numHoldingRegisters) ? holdingRegistersRead[address] : 0; -} - -uint16_t ModbusTCPClient::getDesiredHoldingRegister(int address) const { - return (address >= 0 && address < numHoldingRegisters) ? holdingRegistersWrite[address] : 0; -} - -uint16_t ModbusTCPClient::getInputRegister(int address) const { - return (address >= 0 && address < numInputRegisters) ? inputRegisters[address] : 0; -} \ No newline at end of file diff --git a/modbus_tcp_client_old_old.h b/modbus_tcp_client_old_old.h deleted file mode 100644 index ba45f14..0000000 --- a/modbus_tcp_client_old_old.h +++ /dev/null @@ -1,115 +0,0 @@ -#ifndef MODBUS_TCP_CLIENT_H -#define MODBUS_TCP_CLIENT_H - -#include -#include -#include -#include -#include - -// Enum class for MODBUS function codes -enum class ModbusFunction : uint8_t { - READ_COIL = 0x01, - READ_DISCRETE_INPUT = 0x02, - READ_HOLDING_REGISTER = 0x03, - READ_INPUT_REGISTER = 0x04, - WRITE_SINGLE_COIL = 0x05, - WRITE_SINGLE_HOLDING_REGISTER = 0x06, - WRITE_MULTIPLE_COILS = 0x0F, - WRITE_MULTIPLE_HOLDING_REGISTERS = 0x10 -}; - -enum class ModbusError { - NONE = 0, // No error - TIMEOUT, // No response from server - INVALID_RESPONSE, // Response does not match request - CONNECTION_LOST, // Connection issue - EXCEPTION_RESPONSE, // MODBUS Exception response (error code) - INVALID_REQUEST, // User tries doing something they shouldn't -}; - - -class ModbusTCPClient { -public: - ModbusTCPClient(const char* ip, int port); // Extra constructor that does CANNOT use readAll() or writeAll() - ModbusTCPClient(const char* ip, int port, int numCoils, int numDI, int numIR, int numHR, - int startCoils = 0, int startDI = 0, int startIR = 0, int startHR = 0); - - ~ModbusTCPClient(); - - // Set the start address of each type. Either use this after creating the object or put them in the constructor - void setStartAddresses(int startCoils, int startDI, int startIR, int startHR); - - bool connectServer(); - void disconnectServer(); - bool isConnected() const; - - // Manually disconnectServer and return reconnectServer() - bool reconnectServer(); - - // Set the timeout for receiving responses - void setTimeout(int milliseconds); - - // Setters (preferred to be used when calling writeAll()) - void setCoil(int address, bool value); - void setHoldingRegister(int address, uint16_t value); - - // Getters (preferred to be used when calling readAll()) - bool getCoil(int address) const; - bool getDesiredCoil(int address) const; // Retrieves the "to be written" value - bool getDiscreteInput(int address) const; - uint16_t getHoldingRegister(int address) const; - uint16_t getDesiredHoldingRegister(int address) const; // Retrieves the "to be written" value - uint16_t getInputRegister(int address) const; - - ModbusError readAll(); // Reads every coil, DI, IR, and HR - ModbusError writeAll(); // Writes every coil and HR - - // Manual MODBUS TCP actions (not preferred to be called by user) - ModbusError readCoil(int address, bool &coilState); - ModbusError readMultipleCoils(int address, int count, bool coilStates[]); - - ModbusError readDiscreteInput(int address, bool &discreteInput); - ModbusError readMultipleDiscreteInputs(int address, int count, bool discreteInputs[]); - - ModbusError readHoldingRegister(int address, uint16_t &holdingRegister); - ModbusError readMultipleHoldingRegisters(int address, int count, uint16_t holdingRegisters[]); - - ModbusError readInputRegister(int address, uint16_t &inputRegister); - ModbusError readMultipleInputRegisters(int address, int count, uint16_t inputRegisters[]); - - ModbusError writeCoil(int address, bool value); - ModbusError writeMultipleCoils(int address, int count, const bool values[]); - - ModbusError writeHoldingRegister(int address, uint16_t value); - ModbusError writeMultipleHoldingRegisters(int address, int count, const uint16_t values[]); - -private: - // TCP settings - const char* serverIP; - int serverPort; - int socketFD; - uint16_t transactionID; - int timeoutMilliseconds = 2000; // Default 2 second timeout on receiving responses - - // Storing MODBUS register information - int numCoils, numDiscreteInputs, numInputRegisters, numHoldingRegisters; - int startCoils, startDiscreteInputs, startInputRegisters, startHoldingRegisters; // The start address of each type of register - - bool* coilsRead; // Stores the actual state of coils on the MODBUS server - bool* coilsWrite; // Stores the desired state of coils to be written - bool* discreteInputs; // Only read from the MODBUS server (no writes) - - uint16_t* inputRegisters; // Only read from the MODBUS server - uint16_t* holdingRegistersRead; // Stores actual values from the MODBUS server - uint16_t* holdingRegistersWrite; // Stores desired values to write - - bool sendRequest(uint8_t* request, int requestSize); - bool receiveResponse(uint8_t* response, int expectedSize); - - void buildReadRequest(uint8_t* buffer, ModbusFunction functionCode, uint16_t startAddr, uint16_t quantity); - void buildWriteSingleRequest(uint8_t* buffer, ModbusFunction functionCode, uint16_t address, uint16_t value); - void buildWriteMultipleRequest(uint8_t* buffer, ModbusFunction functionCode, uint16_t address, uint16_t count, const void* values, uint8_t byteCount); -}; - -#endif // MODBUS_TCP_CLIENT_H \ No newline at end of file