ljean / modbus-tk

Create Modbus app easily with Python
Other
568 stars 213 forks source link

WRITE_MULTIPLE_COILS fails #74

Closed kr2 closed 7 years ago

kr2 commented 7 years ago

The follwoing fails:

import modbus_tk.defines as cst
from modbus_tk import modbus_tcp

import platform
import sys
print(sys.version)
print(platform.platform())

ip = 'localhost'
port = 50502
slave_addr = 1
slave_block_name = '0'

# Slave
server = modbus_tcp.TcpServer(port=port, address=ip, timeout_in_sec=10)
server.start()
slave = server.add_slave(slave_addr)
slave.add_block(slave_block_name, cst.COILS, 0, 10)

# Master
master = modbus_tcp.TcpMaster(host=ip, port=port)
try:
    master.execute(slave_addr, cst.WRITE_MULTIPLE_COILS, 5, output_value=[0, 0])
finally:
    master.close()
    server.stop()

Added follwoing debug prints to "modbus.py"

545             fmt = "B" if self.unsigned else "b"
546             print(fmt)
547             print(request_pdu[6+i])
548             print(type(request_pdu))
549             print(type(request_pdu[6+i]))
550             (byte_vailue, ) = struct.unpack(">"+fmt,request_pdu[6+i])

Output is

smarthome@ServerAllgemein:~$ python3 ./bin/modbustkbug.py
3.5.2 (default, Nov 17 2016, 17:05:23)
[GCC 5.4.0 20160609]
Linux-4.4.0-57-generic-x86_64-with-Ubuntu-16.04-xenial
B
0
<class 'bytearray'>
<class 'int'>
  File "/usr/local/lib/python3.5/dist-packages/modbus_tk/modbus.py", line 815, in handle_request
    response_pdu = slave.handle_request(request_pdu)
  File "/usr/local/lib/python3.5/dist-packages/modbus_tk/modbus.py", line 620, in handle_request
    response_pdu = self._fn_code_map[function_code](request_pdu)
  File "/usr/local/lib/python3.5/dist-packages/modbus_tk/modbus.py", line 550, in _write_multiple_coils
    (byte_vailue, ) = struct.unpack(">"+fmt,request_pdu[6+i])
handle request failed: a bytes-like object is required, not 'int'
Traceback (most recent call last):
  File "./bin/modbustkbug.py", line 24, in <module>
    master.execute(slave_addr, cst.WRITE_MULTIPLE_COILS, 5, output_value=[0, 0])
  File "/usr/local/lib/python3.5/dist-packages/modbus_tk/utils.py", line 31, in new
    raise excpt
  File "/usr/local/lib/python3.5/dist-packages/modbus_tk/utils.py", line 29, in new
    ret = fcn(*args, **kwargs)
  File "/usr/local/lib/python3.5/dist-packages/modbus_tk/modbus.py", line 288, in execute
    response = self._recv(expected_length)
  File "/usr/local/lib/python3.5/dist-packages/modbus_tk/modbus_tcp.py", line 215, in _recv
    rcv_byte = self._sock.recv(1)
socket.timeout: timed out

It works for me if I set modbus.py line 553 to: (byte_value, ) = struct.unpack(">"+fmt,bytes([request_pdu[6+i]]))

ljean commented 7 years ago

I think that #75 should fix problem. Can you please confirm?