首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以用Python读取从属计算机上接收到的Modbus RS485数据吗?

我可以用Python读取从属计算机上接收到的Modbus RS485数据吗?
EN

Stack Overflow用户
提问于 2017-12-21 21:44:08
回答 2查看 6.5K关注 0票数 1

我在一台从计算机上工作,想将通过Modbus RS485从主机传输的数据保存到一个文本文件中。上位机不断地向我正在工作的下位机发送读写请求,下面是串口监视器捕捉到的画面。

我刚刚发现使用minimalmodbus可以读取寄存器。但似乎只有当你是主设备时,它才能起作用。我可以在从属计算机上执行类似的操作吗?http://minimalmodbus.readthedocs.io/en/master/usage.html

代码语言:javascript
复制
#!/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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-26 15:48:11

modbus-tk使得编写你自己的modbus从机成为可能。

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

代码语言:javascript
复制
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()

我希望它能帮上忙

票数 2
EN

Stack Overflow用户

发布于 2017-12-21 22:48:28

您可能想要直接管理串行端口。

为此,您可以使用pyserial模块,并且必须知道Modbus Protocol是如何工作的。

基本配置可以是:

代码语言:javascript
复制
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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47926257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档