plc源程序的自动生成_第1页
plc源程序的自动生成_第2页
plc源程序的自动生成_第3页
plc源程序的自动生成_第4页
plc源程序的自动生成_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

plc源程序的自动生成

1输出数据的运算自20世纪60年代以来,编程器(cnc)广泛应用于钢铁、制造、运输等行业。通常PLC的工作流程可以分为三个阶段:输入采样、程序执行、输出刷新,PLC系统在运行过程中不断重复上述三个阶段,以实现其控制功能,而程序执行模块的好坏是整个PLC系统的关键。程序执行模块的功能是根据PLC源程序(梯形图或指令表)对输入采样所得的数据进行运算,得到输出数据。通常有两种方法使PLC系统所使用的CPU理解PLC源程序:编译的方法和解释的方法。编译的方法是在上位机中将PLC源程序转换为下位机可识别的二进制代码,并将该代码下载到下位机中,在程序执行阶段下位机直接执行即可。该方法的优点是程序执行速度快,占用资源少;缺点是可移植性差,对于不同CPU型号的下位机需要不同的编译系统。解释的方法是将PLC源程序以一定的格式下载到下位机中,程序执行过程中,下位机逐条对PLC源程序进行解释,最终得到输出数据。该方法的优点是灵活性好,容易移植;缺点是运行速度慢,占用资源多。但随着硬件配置的提高,该问题已经得到了很大的缓解。本文将介绍基于SIPROM语言的PLC源程序的编码方法及其解释执行算法的设计。SIPROM语言是一种类结构文本的PLC程序设计语言,是蓝天数控系统所采用的PLC编程语言。使用该语言编写的PLC程序,非常类似于逻辑方程,简单易懂,执行效率高。本文给出的编码方法简单直观,占据空间小易于解释;本文给出的解释执行算法充分利用了逻辑运算的性质,大大减少了运算的步数,提高了程序执行阶段的速度。2算符、声符、运算符的简介SIPROM语言的操作数包括布尔操作数、字操作数、常数和元操作数,其中元操作数包括时钟、计数器、脉冲和数字比较器等。该语言所使用的运算符有算术运算符(和、差、赋值)、逻辑运算符(与、或、非、异或)。该语言所使用的函数有译码器(DEC)、编码器(ENC)和符号(SGN)等。另外该语言还使用条件和循环语句。由于不同的操作数、功能指令和函数其占用的字符长度不同,如果直接按ASCII码进行存储,解释执行时难以区分指令和操作数,所以对功能指令和函数进行编码,统一用8位二进制来表示,这样可以减少下位机的存储空间,并且由于指令的长度相同,方便区分指令和操作数,降低了解释执行的复杂度。2.1按文本编码进行位操作编码中用到了()*+/01:;=CLMPTXY共17个字符。它们的编码就是对应的ASCII码,这17个字符的ASCII码在40到89之间。对于M、X、Y这三个区,可以对其进行位操作,也可以按字节进行操作。如果是进行位操作,则M0.0表示M区第一个字节的第一位,对此种类型的编码为M的编码之后紧跟着一个字节其高五位为字节号,低三位为位号。如果是对字节进行操作,则M0表示M区的第一个字节,此时紧跟在M编码之后的一个字节用来表示字节的编号。到底是操作字节还是操作位,可以由功能指令的编码来区分。2.2功能指令的编码功能指令的编码分为三类,02~14为操作结果为布尔值的指令的编码,15~35为操作结果为算术值的指令编码,91~101为带标号的指令编码。这三类功能指令的编码值正好绕开了17个常用字符编码的范围(40~89)。这三种功能指令其操作数的编码类似,对于只有一个操作数的指令,其指令编码之后紧跟操作数的编码。而对于可以有一个也可以有两个操作数的指令,在其指令编码之后紧跟一个字节用作指令操作数格式的编码。下面以SGN指令为例来说明功能指令的编码方法,SGN的用法有以下几种:SGN(P1):P1是字节变量或常数;SGNI(P1):P1是字变量或常数;SGN(P1+P2):P1,P2是字节变量或常数;SGNI(P1+P2):P1,P2是字变量或常数;SGN(P1-P2):P1,P2是字节变量或常数;SGNI(P1-P2):P1,P2是字变量或常数。如图1所示,bit6和bit7用来表示SGN指令的参数个数,00表示1个参数,01表示2个参数。如果是两个参数,bit4和bit5用来表示这两个参数是用来做加法还是减法。bit2和bit3用来表示第1个参数的类型,bit0和bit1用来表示第2个参数的类型。紧跟着SGN参数格式字节,存储该指令的第一操作数和第二操作数。2.3节约式的指令所占空间见表1由于难以对操作数进行压缩性的编码,所以对存储空间的节省,主要是通过对功能指令的编码来实现的。SIPROM语言共有78条功能指令,其中占1个字节的指令有6条,占2个字节的指令有5条,占3个字节的指令有29条,占4个字节的指令有38条,其中有三条指令因为其操作数个数不确定,还要增加一个字节用来对其操作数格式进行编码,假设各条指令出现的概率相同,则编码之后指令部分所占空间为非编码所占空间的81/255,节省约68.2353%。编码之后所有指令都只占有一个字节,且每条指令其操作数所占的字节数也是确定的,因此解释执行时,容易区分指令和操作数,大大降低了解释执行的难度。3布尔值和运算的功能根据功能指令的不同,表达式可以分为逻辑表达式和算术表达式,逻辑表达式中其操作数为布尔值,算术表达式其操作数为字节变量、字变量和常数等。PLC最主要的功能就是用来做开关量的控制,且算术表达式的解释执行和逻辑表达式很相似,本文以逻辑表达式为例来说明解释执行算法的思想。3.1逻辑运算简化算法图2是在实验过程中所用的控制环形生产线的梯形图的一部分。该梯形图转化为逻辑方程如下:算法的执行流程是:(1)将表达式转化为后序表达式。上述逻辑方程中,第一个表达式X0.2*X0.3*/X0.4*X0.1*(X0.0+M0.1)转换为后序表达式为X0.2X0.3*X0.4/*X0.1*X0.0M0.1+*,可见转化为后序表达式可以去掉括号。(2)定义一个操作数栈,初始化为空。(3)读取表达式,如果为操作数则入栈,如果为运算符,则从操作数栈中取出相应个数的操作数,进行运算,得到的结果压入到操作数栈中。(4)循环进行第三步,表达式读完后,操作数栈中的值就是表达式的结果。该算法将表达式转化为后序表达式后,再求表达式的值,求表达式的值时不用考虑操作符的优先级,遇到操作符就直接运算,显得很简洁。但是该算法没有利用逻辑运算的一个很重要的性质,即对于aANDb来说,如果a为0,则表达式的结果一定为0;对aORb来说,如果a为1,则表达式的结果一定为1。此处称之为逻辑运算简化性质。因此对于表达式X0.2*X0.3*/X0.4*X0.1*(X0.0+M0.1)来说,如果X0.2*X0.3*/X0.4*X0.1的结果为0,则(X0.0+M0.1)不用计算,整个表达式的结果为0。3.2逻辑式运算的执行算法框架下面利用上一节给出的逻辑运算性质对解释执行算法进行改进。该性质的本质是省略掉当前运算符之后的比当前运算符优先级高的运算符的计算,因为如果后面的运算符优先级高,则会在当前运算符之前计算,其结果会作为当前运算符的右操作数,但是如果当前运算符的左操作数就可以决定运算的结果,那么右操作数就可以不计算。若想实现上述的改进,不能将表达式转换为后序表达式,而应该按正常的顺序读取逻辑表达式,由此引入两个栈:运算符栈(OPTR)、操作数栈(OPND),和两个指针uint8*current(用于依次遍历整个表达式)、uint8*next(用于遍历current所指向操作符之后的操作符)。接下来需要定义运算符的优先级,SIPROM语言中用到的逻辑运算符有*(与)、+(或)、/(非)、左括号以及右括号,另外引入字符#,用来表示表达式的开始和结束。根据逻辑运算的运算规则,可得优先级表如表1。表1中第一列表示在前的操作符OP1,第一行表示在后的操作符OP2,OP1<OP2表示OP1的优先级小于OP2;OP1=OP2表示OP1的优先级等于OP2;OP1>OP2表示OP1的优先级大于OP2。表中空白处表示该空白处所对应的两个操作符不可能以这样的顺序相遇,如果在执行过程中遇到这种情况,说明表达式有错误,进而说明梯形图有错误。图3给出了逻辑表达式解释执行算法的框架,现解释如下:(1)初始化完成的功能是初始化运算符栈(OPTR)、操作数栈(OPND),往运算符栈中压入“#”,current指向逻辑表达式头部。(2)如果current指向逻辑表达式的末尾并且运算符栈的栈顶元素也为“#”,表明逻辑表达式计算结束,返回操作数栈栈顶元素。否则转到(3)。(3)判断current当前指向的是操作数还是操作符,如果是操作数,操作数入栈,current后移,转到(2);如果指向的是操作符,则转向(4)。(4)比较运算符栈栈顶的运算符和current所指向的运算符的优先级。如果是“=”,转向(5);如果是“>”,转向(6);如果是“<”,转向(7)。(5)左右括号相遇,运算符栈退栈,current后移,转向(2)。(6)计算运算符栈栈顶的运算符,如果是一元运算符,则从操作数栈中弹出一个操作数,运算后将结果压入操作数栈中;如果是二元运算符,则从操作数栈中弹出两个操作数,运算后将结果压入操作数栈中;运算结束,current后移,转到(2)。(7)如果*current==“+”并且GetTop(OPND)==1,即满足中逻辑或运算简化的条件;如果*current==“*”并且GetTop(OPND)==0,即满足逻辑与运算简化的条件,则可以按照图4中的算法对上述两种情况进行简化;否则不满足简化运算的条件,current所指向的运算符入栈,current后移。上述三种情况最终都转移到(2)。图4给出的是逻辑运算的简化算法,解释如下:(1)令next指向current后第一个运算符。(2)比较current所指向运算符和next所指向运算符的优先级,如果是“<”,转到(3),如果是“>”,转到(4)。(3)next继续向后移,由于小括号的存在,此处必须对next指向的是何操作符作讨论。如果next当前指向的是“(”,则next需要移到和“(”配对的那个“)”之后的运算符,在后移的过程中,next可能还会碰到“(”,因此还要引入一个变量bracket记录“(”的个数,当next指向“(”时,该变量加1,当next指向“)”时,该变量减1,直到next指向非左右括号的运算符且bracket为0,转到(2)。如果next指向的不是“(”,则next指向下一个运算符,转到(2)。(4)current指向的运算符的优先级大于next指向的运算符,然后当前操作数出栈,如果运算符是“+”,则操作数1入栈,如果运算符是“*”,则操作数0入栈,最后next的值赋给current。4plc控制器设计运用上一节的算法求逻辑表达式X0.2*X0.3*/X0.4*X0.1*(X0.0+M0.1)的值,假设X0.2=1,X0.3=1,X0.4=0,X0.1=0,X0.0=1,M0.1=0。求解的过程列表如表2。该算法已经成功在PLC产品中实现,所用的硬件配置是主板为LPC2368,输入板和输出板都是LPC2119,经实践证明该算法正确无误,效率较高。验证的方法是用以该算法为核心的可编程控制器控制数控生产车间的环形生产线的运行,所用到的PLC源程序为:该源程序除去赋值运算总共有201步逻辑运算,假设对于逻辑与运算其左操作数为0的概率是1/2,对逻辑或运算其左操作数为1的概率是1/2,则用上一小节描述的算法可以减少31*1/2+79*2*1/2+8*2*1/2=102.5步逻辑运算,其中31指本例中右操作数只是单纯操作数而非表达式的逻辑与运算和逻辑或运算的个数,79指本例中右操作数为/A形式的逻辑与运算和逻辑或运算的个数,8指的是右操作数括在括号中的逻辑与运算和逻辑或

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论