首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python modbus 浮点型数据处理

Python modbus通讯模块

modbus_tk:完整modbus协议栈的实现,支持modbus tcp/rtu{1.提供slave模拟器,即模拟modbus server:502), web-based hmi master支持}

做主机读从0开始16个寄存器(hold)函数03功能码,从站1

master.execute(1, cst.READ_HOLDING_REGISTERS, 0, 16)

读出后返回一元组,16个整形。若有32位浮点数,数据回读后需要做数据处理,处理函数首先import struct

def hex_f(a,b):

g1=b

z=a+g1#高低16位组合

z1=hex(z)[2:]#取0x后边的部分

print z1

return struct.unpack('!f', z1.decode('hex'))[0]#返回浮点数

比如返回数据为20480, 17562经过此函数转换为1234.5的浮点数。

若异常 交换参数a,b。

写多个hold寄存器函数

master.execute(1, cst.WRITE_MULTIPLE_REGISTERS, 0, output_value=[1,2,3,4])

写从0开始的四个寄存器值为 1,2,3,4

若其中有32为浮点数,需要转换为两个16位的16进制数。

函数:

def f_dhex(f):#32位浮点数转16进制双字

lis=[]

fx=struct.pack("f", f).encode('hex')#转成16进制

f_1=fx[2:4]+fx[0:2]+fx[6:]+fx[4:6]

lis.append(int(f_1[:4],16))#后半部分转换

lis.append(int(f_1[4:],16))

return lis

返回一个list类型。如1234.5转换为20480, 17562(10进制)

完整测试程序如下:

# -*- coding: utf_8 -*-

import sys

import struct

import time

import logging

import modbus_tk

import modbus_tk.defines as cst

import modbus_tk.modbus_tcp as modbus_tcp

i=0

def f_dhex(f):#32位浮点数转16进制双字

lis=[]

fx=struct.pack("f", f).encode('hex')#转成16进制

f_1=fx[2:4]+fx[0:2]+fx[6:]+fx[4:6]

lis.append(int(f_1[:4],16))#后半部分转换

lis.append(int(f_1[4:],16))

return lis

def hex_f(a,b):

g1=b

z=a+g1#高低16位组合

z1=hex(z)[2:]#取0x后边的部分

print z1

return struct.unpack('!f', z1.decode('hex'))[0]#返回浮点数

while True:

try:

# 连接MODBUS TCP从机

master = modbus_tcp.TcpMaster(host="192.168.2.101")

master.set_timeout(5.0)

logger.info("connected")

# 读保持寄存器

logger.info(master.execute(1, cst.READ_HOLDING_REGISTERS, 0, 16))

a1=master.execute(1, cst.READ_HOLDING_REGISTERS, 0, 16)

e=hex_f(a1[6],a1[7])

print e

'''# 读输入寄存器

logger.info(master.execute(1, cst.READ_INPUT_REGISTERS, 0, 16))

# 读线圈寄存器

logger.info(master.execute(1, cst.READ_COILS, 0, 16))

# 读离散输入寄存器

logger.info(master.execute(1, cst.READ_DISCRETE_INPUTS, 0, 16))

# 单个读写寄存器操作

# 写寄存器地址为0的保持寄存器

logger.info(master.execute(1, cst.WRITE_SINGLE_REGISTER, 0, output_value=21))

logger.info(master.execute(1, cst.READ_HOLDING_REGISTERS, 0, 1))

# 写寄存器地址为0的线圈寄存器,写入内容为0(位操作)

logger.info(master.execute(1, cst.WRITE_SINGLE_COIL, 0, output_value=0))

logger.info(master.execute(1, cst.READ_COILS, 0, 1))

# 多个寄存器读写操作

# 写寄存器起始地址为0的保持寄存器,操作寄存器个数为4 '''

g=f_dhex(e)

logger.info(master.execute(1, cst.WRITE_MULTIPLE_REGISTERS, 0, output_value=[g[0],g[1],i+2,i+3]))

logger.info(master.execute(1, cst.READ_HOLDING_REGISTERS, 0, 4))

# 写寄存器起始地址为0的线圈寄存器

#logger.info(master.execute(1, cst.WRITE_MULTIPLE_COILS, 0, output_value=[0,0,0,0]))

#logger.info(master.execute(1, cst.READ_COILS, 0, 4))

except modbus_tk.modbus.ModbusError, e:

logger.error("%s- Code=%d" % (e, e.get_exception_code()))

time.sleep(10)

功能为:读取0开始的16个寄存器,其中6,7寄存器装载的为一32位浮点数(含转换),同时写0开始的4个寄存器,其中第0,1寄存器为浮点数,此值为6,7寄存器的浮点数。

16进制显示

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180214G0Z9JJ00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券