很多設(shè)備在實(shí)際使用中需要將設(shè)備運(yùn)行中的部分?jǐn)?shù)據(jù)保存,以便下一次運(yùn)行時使用。被 保存的數(shù)據(jù)要求在設(shè)備斷電的情況下不丟失,也就是在某些plc中所稱的“數(shù)據(jù)的掉電保存”,這一功能在twido plc可以很方便的實(shí)現(xiàn)。
施耐德twido plc全系列cpu本體中都內(nèi)置有一個可充電的電池,在保證該電池完全充電(plc連續(xù)通電時間大于15小時)時,并且在plc的程序中未對%s0做輸出的情況下,plc內(nèi)部的%mw等中間數(shù)據(jù)全部具有掉電保存功能,保存時間約30天(見圖1);對于twdlca*40drf的cpu本體,通過加裝外部電池tsxplp01,可將掉電保存時間加長到3年以上;如果設(shè)備掉電的時間很長,或用戶希望掉電后數(shù)據(jù)的保存不依賴于內(nèi)部電池或外部電池,那么可以利用twido的內(nèi)置flash來實(shí)現(xiàn)數(shù)據(jù)的掉電保存功能。
圖1
具體描述
使用twido的內(nèi)置flash來實(shí)現(xiàn)數(shù)據(jù)的掉電保存功能需要注意:被保存的數(shù)據(jù)是從%mw0開始的一個長度不超過512的區(qū)間,假定需要對300個數(shù)據(jù)進(jìn)行掉電保存功能,那么要在程序中做合理的規(guī)劃,將要做掉電保存數(shù)據(jù)寄存器集中在%mw0~%mw299區(qū)間內(nèi)。
另外,值得注意的地方是對flash的寫的操作不太頻繁,如果程序設(shè)計(jì)的不合理,可能會對flash造成永久性損壞。所以,找到合適的將數(shù)據(jù)寫入flash的條件是非常重要的。
常見的寫數(shù)據(jù)到flash的條件有很多種,例如當(dāng)數(shù)據(jù)發(fā)生變化時(數(shù)據(jù)變化不頻繁時),或通過人機(jī)操作界面的某一個按鍵,或者當(dāng)設(shè)備突然掉電時。在這里,主要介紹一下,當(dāng)設(shè)備突然掉電時將數(shù)據(jù)寫入flash的方法。
圖2 是一種比較可行的捕捉突然掉電的方法,同樣,對于使用ac220v電源的twdlca***drf的產(chǎn)品也可以使用同樣的方法。
在某些特定的應(yīng)用場合,plc的電源供給是使用直流24v的蓄電池,如果作為電源供給的蓄電池回路突然中斷,而在這種條件下運(yùn)行的設(shè)備很可能需要通過蓄電池突然中斷供電的測試,此時圖2中的捕捉電源掉電的方法就無法可靠使用。這時,要實(shí)現(xiàn)捕捉電源掉電,需要利用twido的一些內(nèi)部特性,首先來看一下使用dc24v電源的twdlmda*****/twdlcda**drf的對供電電源的要求,見圖3。
使用dc24v電源的twdlmda*****/twdlcda**drf的允許供電的直流24v電源發(fā)生10ms的中斷,而不會對plc的運(yùn)行造成影響,也就是說,在24v電源供給斷開的10ms內(nèi)plc還可以正常運(yùn)行,再結(jié)合twido的外部中斷(i0.2~i0.4,可在1ms內(nèi)檢測到輸入的變化,微型繼電器從線圈斷電到觸點(diǎn)斷開需要4ms,剩余的5ms足夠完成數(shù)據(jù)寫入flash的程序所需的時間)功能,可以完成電源突然中斷后將數(shù)據(jù)保存的要求。
相應(yīng)的接線及設(shè)置見圖4、圖5及圖6。
圖2
圖3
圖4
圖5
圖6
注意,圖6中要將i0.2的濾波時間設(shè)置為“不使用”,這樣可以使用plc更快地檢測到微型繼電器的觸點(diǎn)的斷開。
下面是為實(shí)現(xiàn)使用dc24v電源的twdlmda*****/twdlcda**drf的供電掉電捕捉的twido的測試程序,程序中使用i0.0、i0.1來改變mw288的數(shù)據(jù),通過q0.1的輸出來判斷數(shù)據(jù)是否被寫入到flash。使用這三個輔助點(diǎn)是為了不斷地重復(fù)掉電前數(shù)據(jù)的變化及上電后觀察數(shù)據(jù)是否實(shí)現(xiàn)掉電保持功能,實(shí)際使用時可去掉這些測試部分內(nèi)容。測試程序中保存mw0到mw299間的300個數(shù)據(jù)寄存器,因數(shù)據(jù)寫入flash的操作在中斷程序中完成,所以與程序的大小無關(guān),也就是完成保存數(shù)據(jù)的功能與plc的掃描時間關(guān)系不大。
程序清單:
(* 初始化 *)
ld 1
mps
and( %s0
or %s1
or %s13
)
st %s0
st %m0
mpp
and %s7
st %m7
(* 開辟存儲空間 *)
ld 1
[ %mw1000 := 88 ]
stn %m255
(* 初始化后1.5秒,從flash中恢復(fù)數(shù)據(jù) *)
blk %tm127
ldn %m0
in
out_blk
ld q
st %m101
end_blk
(* 防止頻繁對flash寫操作時間限制,時間限制在50ms內(nèi) *)
blk %tm126
ldn %i0.0.2
in
end_blk
(* 恢復(fù)flash中的數(shù)據(jù),m101為恢復(fù)條件,開機(jī)后1.5秒自動恢復(fù)數(shù)據(jù) *)
(* *)
ldr %m101
[ %sw97 := 300 ]
st %s95
(* q0.1為測試指示,i0.1接通%mw288賦值88,q0.1輸出,斷電后再通電,1.5秒后%q0.0.1有輸出,說明%mw288保存有效 *)
(* 如檢測數(shù)據(jù)保存有效,接通i0.1,%mw288賦值0,q0.1無輸出,斷電后再通電,1.5秒后%q0.0.1無輸出,說明%mw288保存有效 *)
ld 1
mps
and %i0.0.0
[ %mw288 := 0 ]
mrd
and %i0.0.1
[ %mw288 := 88 ]
mpp
and [ %mw288 = 88 ]
and %s12
st %q0.0.1
(* 主程序結(jié)束 *)
end
(* 數(shù)據(jù)保存子程序,sw97需保存的數(shù)據(jù)區(qū)長度(示范為300,允許范圍1~511) %i0.0.2為保存條件,此處取其下降沿 *)
(* 要保證寫入閃存的條件在正常運(yùn)行時不能頻繁滿足,否則可能損壞閃存 *)
sr0:
ldn %tm126.q
[ %sw97 := 300 ]
andn %sw96:x10
and %sw96:x6
st %sw96:x0
(* 子程序返回 *)
ret