很多设备在实际使用中需要将设备运行中的部分数据保存,以便下一次运行时使用。被 保存的数据要求在设备断电的情况下不丢失,也就是在某些plc中所称的“数据的掉电保存”,这一功能在twido plc可以很方便的实现。
施耐德twido plc全系列cpu本体中都内置有一个可充电的电池,在保证该电池完全充电(plc连续通电时间大于15小时)时,并且在plc的程序中未对%s0做输出的情况下,plc内部的%mw等中间数据全部具有掉电保存功能,保存时间约30天(见图1);对于twdlca*40drf的cpu本体,通过加装外部电池tsxplp01,可将掉电保存时间加长到3年以上;如果设备掉电的时间很长,或用户希望掉电后数据的保存不依赖于内部电池或外部电池,那么可以利用twido的内置flash来实现数据的掉电保存功能。
图1
具体描述
使用twido的内置flash来实现数据的掉电保存功能需要注意:被保存的数据是从%mw0开始的一个长度不超过512的区间,假定需要对300个数据进行掉电保存功能,那么要在程序中做合理的规划,将要做掉电保存数据寄存器集中在%mw0~%mw299区间内。
另外,值得注意的地方是对flash的写的操作不太频繁,如果程序设计的不合理,可能会对flash造成永久性损坏。所以,找到合适的将数据写入flash的条件是非常重要的。
常见的写数据到flash的条件有很多种,例如当数据发生变化时(数据变化不频繁时),或通过人机操作界面的某一个按键,或者当设备突然掉电时。在这里,主要介绍一下,当设备突然掉电时将数据写入flash的方法。
图2 是一种比较可行的捕捉突然掉电的方法,同样,对于使用ac220v电源的twdlca***drf的产品也可以使用同样的方法。
在某些特定的应用场合,plc的电源供给是使用直流24v的蓄电池,如果作为电源供给的蓄电池回路突然中断,而在这种条件下运行的设备很可能需要通过蓄电池突然中断供电的测试,此时图2中的捕捉电源掉电的方法就无法可靠使用。这时,要实现捕捉电源掉电,需要利用twido的一些内部特性,首先来看一下使用dc24v电源的twdlmda*****/twdlcda**drf的对供电电源的要求,见图3。
使用dc24v电源的twdlmda*****/twdlcda**drf的允许供电的直流24v电源发生10ms的中断,而不会对plc的运行造成影响,也就是说,在24v电源供给断开的10ms内plc还可以正常运行,再结合twido的外部中断(i0.2~i0.4,可在1ms内检测到输入的变化,微型继电器从线圈断电到触点断开需要4ms,剩余的5ms足够完成数据写入flash的程序所需的时间)功能,可以完成电源突然中断后将数据保存的要求。
相应的接线及设置见图4、图5及图6。
图2
图3
图4
图5
图6
注意,图6中要将i0.2的滤波时间设置为“不使用”,这样可以使用plc更快地检测到微型继电器的触点的断开。
下面是为实现使用dc24v电源的twdlmda*****/twdlcda**drf的供电掉电捕捉的twido的测试程序,程序中使用i0.0、i0.1来改变mw288的数据,通过q0.1的输出来判断数据是否被写入到flash。使用这三个辅助点是为了不断地重复掉电前数据的变化及上电后观察数据是否实现掉电保持功能,实际使用时可去掉这些测试部分内容。测试程序中保存mw0到mw299间的300个数据寄存器,因数据写入flash的操作在中断程序中完成,所以与程序的大小无关,也就是完成保存数据的功能与plc的扫描时间关系不大。
程序清单:
(* 初始化 *)
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中恢复数据 *)
blk %tm127
ldn %m0
in
out_blk
ld q
st %m101
end_blk
(* 防止频繁对flash写操作时间限制,时间限制在50ms内 *)
blk %tm126
ldn %i0.0.2
in
end_blk
(* 恢复flash中的数据,m101为恢复条件,开机后1.5秒自动恢复数据 *)
(* *)
ldr %m101
[ %sw97 := 300 ]
st %s95
(* q0.1为测试指示,i0.1接通%mw288赋值88,q0.1输出,断电后再通电,1.5秒后%q0.0.1有输出,说明%mw288保存有效 *)
(* 如检测数据保存有效,接通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
(* 主程序结束 *)
end
(* 数据保存子程序,sw97需保存的数据区长度(示范为300,允许范围1~511) %i0.0.2为保存条件,此处取其下降沿 *)
(* 要保证写入闪存的条件在正常运行时不能频繁满足,否则可能损坏闪存 *)
sr0:
ldn %tm126.q
[ %sw97 := 300 ]
andn %sw96:x10
and %sw96:x6
st %sw96:x0
(* 子程序返回 *)
ret