当前位置:首页 期刊杂志

PLC顺序功能图的梯形图编程模块化规范研究

时间:2024-05-04

车健生 吴雪霏

(沈阳现代制造服务学校 辽宁省沈阳市 110148)

随着顺序功能图在PLC梯形图中的广泛应用,“以经验法为主的设计方法存在设计周期长,不易掌握,程序可读性差”[1]等问题有了很大缓解。但对于一个中大型PLC编程设计,顺序功能图的梯形图编程也暴露出一些问题。如与经验法比较上手容易,但程序代码数量大多超过后者。转换条件与输出状态混在一个SCR—SCRE嵌套中,条理不够清楚;步的转换条件、输出状态语句数量随着步的复杂程度而变化,引起程序个别点处臃肿,整体不均匀。这些都会造成顺序功能图结构不清晰,直观性、可读性受到严重影响。把一个程序分解为若干个子程序,是解决这个问题的一个重要途径,“运用函数”或子程序“是程序的首要组织手段”,它给程序“带来更好的可读性、可维护性和可重用性”[2]。将一个大程序按照一定的规范分解为若干小程序模块,称之为模块化设计,显然,这个规范的合理性、可操作性是重中之重。

1 顺序功能图的三种基本结构

在计算机科学发展史上,结构化程序设计的出现是一个里程碑的事件,结构化程序设计最基本原则是:任何程序都可以由三种基本流程结构构成,即顺序结构、分支结构和循环结构。在PLC编程发展史,顺序功能图(SFC)能够脱颖而出、备受关注,也在于它关注程序的结构。顺序功能图主要由步、有向连线、转换、转换条件和输出状态组成。将系统工作过程划分成若干顺序相连的、由被控对象工作状态变化所决定的步;步的活动状态的转换由转换条件来实现。这是顺序功能图的“形”,它的“神”是PLC程序设计由此实现了把所有程序看作是由单序列、选择序列和并列序列三种基本结构组成的,如图1、图2和图3所示。一定程度上有效地避免经验设计法中的试探性和随意性,提高程序的可读性和可维护性。

如果一个梯形图编程模块化规范能够涵盖这三种基本结构,那么这个规范就是完备的。以下模块化规范的构建均是在讨论这三种基本结构的基础上,此外,规范仍然要保持梯形图编程直观性的特点。

2 顺序功能图的梯形图实现的主程序规范

顺序功能图用梯形图编程实现一般有三种方法,一是使用启保停电路的顺序控制设计方法;二是使用SCR指令的顺序控制设计方法;三是使用计数变量的顺序控制设计方法[3]。其中,方法一在一个网络中描述一个步,当某个转换条件或状态输出繁多时,这个网络就会臃肿复杂;方法二由于有些PLC没有专用的SCR顺序控制继电器而有所受限,同时SCR、SCRE对于每一“步”都要占用两个网络的开销;方法三对于表达并列顺序功能图,通过一个计数变量描述所有步,计数变量某一时刻的值对应活动步编号,这对并列顺序功能图同时存在两个以上活动步的编程是有欠缺的,如果强行合并并列步为一步,会破坏顺序功能图的条理性。

在总结上述三种方法优点基础上,本规范主程序,用Mx.y位存储器依次表示顺序步,Mx.y位存储器值为1时,对应的步为活动步。每一步占用一个网络,均由调用转换条件子程序SBR_i和调用输出状态子程序Output_State两条指令组成(以上x,y分别为字节与位编号,i为子程序序号),图2选择序列顺序功能图的主程序如图4。

图1:单序列

图2:选择序列

图3:并列序列

图4:选择序列主程序片段

图5:分支点步转换条件子程序SBR_0

图6:并列步转换条件子程序SBR_0

图7:接收状态位组数据子程序片段

图8:数字字符串转数组部分梯形图

调用转换条件子程序指令有着相同的结构,以SBR_0为例,左边输入端Current联结当前步M0.0,右边输出端Forward联结去向步M0.1 和步M0.4,指令盒清楚地表明顺序功能图中步转换的来龙去脉。主程序注重的是程序主体流程脉络,不去关注子程序具体的实现过程。本规范对顺序功能图的梯形图编程模块化处理具有主次清楚、层次分明的特点。

3 顺序功能图的梯形图实现的条件转换子程序规范

规范中,每个条件转换子程序都由条件逻辑触发目标步状态寄存器,接着复位当前活动步状态寄存器两部分指令构成。转换条件满足时,对目标步状态位置1,并且对当前步状态位清0,从而完成当前步到目标步活动状态的转变。图2选择序列分支点与图3并列序列并列节点对应的转换条件子程序SBR_0 分别如图5和图6所示。

