基于80C166单片机PEC服务的PROFIBUS-FDL从站协议实现
摘要:在详细分析西门子80C166单片机PEC服务工作机制和PROFIBUS-FDL帧格式的基础上,提出了基于该种单片机PEC服务机制的PROFIBUS-FDL从站协议的实现方法,并在实际工作中得到成功应用。
关键词:80C166 PEC服务 PROFIBUS-FDL
当前工业设备制造技术正向高性能、专用化、分布式、网络化方向发展。以前,大量使用PLC实现的控制系统,实践证明虽然安全可靠,但由于PLC本身的技术原因,很难达到更快速的实时控制要求它们正被高性能的嵌入式专用控制器替代。这种专用控制器的设计,可以进一步提高设备的控制性能;引入现场总线技术,保证专用控制器的系统可集成性,以适应当前分布式、网络化的应用趋势。
本文是在研制棒材生产线飞剪的专用控制器时涉及的一个子课题。为保证该控制器能与现有PLC网连接以及与远程操作站通信,在几乎不增加硬件的基础上,利用核心CPU——西门子80C166所具有的一个类似DMA的功能高效率地实现PROFIBUS-FDL从站协议。
1 西门子80C166单片机
80C166单片机是西门子C166系列16位嵌入式微控制器的第一代产品。其体系结构如图1所示。它结合RISC处理器的优点,克服了CISC处理器在嵌入式应用中的瓶颈;在25MHz时钟频率下,可达到12.5MIPS,几乎所有的指令执行时间小于80ns;在指令处理上,采用四级指令流水线管道结构;在存储管理上,统一线性地址空间可达256KB,具有段代码、页数据式管理机制;采用寄存器池,上下文切换时间只要80ns;16位乘法400ns,32位除法800ns,中断响应时间最慢400ns;外部事件控制器PEC服务具有类似DMA的功能,可实现存储器与外设之间的高速数据传输;丰富的在片外设:1KB RAM、10路A/D、76路I/O、7个定时器/计数器、16个比较/捕获单元、2个串行通信接口、在片的WATCHDOG等。
图1 西门子80C166体系结构
2 80C166的PEC服务
2.1 80C166的PEC服务机制
PEC是外部事件控制器的英文缩写。PEC服务是80C166提供的一种特殊数据传输机制。其目的是在原有的中断控制器基础上,用较小的硬件代价、尽可能少占用处理机周期实现内存与外部设备的快速数据交换类似DMA,但无需专用的DMA控制器。80C166有8路PEC服务通道。用PEC服务进行一次数据传输,仅占用处理机一个机器周期20MHz时100ns,且不影响当前程序的执行。
2.2 PEC服务的工作过程
通常,当普通中断事件发生时,系统将保存当前CPU状态PSW和程序的地址;然后,根据不同的中断源,进行上下文切换,装载相应的中断矢量,执行相应的中断服务程序;执行完后,恢复被中断程序的上下文,继续执行被中断程序。
对于某一PEC服务,它总是与一具体中断源、中断矢量或中断服务相联系。在80C166中,当一个中断的中断优先级为最高级14或15且定义了与之相关联的PEC服务通道时,该中断就具有PEC服务功能。这时,当该中断请求发生时,将不触发中断服务程序的执行,而是触发PEC服务。当PEC服务经过设定的若干次的外部事件触发后,再触发执行相应的中断服务程序(一个普通中断过程)。
javascript:window.open(this.src);" style="cursor:pointer;"/>
如图2所示。一次PEC服务的工作过程是由PEC控制寄存器定义的,其中计数位域(8位传送计数器)COUNT定义了PEC服务的数据传输次数;源指针、目的指针指明具体的数据传输来源和目的;PEC服务的数据传输过程完全由硬件执行:当中断请求发生时,由硬件将源指针所指单元的内容传给目的指针所指的单元,然后由PEC控制寄存器相应定义位控制是源指针还是目的指针增加1或2,同时COUNT值减1;当多次中断请求使COUNT减为0时,PEC服务完成,触发与之关联的中断服务程序。
2.3 PEC服务应用优势
以串口接收一帧16字节的数据为例。若采用传统的串口接收方式,每接收到一字节,产生一个中断;在中断服务程序中,要将它从串口接收缓冲器中取出,顺序放到帧接收缓冲区相应单元中;当接收满16字节后,进行帧处理。
如果采用PEC服务的方式,只要事先定义好PEC通道就可以了。首先,定义串口接收中断优先级为14或15以及与之相关联的PEC通道。即定义相应PEC通道控制寄存器为:COUNT为16字节传输,源指针为串口接收缓冲器,目的指针为帧接收缓冲区首址且每次传输完成后,目的指针加1。这样,串口每接收到一字节,将触发一次PEC服务,由硬件将数据从串口接收缓冲器中取出,顺序放到帧接收缓冲区相应单元中,但当前执行的程序并不被中断;当16字节完全接收完成后,触发串口接收中断服务程序,进行帧的处理。
与传统的串口接收方式相比较,PEC服务方式在进行数据传输时不中断当前程序的执行,因此节省了大量的上下文切换时间,处理机效率得到大大提高。
下面讨论采用80C166的PEC服务实现PROFIBUS-FDL从站协议的方法。
3 PROFIBUS-FDL帧结构分析
3.1 PROFIBUS-FDL帧结构
PROFIBUS帧的格式有多种形式,但对于从站来说,只要处理三种帧即可。
.无数据且长度固定的帧:
javascript:window.open(this.src);" style="cursor:pointer;"/>
.带数据域且长度固定的帧:
javascript:window.open(this.src);" style="cursor:pointer;"/>
. 带数据域且长度可变的帧:
javascript:window.open(this.src);" style="cursor:pointer;"/>
其中,各字段说明如下:
SD1:无数据帧的开始定界符,#10H;
SD2:可变长度帧的开始定界符,#68H;
SD3:固定长度帧的开始定界符,#A2H;
ED:结束定界符,#16H;
LE与LEr:LE与LEr相同,都表示长度占一个字节,它是DA+SA+FC+DATA-UNIT的字节数总和;
DA与SA:DA目的站地址与SA源站地址各占一个字节;
FCS:校验段,占一个字节,它采用不计进位的求和运算得到校验码。校验域为DA+SA+FC+DATA-UNIT;
FC:帧控制字字段,占一个字节;
SYN:同步字段,至少33空闲位(逻辑电平1),但仅在请求帧及令牌帧前出现,不允许在字符之间出现。
3.2 PROFIBUS帧结构的特点
从上面的帧格式可以看出帧的长度不固定。发送时,帧的长度是已知的;但接收时,帧的长度是未知的。因此,要提高接收效率,只能采用分段方式接收,随时解析和保存关键信息,并确定随后接收的字节数。
javascript:window.open(this.src);" style="cursor:pointer;"/>
4 PROFIBUS-FDL从站协议的PEC服务实现
PROFIBUS-FDL从站的数据接收及应答过程分三个阶段完成:第一阶段,帧的完整接收;第二阶段,根据接收到的FC帧控制字字段,判断主站正在进行怎样的数据请求;第三阶段,从站组织应答帧,启动帧的发送过程。
第二阶段的帧控制字处理请参考PROFIBUS标准的相关内容。对于第三阶段的组织和发送应答帧,由于数据长度和内容已知,只要定义好串口发送中断/服务,定义好相应的PEC通道:源地址为发送数据缓冲区首址+1、目的地址为串口发送缓冲器、COUNT域为发送字节数-1,将所要发送数据的第一个字节写入串口发送缓冲器,即可触发串口发送相关的PEC服务;当COUNT减为0时,触发串口发送中断服务子程序,完成串口数据发送过程。由于该过程实现简单,不作详细讨论。这里主要讨论第一阶段的帧完整接收实现过程。
从上面的帧结构分析可见,帧的长度是不固定的。因此,为提高接收效率,应用PEC服务分三步进行数据的批量接收。
4.1 第一步:帧头接收
首先,初始化时,定义串口接收PEC服务为连续接收三字节,用于接收帧的前三字节。
由第一个字符SDx(x=1,2,3)判断帧类型;对于不带数据固定长度帧和带数据固定长度帧接下来的两个字符是DA、SA,判断DA是否为本机地址;而对于带数据长度可变帧,接下来的两个字符是LE、LEr,判断其是否相等。
若以上判断都成立,则需定义下一次PEC服务的接收字符数:对于固定长度帧,定义PEC批量接收三字节数据,并保存DA、SA;对于可变长度帧,定义PEC服务接收四字节数据,转第二步;
若LE≠LEr或DA目的地址非本站地址,则重回到初始状态,进行帧头接收。
4.2 第二步:帧控制字接收
由于主站帧的连续发送,会再次触发PEC服务。由串口接收PEC服务连续接收三或四字节后,处理如下:
.不带数据固定长度帧,接收三字节,分别为FC、FCS、ED。对FCS和ED分别完成累加和校验与帧结束判断后,将帧控制字FC保存,转去执行帧控制字处理。
.带数据固定长度帧 接收三字节分别为FC和数据单元的前两个字节,保存FC,定义PEC服务接收后八个数据字节,转第三步。
.带数据可变长度帧,接收了四字节,分别为SD、DA、SA、FC。对SD再进行一次判断,之后判断DA是否为本机地址,保存DA、SA、FC,定义PEC服务接收余下的数据字节长度由LE确定,转第三步。
4.3 第三步:帧数据接收
当串口接收PEC服务连续接收八或更多的字节后,处理如下:
.带数据固定长度帧,接收八个字节,分别为余下的六字节数据和FCS、ED。在累加和校验与帧结束判断完毕后,转去执行帧控制字处理。
.带数据长度可变帧,接收了DATA-UNIT+2个字节,分别DATA-UNIT个数据字节和FCS、ED。在累加和校验与帧结束判断完毕后,进行协议要求的目的地址和原地址的地址扩展判断和保存,转去执行帧控制字处理。
4.4 串口接收中断服务子程序
以上三步都由串口接收中断服务子程序负责完成。每一步对应不同的处理状态。为提高程序的执行效率,用有限状态机实现。以1、2、3分别表示上述帧接收三个步骤,4表示帧控制字处理状态,其状态转换如图3。
采用这种协议实现方法,在最近研制的棒材生产线的飞剪控制器中运行效果良好。