资源描述:
论 文 P L C手持编程器编译系统的设计 未庆超蔡启仲李 克俭谢从涩 广西工学院电气与信息工程学院 摘要针对自主研制的基于A R MF P G A组成的小型可编程控制器,设计了一种手持编程器的编译系统。 简单介绍了手持编程器的总体设计,重点介绍了 P L C源代码指令表的存储与编译。编译时将指令表程序经词法 分析、语法分析、语义分析、代码优化、错误处理后生成 P L C主机能识别的二进制目标代码;存储时采用数组 和链表的形式来存放程序。经过测试,该编译系统能正确编译 P L C指令表。 关键词P L C指令表;编译;存储 0 引言 1 手持编程器的总体设计 近几年,随着计算机、网络、微处理器等技术的 迅速发展, P L C编程器所用硬件平台的核心由 8 位微 处理器转变为 3 2位微处理器,软件平台所用操作系 统由DO S 、 Wi n d o w s 系统转变为 L i n u x嵌入式系统或 者 u C / OS I I 实时操作系统。 目前编程器的编译系统主 要有翻译性和解释性两种。 其中翻译型的编译过程是 将源代码程序翻译为 目标机器可识别的语言 通常为 二进制机器码,并由硬件执行的过程l J 】 。其优点是 生成 目标代码后, 目标机器执行效率高, 占用资源小。 解释型 的编译过程是将源代码程序在 目标机器上直 接逐条解释执行,无需先将其翻译为 目标机器代码 。 该型编译需要将编译器直接植入硬件, 其缺点是源代 码程序运行的每一步都要对其进行解释,使得程序运 行效率相对低下,占用资源高, 无法满足工业控制过程的高效 一 性、 高实时性要求。 ; l 存 储 器 l 针 对 自主 研 制 的 基 于 I广菇 AR M F P G A 组成的小型可编程 一 控制器, 设计一种P L C 手持编程 I 存 储 器 l 器的翻译型编译系统, 选用 3 2位 L⋯⋯一一 A R M 微 控 制 器L P C 2 4 7 8 和 u C / OS I I实时操作系统作为设计 平台的核心。 手持编程器由硬件和软件两部分组成。 硬件设计 以 3 2 位微控制器 L P C 2 4 7 8为核心。 L P C 2 4 7 8微控制 器内部集成多种资源,包括 C AN 控制器、S DR A M 控制器、液晶显示屏控制器、U A R T控制器、外部存 储控制器等,减少了系统外围元件数量,使系统的硬 件最小化。软件设计选择 u C / OS I I 作为系统的核心。 u C / OS I I 实时操作系统是一个完整、 可移植、 可固化、 可裁剪、可剥夺、抢 占式实时多任务内核的嵌入式操 作系统,可以管理 6 4个任务,具有信号量、事件标 志组、 消息邮箱、 任务管理和内存块管理等系统功能。 手持编程器利用 C A N总线与 P L C主机通信; 用 L C D 屏显示编译系统的相关信息;用存储器存储 P L C 程 序及相关数据。手持编程器的总体框架如图 1 所示。 8 l 基金项 目 基于 A R MF P GA可编程控制器体 系结构关键 技术的研究 桂科 自 0 9 9 1 0 6 7 图 1 手持编程器 总体框架 2 编译系统的设计 P L C 手持编程器的编译系统 由源代码编制、编 译、存储、显示、通讯五大模块组成,总框架如图 2 所示,执行流程如图 3所示。 编 译 系 统 l I 模 块 I f 模 块 I j 模 块 f I 模 块 图 2 编译 系统 的总框架图 图 3编译系统的执行流程 图 2 . 1 源代码编制模块 的设计 I E C 6 1 1 3 l 一 3是 P L C编程语言的国际标准 ,它 定义了梯形图、顺序功能图、功能模块、结构化文本 和指令表 5种 P L C编程语言规范。其中,指令表是 一 种较 “ 低级”的编程语言,它类似于计算机的汇编 语言,其代码由一系列的指令行组成,常作为其它文 本化语言和图形语言转译过程的中间语言。因此,选 用指令表作为程序的编程语言,比较直接,不用其它 语言转换。 P L C源代码编制模块用来完成对 P L C源代码指 令表程序的新建、插入、修改、添加、删除、查找 、 替换、复制、粘贴、保存等功能。 2 . 2 存储模块的设计 存储模块主要将编译生成的 P L C主机能识别的 二进制 目标代码及 P L C 的源代码指令表等数据存储 起来,以便查看使用。设计中采用数组的形式存放编 译生成的二进制 目标代码, 采用链表的形式存放 P L C 源代码指令表程序。 在链表处理过程中每条指令用一 个结点的数据结构来表示,该结点的结构带有两个指 针,分别指向左右两个有相邻逻辑关系的其它结点, 其结构如图 4所示。 I 左指针I 操作元素 l右指针l 图 4 指令 结点存储 结构 程序设计 中采用结构体来表示结点数据结构, 其 定义如下 s t r u c t n o d e { c h a r d a t a ; s t r u c t n o d e l e f t ; s t r u c t no d e r i g h t ; i n tfla g; } ; 其中,d a t a 存放该结点的关键值,可以是操作数 的编号或操作码的代码号;fl a g存放结点数据结构的 标志位,表示该结点存放的是操作数或操作码;结点 指针分别指向该结点的上层和下层结点,这样结点之 间可通过指针连接,进行扫描和结点元素的插入、删 除、修改等操作。在扫描 P L C源程序指令表过程中, 以空格作为分隔界限,将各独立字符取出,再将该独 立字符与系统关键字对照来识别该字符。 对 己识别的 关键字字符 , 系统申请结点 s t r u c t n o d e 数据结构空间, 将该关键字存放入 dat a 。根据关键字为指令操作符或 者操作软元件 ,分别将 fl a g标志位置 0或 1 ;同时设 2 0 1 2 年第6 期自动化与信息工程 9 置结点的指针指向。 在 P L C 指令表程序中用二叉树的结构【 3 】 表示指 令的逻辑关系,其结构如图 5 所示。每个二叉树的根 结点为系统的指令操作符,叶子结点表示系统的操作 软元件。 对该二叉树的逻辑结构进行后序遍历后可以 得到对应的指令表程序。 图 5 结点相 互连接方式 2 _ 3 编译模块的设计 P L C指令主要分为基本指令和应用指令。 基本指 令是使用较多的指令,完成位逻辑运算功能;而应用 指令完成特定运算的功能。以字为单位对 P L C 指令 进行编码,每条 P L C指令包含操作码和操作数两部 分,其中操作码有 1 个,操作数有 1个、2个、3个 或者更多,例如应用指令的源操作数和 目的操作数。 所以,根据操作数的个数不同,将 P L C 指令分为三 类第一类是 L D、L D R、OR 、AN D;第二类是基本 指令中无操作数指令、单操作数指令和步进指令;第 三类是应用指令。用 3 2位中的最高四位 D3 1 ~D 2 8 区别这三类指令。其中,第二类指令对应的是 0 1 1 0 ; 第三类指令对应的是 0 1 1 1 ;第一类指令对应的是 4 位二进制数的其它组合。 位单元软元件 P L C指令共有 8 种 ,分为 x、Y、 T 、C和 M1 、M2 、M3 、S两类。对每种软元件进行 编码,从 0开始编号。 M 是各类软元件中编号最多的 软元件,故将 M 以 1 0 2 4个软元件为一个单位分为 M1 、M2和 M3三种类型。其中,x、Y、T 、C用 2 位二进制数编码 称为软元件的基地址区分,4种 软元件各自最多有 2 5 6 个,所以用 8位二进制数 称 为软元件的位地址进行编码,共用 1 0位二进制数 判断 4种软元件及其编号;对 M1 、M2 、M3 、S用 2 位二进制数区分,分别用 1 0位二进制数进行编号, l 0 即共用 1 2位二进制数判断 4种软元件及其个数;系 统中有常开、常闭、上升沿微分、下降沿微分四种接 点类型,用 2 位二进制数进行编码 区分。 对第一类指令进行编码时又将 L D、L D R、O R、 A ND分为 L D、L D R和 O R、A N D两类。D3 1 ~D 2 8 从 0 0 0 0 0 1 0 1 表示 L D、L D R,若 D 2 7是 0 ,则表示 L D; 若 D 2 7 是 1 , 则表示 L D R。 D 3 1 ~D 2 8 从 1 0 0 0 1 1 0 1 表示 A ND、O R,若 D 2 7是 0 ,则表示 A N D; 若 D2 7是 1 ,则表示 OR。若它们只有 1 个操作数, 则 D2 6 D1 7依次是软元件 的基地址和位地址 , D1 6 D1 5表示接点类型,D1 4 D1 3表示指令结束 标志,其它为无关项置 1 ;若它们有 2个操作数,则 第 1个操作数和第 2个操作数分别 占 D 2 6 D1 5 、 D1 4 D1 ,最后 1 位表示指令结束。标志位,0表示 未结束,1 表示结束。 对第二类指令进行编码时比较简单,8种软元件 编码,详见表 1 、表 2 。 对第三类指令进行编码时仅涉及 4 8条应用指 令,分别给其编号,编号的范围是 0 ~4 7 ,采用 7位 二进制代码对 D 2 7 D 2 1 编码, 编码值等于各 自的编 号。 用 D2 0区分是否为脉冲执行方式,若是,则 D 2 0 为 1 ;否则,D2 0为 0 。而其它应用指令的操作数有 源操作数和 目的操作数,有些应用指令没有操作数 。 对有操作数的应用指令,用 2个或 3个 3 2位二进制 数表示,将应用指令的编号、脉冲执行方式位和源操 作数用一个 3 2位编码,目的操作数用另外一个 3 2位 编码。将操作数分为软元件的编号和转移地址,转移 地址就是软元件的位地址,源操作数 占 2 0位,目的 操作数占3 2位, 无关项都置为 1 。源操作数有 T 、C 、 D、K 十进制整数、H 十六进制整数、V、Z 、 K n X、K n Y、K n S 、K n M1 、K n M2 、K n M3共 l 3种 软元件,用 4位二进制数进行编码区分,从 0 0 0 0到 1 1 0 0 ;目的操作数有 T 、C 、D、v、Z 、K n Y、K n S 、 K n M1 、K n M2 、K n M3共 1 O种软元件,用 4位二进 制数进行编码区分,从 0 0 0 0到 1 0 0 1 。对无操作数的 应用指令 如 C J 、C AL L 、S R E T等用一个 3 2位二 未庆超 蔡启仲 李克俭 谢从涩 P L C手持编程器编译系统的设计 进制数表示,D 2 7 D2 1用来指令编码,从 0 0 0 0 0 0 0 开始,需要脉冲执行方式位的指令仍用 D2 0 位表示, 需要转移地址的指令用 D1 9 至后面的位表示, 无关项 都置 1 。 表 1 第二类指令编码表 指令名称 第 D3 l - D1 6 位 第 D1 5 - D0位 N0P 01 1 0 0 0 0 0 0 1 1 1 l 1 1 1 1 l l 1 1 1 l 1 1 1 1 1 1 1 1 1 M P S 01 1 0 0 0 0 0 1 1 1 1 1 1 l l l 1 l 1 1 l 1 l 1 l 1 l 1 1 l l MRD 0 1 1 0 0 0 0 1 0l 1 l 1 l 1 l l l l l l 1 l 1 l 1 l l l l l 1 M PP 0l 1 00 00l 1 l 1 l 1l 1 1 l 11 1 l 1 l 1l 1 l 1 l1 1 】 ANB 0 1 1 0 0 01 0 0 l 1 l l 1 l 1 l 1 l 1 l 1 l l l 1 l 1 l 1 l 】 oRB 0l 1 0 0 0l 01 l 1 l 1 l 1 1 1 1 l 1 l 1 l 1 l 1 l 1 l 1 l 1 I NV O 1 】 0 0 0 1 1 01 】 1 1 1 1 l l l l 1 1 1 1 1 1 】 1 1 】 1 l 】 END 0 1 1 0 0 0 1 l 1 l 1 l 1 l 1 1 l 1 l 1 l 1 l 1 l 1 l 1 l 1 I 】 RET O l 1 0 l 1 0 0 1 l 1 l 1 l 1 l 1 1 1 1 l 1 l 1 l 1 l 1 l 1 1 表 2 第二类指令编码表 指令 D2 一 D3 1 ~ D1 6 D1 5 - D1 3 D1 2 Dl 1 ~ D3 名称 D0 S E T O1 1 0 0 1 0 0 0l 1 l l 1 l 1 0 0 0 M 1 0 0 1 M2 R S T 0 1 1 0 0 1 0 0 1 1 1 1 1 1 l 1 位地址 01 0 M 3 PLS 011 001 01 0l1 l 1 1 1 1 0l l S 0X PLF 0l 1 001 Ol 1 l 1 l 1l 1 1 1l 1 0UT 0I 1 0 0 1 1 O 0 l 1 l 1 l 1 l 1 O 0 X 位地址 MC R 0 1 l O 0 l 1 0 l 1 l 1 l 1 l 1 1 Y M C 0l 1 0 0 l 1 1 0l 1 l 1 1 l 1 S TL 0l 1 0l 1 0 0 0l 1 l 1 l l l 编译模块的功能是对 P L C源代码指令表进行词 法分析、语法分析、语义分析、代码优化【 4 J ,若出现 错误则进行错误处理;反之,则生成 P L C 主机能识 别的二进制 目标代码。 词法分析和语法分析的实质是 检查源程序的整个输入是否构成一个完整的 P L C 指 令程序。 词法分析采用有限 自动机的原理来实现扫描功 能,从 P L C源文件中逐个读取字符,再对各个字符 进行识别,分离出关键字、变量、数字、常量等。将 软元件 如 x、Y、S 和指令符 如基本指令设置 为关键字。同时检查源程序指令中操作符和操作数的 关系是否正确。例如,对系统的位单元元件 S不能使 用 O R B、A N B等块操作符, 对数据寄存器软元件 D、 V、z使用 S E T等位操作指令等类似的错误。当对应 的操作符与操作软元件不相符时系统提示错误, 停止 相应程序的处理。 语法分析则是针对词法分析阶段中产生的单词 序列进行检查 ,判断是否符合指令表语言的语法规 则, 确定整个输入字符串是否构成一个在语法上正确 的程序等等。 将词法分析阶段识别的关键字分类为表 达式、语句等语法单元。再根据关键字的意义将该源 程序的二叉树的逻辑结构转换为布尔表达式。 根据语 法规则的描述, 确定该布尔表达式的逻辑结构是否与 P L C程序的语法规则相符。 语义分析则分析整个句子是否符合 P L C 指令编 程规则、数据的类型是否匹配、程序在逻辑上是否有 错误等。 代码优化就是在 P L C编程规则下将多余的空格 符、制表符、注释等字符过滤掉,减少代码的存储空 间。 错误处理则是在编译过程中自动加入冗余容错逻 辑,提高容错能力,增强系统的自适应能力。 经过以上阶段, 可生成结构和逻辑上正确的P L C 源指令代码。对 P L C 源指令代码进行遍历,根据树 状结构对其存储。对 P L C源指令代码通过后序遍历, 从后序遍历根结点的各个子树 ,然后访问根结点。将 操作码的编译代码和操作软元件的编译代码移位相 加就构成了最终的二进制 目标代码。 3 实例测试 编译一段 P L C源程序指令 ,进行测试,以验证 编译系统编译 P L C指令的正确性。 LD X0 01 OR X0 0 3 oUT Y00 2 I DI X0 01 2 0 1 2 年第 6 期自动化与信息工程 1 1 0U I ’ Y0 0 3 LDI X0 01 ORI X0 0 3 OUT Y0 0 4 END 输入 P L C 指令代码时规定指令符和软元件之 间只有一个空格符,若多个或者没有空格符,则会出 现输入代码错误; 各类软元件与其编号之间不能有任 何符号,否则提示错误。 将这段 P L C代码通过外围按键输入 ,通过代码 扫描函数 C o d e S c a n ,返回该段代码的总行数。由 编译函数 C o m p i l e C o d e 0 编译该段 P L C源代码,将编 译结果显示在液晶显示屏上,如表 3所示。第 1 列是 P L C源程序指令, 第 2列是以十六进制形式表示的 目 标代码。 表3 P L C 源代码及编译结果显示 S o u r c e Co d e s Th e Re s u l t s LD X0 01 44 07 FFFF OR X00 3 C40 FFFFF OUT Y00 2 6 67 F901 0 LDI X001 44 04 FFFF 0UT Y00 3 6 67 F901 8 LDI X0 01 440 4 FFFF ORI X0 0 3 C4 0 CF F F F oUT Y00 4 6 67 F90 20 END 6 7FFF FFF 编译每行代码时, 分辨出指令符和软元件之间的 空格符; 根据空格符的位置找出软元件编号的起始位 置;利用截取子字符串函数 s u b s t r O 分别读取指令符、 软元件和软元件的编号, 利用字符串处理函数 s t r c mp O 判断指令符与可编程控制器的指令符是否相同。若相 同,则判断软元件具体类别。结合软元件编号,整行 P L C指令代码被编译成十六进制代码, 再通过十六进 制数转变为二进制数函数 S i e t e e n T o B i n 0,生成相应 的二进制代码;若没有一个相同,则提示错误。 读取指令符和软元件之间空格符的位置函数如 1 2 下 i n t Re a d _S p a c e c h a r t e m p s t r , c h ar C { i n ti 0 f o r i O ; i s t r l e n t e m p s t r ; i { i f t e mp s t r [ i ] -- c r e t u r n i ; } } 截取子字符串函数 s u b s 如下 c h ar s u b s c h ar s , i n t P , i n t s i z e { i n ti ; c h a r t e mp c h a r ma l l o c s i z e 1 ; f o r i 0 ; i s i z e ; i t e mp [ i ] s i p - l i ] ; t e mp [ i ] 0 ’ r e t u r nt e mp ; } 以L D I 为例, 编译 P L C源代码函数 C o mp i l e C o d e 如 下 c h ar C o mp i l e C o d e c h ar s t r { i n t p o s O , i O j , k , B i t _ A 0 ; c h ar c _c , I n f S t r [ 6 0 ] ” ” , c o d e [ 9 ] ⋯ ’ ; c har C _ He a d , * t e mp; p o s Re a d _S p a c e s t r , ” ; i f p o s 一 1 、 { C He a d s u b s t r s t r , 1 , p o s ; C Cs t r [ p o s 1 ] ; t e m ps u b s 仃 s 仃 , p o s 3 , 5 ; B i t _ Aa t o i t e mp ; } e l s e C _He a d - - s t r ; i f s t r c mp C _ He a d , “ L D I ” 一 0 未庆超 蔡启仲 李克俭 谢从涩P L C手持编程器编译系统的设计 p o s 0 Bi t . J 一 0 4; s p r i n t f I n f S t r , “ %x ” , p o s ; s w i t c h C _ C { c a s e ’X’ c o d e [ 0 ] I4 ’ ; c o d e [ 1 ] ’4 ’ ; b r e a k c a s e Y ’ c o d e [ 0 ] ⋯ 4 ; c o d e [ 1 ] ’ C ’ ; b r e a k ; c a s e ’T ’ c o d e [ 0 ] 5 ; c o d e [ I ] 4 ’; b r e ak; c a s e ’C ’ c o d e [ 0 ] ’5 ’; c o d e [ 1 ] ’C ’ ; b r e ak; } j s t r l e n I n f S l r ; s wi t c h j { c a s e l c o d e [ 2 ] ’ 0 ’ ; c o d e [ 3 ] I n f S t r [ 0 ] ;b r e ak; c a s e 2 c o d e [ 2 ] I n f S t r [ 0 ] ; c o d e [ 3 ] I n f S t r [ 1 ] ; b r e ak ; f o r O 4 O 8 j c o d e [ j ] t F ’ c o d e [ 8 ] 0 ’ ; 4 结束语 本文介绍了一种 P L C 手持编程器的编译系统。 该编译系统在 AD S 1 .2开发软件上实现,在人机界面 输入 P L C 指令,经编译后生成以十六进制形式显示 的目标代码。通过实例测试 ,证明该系统能正确完成 将 P L C源代码指令表编译成 P L C主机能识别的二进 制机器代码 。 参考文献 [ 1 】 A n d r e w W A p p e 1 . 现代编译原理C语言描述[ M] E 京 人民 邮电出版社, 2 0 0 6 . [ 2 ]高金刚, 陈建春, 刘雄伟. 数控系统的软P L C系统开发[ .『 】 计算 机测量与控制, 2 0 1 0 , 1 2 3 2 5 4 . 2 5 6 . [ 3 ]姚远, 丑武胜, 陈友东, 等. 软P L C编程开发系统的设计和实现 [ J ] . 组合机床与自动化加工技术,2 0 0 6 6 1 4 1 8 . [ 4 ]4 陆林, 白瑞林. 一类 P L C的编译器的设计与实现[ J ] .微计算机 信息, 2 0 0 8 , 2 4 1 2 1 7 1 9 . [ 5 】方承远, 张振国. 工厂电气控制技术【 M】 匕 京 机械工业出版 社, 2 0 0 6 , 7 . Th e Co mp i l i n g S y s t e m’ S De s i g n f o r P LC Ha n d - He l d P r o g r a mme r We i Q i n g c h a o Ca i Qi z h o n g L i k e j i a n Xi e C o n g s e C o l l e g e o f E l e c t r i c a n d I n f o r ma t i o n E n g i n e e r i n g , G u a n g x i Un i v e r s i t y o f T e c h n o l o g y Abs t r a c t A h a n d h e l d p r o g r a mme r ’ S c o mp i l i n g s y s t e m i s d e s i g n e d b y s ma l l P r o g r a mma b l e Lo g i c Co n t r o l l e r b a s e d o n ARM a n d F P GA. T h i s p a p e r i n tro d u c e s t h e p r o g r a mm e r ’ S d e s i gn an d s o u r c e c o d e t o c o mp i l e an d s t o r e . Aft e r an a l y s e s o f mo r p h o l o g y , s y n t a c t i c a n d s e m an t i c ,c o d e o p t i mi z a t i o n a n d e rro r h a n d l i n g , P LC s o ur c e c o d e i n s t r u c t i o n l i s t p r o gr a m i s c o mp i l e d t o b e b i n a r y o b j e c t c o d e i d e n t i fi e d b y P L C h o s t . T h e p r o gram s a r e s t o r e d i n the f o r m o f an a r r a y a n d c h a i n t a b l e . T h r o u g h t h e t e s t , the s y s t e m c a l l c o rre c t l y c o mp i l e P L C i n s t r u c t i o n l i s t . Ke y W o r ds P L C I n s t r u c t i o n Li s t ; Co mp i l e ; S t o r e 作者简介 i 未庆超 ,男, 蔡启仲 ,男, 李克俭,女, 谢从涩 ,男, 98 95 9 6 98 年生 年生 年生 年生 硕士研 究生 , 硕士 ,教授 , 高级工程师 , 硕士研究生 , 研究方向过程控制与自动化装置。E ma i l wq c k h d 1 6 3 . c o m 研 究方 向嵌入 式系统与 自动化装置 。 副教授,研究方向电力电子技术与自动化装置。 研 究方 向过程控 制与 自动化装置 。 2 0 1 2 年第6 期自动化与信息工程 1 3
展开阅读全文