Python 通过Modbus RTU 485 读取传感器数据

#python读取Baumer Laser OM30-11235102的测量数据,数据的类型为float

import serial
import time
import struct

配置串口

ser = serial.Serial(
port=’com3’,
baudrate=57600,
bytesize=8,
parity=serial.PARITY_EVEN, # 偶校验
stopbits=1,
timeout=1
)

准备要发送的Modbus RTU命令

slave_addr = 1 # 设备地址
func_code = 4 # 功能码
start_reg = 200 # 起始寄存器地址
num_regs = 13 # 寄存器数量
crc = 0xFFFF # CRC校验初始值

cmd = bytearray([slave_addr, func_code, start_reg >> 8, start_reg & 0xFF, num_regs >> 8, num_regs & 0xFF])

计算CRC校验值

for b in cmd:
crc ^= b
for _ in range(8):
if crc & 0x0001:
crc = (crc >> 1) ^ 0xA001
else:
crc >>= 1
cmd += bytearray([crc & 0xFF, crc >> 8])

发送Modbus RTU命令并读取响应数据

def communication():
ser.write(cmd)
time.sleep(0.5) # 等待设备响应
response = ser.read(ser.in_waiting)

# 处理响应数据

if len(response) == 5 + num_regs * 2 and response[0] == slave_addr and response[1] == func_code:
data = response[3:-2]
values = [data[i] << 8 | data[i + 1] for i in range(0, len(data), 2)]

    # print(values)#打印接收到的所有数据,包含长度信息,状态信息等

print(float(values[3]))#打印整数部分

#将接收到的数据位移数据2、3位转换成Float类型的数据显示(Banmer通讯手册要求的)
num1 = int(values[2]/2) #值超出32676,报错,将这个小数部分缩小10倍
num2 = int(values[3])
packed = struct.pack(‘2h’,num1,num2)
float_num = struct.unpack(‘f’,packed)[0]
print(float_num) #

else:
print(“Modbus RTU error”)

连续读取Laser数据

while True:
communication()

ser.close()

讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!