From 80939ce776d4630ed451883bdaaf6523b5b70630 Mon Sep 17 00:00:00 2001 From: Hannes Siebeneicher Date: Fri, 28 Oct 2022 12:40:52 +0200 Subject: [PATCH 01/25] adding images --- .../07.modbus/assets/modbusStructure.png | Bin 0 -> 33697 bytes .../05.communication/07.modbus/modbus.md | 24 ++++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 content/learn/05.communication/07.modbus/assets/modbusStructure.png create mode 100644 content/learn/05.communication/07.modbus/modbus.md diff --git a/content/learn/05.communication/07.modbus/assets/modbusStructure.png b/content/learn/05.communication/07.modbus/assets/modbusStructure.png new file mode 100644 index 0000000000000000000000000000000000000000..7e09ea698341568852b88633edadb1fc1e1d6a87 GIT binary patch literal 33697 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 Date: Fri, 28 Oct 2022 12:46:36 +0200 Subject: [PATCH 02/25] fixing typos --- .../05.communication/07.modbus/modbus.md | 32 ++++++++++++------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/content/learn/05.communication/07.modbus/modbus.md b/content/learn/05.communication/07.modbus/modbus.md index 11fa2f041d..b8a472ddc5 100644 --- a/content/learn/05.communication/07.modbus/modbus.md +++ b/content/learn/05.communication/07.modbus/modbus.md @@ -1,5 +1,5 @@ --- -title: "Modbus communication serial protocoll" +title: "Modbus communication serial protocol" description: "Learn about the Modbus " author: "Hannes Siebeneicher" --- @@ -7,18 +7,28 @@ author: "Hannes Siebeneicher" ***Controller/peripheral is formerly known as master/slave. Arduino no longer supports the use of this terminology. Devices formerly known as master are referred to as controller and devices formerly known as slaves are referred to as peripheral.*** ## What is Modbus? -Modbus is an open serial communication protocol used for transmitting information over serial lines between electronic devices. It was originally published by Modicon (now Schneider Electric) in 1979. The Modbus protocol is the oldest and by far the most popular automation protocol in the field of process automation. It enables devices, such as energy meters or humidity sensors connected to the same network to communicate the results to a supervisory computer or a Programmable Logic Computer (PLC). Several versions of the Modbus protocol exist for the serial port and Ethernet and the most common are Modbus RTU, Modbus ASCII, Modbus TPU and Modbus Plus. It is based on a controller peripheral architecture and communication between nodes is achieved with send request and read response type messages. Modbus communicates over several types of physical media such as RS-232 and over Ethernet. The original Modbus interface ran on RS-232 serial communication but most the later Modbus implementations us RS-485 because it allows for longer distancer, higher speeds and the possibility of multiple devices on a single multi-drop network. The communication over serial RS-485 physical media works with two-wire transmit and receive connections. (SEE TWO WIRE TUTORIAL) +Modbus is an open serial communication protocol used for transmitting information over serial lines between electronic devices. It was originally published by Modicon (now Schneider Electric) in 1979. The Modbus protocol is the oldest and by far the most popular automation protocol in the field of process automation. It enables devices, such as energy meters or humidity sensors connected to the same network to communicate the results to a supervisory computer or a Programmable Logic Computer (PLC). Several versions of the Modbus protocol exist for the serial port and Ethernet and the most common are Modbus RTU, Modbus ASCII, Modbus TPU and Modbus Plus. It is based on a controller peripheral (formerly known as master slave) architecture and communication between nodes is achieved with send request and read response type messages. Modbus communicates over several types of physical media such as RS-232 and over Ethernet. The original Modbus interface ran on RS-232 serial communication but most of the later Modbus implementations use RS-485 because it allows for longer distancer, higher speeds and the possibility of multiple devices on a single multi-drop network. The communication over serial RS-485 physical media works with two-wire transmit and receive connections. (SEE TWO WIRE TUTORIAL) -On simple interfaces like RS-485 and RS-232 the Modbus messages are sent in plain form over the network and the network will be dedicated to only Modbus communication. However, if your network requires multiple heterogeneous devices using a more versatile system like TCP/IP over ethernet, the Modbus messages are embedded in Ethernet packets with the format prescribed for this physical interface. In this case Modbus and other types of mixed protocols can co-exist in the same physical interface at the same time. The main Modbus message structure is peer-to-peer, but it can also function on point to point and multidrop networks. As mentioned, the Modbus protocol communicates using a controller / peripheral technique in which only one device can initiate transactions, called queries. -The next part will go into more detail how the communications is done between controller and peripheral device. +On simple interfaces like RS-485 and RS-232 the Modbus messages are sent in plain form over the network and the network will be dedicated to only Modbus communication. However, if your network requires multiple heterogeneous devices using a more versatile system like TCP/IP over ethernet is recommended. In this case Modbus and other types of mixed protocols can co-exist in the same physical interface at the same time. The main Modbus message structure is peer-to-peer, but it can also function on point to point and multidrop networks. As mentioned, the Modbus protocol communicates using a controller peripheral technique in which only one device can initiate transactions, called queries. ## How does Modbus work? -Each Modbus message has the same structure. Four basic elements are present in each message and the sequence and order of these elements are the same for all messages. This allows for easy parsing of the content. The conversation is always started by the controller and when a message is sent by the controller, depending on the message the peripheral interprets the message and responds to it. Physical peripheral addressing in the message header is used to define which peripheral device should respond to a message, while all other nodes ignore the message if the address field does not match their own address. -Modbus functions perform read and write instructions to the peripheral’s internal memory registers to configure, monitor and control the peripheral’s inputs and outputs. Modbus devices will typically include a register map outlining where the configuration input and output data can be written and read from. You should always refer to the peripheral’s register map of your device to gain a better understanding of its overall operation. The Modbus data model has a simple structure described in four basic data types: -- Discrete Inputs -- Coils Output -- Input Registers (Input Data) -- Holding Registers (Output Data) +Each Modbus message has the same structure, consisting of four basic elements which are present in each message and the sequence and order of these elements are the same for all messages. This allows for easy parsing of the content. The conversation is always started by the controller and when a message is sent the peripheral interprets the message and responds to it. Every peripheral device has its own address which it reponds to when addressed by the controller, while all other devices ignore the message if the address doesn't match with their own. + +Modbus sends functions which communicate read and write instructions to the peripheral’s internal memory registers to configure, monitor and control the peripheral’s inputs and outputs. Modbus devices will typically include a register map outlining where the configuration input and output data can be written and read from. You should always refer to the peripheral’s register map of your device to gain a better understanding of its overall operation. + +The Modbus data model has a simple structure described in four basic data types: + +| Data Type | Description | +| ----------- | ----------- | +| Discrete Input | | +| Coils Input | | +| Input Registers | (Input Data) | +| Holding Registers | (Output Data) | + + The service request area of the message or Modbus Protocol Data Unit or PDU is comprised of a function code and a number of data bytes requested by the controller. The Modbus memory registers of a device are organized around the four basic data reference types and this data type is further identified by the leading number used in the devices memory address, such as, a 0 based register referencing a message to Read or Write discrete outputs or coils, or a 1 based register referencing Reading discrete inputs, or a 3 based register referencing Reading input registers, and a 4 based register referencing Reading or Writing to output or holding registers. The function code field specifies which register data group it reads or writes to and from the peripheral. -SHOW IMAGE OF FUNCTION CODE + +Dependend on the + +![](assets/modbusStructure.png) From 88975a8c57f596080d0066089bbb23cecb6de630 Mon Sep 17 00:00:00 2001 From: Hannes Siebeneicher Date: Fri, 28 Oct 2022 12:48:24 +0200 Subject: [PATCH 03/25] fix --- content/learn/05.communication/07.modbus/modbus.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/content/learn/05.communication/07.modbus/modbus.md b/content/learn/05.communication/07.modbus/modbus.md index b8a472ddc5..ef39f2aeae 100644 --- a/content/learn/05.communication/07.modbus/modbus.md +++ b/content/learn/05.communication/07.modbus/modbus.md @@ -28,7 +28,5 @@ The Modbus data model has a simple structure described in four basic data types: The service request area of the message or Modbus Protocol Data Unit or PDU is comprised of a function code and a number of data bytes requested by the controller. The Modbus memory registers of a device are organized around the four basic data reference types and this data type is further identified by the leading number used in the devices memory address, such as, a 0 based register referencing a message to Read or Write discrete outputs or coils, or a 1 based register referencing Reading discrete inputs, or a 3 based register referencing Reading input registers, and a 4 based register referencing Reading or Writing to output or holding registers. The function code field specifies which register data group it reads or writes to and from the peripheral. -Dependend on the - ![](assets/modbusStructure.png) From 5705b9615a525d417bd42b99c7a2aafed9095d63 Mon Sep 17 00:00:00 2001 From: Hannes Siebeneicher Date: Fri, 28 Oct 2022 16:14:24 +0200 Subject: [PATCH 04/25] adding content --- .../05.communication/07.modbus/modbus.md | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/content/learn/05.communication/07.modbus/modbus.md b/content/learn/05.communication/07.modbus/modbus.md index ef39f2aeae..315e5596bb 100644 --- a/content/learn/05.communication/07.modbus/modbus.md +++ b/content/learn/05.communication/07.modbus/modbus.md @@ -26,7 +26,27 @@ The Modbus data model has a simple structure described in four basic data types: | Holding Registers | (Output Data) | -The service request area of the message or Modbus Protocol Data Unit or PDU is comprised of a function code and a number of data bytes requested by the controller. The Modbus memory registers of a device are organized around the four basic data reference types and this data type is further identified by the leading number used in the devices memory address, such as, a 0 based register referencing a message to Read or Write discrete outputs or coils, or a 1 based register referencing Reading discrete inputs, or a 3 based register referencing Reading input registers, and a 4 based register referencing Reading or Writing to output or holding registers. The function code field specifies which register data group it reads or writes to and from the peripheral. +The Modbus memory registers of a device are organized around the four basic data reference types and this data type is further identified by the leading number used in the devices memory address, such as, +- 0 based register referencing a message to Read or Write discrete outputs or coils, +- 1 based register referencing Reading discrete inputs, +- 3 based register referencing Reading input registers, +- 4 based register referencing Reading or Writing to output or holding registers. ![](assets/modbusStructure.png) +The function code field specifies which register data group it reads or writes to and from the peripheral. Many of the data types are named from its use in driving relays, for example, a single-bit physical output is called a coil, and a single-bit physical input is called a discrete input or a contact. +For example, the Read Holding Registers command has the function code with 1 byte containing 8 bits is binary 0000 0011. If the peripheral device accepts the request without error, it will return the same code in its response. However, if an error occurs, the peripheral will return 1 byte containing 8 binary bits 1000 0011 in the function code field and appends a unique code in the data field of the response message that tells the controller device what kind of error occurred, or the reason for the error. + +## Use Modbus with Arduino +Now that you have learned about the basics and functionalities of Modbus it is time to talk about how you can use your Arduino to establish Modbus communication across devices. You can use your Arduino either as Controller or as peripheral device depending on the setup. To make your life easier you can use the ArduinoModbus library which allows you to implement the Modbus protocol over two different types of transport: serial communication over RS485 with RTU or Ethernet and WiFi communication using with TCP protocol. You can read more about the library here (LINK)!!! +Looking at the hardware side of things a lot of our boards are Modbus compatible especially if you consider Ethernet type messages but if you want to communicate via RS485 there is the MKR 485 Shield (LINK!!!) which can convert any MKR board into a Modbus compatible device. You can check out this tutorial (KARLS TUTORIAL) to learn about communication between two Arduinos using the Modbus protocol and RS485. +When using the Modbus library sending messages is fairly straight forward as you can see in the request format function below. + +| Device Adress | Function Code | Starting Register | Register Count | CRC Code | +| ----------- | ----------- |----------- |----------- |----------- | +| 0x21 | INPUT REGISTERS | 0x0011 | 2 | + +### Example +``` +(!ModbusRTUClient.requestFrom(0x21, INPUT_REGISTERS, 30017, 2)) +``` \ No newline at end of file From e6038a139bbe9e308481634015b4e5738b349173 Mon Sep 17 00:00:00 2001 From: Hannes Siebeneicher Date: Fri, 28 Oct 2022 16:16:44 +0200 Subject: [PATCH 05/25] Update modbus.md --- content/learn/05.communication/07.modbus/modbus.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/learn/05.communication/07.modbus/modbus.md b/content/learn/05.communication/07.modbus/modbus.md index 315e5596bb..89d16bd135 100644 --- a/content/learn/05.communication/07.modbus/modbus.md +++ b/content/learn/05.communication/07.modbus/modbus.md @@ -42,7 +42,7 @@ Now that you have learned about the basics and functionalities of Modbus it is t Looking at the hardware side of things a lot of our boards are Modbus compatible especially if you consider Ethernet type messages but if you want to communicate via RS485 there is the MKR 485 Shield (LINK!!!) which can convert any MKR board into a Modbus compatible device. You can check out this tutorial (KARLS TUTORIAL) to learn about communication between two Arduinos using the Modbus protocol and RS485. When using the Modbus library sending messages is fairly straight forward as you can see in the request format function below. -| Device Adress | Function Code | Starting Register | Register Count | CRC Code | +| Device Address | Function Code | Starting Register | Register Count | CRC Code | | ----------- | ----------- |----------- |----------- |----------- | | 0x21 | INPUT REGISTERS | 0x0011 | 2 | From 8a39402b3ddb0c22107188d60286ee19c3f3beaf Mon Sep 17 00:00:00 2001 From: Hannes Siebeneicher Date: Tue, 1 Nov 2022 10:22:28 +0100 Subject: [PATCH 06/25] adding examples --- .../07.modbus/assets/finderRequestFrame.png | Bin 0 -> 18942 bytes .../assets/modbusMeasurmentFinder.png | Bin 0 -> 6757 bytes .../07.modbus/assets/modbusStructure.png | Bin 33697 -> 0 bytes .../07.modbus/assets/requestFrame.png | Bin 0 -> 70317 bytes .../05.communication/07.modbus/modbus.md | 111 +++++++++++++----- 5 files changed, 82 insertions(+), 29 deletions(-) create mode 100644 content/learn/05.communication/07.modbus/assets/finderRequestFrame.png create mode 100644 content/learn/05.communication/07.modbus/assets/modbusMeasurmentFinder.png delete mode 100644 content/learn/05.communication/07.modbus/assets/modbusStructure.png create mode 100644 content/learn/05.communication/07.modbus/assets/requestFrame.png diff --git a/content/learn/05.communication/07.modbus/assets/finderRequestFrame.png b/content/learn/05.communication/07.modbus/assets/finderRequestFrame.png new file mode 100644 index 0000000000000000000000000000000000000000..6d81835448dde0d76c6f366965e3a9b8dff73f54 GIT binary patch literal 18942 zcmcG#Wpo@p*DV+`Gcz+Y+c7i5?3kIE+RV&xj4`ugYBN)tnVFd>#u%@k7rvQU>;9R! zYkqWfRhOh{osy2U_dX{|MM)Y79v}Y8moG@NG7_p^zCbX2o=3w%e;!MBiYGq5z+6?O z#lBQe5}tfsKw63_ihlW0n}G0Y4E1>p=Om-!`sE99-#;I)A;&VaFJEMnWhF$_0R|Tv zFunv@IW$isF63W>`7GtgQ|bvRX>?qyA{?5IXsA8I&a^L@bpNs*Y zis|3g60zcbVE?gHlJBcbMKq@V9Urfkk>kSSW$tL)>UcY9Kb1N+z;v3spl z$JaL+KIjujmUryfI-{=gC(Pa5HaNsd{k`z?h*GkbhBD>*>dNJgMDed)nXOiNq9hOB zT;)vm227uZd=?H*VGt}{T^OWEhYHs za3mk|sFe&8^kTP(GEV09H|Q0S%fCewW&()exauX7LjSt8)?l|%DJZ1$8WRS=qOrYD zMF#-1*XoAknSiPUWqCa{R@euJ*@KLB%G|LV>}hXIQjUN`A8K@d-@nNUY%Rf@pv?m5}ui1 z{J93iGphTxQf055e-U)!p%@3JnV1^Gzju6(L&r-1OC}I8&Yd}iVpr36dY~4{ncLDE znoDgIhWppsZAFq*_zuu3%kC+xGM1o(e?7pdyUEq5(2-%RG*$9F;lP=M3T<`xAyWkK z)urCtDvR}C!jM=ucs&k960sbSeeHnHhEHGsf0{=gR&|5*TfxyHqej+v{$Ij&O2Oc{l73b$Mto zX?q~T)wzr_u%=5WYzt;!#92K|>gn;U-_kiXso@ExRK;x-0pZ0Vpk6*YSO3O16iZwC zVc(yLT9^8p+RzVt=XZcD{haeD854ZLLhoK@J$1+Ika%igU-wSuQ&fiK)@8{k*U3}) zW=M@8LSUy`NGz4Fh!;P`2ld6Fx54By<-dm5z6aHggBNkoSJ>PprJa{-W7y`p{gmUI zLN_vFV|%w6l#jVq?cl`ZilG;l{odCD##h@ELjIh-aw&rMb`85{7vt9e9Q&uRbm0Dx z)s0sB?6vZ*#$|Nm?eug$nW8zQs1Sgcl$2PnT`;y)!a(9?QVOH?QTtG|IQ$U@N45zf{%IPkL&F_ zHxZ5pv>60xJ=71UiHL99`SjvZol-lul(fv#y98L?ueXI6E#sq$4+{M6a*Xm?H4p&; z9vn>HqTR8xuD7pB%>ZqgDXz)TYyBn<9?Cm9slYOA)mxr5q$h)T&gYe+uU|f-V@Rr( z?GUP`PM$FqEq&R=|23_LFIw)4!cg`|gt^ELcnW3yzCq^vzRwpTA9xt$^nFdl_S(gJ zKUBimystx1wZ0Cx|EuZXMle$LX!DUA`V>=VE0)ZuOGP7l14k*-NXA^Tave|vOa zB-v7WkO6+ZH7va~C*{k4w5EQBBKxBW-!kB|QFv z#r_(m_wVWUxh`=(G(6{0;gm|z;adZ_lH(r%HZT|WZ#<*XFK7& z!39b^xkT&6rz1-jl}Ei-3XA|eo|fJQu}(q`$Fn0guFL*jaSXtFG(tBneBLHjP(m@@ z+yZ9Ckq1@w?%^LQ7dp<}EjgV^dBa%9aye&Gs3z5d?y>sud)a@DVj1@J#gtUq3`}!A z{?|DN{kz!CX`$n|%P+4pI8^BlBn+xtPcakTuNuKaA6-gFJJ@J^zj(L>a5{rIAZ!C8 zj`Xcv>+g-iHt74Rc8qbV$J04+b_m7Vuu zbbM3cici}B$J@6g*6_VQ(N^Fb6@o7~bW@z!qH!W?DN(j87Q52rwbq5_0!r;(F-Rze zbp@=AjbSDtx)M}CH({K!~gh7O1vMQ!g?kBU5v7BLB?9B zmU@*3j7ht#>{zig*2J$*!30O0&P+D(eSt!VK5joC`JnIx84akcE*f@N!a*|(+bXOFRd#`_CAbef9ww(l(itPsPx zdGdEnVd5nm(~Z0m3}Qa&4A9=wbpev!wI8Pp1U^Z7B z6(LG8LoBv5WC;+`3mWdJ=dRp~?!j)Pf2Yc3o;HjM{GBu+P%bQ>eJRqB5?4s!_rmsv zUw1x3DRj~Bt&cU z=6n#bqx;~{{^k#&(0lF#{f%(C6$;bS)pZJX`S+0A^99pxRz|j|!ZE@gs07TZtMQ(# z!@*N#%vhsm8mAu?I{)>ZYt7?^{oRU!5p0&YA^s0Z>~!#mE|_$V9`%_)69P6U#_4Is z`k92*u)9+ttb14Ij5M-y6xSv;4aWWuLx+}Q#PKrUa_FTWR2`%Y<-D}-mvv^@w|7w0 zhgAj+*#-v@awrH93;T$J~&i93>C88)FX#TxFL>VztwVJ2DS-H@0 znMFqozg~>UCBub}QG=C@H6<%nrA38Tt4!SA=0#SG!c=X#rJ!61?aNCgQuhnW;|)s` z5U*128QWE$&!6+&e@`sX*gLR%6#WsJZs;;=;@NhyIfDSOd$e$dCyP?lw!!%A{V#!$ss51Xg{|5|jC}Oz7YX*kv~eumgFVa9qxDh(B^-&bCa_S zKNLeBk+=8y+{;LsOiX5@^LxoSx$pB#e~3$oLaQE(JkPYjhF9nG`lL-HreRVTc6tXO zD)V-^-^UrbDz@^PV{ay;&Xqbfco7z23n&y)H#B+V=PyBTrpNhq5{{H-r>GyH@j?qY zovRB?HpPL=ZhI^mf#HrK-!HzO)5>EVQH;$j3WXNDGUBQ>?EZu#C%)sJ-`nGuup$J4 zcAbn}dd#$I@gblv%y7BLGL$G*e`U(kAy zc-z!$9|t0yMI$9fUA1!wu7@x^UB|*jj|!Sa;w4FxhZ5RgrXG-s`@zf=B_a`BB(t6a zz-un`LzoCgYZq}P0(4p0-cGa)i`plycoadWdeBka2pW==#5m7#vQ=B{jx$A2#<7nN z#+2p|UGHJ`%e7tTzZg_^NG>JC15jISU6N9NvUJAs=h7f2hlCWi6JO;Jh!*AH!;owR z4K-<+sJTNm)vye#cBq$Oda@2;v<{ittro~49Eq-F-15#$FX>;%%DE@j#_#Kk}*7PGi4yQ0BHyOunZ#SuCMeuzps7VRScur`dg zI@m3d#pZ)>iF=P&Ez zDskYrWdSJ{7yEW#hm-kupvVgzBVK1Ckhdv*xdSwG0}{kecmgSQSmIjR4h79J0gN4? zqVJqb_sr>!8|#&(>dn2iUo%%MCA+1vj`=NW1)C8o*XJL)iMkSRu%0&4PJ1Pm*QP#ZKFgzzE4CSs5KA?PG_pQLp#6svQ>P%dJjaIMC?k9dq<=^4nbth~`Zs@#6_r1a?er<>zSjizi z-}OD1srH$z#SmM2H5CnPvZ19A@hgK~BRRfB3mKEEsz)(`^P$qxOy??FR7Ijf;BXx6 z#B8J`uh-MKAFuN{x{?8jn3gh0X1MRRz5Y`RU1atdy077lTuf0O_!;|v1F0`+$)zyj z*e$Sd7PdH)$+Lq%I$>egcL_55`9)>TL5f$1Ak1V5ZBr!d?1*JI1R>k%f&g^?zy{cs zxF~0Sik4F;gR)~fx;aa>I9`I=kRb=U8T932D7FZ*hBu`;+}-e%v1Q&kgPs*FbB#sc zEYqBdJib6sW8nXKW+UXzqf~|oqx|+}VOoFP>$##@(|{=N0xT9QGc?9W>CRYKOGm`| z6`j;a&HU;Y)(pwE=z$cW%(-o|M7z57GBe}?eRj`Kc7J4Knq#AxU9a4PwEa|?=A1cT z;poY78UgsJdBWy&stw{DR|{ob)r;vX{XWfaBBiB^lc|7ahG|Bgf)!lvv3=1;bbSh5 zCZH2DRvFY$K`s3xMo#=NNu5QaVSLsVM>`j335E`DTu_KclG73{uWx#Mc@A2LhXZh( z&?;!vmN?rHeOzWC;Vt}?!BI|j!PX2HzsFT(kWNXOz+zG($T~&MoYWi0NCj)~xGS`k z3ttDh6@?zIh0mEHbVM)$iovt3R#LU;e zL6YS{wEaVCI`9A00F)^pjorsQz0FAJ5x9`E`VDI7$66X}L}W82CF0okdUib{c0CqN z^QL^w{ub*uB^XBHdqC%V)cD4$jVm>@fP4pK>X;&1ysa|?B^)FI$YJ5WOt1db|)Cgl1@_HiKy?3tzi#};YtX-vdHSW zU`*+gJi}b@v9*}!w1v6ixZ94qGP$1b!&blwH~p(ZlA&2{HbOPjaYN4?rZGf z?iiIgPX~h0t>DS%N}Vx&6O^jt*7ibjslS>O@(W!@!W;`t^vP9^X!Lp9DUKLRA|mW7 zR?FStkT(&sD|-AEVvU%j>;HU)awD?IAD6Hy zR_1+9Ca6lON49Hxb}9>@uB3j++-Z36RNIgoS7iDlq+^}LY53Iqep~%&^H`?0OXl zUO-PUs!vXtzZSbg2cF~Wq4?`vbMCe$jSm{_S`^FWWZ3mR_FGpL!UYiq?2-BoTk2~G zY=v%ieASvfsUC|=OPd#RK5NW?O!`8n$_ac?u}y({HY+lp=N*Tc`NDEaP5eYD*5qI* zh{p~TIsFpfDLooN%2d|-9`~14W(hXe4TD6Av|sXSMwN(Iu}r09W^j~je@GtG6#_&m(QxRw6eEfu;c{8hG_DGY(6Jhr!Z58sn(`0>!5Yau zykY--w!R&rNXVPkM|CMPNi&Ak!P4B)REBL8k^MPbUfIhrB@$I5{5_u2QY1e21XPq5 zFix}oRr&&}Vz>^Ot0lLGKJIdSE>Xfq>zkOBD`np9g^pSTCSaebsVC4 zeF&*&SvHLbc(&05Poje^8l!ZK{WyIg06g^f-NVC7sXwdO0x~aEt#d7g|d{yRw3 z56PSAw8r-&oq6-%hPNpammr|G4FYQ^bY`L~RxPrugA{tG&Y-N!uP~wu-9p&{CkczZ z)?xIm=Safe`k`V$xrUnwa>zKiM~+#JADDD+C~> zgY)fBA*5W2Q*x(M&75kg#Be8>zt$&JTM=_9wG>o(XqQydlbxf*JYI}69uCXWade3M{k zjZixlftrw2s}pg=DO07+&vYQ8!H?ikCIW}lAfX452U3IO43Z_4?(FBzv3>fY61>E0 z-N0-V$NulFNJ|3asH)S&{#&dScNrDB+8DQL2bFzk2J102i^V-NE0LZe_I<~`dswjM z+f*`4IuV`D=79YjeZb8KQdz8gc=4@=$WJnXxi3*u(L37M9eI3Ok)d!P&YftbJ3b#^ zVEjisXd5Dm+}KOcRu|`lMK|P8@Savmw9n+%UaHmz8 zj^kTqMW7=H-QI}#+0Pu>tQc&PjiY4uds04~z z>#jP_!S1~cW$Br{6~PcHM!I%M$7o4^8nSIj{i-AIQ z!^l%#ymNhfs|M!1cXBaJpwD}YC@k6g4s(_xN3WS_99b^TVXsn_L%nEDasvAfX0tj} zrxdh<4LZam>1!`5r3=)&%VK1Mf@Hve@NR~Lem!e2Hi|=UmMD0Y5)$4~&ovOn-#F6f zCgmWhM_VIGt`P&t^7Pvp&&ZGXZ+b#Y;hP5!kx8W#EaKotMOaEo(c`14m@d>=B5Oeg zx^}p$GCfFhp$y*U5}DtFtElL;bx)ltts(m=^XL5D@R>Agjy3!YO-aE!&7BXU-~_3+HDVz9|!*Fv$>nl+6XViCPo$`e~kj9hMG0u0NE zxz29$Ywx#@TbbQ5DsfM)`fJ;6euYSl_oB-t<1HSmtdQ{%35Qb3Srv-#XOJQnmzNp* zf^z_34dD+JTwzo@KM`rBpUXS8$lX&dH*=tjMsarp+~J=-GXmS*uDykT3hC2ahjIS7 zr>A;lrQXiZtGMT6#Ar2GNH}Y3J$SX{`~;wEJUYG;nJ}U%BnVvBzdAqq4jnViM*f(r ztuVrw*xe`f04*pUu*cXuF32~rcFoq|(pbJU&jrnhHdRe}9so22#eNSw>l3Ij=Yon& zkDRmYj|ykr3Q^+e7`#{BEi#UzVE?YqBo0xYSPh&0utPxc8t>&34tySDo^O6A$Ztfc zs+^%6s{p-6&=-o&z{9w8@`vVcf^jz9<*lSd6JdF=((51FUrE^`_!u@Lt^W2c8?sNt z)|7}axmQFiFxQK(L*fYF`<_!E(Zd;g7*DKsc1K!R^5sO7VU@p11yjSseo*iVE1bcB zBV>w2T9Mm!mJX42WQp8}qp;NH%LO&ceDRse2s*Mc@0@-LT)3Me=YFjObn#N`p+5^E zmgF!;Q9iF)^hg)+yup>2J%$hGW8qeL{CjGg61}vPC^sS*P55)f^sH&PcuK@Zv7q;0 z;4IR>u!hN?=dcsxpfi58hIaZ1J#&)Ux-AA#651&cqKEdk1H{J)CV{ zHP6LXxFtw74+y_diEc3;H6PS;3#!TRtP5>}VZ!)2bI1e$O2F_jh!^lO4v$J9`xsg> zy!aY#)Jyvf;S#PAR*rqEXCWXdjgn%-kjWbv7N=rJh@qmZBJyk5#9nLq?yZAPHP&-T zE~GxlxX-Y0YgrqY{sU(qc}nzObY7l{3Y$Zx1qA688*|PeMR1 zvC5Q*%~Bly8C_rFFd*Oh({;aj$NQ|m^XP@n>LsY zzQBz2pgA=ocsV$ob-7G;RcKg91Q(@)hg($7;#?H>FYvH1dFy#bDd@P(z{+uTTuUm( ztR)03J(OQSQ{2W4CE8mT6;?z2Va(}Lyu|$6UqD#&g_^G=i)0)WNEzh}EXJ)Eho8G* z5+&tx|DR<*f{VBiAbq_`CWoQCF!oZ0)W&+KB e=ua805;6gygC=zBAcbP{GcF{Z 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 literal 0 HcmV?d00001 diff --git a/content/learn/05.communication/07.modbus/assets/modbusMeasurmentFinder.png b/content/learn/05.communication/07.modbus/assets/modbusMeasurmentFinder.png new file mode 100644 index 0000000000000000000000000000000000000000..9386e3be22951900cd544e0be08bf163ec50033a GIT binary patch literal 6757 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 Q0->P1l~a|ikueMX4^VyB(*OVf literal 0 HcmV?d00001 diff --git a/content/learn/05.communication/07.modbus/assets/modbusStructure.png b/content/learn/05.communication/07.modbus/assets/modbusStructure.png deleted file mode 100644 index 7e09ea698341568852b88633edadb1fc1e1d6a87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33697 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 literal 0 HcmV?d00001 diff --git a/content/learn/05.communication/07.modbus/modbus.md b/content/learn/05.communication/07.modbus/modbus.md index 89d16bd135..8da959b1f4 100644 --- a/content/learn/05.communication/07.modbus/modbus.md +++ b/content/learn/05.communication/07.modbus/modbus.md @@ -1,52 +1,105 @@ --- -title: "Modbus communication serial protocol" -description: "Learn about the Modbus " +title: "Modbus" +description: "Modbus is an open serial communication protocol used for transmitting information over serial lines between electronic devices." author: "Hannes Siebeneicher" --- ***Controller/peripheral is formerly known as master/slave. Arduino no longer supports the use of this terminology. Devices formerly known as master are referred to as controller and devices formerly known as slaves are referred to as peripheral.*** ## What is Modbus? -Modbus is an open serial communication protocol used for transmitting information over serial lines between electronic devices. It was originally published by Modicon (now Schneider Electric) in 1979. The Modbus protocol is the oldest and by far the most popular automation protocol in the field of process automation. It enables devices, such as energy meters or humidity sensors connected to the same network to communicate the results to a supervisory computer or a Programmable Logic Computer (PLC). Several versions of the Modbus protocol exist for the serial port and Ethernet and the most common are Modbus RTU, Modbus ASCII, Modbus TPU and Modbus Plus. It is based on a controller peripheral (formerly known as master slave) architecture and communication between nodes is achieved with send request and read response type messages. Modbus communicates over several types of physical media such as RS-232 and over Ethernet. The original Modbus interface ran on RS-232 serial communication but most of the later Modbus implementations use RS-485 because it allows for longer distancer, higher speeds and the possibility of multiple devices on a single multi-drop network. The communication over serial RS-485 physical media works with two-wire transmit and receive connections. (SEE TWO WIRE TUTORIAL) +Modbus is an open serial communication protocol used for transmitting information over serial lines between electronic devices. It was originally published by Modicon (now Schneider Electric) in 1979. The Modbus protocol is the oldest and by far the most popular automation protocol in the field of process automation. It enables devices, such as energy meters or humidity sensors connected to the same network to communicate the results to a supervisory computer or a Programmable Logic Computer (PLC). -On simple interfaces like RS-485 and RS-232 the Modbus messages are sent in plain form over the network and the network will be dedicated to only Modbus communication. However, if your network requires multiple heterogeneous devices using a more versatile system like TCP/IP over ethernet is recommended. In this case Modbus and other types of mixed protocols can co-exist in the same physical interface at the same time. The main Modbus message structure is peer-to-peer, but it can also function on point to point and multidrop networks. As mentioned, the Modbus protocol communicates using a controller peripheral technique in which only one device can initiate transactions, called queries. +Several versions of the Modbus protocol exist for serial port and Ethernet and the most common are Modbus RTU, Modbus ASCII, Modbus TPU and Modbus Plus. It is based on a controller-peripheral (formerly known as master-slave) architecture and communication between nodes is achieved with send request and read response type messages. Modbus communicates over several types of physical media such as RS-232/RS-485 or Ethernet. The original Modbus interface ran on RS-232 serial communication but most of the later Modbus implementations use RS-485 because it allows for longer distances, higher speeds and the possibility of multiple devices on a single multi-drop network. The communication over serial RS-485 physical media works with two-wire transmit and receive connections. -## How does Modbus work? -Each Modbus message has the same structure, consisting of four basic elements which are present in each message and the sequence and order of these elements are the same for all messages. This allows for easy parsing of the content. The conversation is always started by the controller and when a message is sent the peripheral interprets the message and responds to it. Every peripheral device has its own address which it reponds to when addressed by the controller, while all other devices ignore the message if the address doesn't match with their own. +On simple interfaces like RS-485 and RS-232, the Modbus messages are sent in plain form over the network and the network will be dedicated to only Modbus communication. However, if your network requires multiple heterogeneous devices using a more versatile system like TCP/IP over ethernet is recommended. In this case, Modbus and other types of mixed protocols can co-exist in the same physical interface at the same time. The main Modbus message structure is peer-to-peer, but it can also function on point-to-point and multidrop networks. As mentioned, the Modbus protocol communicates using a controller-peripheral technique in which only one device can initiate transactions, called queries. -Modbus sends functions which communicate read and write instructions to the peripheral’s internal memory registers to configure, monitor and control the peripheral’s inputs and outputs. Modbus devices will typically include a register map outlining where the configuration input and output data can be written and read from. You should always refer to the peripheral’s register map of your device to gain a better understanding of its overall operation. +## How does Modbus work? +Each Modbus message has the same structure, consisting of four basic elements which are present in each message and the sequence and order of these elements are the same for all messages. This allows for easy parsing of the content. The conversation is always started by the controller and when a message is sent the peripheral interprets the message and responds to it. Modbus sends functions which communicate read and write instructions to the peripheral’s internal memory registers to configure, monitor and control the peripheral’s inputs and outputs. Modbus devices will typically include a register map outlining where the configuration input and output data can be written and read from. You should always refer to the peripheral’s register map of your device to gain a better understanding of its overall operation. -The Modbus data model has a simple structure described in four basic data types: +Modbus requests follow a simple structure: +![](assets/requestFrame.png) -| Data Type | Description | -| ----------- | ----------- | -| Discrete Input | | -| Coils Input | | -| Input Registers | (Input Data) | -| Holding Registers | (Output Data) | +### Device Address +Every peripheral device has its own address which it responds to when addressed by the controller, while all other devices ignore the message if the address doesn't match their own. Devices addresses are assigned in the range of 1 - 247. +### Function Code +The Function code tells the peripheral device if it should read or write data from the internal memory registers. Many of the data types are named from their use in driving relays, for example, a single-bit physical output is called a coil, and a single-bit physical input is called a discrete input or a contact. The following functions are supported by the Modbus poll: -The Modbus memory registers of a device are organized around the four basic data reference types and this data type is further identified by the leading number used in the devices memory address, such as, -- 0 based register referencing a message to Read or Write discrete outputs or coils, -- 1 based register referencing Reading discrete inputs, -- 3 based register referencing Reading input registers, -- 4 based register referencing Reading or Writing to output or holding registers. +- 01 READ COIL STATUS +- 02 READ INPUT STATUS +- 03 READ HOLDING REGISTERS +- 04 READ INPUT REGISTERS +- 05 WRITE SINGLE COIL +- 06 WRITE SINGLE REGISTER +- 15 WRITE MULTIPLE COILS +- 16 WRITE MULTIPLE REGISTERS -![](assets/modbusStructure.png) +### Data +The data field contains the requested or send data. In the request form used by the Arduino Modbus library, the data field requires you to enter the starting registers and register count. -The function code field specifies which register data group it reads or writes to and from the peripheral. Many of the data types are named from its use in driving relays, for example, a single-bit physical output is called a coil, and a single-bit physical input is called a discrete input or a contact. -For example, the Read Holding Registers command has the function code with 1 byte containing 8 bits is binary 0000 0011. If the peripheral device accepts the request without error, it will return the same code in its response. However, if an error occurs, the peripheral will return 1 byte containing 8 binary bits 1000 0011 in the function code field and appends a unique code in the data field of the response message that tells the controller device what kind of error occurred, or the reason for the error. +### CRC Error Check +The error checking is a value the controller or peripheral creates at the beginning of the transmission or response which is then checked when the message is received, to verify if the contents are correct. If the peripheral device accepts the request without error, it will return the same code in its response. However, if an error occurs, the peripheral will return 1 byte containing 8 binary bits 1000 0011 in the function code field and append a unique code in the data field of the response message, that tells the controller device what kind of error occurred or the reason for the error. ## Use Modbus with Arduino -Now that you have learned about the basics and functionalities of Modbus it is time to talk about how you can use your Arduino to establish Modbus communication across devices. You can use your Arduino either as Controller or as peripheral device depending on the setup. To make your life easier you can use the ArduinoModbus library which allows you to implement the Modbus protocol over two different types of transport: serial communication over RS485 with RTU or Ethernet and WiFi communication using with TCP protocol. You can read more about the library here (LINK)!!! -Looking at the hardware side of things a lot of our boards are Modbus compatible especially if you consider Ethernet type messages but if you want to communicate via RS485 there is the MKR 485 Shield (LINK!!!) which can convert any MKR board into a Modbus compatible device. You can check out this tutorial (KARLS TUTORIAL) to learn about communication between two Arduinos using the Modbus protocol and RS485. -When using the Modbus library sending messages is fairly straight forward as you can see in the request format function below. +Now that you have learned about the basics and functionalities of Modbus it is time to talk about how you can use your Arduino to establish Modbus communication across devices. You can use your Arduino either as a controller or as a peripheral device depending on the setup. To make your life easier you can use the [Arduino Modbus library](https://www.arduino.cc/reference/en/libraries/arduinomodbus/) which allows you to implement the Modbus protocol over two different types of transport: serial communication over RS485 with RTU or Ethernet and WiFi communication using the TCP protocol. Because the Modbus library is based on the [RS-485 library](https://www.arduino.cc/reference/en/libraries/arduinors485/) you must include both of them in your code. + +A lot of Arduino boards are Modbus compatible especially if you consider Ethernet-type messages but if you want to communicate via RS485 there is the [MKR 485 Shields](https://store-usa.arduino.cc/products/arduino-mkr-485-shield) which can convert any MKR board into a Modbus compatible device. Check out [this Tutorial](https://docs.arduino.cc/tutorials/mkr-485-shield/mkr-485-communication) to learn more about sending data between two [MKR 485 Shields](https://store-usa.arduino.cc/products/arduino-mkr-485-shield). -| Device Address | Function Code | Starting Register | Register Count | CRC Code | -| ----------- | ----------- |----------- |----------- |----------- | +When using the Modbus library sending messages is fairly straightforward as you can see in the request format function below. + +| Device Address | Function Code | Starting Register | Register Count | +| ----------- | ----------- |----------- |----------- | | 0x21 | INPUT REGISTERS | 0x0011 | 2 | +You have to check the device-specific documentation to attain the right address, function code, starting registers and register count. The CRC error check is taken care of by the Modbus library. To make it easier to understand the example below shows how to use the Modbus library. + ### Example +Let's say you have a Modbus-compatible energy meter working with RS-485. In our case, we use a model from [Finder](https://cdn.findernet.com/app/uploads/2021/09/20090052/Modbus-7M24-7M38_v2_30062021.pdf) but you can use a different one. + +Take a look at the request frame inside the Finder documentation: + +![](assets/finderRequestFrame.png) + +We can see that the device address is 21 (or 0x21). + +The function code states 04 which we know stands for INPUT REGISTERS ([see Function Code](#function-code)). + +The starting register is 00 6B (or 0x6B) but for the Modbus library to work we need to change it from hexadecimal to decimal. +In this example, the starting register is stated as hexadecimal but if we scroll down further in the documentation we can see that the registers are written in decimals: + +![](assets/modbusMeasurmentFinder.png) + +We can also see that the register for U1 takes up 30107 and 30108 which means that the register count is 2. + +With all this information we can now use the function requestFrom() inside the readVoltage() function: + ``` -(!ModbusRTUClient.requestFrom(0x21, INPUT_REGISTERS, 30017, 2)) -``` \ No newline at end of file +float readVoltage() { + float volt = 0.; + // Send reading request over RS485 + if (!ModbusRTUClient.requestFrom(0x21, INPUT_REGISTERS, 30017, 2)) { + // Error handling + Serial.print("- Failed to read the voltage! "); + Serial.println(ModbusRTUClient.lastError()); + } else { + // Response handler + uint16_t word1 = ModbusRTUClient.read(); // Read word1 from buffer + uint16_t word2 = ModbusRTUClient.read(); // Read word2 from buffer + uint32_t millivolt = word1 << 16 | word2; // Join word1 and word2 to retrieve voltage value in millivolts + volt = millivolt/1000.0; // Convert to volts + } + + return volt; +} +``` + + +### Modbus compatible Boards +- all boards compatible with the [MKR 485 Shield](https://docs.arduino.cc/hardware/mkr-485-shield) and the [MKR ETH Shield](https://docs.arduino.cc/hardware/mkr-eth-shield) +- all boards compatible with the [Ethernet Shield Rev2](https://docs.arduino.cc/hardware/ethernet-shield-rev2) +- [Portenta Machine Control](https://docs.arduino.cc/hardware/portenta-machine-control) +- [Max Carrier](https://docs.arduino.cc/hardware/portenta-max-carrier) + +### Libraries +- [ArduinoRS485](https://www.arduino.cc/reference/en/libraries/arduinors485/) +- [ArduinoModbus](https://www.arduino.cc/reference/en/libraries/arduinomodbus/) \ No newline at end of file From 9be7923fe5dd00dad82465c53fd19f71c97b8ad6 Mon Sep 17 00:00:00 2001 From: Hannes Siebeneicher Date: Tue, 1 Nov 2022 10:34:34 +0100 Subject: [PATCH 07/25] adding notice about library specifications --- content/learn/05.communication/07.modbus/modbus.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/content/learn/05.communication/07.modbus/modbus.md b/content/learn/05.communication/07.modbus/modbus.md index 8da959b1f4..2dc059e127 100644 --- a/content/learn/05.communication/07.modbus/modbus.md +++ b/content/learn/05.communication/07.modbus/modbus.md @@ -38,18 +38,20 @@ The Function code tells the peripheral device if it should read or write data fr The data field contains the requested or send data. In the request form used by the Arduino Modbus library, the data field requires you to enter the starting registers and register count. ### CRC Error Check -The error checking is a value the controller or peripheral creates at the beginning of the transmission or response which is then checked when the message is received, to verify if the contents are correct. If the peripheral device accepts the request without error, it will return the same code in its response. However, if an error occurs, the peripheral will return 1 byte containing 8 binary bits 1000 0011 in the function code field and append a unique code in the data field of the response message, that tells the controller device what kind of error occurred or the reason for the error. +The error checking is a value the controller or peripheral creates at the beginning of the transmission or response which is then checked when the message is received, to verify if the contents are correct. If the peripheral device accepts the request without error, it will return the same code in its response. However, if an error occurs, the peripheral will return 1 byte containing 8 binary bits `1000 0011` in the function code field and append a unique code in the data field of the response message, that tells the controller device what kind of error occurred or the reason for the error. ## Use Modbus with Arduino Now that you have learned about the basics and functionalities of Modbus it is time to talk about how you can use your Arduino to establish Modbus communication across devices. You can use your Arduino either as a controller or as a peripheral device depending on the setup. To make your life easier you can use the [Arduino Modbus library](https://www.arduino.cc/reference/en/libraries/arduinomodbus/) which allows you to implement the Modbus protocol over two different types of transport: serial communication over RS485 with RTU or Ethernet and WiFi communication using the TCP protocol. Because the Modbus library is based on the [RS-485 library](https://www.arduino.cc/reference/en/libraries/arduinors485/) you must include both of them in your code. A lot of Arduino boards are Modbus compatible especially if you consider Ethernet-type messages but if you want to communicate via RS485 there is the [MKR 485 Shields](https://store-usa.arduino.cc/products/arduino-mkr-485-shield) which can convert any MKR board into a Modbus compatible device. Check out [this Tutorial](https://docs.arduino.cc/tutorials/mkr-485-shield/mkr-485-communication) to learn more about sending data between two [MKR 485 Shields](https://store-usa.arduino.cc/products/arduino-mkr-485-shield). -When using the Modbus library sending messages is fairly straightforward as you can see in the request format function below. +When using the [Modbus library](https://www.arduino.cc/reference/en/libraries/arduinomodbus/) sending messages is fairly straightforward as you can see in the request format function below. | Device Address | Function Code | Starting Register | Register Count | | ----------- | ----------- |----------- |----------- | -| 0x21 | INPUT REGISTERS | 0x0011 | 2 | +| | | | | + +***Note that this request form is specific to the [Modbus library](https://www.arduino.cc/reference/en/libraries/arduinomodbus/) and only works with boards compatible with this library. Especially when using Arduino's Pro boards make sure to check the specifications for the board you are using.*** You have to check the device-specific documentation to attain the right address, function code, starting registers and register count. The CRC error check is taken care of by the Modbus library. To make it easier to understand the example below shows how to use the Modbus library. From 7c98f40187ff394a21878ce049a73979c5a2fca8 Mon Sep 17 00:00:00 2001 From: Hannes Siebeneicher Date: Tue, 1 Nov 2022 10:49:12 +0100 Subject: [PATCH 08/25] minor text changes --- content/learn/05.communication/07.modbus/modbus.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/content/learn/05.communication/07.modbus/modbus.md b/content/learn/05.communication/07.modbus/modbus.md index 2dc059e127..ac1020c9ac 100644 --- a/content/learn/05.communication/07.modbus/modbus.md +++ b/content/learn/05.communication/07.modbus/modbus.md @@ -45,13 +45,13 @@ Now that you have learned about the basics and functionalities of Modbus it is t A lot of Arduino boards are Modbus compatible especially if you consider Ethernet-type messages but if you want to communicate via RS485 there is the [MKR 485 Shields](https://store-usa.arduino.cc/products/arduino-mkr-485-shield) which can convert any MKR board into a Modbus compatible device. Check out [this Tutorial](https://docs.arduino.cc/tutorials/mkr-485-shield/mkr-485-communication) to learn more about sending data between two [MKR 485 Shields](https://store-usa.arduino.cc/products/arduino-mkr-485-shield). -When using the [Modbus library](https://www.arduino.cc/reference/en/libraries/arduinomodbus/) sending messages is fairly straightforward as you can see in the request format function below. +When using the [Modbus library](https://www.arduino.cc/reference/en/libraries/arduinomodbus/) sending messages is fairly straightforward as you can see in the xamplary request format function below -| Device Address | Function Code | Starting Register | Register Count | -| ----------- | ----------- |----------- |----------- | -| | | | | +| Device Address | Function Code | Starting Register | Register Count | +| ----------- | ----------- | ----------- | ----------- | +| 0x21 | INPUT REGISTERS | 30107 | 2 | -***Note that this request form is specific to the [Modbus library](https://www.arduino.cc/reference/en/libraries/arduinomodbus/) and only works with boards compatible with this library. Especially when using Arduino's Pro boards make sure to check the specifications for the board you are using.*** +***Note that this request form is specific to the [Modbus library](https://www.arduino.cc/reference/en/libraries/arduinomodbus/) and only works with boards compatible with this library. Make sure to check the specifications for the board you are using!*** You have to check the device-specific documentation to attain the right address, function code, starting registers and register count. The CRC error check is taken care of by the Modbus library. To make it easier to understand the example below shows how to use the Modbus library. From a3be93ee943162f6234ba780f6c6f83b9d03e5a2 Mon Sep 17 00:00:00 2001 From: Hannes Siebeneicher Date: Tue, 1 Nov 2022 10:59:27 +0100 Subject: [PATCH 09/25] fix typo --- content/learn/05.communication/07.modbus/modbus.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/learn/05.communication/07.modbus/modbus.md b/content/learn/05.communication/07.modbus/modbus.md index ac1020c9ac..8c55093983 100644 --- a/content/learn/05.communication/07.modbus/modbus.md +++ b/content/learn/05.communication/07.modbus/modbus.md @@ -45,7 +45,7 @@ Now that you have learned about the basics and functionalities of Modbus it is t A lot of Arduino boards are Modbus compatible especially if you consider Ethernet-type messages but if you want to communicate via RS485 there is the [MKR 485 Shields](https://store-usa.arduino.cc/products/arduino-mkr-485-shield) which can convert any MKR board into a Modbus compatible device. Check out [this Tutorial](https://docs.arduino.cc/tutorials/mkr-485-shield/mkr-485-communication) to learn more about sending data between two [MKR 485 Shields](https://store-usa.arduino.cc/products/arduino-mkr-485-shield). -When using the [Modbus library](https://www.arduino.cc/reference/en/libraries/arduinomodbus/) sending messages is fairly straightforward as you can see in the xamplary request format function below +When using the [Modbus library](https://www.arduino.cc/reference/en/libraries/arduinomodbus/) sending messages is fairly straightforward as you can see in the examplary request format function below: | Device Address | Function Code | Starting Register | Register Count | | ----------- | ----------- | ----------- | ----------- | From 305dfcb9b029b49223964de33fe7ddd23bab154d Mon Sep 17 00:00:00 2001 From: Hannes Siebeneicher Date: Wed, 23 Nov 2022 11:19:06 +0100 Subject: [PATCH 10/25] Expanding content - max devices - Cyclic Redundancy Check - Byte and word ordering - adding sources --- .../05.communication/07.modbus/modbus.md | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/content/learn/05.communication/07.modbus/modbus.md b/content/learn/05.communication/07.modbus/modbus.md index 8c55093983..bc4cf9969f 100644 --- a/content/learn/05.communication/07.modbus/modbus.md +++ b/content/learn/05.communication/07.modbus/modbus.md @@ -20,13 +20,13 @@ Modbus requests follow a simple structure: ![](assets/requestFrame.png) ### Device Address -Every peripheral device has its own address which it responds to when addressed by the controller, while all other devices ignore the message if the address doesn't match their own. Devices addresses are assigned in the range of 1 - 247. +Every peripheral device has its own address which it responds to when addressed by the controller, while all other devices ignore the message if the address doesn't match their own. Device addresses are assigned in the range of 1 - 247, but without additional hardware the maximum number of devices should be limited to 32 as data loss is too significant when attaching more devices. ### Function Code The Function code tells the peripheral device if it should read or write data from the internal memory registers. Many of the data types are named from their use in driving relays, for example, a single-bit physical output is called a coil, and a single-bit physical input is called a discrete input or a contact. The following functions are supported by the Modbus poll: -- 01 READ COIL STATUS -- 02 READ INPUT STATUS +- 01 READ COIL +- 02 READ DISCRETE INPUT - 03 READ HOLDING REGISTERS - 04 READ INPUT REGISTERS - 05 WRITE SINGLE COIL @@ -38,7 +38,13 @@ The Function code tells the peripheral device if it should read or write data fr The data field contains the requested or send data. In the request form used by the Arduino Modbus library, the data field requires you to enter the starting registers and register count. ### CRC Error Check -The error checking is a value the controller or peripheral creates at the beginning of the transmission or response which is then checked when the message is received, to verify if the contents are correct. If the peripheral device accepts the request without error, it will return the same code in its response. However, if an error occurs, the peripheral will return 1 byte containing 8 binary bits `1000 0011` in the function code field and append a unique code in the data field of the response message, that tells the controller device what kind of error occurred or the reason for the error. +CRC stands for Cyclic Redundancy check and is an error detecting code commonly used in digital networks to detect accidental changes in digital data. CRC’s have their name because the check (data verification) value is a redundancy (it expands the message without adding information) and the algorithm is based on cyclic codes. They are simple to implement in binary hardware, easy to analyze mathematically, and particularly good at detecting common errors caused by noise in transmission channels. + +Two bytes are added to the end of every Modbus message for error detection and every byte in the message is used to calculate the CRC. The receiving device then also calculates the CRC and compares it to the CRC from the sending device. If even one bit in the message is received incorrectly, the CRC’s will be different resulting in an error. + +### Byte and word ordering +The Modbus specification doesn't define exactly how the data is stored in the registers. Therefore, some manufacturers implemented Modbus in their equipment to store and transmit the higher byte first followed by the lower byte. Alternatively, others store and transmit the lower byte first. Similarly, when registers are combined to represent 32-bit data types, some devices store the higher 16 bits (high word) in the first register and the remaining low word in the second while others do the opposite. It doesn't matter which order the bytes or words are sent in, as long as the receiving device knows which way to expect it. + ## Use Modbus with Arduino Now that you have learned about the basics and functionalities of Modbus it is time to talk about how you can use your Arduino to establish Modbus communication across devices. You can use your Arduino either as a controller or as a peripheral device depending on the setup. To make your life easier you can use the [Arduino Modbus library](https://www.arduino.cc/reference/en/libraries/arduinomodbus/) which allows you to implement the Modbus protocol over two different types of transport: serial communication over RS485 with RTU or Ethernet and WiFi communication using the TCP protocol. Because the Modbus library is based on the [RS-485 library](https://www.arduino.cc/reference/en/libraries/arduinors485/) you must include both of them in your code. @@ -104,4 +110,10 @@ float readVoltage() { ### Libraries - [ArduinoRS485](https://www.arduino.cc/reference/en/libraries/arduinors485/) -- [ArduinoModbus](https://www.arduino.cc/reference/en/libraries/arduinomodbus/) \ No newline at end of file +- [ArduinoModbus](https://www.arduino.cc/reference/en/libraries/arduinomodbus/) + +### Read more +- https://www.se.com/us/en/faqs/FA168406/ +- https://modbus.org/ +- https://www.csimn.com/CSI_pages/Modbus101.html +- https://en.wikipedia.org/wiki/Modbus \ No newline at end of file From 522374717b1a105c4bd31946368ba585b2eeb759 Mon Sep 17 00:00:00 2001 From: Hannes Siebeneicher Date: Wed, 23 Nov 2022 11:47:32 +0100 Subject: [PATCH 11/25] adding link --- content/learn/05.communication/07.modbus/modbus.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/learn/05.communication/07.modbus/modbus.md b/content/learn/05.communication/07.modbus/modbus.md index bc4cf9969f..25fee6790c 100644 --- a/content/learn/05.communication/07.modbus/modbus.md +++ b/content/learn/05.communication/07.modbus/modbus.md @@ -38,7 +38,7 @@ The Function code tells the peripheral device if it should read or write data fr The data field contains the requested or send data. In the request form used by the Arduino Modbus library, the data field requires you to enter the starting registers and register count. ### CRC Error Check -CRC stands for Cyclic Redundancy check and is an error detecting code commonly used in digital networks to detect accidental changes in digital data. CRC’s have their name because the check (data verification) value is a redundancy (it expands the message without adding information) and the algorithm is based on cyclic codes. They are simple to implement in binary hardware, easy to analyze mathematically, and particularly good at detecting common errors caused by noise in transmission channels. +CRC stands for Cyclic Redundancy check and is an error detecting code commonly used in digital networks to detect accidental changes in digital data. CRC’s have their name because the check (data verification) value is a redundancy (it expands the message without adding information) and the algorithm is based on [cyclic codes](https://en.wikipedia.org/wiki/Cyclic_code#:~:text=In%20coding%20theory%2C%20a%20cyclic,efficient%20error%20detection%20and%20correction.). They are simple to implement in binary hardware, easy to analyze mathematically, and particularly good at detecting common errors caused by noise in transmission channels. Two bytes are added to the end of every Modbus message for error detection and every byte in the message is used to calculate the CRC. The receiving device then also calculates the CRC and compares it to the CRC from the sending device. If even one bit in the message is received incorrectly, the CRC’s will be different resulting in an error. From 59c24d3ed47bc10986a58629c0b8b1f6873b4821 Mon Sep 17 00:00:00 2001 From: Hannes Siebeneicher <60609597+Hannes7eicher@users.noreply.github.com> Date: Mon, 28 Nov 2022 11:13:11 +0100 Subject: [PATCH 12/25] Update content/learn/05.communication/07.modbus/modbus.md Co-authored-by: TaddyHC <94547080+TaddyHC@users.noreply.github.com> --- content/learn/05.communication/07.modbus/modbus.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/learn/05.communication/07.modbus/modbus.md b/content/learn/05.communication/07.modbus/modbus.md index 25fee6790c..f63d638ed4 100644 --- a/content/learn/05.communication/07.modbus/modbus.md +++ b/content/learn/05.communication/07.modbus/modbus.md @@ -47,7 +47,7 @@ The Modbus specification doesn't define exactly how the data is stored in the re ## Use Modbus with Arduino -Now that you have learned about the basics and functionalities of Modbus it is time to talk about how you can use your Arduino to establish Modbus communication across devices. You can use your Arduino either as a controller or as a peripheral device depending on the setup. To make your life easier you can use the [Arduino Modbus library](https://www.arduino.cc/reference/en/libraries/arduinomodbus/) which allows you to implement the Modbus protocol over two different types of transport: serial communication over RS485 with RTU or Ethernet and WiFi communication using the TCP protocol. Because the Modbus library is based on the [RS-485 library](https://www.arduino.cc/reference/en/libraries/arduinors485/) you must include both of them in your code. +Now that you have learned about the basics and functionalities of Modbus it is time to talk about how you can use your Arduino to establish Modbus communication across devices. You can use your Arduino either as a controller or as a peripheral device depending on the setup. To make your life easier you can use the [Arduino Modbus library](https://www.arduino.cc/reference/en/libraries/arduinomodbus/) which allows you to implement the Modbus protocol over two different types of transport: serial communication over RS485 with RTU or Ethernet and WiFi communication using the TCP protocol. Because the Modbus library is dependent on the [RS-485 library](https://www.arduino.cc/reference/en/libraries/arduinors485/) you must include both of them in your code. A lot of Arduino boards are Modbus compatible especially if you consider Ethernet-type messages but if you want to communicate via RS485 there is the [MKR 485 Shields](https://store-usa.arduino.cc/products/arduino-mkr-485-shield) which can convert any MKR board into a Modbus compatible device. Check out [this Tutorial](https://docs.arduino.cc/tutorials/mkr-485-shield/mkr-485-communication) to learn more about sending data between two [MKR 485 Shields](https://store-usa.arduino.cc/products/arduino-mkr-485-shield). From 2ad1907d043f7683584789865ad09186ccc23eab Mon Sep 17 00:00:00 2001 From: Hannes Siebeneicher Date: Mon, 28 Nov 2022 11:13:36 +0100 Subject: [PATCH 13/25] adding asset --- .../07.modbus/assets/Modbus Protocol.png | Bin 0 -> 45434 bytes .../learn/05.communication/07.modbus/modbus.md | 2 ++ 2 files changed, 2 insertions(+) create mode 100644 content/learn/05.communication/07.modbus/assets/Modbus Protocol.png diff --git a/content/learn/05.communication/07.modbus/assets/Modbus Protocol.png b/content/learn/05.communication/07.modbus/assets/Modbus Protocol.png new file mode 100644 index 0000000000000000000000000000000000000000..03fe32cabc564d11462119e71aa52de3a8a7a840 GIT binary patch literal 45434 zcmeFZ2UJtvw=NoxE*21_gCIeWj)L?i2!bF@s&o;QCJ0gkk=~>z0zValGz(o2qy&&I zAfbvLkoFp2lRjMc=wHW#yRKScg7oMje*4Mwbx!{mT!J@ZlZK`)Q{1y(7<4@ zW7jlP^EY)Y1{>Uv<&lgD1rz^t3t*w|tP2W$Ot1!h)Og=OXC{+z}Z(R=)x zEu*8BBHu-YsI`ViM>h-X3Y=KuV6W38 zOhb2KeZ4dTO@FoZV~5mZ_oR7_%u3a)5VfELIDw=8*c99*F3>js-9UD*VOr45)g>h* zSd56U@P$DEu812bg`1O_pE5#EP=s;K&ApEBbBNFzfw!&LE8-`OiMP!N0|%VGre8|< zJ$_|*t)-=<*-Hx-<;kqEf^c!k$B9|ccVaNP?pa-^`XCO%K7M!fLq&z@;_`Aii9$V0^ZaF*XN}VmYzxJEEY4z#T zr|-WM*dp!x-qL{;i}pT>RCNchN-;-$DMU~(O zPN*oMauIU^owDMQm(HF(E2%0W0ExG=D*oMzOcZCC`5{NEQQ(?>wQKLP2eJWLd zs?g2J+q)bmR&Fl~PhD9YD!(_V$@Dt5CsmchJkDEpCVk<}OS=N!ECbaF`2ic<)(nnh zN16vbkqPsL&B0T?0t62Dd~)&GA6C@2`qaZ{hjd<5(WlM^u}_&LP2PaLVLMNpUN4s* z3Cz;8p9a2Gv@IZmn@e@;y()j7ZLaEcOoJj{;o5%Iy4eEtlWV ztI5bt`F`1OI+gG?H-5EMQqyDtsOgHkZ;hsI#@G3?ShF!k;+#a*YH48Ulj5rxOop+- zX_U4my4>{lH0b0sS89dH_Za%x`J$A`S6dMqh+CGH$K`(cF^1TToS$pCr0r5AS*mx! zoR&pffAeOuTM{DK>GIoiY6#iPdbZh_g!>Jjl%uXq`wC>Ld+1R2)B3abslQFSPj&Fv z^Uzip(ace^^u=^hGp^@)^D#+uX6$cy3cl4+mfO{G-y0u)T`XmF;%t(xss(=;Zu!A? zF>P5YT~apwncCa5>V24xicI>;C%bD=^ucfAXPHXV^laixWBKmtH|MI#(~44BhkbRev;j@$* zf1l}+Oco*4Qv8BlLfJXt!PbonHgP~o@$)q~$LTf@IPWYzg6pYYsW`_NzpYH|E}k@z z=#=Ul;_|i>-5`^>xxRkMBaNZ&VsnONlJK0`Rw%>=Utg5_yM!G8a>VR)jm6roLAYS(qh{@o3Up5ExBrKTGm899asK;+$tP< z7#KJz@cYfvdabJhv2z#nu0NnvN7pIli>j0v)U*8vq%P>I5?x0*%}yj@Kjay6SX~$B z5EI(K%CtzkzM-;{BCan7GLR;w`~_B4Rs`%O!^?}onVy~+_ifzV3ZIAV7pZQRmy}#A zx}x+=!0w#>l!(Qt=hrWibsNoYit^QozVl0oq)&buVHO_7;o<*{KTUe4N zevwVTA(^z(*CiS(+{%i3F84zj-P?`LQd;uY6OgL%e2FT7%|W-Tg76#0ZeOqt4i5P- zdoC^F*Gn|4Dy6QMI9-{g*Bc9zUl(;$)g&y!8@u}+Pkiie5Tc%m-Sykq$NPhL3kIue zrv_nLT9S$vH4o4I`+j~h_tAdEXiw=>!)OA0IDtE;(h@k<_2`{R&&ao&z)u?Fwv-;b z8LKZN)mQ{;$kN=(SjY_Jv^DX`3S3wOTJAv-ncY8WOAN;�xIc$}=xl0gYCV3eLQ!qUIrr{}UK$VZ6RgW) zBO{9lwui&`q31>pQ9X-X1GitgGP(3ssq$>;#%<3J6h4j@z~Q{9?#i~^KJ#4VsVqW{deG)IX%bM?^#r_(KO|#V&<$ z>HoeVnt83+yD#3~WFUsk=|ymWdG=7lTUZ0noCWt_>`%TqcAi1c%+!b+VIJvGaZNbJ z%iueF=*wElfR?3!j2`i6*CYNujr^!b(Ck#gZ)MU`{P*7^qy;%#b61>ymT)C{9G@xK zqnGZf(;C<#l+Ms!vK;%VRfa!0er_;f5%uz=oZ`a=4@wx*-*OrRvsTEX1{zL3eLhVU zm!TM%xW@LeFmG+VA)$?cNXz&`nfq zT4QKdm*0ngQCnoFu)Y*$)>pCVVw7S~;HYJp1t)p8Q8Z!JHZd4)6@PBAdp19k!`hTLRnhMBF7P<@BrT0<)+sehfo!KQXQwyL@)0*e z)ItWR%k}hFtyX&e&Nmv0ovESX;+YIR225_OPnbTU>6uc$eGm7;J-#Mu;Hmv8UXIZP z6(Jse?n9vEiDp;gY&*ii5yQ^e-)`*e)LCB35n~{JT|^6kK?+?m6|w_9!i2o}KCw6WC(V}j0IR`ZUHp*OCpM)w5D#a8IBNxnE4eeXy82;oY|QQBQgidwjg9$%dv0zwd=9vkI~u@N zS}PBajp34GVq)f|rm_Y{M+;2Yd|l}SsUMwz#z9W=g2{@Wr&i2*pjsO{tHHIuxmo5H z5U?O5D=XW-vElXc`b+RPQV+gpES`HLq)BCkXWcIM|f%+E(K*DxLgY0wQk4LpjF^79Rg1)k~O!IQI&CvS@@;mut^4ug5HjhHt0J>0<-_w(W zET|+oYum#fIQQoRO*a|>nvSg40*ceML`yBi({Y$#9jSs)RW;Df(12xlnrlRa zg>pyxwS>8i)kwIWZ%Oo`2&236`c_1!{8ca4R=lYQ_8)gPyh6ZMSC#yLRD024e-$8L zK`R<0stM0{sGrj7Ycc|TA;;9HkMLA?-PyY$59{LO;bUj~kgq(cK;h!VVG~8~9Em|G zmiu+Qxq*6B<*-i4?cr){Y>dX#25k2n{U^(=MNZcKU|^GjEuq;32X&>2E$O6k>1^n4 z+*r_wJvmLE3~gQR!O)92uN8!OxFUL(Gp|txss@=%{QQ}IxiZT$`TN+|vJkcH6iYHW zG#qm2B%o$fpT;&a^$Br5LW*0S8#(@*1_%G0prnkr-6Gc^AgFgDl$Iq|tl(Df{QSIS zd0Z%O^sQRK+2lm89v5zl^S``a5hqs70g0>hHM&6EliX?S01^0;M0)DAiVKRaY%UIs z`u#AfXPk5#QnpR?i?p$%w{DGm>`qG~J5_dTl8n~_aZ2}H{BEnnSA2!YXPQUEQ$qGb zHtKgd|#p-Gjpbx5VdkvmHO=O#0Q#6 z+ym7LIp+?>fEf)yM6{&^DG9ZR>a4Js2DM(+TU2_3R+6sDkc;+3!S2#pKjR31vu~Cd z)}I1eh1vc35!Jj!j6h*$QXs2B3L^5EnVIdeSyxdF^nCs7>|F^>18k(H3zLI6vq5)O zsJyM=_n*KfyUW5Eo@@+~Nz>nVG;{02|G)xsgCfY^LlufWA-V+QEW~h|oSYTbt7Oe$ zQsk>k5T=4B{hn-zPgL7=UIV|;*|p|si0Y=dE^t0~e}8j{ca+k?!ouOMBG_lUFF@q5 zslZ!$-^b_sC)drj>GqU4{4NeNDG~khfhz`|Ny@b`nNO)m;d|HkU=5ZBYmk_Rq@;jnknzu1@X;&Ha8@LC zwY+sbnV6ug!a#jK38tcuj464%P^fJj{=qda-xI;)>73}*Cc*4!m88S2J#e8#L6DEG zB6$O*PK}(}zURkAd~l4K1JD>|O}(1fFB)QK7iIa8lbUtb{{H@s-?`Lw^IjZ3nTk^8T0rM5e{6H+PL>2$ZV>G)#je`KfxzR~Y^@s(5 z!CNV8=4Hl;m>%tOAYQBd<^DrQg$rJ%S8%iQ;t;dMy{y*alsE=yu$MK*5OD{GB?qCJ zQgI!C9-wyS$GF?RowOfFyRX3ozLKP6+kC51joM z85zQe*3=`z!-gp-DQL`PNy+zUG#YF^XoDsP=aAeAxYt~OHiAZy>ly*H+gKW@I_UBo zT1Js!kKROkipY`WQ>nxo(;pLn{uZgW%{*3KT3+^7js_s~fHV|^!ZVnbz2Qj}YoeGS z^&p32a$#s_=-dF^;r(9*Q9(evid5-CKUGvPSBwIX>V-g9paENaaF+^@eOPiQP%VGu zNIlPk`>am_9|B9(kx|RC3#~f<&`%)`WzA20oj5a5eqxX0|LNkpKNkx=DiQz)wf+K! zC7x9!rOV_oNkpmzpMjNt0L>r`g}Pkuz|U`I0+-d^-aguMyU$(lLv<}y=GZDQp!X06 z^u`X*zW#6DjGEe~&2+di#x)!cvq4MYU*<0pPm22sY&ufu6zIQZph-@=;We4cN5Q2*9+?O-y9C zr!mADC?TR4Ox@hvSO-jh6{$wIHx$^_7%z<+SEa6O+%h9CDeekd={P*}kZ*a<+P!eIah1=1GsqnlOv9A_DGijVN@%IF)AI z)GFaTA^z7&$}O0P9_guVfkiz{Yg=6bXQZ#@r(O6Yxi}3h*&^`Q_u*k@3H_tseoIZ0 z;Ah7BD&(ngrT=WSYgu=LvuWqc-#(v+EA-4k-b@%+>+FmxYzKWiUW&2hRqI{6@o0se zgJUx~0T$DtaoqYxR*12TYV58;QbJh0cnojhq;lbOwUIj7a!vij_CM$BV7ui%?x?mD z6+CH(yW8alM#@vLp$2q5=daEB^=viI{h*KAF)qjf9#Im(rwj=fRet~cX`R;s0vY2X z$JLVhBBWP6?e;(1g(Ehf!}qMDq@}k92Bx5pK)h{maIkI&L=A*fbztE1s@QSsZ1nA4 zB3&H>5o=SXFJMIXmb+8_A8eZLm>A9;PZUnbB#kBtU|k-SR#6XwjP=7k0%>wo9a)he zeIV2MB$;+wkGOLd!jhLS=K@8=sss|ZcZ3f|FJI@eD;TW z=SA|p9qC`G9*7~1D>58YVtB1e=GZ5AT0iGx$z6_#N*RX=cd*V8svq0bDa@kMn!nee9>RaaL> z>yS*g`re^!NWX7}*!}U4^mIv=CoS`AYBs~V`eSuwNec0JPWXV|6S^mGo)rK~niH%l zUS&V{B3L;4X|8QCi(<1N+;-HD-f#}mlR zq;Z22e4>1gMY9~K7mk+*d{KNNgoiKjIQi2yvE_w@QZu*j#V4L_yfKx+l<`W3n}$mA zO1QqwwyJ6V=v!lH@S*_nF{1nshqyB(qU|7k;DKp2p+X)5q zAvDv>V=KUaJ{oe?zbajAxcNeu79i{+%P5|#lhg^Zy%n}edUgWgU&MG~R|nPh0#H2+ zNv$i-^n~rnTF&~i+nZ0u>Hd>r>Zt)v0VxUD#GUIhmtXeZB!w{L>AFks&}SJBgFZ`z z?F}2zjN-$?b{=|rw=78}Y`h4jmktk=nQOv@3ILc#QGnX@U<;Ai;(_%r=(j4Yeg}D= z8V_gb=DQEK`G?vzZm2&dyT0mMai*c3JTdVcbr(7(2Rje)9E4fnCu=OYLKY07Giu~DOdRyPcmFo@l zY|{J6b|xMLfEGQ%xn_oa`k+<9jRr@1^e7~gmu4WhFO)s0VL)=snx3EPO|Ej#=Sqg+ zU3J*8`3quqZ7SZq=qYk%0f;KjUiY>9(1PM-j{8yVraccUnRC|-I$cbt&f%tgBEsme zhN)S$gJ>XPG-W`&QU|0Qe6bb$7$9=jrw5N6UEbT-$Sw9)?^BNg>#h@|(yBYTZQq?< z+xqC{lYe>&@y713_C|kRQGu}<1nc)}-0UtpRhMYzJ4N%Zs6A!Ki@@6l(Tr%bv#(z4 zEt(XzQ=L;ZkO+fcW%r-G)Lr`6JxjLvEehx1%3L9)5sfdrtNV#p{M9+kkD{|JazV}P z{nu_M4RCk?mryr%DjCVO+Wy8S=m%LYcP-Lz>xiQpNcoVahB1^=h8@@6D~N#ibX)6w z;!+O2cJ=0^uoE?bc(cb(@W)vhdpMIF=Xer+*Yiogx*G-`d}$tsFfp+;G!8Xw-(Yzt zbo|5#|H2m_$G7ncmG{E_%*eSr@WO4=SW8IwDk0}xr@?>enA7>=zxDZVpJ0(ruy(3^ zbh_c{{p&2h?$LCX@f%$ZV}p2-_m5xtzbIF2aYbkqQ?)@osQVA#o z{i)iVQXNF785|y72vZDytYb=6@oP3m{8|dcqcNpGx{v5+T?%K29^ALTAAN7|(UFp5 z(v@^ql3Dr$VM>1F*y!j!c0XX``K1mCXEOEDS=Fvm9YR^eVy;U|h$Klw+2GPeu8=ox z-rVb++D-Dbn&Is3;jvo#z$2LGdY1ZoR_2!s&zG%EawF_1?~Xv_PVG>}HT?#Sjto^^ z85w*vrOYKMJ#^xjs1rXDi_Rew?w?B6NR$n7S6p!KXa>TPt9G+egqHPd56}F0QFnLu z?p>D4F^P;JGU1oVPd^wF56qYNb`q$GFLMJ4fTKz2sxJ!YgX!z45xbi%KNtC(Pt0AQ z6Ja(jqFQ!yiTOH7L3+joRg!>JuzJ&zX!E3#Rk}9zS8CX*L}?K7=5sARM_q?!YL~B> z*nW>>8FK?O?tmgNSQ-}}iC|@{8q?J3s)zNsf(6{N=XCmPvCF8yi*MWOvj(|{X>^75 zXW!?a!^(zOB!le|Yb2Az1cCkN2efVf?x2^4M-Qu0H?NWyCPAfOs7OhdhoLm``Kx6c zt{j`ypgZ5^M{tnITZ03QQ#wzj32Q&QEIS$7|9xa6-_kbOCTid1@?x%bao}@uJjekh z&R<$|dx_KxX3nfX>r&vwI=%6<>njAxNTLDRZi$V`vD0C4u=H?l|7MZF?#Vf}Ik-D{GYL$>0-}W8Dl$>i2pe{x^54diPWAo)!O9t6R4Wd!GdF zy(RVTtw8MWRj{b{mU*zb)U#^GW5gGnZuzG1h>CR-6`w2-eP7j>*Bo4}S}X4m|ZpN&aoQ^I)tjLs85E{&;1`FdQ@0DD>(#w}8>Gh#?*P++y^Ld!4GnsO9JAOPe zHjIgPJS>NMb$r}L!bO{W>E+NTwZ)vyW7HwEG!9cNzYB+=ge{AgJX-a!0phIyW456d@H~hjKYZAIRWH z`+mbzp}~jgK3^W{53?J7>YRC$Q@@<M}wkU#%pOmy;Lo6oy|d>6kF z0AS+TEX3WkC$Dg0++Sg;k9*{|KN;|H#Yju|-c4Zw2j5)2iRC<<_jd1tO^;FjHo3{2 zs`?A<^Lw+i@1Cm$R{U5$YK$D<1!5TO$tvuddrPyHl@AbjCJRazM(&b*^iJfAV`ScQ#8G7^Md}p2A$$~tc`^d#iAYCtgDzt zuT!a`-w1jN`xvAN?y-I0qdxvMqdjU&5iF(pcp4N~NCWBm(C%+w@Fp1W#`m7B3f*Kh)|eN3ao!j>DvJlI+S9 zfc?0OUV2+V>sz4Tg&Fwl+1ZNKR*oX0=RKxbZP@F3+w%+e!<5vA)^Y=ZhHrtkB7YDg zk8GesxwaR& zTi&+B`pf6sEX7FXNOaoMQ=@2)l26ZXzwJIKPd*oG}VdCo9s_ zSLIme=m5v%2yN|;Asb##HC{`4XWDm@U?n+DB7S*d1L zcT9hFZis764;2j0H#lkasanb`~mSbY`KzWLuROT*s|N_27HTni|ysi>G;RMgruj~maP8xS5!oA!N%*if|UmE#N- zAQ-Q*w6)yA?R>DlvgYXxN#RebbgsNL# z(3o5R6;J4R{yn~ZSeM$L3rU^yMP&2|Qc_ZHM{9$u5PMt2tT-XHsj` z1#2to`D%@%Urunyoz)O&hqG;o^(}+ zp**+&Ci=37OfVsZ0zUEUR}S&nz*h% zw9Ctv>!ha+zoi959}gsR(;K(9eLten7KhJ=N)~=OCM!n)i}L63-C&Py<=xYr04@P- z2Uv@Dfcb#pHDf@L<%1`^&(9aKQ$83N8Fmf~T=ZT!YJmVULX4?=uU@_K;{gh$#0h*_Oa?(yhyPYK|k__&#cevC-0E+HRfo*@DV}D$e z0fexJ8&>B8wubqiU#(F$sWcn$cm$F8hrxb>6ovKYd`(?$kY_VKd`2}$I;AGwB|Boo z&qoLN{{Lx=A0UZnY1Kf3^dipNCzx|D=wUj7<9Xjj^X3u`^K+!;an^r{T8Tsc%B=`@o+6Nu$ z2tdr(4^!4)V}rojn*I*6_o9d_PgEJ$d8i=?^vTH6@IRx9rhmAMxET8PA}@6D z>Ys~0?ZL27e}}Dx^!ZPA9EO}dnT&-0T_;rgR`m1lKslfa@yy?yty@RGLx!zyZSnDu z7=ThzBW>U*u6(Siu@s8V&(EI&$!0SK-}o>7Uo#+G1F2Yjq3G&|t1M+reknA#8#t1IC*(gE;hn71 zZuWW+J1_ZUvu@{?cPgmjk)csGd>nVjp8G%-$f)v0;>6UDf z9wZ)%Qghg+Or|ovXM`i_iDNMjxQG`F-LCW-356qhoA1{JKi{K%dqH3;kU1kB ze|PyO0mxo7@I41@>oRzN(())eH%IyJUe|)XCdn@>td$Z4k-2aW-e3DG zL$rsm4p6%gbNF1fQdSP+FAAsk_o2WnuNltwS!z`#$j|RRZ{mQdr5miyd1`)PWo4yn z7a>G}+%_{ecd902*WO9{HLwBpfAm8nsOR--=l1xs70`y=tZ~&=yc{9U*9Fu}5TpwM zHTDj~n&yfJ0%9%g1t+U$C9hKZ^=FfzjS)e+X4ccgw1KT7e|Z0X*Bs?^?4p#s{OLcd zcT@(Vaf|dMGv$Y>s-dH5ebZwg{LTgV#*g!G-ArGZj+>AIi_;HG_3|1h$en`>@z96E z4HO0GMH6vWR@Ogm;OWKiBZt@i!*2^*^#M7GNqlV(0k9>=X~@BYCRz_dN7iM=WEgUL z7nI0O;(=2?T_*~bdeD^KKYH!sm;HhY4vV~DT1Sd+kMxlWS6 zV$J~&VO`8rLQ)<2|DVjqY7Qv{s2RzFs#8qt0g^d99nZ%_WS4X`pkN&|6Z!w4isnC1 zBO~AfDEdP;fdt6e2w239PLNtSbSmwRP~o_V9(0Znz#{3z{r-J6;lN7Q>GzlhKidSE zk9!aclj8*HWeznFnVnriCLl5bhZtHw&eQl*gz|tw?yy4xYGNj%RkYe;p<=_BbLG!H zH_r+xpHCt!Ok@+S0LMPJwDiaPBC{Q6Dbt?1v*BFLwwa%eW+FG5~@&e#1z`Rn64Ws~o5uOj@ zI~ZWQ8&tAchl6sQIr@VX6zmsNOmBVlDmlDOW>)-QtPWyn5p5~8Cc|G$B&rD60Ru@L zU0YCsdLWet_eM8UYdSkS8v^?HKpjM_h+V~9btiUqD*b@1IXFKeD^$mD=xq;<#D@#= z@FocGoX0pt1qCB;a*ub|%>&&iiK(}`qX*sV=D`74sz7s92|h4LMK8et!g&Aq=k|GR z^1M)nMNo+EuU3^)rZ3_m?FD=$lq+oi1qcDZD9BuKJ1l95c>)e(iq^n-`_SXmc>w4E zPYJf5*`^ljXb`7>=Zu3~(nclZkh{ARyU6nR4v~mSAn=Ct{@_f2_F&H>rKhc}tyywO zU``a79byA(3E&H#XmVL92f9DQVzcdTAe;U;yj)P%o7@LXJvsc$tyd@j5@<{U|18K1 zI7sSjD!27!k5-N2BXH}AKl7WT1M}<4v2L081YT7^PV*f4&)jQZxP+oc4>4i#7eVse*LQ5WZS-$ggt5!Fi8e)+X0nxr*oG9eRgo}xxfP?_kHEUyYpjc$f+854b+};BS<@~)dHWmTbLM7BY6Z?=V7`# zd1Ko8E=XD$17~}s)X{r=c9NpzAUIRd8(Ex<&fo~}*{5b^@t7PJKg1%BkUe$h|1uSrdS ziare28EfAu#2Uzk{uv&I?1z->cRYCOVh+@|1P9hw5Y4&?u_&ycuq?a+RiFSM5-c+& zOmxY4ub_$w^olfiH6#DXDO1A2LdSP@;`W)SKn0zBvAs5+lq{36=;VRcA*WYC0XEVh zyFoShWG0VpqO}_78R88GS}}7@^gt7HA?nu}_UHgjn^-`Kb%p96H(Ym*9@sR;vwym( zLtV-KbQOZS3jOIi2bn*|YX>Q8m{ABYb#+W+yu?QWEdXz9)6Xa_ir#}T>}}1J9%WhAnQc%8UhteUY?$Yhqm$~#2Uh257xG}9M=!Lb~U%n zVaNhYH-OSd2kk%Q1zzZ_9+==uAlIYf9l(EsY5!^%xC5kF&9_ z!otg=g!Of>VQWzJMDuPCVc&v;7Sau369lh8aJSs8H}Ucr?Q-n2~?`hqi5AWC9#}2-|-@2X?qq zeD1X;A0Hvm$7eCkD8>Uwn@ufR|ra2m&rtgvlKw zL*_4ZicFwW>ZZWhI^rIapxSMF3}hwIiL9Bod0K#JMiDH=4kR1~ zn*?4?`kHzqFsY+h$hB>5KAdmiHPj0}4ecSY?~^+fij(p^X%oOCqU`}Ecey!}?aEU& zt4(hopRIr);JEzD?ahJvJXfAFDcFMW^4dVTI52x2YeW370%f%VyZEgYyME76)63X2 zueDTXfq{&#zBjaj#XyjYMx@w%Y1xwF|kJDO5-Dy*728aUwt0K zPFpqKDAKa(DXP^)9aEDqwKi@&{rSn^;74UD^Ns+2sBi zNsUphP?CvnTD0#|UWW^rmocPKa|HbUJTb-@wC7HzK-Il*c9TDu)bv{DQQH^A7{$Hu z6ETa;b%^R$n>x(#@|z|rgPJQ_9zo{<^b{mF`OEZ{>@I_{;~#0AXQrKIZ~LZNZ_mf! z1!dinv{J8M5T$G3-^`{hX{=F=aaKtDZ0T;)4MH ze=yl~KpGizjXoRqAKSHj9xC2<(iXO#<~_P?#Fr^=a&qJ>w{Dk!lx{ffgjjo(jo`8r z-RE$oJ&~pdDK@cG+DSIyGmhOiOtNTGREs8?7_Am|K5eF}%H41d@=Z9a!d-k@gX|2q zXm?HCmrspllRinxQ98TqRx#N4NmB&{6|Rw_&(T!Z8&?<;4rYT~N!6-r{3!B5?7DH( zvqq%f4+*ZaF@8S1QN~B%9$oUuIWuKh>incsY01Y-Yx1YtJ!2a*m7}NvO1<+U?_YhR zq&&>nl4Zz|>mH2|!ollLj%>=t*@tqfFq_S0o5K$IFQ!+-13GI%A2KSYYZd)@%koj| zr$V;Yc)Z!&q8d<5%}|)VkVH3hp@DR=s|Gbvy6jIz<9BzNmyZ2nTLJUr>aQ1WXE^O@ z{n<;pM&TKIHLgZ7hdNsKQ?P;LSl4JjS0!H_j|^+l$Z6Y(m=C?5J;c&$_0PwetWKhF zqXG)?MU9_i9B4lns)wH4@eLq5(UzdfR^l$y1fCkgjSppQn`9X)*H@2|s!{sb*rVWX zer-=Np3s1QnL@PS$XUS4QEY8Z#>d2q@eSO-M*DPxoKQ#=zV)f=K~YVcmSX8L&Msd5 z+W@YV@wSiy@S2#0afFX^D4e%gvA3(H^jd9U72bU^U}W+0;}lCj{$rXZq;mrM%MW)5 z<`l10Ub7KW%A`H>@zf_Kg*9wEyVD{; z(!UobeD+?r)tCnCcgijg_vcT1rsNbHtnxmp=efGl!pX=vFQYqFGdAsH`Xz!h&Z2!{|j?~*zhcAS_yUBW6ZEeeYm^0))9hJ%5A_WeE zPG{E>7Jb*)s>FHpYhFF8ysc^+*CTc0*y51iG8z|+l2EGJe6XlFa)09GnMcu|ENTKO zw#;6xP1HNRwA#sMA1OPvOV2J+>2kiNkaoRkO&-7A+oYi0B~o@8J0dl9bw==>>B}RO z%ten~k}RGKmY*IneJ9ymp|E+r(QeWx{G{EB>3KHKv9H@mDDwJ%@?yonz&+ z{vEGhtb%m?+i;(tyTN2IL#`pM1Ge1rIYL;bMFI2rj<-Z#I{a{SleWqJ`cHfqNq{HRFPd_;@GW)2ma+p z(<=rkznnYUrTua;=ywPw!|O_)TQA2Z&S0Ny4PH4R-)HQQA*J|mNT&~JImC}iaTln? zf-|cv$v_|Y?ulNUG`^M_Le93&ej+nGO)P<$RtSu^2xmlj@hyE?HE zpSz~=BmW#l=7e4KE1fj)iG8WKX{0GFciiqV{XOUQpI2zfHg_tTF=r`$P8f9tP^{98 z(8xqRP-dQseqi_#(N9f2?01aSUdH6ZiQ(^~kNH&Gi}O8x)>Mm>ox~uT-GmGGf z0CrAeny|*Qwx2d^RWrPFLyrqvYMKVxv5yh+o}=+tzANF=3eSe3@cdVp?U9)SVj@-Q zVc$`!4vd9D_pBlp8w1fR&8$S&4YEdLIddf#1#{@@x^gY`Sz}G|P%L(ar^Zr& zcT;Rr$Pz2NT)mdxk{s`J?2^!Cro?@(0e7?g%1K|d5b#3LlFmf&;*g1OnZYP0%Daa} zuxj4dGGL{t=^Jb$4G}dkgu$fa#gsNmQMk&q6UnFcPGKSbmc>#~ zdCNydhrVdbp}B_&mNjWoZ@dSWmCJkY1`!=us_;2?(IaAx^ft)p5WNxCmG73yQTntK zf+uV}E1T?Oj%_71vnNw69tlGSA6+c0uv!f9Lc5MooNbV*r++Ok+C6{fNWe%SMLoT) zOGr38`9zY4;t3(n(&aN!e4OSKG%{)DcjeEw1h(K>((#%$QLbS0U0;z`wY?8EWNOP| zbWICoisS^l=eNo!)n5hf%)Y|mXha$(ZLKDxJl}IoV;&~x+6548t##QidQq?LHo4@x zk&?scWb4RXvm@&ADV~muiUrG#OkUrepJnV70kcm3IXYswLG zv2^-!%OfUu*AlkIs7Kp+<9wA&x+xOEL>Q9{G8Tin$R_w`caHYPse`;Cd$KX_We>40+L$AvlaY z?$(O$%Lm-|FFR`FAz0}wBVF=%NV%qe5>l)JeX$bF75lPd+d3=0%rZ<<+vkvH9>wXu zyus-=^STBnWa+=hCc{3o>GF)LSvmgZLWBP@+PHeuXG9>%j-lm(myZikq^=JVg3a4N@b`H}V7S}WZ9d?IM8p-M(*eZIJbV}9O!Y640Q;W$2(4@cc8*P#O%{jjFZiJ)iSy#U0kH%cBPx1}Bf%NF z%Arh^{G7(&tQ5s^Z|O*aXA*RU@pR=geY(P7dJl)9vL$w?`!-m&?gibdjuRK`t_i|Z zOb?d#-#BT{(EU#);-92VyPM(s+>SkqSmVGkQAJteQ|>qk1Libo<_z6<=yds(-)we@ zrRGzQ?bT^FME)&(?qFE^5gM_#oHj_N@A28f$=*3k<$4XrpB~prYJbpJY{tRCAHrKa zbeW0b+;~+95wdn(^eMBhJZ32J>6%)8dYy8B-gi<-v)H2U2+2kZC@143L~6DsEXJe6sk*dkZIGL1mHizeH?zfeMvQhRDJ&#!o4Dt3Tdx8@GfG`m8gYJN zL#^)iwv*5A&y+Fo?zdVtN{E4^wG5H`O}#0|0C^eF#QO4FDO2W1b0_({-ko$roD>7-tUHj_{Gy%j>Z&R+|FGb z36a(#_`2j(Rc_6BRqQ78*JhrNZtcxK{SN}#-!C|7%xmM4p@ zThR4Tc3bL5SKFxQ?^kKd2r~d?d_(#N5Fi{k?02kL{eEWOD0RkDrs3tX{O>3LPG>u7 zhZ?v5ADc7+w;dZw`Qgae@&+&QF+zivD^7WM6e!w+k5}&~-EH62EW86_8r%=RFyYly z9F4MIGdPetBD)?uc!W&s_b9&)^A z;iZ_jQ%pWFSnjP5Ip95BANGpW6PqzGe9l}|Cu)~tP>ZcA4yPgjlH9jsy(WE_gaO9Pd%8abBnLZ!Tbt~j6S&ichI&Y>u*U`jrd zS8X%bCjTaSK%ogyd}Ab-{x$8Zy!Db8Ed4=t_ALceW_N*)^mH+s>aZKtE|&ywzU(IT4|eiv+er7N(DY7p6+!h zWd!r~JPIgD(3GB<{LRs}{_BPKgwubS#j^tShujfN$>LeLviYchzXEeS7lydhd<%-~|#6BcU>|F4%=>0D!I)*6iFH z*tH7Wo}Lhc)p@E$u0S&37Zl2*xVun72D^Tv54#*h*tJ-W-`N|F;N(T>K!QMQ_h#$E zj#@06f4p~-bmk5)-v{ls>R-C?|M))q4~O@kyTSiE21cHC9xBVn;!#2SzND}mr}kta z`Q=)0XrwcL8QZt)Hq_Rj0O@dVm5l!5%X%gO@I12Z#|L|@!7>+f%q|IX)^GEN10XiL zX#XYKN?!x^x3Tie%Mx@Xtx(3{pd~!3`1_IWf2}tE@hSd4=;MD6{J#=|yldcF!_I82 zlxXwI=4H?mX9C;<>Rr{hUrIau%kEl~GKu44NV3J3he$lve& z{pR>TRbT&em7(o9P+z5K=N}*7z_9`A1FSv*S2d=cYm`6dSGz+C*sS7v#qdLG-q)ed ziAWN*sO;O=r;??)MEb8SgPH#GM;c(v|6a%SUwEhf-|@kJHGwCdEvPe(Rv_%HO?>+b zIz&g`30bsqmxeqdZUv&ZmD-WJP@x5+C1?{YBH0G{nPN&tZ5Jj}YX%=t&p z+P+qbFdV7#XVZ{oAUPfmy%u!P{tYPS|FE#+nK?tI^~fg#-nP5{sQH@x%HLLcj z*kZC0Dcwi=ta;e_IABJuJD8QbK2)gTU345_8htPE!oUn&vGr*V!-@Uoru~4`tlYnx zkzhHpL#4|&w>D+5H@WD!5;J76JhoGJYtXND`);N#>QRm!>ilve<0l{Paaj*S*~+&q+m{in=3q^o)Vu2q{PIbil3{pltT~9IOrJF22#WC~Vom%;+j1#)L zsMjog4(Vw-wEgJ{7m2C-E?wbOC5a|A)Ulzs9El*bEXlSW>h<$Jht?OMSC+!XyU^;p zM9T{;t{W>#&v2hGyw#ClTDzh9+`LwTS%U z`R#P~>o0a{N3iZWZAADTebnpGK8I$I_68nX@J_?6Dj&g-En5YW4TogfOCdY7Uo#Z0 zTzre^5}dm@c^1+iiPKKGfq2DN;;a-bym!6~uUUyfYYb8_FpRJ`6d-t;m96&gKskwQ+;vifUYC)eGa)J1!YG ztMZEK@$83Wt6=OSIZ(_?wX`)^RH}&l@CC^*GA?oI1rf(X_?BW#si9KKtIq@C&47kM zw^!rNl=%PjW~O#<@eaQc#F@N0*OOZKd2cjEhbj!)F9X^NK4{?_wTML}u!FEHBwbYv ze55ima?B9ur*3(bkA4}?3OK^=tk(%enQ9p0>{N<1&CoQ6pX0{fq{~)C>rGM)P~zhm zZd3*o6G##(fS?Dk9JfnD#K=F*6pD~6Ez1F*7So~6b*d&J!P+D+ zjcH%LvCwJo5X1;(8Pjh(uD2MTIV-+NnhMHCf%2f<#cU`M%JlOgJ3E7mEKAwTR}Xv@zSc2p=SvkL=F_oC2UY@1dX}Y64qu^)8n{nu=_jG^$Y* zV(e^CMJ}}UCy*$^qX;zIs3qEp`j(PZC6WHg_$k%_pov@wnBOOATM(PHO7EuD?bmQ(U*|i)iczjjbz(#6)FAi?@?-w4|DA< zb>46YTr2{TyEe95v1Y!3?E)sDBK==6>g$T`N1_Bs+Q3l@C$KMQWJCGWP+OLg|4W$o zz4nh(B$?d_pbrseO55mSh!xbiS)ZHQCz{1)KGt=+a25Kl7*HbSOsOA~C>TYU|0&^r zKeMJ;Fbz_WZwb72ChuqR2gJd0Eh&J$D8cMeIq4wr5VkX)0^JjS1oIvsFpWHD6fKw$ zp~Ko*^gyoJUwpa`6R(=Rh;q&74g<}koGFEZX4Xd$D`@e=H6lrzk6A3;4Mf4{yE7$w z@Dl$&FY7(DrzrAqDo(lr!0V4^N-E$rJLuw{Z|hIt7rR)azArPEz%;H)!WbCAG?J`4 z^PmKNOZ@C!Cy^RaP45ydE&6vJLG`qEb!urzXc^zJIyR0NS?KGznU25Ubq~R2DFpgX zbeNzAMw*g8(1*@ZWa_dJD3<8+mP^==0{jj{)si@9OBQAi(AnVFJ1v{^ySiFCb6g-V z-_@z7b-x2W4LO?u2XDZ^0a^17h-+2|li>gOvZi@gj!2CICBX(=Ko9xXdHxnmLgDrx z9ny6a`C08raU+?xp}g^+Vz7=QK-5uw9_T}>8K#7APK?or`(3^{< zZ}|6f8g2a1F*dt!D@p}2mnmh#^w|Mp;p6+LhU_9KXE zP6(4S;0)Is=*TNDJk53I3N-t~vs$;}Kw<#Jh#%$;Kwi8u}(KO{B6-mo56;qZ!bA!_FVr~S~cte9^&B1d%BOuR0ZUeOadi5#;k<4oodq9qy;)yjPQ?K0dOw-Zk>O#Vm*m9AD7_6dAoVAE< zbiKChbsyt4qi!1qL)Cpo66;x+%((mrMyM8({g9QUv$Vz@!Np5s3XQ2D?BvCO<} zIHQu+Kclryb-K0{;1(WyjJJFg=bjb#u>DAGB`{RQktp2=Yoq;< zE|w?}lHULQb=#yfe^860hV|Rc&S7pXg3PZ5UTk$LnC~hEmQoKf(~#NMU|Yz(4Yt zho5mu&}1gio}_sC0-OZ9oZmfJuk=Jr9lY4c-M||C>-ki(DqHFp;xDXRhm^560)MxcyUi-vl+7#bTp`Vc&WHNS{1_KV zDKAccWbXUr2twjx^6e~ip4cOo4nMp5CRTF`5M;FHpRRMD}x&?*_ zAL)bwAWMMUgY1c7JKtNQv;*+4ELKI02Yvgfj-#6iP@atAxp{75dG#;IlKs=Auoy$D zLtFD_85XoUe*OqZo6lksfPm;Tor>3M+FiTlJuOKhHT^kCblf)P_3FtFmy?sKi1&m9 zk^U;T5c6}N3Y!m}2J)cJP(Q z5&_WYjDW4H-x_Z>4o+f8FlEttH~_=Hz^wyfMWL+Y^vjeKA(v-`b&nmcjb26oY5wHy zOiZRT4g{BW-PI-XZX~ISr=`hgzk17?zoDx51X5Q25*#ic&Z5Tpu^dwlTT3PJ%%~g6 zZCk)sK+86u?zZi3bQ5y0aXCNFWZlJd_?DO;Ft}fFni@D9L~?Mb<88J^`b;JZyxToL zDi%L@vm4aD;7VLW_Tm152kmP@*GnKdV!Pjyp_Cc$n465Iw;jp7B*CP1)w4F$;`%~Z zdR!HC+seC(ouJI^EjS@zM6X_W=i(yC`#5==!n~=Bk~BEF;B2a&RBzxtR42+@o{t9QyGIeb z!j40$Q2h89TwpRH>5{`D6$eD>nGRX{o2%ZCfKQCya|BJaqfTkbT@!qm|B_CwHOQ;u z5*2^7)?pI6Mkmd*uqnqsatb#{G55(Tb~ za!npS9t)?AZoz`2C;@QeXj`LdiL&aJo^CC^y4fZB@#DEW(m4J#D)Xe4lVK8VZi|f( z>_nXC(;<)pmt5DOm5B{Sn-TjahtJmwTs1IA+jXf~aqmS7e6@ga`QP;=U35AvY(GFw zj{WQun^giLl%i*Iaza+Hg?O5E>y4MIx}3XM8Q&JgVv8C@)C~)Yz^WyjO>TmB0V#Hv zl8_}fBy!sQBq_ipD&I*wGwuds2e+2vV_zaU-9zX2ewD^(eTD_mwlWg_;KNJ&!36gf zu<$PTDqi$x=PAbOgr^EQ)25sqHnuBiLr6!{E4WQxFHh`~kId=Yj0i}J(_ACZL(Uj@ z>MYbQ@Le5Aa{VU6l-W(}AV~IioycOpQ^6`%Nd}Io{v6ybv_dXPKB&p(QWY)By+J+- zat%`@Gu0_q&Z#B~z-U880>=1Er+4{lJVb#O>Gk0kawJ(9+ptlg+Ld%Wbj z4=J7hxA%@%^d{At8HW1G(`lzHlu&Owkf&hTQ_hGRWvM_`^V76*%`>lY25S|1(Q`qZjzZ1@G5n3IKGB&^ z%48av)dZ}15n$40ePF=fGMsleqS4913{N|T!?SLz%UqIuvieA;;LB=Sbsn(Gy8J`2 z!6M*H*N>rtUI@A^dJ)ne%87yIIb6H_Tr3D?5Jt3t?+t=z|95`I!c@^)Z5xDII`pG6O=E$y&)Ubfb(z0zKh)2LO0K{uFl1OeRLFZ{E@eawE_FL=yT#e#m zN?$hhCxP6&1U=5dretNW*Ly=M7bhRnx~E;+1{id(xyfBt^1==xhNdzx!%IybUgeSR z6!0thl930761HN~XVOabMi$#V&D5_I={$m;Sg(GI03z?+y8xBW3fvq>cwBx=SwpKp zw5#WFf495+>cz!|C)B;6#$QN4A+Nx=-MOE-*5dQ?G1Ax-|KsZf*~IZayF-THiU6Nb zlg52g+w~5m7ZBNdu5|WXg@-`%q{X9aYmunThhAA-N)h(7|9r~Y$JI6bV2g&cY;k8i zy8>aK%X8&YxQcsEF+<7uhy(HifNWL`cnk6$bsEfsSBr^ELtq~;vI=EbO%JEKKe`~J za*iG8NY5nQbV7yjkxoD-q%C`FFBBtgqM7tA%dztYrXqFRdn!0`qE1GO z_C0mf-BK9-eu;zR=D=?`Qj}F3QuEGp)Ywl-%cH|IT`6C!^&7Y^JgDn zF&Lq%WWFdd0#j&q!UY!3BQh=zDeF`;H28!UYK)dbaR#!jKs^1Yd}_JXXCGv3g2>Cx6qq=??^8ILu@d6=d_Ae5cx z8WATIn#>M}Nu2RTDxetRF~QE0A>|s!&sB?<-xFrxm$w~vx-Gcu$W4q>0ko;zAYh$f#joga((^bQZF~FXL5EpLH z@q2NzmhazO5$wpwYR5_$U6Wmeqpy=tBL}UvwMgT#w6XnjdnA>fJR{(g_Beb0>g(ql zLc!c$xva?@Ac-45S*69H57c31;^G?W-rXcW&Y2Y+&oyrM%xsivBCC_SzJ$7o20Zy6 z)qM%K9tE6uje!A9z3xN?4^x87t3Jz_K||lt43)EloVU$Q%4sTVJ)S?1zi7Bad29f| z{u>+_l?2)P!3o~E$^y$r1~K7nPG*)gLdu(Sf-^`NqlF?2HpuX^udjE0ISdQjSW=#Q zmj>tA8`k^Pwsu|YF=;r;Yz2D%ZG;%52ou3Ce@h4bPxlwVHs*LR$9pvrBE^QchfEm4 z(ShXG^cb>*Ht79ux<(YmQ<5&t?EP|ahKd&?8u?SjkjdM-X8Zv+9*uSbO)ICOxt0SM zcwa7?PCizB$8d5#2(dB6Q;5c5=x~^k2pG;-)C}6DY59(pY!Dxvi8FEd?0uS7cOL}^ zxkRlpT%!Ui*63Tj4I;<^N{t)2=>EvdOc3vnFmfRfNqB+d-=i5@7t|(~UbD_Nh(6CU zDB+^#|1QzsdwSc~dJz3sa1**(D>nIQd}`aL#Z8;a4~3rnUa#~R`Kf5>;=K70&q~pz z{<3!kwth3t6T|6V6)-Ql-M#&V8i19U5gTM8e^K=Etr*Xq^Tn>)Mq}&Y0t{;~#eD#! zisM(YKd@`!;G#u{4P7Jl8KRu2fTo=MlpP-%Uc^;M7If!Hx!h-4pLkfogEn>HZ(OG? z+Y&4H>uqH5Re`B7s-LN8L}TFjK^~YyE`&fy{~w|+mju)kk3 zaePBm`h3rrVxj`NLHV7-KKla{73HVgpbD;=k#&g_IP0k5g*!b`mg=Pw1yFH+iDF|Z zqTR$hXn{fMb{YbdUDkj6%3NO9nufQuWfkujznP{^C1*NNW9PYV900a!GJzRF#lS|_ zx5leq7AETNOcbmJq45_?KD9ybeZK>(UfPb-BFxddXwVPPx$KTdY!{5|?AP{!f z0JrV9UP(&C{`f|ZLIn0LHgJ0BL@=f&0&hfl1DK&QaW{Y3|4~uJ`7)EFi{=}5y7+mh zd4b_B$(6)!?scu@p`X4tE%tm^)0bb{rFeJa1*$ha$@Ey$ehd)mY)J$N8`{92y#o*D z_9-ZxYVTWeqZS&q)LdVPe|^wKae+BjC$xRj2(miP>1w*4o70b#QbZi@zmp>7G|*P3 zaPccjcdhu&{ow>)2pgG>qzJrKEyGgacbwl#m$up|ab0Uk{T8>BDCVIrP86#xSpA1r zoz2ut;@y@<)cWzE4fDbJkhh*d6LwkfCAU%=ibx;%>B+n;3>4YS{h{;bW^ET*e|l;+ zeFYE zOJLnSd%GERDdt8zM42`HjD~>5pZ$gf+}Y3+lgN0&l(O>`P(Bte`yK|GPSqV&;NDnj zxdLN*c>A)b@%s|4(DZdkhnb#4fTb8!g=mc!w3J{Qr^Fz_l}FxCVifV-!d z7j=2VTaS%{e_EcfA*n)Durvruvvk$K*(Z&AJ?gxIoLogWMB1Dv${IQz0!pz)sf2{+ zz}hPsbG>*$F5&vL=E(k3a=YI*AlUb8Qo{(N{eAx0nk8H3Fo2lsod}MdYAv}<4FO2-sm}}T6(rTIGd*l_IKv6af3%a|Iu{a*symne`9J}a$%tG*Tvc_g_ zRw{j6sTjRkJXl*LANRYZApMj^NVu(TtJ8p#^);EV`jCpS`L~XuK4Z)~V6Xm>aMPzA zcSOVFoVGBpJiFsz=HrovDe)?m2JWnr-)drd9C5AV2l05pQAO1J4+?Ol^TNxUwF|cZ z0~mgw1KOjQQ_s!~m0s#vMnF>oEsF2k#fRr;=jk9!cswnXPx7t(Zen)Wz_+q7kSa8z zf|iVZ<@H!gf0OZBMw5OZa}j6$2X_c>Vf8k7M-%%Q@TZMT@^3#LyGJeETlXaDz7Hoj z5ba>$e@VW9{bZDyMe98}g>~IU}#E{s=S#zVbrp`Ws5p zpKfmRDY*woveTck>)bVZyu_r+!>j(s{Vy07zyVQ}+4wR=oS@ugl| zUqJ41o-&~!2$E9ock!{weRk=i(zqPh- z9#6;lX zKYe*IPKg5!Pt{t%v>+@w^Ch>re7@96zVnrsGD{QUnMgc@j830prXHJq5zZ?i+`^}B z&J~tSl91xrrD}CDTteM21@!#P7^~7CddElK+nFE*nez|7Z8MI&Ea7?9%wwFzE{B5$ z*?Ya<`|TgXbGPMLSpI6@i40snH?ibKzsTU#Ipq%5-?^leIrfifaPWH!x#x(CLSoAu ziE1~#%P!Y<6YIaha_!Y4>`NT7hESdI<8GwTy(b#DCnU23*BNg4BB5>1D8k9nQr^$) zv=9rzL*h$&Sshxk{&oiJ=dun#(?zD9^J?A0dBh#JNH}(UvNeStkhELB!Io59u}iPv%79u@3S}r zaTwh2Nn-&EV!Hly;6WhwUjGX7#e1<+sV6zlULCpxwe4e(3&sr-6H|<7RcLL-k-zaBq2g)~?Rc?T)Oqjp0(N}T-_+U9A+zm{ z^MJ$GHXXKY4!CBKudj@65>a)1M2euh1mQF#X(nZ59Xe3CG4cYNA<=d}S0eV;U_z7# zI#WBU&=cpi!uEx+Zr}IBm_a4CalE~s^ifa7udh2@sJLw0;xel6UuDnmys7-3HRIu1 zwMELMofd4sfSXqcG}iHj+NS1zd%bL?D`80lN&%n#~28E zh-wTimv%JU-d-|S2H$tJ0MB0b)}2z7-VT(u5roP|<5GRvq+#`p&p`oq4a7)BfCrZ0 zY#+lM4HoDE7Yw?IY^$bgPkI?%^GOgssVHp6gA`Z-^#Tn*{+RPv?)=Ty{SJ5d{itx00FY9AO1R(|qq zjL>cVkpD|3pma-c`_F@4my6UFsbb|^T!}XnUN~BHV|tE-H3pe~unBEcD`tPd`R|Q( zfT_4nM1jrP?sJ%LLZ0UhE2U@dTmpExXZP9%1iT$O9(ik;c-AR|-?otZ)0cdIEpF4} z{;IXn1oAZy(j4J*tHy5pNZ0Y$n~GVZLQ&4;J@C2emxaYOJ@BdxX9F@5%-fN$l-orI zIxJ8XJF+RqBZ{$i7jb?=S&ee}8O1cUc1nTe#-;OG3(ulq$MwWs6le%6X|brzkVKGt z{yGE?vh?##+MI&8GnykHkg96hte1;JCghO#kRU1cpldHsiFzQA$8{G!Ov+wvUnlW{ zUM+RZJ_Hf&EXxTVQ)-wUt5Rs*217r z!de$#!ix@K_=L_0 zHU2J6m#%N^EY(Kk&GmU_dp{P!f+lvK(3N=utz9mZX^fi1^uPPhD$wB1-UOqdUyuWb z4a`Hz)R{A%64JlQlFR6TOnP6eI&cdZiM!%aikx+=WAUPHPlZ4zfwJP(-YN2<(-c+V zEGj(VTB)yf?ExAx;1i0!Ge1}%y8cacVWu9#pibKeaxA9l7ha zTcwps`yNDFA)LV{N!iqMIrHZrX2Q9HAp}{TWBpi#vj}T>V=a2hr87v)UJ_GLO7`R z@AlK8)C;6zfi*A?>lDO&|CKrr9)c8lz*UXQ0w$+;`t<3Of1ER5{0V|zEMQahHg*Mp zD9r(Qc;$6>_@i$rufV}=C8&qhqK0B?VO5qI0j>Cc9O3ag`*=7lB}Lw}Q_p^(dk4zO88l}E;KRswVQU7~%w{v+#O zbd-_s5!c*MRcZw>e^%G3yV3vUm{g3D(ZHF@5&yBWi+r$_+ahqf2c@@-o#Q1*+Fz8S z-9%tNXS{|Bx`47zE{*kQ=uq)Q7vz>Qu$EnKc8#3$v!I6rftXfTDs?1+h=0w94T!4) zcSmlJ;S7}}IYGF;86Pl~G;JMp6ulrn(B8PwsjM*~u#ft%O6LV=@qxBK-%v@uT6!tu z%>JGzXl*a1eZl6@`@4=oonmM1&N5F?_StnhpL(V@;1fP|XN6a8 z%o0SO2R@)2@hIQ}@Pe(|0#{d+3?jfd#oBH|$tJ0+QSQpVVwhj;LvEW?%C!UaP2l zg+=Xo;m&MoI%*OB8)uRYmG~ALafX}P&;v3dzc+ijk z8Kzcgo$@kMyz%Rx6h8RS9$*>M0ctD@%8$yn2?-urKff5l8tq9A5`Fatd&hu-M$0+x zqqw_;R6ZWlwZeQK+(Ha6kl?#0OfWU%hqWH)sR@30o^>;yjK{R=4>V8dPa}wxKfMb~ z-~zB_6^QFy#ABW_beVuNC3esemHz+@buTr|J0XWgeAIstgx!Deh%-tkDa>g;#(}kN zvIUN<|=6g0M1`xTz_FuR3%j7ZSx)l zKcobOWC5Fq!|YKhD&kch^c>EFkYA^XGtSO2cyd0KY_ z8g4m*-kCTtbONqv9LJ;FcNP_1QSmOc(7z2RKf`ZN!XsG3fwvVYl;LCSd(sdRjEAMBb z3;j6{p(eBLypJw~W%UE+MPJ=mJ5?8e<-P!jPf&&Ef8G{PHb~V&)47wQi~_E1i^m8s zej~gh@nLaP`HsrU2vM2Nt0zhTvD;E4c;{QqDIB9WasRGY(iI8nhh?;!%5B*sHHz&GeAf>E&atBwt6-q! z^00n1&ngAH5aN7HUQMZt#tT0Ncws6QGjqaPxN{s|uo8Fu0nU7q3N6=xMIJ2 z1jU?w2yL}S7e}};qrk|NU%i$OwS*xQQ=d?Ssx z)GLMKe{96Id=9|`?-QmOJGWWU+_! zD8CaVXz9#I8rL@N1Q(Ye&G;Nt>VKj{-HsAy5`@qeZu+694XiKv3p`(fPjKr&+dcjR zxaz1GBm&*)jaq#-3r6X&z_Xcpg4;`!MkZB;;!-X9)zs#rk?pP*?*-_5Lwrjd)@+Z{~q(KJX42?wpO5u{~+-YJ0rY!Rku$DkLDNdBbZ_mpZq z!T|Xar}EdNm{-qK52qujQ_jn8jVLWcbb$w9j3y?jw2PhQRqtc|`3)3RxBQZKVhotI zXuf!fvw3Hi3_s}v_Z(1QD+AP-AP`0Ts@k9K;YS^67&iwDypC_Pm~dF&po?|8R%jeaU+D73&-b87?euK5WYO@d!S>V|)LM?#+L^TXPcDZHU-A;I13c7GN?Y~yOk&SXn;CC^?_ZzpP!kWf0&a;Y&6J1}vYX!uLBmlJs z419sNS&S*8rk*0cs68=zKMLfeU*%Sk`l{a9(HW6L;b@O?%SaL{o z#KF7S$R!MGFz=wkQBV|nH^B}~6(LWD5o=e%Fp8@p%xbwvoK;$AtG)k#IQ1@>o0OON zG>WptO`)R7M;F@;a7*Qv6X{t!n&$GUV9I0Z?r;X4;3hHthr-?DQA6Tg2LgA89v;;=}>|Twti2CWVy^L?94^{&dpCH~P>j%ZH(Z!qdg5y2TmO3k#DR4DgIG;~Ym*!flNhAZyQ)+OTFi^>|DzfF7UL-Jr1#O?w0BapQ0E(M7WinA zN9)k(%yB~hD${;UfAECh@5Ic1y;=}U^rHVQjOqdU@yY%F3p4+h+0fet(=xWS7$%k~ zde(5V5LD4Q3bIOi&bl}4r)-0?LMgDc(xd}$D!;#JyXSPW@~on=-`UV%ycQc@KY$H( zw5$^!pZw;csuWgS57NWQhG`d_G@uH7y#Q$nUsZ33l+TJZo&6|vgM6~?6?L{fLpoD> zBlpwX=Py?H>p>P>ZQHqnL(k`BmWFoajn6s}w#QZD21IFsT5^neV2ypAyxH&LuLn0Y z!GC+yPByu1O>LffC@B--gB*LqlLPZ79sG5k$J?$+E-o&-=ZRQtAYm=QuRhC7X4*MbWTwIkWm8tdJ6Kv!5OZ-!BeQ5`nuS%CaD4yxt*zfj2r-8aUHE7C?D zMfE2r%Qrk#m!(rtDl0CxJM|KI^V{g?QfRn4V1ND!c}(I)y22Abkhzafkx7hPPJIXe(gj2sk@4)gPOqzznaUzL^*yeJKgUWB6N}kE>SJw8g&ax@8il&CPA;Cx z^N4Piwk=g&KD%361dACko$?nl^%;xtTxmmmp63bbJ7-HP<=Pd559}{J6`+g#1(ukP z=H|90NXFpYJb-tEN}4&zG}QGp+Qmf7>*O`}%~%RKS@T!YGED`A)l-1qZ z(hxUhuC0~6q_lHb$-7zx254N)-C>Co&lToANKCa%0)4CKzIP$c{Ux5GqiKf$Xc|2f z5%Dz{5xvuhptyzFj$343eIIPfA##e+x9{5TatV9>Kq9_PoNBYwr6l`j4pK0!=Pir7 z&r95Uq_4~a+~+(HwzpPX=9H}L)?Eq^-;fHAq_s=fQaJWMmTTV;4XbSap8vz8W2wTX zjr+C#_u=TCC8%JTVEg-8hFnf#1x3CU9s8TzmvL@}%+XJARS0@BPm>~heL(pj zK`qxuDUykQ*X%=UIJd7%G$Ibm>l7vws6bQT?R~_R#@WTSbk)N}?7_C|V20J)D5vH!GMZoXG5Xi7b3 zN-!zhY=Y+efslg--YKhJs6@J1t+_cC94xRmE}QC$?Qbs|$Kt+H9qv~Y6T+P?OLp=$ za$;5%Co(;MmpAU!5Mpw0OGz{~2F>^mP-|N8<7$t}CJa1T64iA>lFS~5*{K#w1@t7W zy;^OchgwueF*#Bm&4FFJB{7-7QN<}Kq7$&S+~q)uuzNoe0rHS5rn!UrETTrpk1G&k zVHe0ssf$;eWim&uiNq(3Tce%HTZfIYfaJ}NYDTjE*+hK0L(MMQ1h_O=% z2#cYsW%ol5EP+?c51JHi{pRI@ABpvpjMR463pYh0ET;FJl9%BMoxSDvGa|jy;vx9#r25!N_Xm- zU@wI1`N+@Ikpzbbb_(A=RCiKo;hbLF8cttldJei|xvz7ciR2kp7>%d9hH ze~_O?nk~z?L#Zc~OsIUeDT1LeHA*9dtm;+^Lci82=Xi&HWs9aMIL5W|(}JbR-~`$2 zJ)KxeLn~k0#<8~g?p?epoXkqLu^)UobUV)dBZK~{ z`O`Sli6OU)3f4VWz*g~bKz@@v@by-N)=*me? zufPWMKCR*#gD z>P{S9i!|-7{%+I9)vqcy7x(o0LHr?c!Txl?I87hYkC0Qa#D#bnUOwMYZOb@ayzJmA zr{>+i|6Q>A_)t(@64%E{hd9o8c235N?D5C9lMa&x0TO~8U_ZN@bJ8_6Q43`ov1BY^ z587R>Vt?$!bY2j5xo*R8aL@mKK$VBeEzFVoEOrU3q8f!Y8e>fyJDQX3R#!_N&)34` zEuLqb5d1V`W3g6BW;y=0zsnKUmh8kqZHH6HMQL)9c2n7 zG`K21)04p#Q`GGd`zt>$r8hdX>TTVclEfrGfv zIkV?AD>%-bPG890%0=ytu;XsRW#f3_MiyE=P-f>RqbNCAX2R5w=Jpy_MNYr7A*hmM z#So!JQE1qyCS2g%d|$hho5D2YG8tntYoE1My)!~aQ6t*(i(c#bw(~}OmF4_l8D4wQ zDdG-WYlPg9n7MAx)OA) zrinM51snWv7CX0sxn-rLK~MRzJa=Rs)xAo~5AtMN>av}zQO#*?o4ri~ZtLpFJ)wmT zESnV0WP(xZ;6#Hmw`9%4=ramPQEsY+(a;mGs9m$(ay?V}{?fv}@Gac-6O*AAQvpBB zMy*XwShhYksb`zT`a>sQl95f5v^uM-C$Nn@Sw8c4HGjCe+O&Ut@V!uI+Xc+l#J1L+ zk?(jGv685>u%&iE9;jXTATV#zFhIsbRH{Ppm2S_1jn(fglZNJzPwNYJl1F=992H?1xzkOGMZfNv-@x~S@;l6Jj#(*Xrq5XzzNhal&KQ5Y*b!2(gAjhUZW1g+R;`rc zv!=`OWSUIZDDv3Y^6l8!*IdpVCh?x{&z|KhzEWpAlvz+Td=HN~;eI(QQT}w+yvt_& z@f5i=&(evZ$8yZ%anORcJ`;ED$Y=ZK2UR2;DzKDAMI|bs&cpNCLX&{g&%e$C4Inz< z6Gv&X%Yb86EWP-Nt7tz7md!|YJc{arz^@sGh$Wei+3 zwhpUbJ30`y4oqQRdM1*c4^DO$C$pfbm1gT+SQPJjz+Esc*sl)OG9$9rI1|zc9?7Sj zwy6lQe|PR+urATBcjF`EIbS80s8ul~q>*2VUI@=n$1^Ga%KDr*87bz};~A(Lin2?vLFkf*-i{8ZHdG%~+?e z>H;sy)82NJ+Vz~f9fDIonAa`+$jqrh2aD;pNrv`#gw+Qq{~ayn(+b zc7N(4xY;fZ*0Fb5ae+Pf-l>$A?mC|KoH3N)2N%OM8IgsXs~8_2G>_@g^@k)OeX#y0 zn|vIRgL{faEIYcj4*iZXq>VN~Q*X&|qa*_wkhr1Uf~3<7ADEw`+(fq0hTL>n+T5x({Nv7=#I*$8mkeF0hD`YuB)J@ zf{-@UD=B_pnER%2{%8;1Ec$nK4E;;)w;lzKf}NT|1$){><9;{-uV5dKYpKldXAp;n zFu!M_+`>)b;GX>0)`&~7mgMSWecWrNT?%fE9q{fKy_%?|Rr)*Sk*ieo28eJv{|=Qf zZ6(K$4cE}Sl(alfNHOVWX7EnGH9sggTDfx7U!7Wa^u!FVi+VfnL;U1qYgb|_5 zlq=M@IME+VNBG^pU-`b%D1r@Pnka(uc_!aVLqjh@F0_u@7ZSQRqbUfg~S z$z>To=6?K7w5fBjU{l+7r}>8N36c59X5~ZVGq1$+75)1POK(saWG7pFuyu0&%meq~ zt86J#B^)V2&gpG`|GHMQ1Ul+KWd`qcb;_OQD`ftawx&rj^jM0Ln~)1~ZWgy|cF#;< z^$}3p1kSyqWUvma!RgI#R=j|Snm#;_yqROloPv=g(p1-#J-5Rx z?;pMYlEfw1eO_k%G(PPuvCrBxm`M#nB#e^!aF002o+q2Au&t9-b9 z*bjN`%7M*1cB;v27ry1o0Pe+)k~e+!3xmj>`;U=a?bWocw8h&E@bQki#W%~%91P=Y zpV4%zJOHNn93>@Xan&s63!kzOGmVuX<4;q#f-6Eb#(eVl@6eK{Jkph5&KkJ&AzdxZ2> zrkRso%*E00D3C_ndd(GZFMv8Cbkl6t0m^58o+`M@*;$*v#R<3dn9IGrwhmj0kDYDq zM?4tw7-%T+=XMk>^C15iEQqtb|9px$C{RyPHxo)?b$i?CCV^HQdW-pB)@Cf999_lh zF!R+hcA{%%gHAGXdz$GflM@A5OyrURp~_*IS@G}FC-OC18!|_5M1M*}M3P`Noe63a zitPoi&E3ULi>s)%P8p(S@)XMvb_iF5*DLFx21fakCHLh3VJ%XWiDUnCrxfT$4&l2brS&s0_x#y7kJ(mu(IFFBw_m6vPSK@45dpGxat~~u_ zwqR%_yma!tY-_W%StgHr4M588@`qsvX4)tDl=sYE=#-2Z=b4w-XA^ z1Cu2A-pg1w1?DBagBks*9i!)HoysO^D4Bk(ynjitIwtfm*sW{a#V7ieY$Ur!_I{&- zLhso`2c6-%U5E$U8df(~^k?2Ey)N&)`b|&Ey8ht+ZgWG^Ft!0jgd8F38tG>_-)Lt( zURU!-$>plxh(-BKvmvOn$XfjO@r$O06&Zy2kA1P1qJiH>=UXx!kNDDP|gR%!O#<8f!w<*WO_O;4sa=tVnJFjKd3 zY4eNj8Se0$vmj{T9QPX;m!BAXAjpR_i#h)z6!-aim53t;YYC~jNg9+BBjs1Z%N-a`8S*7^J=hz8L@-vx7YSy(InsrT08{z zj|@=#N+pYDL3zR;gFvl-3=;kec!WUy*L=ZK4?scST!AZS#sCa1h=5gt*bb0{02Zc_ zVql{c3@!-K(iW&CG;sf@$@EDlqv1Rn&Y*q}7|^YB8clVSr@DWV`i?uo69U!1x3PM< L`njxgN@xNArS Date: Mon, 28 Nov 2022 13:09:15 +0100 Subject: [PATCH 14/25] adding content --- .../learn/05.communication/07.modbus/modbus.md | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/content/learn/05.communication/07.modbus/modbus.md b/content/learn/05.communication/07.modbus/modbus.md index 7cf4989a4d..4e1e642044 100644 --- a/content/learn/05.communication/07.modbus/modbus.md +++ b/content/learn/05.communication/07.modbus/modbus.md @@ -45,7 +45,9 @@ CRC stands for Cyclic Redundancy check and is an error detecting code commonly u Two bytes are added to the end of every Modbus message for error detection and every byte in the message is used to calculate the CRC. The receiving device then also calculates the CRC and compares it to the CRC from the sending device. If even one bit in the message is received incorrectly, the CRC’s will be different resulting in an error. ### Byte and word ordering -The Modbus specification doesn't define exactly how the data is stored in the registers. Therefore, some manufacturers implemented Modbus in their equipment to store and transmit the higher byte first followed by the lower byte. Alternatively, others store and transmit the lower byte first. Similarly, when registers are combined to represent 32-bit data types, some devices store the higher 16 bits (high word) in the first register and the remaining low word in the second while others do the opposite. It doesn't matter which order the bytes or words are sent in, as long as the receiving device knows which way to expect it. +The Modbus specification doesn't define exactly how the data is stored in the registers. Therefore, some manufacturers implemented Modbus in their equipment to store and transmit the higher byte first followed by the lower byte. Alternatively, others store and transmit the lower byte first. Similarly, when registers are combined to represent 32-bit data types, some devices store the higher 16 bits (high word) in the first register and the remaining low word in the second while others do the opposite. It doesn't matter which order the bytes or words are sent in, as long as the receiving device knows which way to expect it. + +[1] ## Use Modbus with Arduino @@ -64,7 +66,7 @@ When using the [Modbus library](https://www.arduino.cc/reference/en/libraries/ar You have to check the device-specific documentation to attain the right address, function code, starting registers and register count. The CRC error check is taken care of by the Modbus library. To make it easier to understand the example below shows how to use the Modbus library. ### Example -Let's say you have a Modbus-compatible energy meter working with RS-485. In our case, we use a model from [Finder](https://cdn.findernet.com/app/uploads/2021/09/20090052/Modbus-7M24-7M38_v2_30062021.pdf) but you can use a different one. +Let's say you have a Modbus-compatible energy meter working with RS-485. In our case, we use a model from [Finder](https://cdn.findernet.com/app/uploads/2021/09/20090052/Modbus-7M24-7M38_v2_30062021.pdf) which uses Modbus RTU protocol but you can use a different one. Take a look at the request frame inside the Finder documentation: @@ -103,6 +105,7 @@ float readVoltage() { } ``` +You have now learned about Modbus and how it can be used to transmit data in a network. The following section gives an overview of Modbus compatible Arduino boards and the libraries that you can use to enable Modbus protocol capability. Depending on how you use Modbus and what hardware you are using you might need different libraries but the core functionality stays the same. ### Modbus compatible Boards - all boards compatible with the [MKR 485 Shield](https://docs.arduino.cc/hardware/mkr-485-shield) and the [MKR ETH Shield](https://docs.arduino.cc/hardware/mkr-eth-shield) @@ -114,8 +117,8 @@ float readVoltage() { - [ArduinoRS485](https://www.arduino.cc/reference/en/libraries/arduinors485/) - [ArduinoModbus](https://www.arduino.cc/reference/en/libraries/arduinomodbus/) -### Read more -- https://www.se.com/us/en/faqs/FA168406/ -- https://modbus.org/ -- https://www.csimn.com/CSI_pages/Modbus101.html -- https://en.wikipedia.org/wiki/Modbus \ No newline at end of file +### References +- [1] https://www.se.com/us/en/faqs/FA168406/ +- [2] https://modbus.org/ +- [3] https://www.csimn.com/CSI_pages/Modbus101.html +- [4] https://en.wikipedia.org/wiki/Modbus \ No newline at end of file From e2a6badcfa1a99fe27b525cd3a8c6d1237d572b5 Mon Sep 17 00:00:00 2001 From: Hannes Siebeneicher Date: Mon, 28 Nov 2022 13:24:49 +0100 Subject: [PATCH 15/25] changing content --- .../learn/05.communication/07.modbus/modbus.md | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/content/learn/05.communication/07.modbus/modbus.md b/content/learn/05.communication/07.modbus/modbus.md index 4e1e642044..c0cf9eac4c 100644 --- a/content/learn/05.communication/07.modbus/modbus.md +++ b/content/learn/05.communication/07.modbus/modbus.md @@ -45,9 +45,7 @@ CRC stands for Cyclic Redundancy check and is an error detecting code commonly u Two bytes are added to the end of every Modbus message for error detection and every byte in the message is used to calculate the CRC. The receiving device then also calculates the CRC and compares it to the CRC from the sending device. If even one bit in the message is received incorrectly, the CRC’s will be different resulting in an error. ### Byte and word ordering -The Modbus specification doesn't define exactly how the data is stored in the registers. Therefore, some manufacturers implemented Modbus in their equipment to store and transmit the higher byte first followed by the lower byte. Alternatively, others store and transmit the lower byte first. Similarly, when registers are combined to represent 32-bit data types, some devices store the higher 16 bits (high word) in the first register and the remaining low word in the second while others do the opposite. It doesn't matter which order the bytes or words are sent in, as long as the receiving device knows which way to expect it. - -[1] +The Modbus specification doesn't define exactly how the data is stored in the registers. Therefore, some manufacturers implemented Modbus in their equipment to store and transmit the higher byte first followed by the lower byte. Alternatively, others store and transmit the lower byte first. Similarly, when registers are combined to represent 32-bit data types, some devices store the higher 16 bits (high word) in the first register and the remaining low word in the second while others do the opposite. It doesn't matter which order the bytes or words are sent in, as long as the receiving device knows which way to expect it. ([Schneider Eletric, 2022](https://www.se.com/us/en/faqs/FA168406/#:~:text=What%20is%20byte%20and%20word%20ordering%3F)) ## Use Modbus with Arduino @@ -105,7 +103,7 @@ float readVoltage() { } ``` -You have now learned about Modbus and how it can be used to transmit data in a network. The following section gives an overview of Modbus compatible Arduino boards and the libraries that you can use to enable Modbus protocol capability. Depending on how you use Modbus and what hardware you are using you might need different libraries but the core functionality stays the same. +You have now learned about Modbus and how it can be used to transmit data in a network. The following section gives an overview of Modbus compatible Arduino boards and the libraries that you can use to enable Modbus protocol capability. Depending on how you use Modbus and what hardware you are using you might need different libraries but the core functionality stays the same. ### Modbus compatible Boards - all boards compatible with the [MKR 485 Shield](https://docs.arduino.cc/hardware/mkr-485-shield) and the [MKR ETH Shield](https://docs.arduino.cc/hardware/mkr-eth-shield) @@ -117,8 +115,8 @@ You have now learned about Modbus and how it can be used to transmit data in a n - [ArduinoRS485](https://www.arduino.cc/reference/en/libraries/arduinors485/) - [ArduinoModbus](https://www.arduino.cc/reference/en/libraries/arduinomodbus/) -### References -- [1] https://www.se.com/us/en/faqs/FA168406/ -- [2] https://modbus.org/ -- [3] https://www.csimn.com/CSI_pages/Modbus101.html -- [4] https://en.wikipedia.org/wiki/Modbus \ No newline at end of file +### Read More +- https://www.se.com/us/en/faqs/FA168406/ +- https://modbus.org/ +- https://www.csimn.com/CSI_pages/Modbus101.html +- https://en.wikipedia.org/wiki/Modbus \ No newline at end of file From 2649cf879d832e610a9917cf8303e252b2106b18 Mon Sep 17 00:00:00 2001 From: Hannes Siebeneicher Date: Mon, 28 Nov 2022 13:54:30 +0100 Subject: [PATCH 16/25] changing content --- .../{Modbus Protocol.png => ModbusProtocol.png} | Bin content/learn/05.communication/07.modbus/modbus.md | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) rename content/learn/05.communication/07.modbus/assets/{Modbus Protocol.png => ModbusProtocol.png} (100%) diff --git a/content/learn/05.communication/07.modbus/assets/Modbus Protocol.png b/content/learn/05.communication/07.modbus/assets/ModbusProtocol.png similarity index 100% rename from content/learn/05.communication/07.modbus/assets/Modbus Protocol.png rename to content/learn/05.communication/07.modbus/assets/ModbusProtocol.png diff --git a/content/learn/05.communication/07.modbus/modbus.md b/content/learn/05.communication/07.modbus/modbus.md index c0cf9eac4c..8c2b11dd3a 100644 --- a/content/learn/05.communication/07.modbus/modbus.md +++ b/content/learn/05.communication/07.modbus/modbus.md @@ -13,7 +13,7 @@ Several versions of the Modbus protocol exist for serial port and Ethernet and t On simple interfaces like RS-485 and RS-232, the Modbus messages are sent in plain form over the network and the network will be dedicated to only Modbus communication. However, if your network requires multiple heterogeneous devices using a more versatile system like TCP/IP over ethernet is recommended. In this case, Modbus and other types of mixed protocols can co-exist in the same physical interface at the same time. The main Modbus message structure is peer-to-peer, but it can also function on point-to-point and multidrop networks. As mentioned, the Modbus protocol communicates using a controller-peripheral technique in which only one device can initiate transactions, called queries. -![](assets/Modbus%20Protocol.png) +![](assets/ModbusProtocol.png) ## How does Modbus work? Each Modbus message has the same structure, consisting of four basic elements which are present in each message and the sequence and order of these elements are the same for all messages. This allows for easy parsing of the content. The conversation is always started by the controller and when a message is sent the peripheral interprets the message and responds to it. Modbus sends functions which communicate read and write instructions to the peripheral’s internal memory registers to configure, monitor and control the peripheral’s inputs and outputs. Modbus devices will typically include a register map outlining where the configuration input and output data can be written and read from. You should always refer to the peripheral’s register map of your device to gain a better understanding of its overall operation. @@ -103,7 +103,7 @@ float readVoltage() { } ``` -You have now learned about Modbus and how it can be used to transmit data in a network. The following section gives an overview of Modbus compatible Arduino boards and the libraries that you can use to enable Modbus protocol capability. Depending on how you use Modbus and what hardware you are using you might need different libraries but the core functionality stays the same. +The following section gives an overview of Modbus compatible Arduino boards and the libraries that you can use to enable Modbus protocol capability. Depending on what hardware you are using the libraries might vary, therefore it is important to always check your device specifications. As this article does not cover all types of Modbus implementation but focuses on Modbus RTU the following section also includes some more references to read about the different types of implementation in more detail. ### Modbus compatible Boards - all boards compatible with the [MKR 485 Shield](https://docs.arduino.cc/hardware/mkr-485-shield) and the [MKR ETH Shield](https://docs.arduino.cc/hardware/mkr-eth-shield) From d5d062c4f2efb68d8e0e313fcb516848a87e3884 Mon Sep 17 00:00:00 2001 From: Hannes Siebeneicher Date: Mon, 28 Nov 2022 15:01:28 +0100 Subject: [PATCH 17/25] adding content --- content/learn/05.communication/07.modbus/modbus.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/content/learn/05.communication/07.modbus/modbus.md b/content/learn/05.communication/07.modbus/modbus.md index 8c2b11dd3a..a4f14ff0f0 100644 --- a/content/learn/05.communication/07.modbus/modbus.md +++ b/content/learn/05.communication/07.modbus/modbus.md @@ -119,4 +119,5 @@ The following section gives an overview of Modbus compatible Arduino boards and - https://www.se.com/us/en/faqs/FA168406/ - https://modbus.org/ - https://www.csimn.com/CSI_pages/Modbus101.html -- https://en.wikipedia.org/wiki/Modbus \ No newline at end of file +- https://en.wikipedia.org/wiki/Modbus +- https://docs.arduino.cc/tutorials/mkr-485-shield/mkr-485-communication \ No newline at end of file From a0371c57219bad9716154d09a0fb27e23e01534d Mon Sep 17 00:00:00 2001 From: TaddyHC Date: Mon, 28 Nov 2022 15:59:10 -0600 Subject: [PATCH 18/25] Minor content adjustments --- .../05.communication/07.modbus/modbus.md | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/content/learn/05.communication/07.modbus/modbus.md b/content/learn/05.communication/07.modbus/modbus.md index a4f14ff0f0..14fe00ea12 100644 --- a/content/learn/05.communication/07.modbus/modbus.md +++ b/content/learn/05.communication/07.modbus/modbus.md @@ -7,22 +7,22 @@ author: "Hannes Siebeneicher" ***Controller/peripheral is formerly known as master/slave. Arduino no longer supports the use of this terminology. Devices formerly known as master are referred to as controller and devices formerly known as slaves are referred to as peripheral.*** ## What is Modbus? -Modbus is an open serial communication protocol used for transmitting information over serial lines between electronic devices. It was originally published by Modicon (now Schneider Electric) in 1979. The Modbus protocol is the oldest and by far the most popular automation protocol in the field of process automation. It enables devices, such as energy meters or humidity sensors connected to the same network to communicate the results to a supervisory computer or a Programmable Logic Computer (PLC). +Modbus is an open serial communication protocol used for transmitting information over serial lines between electronic devices. It was originally published by Modicon (now Schneider Electric) in 1979. The Modbus protocol is the oldest and by far the most popular automation protocol in the field of automation process. It enables devices, such as energy meters or humidity sensors connected to the same network to communicate the results to a supervisory computer or a Programmable Logic Computer (PLC). -Several versions of the Modbus protocol exist for serial port and Ethernet and the most common are Modbus RTU, Modbus ASCII, Modbus TPU and Modbus Plus. It is based on a controller-peripheral (formerly known as master-slave) architecture and communication between nodes is achieved with send request and read response type messages. Modbus communicates over several types of physical media such as RS-232/RS-485 or Ethernet. The original Modbus interface ran on RS-232 serial communication but most of the later Modbus implementations use RS-485 because it allows for longer distances, higher speeds and the possibility of multiple devices on a single multi-drop network. The communication over serial RS-485 physical media works with two-wire transmit and receive connections. +Several versions of the Modbus protocol exist such as Modbus RTU, Modbus ASCII, Modbus TCP and Modbus Plus. It is based on a controller-peripheral (formerly known as master-slave) architecture and communication between nodes is achieved with send request and read response type messages. Modbus communicates over several types of physical media such as RS-232/RS-485 or Ethernet. The original Modbus interface ran on RS-232 serial communication but most of the later Modbus implementations use RS-485 because it allows for longer distances, higher speeds and the possibility of multiple devices on a single multi-drop network. The communication over serial RS-485 physical media works with two-wire transmit and receive connections. -On simple interfaces like RS-485 and RS-232, the Modbus messages are sent in plain form over the network and the network will be dedicated to only Modbus communication. However, if your network requires multiple heterogeneous devices using a more versatile system like TCP/IP over ethernet is recommended. In this case, Modbus and other types of mixed protocols can co-exist in the same physical interface at the same time. The main Modbus message structure is peer-to-peer, but it can also function on point-to-point and multidrop networks. As mentioned, the Modbus protocol communicates using a controller-peripheral technique in which only one device can initiate transactions, called queries. +On interfaces like RS-485 and RS-232, the Modbus messages are sent in plain form over the network and the network will be dedicated to only Modbus communication. However, if your network requires multiple heterogeneous devices using a more versatile system, TCP/IP over ethernet based protocol is recommended. In this case, Modbus and other types of mixed protocols can co-exist in the same physical interface at the same time. The main Modbus message structure is peer-to-peer, but it can also function on point-to-point and multidrop networks. As mentioned, the Modbus protocol communicates using a controller-peripheral technique in which only one device can initiate transactions, called queries. ![](assets/ModbusProtocol.png) ## How does Modbus work? -Each Modbus message has the same structure, consisting of four basic elements which are present in each message and the sequence and order of these elements are the same for all messages. This allows for easy parsing of the content. The conversation is always started by the controller and when a message is sent the peripheral interprets the message and responds to it. Modbus sends functions which communicate read and write instructions to the peripheral’s internal memory registers to configure, monitor and control the peripheral’s inputs and outputs. Modbus devices will typically include a register map outlining where the configuration input and output data can be written and read from. You should always refer to the peripheral’s register map of your device to gain a better understanding of its overall operation. +Each Modbus message has the same structure, consisting of four basic elements which are present in each message and the sequence and order of these elements are the same for all messages. This allows for easy content parse. The conversation is always started by the controller and when a message is sent, the peripheral interprets the message and responds to it. Modbus sends functions which communicate read and write instructions to the peripheral’s internal memory registers to configure, monitor and control the peripheral’s inputs and outputs. Modbus devices will typically include a register map outlining where the configuration input and output data can be written and read from. You should always refer to the peripheral’s register map of your device to gain a better understanding of its overall operation. Modbus requests follow a simple structure: ![](assets/requestFrame.png) ### Device Address -Every peripheral device has its own address which it responds to when addressed by the controller, while all other devices ignore the message if the address doesn't match their own. Device addresses are assigned in the range of 1 - 247, but without additional hardware the maximum number of devices should be limited to 32 as data loss is too significant when attaching more devices. +Every peripheral device has its own address which it responds to when addressed by the controller, while all other devices ignore the message if the address doesn't match their own. Device addresses are assigned in the range of 1 - 247, but without additional hardware, the stable number of devices should be limited to 32 as it could cause instability when attaching more devices. ### Function Code The Function code tells the peripheral device if it should read or write data from the internal memory registers. Many of the data types are named from their use in driving relays, for example, a single-bit physical output is called a coil, and a single-bit physical input is called a discrete input or a contact. The following functions are supported by the Modbus poll: @@ -47,13 +47,12 @@ Two bytes are added to the end of every Modbus message for error detection and e ### Byte and word ordering The Modbus specification doesn't define exactly how the data is stored in the registers. Therefore, some manufacturers implemented Modbus in their equipment to store and transmit the higher byte first followed by the lower byte. Alternatively, others store and transmit the lower byte first. Similarly, when registers are combined to represent 32-bit data types, some devices store the higher 16 bits (high word) in the first register and the remaining low word in the second while others do the opposite. It doesn't matter which order the bytes or words are sent in, as long as the receiving device knows which way to expect it. ([Schneider Eletric, 2022](https://www.se.com/us/en/faqs/FA168406/#:~:text=What%20is%20byte%20and%20word%20ordering%3F)) - ## Use Modbus with Arduino -Now that you have learned about the basics and functionalities of Modbus it is time to talk about how you can use your Arduino to establish Modbus communication across devices. You can use your Arduino either as a controller or as a peripheral device depending on the setup. To make your life easier you can use the [Arduino Modbus library](https://www.arduino.cc/reference/en/libraries/arduinomodbus/) which allows you to implement the Modbus protocol over two different types of transport: serial communication over RS485 with RTU or Ethernet and WiFi communication using the TCP protocol. Because the Modbus library is dependent on the [RS-485 library](https://www.arduino.cc/reference/en/libraries/arduinors485/) you must include both of them in your code. +Now that you have learned about the basics and functionalities of Modbus, it is time to talk about how you can use your Arduino to establish Modbus communication across devices. You can use your Arduino either as a controller or as a peripheral device depending on the setup. To make your life easier you can use the [Arduino Modbus library](https://www.arduino.cc/reference/en/libraries/arduinomodbus/) which allows you to implement the Modbus protocol over two different types of transport: serial communication over RS485 with RTU or Ethernet and WiFi communication using the TCP protocol. Because the Modbus library is dependent on the [RS-485 library](https://www.arduino.cc/reference/en/libraries/arduinors485/), you must include both of them in your code. -A lot of Arduino boards are Modbus compatible especially if you consider Ethernet-type messages but if you want to communicate via RS485 there is the [MKR 485 Shields](https://store-usa.arduino.cc/products/arduino-mkr-485-shield) which can convert any MKR board into a Modbus compatible device. Check out [this Tutorial](https://docs.arduino.cc/tutorials/mkr-485-shield/mkr-485-communication) to learn more about sending data between two [MKR 485 Shields](https://store-usa.arduino.cc/products/arduino-mkr-485-shield). +A lot of Arduino boards are Modbus compatible especially if you consider Ethernet-type messages. In case if you want to communicate via RS485, [MKR 485 Shields](https://store-usa.arduino.cc/products/arduino-mkr-485-shield) will help you convert any MKR board into a Modbus compatible device. Check out [this Tutorial](https://docs.arduino.cc/tutorials/mkr-485-shield/mkr-485-communication) to learn more about sending data between two [MKR 485 Shields](https://store-usa.arduino.cc/products/arduino-mkr-485-shield). -When using the [Modbus library](https://www.arduino.cc/reference/en/libraries/arduinomodbus/) sending messages is fairly straightforward as you can see in the examplary request format function below: +When using the [Modbus library](https://www.arduino.cc/reference/en/libraries/arduinomodbus/), sending messages is fairly straightforward as you can see in the examplary request format function below: | Device Address | Function Code | Starting Register | Register Count | | ----------- | ----------- | ----------- | ----------- | @@ -72,7 +71,7 @@ Take a look at the request frame inside the Finder documentation: We can see that the device address is 21 (or 0x21). -The function code states 04 which we know stands for INPUT REGISTERS ([see Function Code](#function-code)). +The function code states 04 which we know that it stands for INPUT REGISTERS ([see Function Code](#function-code)). The starting register is 00 6B (or 0x6B) but for the Modbus library to work we need to change it from hexadecimal to decimal. In this example, the starting register is stated as hexadecimal but if we scroll down further in the documentation we can see that the registers are written in decimals: @@ -103,7 +102,9 @@ float readVoltage() { } ``` -The following section gives an overview of Modbus compatible Arduino boards and the libraries that you can use to enable Modbus protocol capability. Depending on what hardware you are using the libraries might vary, therefore it is important to always check your device specifications. As this article does not cover all types of Modbus implementation but focuses on Modbus RTU the following section also includes some more references to read about the different types of implementation in more detail. +Using the `readVoltage()` functions, defined within given parameters we discussed, it will retrieve the voltage measurement from the Finder energy meter device. + +The following section gives an overview of Modbus compatible Arduino boards and the libraries that you can use to enable Modbus protocol capability. Depending on the hardware you use, the libraries might vary, therefore it is important to always check your device specifications. As this article does not cover all types of Modbus implementation as it focuses on Modbus RTU. The following section also includes some more references to read about the different types of implementation in more detail. ### Modbus compatible Boards - all boards compatible with the [MKR 485 Shield](https://docs.arduino.cc/hardware/mkr-485-shield) and the [MKR ETH Shield](https://docs.arduino.cc/hardware/mkr-eth-shield) From 4cbeda6b75288400eb5e8bbb2bf954276ef2b9eb Mon Sep 17 00:00:00 2001 From: TaddyHC Date: Mon, 28 Nov 2022 16:24:17 -0600 Subject: [PATCH 19/25] Minor fix --- content/learn/05.communication/07.modbus/modbus.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/learn/05.communication/07.modbus/modbus.md b/content/learn/05.communication/07.modbus/modbus.md index 14fe00ea12..545273f8bf 100644 --- a/content/learn/05.communication/07.modbus/modbus.md +++ b/content/learn/05.communication/07.modbus/modbus.md @@ -69,7 +69,7 @@ Take a look at the request frame inside the Finder documentation: ![](assets/finderRequestFrame.png) -We can see that the device address is 21 (or 0x21). +We can see that the device address is 33 (or 0x21). The function code states 04 which we know that it stands for INPUT REGISTERS ([see Function Code](#function-code)). From 4648adce689d09f3543c6a1d76f01cf38aec6dd3 Mon Sep 17 00:00:00 2001 From: Hannes Siebeneicher Date: Tue, 29 Nov 2022 13:58:10 +0100 Subject: [PATCH 20/25] minor changes --- .../learn/05.communication/07.modbus/modbus.md | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/content/learn/05.communication/07.modbus/modbus.md b/content/learn/05.communication/07.modbus/modbus.md index 545273f8bf..f65e545515 100644 --- a/content/learn/05.communication/07.modbus/modbus.md +++ b/content/learn/05.communication/07.modbus/modbus.md @@ -11,18 +11,18 @@ Modbus is an open serial communication protocol used for transmitting informatio Several versions of the Modbus protocol exist such as Modbus RTU, Modbus ASCII, Modbus TCP and Modbus Plus. It is based on a controller-peripheral (formerly known as master-slave) architecture and communication between nodes is achieved with send request and read response type messages. Modbus communicates over several types of physical media such as RS-232/RS-485 or Ethernet. The original Modbus interface ran on RS-232 serial communication but most of the later Modbus implementations use RS-485 because it allows for longer distances, higher speeds and the possibility of multiple devices on a single multi-drop network. The communication over serial RS-485 physical media works with two-wire transmit and receive connections. -On interfaces like RS-485 and RS-232, the Modbus messages are sent in plain form over the network and the network will be dedicated to only Modbus communication. However, if your network requires multiple heterogeneous devices using a more versatile system, TCP/IP over ethernet based protocol is recommended. In this case, Modbus and other types of mixed protocols can co-exist in the same physical interface at the same time. The main Modbus message structure is peer-to-peer, but it can also function on point-to-point and multidrop networks. As mentioned, the Modbus protocol communicates using a controller-peripheral technique in which only one device can initiate transactions, called queries. +On interfaces like RS-485 and RS-232, the Modbus messages are sent in plain form over the network and the network will be dedicated to only Modbus communication. However, if your network requires multiple heterogeneous devices, TCP/IP over Ethernet based protocol is recommended. In this case, Modbus and other types of mixed protocols can co-exist in the same physical interface at the same time. The main Modbus message structure is peer-to-peer, but it can also function on point-to-point and multidrop networks. As mentioned, the Modbus protocol communicates using a controller-peripheral technique in which only one device can initiate transactions, called queries. ![](assets/ModbusProtocol.png) ## How does Modbus work? -Each Modbus message has the same structure, consisting of four basic elements which are present in each message and the sequence and order of these elements are the same for all messages. This allows for easy content parse. The conversation is always started by the controller and when a message is sent, the peripheral interprets the message and responds to it. Modbus sends functions which communicate read and write instructions to the peripheral’s internal memory registers to configure, monitor and control the peripheral’s inputs and outputs. Modbus devices will typically include a register map outlining where the configuration input and output data can be written and read from. You should always refer to the peripheral’s register map of your device to gain a better understanding of its overall operation. +Each Modbus message has the same structure, consisting of four basic elements which are present in each message. The sequence and order of these elements are the same for all messages. This allows for easy content parse. The conversation is always started by the controller and when a message is sent, the peripheral interprets the message and responds to it. Modbus sends functions which communicate read and write instructions to the peripheral’s internal memory registers to configure, monitor and control the peripheral’s inputs and outputs. Modbus devices will typically include a register map outlining where the configuration input and output data can be written and read from. You should always refer to the peripheral’s register map of your device to gain a better understanding of its overall operation. Modbus requests follow a simple structure: ![](assets/requestFrame.png) ### Device Address -Every peripheral device has its own address which it responds to when addressed by the controller, while all other devices ignore the message if the address doesn't match their own. Device addresses are assigned in the range of 1 - 247, but without additional hardware, the stable number of devices should be limited to 32 as it could cause instability when attaching more devices. +Every peripheral device has its own address which it responds to when addressed by the controller. All other devices ignore the message if the address doesn't match their own. Device addresses are assigned in the range of 1 - 247, but without additional hardware, the stable number of devices should be limited to 32 as it could cause instability when attaching more devices. ### Function Code The Function code tells the peripheral device if it should read or write data from the internal memory registers. Many of the data types are named from their use in driving relays, for example, a single-bit physical output is called a coil, and a single-bit physical input is called a discrete input or a contact. The following functions are supported by the Modbus poll: @@ -40,7 +40,7 @@ The Function code tells the peripheral device if it should read or write data fr The data field contains the requested or send data. In the request form used by the Arduino Modbus library, the data field requires you to enter the starting registers and register count. ### CRC Error Check -CRC stands for Cyclic Redundancy check and is an error detecting code commonly used in digital networks to detect accidental changes in digital data. CRC’s have their name because the check (data verification) value is a redundancy (it expands the message without adding information) and the algorithm is based on [cyclic codes](https://en.wikipedia.org/wiki/Cyclic_code#:~:text=In%20coding%20theory%2C%20a%20cyclic,efficient%20error%20detection%20and%20correction.). They are simple to implement in binary hardware, easy to analyze mathematically, and particularly good at detecting common errors caused by noise in transmission channels. +CRC stands for Cyclic Redundancy check and is an error detecting code commonly used in digital networks to detect accidental changes in digital data. CRC’s have their name because the check (data verification) value is a redundancy (it expands the message without adding information) and the algorithm is based on [cyclic codes](https://en.wikipedia.org/wiki/Cyclic_code#:~:text=In%20coding%20theory%2C%20a%20cyclic,efficient%20error%20detection%20and%20correction.). They are simple to implement in binary hardware, easy to analyse mathematically, and particularly good at detecting common errors caused by noise in transmission channels. Two bytes are added to the end of every Modbus message for error detection and every byte in the message is used to calculate the CRC. The receiving device then also calculates the CRC and compares it to the CRC from the sending device. If even one bit in the message is received incorrectly, the CRC’s will be different resulting in an error. @@ -50,7 +50,7 @@ The Modbus specification doesn't define exactly how the data is stored in the re ## Use Modbus with Arduino Now that you have learned about the basics and functionalities of Modbus, it is time to talk about how you can use your Arduino to establish Modbus communication across devices. You can use your Arduino either as a controller or as a peripheral device depending on the setup. To make your life easier you can use the [Arduino Modbus library](https://www.arduino.cc/reference/en/libraries/arduinomodbus/) which allows you to implement the Modbus protocol over two different types of transport: serial communication over RS485 with RTU or Ethernet and WiFi communication using the TCP protocol. Because the Modbus library is dependent on the [RS-485 library](https://www.arduino.cc/reference/en/libraries/arduinors485/), you must include both of them in your code. -A lot of Arduino boards are Modbus compatible especially if you consider Ethernet-type messages. In case if you want to communicate via RS485, [MKR 485 Shields](https://store-usa.arduino.cc/products/arduino-mkr-485-shield) will help you convert any MKR board into a Modbus compatible device. Check out [this Tutorial](https://docs.arduino.cc/tutorials/mkr-485-shield/mkr-485-communication) to learn more about sending data between two [MKR 485 Shields](https://store-usa.arduino.cc/products/arduino-mkr-485-shield). +A lot of Arduino boards are Modbus compatible especially if you consider Ethernet-type messages. In case you want to communicate via RS485, [MKR 485 Shields](https://store-usa.arduino.cc/products/arduino-mkr-485-shield) will help you convert any MKR board into a Modbus compatible device. Check out [this tutorial](https://docs.arduino.cc/tutorials/mkr-485-shield/mkr-485-communication) to learn more about sending data between two [MKR 485 Shields](https://store-usa.arduino.cc/products/arduino-mkr-485-shield). When using the [Modbus library](https://www.arduino.cc/reference/en/libraries/arduinomodbus/), sending messages is fairly straightforward as you can see in the examplary request format function below: @@ -80,7 +80,7 @@ In this example, the starting register is stated as hexadecimal but if we scroll We can also see that the register for U1 takes up 30107 and 30108 which means that the register count is 2. -With all this information we can now use the function requestFrom() inside the readVoltage() function: +Using the `readVoltage()` function, defined within the parameters we discussed, will retrieve the voltage measurement from the Finder energy meter. Inside you can see how the `requestFrom()` is being called with `Device Address`, `Function Code`, `Starting Register` and `Register Count` as parameters. ``` float readVoltage() { @@ -102,9 +102,7 @@ float readVoltage() { } ``` -Using the `readVoltage()` functions, defined within given parameters we discussed, it will retrieve the voltage measurement from the Finder energy meter device. - -The following section gives an overview of Modbus compatible Arduino boards and the libraries that you can use to enable Modbus protocol capability. Depending on the hardware you use, the libraries might vary, therefore it is important to always check your device specifications. As this article does not cover all types of Modbus implementation as it focuses on Modbus RTU. The following section also includes some more references to read about the different types of implementation in more detail. +The following section gives an overview of Modbus compatible Arduino boards and the libraries that you can use to enable Modbus protocol capability. Depending on the hardware you are using, the libraries might vary, therefore it is important to always check your device specifications. As this article does not cover all types of Modbus implementation and mostly focuses on Modbus RTU, the following section includes more references to read about the different types of implementation in more detail. ### Modbus compatible Boards - all boards compatible with the [MKR 485 Shield](https://docs.arduino.cc/hardware/mkr-485-shield) and the [MKR ETH Shield](https://docs.arduino.cc/hardware/mkr-eth-shield) From aeef9ac86b24e76af7660ee9468003ba0037370e Mon Sep 17 00:00:00 2001 From: Hannes Siebeneicher Date: Tue, 29 Nov 2022 15:07:20 +0100 Subject: [PATCH 21/25] minor changes --- content/learn/05.communication/07.modbus/modbus.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/content/learn/05.communication/07.modbus/modbus.md b/content/learn/05.communication/07.modbus/modbus.md index f65e545515..fb566d4956 100644 --- a/content/learn/05.communication/07.modbus/modbus.md +++ b/content/learn/05.communication/07.modbus/modbus.md @@ -80,7 +80,9 @@ In this example, the starting register is stated as hexadecimal but if we scroll We can also see that the register for U1 takes up 30107 and 30108 which means that the register count is 2. -Using the `readVoltage()` function, defined within the parameters we discussed, will retrieve the voltage measurement from the Finder energy meter. Inside you can see how the `requestFrom()` is being called with `Device Address`, `Function Code`, `Starting Register` and `Register Count` as parameters. +Using the `readVoltage()` function, defined within the parameters we discussed, will retrieve the voltage measurement from the Finder energy meter. + +Inside you can see how the `requestFrom()` is being called with *Device Address*, *Function Code*, *Starting Register* and *Register Count* as parameters. ``` float readVoltage() { From 67361bf486235f64d78da50dea35b6b8d9dd6383 Mon Sep 17 00:00:00 2001 From: Hannes Siebeneicher <60609597+Hannes7eicher@users.noreply.github.com> Date: Tue, 29 Nov 2022 16:21:11 +0100 Subject: [PATCH 22/25] Update content/learn/05.communication/07.modbus/modbus.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Karl Söderby <35461661+karlsoderby@users.noreply.github.com> --- content/learn/05.communication/07.modbus/modbus.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/learn/05.communication/07.modbus/modbus.md b/content/learn/05.communication/07.modbus/modbus.md index fb566d4956..4993884c94 100644 --- a/content/learn/05.communication/07.modbus/modbus.md +++ b/content/learn/05.communication/07.modbus/modbus.md @@ -106,7 +106,7 @@ float readVoltage() { The following section gives an overview of Modbus compatible Arduino boards and the libraries that you can use to enable Modbus protocol capability. Depending on the hardware you are using, the libraries might vary, therefore it is important to always check your device specifications. As this article does not cover all types of Modbus implementation and mostly focuses on Modbus RTU, the following section includes more references to read about the different types of implementation in more detail. -### Modbus compatible Boards +### Modbus Compatible Hardware - all boards compatible with the [MKR 485 Shield](https://docs.arduino.cc/hardware/mkr-485-shield) and the [MKR ETH Shield](https://docs.arduino.cc/hardware/mkr-eth-shield) - all boards compatible with the [Ethernet Shield Rev2](https://docs.arduino.cc/hardware/ethernet-shield-rev2) - [Portenta Machine Control](https://docs.arduino.cc/hardware/portenta-machine-control) From 8702c4abf3cb021567a5f6f1b88c163d92bd3895 Mon Sep 17 00:00:00 2001 From: Hannes Siebeneicher <60609597+Hannes7eicher@users.noreply.github.com> Date: Tue, 29 Nov 2022 16:21:32 +0100 Subject: [PATCH 23/25] Update content/learn/05.communication/07.modbus/modbus.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Karl Söderby <35461661+karlsoderby@users.noreply.github.com> --- content/learn/05.communication/07.modbus/modbus.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/learn/05.communication/07.modbus/modbus.md b/content/learn/05.communication/07.modbus/modbus.md index 4993884c94..1c9285c559 100644 --- a/content/learn/05.communication/07.modbus/modbus.md +++ b/content/learn/05.communication/07.modbus/modbus.md @@ -1,5 +1,5 @@ --- -title: "Modbus" +title: "Arduino & Modbus Protocol" description: "Modbus is an open serial communication protocol used for transmitting information over serial lines between electronic devices." author: "Hannes Siebeneicher" --- From fc7740dd309368c3876e5d691f30c04909e453f5 Mon Sep 17 00:00:00 2001 From: Hannes Siebeneicher Date: Tue, 29 Nov 2022 16:29:14 +0100 Subject: [PATCH 24/25] changing structure --- .../05.communication/07.modbus/modbus.md | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/content/learn/05.communication/07.modbus/modbus.md b/content/learn/05.communication/07.modbus/modbus.md index 1c9285c559..4bc7b65a63 100644 --- a/content/learn/05.communication/07.modbus/modbus.md +++ b/content/learn/05.communication/07.modbus/modbus.md @@ -4,6 +4,18 @@ description: "Modbus is an open serial communication protocol used for transmitt author: "Hannes Siebeneicher" --- +This article contains information about the Modbus serial communication protocol and how it can be used together with Arduino hardware. The different elements are highlighted and compatible libraries and boards are shown together with code examples. The following section gives an overview of Modbus compatible Arduino boards and the libraries that you can use to enable Modbus protocol capability. Depending on the hardware you are using, the libraries might vary, therefore it is important to always check your device specifications. + +### Modbus Compatible Hardware +- all boards compatible with the [MKR 485 Shield](https://docs.arduino.cc/hardware/mkr-485-shield) and the [MKR ETH Shield](https://docs.arduino.cc/hardware/mkr-eth-shield) +- all boards compatible with the [Ethernet Shield Rev2](https://docs.arduino.cc/hardware/ethernet-shield-rev2) +- [Portenta Machine Control](https://docs.arduino.cc/hardware/portenta-machine-control) +- [Max Carrier](https://docs.arduino.cc/hardware/portenta-max-carrier) + +### Libraries +- [ArduinoRS485](https://www.arduino.cc/reference/en/libraries/arduinors485/) +- [ArduinoModbus](https://www.arduino.cc/reference/en/libraries/arduinomodbus/) + ***Controller/peripheral is formerly known as master/slave. Arduino no longer supports the use of this terminology. Devices formerly known as master are referred to as controller and devices formerly known as slaves are referred to as peripheral.*** ## What is Modbus? @@ -104,17 +116,7 @@ float readVoltage() { } ``` -The following section gives an overview of Modbus compatible Arduino boards and the libraries that you can use to enable Modbus protocol capability. Depending on the hardware you are using, the libraries might vary, therefore it is important to always check your device specifications. As this article does not cover all types of Modbus implementation and mostly focuses on Modbus RTU, the following section includes more references to read about the different types of implementation in more detail. - -### Modbus Compatible Hardware -- all boards compatible with the [MKR 485 Shield](https://docs.arduino.cc/hardware/mkr-485-shield) and the [MKR ETH Shield](https://docs.arduino.cc/hardware/mkr-eth-shield) -- all boards compatible with the [Ethernet Shield Rev2](https://docs.arduino.cc/hardware/ethernet-shield-rev2) -- [Portenta Machine Control](https://docs.arduino.cc/hardware/portenta-machine-control) -- [Max Carrier](https://docs.arduino.cc/hardware/portenta-max-carrier) - -### Libraries -- [ArduinoRS485](https://www.arduino.cc/reference/en/libraries/arduinors485/) -- [ArduinoModbus](https://www.arduino.cc/reference/en/libraries/arduinomodbus/) +As this article does not cover all types of Modbus implementation and mostly focuses on Modbus RTU, the following section includes more references to read about the different types of implementation in more detail. ### Read More - https://www.se.com/us/en/faqs/FA168406/ From f2552b559fb008dcea9b04d7b54453288c499d39 Mon Sep 17 00:00:00 2001 From: Hannes Siebeneicher Date: Tue, 29 Nov 2022 16:55:39 +0100 Subject: [PATCH 25/25] minor changes --- content/learn/05.communication/07.modbus/modbus.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/learn/05.communication/07.modbus/modbus.md b/content/learn/05.communication/07.modbus/modbus.md index 4bc7b65a63..1ce09847de 100644 --- a/content/learn/05.communication/07.modbus/modbus.md +++ b/content/learn/05.communication/07.modbus/modbus.md @@ -6,7 +6,7 @@ author: "Hannes Siebeneicher" This article contains information about the Modbus serial communication protocol and how it can be used together with Arduino hardware. The different elements are highlighted and compatible libraries and boards are shown together with code examples. The following section gives an overview of Modbus compatible Arduino boards and the libraries that you can use to enable Modbus protocol capability. Depending on the hardware you are using, the libraries might vary, therefore it is important to always check your device specifications. -### Modbus Compatible Hardware +### Modbus compatible hardware - all boards compatible with the [MKR 485 Shield](https://docs.arduino.cc/hardware/mkr-485-shield) and the [MKR ETH Shield](https://docs.arduino.cc/hardware/mkr-eth-shield) - all boards compatible with the [Ethernet Shield Rev2](https://docs.arduino.cc/hardware/ethernet-shield-rev2) - [Portenta Machine Control](https://docs.arduino.cc/hardware/portenta-machine-control) @@ -118,7 +118,7 @@ float readVoltage() { As this article does not cover all types of Modbus implementation and mostly focuses on Modbus RTU, the following section includes more references to read about the different types of implementation in more detail. -### Read More +### Read more - https://www.se.com/us/en/faqs/FA168406/ - https://modbus.org/ - https://www.csimn.com/CSI_pages/Modbus101.html