你傳回來(lái)的數(shù)據(jù)加入放在D2000開(kāi)始。
D2005是數(shù)據(jù)字1的高8位,但在PLC里卻是放在低8位的,也就是需要把數(shù)據(jù)左移動(dòng)8位,實(shí)際上就是乘以256(16#100)。
由于臺(tái)達(dá)乘法運(yùn)算比移位運(yùn)算更快(處理器有專(zhuān)用乘法器),所以就是D2005 * 256
注意,16位乘法的結(jié)果是32位的,也就是占用2個(gè)16位數(shù)據(jù),我們只需要低16位。所以這也是我喜歡全部用浮點(diǎn)數(shù)來(lái)運(yùn)算的原因,反正是32位,不去管16位/32位之間的轉(zhuǎn)換問(wèn)題,慢也慢不到哪里去。
MUL D2005 256 D100
這時(shí)D100中的數(shù)據(jù)就是D2005左移8位的數(shù)據(jù)了。
D2006是數(shù)據(jù)字1的低8位,在PLC里本就是放在低8位的,不用管它。
ADD D2006 D100 D200
這個(gè)時(shí)候D200中的數(shù)據(jù)就是按要求組合完成的16數(shù)據(jù)了。
再下來(lái)把這個(gè)16位數(shù)據(jù)轉(zhuǎn)換成32位浮點(diǎn)數(shù)
FLT D200 D300 ,為了運(yùn)算方便,建議不要直接采用地址,而采用變量定義,比如這里定義一個(gè)浮點(diǎn)數(shù) R1
則上條指令就是 FLT D200 R1
然后進(jìn)行小數(shù)點(diǎn)處理,因?yàn)橛?個(gè)小數(shù)位,所以R1/1000
DEDIV R1 1000.00 R1
注意,常數(shù)要帶小數(shù)點(diǎn),系統(tǒng)才知道是浮點(diǎn)數(shù)。
這個(gè)時(shí)候R1中就把小數(shù)位搞好了。
再來(lái)做符號(hào)位
D2003是符號(hào)位,為1就是負(fù)數(shù),那么就可以用接點(diǎn)邏輯運(yùn)算來(lái)做
LD= D2003 1 DEMUL R1 -1.00 R1
這樣就OK了。
當(dāng)然,移位也可以,指令還要精簡(jiǎn)些,但速度差不多。
寫(xiě)得有點(diǎn)煩鎖,不知道有寫(xiě)錯(cuò)的地方?jīng)]有,你參考下,用仿真寫(xiě)段指令試下。