16进制节码解析
前言:
之前我们介绍了modbus_tk数据传输,当然只是介绍了最基本的modbus_tk使用方法,
在使用时我们常用”16进制节码“传输内容今天就简单介绍一个16进制节码解析的实例
从机:float形式数据
主机:
python:modbus_tk
import modbus_tk.modbus_tcp as mt import modbus_tk.defines as md import struct # 浮点数转换 def int2float(a, b): f = 0 try: z0 = hex(a)[2:].zfill(4) # 取0x后边的部分 右对齐 左补零 z1 = hex(b)[2:].zfill(4) # 取0x后边的部分 右对齐 左补零 z = z0 + z1 # 高字节在前 低字节在后 ABCD型16进制编码数据 z = z1 + z0 # 高字节在前 低字节在后 CDAB型16进制编码数据 z = hex(a)[2:][2:] + hex(a)[2:][:2] + hex(b)[2:][2:] + hex(b)[2:][:2] # BACD型16进制编码数据 z = hex(b)[2:][2:] + hex(b)[2:][:2] + hex(a)[2:][2:] + hex(a)[2:][:2] # DCBA型16进制编码数据 f = struct.unpack('!f', bytes.fromhex(z))[0] # 返回浮点数 except BaseException as e: print(e) return f def register_network(ip='192.168.0.105', host=502): # 远程连接到服务器端 # "192.168.0.105", 502 master = mt.TcpMaster(ip, host) master.set_timeout(2) # @slave=1 : identifier of the slave. from 1 to 247. 0为广播所有的slave # @function_code=READ_HOLDING_REGISTERS:功能码 # @starting_address=1:开始地址 # @quantity_of_x=3:寄存器/线圈的数量 # @output_value:一个整数或可迭代的值:1/[1,1,1,0,0,1]/xrange(12) # @data_format # @expected_length Hold_value = master.execute(slave=1, function_code=md.READ_HOLDING_REGISTERS, starting_address=0, quantity_of_x=10, output_value=5) print(Hold_value) Hold_value_list = [install for install in Hold_value] int2float(Hold_value_list[0], Hold_value_list[1]) Hold_value_list[0] = float('%.2f' % int2float(Hold_value_list[0], Hold_value_list[1])) print(Hold_value_list[0]) register_network()
当主机从从机采集数据时默认float形数据,从机会以ABCD四字节划分数据未,以打乱ABCD四字节的顺序而达到加密等目的
以上实例中”Z“变量就是当ABCD打乱顺序后的解密方式。