1010from pymodbus .payload import BinaryPayloadBuilder
1111from pymodbus .client .sync import ModbusTcpClient as ModbusClient
1212from pymodbus .compat import iteritems
13+ from collections import OrderedDict
1314
1415# --------------------------------------------------------------------------- #
1516# configure the client logging
1617# --------------------------------------------------------------------------- #
18+
1719import logging
18- logging .basicConfig ()
20+ FORMAT = ('%(asctime)-15s %(threadName)-15s'
21+ ' %(levelname)-8s %(module)-15s:%(lineno)-8s %(message)s' )
22+ logging .basicConfig (format = FORMAT )
1923log = logging .getLogger ()
20- log .setLevel (logging .INFO )
24+ log .setLevel (logging .DEBUG )
2125
2226
2327def run_binary_payload_ex ():
2428 # ----------------------------------------------------------------------- #
2529 # We are going to use a simple client to send our requests
2630 # ----------------------------------------------------------------------- #
27- client = ModbusClient ('127.0.0.1' , port = 5440 )
31+ client = ModbusClient ('127.0.0.1' , port = 5020 )
2832 client .connect ()
2933
3034 # ----------------------------------------------------------------------- #
@@ -67,19 +71,36 @@ def run_binary_payload_ex():
6771 # +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ #
6872
6973 # ----------------------------------------------------------------------- #
70- builder = BinaryPayloadBuilder (byteorder = Endian .Little ,
71- wordorder = Endian .Big )
74+ builder = BinaryPayloadBuilder (byteorder = Endian .Big ,
75+ wordorder = Endian .Little )
7276 builder .add_string ('abcdefgh' )
73- builder .add_32bit_float (22.34 )
74- builder .add_16bit_uint (0x1234 )
75- builder .add_16bit_uint (0x5678 )
76- builder .add_8bit_int (0x12 )
7777 builder .add_bits ([0 , 1 , 0 , 1 , 1 , 0 , 1 , 0 ])
78- builder .add_32bit_uint (0x12345678 )
78+ builder .add_8bit_int (- 0x12 )
79+ builder .add_8bit_uint (0x12 )
80+ builder .add_16bit_int (- 0x5678 )
81+ builder .add_16bit_uint (0x1234 )
7982 builder .add_32bit_int (- 0x1234 )
80- builder .add_64bit_int (0x1234567890ABCDEF )
83+ builder .add_32bit_uint (0x12345678 )
84+ builder .add_32bit_float (22.34 )
85+ builder .add_32bit_float (- 22.34 )
86+ builder .add_64bit_int (- 0xDEADBEEF )
87+ builder .add_64bit_uint (0x12345678DEADBEEF )
88+ builder .add_64bit_uint (0x12345678DEADBEEF )
89+ builder .add_64bit_float (123.45 )
90+ builder .add_64bit_float (- 123.45 )
91+ payload = builder .to_registers ()
92+ print ("-" * 60 )
93+ print ("Writing Registers" )
94+ print ("-" * 60 )
95+ print (payload )
96+ print ("\n " )
8197 payload = builder .build ()
8298 address = 0
99+ # Can write registers
100+ # registers = builder.to_registers()
101+ # client.write_registers(address, registers, unit=1)
102+
103+ # Or can write encoded binary string
83104 client .write_registers (address , payload , skip_encode = True , unit = 1 )
84105 # ----------------------------------------------------------------------- #
85106 # If you need to decode a collection of registers in a weird layout, the
@@ -95,7 +116,7 @@ def run_binary_payload_ex():
95116 # - an 8 bit int 0x12
96117 # - an 8 bit bitstring [0,1,0,1,1,0,1,0]
97118 # ----------------------------------------------------------------------- #
98- address = 0x00
119+ address = 0x0
99120 count = len (payload )
100121 result = client .read_holding_registers (address , count , unit = 1 )
101122 print ("-" * 60 )
@@ -105,19 +126,26 @@ def run_binary_payload_ex():
105126 print ("\n " )
106127 decoder = BinaryPayloadDecoder .fromRegisters (result .registers ,
107128 byteorder = Endian .Little ,
108- wordorder = Endian .Big )
109- decoded = {
110- 'string' : decoder .decode_string (8 ),
111- 'float' : decoder .decode_32bit_float (),
112- '16uint' : decoder .decode_16bit_uint (),
113- 'ignored' : decoder .skip_bytes (2 ),
114- '8int' : decoder .decode_8bit_int (),
115- 'bits' : decoder .decode_bits (),
116- "32uints" : decoder .decode_32bit_uint (),
117- "32ints" : decoder .decode_32bit_int (),
118- "64ints" : decoder .decode_64bit_int (),
119- }
120-
129+ wordorder = Endian .Little )
130+
131+ decoded = OrderedDict ([
132+ ('string' , decoder .decode_string (8 )),
133+ ('bits' , decoder .decode_bits ()),
134+ ('8int' , decoder .decode_8bit_int ()),
135+ ('8uint' , decoder .decode_8bit_uint ()),
136+ ('16int' , decoder .decode_16bit_int ()),
137+ ('16uint' , decoder .decode_16bit_uint ()),
138+ ('32int' , decoder .decode_32bit_int ()),
139+ ('32uint' , decoder .decode_32bit_uint ()),
140+ ('32float' , decoder .decode_32bit_float ()),
141+ ('32float2' , decoder .decode_32bit_float ()),
142+ ('64int' , decoder .decode_64bit_int ()),
143+ ('64uint' , decoder .decode_64bit_uint ()),
144+ ('ignore' , decoder .skip_bytes (8 )),
145+ ('64float' , decoder .decode_64bit_float ()),
146+ ('64float2' , decoder .decode_64bit_float ()),
147+ ])
148+
121149 print ("-" * 60 )
122150 print ("Decoded Data" )
123151 print ("-" * 60 )
0 commit comments