當前位置:
首頁 > 最新 > Python modbus 浮點型數據處理

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進位顯示


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python 的精彩文章:

Windows和PC機上搭建Spark+Python開發環境的詳細步驟
2018完整Python零基礎到項目精通的乾貨學習教程,請你收藏好哦!

TAG:Python |