Чтение Modbus прошло успешно, но запись Modbus возвращает ноль (с использованием минимального Modbus)

Я читаю и записываю регистры с устройства со следующими параметрами: скорость передачи - 9600 стоп-бит-1 no_of_bits - 8 четность - нечетная

В настоящее время я использую минимальную библиотеку Modbus. мой код для чтения реестра вставлен ниже

    # serial line
    import traceback
    import minimalmodbus as mmRtu

    regsSp = 6
    portName = 'com4'
    baudrate = 9600

    timeoutSp = 0.5 + regsSp * 0
    mmc = mmRtu.Instrument(portName,5,mode=mmRtu.MODE_RTU)
    mmc.serial.baudrate = baudrate
    mmc.serial.timeout = timeoutSp
    mmc.serial.parity = 'O'

    tb = None
    errCnt = 0
    mmc.address = 5
    try:
        data = mmc.read_registers(3, 6)
    except:
        tb = traceback.format_exc()
        errCnt += 1
    mmc.serial.close()
    print(errCnt)
    print(data)

[относится к теме библиотеки Python modbus]

Регистр чтения работает отлично.

Однако мой write_register здесь не работает. Я читаю с 5-го регистра своего устройства. Код ниже.

    # serial line
    import traceback
    import minimalmodbus as mmRtu

    regsSp = 6
    portName = 'com4'
    baudrate = 9600

    timeoutSp = 0.5 + regsSp * 0
    mmc = mmRtu.Instrument(portName,5,mode=mmRtu.MODE_RTU)
    mmc.serial.baudrate = baudrate
    mmc.serial.timeout = timeoutSp
    mmc.serial.parity = 'O'

     tb = None
    errCnt = 0
    mmc.address = 5
    try:
        data = mmc.read_registers(3, 6)
    except:
        tb = traceback.format_exc()
        errCnt += 1
    mmc.serial.close()
    print(errCnt)
    print(data)

Отслеживание (последний вызов последним): файл "C: /Users/Admin/PycharmProjects/weight_calibrate/weight_calibrate.py", строка 17, в mmc.write_register (4, 5, 0, 6, False) Файл "C: \ Users \ Admin \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ minimalmodbus-0.7-py3.6.egg \ minimalmodbus.py ", строка 296, в write_register self._genericCommand (код функции, registeraddress, value, numberOfDecimals , signed = signed) Файл "C: \ Users \ Admin \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ minimalmodbus-0.7-py3.6.egg \ minimalmodbus.py", строка 697, в _genericCommand payloadFromSlave = self._performCommand (код функции, payloadToSlave) Файл "C: \ Users \ Admin \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ minimalmodbus-0.7-py3.6.egg \ minimalmodbus.py", строка 795, в _performCommand response = self._communicate (request, number_of_bytes_to_read) File "C: \ Users \ Admin \ AppData \ Local \ Programs \ Python \ Python36 \ lib \ site-packages \ minimalmodbus-0.7-py3.6.egg \" Minimalmodbus.py ", l ine 930, в _communicate поднять IOError ('Нет связи с прибором (нет ответа)') OSError: Нет связи с прибором (нет ответа)

Я проверил, что пакет данных в запросе идеален, даже CRC. Однако ответ от устройства нулевой, и именно здесь код не работает.

Minimalmodbus.py

    if len(answer) == 0:
        raise IOError('No communication with the instrument (no answer)')

так как ответ - б ''

Я могу писать в регистры своего устройства, используя инструменты просто Modbus master 8.0.7, и пакет данных запроса имеет одинаковое содержимое в обоих случаях. Это говорит о том, что у меня есть права на запись в порт. Кроме того, поскольку даже чтение фактически записывает запрос в порт, права доступа к файлам могут не быть проблемой, вот что я предполагаю.

Пожалуйста, предложите, если мне здесь не хватает какой-либо настройки ..

Я также пробовал библиотеку modbus_tk, и в этом случае она тоже не работает.


person Nags    schedule 06.11.2017    source источник


Ответы (2)


Я никогда не использовал эту библиотеку, но похоже, что вы вызываете функцию write_register следующим образом:

write_register(4, 5, 0, 6, False)

В документации предполагается, что первое число является адресом, а все последующие числа являются значениями записанного, начиная с указанного адреса. Если вы еще этого не сделали, отбросьте «False» и посмотрите, пройдет ли ваша запись.

person Matt Andrews    schedule 01.03.2018

Я уверен, что вы, наверное, уже нашли решение? Но вам нужно вызвать write_register и использовать код функции 6, чтобы отправить новое значение в регистр.

mmc.write_register(REGISTER, NEW_VALUE, DECIMALS, functioncode=6)
mmc.write_register(5, 18, 1, 6) <- this would set the value of register 5 to 18.

Точно так же, если вы хотите отправить отрицательное число, добавьте signed = True в конец команды записи.

mmc.write_register(REGISTER, NEW_VALUE, DECIMALS, functioncode=6, signed=True)
mmc.write_register(5, -18, 1, 6, signed=True) <- this would set the value of register 5 to -18.
person Cory C    schedule 31.08.2018