在条件转换子程序中Current变量类型设置为IN_OUT,Forward变量类型设置为OUT,这样子程序能接收主程序调用时传递的步状态位值,也能在转换条件结束时传达出当前活动状态停止的信息。子程序与主程序只在这两个通道上发生数据交换,实现了子程序与主程序的完全隔离。子程序可随意使用局部变量,而不用顾及与主程序中变量重名、冲突等问题。如果条件相同,条件转换子程序可以通用,被不同步所调用,例如图1的顺序功能图的梯形图中SBR_0与SBR_2是相同的,可只保留一个,从而提高了条件转换子程序模块的复用性。

图9

4 顺序功能图的梯形图实现的状态输出通用子程序

顺序功能图每步输出状态虽然无外乎Q位寄存器串并联的组合,每步均有,个别处数量庞大且无序,影响顺序功能图结构性和可读性。这个看似错综复杂的问题可以用一个描写每步输出状态的数组,加上一个数组上运行的通用程序予以处理。

顺序功能图画出之前,一般先列出系统输入输出状态表,状态表用来确定顺序功能图的每一步,以及每一步的输出状态。状态表中的输出状态可在程序初始化时存入一个二维数组,数组是以步编号为行号,将步状态中位对应数组元素,每步状态全部位对应数组的一行。活动步输出状态时,以当前步编号为行号,在数组中提取一行数组数据,输出给Q字节、字或双字寄存器。程序由下面几个部分组成。

4.1 步状态数字字符串初始化

本程序以每一步输出状态为步序号的ASCII二进制数为例,如图7所示。数组初始化程序以直观、常规方法接收状态数据,先是利用STR_CPY指令接收第一串数字字符串,然后再通过STR_CAT附加第二行、第三行、……字符串。不失一般性地约定:数据之间用逗号加空格隔开,第二行开始,追加数据以逗号开头。习惯上一行数据表示一个步状态,但也可由多个指令完成。程序假定占用VB2000开始的单元(建议使用高端不常用地址),用于以数字字符串形式保存这批状态位数据。

4.2 步状态数字字符串转存二维数组及数组基本管理

数字字符串转存数组,主要过程是在循环控制指令FOR,利用字符串转换整数指令S_I,对数字字符串进行整数转换操作;通过字符搜索指令CHR_FIND,依次推进搜索逗号,把逗号位置赋给AC0,从下一位置开始字符串转换整数操作,结果保存在AC1中,然后存入指定的数组元素中。主要程序片段如图8。

对于无数组体系的PLC,如S7-200系列等可按下面方式进行数组的访问。本研究约定二维数组是以行优先的一维数组方式进行的存储,二维下标[i, j]对应的一维下标[ (i-1)*列总数+j ],对于元素以字节单元存储,某个一维下标也就是这个元素的相对地址(相对数组第1个元素前的位置),从而实现对二维数组元素的访问。下文中涉及的二维数组元素读取子程序ARRARY2D_B_out就可以按照这样原理进行设计。

4.3 步状态二维数组中活动步状态输出程序

每个步诸多Q位存储器的值占用1行数组元素,Q位的低位到高位排列对应数组列号的低到高。步状态二维数组中活动步状态提取程序Output_State把每行数组元素组合一个字节、字或双字,作为函数值返回。本文以输出字节为例,对于指定步状态编号State_num,程序中循环从起始列号到终止列号,也就是从左到右,依次读取数组元素ARRAY[State_num, Column_int],对元素值与1进行比较,等于1时,使用左移位SHL_B指令生成1个以元素列号对应位为1,其它位为0的字节QB_bit;通过逻辑或WOR_B指令把上面的QB_bit累计到输出状态字节Output_B中。行号为State_num的一行元素依次处理完毕后,字节Output_B就已存放了这步的输出状态,以其作为本子程序的返回值。程序核心部分清单如图9。

5 结束语

程序基于早期S7-200系列PLC,全部通过上机验证。上述顺序功能图的梯形图实现模块化规范,无论是整体,还是主程序和子程序都保持梯形图的立身之本——直观性,延续了顺序功能图成功之基——结构化设计。一个大中型项目往往需要多人合作完成,规范化、模块化的设计有助于分工协作开发程序。模块化后,程序断点容易确定,使得调试程序更为方便,提高了程序可靠性。模块化的设计,对于相关相似的不同项目,使得开发者只需关注修改不同点的模块,提高了程序开发的复用性。在PLC顺序功能图设计思想广泛应用的今天,实现顺序功能图设计的梯形图编程模块化规范,对顺序功能设计的深入发展具有一定的积极作用。

免责声明

我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!