“PLC编程工程应用案例分享”——模块化编程之如何将“开关量数据”转存到指定的寄存器中(以字节存储数据)
为了完整的展示需求中所述的48个位(“开关量”数据)传送到以寄存器 VB301 起始的连续6个字节(VB) 中的情况,更直观的分析讨论,下面直接上完整的“传送数据”图,参见下图2。
1.每8个位地址数据,存储到1个字节。48个寄存器的位,共需使用6个字节(VB301—VB306)存储。
2.寄存器存储位数据时,位的排序可分为两种。一种是从高位到低位排序(如图2表中——排序1),另一种是从低位到高位排序(如图2表中——排序0)。
2.1存储数据时,按排序0——低位到高位排序,则“源数据”先传送到“输出地址”的最低位(第0位),然后,再依次向高位传送存储。
V301.0=V154.2
V301.1=V155.2
V301.2=V156.2
V301.3=V157.2
V301.4=V158.2
V301.5=V159.2
V301.6=V160.2
V301.7=V161.2
2.2存储数据时,按排序1——高位到低位排序,则“源数据”先传送到“输出地址”的最高位(第7位),然后,再依次向低位传送存储。
V301.7=V154.2
V301.6=V155.2
V301.5=V156.2
V301.4=V157.2
V301.3=V158.2
V301.2=V159.2
V301.1=V160.2
V301.0=V161.2
看到上面的等式,是不是一下子感觉传送数据——这么简单呢?!
有没有一种迫不及待的感觉?
要按这种“等式”的思路,完成这个“传送数据”的程序?
这种“等式”,确实太直观啦!
按照第1个字节VB301的存储示例,后续的VB302—VB306的存储,赋值“等式”列出来,简直是太简单啦!简单的——都有点过分。
能够——按照这种“等式”的思路,转化成PLC的程序,完成此“传送数据”的功能,对此例来说,已满足需求。
那么,接下来按照这种“等式”的思路,看看最终的PLC程序会是什么样子。
第一步,直接在“主程序MAIN(OB1)”中,从某一程序段开始,编写这部分“传送数据”的“程序”代码,结果可以想象,“传送数据”的“程序”与其他程序混杂在一起(乱成一锅粥),见下图3,查阅管理、修改维护很不方便。于是,想到新建子程序,将“传送数据”的“程序”写在子程序中。
第二步,新建子程序SBR2,将“传送数据”的“程序”写在子程序SBR2中,在“主程序(OB1)”中调用SBR2。见图4
那么,子程序SBR2中,如何写“传送数据”的“程序”代码呢?
是一股脑的,按排序0和按排序1各写48组“等式”思路的代码吗?
这样就是96组“等式”思路的代码。这样写,像不像收拾混乱的桌面物件,一股脑的直接塞进抽屉呢?!
前面的分析,都是用第1个字节VB301做存储示例,说明“传送数据”的“程序”中具有相同的规律,再结合上图3中“电机启停_控制(SBR1)”子程序,很容易想到——写1个“传送到1个字节”中存储的子程序,然后,在子程序SBR2中调用,就可以化繁为简,使程序变得简洁——易读、易管理。
第三步,新建子程序SBR3,编写“传送到1个字节”中存储的子程序。由于“传送到字节”时,可能存在按“排序0”和按“排序1”的两种情况,为此,子程序SBR3的输入接口处可以配置1个引脚,用于选择“排序0”或“排序1”的情况。
是左侧输入端——1个“排序”输入加上8个“位地址”输入,右侧输出端——8个“位地址”输出吗?(如图5 左侧)
右侧输出端直接采用1个“字节地址”可以吗?(如图5 右侧)
那么,图5输入端的8个“源数”,可以采用“字节”输入吗?
就是在图5 右侧所示的基础上,将输入端的8个“源数”,从原来的“BOOL”型改为“BYTE”型,可以吗?
图6右侧,将输入端的8个“源数”,从原来的“BOOL”型改为“BYTE”型,这完全是可以的,并且在编程时,有相当的好处,尤其是“梯形图”视图下,编写程序时。推荐采用图6右侧方式。
子程序SBR3的输入、输出接口已经定义好了,那么,按照“等式”思路,以及可能存在“排序0”和“排序1”的两种情况,是否要将两种情况的程序代码混写在这1个子程序中吗?
混写的话,需要16组“等式”思路的代码,如前所述,混写不是咱们想要的,那么,分别写2个独立的子程序,对应“排序0”和“排序1”的两种情况下的“数据传送”,然后,在SBR3中调用这两个子程序即可(根据SBR3输入端的“排序”的值为0或1,程序自动选择调用“排序0”或“排序1”的子程序执行“数据传送”)。
第四步,新建两个子程序SBR4和SBR5,分别命名为“低位优先_传数”和“高位优先_传数”。
子程序SBR4和SBR5的外观一样(见下图7),程序内容参见图2以及2.1和2.2关于“等式”思路的字节存储示例。当然,子程序SBR4和SBR5中,全部要使用“局部变量”!
从图7,可以看出子程序SBR4、SBR5接口引脚完全相同,它们与SBR3相比,仅输入端少去“排序”。
1.子程序SBR4、SBR5是采用“等式”思路进行“数据传送”的核心,如果,传送数据的对应关系发生变化(需求改变),仅修改此子程序即可。
2.将48个位(“开关量”数据)传送到以寄存器 VB301 起始的连续6个字节(VB) 中,主程序OB1调用1次子程序SBR2,SBR2调用6次SBR3,SB3调用SB4或SB5。见下图8
看这里,是不是不知不觉已经体会到了编程的“模块化”方式。这种“模块化”的编程方式,好处——就不多说了。
下面我们来思考一下,上面所述的采用“等式”思路编写的程序,对于本例——将48个位(“开关量”数据)传送到以寄存器 VB301 起始的连续6个字节(VB) 中,其优缺点。
缺点:1.输入/输出接口的寄存器配置偏多,编写程序,稍嫌麻烦。
2.此种接口方式,若实际应用中,传送的位——数量较多(几百上千),编写起来更是枯燥乏味;若是传送的位—要求的数量发生变化(增或减),都需要重新修改程序,以及下载程序。
3.若需求的“源数地址”、“目标输出地址”发生变化,需重新修改程序,下载程序。并且,此种情况,修改程序最麻烦!(这就是子程序SBR3推荐采用图6右侧方式的原因,尽管已经比图6左侧方便很多。)
4.工程的移植复用,有相当的局限,如序号2和序号3的所述情况。
总结:采用“等式”思路编写的程序,程序直观,简单易写,但是,编写和维护麻烦,程序缺乏通用性。
之所以,“等式”思路编写的程序——直观易写、缺乏通用性,是因为采用的是最原始的“数学”思维,而没有结合计算机基础、C语言编程、数字电路等相关知识,将实现方法转变为计算机对位、字节擅长的移位、逻辑指令等。
如前文所述:PLC编程–难不难?很大程度与自身储备的基础知识、感兴趣程度、自学能力有关。基础知识扎实、兴趣浓厚加上一点学习实践,入门PLC编程是不难的。
受限于自身储备的基础知识,即使使用相同的编程软件、相同的PLC,相同的功能需求,不同的编程者,所写的程序可能差别非常大。
同样,不同的人,即使有好用的AI编程助手,相同的PLC软硬件、相同的功能需求,可能给AI提出的要求都不同,生成的程序可能差别也非常大。
如果,自己的编程能力有限,那么,当给AI提出要求,AI生成的程序不符合预期时,究竟是给AI提出的要求(需求描述以及相关信息)不够准确呢(操作AI的方式不对?)?还是所用的AI根本就不具备生成符合预期程序的能力呢?或者是提出的要求,其本身根本就是无法实现的?这种找不到问题原因的窘境,才是令人最恼火的!
当AI生成的程序不符合预期时,反复与其沟通,AI不能理解时,可能AI会陷入无限的沉思中。崩溃……
AI让你“焦虑”了吗?“PLC编程”的工程师,关键是要提升专业知识、综合应用能力。一方面,(使用AI)做为需求提出者,其认知高度,直接影响对于相同需求的表述的准确性(结合软硬件情况,实际所要实现的功能)。做为裁判,对于AI生成的程序,必然要有判断、处置的能力,以及纠正AI所写程序中的错误或不符合预期的能力。
AI只是辅助工具而已,可能会成为“PLC编程”的好助手。“PLC编程”工作中的每一步对于“AI”来说,都是挑战,而搞“PLC编程”的工程师,不用焦虑 。
“PLC编程”工作是一份专业性、综合性要求非常高的工作,绝不是简单的“代码”堆砌!
言归正传,下面,咱们一起看看如何写一个“通用”的子程序,来完成本例需求——将48个位(“开关量”数据)传送到以寄存器 VB301 起始的连续6个字节(VB) 中。
咱们可以新建1个“通用”的“传送数据”的子程序SBR2,它的接口包括“源数起始地址”、“源数的位(传送字节的 第几位)”、“数据长度(位的个数)”、“位排序”、“执行完成(可选)”、“输出数据地址”。参见下图9。
实际上,只需要这1个子程序SBR2,就完全可以完成本例的“数据传送”需求。
如果,将此子程序块的接口配置寄存器,通过“HMI触摸屏”或“上位机组态软件”等,就可以轻松实现修改传送数据的“源数据地址”、“源数的位(传送字节的 第几位)”、“数据长度(位的个数)”、“位排序”、“输出数据地址”,而无需重新修改PLC程序、更不需要重新下载程序。
比如:
1.原来传送的是.2位,现在是.3位,将可能是.5位等,只需上位机修改参数——“源数的位”。
2.原来是传48个位,现在需要是传64个位,只需修改“数据长度”。
3.原来是按“排序0”,现在按“排序1”,只需修改“位排序”。
4.原来“源数据起始地址”是VB154(V154.2),现在是VB100,修改“源数据起始地址”即可。
5.原来“输出数据起始地址”是VB301,现在是VB1000,修改“输出数据地址”即可。
这些需求的变化,都无需重新修改PLC程序、更不需要重新下载程序。
这就是“模块化”编程——程序的“通用”,妙处所在!
感兴趣的朋友,可以思考一下如何实现,以及尝试编写此功能程序块并实测验证。欢迎评论区讨论分享。
最后,附上SMART PLC数据存储的手册资料,参见下图10,更多信息请参考西门子SMART PLC的系统手册。