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打亂順序后的解密方式。