如何解决Pylibmodbus中的TypeError异常?

时间:2019-06-01 12:56:13

标签: python modbus

我正在尝试创建此ModbusRtu对象,但是当我尝试插入一些参数时,似乎会引发错误。即使我只是尝试使用作者指定的原始参数运行它,也会出现相同的错误。我目前已经安装了所有必需的软件包。

libffi-dev-3.2.1-4 libmodbus-3.1.4-2 libmodbus-dev-3.1.4-2 python-dev-2.7.15〜rc1-1 cffi-2.19

我真的感到困惑,为什么它不起作用,因为即使是作者定义的参数似乎也会产生相同的错误。

我已经尝试通过将参数转换为字节,列表或元组来跟踪其消息,但它只会引发另一个异常

``` Python Code 1 (before my solution)
self.master = ModbusRtu(device='/dev/ttyACM0', 
                        baud=9600, data_bit=8, 
                        parity='N', stop_bit=1)

``` Python Code 2 (after my solution)
self.master = ModbusRtu(device=bytes('/dev/ttyACM0', 'ascii), 
                        baud=9600, data_bit=8, 
                        parity=bytes('N', 'ascii), stop_bit=1)


``` Simpler Python Code 1
from pylibmodbus import ModbusRtu

def main():
    client = ModbusRtu()
    # i can't instantiate the ModbusRtu class
    print(client)
    # i should have at least the id of the instantiated class
if __name__ == '__main__':
    main()

应该是创建对象,但是我只收到以下消息:

init 中的文件“ /usr/local/lib/python3.6/dist-packages/pylibmodbus/modbus_rtu.py”,第11行     self.ctx = C.modbus_new_rtu(设备,波特率,奇偶校验,data_bit,                                 stop_bit) TypeError:ctype'char *'的初始化程序必须是字节,列表或元组,而不是str

当我尝试将字符串参数转换为字节时,收到以下消息:

_run中的文件“ /usr/local/lib/python3.6/dist-packages/pylibmodbus/modbus_core.py”,第60行     引发异常(ffi.string(C.modbus_strerror(ffi.errno))) 例外:b'没有这样的文件或目录'

1 个答案:

答案 0 :(得分:0)

这对我来说适用于Python 2.x:

from pylibmodbus import ModbusRtu

client=ModbusRtu(device="/dev/ttyACM0", baud=19200, parity="N", data_bit=8, stop_bit=1)

client.connect()
SERVER_ID=0

client.set_slave(SERVER_ID)

client.write_registers(0, [0]*10)

result=(client.read_registers(0, 10))
print result

client.close()

对于Python 3.x,您必须编码文本,我认为这是您的问题:

从pylibmodbus导入ModbusRtu

client=ModbusRtu(device="/dev/ttyACM0".encode("ascii"), baud=19200, parity="N".encode("ascii"), data_bit=8, stop_bit=1)

client.connect()
SERVER_ID=0

client.set_slave(SERVER_ID)

client.write_registers(0, [0]*10)

result=(client.read_registers(0, 10))
print(result)

client.close()