PB中讀取地磅稱量數據
2024-07-21 02:10:08
供稿:網友
pb中讀取地磅稱量數據
在pb開發企業應用時我們經常會遇到與儀器儀表接口的處理,這里我總結了一下與地磅接口讀取稱量數據的方法。
一般的地磅都有以下的參數組成:
串口編號
串口參數
時鐘周期
讀數長度
讀字符串起始位
讀字符串長度
首末位字符標志
首末位判斷(是否從首位起讀) '0'為首位
字符串是否反序
編碼類型(1.ascii 2.bcd 3.其他)
當前使用的大多數地磅都是使用串口與計算機連接的,儀表在其每一個時鐘周期發送一次數據到串口,處理程序需要在設備的每個時鐘周期讀取儀表數據(在pb中是使用timer來處理的)。
從串口取數方法很多,可以直接用api讀取,也可以用第三方空間讀取,在此就不在描述了。這里主要描述一下對數據的分析處理過程,分別對應ascii編碼和bcd編碼。
ascii編碼的數據處理過程(相對比較簡單):
1. 讀取串口數據(一般讀取后的是blob類型,需要轉換成string類型使用)。
2. 根據儀表參數(讀字符串起始位,讀字符串長度,首末位字符標志)截取數值字串。
3. 如果儀表參數指示需要對讀取的字串反序處理就對截取后的字串進行反序處理。
4. 顯示字串。
bcd編碼的數據處理過程(相對復雜):
使用bcd編碼的儀表可能各廠家的是不一樣的,具體實現要參照儀表的技術資料。
大多數使用bcd編碼的是一位標志位,一位狀態位,三個bcd數字位(低位在前),以前描述的就是這種類型。
bcd是一種壓縮數字存儲方式,每4個二進制位存放一個
bcd碼數值采用壓縮格式,用一個字節來存放兩位數字.
數值99bcd碼的存儲方法如下(以數值99壓縮后的表現為例):
二進制表示 1001 1001
ascii碼字符表示 153
十六進制字符表示 0x99
壓縮存儲是采用把一個字節分成兩部分來存儲數據,高4位和低4位各存儲一位數字
pb中二進制操作不方便,所以本方法采用將ascii值轉為16進制字符取其兩位數字的方法。
1. 讀取串口數據(使用blob讀取)
2. 將blob數據逐個字段轉換為string類型在轉換為ascii編碼字符串,并且每個ascii編碼之間用一個符號(不能是儀表使用的符號)分割,新的字串末尾需要一個符號位。
3. 在字串中查找格式標志檢查這個時鐘周期是否收到格式數據,沒有收到格式數據停止處理等待下一個時鐘周期。
4. 一般字串的第一位為狀態位,取出狀態位處理。
狀態位的值為一個ascii碼值,我們對ascii碼值進行算術運算加簡單的判斷即可取出狀態信息,程序如下:
if li_state > 128 then li_state -= 128 //數據溢出
if li_state > 64 then li_state -= 64 //穩定
if li_state > 32 then li_state -= 32 //符號
if li_state > 16 then //單位:噸
li_state -= 16
ls_unit = "t"
end if
if li_state >= 8 then li_state -= 8 //重量 ,此時li_state為小數符號位
5. 取出bcd1處理:將ascii碼值轉換為16進制在將16進制字符的兩位作為數字轉換為兩位數的數值,并保存bcd1數值。(此時兩位數位個位和十位)
6. 取出bcd2處理:同bcd1。(此時兩位數位百位和千位)
7. 取出bcd3處理:同bcd1。(此時兩位數位萬位和十萬位)
8. 合并轉換后的三個bcd位的數值:bcd = bcd3 * 10000 + bcd2 * 100 + bcd1
9. 處理小數位:此時的小數位位數存放于狀態位ascii值算術處理的后的結果li_state中,所以只要執行操作:bcd = bcd / 10 ^ li_state即可。
10. 處理單位換算,如果單位為噸則執行操作:bcd = bcd * 10 ^ 3
11. 顯示儀表數據。
以上為讀取地磅數據中最關鍵的部分內容,希望大家多提寶貴意見。