本文所提及的触点仅为常开触点、常闭触点,至于沿指令,比较指令等不在讨论之列,“软实现”指的是用程序代码实现,特此声明。

如上图中网络3内容,此种格式在PLC编程中实属常见,但是在日常维护中是否会出现下列情况:
1、需要删除/添加某触点(改变控制条件);
2、某触点的类型需要改变(改变触点类型);
这些需求在实际项目的维护中是真实存在的,如开关触点暂时没有安装到位,但是又需要调试程序,当然你可能会说,我可以直接用线短接代替实际的开关触点元件,当然可以,但是,这些活你愿意跑来跑去不辞辛劳地干吗?
我不是做维护的,对于维护中的具体需求认识不全面,在此如果有搞维护的朋友,可以指点一下维护中还有哪些具体的类似应用。
又有,如果某外部开关触点损坏,例如热继电器的开关点,正常情况下接入PLC输入回路的硬件是常闭继电输出触点,在PLC程序中编程使用是常开触点NO,此时如果热继的常闭继电输出触点损坏,在没有备用配件的情况下,在不能停机的情况下,在不使用电脑连接PLC改程序的情况下,需要使用热继的常开继电输出触点来临时替换原来使用的常闭继电输出触点,你又当如何操作才能完成任务?这是否又是阿汤哥眼中的不可能完成的任务?
答案是否定的,这是可以完成的任务。

为快速说明设计原理,我使用了图1中的简单触点串联来作举例,我还故意使用了M,没有用I,本意是使用DB中的中间层缓存的,当然也有对应的并联结构,擅长自恋&抬杠的“翘空”大师之流可以暂时先闭上嘴忍一下,等我讲完再开喷。
为方便说明,我在上图的块引脚中额外显性引出了三个管脚,iw_conditions,iw_types,iw_used,三个变量类型都是word,当然也可以根据具体需要设置成byte,dword,或者array,原本引脚只有一个,即上图中的ioArr_condGroup,其实应该是ioUdt_condGroup,类型是UDT而不是Array,我就不改了,给大师之流留下点口实。
上图中的iw_conditions使用的word类型,最多可以容纳16个触点,iw_types同样是word类型,对应配置16个触点的使用类型,即NC/NO,iw_used配置哪些触点是被使用了的。
这样通过HMI/SCADA调节对应的iw_types,就可以改变使用的触点类型,满足特情需要;通过调节对应的iw_used就可以实现某触点的临时投入/切除,助力前期调试和后期维护,而且是"软实现”,不用通过实际硬件实现,如连接短接线,转动转换开关,旋钮开关等。
至于信号的监控,可以在块的输出引脚,使用AT/SLICE引出对应的位状态,使用AT时要格外注意大端小端的问题,免得映射不匹配,管脚名称就使用真实DI的标签名称。
至于iw_conditions使用DB中的中间层,摆脱程序算法对实际DI的直接绝对依赖,当然,这需要先提前“映射”一下,这也是大师所不齿的。
关于调节参数,一定要做好权限管理,这两个功能虽然好用,但也是把双刃剑。
有空的话,下一篇小作文可能会写修改DI的功能,即PLC本体DI硬件损坏的应对策略,虽然很早就有人写过了。
最后,分享一下实际代码,



为方便理解,上面贴出的代码是细节版,但清晰易懂,但是代码写得太多,不是最好的,最好的代码很少,但是不易阅读和理解,在此就不贴了。
《盐铁论》里说,“富在术数,不在劳身;利在势局,不在力耕。”,这里我给改一下,益在代码,不在劳身;利在思想,不在耗力。
最好的代码在于“术数”......
最后,提前祝广大朋友新年快乐!!!