写程序时,根据自己要达到的目的,顺手写了如下的两句程序(适当做了简化):
Network 6
A DB8.DBX 166.0
A I 18.6
= L 20.0
A L 20.0
BLD 102
S DB8.DBX 166.1
A L 20.0
JNB _001
L DW#16#FF010080
L DB8.DBD 164
AD
T DB8.DBD 164
_001: NOP 0
Network 7
A DB8.DBX 166.1
FN M 24.2
O DB8.DBX 167.7
= DB8.DBX 167.7
转换成LAD看起来更直接些,简单的描述一下就是:在DB8.DBX166.0、 I18.6两个点都为1时,先置位DB8.DBX166.1,然后通过逻辑与指令又将包括DB8.DBX166.1在内的一些位置零(复位),之后在Network 7检测DB8.DBX166.1的下降沿做另外一个位的输出。
从逻辑上上,这个程序应该没什么问题。但是在复核程序的时候,感觉这个地方似乎不妥,于是在模拟器中做了测试,结果果然有问题:DB8.DBX167.7这个位得不到输出。
对Network 6做了如下修改:
A DB8.DBX 166.0
A I 18.6
= L 20.0
A L 20.0
BLD 102
S DB8.DBX 166.1
A L 20.0
A M 1000.3
JNB _002
L DW#16#FF010080
L DB8.DBD 164
AD
T DB8.DBD 164
_002: NOP 0
A(
A L 20.0
A M 1000.2
L S5T#1S
SD T 10
NOP 0
NOP 0
NOP 0
A T 10
)
JNB _003
L DW#16#FF010080
L DB8.DBD 164
AD
T DB8.DBD 164
_003: NOP 0
为了便于测试,M1000.3和M1000.2是为了以2种方式执行逻辑与操作,且便于直接观察对比。有了定时器之后,DB8.DBX167.7按照预想的效果获得了输出。
当然,实际程序的修正有别的方法,不需要增加定时器。就这个现象本身而言,增加定时器的结果应该是导致NW6的输出与NW7输出之间存在了超过一个扫描周期的时间差。如果这个分析是正确的话,那就是说,边沿检测功能检测的是扫描周期开始时所读取到的值的边沿!而不是本周期内随时变化产生的边沿。