首页 文章

我可以通过Python阅读从机上收到的Modbus RS485数据吗?

提问于
浏览
1

我正在使用从属计算机,并希望将通过Modbus RS485从主站传输的数据保存到文本文件中 . 主计算机不断向我正在工作的从计算机发送写入和读取请求,下面是由串行端口监视器捕获的图像 .

enter image description here

我刚用minimalmodbus发现你可以读寄存器 . 但它似乎只有你是主设备才有效 . 我可以在奴隶计算机上做类似的事吗? http://minimalmodbus.readthedocs.io/en/master/usage.html

#!/usr/bin/env python
import minimalmodbus

instrument = minimalmodbus.Instrument('/dev/ttyUSB1', 1) # port name, slave 
#address (in decimal)

## Read temperature (PV = ProcessValue) ##
temperature = instrument.read_register(289, 1) # Registernumber, number of 
#decimals
print temperature

## Change temperature setpoint (SP) ##
NEW_TEMPERATURE = 95
instrument.write_register(24, NEW_TEMPERATURE, 1) # Registernumber, value, 
#number of decimals for storage

2 回答

  • 1

    modbus-tk可以编写自己的modbus从站 .

    下面是一个运行RTU服务器的示例,其中100个保持寄存器从地址0开始:

    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)
            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()
    

    我希望它有所帮助

  • 0

    您可能希望直接管理串行端口 .

    为此,您可以使用pyserial模块,您必须知道Modbus Protocol的工作原理 .

    基本配置可以是:

    import serial
    
    port = '/dev/ttyUSB1'
    serial_comunication = serial.Serial(port, baudrate=4800, timeout=0.75)
    serial_comunication.write(b'frame')
    answer = serial_comunication.read(255)
    serial_comunication.close()
    print answer.decode()
    

相关问题