Мастер Modbus RTU - скрипт на Python с минимальным модулем Modbus

Я хотел бы управлять приводом с помощью скрипта Python в мастере MODBUS RTU. Я попытался использовать библиотеку minimalmodbus для связи (бит записи, записи и чтения регистров) с моим ведомым устройством.

Когда я запускаю свой код, у меня есть ошибки. Итак, кто-нибудь может мне помочь найти решение?

Мой код:


    import minimalmodbus
    import os
    import struct
    import sys
    import serial
    import time

    instrument = minimalmodbus.Instrument('/dev/ttyRS485', 1)
    instrument.serial.port
    instrument.serial.baudrate = 9600
    instrument.serial.parity = serial.PARITY_NONE
    instrument.serial.bytesize = 8
    instrument.serial.stopbits = 1
    instrument.mode = minimalmodbus.MODE_RTU
    instrument.serial.timeout = 0.05


    modbus = instrument.write_bit(0x0427, 1)
    print (modbus)

    alarme = instrument.write_bit(0x0404, 1)
    print (alarme)

    alarme = instrument.write_bit(0x0404, 0)
    print (alarme)

    on = instrument.write_bit(0x0403, 1)
    print (on)

    home = instrument.write_bit(0x040B, 1)
    print (home)

    position = instrument.write_register(0x9900, 0, number_of_decimals=2,functioncode=16, signed=False)
    print (position)

    posi = instrument.write_register(0x9901, 6000, number_of_decimals=2,functioncode=16, signed=False)
    print (posi)

Ошибки:

    ========================= RESTART: /home/pi/test.py =========================
    None
    None
    None
    None
    None
    None
    Traceback (most recent call last):
    File "/home/pi/.local/lib/python3.5/site-packages/minimalmodbus.py", line 2448, in _pack
    result = struct.pack(formatstring, value)
    struct.error: 'H' format requires 0 <= number <= 65535

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
    File "/home/pi/test.py", line 36, in <module>
    posi = instrument.write_register(0x9901, 6000, number_of_decimals=2, functioncode=16, signed=False)
    File "/home/pi/.local/lib/python3.5/site-packages/minimalmodbus.py",line 518, in write_register 
    payloadformat=_PAYLOADFORMAT_REGISTER,
    File "/home/pi/.local/lib/python3.5/site-packages/minimalmodbus.py",line 1166, in _generic_command
    payloadformat,
    File "/home/pi/.local/lib/python3.5/site-packages/minimalmodbus.py",line 1514, in _create_payload
    value, number_of_decimals, signed=signed
    File "/home/pi/.local/lib/python3.5/site-packages/minimalmodbus.py", line 1991, in 
    _num_to_twobyte_string outstring = _pack(formatcode, integer)
    File "/home/pi/.local/lib/python3.5/site-packages/minimalmodbus.py", line 2454, in _pack
    raise ValueError(errortext.format(value, formatstring))
    ValueError: The value to send is probably out of range, as the num-to-bytestring conversion failed. 
    Value: 600000 Struct format code is: >H

person Théo LE BORGNE    schedule 27.02.2020    source источник
comment
можете ли вы назвать ошибки, которые у вас есть?   -  person learner    schedule 27.02.2020
comment
Ошибки расположены в конце кода.   -  person Théo LE BORGNE    schedule 27.02.2020
comment
извини не видел этого   -  person learner    schedule 27.02.2020
comment
Не беспокойтесь и спасибо за изменение   -  person Théo LE BORGNE    schedule 27.02.2020
comment
У тебя была идея?   -  person Théo LE BORGNE    schedule 27.02.2020
comment
что я подозреваю (хотя я не эксперт в Modbus), так это то, что сам порт dev/ttyRS485 может быть неправильным. Можете ли вы проверить, действительно ли переменная instrument указывает на искомое устройство?   -  person learner    schedule 27.02.2020
comment
Порт работает, потому что, когда я записал биты для активации привода, он работал, но когда я написал регистры для перемещения привода, у меня есть эти ошибки   -  person Théo LE BORGNE    schedule 27.02.2020
comment
ожидаются ли все Noneпринты?   -  person learner    schedule 27.02.2020
comment
Да думаю потому что они соответствуют активации битов   -  person Théo LE BORGNE    schedule 27.02.2020
comment
Почему бы не попробовать pymodbus? Если вы это сделаете, я могу помочь вам с этим - я никогда не пробовал minimalmodbus, поэтому у меня нет опыта работы с вашими конкретными ошибками.   -  person Hayden Eastwood    schedule 28.02.2020
comment
Да, с удовольствием. Если у вас есть опыт и примеры работы с этой библиотекой, мне бы пригодилась помощь. У вас есть фреймворк для инициирования связи с рабом?   -  person Théo LE BORGNE    schedule 28.02.2020


Ответы (1)


В ответ на ваш запрос в комментариях об альтернативной библиотеке, вот что я использую для чтения Modbus с библиотекой pymodbus:

import pymodbus
from pymodbus.pdu import ModbusRequest
from pymodbus.client.sync import ModbusSerialClient as ModbusClient
from pymodbus.transaction import ModbusRtuFramer

port = '/dev/tty.usbserial-AQ00BYCR'
baudrate = 38400
client = ModbusClient(
  method = 'rtu'
  ,port='/dev/tty.usbserial-AQ00BYCR'
  ,baudrate=baudrate
  ,parity = 'O'
  ,timeout=1
  )
connection = client.connect()
registers  = client.read_holding_registers(0,100,unit=1)# start_address, count, slave_id
print (registers.registers)

Обратите внимание, что в приведенном выше описании чтение начинается с адреса 0 и продолжается до адреса 100 для slave_id 1.

Чтобы записать регистры, сделайте следующее:

write  = client.write_register(1,425,unit=1)# address = 1, value to set = 425, slave ID = 1
person Hayden Eastwood    schedule 28.02.2020
comment
Большое спасибо ! Я попробую это в понедельник! У вас есть пример регистра записи и нескольких регистров с двумя значениями? - person Théo LE BORGNE; 28.02.2020
comment
Я обновил ответ выше, чтобы включить пример записи. Я не уверен, что вы имеете в виду под несколькими регистрами с двумя значениями. Если вы уточните это, я могу помочь. Если это решило вашу проблему, отметьте это как правильное. Спасибо! - person Hayden Eastwood; 28.02.2020
comment
Верный! Спасибо - person Théo LE BORGNE; 02.03.2020