Python能否读取从机接收到的Modbus RS485数据?
Can I read Modbus RS485 data received on a slave computer with Python?
我在一台从机上工作,想把主机通过Modbus RS485传输过来的数据保存到一个文本文件中。
上位机不断向我正在操作的从位机发送读写请求,下图是串口监视器抓取的图片。
我刚刚发现使用 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
您可能希望直接管理串口。
为此,您可以使用 pyserial module and you must know how 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()
modbus-tk 可以编写您自己的 modbus 从站。
这是一个示例 运行 具有 100 个从地址 0 开始的寄存器的 RTU 服务器:
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()
希望对你有帮助
我在一台从机上工作,想把主机通过Modbus RS485传输过来的数据保存到一个文本文件中。 上位机不断向我正在操作的从位机发送读写请求,下图是串口监视器抓取的图片。
我刚刚发现使用 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
您可能希望直接管理串口。
为此,您可以使用 pyserial module and you must know how 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()
modbus-tk 可以编写您自己的 modbus 从站。
这是一个示例 运行 具有 100 个从地址 0 开始的寄存器的 RTU 服务器:
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()
希望对你有帮助