工業通訊寄存器字節順序分析說明
通信調試中,字節序是個常見概念,比如本地字節序、網絡字節序。
字節存儲機制又分兩種:大端(Big-Endian)和小端(Little-Endian)。
MODBUS協議中同樣存在字節序概念,存儲機制同字節序。不同的是,MODBUS數據幀中對寄存器地址定義為大端字節序,但是數據部分在不同廠家的定義方式可能不同,甚*同一廠家某一型號設備中,對不同數據的字節序定義也不統一。
例如:01 03 04 12 34 56 78 81 07 (讀保持寄存器響應報文)
其中,回復數據長度4Bytes, 原始數據為0X12345678,從報文看,其字節序即為大端。
但是,MODBUS寄存器在傳輸4字節浮點數時,有些設備廠家給出字序要求,聲明字序為小端,即當原始數據是0X12345678時,傳輸它的報文字節流應該這樣:
01 03 04 56 78 12 34 66 D5
使用IEEE 754規范,可進行字節順序交換位置
Float Big-endian 字節順序:A B C D
Float Little-endian 字節順序:D C B A
Float Big-endian byte swap 字節順序:B A D C
Float Little-endian byte swap 字節順序:C D A B
假設存儲表就是一張紙,當輸入一個數據的時候,軟件就會為我們開辟一個地址往表中存放數據,比如往這個地址寫入一個四字節16進制數據:47 41 45 4D。
對存儲表的高位和低位的理解,可以把每個空格都當作一個位置,從0~1000開始計數,寫在*前的就是低位,比如說存放四個字母GAME的地址低位到高位就是G到E。
將數據放入寄存器中,可以把寄存器比做一個水桶,我們放入數據的時候肯定是把"水先倒到水桶的底部,比如,把GAME放入到水桶中的話,水桶中存放的數據就成了EMAG ,也就是 45 4D 41 47 (注意:計算機中每個字節存儲的是兩個16進制的字符)。
PLC 32位寄存器使用字,即使用兩個16位的寄存器組成一個32位的寄存器。
日系(三菱)PLC的32位的寄存器高地位排列是高地址存高16位數據,低地址存低位16位數據。
歐系(西門子)PLC的32位的寄存器高地位排列是高地址存低16位數據,低地址存高16位數據。
在實際配置中,主要涉及到對modbus、PLC這些需要定義寄存器具體數據格式的場景,每家設備定義或者每個現場的設備程序不一樣,數據解析處理的方式就有所區別了。
如圖,是鐵牛智能網關產品關于modbus和西門子PLC寄存器解析方式配置說明:
Modbus 3號命令,保持寄存器
S7-1200 I 寄存器 (開關量輸入)
S7-1200 M 寄存器 (開關量/模擬量)
S7-1200 DB塊寄存器 (開關量/模擬量)
如圖,是鐵牛智能網關產品常用寄存器數據點位的寄存器解析配置示例:
數據類型:包括浮點、整形、布爾、字符串;
讀寫方向:包括只讀、只寫、讀寫;
寄存器類型:包括開關量輸入、開關量讀寫、模擬量輸入、模擬量讀寫,對應modbus 2號命令、1 5號命令、4號命令、3 6 16號命令;
寄存器地址:根據設備寄存器點表進行配置,modbus默認從0開始(即40001);
解析方式:包括常用的數據解析類型,見上圖“Modbus 3號命令,保持寄存器”;
位偏移:單個寄存器內BIT位,用于存放開關量信號,比如一個modbus寄存器包括16位;
BCD碼解析:是否將模擬量數據按照BCD碼(二-十進制碼)處理。(注:BCD 碼 (Binary-Coded Decimal)亦稱二進碼十進制數或二-十進制代碼。 用 4 位二進制數來表示 1 位十進制數中的 0~9 這 10 個數字。)
鐵牛智能網關結合Tnbuild工程軟件,基本可以實現對工業現場數據類型解析全覆蓋,如果遇到特殊的數據解析規則,我們可以根據實際需求進行對接開發、靈活配置,實現工業現場通訊的高效處理和靈活傳輸!