wjk478
級別: 正式會員
|
請教一下論壇大佬,比如寄存器中的數值:50046其中有效數字是46,放大倍數是10的5次冪即100000那么對應的浮點數值是0.00046 如果數值是:30046其中有效數字是46,放大倍數是10的3次冪即1000那么對應的浮點數值是0.046 怎么實現威綸通觸摸屏上顯示對應的浮點數值而不是寄存器中的數值? |
---|---|
|
夢雨天涯
微信hui530527 &
級別: 網絡英雄
|
那就把你的數值除以100,找到余數46,然后余數除以100000,得到0.00046就行 |
|
---|---|---|
|
wjk478
級別: 正式會員
|
放大倍數不是一個固定的值是寄存器數值里決定的是可變的,寄存器里的數值是一個十進制的電壓數值 |
---|---|
|
wjk478
級別: 正式會員
|
是不是觸摸屏寫段宏指令對讀取的數值進行一個數值轉換,問題是這個數值轉換思路是什么?寄存器內數值首位是決定放大倍數后幾位是有效數值,放大倍數決定有效數值的小數位數 |
---|---|
|
wjk478
級別: 正式會員
|
能不能屏直接讀取數值對數值進行轉換后再在屏上顯示出來,只是現在轉換的思路是什么?數值中包含放大倍數和有效數值怎么區別轉換 |
---|---|
|
gxtmdb82164
級別: 論壇先鋒
|
所以讓你用宏指令讀到HMI里處理,直接轉成字符串,然后分成兩個子字符串,一個是位數一個是有效數值,然后再轉成數值運算以后寫到HMI內部地址上,HMI直接顯示就行了 PC編程上的大數運算也是這樣操作的,什么20位數乘以20位數,常規的數值系統都容納不了這么大的數值,都是轉成字符串以后,按四則運算的規則一位一位的算,算一位就寫一位結果到字符串里面,字符串隨便多長都無所謂 你這個等于是一個自定義的科學計數法,不過足夠簡單罷了 |
---|---|
|
xuxulaifeng
級別: 探索解密
|
1.蔣數據轉換為字符串 2.PLC使用字符串指令,取第一位,得到其精度, 3.PLC使用字符串指令,取除第一位外其它的值,并轉換為整數 4.根據2 3條換算真正的浮點數,50046,是數值除以100000,40046是除以10000,30046是除以1000 5.在人機中顯示浮點數,設置小數點后位數是可能出現最小精度 |
---|---|
|
wjk478
級別: 正式會員
|
macro_command main() unsigned short c,a,e unsigned char b[5] float d GetData(a, "MODBUS RTU (zero-based addressing)", 3x, 2, 1) //讀取寄存器數值如:34567(3是放大倍數,4567為有效數值) DEC2ASCII(a, b[0], 5)//將34567轉為ASCII碼 ASCII2FLOAT(b[1], d, 4)//將4567轉為浮點數 c=b[0]-48//將3的ASCII碼減去48得出數字(放大倍數) //ASCII2DEC(b[0], c, 1) POW(10,c,e)//10的c次方賦于e d=d/e SetData(d, "Local HMI", LW, 0, 1) end macro_command 謝謝大佬們的解答幫助,初步程序如上基本實現顯示問題 |
---|---|
|
gxtmdb82164
級別: 論壇先鋒
|
功能實現就好,距離完美的程序(別人死我不死,我死也要優雅的死)還有兩小步 1、入參檢查,不能保證下位機給的數值一定是正確的,第一位如果讀到0呢?你這里可是有除法的(一般不會炸,但是萬一哪天移植到其他平臺上呢),如果大于5呢? 2、錯誤通知,這個也是要依賴特定平臺的,比如說你這里用威綸通的話,最直接的辦法就是給顯示元件設置一個極限值,最大或者最小看具體設計,總之讀取到錯誤數據后要給用戶一個良好的提示,是數據錯誤了 可能的優化方案: 1、入參檢查,讀取到字符串后檢查第一位的數值范圍,理論上應該是1~5的范圍,超過這個范圍可以認為數據無效了 2、去掉除法,第一位的1~5會對應0.1到0.00001這5個小數值,取出來這個小數值和有效值相乘即可(你這個系統里面0到底是怎么表達的?) 3、更高階的寫法是在宏函數內完成數值到字符串的轉換,界面元件直接顯示字符串,本身有float2Ascii的內建函數,同時可以在函數內方便的判斷數據有效情況,反正最后輸出的字符串,數據合法范圍內輸出這個數值的字符串結果,超過這個結果直接輸出一個ERROR或者NaN,可以更明確當前的錯誤 |
---|---|
|