目前工控领域中广泛使用的可编程逻辑控制器(ProgrammableLogicController)大概可以分为两类:传统PLC与软PLC。传统PLC由于自身存在一些不足,例如封闭的硬件体系结构,主要由几家厂商所垄断,而软PLC在开放性及低成本方面潜力巨大,目前欧美等很多西方国家已经把软件PLC作为一个重点对象进行研究开发。 传统PLC具有硬实时性,正因为如此它才能提供快速、确定而可重复的响应。另一方面,由于软PLC是基于PC而建立在一定的操作系统上,例如WindowsNT,而这并不是一个硬实时的操作系统,这使得以PC为基础的控制引擎实时性问题成为制约软PLC发展的主要因素之一。
针对软PLC在实时性方面的不足,本项目采用基于嵌入式处理器的控制方案,软PLC执行系统作为一个任务在控制器固件内。美国TI公司推出的C6000系列数字信号处理器(DigitalSignalProcessor)具有很高的处理能力,特别是为其TMS320C6000TM、TMS320C5000TM和TMS320C28xTM系列DSP平台所设计开发的一个尺寸可裁剪的实时多任务操作系统内核DSP/BIOS,提供抢占式多线程、硬件抽象、实时分析和配置工具,可实现实时线程调度与同步、主机与目标DSP间通信或实时监测。DSP是串行控制的,运算速度快。基于DSP/BIOS实时内核的PLC执行系统,具有相当好的实时性及稳定性。下面着重介绍其设计及实现方法。
1软PLC的设计规划
1.1软PLC的架构分析
由PLC执行系统控制的PLC程序划分为一级程序和二级程序,它们的执行周期不一致。一级程序每8ms执行一次,处理响应快的短脉冲信号,例如外部的操作面板信号和报警信号,在程序末尾自动给出结束标记END1。二级程序为一般的PLC指令,每8nms执行一次,n为第二级程序的分割数。在开始执行二级程序时,PLC执行系统模块会根据执行程序所需要的时间自动把二级程序分割成n块,每个8ms只执行其中一块,并在二级程序结束时自动给出结束标记END2。
1.2PLC执行系统的工作原理
PLC采用循环扫描方式工作,首先进行系统初始化,然后进入循环工作过程包括输入采样、PLC指令执行及输出刷新几个阶段.
1)系统初始化:在循环执行PLC程序前,首先要进行执行系统的初始化,包括参数的输入及变量初值的设置;2)输入的采样:每次执行PLC程序时,要读取外部输入状态至缓冲区中,以备后面程序查询;3)执行用户PLC程序:执行用户程序,就是CPU从PLC程序的首地址开始按顺序逐个执行编译后的PLC指令,过程结果暂存在相应的寄存器内;4)输出的刷新:执行完用户程序后,需要把处理后需要输出的结果进行外部输出。由于PLC控制的对象大都是变化缓慢的信号,而PLC每次扫描输入和逻辑运算的时间很短,本PLC执行系统设定为每执行一个循环,就进行一遍输出的刷新。1.3DSP/BIOS的线程调度
文中的PLC执行系统的开发均在TI公司提供的集成开发环境CCS(CodeComposerStudio)中进行,CCS不仅集成了常规的开发工具,如源程序编辑器、代码生成工具及调试环境,还提供DSP/BIOS开发工具。DSP/BIOS是一个精简的实时操作系统内核,具有实时操作系统功能。它提供抢占式多线程,支持多种不同优先级,每种线程都有不同的执行和抢占特性,分别是硬件中断(HWI)包括时钟函数(CLK)、软件中断(SWI)包括周期函数(PRD)、任务线程(TSK)、后台线程(IDL)。线程类型的选取原则:HW1只用来处理对时间要求苛刻的关键任务;SWI用来处理相对独立的函数,如果算法要求比较复杂则使用TSK。TSK提供了很多任务通信和同步的手段,并且拥有自己独立的堆栈,因此比SWI更灵活。IDL用于执行与时间无关的非关键任务。
在DSP/BIOS线程调度中,硬件中断与软件中断的高优先级线程可以暂停运行中的低优先级任务,而高优先级的任务线程必须用特定的API才能抢占当前运行的低优先级任务线程,且只有任务线程才能暂停状态。基于PLC执行是一个循环执行过程,且与其它运动线程有复杂的通讯交互,本执行系统将其建立为一任务线程,由DSP/BIOS实时操作系统进行调度。2PLC执行系统的具体实现
2.1数据结构定义
1)PLC指令代码数据结构的定义。PLC用户程序在系统内部以一定的二进制格式存放,采用如下指令开辟一个a字节的内存区存放编译后的PLC指令代码,内存区大小a根据实际情况设定。
long*plc_pt;
plc_pt=(long*)malloc(a);
2)PLC执行指令结构体的定义。PLC指令代码主要包含内容为指令类型及变量地址,定义如下PLC执行指令结构体:
structplc_code_type//PLC执行指令结构体
{
unsignedcharcode_type;//指令类型
unsignedshortptaddr;//变量地址
:28px;background-color:rgb(255,255,255);">};
由此,在初始化时定义一个pk_code_type类型的指针直接指向PLC指令代码区.在进行PLC指令解析时,可直接移动该指针进行指令解析并输出。
2.2PLC指令解析
PLC执行系统的一个关键问题在于PLC指令的解析,利用DSP的C语言,建立相应的PLC指令的执行函数库。PLC用户程序可看成由多段执行块组成,每个执行块包括条件指令及执行指令。下面分为条件指令解析及执行指令解析来进行描述。
2.2.1条件指令解析
首先定义一个变量来保存条件指令解析结果,以便在解析执行指令时根据此条件指令解析结果进行执行指令处理。
例如常开触点(LD)可以用如下函数实现:
voidplcLD(plc_code_type&pc)
//pc表示当前指令在用户程序中的指针位置
{if(1==pc->pt_addr)//指令获取的地址为1
{
plc_result&=0x01;//闭合状态置位
}
}
2.2.2执行指令解析
执行指令则根据当前执行块条件指令结果来判断对元件地址进行相应处理。例如置位指令(SET)可以用如下函数实现:
voidplcSET(plc_code_type&pc)
{if(plc_result&1)
//判断条件指令,闭合,有输出
{
pc->pt_addr|=0xff;//对应地址置位
}
}
这样,逐个对PLC执行块进行解析,输入和输出单元的刷新同样利用函数来实现,最后通过输出口送出控制量,实现对用户PLC程序的执行控制。
ground-color:rgb(255,255,255);">2.3PLC执行系统运行流程
|