楼主最近还看过
“芳季”网友展示的程序有两个错误:1、缺少对数据寄存器D0清零的语句;2、使用了非法的移位命令。
缺少清零语句,造成累积数据错误;使用非法“移位命令”造成程序无法输入。即使把“芳季”网友的“sfrb”指令改成“sftr”,程序也还是有错误的!
譬如说,若X10=0时,对应的M0也等于0 ,这时即使X11、X12、……X17中有一些点有报警信号,“芳季”网友的程序也不能累计出报警点数量
来;若X10点有报警输入时,不管其它点有无输报警输入,只要在X10=“1”的持续时间内,该程序都会对D0的内容持续的“加1”(每个程序周期内要执行
8次“加1”)造成错误的累计结果!
而在FX1n或FX1s上,当X10持续为“ON”的前提下,这条“sftr m0 m8001 k8 k1 ”指令只能有4次正确的执行结果!且,这条命令的执行
结果无论正确与否,其结果根本都不会在该程序中对D0中的数据起到任何的控制作用!
哇!我很高兴上面的同志这么仔细。
我上面的程序是爆肚写出来的,或许有跟SIEMENS的混淆了。指令的真正写法也没有弄清,这的确是我的错。
说回来,这个思路我确实在程序上是用过的。
引用
<譬如说,若X10=0时,对应的M0也等于0 ,这时即使X11、X12、……X17中有一些点有报警信号,“芳季”网友的程序也不能累计出报警点数量
来;若X10点有报警输入时,不管其它点有无输报警输入,只要在X10=“1”的持续时间内,该程序都会对D0的内容持续的“加1”(每个程序周期内要执行
>
怎么会呢?循环的过程中M0已经不再是循环次数(n-1)的值了。
第一次执行M0是X10
第二次执行M0是X11
……
每当遇到M0为1的时候就加1了。
回复“芳季”网友的疑惑:
“怎么会呢?循环的过程中M0已经不再是循环次数(n-1)的值了。 第一次执行M0是X10 第二次执行M0是X11 …… ”
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
在“芳季”展示的程序中,M0的状态始终是跟X10的状态一致的。它由“MOV k2X10 k2M0 ”这条传送指令来决定。X10所对应的就是辅助继电器M0。
“芳季”本想用一条“位右移”指令把由“k2m0”所定义的一个“8位的移位寄存器”(m7、m6、m5、m4、m3、m2、m1、m0)中各位的状态顺
次向右逐位传递。但是,“芳季”网友把这条指令定义的“源操作数”与“目标操作数”弄颠倒了。(“指令字”后面紧接的第一个“操作数”叫“源
操作数s ”,依次第二个“操作数”叫“目标操作数D ”)所以,当这条“位右移”指令执行时,其结果并不是所希望的:
M8001→m7→m6→m5→m4→m3→m2→m1→m0 ,
而是原本所不希望的:
M0→M8008→M8007→M8006→M8005→M8004→M8003→M8002→M8001 。
我们知道:在FX1n和FX1s中,特殊继电器M8001至M8004是被系统定义了的,在用户程序中只能运用它们的状态,而不能对它们进行驱动;对于
M8005至M8008这4个特殊继电器,系统虽然没有对其定义,但是操作手册上要求我们一般不要在用户程序中驱动它们。当然,我们也不一定要格守这样
的成规!只要您能在不影响程序的正常运行的前提下,也可以对它们进行驱动操作!
当X10=“1”时,M0也等于“1”,循环的第1次执行“sftr M0 M8001 k8 k1 ”这条指令的结果是:把M0的“1”状态传送到
M8008使它的状态变为“1”,原M8008的状态“0”传送到M8007 ,原M8007的状态“0”传送到M8006……
当M8003的状态(程序运行中,其状态为“1”)传送到M8002时就出问题了:因为M8002被系统定义为“初始化脉冲”(程序进入Run第1个周期过
去之后就该是“0”状态),所以M8003的“1”状态是不可能被传送到M8002的!
在X10持续为“1”状态的前提下,“sftr m0 m8001 k8 k1 ”这条指令最多能将4个“1”传送给M8008至M8005 ! 这就是我说
“在FX1n或FX1s上,当X10持续为“ON”的前提下,这条“sftr m0 m8001 k8 k1 ”指令只能有4次正确的执行结果!”的理由。