Modbus-tk RTU Ведомый регистр хранения читает целое число со знаком

Я создал ведомый Modbus, используя Modbus-TK, как показано ниже. В качестве мастера я использую просто программное обеспечение мастера Modbus ( http://www.simplymodbus.ca/RTUmaster.htm). Как настроить подчиненное устройство для представления целого числа со знаком, а не без знака. Например, когда я посылаю 16-битные данные, (FC19) HEX должен представлять десятичное число -999, но теперь я получаю 64537.

Попробуйте использовать пример здесь https://github.com/ljean/modbus-tk/blob/master/examples/tcpmaster_example.py. Кажется, это работает только для Мастера.

import sys

import modbus_tk
import modbus_tk.defines as cst
from modbus_tk import modbus_rtu
import serial


PORT = 0
#PORT = '/dev/ptyp5'

def main():
    """main"""
    logger = modbus_tk.utils.create_logger(name="console", record_format="%
(message)s")

    #Create the server
    server = modbus_rtu.RtuServer(serial.Serial(PORT))

    try:
        logger.info("running...")
        logger.info("enter 'quit' for closing the server")

        server.start()

        slave_1 = server.add_slave(1)
        slave_1.add_block('0', cst.HOLDING_REGISTERS, 0, 100,data_format=">b")
        while True:
            cmd = sys.stdin.readline()
            args = cmd.split(' ')

            if cmd.find('quit') == 0:
                sys.stdout.write('bye-bye\r\n')
                break

    finally:
        server.stop()

if __name__ == "__main__":
    main()

И я получил:

Traceback (most recent call last):
  File "C:/Users/Yang/Documents/RBES 
work/Projects&study/Sensors/serial_code/modbus-tk-test.py", line 50, in main
    slave_1.add_block('block1', cst.HOLDING_REGISTERS, 100, 
127,data_format='>b')  
TypeError: add_block() got an unexpected keyword argument 'data_format'

1 ответ

Решение

Вы можете настроить подчиненное устройство на возврат подписанного, а не неподписанного при добавлении нового подчиненного на сервер.

slave_1 = server.add_slave(1, unsigned=False)

add_block не позволяет data_format аргумент. data_format может использоваться только при выполнении основного запроса. Таким образом, вы должны удалить его и добавить новый блок следующим образом

slave_1.add_block('0', cst.HOLDING_REGISTERS, 0, 100)
Другие вопросы по тегам