恭喜,你发布的帖子
发布于 2022-06-06 11:35:32
25楼
n个输入异或,有奇数个1时,输出为1;
所以 y 版归纳的,可以这么做:
firstscan 时,计算输入异或结果,记为 R0;
之后任一扫描周期时,计算当前输入的异或结果,记为 RX;
R0 xor RX,就是 lamp 的状态了;
当然,默认初始 lamp 是灯灭的,如果 lamp 初始是保持上次状态的话,那再 xor 上次状态就行了;
这样不知能不能满足 z 版的需求呢?
========================================
关于双线圈,个人以为不需要太纠结,程序自上而下执行,最后把映像区更新到输出,这个原理牢记就行了
关于中断时不可控,个人建议程序中间用M,最后输出Q;或者程序开始时把Q状态赋值给M,中断时用M,这个具体的根据需要而定;
另外如:
程序段N:mov k1 vb0;程序段M:mov k2 vb0;程序段K:mov k10 vb0;
中断时,vb0的值也是不可控的,但这个纠结的人不算多的;
要说差别的话,前者影响Q,那把 VB0 赋值给诸如变频器,或者 AQ 呢?这算不算所谓“双线圈”呢?
========================================
如果是考虑解耦之类的,那举主帖的例子不能说明问题的;
1. 假如把帖子里的开关视为某类控制器,那这个控制器的功能就是:输入状态变更时,输出取反(双联,就是2个这种控制器控制同一个输出);实现这个需求的控制器定义为 Control1;
2. 假设需求变了,只有当某个输入状态变3次时输出才取反(只是举例,不涉及真实场景),实现这个需求的控制器定义为 Control2;
3. 假设需求又变了,为了防止抖动,输入状态变更后3秒再次变更,输出才取反,实现这个需求的控制器定义为 Control3;
现需求如下:每个输入开关各自对应一个控制器,假如有4个输入,每个输入生效模式可设置,控制同一个灯;
有.net、java 等编程基础的童鞋看到的话,基本都会类似这么定义:IControl、Control1、Control2、Control3,其中Control1/2/3都会继承自IControl;根据需求实例化接口,操作时仅操作接口即可;这是IT的解耦;
那对于PLC呢,它没有接口/继承/重写,但本质上就是黑盒,有共同的输入输出,设置相应的参数即可,处理过程不关心;
定义FB_IControl,FB_Control1,FB_Control2,FB_Control3;
外部直接调用 FB_IControl,而FB_IControl内部根据模式选择调用 1/2/3,如果有其他需求,可以封装FB后,在 FB_IControl 内部调用,不会影响外部;
这大概也能算一种解耦吧;
======================
但PLC不是工控机,性能没那么好,而且PLC以可靠稳定作为最高准则,上面的“小技巧”,能不用就不用;
代码,实现需求外,简洁明了就好;
请填写推广理由:
分享
只看
楼主