基于uCOS_的MODBUS协议的实现

  • 格式:pdf
  • 大小:195.80 KB
  • 文档页数:3

《装备制造技术》2009年第1期M odbus 协议是应用于电子控制器上的一种通用语言。

通过此协议,控制器相互之间及控制器经由网络与其他设备之间,可以进行通信。

M odbus 协议简单易理解,使用广泛,已经成为行业通用工业标准。

目前,基于ARM 的嵌入式控制器已经广泛应用,在这些嵌入式控制器上实现M odbus 协议,对于系统联网通信具有很重要意义。

uCOS_II 是一种可移植、可剪裁及可剥夺型的多任务实时内核(RTOS ),它提供了时间管理和信号量、消息邮箱、消息队列等任务间同步和通信的机制。

利用该内核的这些机制,设计实现M odbus 协议,可以大大提高系统的实时性和稳定性,并且易于使用。

M odbus 协议是主—从协议,仅一个主站(在同一时间)连接在总线上,一个或多个从站节点也连接在相同的串行总线上。

对采用M odbus 协议进行通信的控制器,在系统中主要配置为从站,对应与CS 模型中的服务器端,令主站实现机制与从站相类似,因此本文只详细论述M odbus 的从站协议的实现。

1Modbus 协议描述M odbus 协议是一个两层协议,对应与ISO 分层模型中的链路层和应用层。

M odbus 协议定义了一个独立于底层通信层的简单协议数据单元,在用于特定总线和网络上时,引入一些附加的域,从而构成应用数据单元。

M odbus 协议数据帧结构如图1所示。

其中,有效的从设备地址分配范围是1~247,功能码指示从站要执行何种操作,功能码之后是包含请求和回应参量的数据域,错误校验是报文内容执行冗余校验计算后的结果。

其中,校验计算根据采用的是RTU 或是ASCII 传输方式而分别选择CRC 校验或LRC 校验。

2Modbus 协议从站的实现从数据流的处理过程上分析,从站的实现分为链路层和应用层两个部分。

链路层负责接收字节信号,并判断是否接收完完整的数据帧数据,当接收完一帧数据时,链路层部分程序就向应用层发送一个信号量,进而应用层对数据帧进行处理。

另外,应用层处理完功能码要求之后,要反馈信息给主机,将信息发送给主机过程部分,也属于链路层实现功能。

因此,如何判断一帧数据接收完成和根据数据帧内容执行应用层功能,就是协议实现的最关键之处。

下面以周立功公司的EasyARM 2131硬件平台为例介绍其具体实现。

2.1EasyARM2131简介EasyARM 2131采用PHILIPS 公司基于ARM 7TDM I —S 核、单电源供电和LQFP64的LPC2131。

LPC2131拥有两个符合550工业标准的异步串行口(UART ),可以通过查询和中断两种方式收发数据,板上已经具有RS-232转换电路,可以直接与PC 机通信。

LPC2131还带有两个32位可编程定时/计数器2.2数据链路层的实现本层的目的仅为下一层应用层提供接收到的帧数据,接受到一帧数据后,发送多值信号量给帧数据处理任务。

为了保证接收数据能力,使用环形队列数据帧缓冲区,当每接收到一帧数据,就发送一次信号量。

数据CRC 校验由应用层负责,这样可以提高接收效率。

