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