楼主最近还看过
下面是这个既不用“循环语句”也不用“跳转语句”的最简练、最巧妙、占用程序扫描周期最短的“用非‘SUM ’指令替代‘SUM ’指令完成‘K2X10’字节ON位总数的统计任务”程序的运行监视图片:
在实际的程序中,从№35步到“END”之间是用来写设备的主要控制任务程序的。但做为我们的练习题目,为了方便我们观察程序的“统计工作”的进行情况,我们可以在这个区间内写入“K2X10”和“K2M1”这两个字节中各个“位元件”的状态串联片断。
通过程序运行监视,我们可以看到程序的运行是没有问题的!这个图片是“X10、X12、X15、X16 ”这4个点有“报警”的情形。
楼主想在FX1n上统计“K2X10”字节中出现的“报警”位的“位总数”,但FX1n上没有“ON位总数”指令[ FNC43(SUM), ] 因此问:有其他方法可以实现吗?
当然,实现“用非SUM指令替代SUM指令完成ON 位总数的统计功能”的方案可以是多种多样的。到底哪一个方案好呢?
说“‘swading ’的方案是迄今为止最好的方案”是对时间为09年3月22日之前来讲的。“swading”的方案好虽是好,但是,它在程序的每一个周期里都要逐一去统计“K2X10”字节的8个“位元件”的状态信息,当对应“位元件”的状态为“ON”时,D0的内容就加1。这就造成了不必要的在程序每一个周期里拖延扫描时间。如果我们在不考虑PLC要执行的主要控制任务的“实时性”时,可以认为“swading”方案是最好的。
但是,人们不可能是用一个FX1n就只为了统计出8个点上当前的“报警”总数量!我们完全有理由认为:楼主的这个PLC主要是用来控制设备运行的,在主要控制任务的程序基础上附带着做一个“报警点数”的统计。所以这个统计工作是一个可有可无的、非常次要的任务!
我们做事情应该分清主次,设备运行的主要控制任务才可能需要讲究“实时性”。而可有可无的、非常次要的“统计报警点数”任务则完全不需要去讲究“实时性”!在程序的一个周期里就把“报警点数”的统计工作做完,对于“统计报警点数”任务来讲,“实时性”是好了。但是,在程序的每一个周期里都要逐一去统计“K2X10”字节中8个“位元件”的状态的后果是:使PLC的主要控制任务的“实时性”变坏。这岂不“本末倒置”了吗?!!