1 引言
集中供热方式的普及以及计量供热的实施是建筑节能的有效手段,但需要通过供热系统运行管理的自动化来实现。为了研究热网的控制调节方法,建立了热网模拟实验平台,并且配置了自动监测控制系统。在设备选型时,采用了丹麦Kamstrup 热量表作为实验管网中各主要管段输送热量及实验系统热量的测量采集装置,但该热表配备的数据通讯接口模块只能通过专用外接插口与计算机或相应的数据终端进行一对一的RS - 232 串行通讯,难以满足现场的通讯要求。
2 通讯模块的核心器件
在系统中,单片机一般称为下位机,通常用来完成数据的采集和上传,由PC 机、网络设备、数据库服务器组成的后台应用部分则统称为上位机,对下位机的上传数据进行分析并处理。系统充分发挥了单片机在实时数据采集和微机对图形处理、显示以及数据库管理上的优势,使得单片机的应用不局限于自动监测或控制,而形成了向以网络为核心的分布式多点系统发展。在实验台监测控制系统中,选用单片机同工控机配合建立了如图1 所示的通讯网络,实现对热表采集数据的读取。
图1 工控机、热表通讯网络
RS - 485 通讯标准针对RS - 232 存在的通讯距离近、抗干扰性能差等缺陷在提高传输速率和距离、抗干扰特性上都做了很大改进。所以考虑到通讯的可靠性,为工控机选配了RS - 485 的串口卡建立通讯。
单片机数字信号遵循CMOS 电平协议,传输距离短,达不到分布式控制系统传输距离的要求,需要电平转换芯片构成接口电路与上位机连接。同时,单片机与热表连接时也要通过相应的接口电路达到电平的匹配。
另外,单片机是工控机与热表进行数据交换的通讯枢纽,担负着同时与工控机和热表进行串行通讯的责任,因此需要两个串行通讯端口。有3 种方法供选择:
- 采用多串口的单片机;
- 采用通用异步串口扩展芯片;
- 采用普通I/ O 端口模拟实现串行通信。
第3 种方法最简单经济,并且可以实现高速率通信。另外,考虑到对硬件资源的充分利用,选用ATMEL 公司生产的89C2051 单片机进行开发。
3 通信模块的开发
3.1 硬件接口
理论上,利用软件的方法可使普通I/ O 口扩展成的串行口与标准的串行口具有同样的功能。但是,根据实际情况,单片机自带的串行口容易通过专用的电平转换芯片实现RS - 485 电平与上位机连接;热表数据通讯接口对发送和接收数据有不同的波特率要求,在模拟串口的程序中只要作相应的延时处理,就能满足。因此,用标准串口通过电平转换连接上位机(见图2) ,用普通I/ O 口模拟的串口经相应的接口电路与热表相连(见图3) 。
图2 RS - 485 电平转换
图2 中单片机的标准串口通过75176 芯片转换为RS - 485 电平,75176 为8 个管脚,DIP 封装。RO 为数据接收端;RE 为数据接收允许端,低电平有效;DI 为数据发送端;DE 为数据发送允许端,高电平有效;DT+ 、DT - 脚为电流环回路端。图2 中把RE、DE 脚连结在一起,当P3. 7 脚为高电平时,允许数据发送,当P3. 7 为低电平时,允许数据接收。R 为电路匹配电阻,可增强系统抗差模干扰的能力。
图3 单片机与热表接口电路
图3 中虚线框内为热表本身的数据通讯接口电路,热表通过该接口连接专用的外接插头可以同计算机或相应的数据终端进行RS - 232 通讯。利用示波器检测热表在与计算机一对一的通讯过程中收发端的电平信号特征,采用分立元器件搭建了接口电路,使之与单片机端口达到电平的匹配。在单片机同热表的通讯过程中,为保证通讯的可靠且能保证单片机及时地接收热表传来的数据,采用中断的接收方式,P3. 2 为中断触发端,所以选用该端口作为模拟串口的接收端,选用了P3. 4 作为模拟串口的发送端。[page]
3.2 串行通信软件
普通I/ O 口模拟串口的软件编程实质上就是模拟异步通讯规程。异步通信规程是把一个字符看作一个独立的信息单元,并且字符出现在数据流中的相对时间是任意的。而每个字符中各数据位以固定的时间传送,因此这种传送在同一字符内部是同步的,而字符间是异步的。异步通信收发取得同步的方法,是采用在字符格式中设置起始位和停止位。但由于发送器和接收器不是使用同一个时钟,而是以各自时钟来划分每位的宽度,收发时钟的误差必然影响数据的正确采样,所以要求准确识别起始位的前沿。实际的做法是利用1 个16 倍波特率的时钟,在1 个位周期的1/ 16 时间内确定出字符的开始,接收器在每个时钟的上升沿采样数据输入线。若发现低电平,紧接着又连续采样到8 次均为低电平,则认定为起始位,以后每隔16 个时钟采样1 次数据。字符再同步过程见图4。
图4 f = 16 倍波特率的字符再同步过程
在软件编程中,根据热表发送数据的波特率计算出数据位周期,而后再根据单片机的晶振频率编写数据位周期延迟程序和半位周期延迟程序。当单片机检测到INT0 (即P3. 2 端口) 为低电平时,外部中断触发,进入中断处理程序。首先,调用半位周期延时程序,判断是否为起始位,若是则再调用位周期延时程序,进行数据位的判断与接收,最后判断接收停止位。只要延时程序能准确地保证延时时间,就能完成对图4 中工作时序的模拟。另外,在接收数据帧各个位时,都连续地采样3 次,并遵循3 中取2 的原则来确定所检测的值。这样做很大程度上抑制了干扰,提高了信
号传输的可靠性。同理,单片机发送数据时只要调整好发送数据帧各数据位之间的传输时间间隔,满足热表接收数据的波特率,就能完成热表对单片机发送数据的接收,程序流程图如图5 所示。
3.3 通信协议
单片机的串行口工作于方式2 或方式3 时,数据帧由11 位数据组成:1 位起始位、9 位数据位、1 位停止位。在这两种方式下,第9 位数据是可控的标志位,只有第9 位的数据是“1”(代表地址帧) 时,串行口接口电路才会在接收完1 个数据后,向CPU 请求中断。因为PC 机的异步通信功能没有这样的通信格式,所以这种方式只适合单片机之间的多机通信。一般情况下,实现两种异型机之间的通信常采用以下几种方式:
(1) 用1 台单片机作为上位PC 机和下位单片机之间的“桥梁”,实现数据格式的转换;
(2) 在PC 机内安装异步通信适配卡,通过设计可编程芯片的运行方式,使之与单片机的多机通信方式一致;
(3) 设置上位机编程环境提供的串行通讯控件的属性来区分寻址指令和数据传送指令,进而实现通讯。
方法1 和方法2 硬件结构复杂,方法3 软件代码编写繁琐。在系统不复杂、任务不重、通信数据量不大的情况下,这些方法还不会有明显的缺陷,否则方法1 中的“桥梁”单片机和方法2 中的通信异步适配器将会成为通信信道的瓶颈,而方法3 中数据帧中的奇偶校验位通常用作发送地址码(通道号) 或数据的特征位,这样数据通信的校核会采用累加和校验的方法,采用这种方法不但软件开销和进行通信的数据量增加了,而且实时性也受到影响。
根据实际情况,采用了通信信息帧不区分数据帧和地址帧的方法,这样做不必使单片机工作在11 位异步收发方式下,使单片机和PC 机的串口工作方式一致。受到通信格式的启发,设计信息帧见图6 ,用1~3 个字节作为数据通信的“报头”,起同步作用;用1个或多个字节作为单片机的地址区别码来标识某个单片机(根据系统中下位机的个数决定) ;用来标志下位机工作性质的信息码可根据实际的情况在信息帧中灵活设置。[page]
图6 信息帧一般格式
上位机发送信息帧时,下位机全部收到上位机的信息帧,然后判断信息帧中的地址码,如果是自己的地址码,则根据数据帧中的信息码内容作出相应的反应。信息帧的长度不限(根据系统中下位机的个数以及信息码的形式决定) ,是多个字节的。在这种通信格式中还可以用软件的方式进行一些通信数据的校验。
工控机与下位机通讯模块之间的通信协议,如图7 所示。
图7 工控机与下位机通讯模块间的通信协议
上位机工控机向下位机发出的信息帧中应包含地址和控制指令信息,以便下位机的通讯模块能辨识出是否及如何应答;通讯模块,向上位机回复的信息帧中应包含自身地址及对应控制指令的数据;同步字和结束字是完成异步通讯必须的,因此无论上位机信息帧还是下位机信息帧都不可少。具体的信息帧格式如下(括号里标注为字节数,未标出的字节数为1) :
整个收发数据的互控流程如下:
上位机:按照一定的时间发送指令给下位机;
下位机:收到信息帧后,判断信息帧中的地址是否为本机地址,若是则将本机地址发回上位机,并根据控制字向热表发出相应的指令,等待模拟串口中断,将热表数据传给单片机,之后转发给上位机;反之则退出中断程序;
上位机:根据串口引发的事件接受数据,判断来源后存入数据库并通过人机界面显示。
按照上述通信协议,综合串口模拟过程对通讯模块(下位机) 进行编程。编写的程序主要包括主程序和中断程序;中断程序有模拟串口中断接收程序和串行中断程序。其中主程序完成各个特殊寄存器及通信参数、格式的初始化工作,分析判断串行中断,接受信息向热表发出相应的指令;模拟串口中断程序具体完成热表数据的接收;串行中断程序完成对上位机发出信息帧的接收。另外,考虑到实际应用当中各种随机干扰,在编写程序时作了适当的纠错处理,即通讯模块收到上位机指令后对热表进行操作,若在一定时间内没有收到回应,则使程序复位。
每台热表对应的通讯模块地址的标识方法如图8所示。充分利用了该型号单片机的硬件资源,以跳线的方式设定P1 端口各个管脚的电平作为地址标识,8个管脚不同的通断组合可以表示不同的地址。
图8 通信模块地址标识
通讯模块的编程都是利用仿真器提供的环境进行模拟并调试成功的。
4 与上位机软件接口
通过通讯模块最终实现工控机对热表数据的读取还需要对上位机进行通讯接口程序的编写。上位机通讯程序的编写也同样有多种方法: (1) 通过调用WINDOWS 提供的API 函数实现; (2) 采用汇编语言和C 语言混合编写动态连接库函数实现; (3) 利用VB 语言及其提供的串行通信控件实现。第3 种方法最简单, 开发周期短, 经济实用。只需在工程中添加MSCOMM控件, 然后进行相应的属性设置, 便可完成数据的收发。但VB 中的数据收发分为二进制形式和文本形式。若发送文本, 单片机收到的文本是ASC Ⅱ码, 在VB6. 0 中使用的是Unicode 字符,即用2 个字符来表示1 个字符, 当发送1 个字符时单片机收到2 个字节。因此大多情况下PC 机与单片机通讯交换的是二进制数据。所以利用MSCOMM 控件来发送二进制数据时, 必须将变量声明为Byte 形式。
参考文献
[1 ] 胡汉才. 单片机原理及其接口技术. 北京:清华大学出版社,1993 :317 - 320.
[2 ] 李华,严天峰. 串行通讯软硬件的实现方法. 电子世界,2003 (5) :31 - 33.
[3 ] 王小军,郝迎吉,张斌. 单片机串行通信中两个问题的讨论. 现代电子技术,2002 (1) :69 - 71.
上一篇:MCS-51单片机I/O端口的存取
下一篇:基于89C2051单片机的热表通讯模块的开发
推荐阅读最新更新时间:2024-03-16 13:12