邹莉
(安徽国防科技职业学院,安徽六安237011)
随着计算机技术、微处理器技术、控制技术、通信技术的飞速发展,传统PLC的弊端日益凸显出来,由于各PLC生产厂家所采用的软硬件各不相同,组态、编程开发方法、寻址方式等都千差万别,导致其技术专有性很强,使用者要经过很长的时间才能熟练掌握一种PLC的开发方法,这给使用PLC的人带来了困难[1].
随着国际标准IEC61131的制定,出现了软PLC,解决了传统PLC兼容性差的问题.所谓软PLC,就是在PC机上用软件来实现传统硬件PLC的控制、存储、计算等功能,即将PLC的功能封装在软件内运行于硬件平台上.它具有良好的人机界面,能高速处理数据,具有强大的网络通信能力,有效利用了PC的各种技术,硬件配置灵活.如果将软PLC运行于嵌入式硬件平台就形成了嵌入式软PLC.
本文所设计的嵌入式软PLC采用ARM嵌入式处理器,具体选用Samsung公司ARM7TDMI内核的S3C4510芯片,采用16 MB的SDRAM,2 MB的Flash存储器,配有通信串口和以太网接口;选用UCLinux作为操作系统,为了增强其实时性,增加一个实时内核模块RTAI,在需要处理实时任务时,将其加载进来,形成RTAI和UCLinux双内核方案;采用基于ModBus/TCP协议的工业以太网通信.该软硬件平台能很好地满足嵌入式软PLC设计的需要.
基于嵌入式硬件平台的软PLC系统一般包括开发系统和运行系统两部分[2].IEC61131标准规定的5种编程语言首先在开发系统的编辑平台上完成程序编辑,然后在编译器中经过词法分析、语法分析、语义分析,生成目标代码,同时仿真模块为检查程序的运行结果正确与否提供调试环境,接着通过开发系统和运行系统的通信接口,目标代码被下载到运行系统.运行系统是整个设计的核心部分,它执行目标代码,进行输入信号的处理,然后其I/O接口与外围设备层的I/O子系统进行通信,将控制信号输出,实现控制目的.系统的体系结构框图如图1所示.
图1 系统体系结构Fig.1 System structure diagram
2.1.1 编辑界面 IEC61131国际标准规范了5种编程语言:梯形图(LD)、顺序功能图(SFC)、功能块图(FBD)、指令表(IL)、结构文本(ST)[3].其中梯形图语言接近于电气控制电路图,直观、简单、易懂,所以,本文采用梯形图作为用户开发语言.
Qt/Embedded是图形化界面开发工具Qt的嵌入式版本,其运行效率较高,采用面向对象编程,具有良好的体系结构和编程模式.本文采用Qt编写界面,图2为梯形图编辑器界面.
图2 梯形图编辑器Fig.2 Ladder diagram editor
2.1.2 类及继承关系设计 采用面向对象的设计思想,将梯形图中的对象安装其性质和功能分为梯形图类(LadLadder)、程序段类(LadProgram)、梯级类(LadRung)和基类(LadElement)[4].基类是一个抽象类,为梯形图语言各种元素的总体接口,其元素包含单个图元和逻辑块,通过对梯形图图元和逻辑块的分析,发现它们各自有一些共同属性,将其归为图元类的基类(LadderCell)、逻辑块的基类(LadderBlock),再以图元类的基类为基础,派生出简单图元类(如常开触点、常闭触点、输出线圈)和复杂图元类(如定时器、计数器),具体的图元对象作为它们的继承子类.类结构如图3所示.
图3 类结构Fig.3 Class diagram
2.1.3 数据结构设计 梯形图的整个编辑过程是一个动态的过程,行数、列数、每行的图元数、图元类型都是未知的,而双向链表是一种动态的数据结构,所以,用双向链表形式的数据结构最适合存储梯形图.
对梯形图的编辑、数据加载、数据处理等都是通过遍历或改变数据结构等操作来实现的.比如,添加一个梯形图图元时,只需要在内存中建立相应的对象,并调用链表的AddHead或AddTail函数加入该对象的指针;删除一个梯形图图元时,就调用RemoveHead或RemoveTail函数移除该对象的指针[5].
2.2.1 LD向IL的转换 梯形图编辑起来非常直观,但编译起来难度较大,而指令表语言近似于汇编语言,容易实现编译,所以,一般先将梯形图转换成指令表.将LD的元件映射成AOV有向图的顶点,元件间的前驱后继关系即连线,映射成AOV有向图的弧.
首先,将母线映射成顶点x0,然后对除母线以外的部分从左至右、从上至下进行扫描,映射出相应的顶点和弧,其映射的关键是找到每个节点的后继节点并生成弧.如图4的梯形图可映射成图5所示的AOV有向图.
图4 梯形图Fig.4 Ladder diagram
图5 AOV有向图Fig.5 AOV diagram
AOV有向图只能反映各元件的前驱后继关系,而不能反映出串并联关系,因此需要对AOV图再次进行扫描.每次扫描可以确定一个元件的串并联关系,并更新AOV图,下次扫描又在新AOV图的基础上进行,周而复始,直至所有元件的串并联关系确定完成,扫描结束,自底向上建立起一棵逻辑树,该逻辑树可以清晰反映各元件的逻辑关系[6].由于篇幅有限,就不作详细分析.
图6为图5对应的逻辑树,该图还可进行化简.
图6 逻辑树Fig.6 Logic tree
对化简后的逻辑树进行遍历就能快速生成指令表了.
2.2.2 分析过程 编译器的分析部分包括词法分析、语法分析和语义分析.本文采用Windows操作系统下的自动生成软件Flex和Bison相结合的方法,来实现词法分析和语法分析.
Flex生成词法分析程序,它的文件中包含正则表达式和每个表达式被匹配时所表现出的动作.它接受指令表源程序,根据词法规则逐一对各个字符进行扫描,生成单词存放在yytext[]字符数组中,随后将其传递给语法分析程序.
Bison生成语法分析程序,根据指令表语法规则识别出语法单位,并判断输入的单词序列是否构成语法上的错误程序.
接下来是语义分析,检查源程序是否有语义等错误,将其保存在字符串数组err[]中,并收集类型信息供后面生成代码使用.
2.2.3 生成中间代码策略 经编译后产生的目标代码一般有两种存在形式,机器码形式和内存形式的数据码形式.机器码的硬件相关性太强,而内存形式的数据码不能复用,各有缺点,因此,设计出一种中间码方案.该中间码具有指定的格式,并以文件的形式存在,可以复用,要想使中间码能在多种机型的下位设备中使用,就必须在下位设备中嵌入中间码解释器.这种解释器是根据下位设备的硬件环境,使用相关的高级语言设计开发出来的,它的机器码是硬件相关的,而中间码与CPU的类型无关.这样,源码无需任何改动,只需编译成中间代码,下载到各种类型的下位设备中,经该机型的中间码解释器解释,即可生成所需的C/C++目标代码.如图7所示.
图7 生成目标代码顺序图Fig.7 Generating object code sequence diagram
运行系统是嵌入式软PLC的核心部分,它完成输入读取、程序执行、输出处理等工作.首先通过I/O口和现场总线读取现场采集信号,将其写入输入映像区,再根据输入映像区信号,执行目标代码,并将结果写入到输出映像区,最后将输出映像区的数据通过I/O口和现场总线输出,完成控制功能[7].
嵌入式软PLC的运行系统采用模块化的设计结构,主要包含通信模块、虚拟机模块和I/O驱动模块三部分[8].所谓虚拟机就是一整套规则定义的软件程序,能模拟实际计算机进行工作,取出并执行指令,完成计算、数据处理等任务.虚拟机的使用可提高操作系统的安全性,也可增强基于虚拟机之上的应用程序的安全性,同时,实现了计算机程序的跨平台使用.通信模块完成运行系统与开发系统的数据交换.
虚拟机的实现主要有以下几个步骤:
(1)开发系统将运行系统激活;
(2)在开发系统中编辑梯形图程序,经过词法分析、语法分析、语义分析编译产生中间代码形式的PLM文件;
(3)翻译梯形图指令,建立宏汇编库;
(4)利用匿名管道机制,运行系统接收并打开PLM文件;
(5)调用宏汇编库,运行内核解释执行PLM文件,经过一系列转换生成机器码,从而产生可执行的C文件;
(6)创建机器码运行环境,将C文件放入嵌入式操作系统中执行.
现要在一台数控车床上手动和自动实现三坐标轴的正反向运动和停止,能自行设定运动速度,多三轴进行限位控制,产生越位报警等控制功能.
采用模块化的程序设计方法,由主程序调用各个程序模块,由于篇幅的限制,以下只给出了控制机床和主轴运动的目标代码.
//==net 1
strcpy(m_statement.m_basicorder.address[0],"LI0.7");
m_statement.m_basicorder.funcname=INSTRUCTION_InBit;
p_execute->pstru_funclist->insertAtBack(m_statement);
strcpy(m_statement.m_basicorder.address[0],"PI2.7");
m_statement.m_basicorder.funcname=INSTRUCTION_AndInNOBit;
p_execute->pstru_funclist->insertAtBack(m_statement);
……
//==net 40
m_statement.m_basicorder.funcname=INSTRUCTION_MainProEnd;
p_execute->pstru_funclist->insertAtBack(m_statement);
将整个目标代码传给运行系统,数控车床能按要求正常工作.图8为数控车床的电机在运行中的波形图.
图8 电机参数波形Fig.8 Motor parameters of waveform graph
可以看出,启动时的最大电流为55 A,调整时间为54 ms,稳定值为8 A,测试数值与要求的数值接近,证明生成的目标代码是正确的,验证了该嵌入式软PLC系统的可用性.
该嵌入式软PLC具有友好的人机界面,采用梯形图语言作为开发语言,实现了传统PLC的功能,开发周期短,成本低,具有很好的网络通信能力和数据处理能力.
本文将梯形图转换成指令表,对其进行各种分析后,采用中间代码策略,在下位设备中用高级语言开发出中间码解释器,生成目标代码,实现了软件的硬件设备无关性,提高了程序的可移植性,适用于各种机型的下位设备.实验证明,目标代码经运行系统调用,能满足控制要求.
[1]张涛,李迅波.软PLC的转换中间语言模型的建立于研究[J].微计算机信息,2007,23(12):4-6.
[2]姜娟,冯萍,康继昌.嵌入式软PLC开发系统研究[J].科学技术与工程,2011,11(3):494-498.
[3]毕辉,程良鸿.关于软PLC梯形图向语句表转换方法的研究[J].微计算机信息,2007,23(9):63-65.
[4]陈雪,刘荫忠,杨东升.Linux环境下软PLC开发系统的设计与实现[J].组合机床与自动化加工技术,2010(11):40-43.
[5]安静.嵌入式软PLC编程系统的设计[J].电气传动自动化,2010,36(6):33-37.
[6]石锐,周雷,杨正益.软PLC梯形图到语句表转换新策略的研究[J].计算机工程与应用,2010,46(18):244-248.
[7]赵瑞霞,周世鹏.基于ARM的软PLC实现方案[J].可编程控制器与工厂自动化,2010(4):34-38.
[8]陈佳,刘林林,熊伟,等.基于工业PC的软PLC的设计与实现[J].工业控制计算机,2009,22(1):5-6.