(采用 Excel VBA开发了一个工具软件)
https://m.toutiao.com/is/L6Auotm/?=一种基于结构化和标准化的PLC
可 编 程 逻 辑 控 制 器(Programmable LogicController,PLC)本质上是一种专为工业环境应用而设计的计算机。PLC 具有高可靠性、功能强大、灵活易用、性价比高等特点,已经广泛应用于钢铁、石油、化工等各个行业。在自动化工程实施过程中,规范、高效的 PLC 程序不仅是整个工程项目顺利实施的重要保障,也会给将来的系统维护提供极大的便利。本文提出的一种基于结构化、标准化的 PLC自动编程方法,力求规范项目开发过程,提高项目开发、实施效率。
早期的 PLC 主要用来代替继电器实现逻辑控制,继电器控制的设计思想是设计PLC程序的主要方法。随着技术的发展,PLC 的功能已经远远不止逻辑控制的范围,应用领域越来越广,控制功能和任务也愈发多变和复杂,采用传统的继电器控制设计思想。进行 PLC 程序设计已经不能满足要求。随着计算机软件技术的不断发展,出现了多种程序设计思想,如结构化程序设计思想、面向对象的程序设计思想以及事件驱动的程序设计思想等。其中,结构化程序设计是一种应用广泛、易于理解和实现且比较契合工业控制程序开发要求的设计方法。
结构化程序设计是以模块化设计为中心,将一个大的程序功能分割为若干个相互独立的小模块,各个模块相对独立、功能单一,使得程序结构清晰、接口简单。结构化程序设计采用“自顶而下、逐步细化”的程序设计方法和“单入口单出口”的控制结构。结构化程序的结构简单清晰、模块化强,贴近人们习惯的推理式思维方式。
把计算机结构化程序设计思想引入到 PLC 程序设计中来,应当包括两层含义:一是指程序的架构设计,即把程序要完成的功能分解为子目标,再逐步细化,分解为具体的小目标。一般常用的方法是根据工艺流程和设备对程序功能进行分解。二是指程序的复用化设计,即某一段程序可以被多次、重复调用,也就是设计通用化的功能模块。如对于功能相同或类似的阀门可以编写一个模块后多次、重复调用,不同的输入条件可以得到不同的输出结果,如果有功能需求发生变化只需要修改该模块的程序即可,从而能够大大简化编程和调试。以冶金企业煤气加压站控制系统为例,程序要完成的功能可以先分为三大部分:信号处理、报警联锁和设备控制,然后在此基础上按照功能要求和设备类型进一步细化。各个子程序中会调用相同的功能模块,如加压机电机子程序和辅助油泵子程序都重复调用了电机控制功能模块,如表 1 所示。
采用结构化编程方法可以大大提高 PLC 程序的质量并缩短工程调试时间,但是在工程实践中由于PLC 编程人员的个人习惯和素质差异,往往会造成程序风格迥异,程序质量参差不齐,互通性差;甚至同一个人在不同时期、不同项目中编写的程序也会存在不统一或随意性。因此,在 PLC 结构化编程的基础上如果能够对 PLC 编程的各个环节进行统一规范,将大大降低程序质量的差异、实现 PLC 程序的标准化。这些环节主要包括:
(1)模块库标准化:即形成统一的模块库供编程人员使用。对于一个程序员、一个部门或公司来说,可以把工程实践中积累的功能模块进行分类、提炼和总结,形成个人、部门或公司级的模块库。后续的工程可以从模块库中集中、统一提取模块使用,而在工程应用这些模块的过程中也可以促进模块功能的统一改进和完善。在部门或公司层面上,统一的模块库不仅有利于模块库的维护和管理,而且模块库只需要少数水平高的编程人员负责编写和维护,大多数编程人员只需要简单的使用这些模块即可,既统一了程序质量、保证了程序的标准化设计,也避免了很多重复劳动。
(2)程序架构标准化:尽管工艺流程各不相同,但对于 PLC 程序来说仍具有很多共性,如信号处理、报警、通讯处理和设备控制等。因此,可以根据行业特点对 PLC 程序架构进行统一划分规定。
(3)存储器分配标准化:PLC 程序中的各类变量一般需要分类或分组存放,如在西门子 STEP7 软件中,可以采用不同的数据块对变量进行分门别类的存放,这些数据块的编号、命名和存储内容都可以进行统一的规定。
(4)变量定义标准化:良好的变量定义方法不仅有利于提高程序的可读性,同时也有利于程序的排错和调试。因此,按照相关设计规范(如《自控设计常用图例和符号》)结合工程特点,对变量定义方法进行统一规定是十分必要的。
(5)其他:对于 PLC 程序的很多细节也应当进行统一规定,如工程的命名、模块的命名、网络地址的分配等。
按照统一的设计标准、统一的模块库进行 PLC编程,会使 PLC 程序的编制形成一种“固定套路”:建立程序框架→建立变量→调用相关模块→填写模块的输入 / 输出管脚→程序测试和调试。这种看似枯燥乏味的编程过程,实际存在不少有规律性、重复性的工作可以交给计算机软件去完成,从而实现变量和代码的自动生成,即 PLC 程序的自动编程。这样能够大大降低软件开发的工作量,提高工作效率。可以说,PLC 自动编程是建立在结构化和标准化设计的基础上,采用工具软件辅助生成程序的一种设计方法。
下面以电机的控制程序为例,简要说明 PLC 程序自动编程的流程:假设有两台电机分别叫 1 #电机和 2 #电机,需要实现手动启动和停止的功能。手动编程首先需要定义表 2 中的变量。
可以看出,两台电机的变量名称和注释中具有相同的后缀,而变量名称中不同的部分就是前缀(设备编号):Motor1 和 Motor2,注释中不同的部分就是设备名称:1 #电机和 2 #电机。接下来就可调用一个事先编写好的通用的电机控制模块(FB200),并为这个模块分别填写不同的参数,如图 1 所示
从上述手动编程的过程和结果来看,由于采用了相同的电机控制模块(FB200)和相同的变量命名方法,两台电机控制程序的差异很小,主要是设备编号和设备名称的不同所带来的,而且这种差异是极其有规律的,因此上面的变量和代码可以采用软件生成并导入到 PLC 编程软件中去。我们采用 Excel VBA 开发了一个工具软件,用于自动生成 PLC 程序代码和变量 ( 基于西门子 STEP7平台 )。该软件首先将模块库中各个模块的详细信息存储在一张表格中,包括模块名称、编号、各引脚参数名称、类型、参数 ID 前后缀、参数名称前后缀、参数变量存储区域等,这些信息用于生成变量和代码中的共性部分,然后由编程人员手动输入个性部分——设备编号、名称等,从而生成的变量和代码将以文本的形式导入到 Step7 软件中去,最终形成 PLC 程序。由于 Step7 软件支持文本格式的语句表(STL)程序与梯形图程序(LAD)以及功能块图程序(FBD)互相转换,因此最终生成的 PLC 程序也可以转换成更为直观的梯形图或功能块图程序。整个自动编程的大致流程如图 2 所示(虚框内为该软件的功能)。
图 2 中的“手动修改代码 ( 非标部分 )”是指一些特定的工艺控制要求如联锁保护等,这部分代码需要根据《软件详细设计》进行手动修改和编程,这点也对通用性模块的编程提出了更高的要求,即模块要留有接口满足这类特定控制条件下的参数条件修改。
把上述 PLC 自动编程的思路推广一下,可以把一些固定的工艺流程包含的功能模块封装成一个模块,如前文举例的煤气加压机,可以把一台加压机涉及的固定设备(包括电机、辅助油泵、机前 / 后阀门和辅助设备等)的 PLC 程序封装为一个功能模块,这样自动生成 PLC 程序的过程更为简单和明了。
笔者在多个工程项目中采用这种方法进行自动编程,取得了良好的应用效果。实践证明,PLC 自动编程具有以下优点:一是能够大大简化 PLC 编程过程,减少程序开发工作量;二是可以避免人为输入代码和参数的错误;三是在自动生成变量的过程中,实质上是把变量命名要求和规范嵌入到软件中去,使得自动生成的变量名称、注释和存储区域等都符合标准化编程的要求;四是在自动生成代码的过程中,需要查找内置在软件中的对应模块,从而可以确保生成的 PLC 代码来自统一的模块库;五是自动生成的代码会根据软件中设置好的程序框架自动划分为若干个子程序,从而可以确保 PLC 程序架构标准化。
笔者设想:由于 PLC 自动编程降低了编程难度,对于一些固定的工艺流程和控制对象,可能只需要自控编程人员甚至是工艺人员进行简单的工艺参数选择和配置就能生成大部分的 PLC 程序。
随着技术的不断进步,PLC 硬件功能越来越强大,所承担的功能和任务也越来越复杂和多变,因此 PLC 软件编程方法已经不能局限于传统的继电器控制设计思想。本文提出的基于结构化和标准化并结合自编软件实现 PLC 自动编程的设计方法,希望能够起到抛砖引玉的作用。
转自《信息技术与标准化》,宝信软件与标准化专栏,上海宝信软件股份有限公司 袁 翔
联系客服