Как решить это исключение TypeError в Pylibmodbus? - PullRequest
1 голос
/ 01 июня 2019

Я пытаюсь создать этот объект 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()

Предположительно создается объект, однако я получил только это сообщение:

Файл "/usr/local/lib/python3.6/dist-packages/pylibmodbus/modbus_rtu.py", строка 11, в init self.ctx = C.modbus_new_rtu (устройство, скорость, четность, бит данных, stop_bit) Ошибка типа: инициализатор для ctype 'char *' должен быть байтами, списком или кортежем, а не str

Когда я пытаюсь преобразовать строковые параметры в байты, я получаю это сообщение:

Файл "/usr/local/lib/python3.6/dist-packages/pylibmodbus/modbus_core.py", строка 60, в _run повысить исключение (ffi.string (C.modbus_strerror (ffi.errno))) Исключение: b 'Нет такого файла или каталога'

1 Ответ

1 голос
/ 01 июня 2019

Это то, что работает для меня с 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 import 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()
...