@@ -33,15 +33,15 @@ def setUpClass(cls):
3333        cls .mbs .start ()
3434
3535        cls .log .debug ("3. run mbusd to be tested with the binary:%s"  %  MBUSD_BINARY )
36-         cls .mbusd_main  =  Popen ([MBUSD_BINARY , "-d" , "-L" , "-v9" , "-p/tmp/pts0" , "-s19200" , "-P"  +  str (MBUSD_PORT )],
36+         cls .mbusd_main  =  Popen ([MBUSD_BINARY , "-d" , "-L/tmp/mbusd.log " , "-v9" , "-p/tmp/pts0" , "-s19200" , "-P"  +  str (MBUSD_PORT )],
3737                               stdout = PIPE , stderr = STDOUT )
3838        # wait a little bit for mbusd to come up 
3939        # alternatively do a poll for the socket 
4040        #    https://stackoverflow.com/questions/667640/how-to-tell-if-a-connection-is-dead-in-python/667702#667702 
4141        sleep (5 )
4242
4343        cls .log .debug ("4. connect the modbus TCP client to mbusd" )
44-         cls .client  =  ModbusTcpClient ('127.0.0.1' , port = MBUSD_PORT )
44+         cls .client  =  ModbusTcpClient ('127.0.0.1' , port = MBUSD_PORT ,  broadcast_enable = True )
4545        cls .client .connect ()
4646
4747    @classmethod  
@@ -62,68 +62,78 @@ def test_coils(self):
6262        bits  =  [random .randrange (2 )> 0  for  i  in  range (8 )]
6363
6464        # 15 Write Multiple Coils 
65-         result  =  self .client .write_coils (0 , bits )
65+         result  =  self .client .write_coils (0 , bits ,  unit = 1 )
6666        self .assertIsInstance (result , WriteMultipleCoilsResponse , result )
6767        self .assertEqual (result .address , 0 , result )
6868        self .assertEqual (result .count , 8 , result )
6969
7070        # 01 Read Coils 
71-         result  =  self .client .read_coils (0 , 8 )
71+         result  =  self .client .read_coils (0 , 8 ,  unit = 1 )
7272        self .assertIsInstance (result , ReadCoilsResponse , result )
7373        self .assertEqual (result .bits , bits , result )
7474
7575        # 05 Write Single Coil 
7676        bit1  =  not  bits [0 ]
77-         result  =  self .client .write_coil (0 , bit1 )
77+         result  =  self .client .write_coil (0 , bit1 ,  unit = 1 )
7878        self .assertIsInstance (result , WriteSingleCoilResponse , result )
7979        self .assertEqual (result .address , 0 , result )
8080        self .assertEqual (result .value , bit1 , result )
81-         result  =  self .client .read_coils (0 , 1 )
81+         result  =  self .client .read_coils (0 , 1 ,  unit = 1 )
8282        self .assertIsInstance (result , ReadCoilsResponse , result )
8383        self .assertEqual (result .bits [0 ], bit1 , result )
8484
8585    def  test_discreteInputs (self ):
8686        # 02 Read Discrete Inputs 
87-         result  =  self .client .read_discrete_inputs (0 , 8 )
87+         result  =  self .client .read_discrete_inputs (0 , 8 ,  unit = 1 )
8888        self .assertIsInstance (result , ReadDiscreteInputsResponse , result )
8989        self .assertEqual (result .bits , [True ]* 8 , result )
9090
9191    def  test_inputRegisters (self ):
9292        # 04 Read Input Registers 
93-         result  =  self .client .read_input_registers (0 , 8 )
93+         result  =  self .client .read_input_registers (0 , 8 ,  unit = 1 )
9494        self .assertIsInstance (result , ReadInputRegistersResponse , result )
9595        self .assertEqual (result .registers , list (range (8 )), result )
9696
9797    def  test_holdingRegisters (self ):
9898        registers  =  [random .randrange (8 ) for  i  in  range (8 )]
9999
100100        # 16 Write Multiple Holding Registers 
101-         result  =  self .client .write_registers (0 , registers )
101+         result  =  self .client .write_registers (0 , registers ,  unit = 1 )
102102        self .assertIsInstance (result , WriteMultipleRegistersResponse , result )
103103        self .assertEqual (result .address , 0 , result )
104104        self .assertEqual (result .count , 8 , result )
105105
106106        # 03 Read Multiple Holding Registers 
107-         result  =  self .client .read_holding_registers (0 , 8 )
107+         result  =  self .client .read_holding_registers (0 , 8 ,  unit = 1 )
108108        self .assertIsInstance (result , ReadHoldingRegistersResponse , result )
109109        self .assertEqual (result .registers , registers , result )
110110
111111        # 06 Write Single Holding Register 
112112        register1  =  (registers [0 ] +  1 ) %  65535 
113-         result  =  self .client .write_register (0 , register1 )
113+         result  =  self .client .write_register (0 , register1 ,  unit = 1 )
114114        self .assertIsInstance (result , WriteSingleRegisterResponse , result )
115115        self .assertEqual (result .address , 0 , result )
116116        self .assertEqual (result .value , register1 , result )
117-         result  =  self .client .read_holding_registers (0 , 1 )
117+         result  =  self .client .read_holding_registers (0 , 1 ,  unit = 1 )
118118        self .assertIsInstance (result , ReadHoldingRegistersResponse , result )
119119        self .assertEqual (result .registers [0 ], register1 , result )
120120
121121    def  test_exception (self ):
122-         result  =  self .client .write_coil (1000 , False ) # invalid address 1000 
122+         result  =  self .client .write_coil (1000 , False ,  unit = 1 ) # invalid address 1000 
123123        self .assertIsInstance (result , ExceptionResponse , result )
124124        self .assertEqual (result .original_code , 5 , result ) # fc05 Write Single Coil 
125125        self .assertEqual (result .exception_code , 2 , result ) # Illegal Data Address 
126126
127+     def  test_broadcast (self ):
128+         registers  =  [random .randrange (8 ) for  i  in  range (8 )]
129+         # 16 Write Multiple Holding Registers 
130+         result  =  self .client .write_registers (0 , registers , unit = 0 )
131+ 
132+         # 03 Read Multiple Holding Registers 
133+         result  =  self .client .read_holding_registers (0 , 8 , unit = 1 )
134+         self .assertIsInstance (result , ReadHoldingRegistersResponse , result )
135+         self .assertEqual (result .registers , registers , result )
136+ 
127137if  __name__  ==  '__main__' :
128138    stdout_handler  =  logging .StreamHandler (sys .stdout )
129139    logging .basicConfig (level = logging .DEBUG ,
0 commit comments