嵌入式系统硬件平台的软件PLC实现方法
时间:04-12
来源:作者:南京航空航天大学 张少坤 游有鹏 王荣
点击:
2.2.1 Lex&Yacc简介
Lex 8L Yacc是美国贝尔实验室用C语言研制的词法分析程序和语法分析程序的自动生成工具,是目前使用最广泛的编译软件之一。Lex是词法分析程序生成器,Yacc是语法分析程序生成器。它们可以根据用户提供的词法、语法规范文件,自动转化为多种高级语言源代码,如C或C++等。
2.2.2 编译器总体结构
所谓"遍",是对源程序或其等价的中间语言程序从头到尾扫描并完成规定任务的过程。本系统的编译过程包含三遍,分别进行词法分析、语法分析和代码转换。
2.2.3 词法分析器设计
指令表源程序可以简单地被看成一个多行的字符串。词法分析器从上到下、从左到右逐个字符地对源程序进行扫描,产生一个个单词符号,把字符串的源程序改造成为单词符号串的中间程序,用于随后的语法分析。
本系统的词法分析器有两种工作状态:一是从头到尾对源程序进行扫描,检查出所有的词法错误;二是当没有词法错误时,从头到尾对源程序进行扫描,将识别出的单词符号输入给语法器。
2.2.4 语法分析器设计
(1)PLC指令表语言的语法描述
分析PLC指令程序结构,提取隐藏在指令代码中的结构信息,这种信息中往往会有操作指令被隐含地表达出来。例如:指令OR/0RB与梯形图中的并联结构对应,而AND/ANB则与梯形图中的串联结构对应。
部分PLC指令语句的文法用巴科斯范式描述如下:
按照yacc的语法规则,对应于巴科斯范式描述写出yacc源程序后,用"yacc-dv plcil.y"指令转换成语法分析器的C语言源程序yyparse。
(2)将PLC指令表转换为二进制代码
PLC指令表源程序的二进制文件格式为:每条指令的二进制编码占32位,操作符的编码与元件编码相加作为目标代码的高16位,低16位为元件的编号。例如,操作符LD的编码为0xFF00,元件X的编码为Ox01,指令LD X1的编码为0xFF010001。
指令表编译器的代码转换功能由yacc源程序规则的动作部分来实现。当语法分析器识别出一条完整的指令时,就将其对应的二进制代码保存到文件中。
(3)将PLC指令表转换为树形结构
Yacc语法分析程序通过寻找可以匹配目前为止所看到的标记的规则来工作。Yacc处理语法分析程序时创建了一组状态,每个状态都反映一个或多个部分地被分析的规则中的一个可能的位置。当语法分析程序读取标记时,每次它读取一个没完成规则的标记,就把它压入内部堆栈中并切换到一种反映它刚刚读取的标记的新状态。这个动作称为移进(shift)。当它发现组成某条规则右侧的全部符号时,它就把右侧符号弹出堆栈,而将左侧符号压入堆栈中,并且切换到反映堆栈上新符号的新状态。这个动作成为规约(reduction)。当yacc规约规则时,它都执行与这条规则有关的用户代码。
利用堆栈的思想实现指令表语言向梯形图树形结构的转换。自定义一个栈Stack,可以压入和弹出指向Lad-derElement类型的对象的指针。在进行代码转换时,栈Stack动作与语法分析栈的动作不同。当yacc解析到如LD/LD1、AND/ANI等含有元件的指令语句时,将这些指令中的元件入栈(如上述代码中的B、C行),逻辑块的构造在其对应的语法规则的动作部分实现。
2.3 执行模块的设计与实现
2.3.1 逻辑运算算法推导
下面列一段简单的PLC程序来介绍逻辑运算算法的推导过程:
①LD X1
②0R X6
③ORI M1
④OUT Y5
⑤LDI Y5
⑥AND X7
⑦OR M2
⑧ANI X10
⑨0RI M3
⑩OUT M4
⑩END
定义0R、ORI、ORB的或操作为加法"+",AND、ANI、ANB的与操作为乘法"*",取反操作为"[]"。则上述程序清单中的输出Y5和M103分别等于:
上式的所有运算符只会连接两个变量或者一个变量和一个表达式。由于扫描过程是顺序执行的,因此可以为上述计算过程建立计算堆栈。建立递增的堆栈,则计算过程和堆栈中的数据变化如表1所列。
2.3.2 执行模块的实现
本系统的执行模块是由RTLinux的实时线程模块来实现的,它运行于内核态。系统开机立即加载执行模块,并将PLC的二进制代码从文件中复制到共享内存中,执行模块解释共享内存中的PLC指令表的二进制代码,按照用户输入的逻辑,完成开关量的控制,工作流程如图8所示。
3 小 结
嵌入式软PLC最突出的特点是,借助于嵌入式系统的硬件平台用软件的方法实现标准PLC的功能,代替专用控制器,结构开放,开发周期短、成本低,具有良好的应用前景。虽然文中PLC指令采用的是日本三菱公司FX2N可编程控制器系列指令,但是只需稍作修改即可用于其他厂商的产品。目前该嵌入式软PLC已成功应用于数控铣床中,完全满足控制要求。
Lex 8L Yacc是美国贝尔实验室用C语言研制的词法分析程序和语法分析程序的自动生成工具,是目前使用最广泛的编译软件之一。Lex是词法分析程序生成器,Yacc是语法分析程序生成器。它们可以根据用户提供的词法、语法规范文件,自动转化为多种高级语言源代码,如C或C++等。
2.2.2 编译器总体结构
所谓"遍",是对源程序或其等价的中间语言程序从头到尾扫描并完成规定任务的过程。本系统的编译过程包含三遍,分别进行词法分析、语法分析和代码转换。
2.2.3 词法分析器设计
指令表源程序可以简单地被看成一个多行的字符串。词法分析器从上到下、从左到右逐个字符地对源程序进行扫描,产生一个个单词符号,把字符串的源程序改造成为单词符号串的中间程序,用于随后的语法分析。
本系统的词法分析器有两种工作状态:一是从头到尾对源程序进行扫描,检查出所有的词法错误;二是当没有词法错误时,从头到尾对源程序进行扫描,将识别出的单词符号输入给语法器。
2.2.4 语法分析器设计
(1)PLC指令表语言的语法描述
分析PLC指令程序结构,提取隐藏在指令代码中的结构信息,这种信息中往往会有操作指令被隐含地表达出来。例如:指令OR/0RB与梯形图中的并联结构对应,而AND/ANB则与梯形图中的串联结构对应。
部分PLC指令语句的文法用巴科斯范式描述如下:
按照yacc的语法规则,对应于巴科斯范式描述写出yacc源程序后,用"yacc-dv plcil.y"指令转换成语法分析器的C语言源程序yyparse。
(2)将PLC指令表转换为二进制代码
PLC指令表源程序的二进制文件格式为:每条指令的二进制编码占32位,操作符的编码与元件编码相加作为目标代码的高16位,低16位为元件的编号。例如,操作符LD的编码为0xFF00,元件X的编码为Ox01,指令LD X1的编码为0xFF010001。
指令表编译器的代码转换功能由yacc源程序规则的动作部分来实现。当语法分析器识别出一条完整的指令时,就将其对应的二进制代码保存到文件中。
(3)将PLC指令表转换为树形结构
Yacc语法分析程序通过寻找可以匹配目前为止所看到的标记的规则来工作。Yacc处理语法分析程序时创建了一组状态,每个状态都反映一个或多个部分地被分析的规则中的一个可能的位置。当语法分析程序读取标记时,每次它读取一个没完成规则的标记,就把它压入内部堆栈中并切换到一种反映它刚刚读取的标记的新状态。这个动作称为移进(shift)。当它发现组成某条规则右侧的全部符号时,它就把右侧符号弹出堆栈,而将左侧符号压入堆栈中,并且切换到反映堆栈上新符号的新状态。这个动作成为规约(reduction)。当yacc规约规则时,它都执行与这条规则有关的用户代码。
利用堆栈的思想实现指令表语言向梯形图树形结构的转换。自定义一个栈Stack,可以压入和弹出指向Lad-derElement类型的对象的指针。在进行代码转换时,栈Stack动作与语法分析栈的动作不同。当yacc解析到如LD/LD1、AND/ANI等含有元件的指令语句时,将这些指令中的元件入栈(如上述代码中的B、C行),逻辑块的构造在其对应的语法规则的动作部分实现。
2.3 执行模块的设计与实现
2.3.1 逻辑运算算法推导
下面列一段简单的PLC程序来介绍逻辑运算算法的推导过程:
①LD X1
②0R X6
③ORI M1
④OUT Y5
⑤LDI Y5
⑥AND X7
⑦OR M2
⑧ANI X10
⑨0RI M3
⑩OUT M4
⑩END
定义0R、ORI、ORB的或操作为加法"+",AND、ANI、ANB的与操作为乘法"*",取反操作为"[]"。则上述程序清单中的输出Y5和M103分别等于:
上式的所有运算符只会连接两个变量或者一个变量和一个表达式。由于扫描过程是顺序执行的,因此可以为上述计算过程建立计算堆栈。建立递增的堆栈,则计算过程和堆栈中的数据变化如表1所列。
2.3.2 执行模块的实现
本系统的执行模块是由RTLinux的实时线程模块来实现的,它运行于内核态。系统开机立即加载执行模块,并将PLC的二进制代码从文件中复制到共享内存中,执行模块解释共享内存中的PLC指令表的二进制代码,按照用户输入的逻辑,完成开关量的控制,工作流程如图8所示。
3 小 结
嵌入式软PLC最突出的特点是,借助于嵌入式系统的硬件平台用软件的方法实现标准PLC的功能,代替专用控制器,结构开放,开发周期短、成本低,具有良好的应用前景。虽然文中PLC指令采用的是日本三菱公司FX2N可编程控制器系列指令,但是只需稍作修改即可用于其他厂商的产品。目前该嵌入式软PLC已成功应用于数控铣床中,完全满足控制要求。
- 基于DSP的宽带雷达多片流水分段脉压处理平台设计(08-02)
- 基于MCU+DSP的运动控制硬件平台设计(10-01)
- 基于DSP/CPLD的嵌入式仪表硬件平台(06-05)
- ARM硬件平台上基于UCOS移植Lwip网络协议栈(11-20)
- 智能终端软硬件平台设计(06-14)
- 基于G4平台的嵌入式VxWorks系统在雷达信号处理中的应用(04-06)