当前位置:文档之家› 基于MODBUS协议的串口控件的实现

基于MODBUS协议的串口控件的实现

网络与通信 文章编号:1008—0570(2008)07—3-0079-03 

基于M O D B U S协议的串口控件的实现 The Realization of a Serial Port ActiveX Control Based on MODBUS Protocol (中科院高能物理研究所加速器中心防护组)余 杰 李铁辉 yU Jie LI Tie-hui 

摘要:本文主要介绍了一个基于MODBUS协议的串口控件的实现。MODBUS协议是"-3今工业控制领域广为流行的协议。在 该协议的RTU传输模式下.数据帧的起始和结束是以时间间隔来决定的,该时间间隔非常的短。为了满足这一要求,在控件 的实现过程中利用了多线程和API函数。串口是计算机的标准接口之一,MODBUS协议常在串行链路上实现。 关键词:MODBUS协议;串口通信;控件 中图分类号:TP274 文献标识码:A 

Abstract:In this paper,the realization of a serial port ActiveX control based on MODBUS protocol is introduced.MODBUS protocol is a popular protocol in industrial control field.Under the transfer-mode RTU of the protoco1.the start and end of a frame is decid· ed by interval which is very short.In order to satisfy the requirement,multiple threads and API function are used in the process of implementing the contro1.Serial port is one of standard interfaces of computer and MODBUS is usually realized on serial line. Key Words:MODBUS Protocol;Serial Port Communication;ActiveX control 

引言 MODBUS是一种工业控制网络协议。由于它的简单和完全 开放而得到广泛的应用。目前已有许多厂商生产支持该协议的 自动化设备,此外,由于其完全免费开放,任何个人也可以开发 与此协议相兼容的设备。MODBUS协议属于OSI模型第七层的 应用层报文协议.其对OSI模型底层的网络并没有具体的要 求,目前能够支持MODBUS协议或总线的底层网络包括: 1)串行链路。 2)建立在以太网上的TCP/IP 3)MODBUS plus一种高速的令牌网 MODBUS?最早在串行链路上实现.也是目前实现最为广泛 的一种。 

1 MoDBUS协议 

MODBUS协议最早由MODICON公司为其生产的自动化设备 制定的通讯协议.后来逐渐被其它的厂商所采纳。自1979年以 来,已有数以百万的自动化设备的通讯协议采用该协议。 MODBUS协议建立在主,从结构的基础之上,系统中只有 个主机,一个或多个从机,每个从机有唯一的地址。主机和从 机的通讯以查询,应答的方式进行.主机构建并发送查询数据 帧,启动一次通信过程。所有的从机都将查看查询数据帧中的 地址.如果与本机的地址一致。则构建应答数据帧并发送给主 机,从而结束一次通讯过程。 MODBUS协议最重要的内容是对查询,应答数据帧格式的 规范,MODBUS数据帧的格式如表1所示: 

余杰:研究生 基金项目:北京正负电子对撞机国家实验室资助 (BEPCII—UURP一346一HT265,2O06) 

表1 MODBUS帧格式 对于查询帧.地址域表示主机要查询哪一个从机,功能码 通知从机应该执行何种操作.数据提供了为执行该种操作而需 要的一些附加信息。对于正常情况下的应答帧,地址域是本机 的地址.功能码与查询帧相同。数据是从机按要求提供给主机 的数据信息。 MODBUS协议有两种传输模式即RTU和ASCII模式,其 中RTU模式数据帧中的8位包括两个4位16进制字符,相对 于ASCII模式.RTU模式表达相同的信息需要较少的位数,且 在相同通讯速率下具有更大的数据流量。因此,一般工业智能 仪表采用RTU模式的MODBUS规约,本文介绍的串口控件工 作在该模式下。 在RTU模式下。数据帧的起始和结束是以时间间隔来决 定的。消息发送至少要以3.5个字符时间的停顿间隔开始,也就 是说在最后一个传输字符之后。一个至少3.5个字符时间的停 顿标定了消息的结束。如果在一个消息帧完成之前有超过1.5 个字符时间的停顿时间.接收设备将刷新不完整的消息并假设 下一个字节是一个新消息的地址域。 

2 ActiveX组件技术 所谓组件方法是指用可重用的软件来构造应用程序。软 件的组件化不需要代码的重新编译和链接.而是直接作为功能 模块在二进制代码级用于软件的装配。组件可以一次编写,到 处使用 由于遵循COM的规范标准,组件与应用程序、组件与 组件可进行互操作。组件模型提供了一种在二进级编码上的 代码重用.组件的用户只需知道组件的接13而完全不用关心组 件的内部实现细节,因此提高了编程的效率。目前已有很多编 程工具可以编写和使用ActiveX组件,例如:VB、VC、Delphi等。 

