plc的上升沿、下降沿檢測(cè)指令的功能需要至少兩個(gè)掃描循環(huán)周期才能完成,即通過(guò)比較前后兩個(gè)掃描周期同一個(gè)bool變量或rlo(邏輯運(yùn)算結(jié)果)的狀態(tài)來(lái)判斷是否是上升沿、下降沿。
同一級(jí)的邏輯塊的臨時(shí)(temp)局部數(shù)據(jù)區(qū)是公用的,結(jié)束對(duì)fb、fc的調(diào)用后,它們的臨時(shí)變量的值可能被別的邏輯塊的臨時(shí)變量覆蓋掉。網(wǎng)友youhm的測(cè)試驗(yàn)證了這一結(jié)論。他說(shuō):“如果僅僅調(diào)用一個(gè)fc,代碼放在fc里測(cè)試實(shí)現(xiàn)了存儲(chǔ)的功能,當(dāng)調(diào)用多個(gè)fc,并且fc里都使用了臨時(shí)變量,我在另外一個(gè)fc變量里把所有的臨時(shí)變量都復(fù)位為0,這時(shí)在第一個(gè)fc里調(diào)用的這段代碼就不能實(shí)現(xiàn)這個(gè)功能了,另外也測(cè)試了,在ob35里同時(shí)使用臨時(shí)變量也是一樣的效果”。
因此用塊的臨時(shí)變量作上升沿、下降沿檢測(cè)指令的邊沿存儲(chǔ)位來(lái)保存變量的狀態(tài)是極其危險(xiǎn)的,稍有不慎,可能會(huì)出現(xiàn)災(zāi)難性的后果。
網(wǎng)友xiaode說(shuō):“最好還是不要用(臨時(shí)變量作邊沿存儲(chǔ)器位),我以前使用過(guò),造成的后果很嚴(yán)重。后來(lái)就學(xué)乖啦!”
邊沿存儲(chǔ)位雖然允許使用l區(qū)(局部數(shù)據(jù)區(qū)),但是請(qǐng)注意,fb的l區(qū)包括靜態(tài)變量和臨時(shí)變量等,允許用l區(qū)并不說(shuō)明用臨時(shí)變量作邊沿存儲(chǔ)位是合理的。
編程的最高境界是在fb、fc中全部使用局部變量,不使用像m這樣的全局變量。這樣的塊不需作任何修改,就可以移植到其他項(xiàng)目。為此可以使用功能塊的靜態(tài)變量來(lái)作上升沿、下降沿檢測(cè)指令的邊沿存儲(chǔ)位。這樣不會(huì)出現(xiàn)使用臨時(shí)變量帶來(lái)的問(wèn)題,也解決了塊的可移植性問(wèn)題。
有個(gè)德國(guó)人作的符合iec 61131-3標(biāo)準(zhǔn)的編程軟件干脆就把邊沿檢測(cè)指令做成功能塊(也可能是iec 61131-3規(guī)定的指令),把使用臨時(shí)變量作邊沿存儲(chǔ)位的路徹底堵死了。