乐于分享
好东西不私藏

“PLC编程工程应用案例分享”——模块化编程之如何将“开关量数据”转存到指定的寄存器中(以字节存储数据)

“PLC编程工程应用案例分享”——模块化编程之如何将“开关量数据”转存到指定的寄存器中(以字节存储数据)

朋友们,大家好。
本期讨论分享“模块化编程”。
上一篇文章“PLC编程工程应用案例分享”——如何将多个寄存器的位(开关量数据)转存到指定的寄存器中(以字节存储数据)归纳梳理了群友的需求,并对需求进行了分析拆解,通过图片方式以第1个字节VB301的存储情况作为示例,展示了寄存器VB301存储V154.2——V161.2这8个位的数据的情况,见图1。
图1
为了完整的展示需求中所述的48个位“开关量”数据传送以寄存器 VB301 起始的连续6个字节(VB) 的情况,更直观的分析讨论,下面直接上完整的“传送数据”,参见下图2。

图2
由图2,可知:
1.每8个位地址数据,存储到1个字节。48个寄存器的位,共需使用6个字节(VB301—VB306)存储
2.寄存器存储位数据时,位的排序可分为两种。一种是从高位到低位排序(如图2表中——排序1),另一种是从低位到高位排序(如图2表中——排序0)
2.1存储数据时,按排序0——低位到高位排序,则“源数据传送输出地址”的最低位(第0位),然后,依次向高位传送存储。
第1个字节VB301的存储为例,

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位),然后,依次向低位传送存储。

第1个字节VB301的存储为例,

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存储示例,后续的VB302VB306存储赋值“等式”列出来,简直是太简单啦!简单的——都有点过分

能够——按照这种“等式”的思路,转化成PLC的程序,完成此传送数据”的功能,对此例来说,已满足需求。

那么,接下来按照这种“等式”的思路,看看最终的PLC程序会是什么样子。
第一步,直接在“主程序MAIN(OB1)”中,从某一程序段开始,编写这部分传送数据”的“程序”代码,结果可以想象,传送数据”的“程序”与其他程序混杂在一起(乱成一锅粥),见下图3,查阅管理、修改维护很不方便。于是,想到新建子程序,将传送数据”的“程序”写在子程序中。
图3
第二步新建子程序SBR2,将传送数据“程序”写在子程序SBR2中,在主程序(OB1)”中调用SBR2。见图4
图4
那么,子程序SBR2中,如何传送数据”的“程序”代码呢?
是一股脑的,按排序0和按排序1各写48组等式”思路的代码吗?
这样就是96等式”思路的代码。这样写,像不像收拾混乱的桌面物件,一股脑的直接塞进抽屉呢?!
前面的分析,都是用第1个字节VB301存储示例,说明传送数据”的“程序”中具有相同的规律再结合上图3中“电机启停_控制(SBR1)”子程序,很容易想到——写1个“传送到1个字节”中存储的子程序,然后,在子程序SBR2中调用,就可以化繁为简,使程序变得简洁——易读、易管理
第三步新建子程序SBR3,编写传送到1个字节存储的子程序。由于“传送到字节”时,可能存在按“排序0”和按“排序1”的两种情况,为此,子程序SBR3的输入接口处可以配置1个引脚,用于选择“排序0”或“排序1”的情况。
那么,子程序SBR3会是什么样子呢?
是左侧输入端——1个“排序”输入加上8个“位地址”输入,右侧输出端——8个“位地址”输出吗?(如图5 左侧)
右侧输出端直接采用1个“字节地址”可以吗?(如图5 右侧)
参见下图5
图5
显然,图5中的两种都是可以的。
那么,图5输入端的8个“源数”,可以采用“字节”输入吗?
就是在图5 右侧所示的基础上,将输入端的8个“源数”,从原来的“BOOL”型改为“BYTE”型,可以吗?
见下图6
图6
图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
从图7,可以看出子程序SBR4、SBR5接口引脚完全相同,它们与SBR3相比,仅输入端少去“排序”。
可以看出:
1.子程序SBR4、SBR5是采用等式”思路进行“数据传送”的核心,如果,传送数据的对应关系发生变化(需求改变),仅修改此子程序即可。
2.将48个位“开关量”数据传送以寄存器 VB301 起始的连续6个字节(VB) 中,主程序OB1调用1次子程序SBR2,SBR2调用6次SBR3,SB3调用SB4或SB5。见下图8
图8
看这里,是不是不知不觉已经体会到了编程模块化方式。这种模块化”的编程方式,好处——就不多说了。
下面我们来思考一下,上面所述的采用等式”思路编写的程序,对于本例——将48个位“开关量”数据传送以寄存器 VB301 起始的连续6个字节(VB) 中,其优缺点。
优点:1.程序直观简单易写
缺点: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。
图9
怎么样?从外观看,子程序SBR2是不是不复杂呢?
实际上,只需要这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的系统手册。
图10
以下视频来源于
工控长乐帮

已关注

关注

重播 分享