发布于 2007-03-12 13:33:07
0楼
自动人生,这个帖子经典的地方不在于如何整除10,换句话说,你想过没有发帖的意图是什么:I0.0=1(10次)则Q0.0=1,这是一个什么问题?
我个人感觉应该是一个程序动作步骤的问题,例如,有10个颜色不同的指示灯,但只有一个按钮,要求按钮每按下一次灯逐个点亮。你看这是
不是与他的提问吻合了。
其实这样的程序在工程中比比皆是,这是程序步问题。程序步问题是个简单问题,他是顺序结构的,但如果在程序步中加入时序结构,这样的
程序就相对复杂了。这里不谈复杂的,先说点简单的,用位判断是基本不可靠的(忽略,大部分人都能看出),用MOD语句呢?可以实现,但不是最佳途径。
因为程序步中可能有几十步,对其一一做MOD,运行时间太长。
一般工程中应该是很少有人用的。
下面介绍几种方法:
1、移位法,
A M10.2
JCN P1
L 1
T MW10
P1:A I0.0
FP M0.0
= M0.1 //I0.0脉冲标志
L 0
T QW0
S Q0.0
R #BitShiftMark
//初始化开始,以下进行第一步
A M10.0//Step1
A M0.1
AN #BitShiftMark
L MW10//观察此时位……0000 0001
SLW 1
T MW10//观察此时位……0000 0010
S Q0.1
R Q0.0
S #BitShiftMark//第一次按下按钮后,Q0.0灯灭,Q0.1灯点亮
//第二步
A M10.1//Step2
A M0.1
AN #BitShiftMark
L MW10//观察此时位……0000 0010
SLW 1
T MW10//观察此时位……0000 0100
S Q0.2
R Q0.1
S #BitShiftMark//第一次按下按钮后,Q0.1灯灭,Q0.2灯点亮
以下依次类推,不在赘述。
2、计数法
应该没什么说的吧,很简单了,将记的数给MD10,再按上面的方法就可以了
3、置位法
初始步骤基本相同
//第一步
A M10.0//Step1
A M0.1
AN #BitShiftMark
S M10.1
R M10.0
S #BitShiftMark//第一次按下按钮后,M10.0 off,M10.1 ON
//第二步
A M10.1
A M0.1
AN #BitShiftMark
S M10.2
R M10.1
S #BitShiftMark
………………
………………
L MW10
T QW0
置位法其实应该解决类似问题的最好方法了,移位有一个缺点,那就是代表步骤号的存储单元最大为双字32位,也就是说它只能有32步;计数也有一个缺点,那就是不能跳步,按钮按到3次时,我要第5个灯亮,按到4次时,我要第10个灯亮,然后重复。用计数器相信有些费劲了,读者可以自己试验一下。但要是用置位法这个问题简单多了,并且用置位法也可以预留一些步骤,比如上述问题,让第一个灯亮驱动为M10.0,让第二个灯亮可以将驱动改为M10.2中间空一个M10.1,这样如果有改动就可以将M10.1用到,而改动方面只需要对M10.1的前后两个步骤进行更改就可以了。