@罾自控 局订阅号.82_946 36o元,年一79— 

维普资讯 http://www.cqvip.com 网络与通信 中文核心期刊《微计算机信息>(管控一体化)2008年第24卷第7-3期 笔者借助Vc++6.0编写了基于MODBUS协议的串口控件.而 在使用VB写的数据采集软件中使用该控件。 3基于MODBUS协议的串口控件 

的实现 

基 Modbu 议的 串n控件 

图1串口控件接口 

/ R 

∞ ∞ 

2 1 O 

图2数据帧缓存区结构 基于MODBUS协议的串口控件的接口如图1所示。该控 件包括两部分的内容:一是对串口的操作。主要是由打开,关闭 串口等功能组成,二是对MODBUS功能码的封装,例如功能码 04是用来读输入寄存器.控件中就增加一名为 ReadInputRegister0的函数与其对应。 为了存储已经接收但还没来的及处理的数据帧.在内存中 开辟了一块大小为256"100 Bytes的数据帧缓存区.其组织结 构如图2所示。该空间共有100个数据帧缓存区,每个帧缓存 区的大小为256个字节。指针PNum指向目前正在接收的数据 所存的帧缓存。PLen指明每个帧缓存所存数据帧的大小。 3.1对串口的操作 打开串口被命名为OpenPort0.该函数主是用来设置串口 的串口号,数据位长度和通讯速率等串口参数。如果成功打开 串口。启动读串口线程。 ClosePort0用来关闭串口.释放对串口资源的占用。 

图3读串口函数流程 读串口是该控件实现的关键,ReadCom()是在另一独立线 程中运行.并且该线程被设置为具有最高 优先级,从而使程 序能够以最快的速度读取串口接收到的字符.为字符之间的精 确计时提供了保证。ReadCom()的流程如图3所示,在成功打 

开串口之后,启动读串口线程,该线程一直在打开的串口处等 待。一旦串口接收到一个字符,就计算前后两个字符的时间间 隔Interval,如果时间间隔大于3.5个字符的时间.则认为前一 个数据帧已经接收完成.刚接收的字符为下一个数据帧的起始 字符;如果时间间隔小于3.5个字符时间。但大于1.5个字符时 问则清空目前的帧缓存。 字符时间与串口的通讯速率有关,通讯速率越高。字符时 间越短。反之。则越长。表2列出了在波特率为9600 bits/s和 19200 bits/s下,1.5和3.5个字符时间。 表2 1.5和3.5个字符时间 波特率 1.5字符 3.5字符 (bits/s) 时间(ms1 时间(ms1 9600 1.25 2.92 19200 0.625 1.46 

表3具有不同精度的获取时间的函数 函数名 时间单位 精确度 NOW,Time 秒 1秒 GetTickCount 毫秒 1 0毫秒 TimeGetTime 毫秒 1 0毫秒 

从表中可以看出.在两个常用波特率下,字符时间在毫秒 数量级。 为了确定数据帧的起始和结束.常使用以下两种方法。 1)使用定时器 使用两个定时器,一个定时1.5个字符时间,另一个定时 3.5个字符时间.在每次接收到一新的字符时,就启动两个定时 器。采用这种方法实现起来简单,但由于定时器具有较低的优 先级。在系统繁忙时。定时器产生的定时消息被派在系统消息 的队列的后端.因此使用定时器很难产生准确的定时。另外由 于定时器使用的是系统每秒生成的l8个时钟信号,因此定时 的时间精度就不会超过l8分之一秒,因此不能正确确定数据 帧的起始和结束。 2)使用API函数 表3列出了系统提供的具有不同精度的获取时间的函数。 但这些函数的精度都在10ms以上。要得到毫秒级的时间间隔, 则需利用系统提供的另外两个API函数: QueryperformanceCounter 0和QueryperformaneeFrequery 0。 QueryperformanceCounter0J ̄J来获取计算机的高性能计数器的当 前计数值.QueryperformaneeFrequery0用来获取计算机的高性能 计算器的频率。利用这两个函数来获取相邻字符间的时间间隔 的方法如下: 在接收到一个字符后调用 QueryperformaneeCounter()来获取当前的高性能计数器的计数 值Counter1.同样地在接收到下一个字符时也调用 QueryperformaneeCounter()来获取计数值Counter2,设通过 QueryperformanceFrequeryO来获取的高性能计数器的计数频率 为Freq。则两相邻字符的时间间隔为: Interval=(Counter2-Counter1)/Freq 3.2对MODBUS功能码的封装 MODBUS协议最重要的内容之一就是对查询/应答帧的规 

8O~360元/年邮局订阅号:82-946 

维普资讯 http://www.cqvip.com

相关主题