发布于 2013-10-04 18:45:27
5楼
节日长假,玩了几天也玩腻了,看见楼主出了个题,就顺便用它来活动活动脑筋吧,免得生锈了:
1. 小程序乍一看很简单,实际动手编程还似乎有点纠结,^_^不好意思,水平有限;
2. 本想借鉴一下经典的跑马灯程序中常用的Loop循环,但尝试了几次均不成功,只好化腐朽为神奇,用最笨的办法来编程,“定时器+计数器”先搞出个方案来再说,然后听听各位朋友们的意见;
3. 用绝对地址编程,只要计算正确,写到DB中这部分的编程,只要对指针熟悉,应该是比较简单的;
4. 也可以将FC扩展和封装成循环任意n个触发周期并写入DB的任意地址的块;
5.程序设计思路:
1)用接近开关触发信号的上升沿在计数器中记录触发次数,并且为了保证计时精确度用上升沿控制计时器启动/停止/采集触发周期剩余时间/再启动;
2)采集接近开关每个触发周期计时器的剩余时间;
3)用预设的接近开关最大触发周期长度(例如:500秒)减去记录的所有触发周期计时器剩余时间的平均值=接近开关平均触发周期;
6. 经仿真程序计算正确。
OB1:
CALL FC1
FC1:
A M 0.7 //初始化
FP M 0.6
JCN _001
L 0
T MW 100
T MW 102
T MW 104
T MW 108
T MW 0
R T 1
R C 1
_001: NOP 0
A M 0.0 //接近开关触发信号,为了便于仿真用M0.0替代
FP M 0.1
= M 0.2 //开关触发信号上升沿脉冲信号
S M 0.3 //开关触发信号上升沿用于计时器启动/停止/再启动控制标志
A M 0.2 //开关触发信号上升沿脉冲信号
CU C 1 //接近开关触发次数计数器
A M 0.2 //开关触发信号上升沿脉冲信号
A(
L C 1 //接近开关触发次数计数器
L 1
>=I
)
JCN _002 //从接近开关第2次触发开始采集二次触发的剩余时间
R M 0.3 //停止计时器
L MW 100 //计时器的实时剩余时间
L MW 102 //触发周期累计剩余时间
+I
T MW 102 //触发周期累计剩余时间
_002: NOP 0
A M 0.3 //计时器启动/停止控制标志
L S5T#8M20S //预设的可能最大周期长度(这里设置为500秒)
SS T 1 //计时器
L T 1
T MW 100 //计时器的实时剩余时间
A M 0.2 //开关触发信号上升沿脉冲信号
A(
L C 1 //接近开关触发次数计数器
L 4
<=I
)
JCN _003
S M 0.3 //判断是否到达要求的触发次数,否,则重新激活计时器
_003: NOP 0
A M 0.2 //开关触发信号上升沿脉冲信号
A(
L C 1 //接近开关触发次数计数器
L 4
>=I
)
JCN _END //判断是否到达要求的触发次数,是,则开始计算
L MW 102 //触发周期累计剩余时间
L 3
/D
T MW 104 //触发周期剩余时间平均值
L S5T#8M20S //预设可能的最大触发周期长度(这里设置为500秒)
AW W#16#FFF //过滤时基
BTI //转换成时间整数值
L MW 104 //触发周期剩余时间平均值
-R
T MW 108 //触发周期平均值
_END: NOP 0
END_FUNCTION
请各位大侠拍砖引玉,帮助本人提高水平!
人的生命似洪水在奔流,不遇着岛屿、暗礁,难以激起美丽的浪花。