环形队列数据帧的结构如下:typedef struct{uint8OneFrame[M BS_ONE_FRAM E_NUM];//接收帧保存数组uint8OneFrameNum;//接收字节数}M BS_ONE_FRAM E;//数据帧的结构typedef struct{M BS_ONE_FRAM E RxBuffer[M BS_BUF_SIZE];M BS_ONE_FRAM E*RxFrameIn;//帧入口指针基于uCOS_II 的MODBUS 协议的实现方羽,梁广瑞,罗覃东(广西机电职业技术学院电气工程系,广西南宁530007)摘要:介绍了modbus 协议,并以EasyAR M2131为硬件平台,在uCOS_II 系统上按照网络分层思想逐层实现R TU 传输模式下modbus 从站协议栈的过程。

通过与组态王、力控组态软件通信连接,表明该实现实时性好、性能稳定。

关键词:uCOS_II ;Modbus 协议;信号量;组态软件中图分类号:TP316.2文献标识码:B文章编号:1672-545X (2009)01-0083-02收稿日期:2008-10-12基金项目:广西机电职业技术学院院级项目资金资助基于模糊控制算法的嵌入式中央空调控制器的研究[2006]07号作者简介:方羽(1977—),男(壮族),广西武鸣人,讲师,硕士,教师,研究方向:嵌入式技术、电力电子技术、先进控制算法。

地址功能码数据错误校验图1Modbus 帧结构M BS_ONE_FRAM E*RxFrameOut;//帧出口指针M BS_ONE_FRAM E*RxBufStart;//缓冲区起始地址M BS_ONE_FRAM E*RxBufEnd;//缓冲区未地址uint8RxFrameEntry;//进入缓冲区帧数}M BS_RX_BUF;//接收缓冲区数据结构M odbus 协议中,帧数据完整与有效的判断,是通过字节接收时间间隔来完成的。

如果两个字符之间的空闲间隔大于1.5个字符时间,那么认为报文帧不完整,应该丢弃这个报文帧。

如果两个字符之间的空闲间隔大于3.5个字符时间,则表示一帧已经结束,后一字符为后续帧第一个字符数据。

因此链路层主要由两个中断来负责,一个是UART 中断,负责字节信号的发送与接收,另一个是定时器中断1(定时器中断0已经用于操作系统内核调度),负责判断数据帧的有效与完整,其中定时器中断1中具有4路比较匹配中断,分别用3路比较匹配来定时1.5个字符时间、3.5个字符时间。

接收数据中的两个中断程序流程图分别如图2和图3所示。

2.3应用层的实现M odbus 应用层的实现对应于uCOS_II 中的一个任务,该任务的优先级根据系统的实时性要求来指定。

该任务完成的工作如下:在任务循环开始处等待接收数据帧发送完成的信号,接收到信号量之后,进入对数据的处理,依次是功能码处理、错误处理、发送反馈信息等。

任务流程图如图4所示。

M odbus 功能代码的处理使用下面的处理数组来实现。

这样就可以方便管理要实现的功能代码。

typedef struct{uint8Code;//功能代码uint8(*Function)(M BS_ONE_FRAM E*ptr);//指向该功能码处理函数}M BS_CODE_FUNCTION_ARRAY;//功能代码函数数据结构下面是数组定义的一部分:M BS_CODE_FUNCTION_ARRAY M BSCodeFuncArray [M BS_M AX_FUNCTION]={{0x01,M BSReadM ultiCoils},//读线圈{0x02,FSReadDiscreteInputs},//读离散量输入……}因此只要定义好功能代码函数并在应用层任务中添加下面代码,就可以实现功能代码的处理。

……for(i=0;i<M BS_M AX_FUNCTION;i++){//查询有效的功能代码if(M BSCodeFuncArray[i].Code ==*(ptr->OneFrame+1)){return M BSCodeFuncArray[i].Function(ptr);//调用该功能代码的处理函数}}……3结束语本实现已经与组态王、力控等组态软件无缝通信,并应用在中央空调嵌入式控制系统中。

运行结果表明该协议的实现可靠,能满足系统实时性的要求,并且易于使用。

其创新点是:从数据接收到数据处理的过程,基于实时内核uCOSII 的信号量机制,应用层实现使用一个任务来完成,能根据系统实时性的要求来改变任务优先级,因此系统具有很高的实时性。

数据帧长度是否超过规定长度?字节中断来缓冲区是否已满?是是否否把接收字节放入缓冲区开始1.5个字符中断计时中断退出处理放弃本帧数据图2UART 接收字节中断处理流匹配1.5个字符时间中断来关闭1.5个字符中断计数地址是否有效?CRC 校验是否通过?开始3.5个字符中断计时中断结束出口匹配3.5个字符时间中断来关闭3.5个字符中断计数调整帧入口指针发信号量给任务处理该帧中断结束出口是是否否图3T1.5、T3.5字符中断处理程序流程图等待有效帧信号量调用功能代码处理函数是否是广播帧?是是成功处理该帧?否否封装应答帧封装错误应答帧触发发送中断调整帧出口指针图4应用层任务流程图(下转第94页)进行检测,看其是否符合要求。

还可根据每种阀片上阀杆孔磨损的程度,来决定修理的方法,若有多台同型号的旧阀,可在几台之间进行检测和调配。

修后的阀,应在试验台上进行试验,也可将阀平放,在上面的两个孔中加满煤油,用秒表测量其油液泄漏的速度,以判断阀的密封程度。

(5)液压缸的修理。

液压缸内泄和外漏的原因:一是活塞杆(或柱塞)表面磨损严重或拉出沟痕,可用电镀或金属刷镀的方法修理;二是导向套的内表面磨损,因导向套价格较低,一般都是进行更换;三是液压缸缸体本身磨损严重或拉出深沟,或在缸体内壁上出现气蚀区域,这也可用刷镀工艺进行修复;四是活塞上密封胶圈磨损,此时更换即可。

内泄和外漏,都会使液压缸自动回缩,对装在车上的液压缸有3种检查方法:一是用百分表,将磁力表座吸附在液压缸活塞杆上,表针抵在缸筒的端面上,观察表针在发动机熄火15min (包括下面两种方法)前后的变化值,即是液压缸的回缩量;二是在伸出的活塞杆上用黄油粘上一条纸片,测量纸片上端至液压缸端部距离的变化量,也即是液压缸的回缩量;三是用一个可松开和锁紧的橡胶板锁紧在活塞杆上,测量方法与用纸片的测量方法相同。

上述检测方法,也是判断液压缸是否内泄及其程度的方法。

根据所测液压缸的回缩量,可以较精确地推算出活塞上密封件的磨损程度和设备的使用时间,若使用的时间很短,则可断定其密封是由于装配方法不当损坏的;这对于纠正错误的装配方法和判断液压缸内泄程度是非常有用的。

(6)清洗液压系统,过滤液压油。

液压油污染,是工程机械出现故障的主要原因,约占80%的比重。

因此,必须对液压油进行定期检查,条件简陋时可用120目的过滤网过滤;同时要定期对油箱和整个液压系统进行清洗,或者定期换油。

(7)对各操作、控制装置的调整和修理。

操作、控制装置包括各种手柄、按钮、油门踏板等,对于易松动的各处手柄要经常进行检查,看其有害的大小,重新调整或紧固其锁紧装置;磨损严重的零部件可以焊补或换件;对于电气类的开关或按钮,可调整触点的接触状态或换新件。

5结束语在工程机械的使用过程中,要经常注意检查发动机、轴承和各工作机构的运行状况,特别是声音、温度、油液清洁度等重要技术指标是否正常,并做好相关记录。

如有异常,要及时停止运行,开机检查,并向主管汇报异常和检测的具体情况,确定调整和维修方案,按正确、科学的方法进行调整和维修。