PLC的编程要领:让工程师受益的PLC编程技巧
PLC编程是一个容易让工程师们头痛的问题。本文将从梯形图逻辑和PLC扫描、BCD码以及可复用代码3个方面详述PLC编程的小技巧。
梯形图逻辑和可编程逻辑控制器(PLC)的扫描、二进制编码的十进制数(BCD码)、以及代码复用,是CONTROL ENGINEERING编辑咨询委员会成员Frank Lamb建议在PLC编程时需要多加留心的地方。作为一家自动化咨询服务公司的创始人,他认为控制工程师们可以从这3个角度来学习PLC的编程要领。
BCD码是一种十进制数的二进制编码,其中每个数都用特定的位来表示,通常是4位或8位,这与人类计算的方式大不相同。这种割裂会给可编程逻辑控制器(PLC)的用户带来困扰。
梯形图逻辑与PLC扫描
几乎所有的PLC都以同样的方式来处理扫描。首先,CPU将物理输入读入内存表,通常称为“输入表”。该表经评估后在程序中使用。不同平台,使用不同类型的寄存器;在每个扫描周期,按照从左向右,从上到下的顺序处理逻辑,同时更新寄存器。包括更新输出表,稍后用其驱动连接到PLC的物理设备。
为实现各种功能,程序可能会调用不同的子程序,需要注意的是调用顺序很重要。根据内存寄存器和输出表的位置,物理输出最多可能会延迟两个周期。在任何情况下,从程序调用处开始执行所调用的子程序,子程序执行完毕,回到最初调用该子程序的主程序,继续完成最初的扫描周期。大多数程序,使用一个初始循环例程,用于调用所有其它例程。
然而,也有一些程序是固定周期运行,并不是连续运行的。不过,这种情况并不常见。大多数程序的配置,都是以最快速度连续运行。执行完所有代码,评估逻辑,并更新所有表(扫描开始时写入的输入表除外),将生成的输出表或寄存器内容写入物理输出。
需要花费多长时间?这取决于平台(处理器速度)、程序代码量、以及所使用的指令类型。在程序中,程序员有时会使用循环处理,或者重复调用同一个子程序。所有这些都会影响PLC总扫描时间。通常,在帮助文档中都会说明不同指令的执行时间,但是并没有涉及到如何估计执行所有代码所需要的时间。基本上这些说明都太简单,只能作为参考。
有时,扫描时间可能长达80毫秒。如果扫描时间超过50毫秒(对机器控制项目而言),用户就应寻求更强大的处理器或使用更高效的代码。在机器控制项目中,如果扫描时间超过50毫秒,对输出响应的影响非常明显;对于过程控制项目而言,这可能不是特别重要。
二进制编码的十进制数
二进制编码的十进制数(BCD码),是一种二进制编码(通常用4或8位来表示)。对我们人类来讲,需要在我们的“寄存器”中累加每位,将它们转换为十进制数,这是上帝赋予人类的编程思考方式。
早在使用触摸屏之前,7段显示器和指轮开关就被用作人和PLC之间的数字接口。甚至更早,在使用PLC之前,这些设备也是与电路之间实现数字接口的唯一图形化设备。用户可以像在ENIAC(第一电子通用计算机)一样,移动短接片,但利用这些设备,更容易查看和调整十进制数。问题是,它们是输入/输出(I/O)密集型的。每个指轮段需要4个输入(+电源),而每个7段显示器则需要4个输出(+2个电源连接)。然而,与使用按钮和指示灯相比,它更容易与十进制数中带符号或无符号整数连接。
最常见的抱怨来自于数学方面;每个数据类型都必须显式声明,如果数据类型不匹配,则必须对其进行转换。不仅如此,标准计时器和计数器类型还需将BCD纳入到它们的数据结构。这是因为这些数据结构,可以追溯到人们需要处理诸如指轮和7段显示器的时代。事实上,计时器设定值,仍然需要输入“S5T # 3S”来完成3秒钟的设定。定时器使用3位BCD来表征数字(12位),还需要2位BCD来表征时基。对计数器也是如此,这意味着它们的计数范围只能从-999到+999。
每一个4位区段可以代表0000到1001的数值;下一个值,不是从1010(有符号或无符号十进制的“10”或十六进制中的“A”)开始,而是直接跳到下一区段的位。这意味着最后6个位组合(A-F)实际上被浪费了——这在BCD结构中是不可能的。
在许多较新的触摸屏中,仍然使用BCD结构或基础,但大多数程序员更倾向于选择整数基来表示十进制数。BCD有点像DOS;工程学校仍然在利用它,但是人们真的不知道它是从哪里来的。参考旧指轮和7段显示,可能有助于澄清某些神秘事项和选择BCD的原因。
PLC的可复用代码,为用户提供了灵活性,并允许构建可从一个应用程序导出到另一个应用程序的结构。
PLC可复用代码的优势
国际电工委员会(IEC)在1993年时就颁布了可编程控制器的国际标准IEC 61131,其中的第三部分关于编程语言的标准,规范了可编程控制器的编程语言及其基本元素。旧的基于寄存器的系统和最新PLC系统之间的一个重要区别,就是能够构建可复用的代码块。支持平台必须具备3个基本特征:
1.局部变量与全局变量。可复用代码必须具有可适用于每个代码实例的变量;在理想情况下,只需在原始代码中定义一次数据格式。这意味着,不需要为每个实例或调用重新定义标签或符号。多次调用子例程,并更新程序中的地址,虽然这样可以节省时间,但这实际上并不是真正的可复用代码。
2.用户自定义的数据类型(UDT)。创建UDT允许构建结构。从一个应用程序导出的结构可以应用到另一个程序中。它们允许使用通用术语来描述组件,如“速度”、“开始”和“拒绝”。UDT不需要使用基于标签的系统,但是它们确实需要更有效的利用符号。
3.受保护的自保持程序块。非常重要的是:代码必须包含在允许变量输入和输出的程序块中,并受到保护,这样用户就不能修改实例中的程序。如果修改,需要密码或软件密钥。
利用满足IEC标准要求的其它PLC语言来编写程序,也有助于使平台功能更强大,代码开发速度更快。不管平台是否使用具有局部变量或用户定制指令的子例程,可复用代码是快速创建功能强大程序的关键部分。许多平台都允许使用复用代码,并且每个平台都有自己的方法。
本文来自于《控制工程中文版》(CONTROL ENGINEERING China)2017年1-2月刊《封面故事》栏目,原标题为:让工程师受益的PLC编程技巧
————本期杂志封面————