串口通信技术在广播发射台自动控制系统中的应用
(谈燕)
(国家新闻出版广电总局五0一台)
摘要 本文依据国家广播电影电视总局501电台已经建设的机房运行监控系统、发射机自动控制系统、天线交换自动控制系统为基础,扼要介绍串口通信技术在广播发射台自动控制系统中的应用;并通过具体的实例详细介绍VC++6.0 实现串口通信的编程方法。关键词 广播发射台自动控制系统 串口通信 1 引言广播发射台自动控制系统大致包括机房运行监控系统、节目交换自动控制系统、天线交换自动控制系统、发射机自动控制系统、电力自动化系统和自台质量保证系统。以501台为例,在殊多的自动控制系统中,计算机与底层控制之间常常采用RS-232、RS-485串口通信协议,通过电缆线、串口卡和串口服务器三种方式建立数据通信。 2 应用介绍2.1 天线交换自动控制系统中串口通信技术的应用介绍天线交换自动控制系统采用可编程序控制器(简称PLC)与计算机通信技术实现对天线交换开关切换操作的定时控制。该系统由上位机、下位机及执行机构三部分组成。上位机采用工业级计算机,通过网络接收上一级系统下发的运行时间表,并根据运行时间表,下发切换指令给下位机。下位机一般采用AB或OMRON的PLC组成,负责接收上位机下发的切换指令,并通过PLC输出模块向天线交换开关的控制电路发出控制信号,同时返回天线交换开关状态信号。在天线交换自动控制系统中,计算机与PLC之间的通信采用9 针串口( DB9),9针串口的针脚功能如下所示:针脚1 :载波检测(DCD)针脚2 :接受数据(RXD)针脚3: 发出数据(TXD)针脚4 :数据终端准备好(DTR)针脚5: 信号地线(SG)针脚6 :数据准备好(DSR)针脚7 :请求发送(RTS)针脚8 :清除发送(CTS)针脚9 :振铃指示(RI)串口采用三线制接法,即接受数据(RXD)、发出数据(TXD)和信号地线(SG)三脚相连,通过电缆线直接连接RS- 232或RS- 485标准端口。RS- 232与 RS-485两种接口的区别在于:RS-232采取不平衡传输方式单端通信,最大传送距离约为15米;RS-485接口采用平衡驱动器和差分接收器组合,最大传送距离可达1219米。考虑到广播发射台强射频干扰的情况,当上位机与PLC之间连接距离在5米以内时,可采用RS- 232接口;距离在5米~15米之间,采用 RS-485接口;超过15米,建议采用光纤通过光模块实现通信连接。 2.2 机房运行监控系统中串口通信技术的应用介绍发射机房运行监控系统是广播发射台信息化平台的重要组成部分,包括:调度管理、运行监测、数据处理、指标测试等功能。发射机房运行监控系统接收上一级系统下发的运行图,并解析成带周期的运行时间表下发给发射机自动控制系统和天线交换自动控制系统;同时,发射机房运行监控系统接收发射机自动控制系统及天线交换自动控制系统上传的运行数据及状态数据。以501台一个短波机房为例,该机房运行监控系统需要同时与六部发射机自动控制系统的串口板连接,来完成系统之间数据交换。在过去的自动化系统中,对于多串口通信采用串口卡来实现连接;随着串口服务器技术的发展和串口服务器在广播行业中的普及,串口卡已逐步被淘汰。如图1所示,根据实际需求,机房选用了MOXA Nport5610串口服务器,采用虚拟串口通信模式来实现一对6的串口数据通信。图1
Nport5610串口服务器是把串口转换成TCP/IP网络接口,实现发射机自动控制系统串口板与计算机TCP/IP网络接口数据的双向透明传输;可以将其理解为串口链路与以太网之间通信数据的存储控制,它把来自发射机自动控制系统串口板的数据流转换成以太网数据帧,转发给机房运行监控系统;对机房运行监控系统以太网数据帧进行判断、处理,将数据转换成为串行数据流,发送到发射机自动控制系统串口板。Nport5610集成了ARP、IP、ICMP、TCP、UDP 、DHCP、SOCKET等网络通信协议,支持网关和代理服务器,通过IE浏览器来完成参数的配置。Nport5610串口服务器有三种工作模式,分别为:(1)虚拟串口通信模式(Tcp realport):当串口服务器工作在该模式时,一台计算机与一个或多个转换器建立连接,实现数据的双向透明传输,即在计算机虚拟串口软件的支持下,实现一个虚拟串口对应多个转换器。(2)网络通信模式(Tcp/Udp socket):当串口服务器工作在该模式时,转换器设置选择支持SOCKET 协议,便可编写基于SOCKET 协议的计算机应用通信程序。(3)点对点通信模式(PPP):当串口服务器工作在该模式时,转换器成对使用,即一个服务器端对应一个客户端;服务器/客户建立连接,实现数据双向透明传输。这种工作模式常用于两个串口设备之间的总线连接转换为TCP/IP网络连接的情况。 2.3 VC++6.0 实现串口通信的编程方法串口通信程序的开发环境很多,如VB、VC和Delphi等;在本文中,重点介绍VC++6.0开发串口通信的二种常用方编程方法:(1)采用Microsoft公司提供的MSComm控件实现串口通信。这种方法编程方法相对简单,容易实现,但编程的灵活性稍差。(2)直接调用Windows 32 API函数。这种方法编程方法灵活性强,但原理复杂,要求编程人员对串口的硬件工作原理要有深入的了解。串行通信程序的工作流程大致可分为四个步骤:(1)串口初始化:打开串口,完成串口通信参数的设置,创建通信事件、读写事件和等待串口接收中断等操作。(2)串口的数据读取:当指定数量的字符串达到串口输入缓冲区时触发EV_ RXCHAR 消息事件,响应函数接收到消息后读取输入缓冲区的数据。(3)串口的数据发送:数据发送函数负责把要发送的字符串写入输出缓冲区。(4)关闭串口:串口缓冲区清零,关团串口。 2.3.1应用MSComm控件实现串口通信的编程方法在VC++6.0中调用MSComm控件实现串口通信有两种方法,第一种是绑定一个计时器,定时到MSComm控件缓冲区读取数据或发送数据;第二种方法是采用事件驱动方法来处理串口数据的交互。第一种方法简单,适用于单串口通信的情况;但要注意计时器的设置值应比数据发送、读取时间略长。第二种方法灵活,效率高,适用于多串口通信。本章节重点介绍事件驱动数据交互法。事件驱动数据交互法就是利用MSComm控件的OnComm 事件和 CommEvent 属性捕捉并检查通信事件和错误的值。发生通信事件或错误时,自动触发 OnComm 事件,CommEvent 属性的值将被改变,应用程序通过检查 CommEvent 属性值并做出相应的反应。以501台上述机房运行监控系统与一部发射机自动控制系统串口通信为例,具体代码如下:// 串口控件的初始化BOOL CMy420c500HDlg::OnInitDialog(){E01 m_mscom1.SetCommPort(1); //设置串口m_mscom1.SetInBufferSize(1024); //设置输入缓冲区大小m_mscom1.SetOutBufferSize(1024); //设置输出缓冲区大小m_mscom1.SetRThreshold(220); //设置触发OnComm事件的字符m_mscom1.SetPortOpen(TRUE); //打开串口m_mscom1.SetInputLen(0); //设置当前接受区数据长度为0m_mscom1.GetInput();//先预读缓冲区以清除残留数据}// 控件事件的响应void CMy420c500HDlg::OnOnCommMscom1(){// TODO: Add your control notification handler code hereint resEvent;resEvent = m_mscom1.GetCommEvent();if(resEvent ==2){VARIANT data;data = m_mscom1.GetInput();CString str0;str0 = data.bstrVal;CGlobal::static_MscommData1= str0;if(str0.Mid(0,3)=="sta"&&str0.GetLength()==233){MScommDataSCreen(("1"+str0));}}m_mscom1.GetInput();} 2.3.2调用Windows 32 API函数自定义串行通信类的编程方法以下是笔者调用Windows 32 API函数,自定义串行通信类的实例。该例子通过调用Win32 的API 函数,在VC++类中封装了一个名为CCommPort的串行通信类,再利用MFC 编写串口通信应用程序实现串口数据通信。具体步骤如下:(1)首先定义名为CCommPort 的串行通信类,代码如下:class CCommPort{public:void ClosePort();CCommPort();virtual ~CCommPort();BOOL InitCommPort(CWnd* pPortOwner, UINT portnr = 1, UINT baud = 19200, char parity =' N', UINT databits = 8, UINT stopbits = 1, DWORD dwCommEvents =EV_RXCHAR, UINT writebuffersize = 1024);HANDLE m_hComm;BOOL OpenCommPort();BOOL ReOpenCommPort();BOOL CloseCommPort();DWORD GetCommEvents();void WriteToPort(char* string);Void WriteToPort(char* string,int n);Void WriteToPort(LPCTSTR string);void WriteToPort(LPCTSTR string,int n);protected:static UINT CommThread(LPVOID pParam);static void ReceiveChar(CCommPort* port, COMSTAT comstat);static void WriteChar(CCommPort* port);CWinThread* m_Thread;CRITICAL_SECTION m_csCommunicationSync;BOOL m_bThreadAlive;HANDLE m_hWriteEvent;HANDLE m_hShutdownEvent;HANDLE m_hEventArray[3];OVERLAPPED m_ov;COMMTIMEOUTS m_CommTimeouts;DCB m_dcb;CWnd* m_pOwner;UINT m_nPortNr;char* m_szWriteBuffer;DWORD _dwCommEvents;DWORD m_nWriteBufferSize;};(2)调用CCommPort 串口通信类在VC++6.0 环境下,完成CCommPort 类的定义后,利用MFC 编写串口通信应用程序。1)串口初始化:在CCommPort.h 中声明一个串口类的对象:CCommPort m_SerialPort;串口初始化函数如下:InitCommPort(this, nPort, band, checkbit, databits, stopbits,EV_RXFLAG | EV_RXCHAR,512)。注意:每次只能对一个串口进行初始化;其中参数nPort表示端口号, band表示波特率,checkbit表示校验位, databits表示数据个数, stopbits表示停止位,这些参数可以在初始化串口时直接定义,也可以在属性窗中设置。2)串口监听:通过OpenCommPort()启动串口通信线程函数CommThread,实现对定义串口的监听。3)串口的数据读取:定义操作函数,当指定数量的字符串达到输入缓冲区时触发OnComm()函数,实现响应函数接收到消息后读取接收缓冲区数据。4)串口的数据发送:使用m_SerialPort.WriteToPort(char* string,int n) 函数,把需要发送的字符串写入串口输出缓冲区。5)关闭串口:串口通信完毕后,调用m_SerialPort.ClosePort()关闭串口。 3 结束语随着串口通信技术在广播发射台自动控制系统中的广泛应用,解决了广播设备集中管理、分散控制的问题,跟上网络自动化、信息化的潮流,建立竞争优势。“让全部设备连接网络”、建设“无人值班、有人留守”的中短波广播发射台新运维模式成为现实。为提高发射台维护管理质量和整体的工作效率做出了贡献,为安全播出工作提供了技术保障。 4参考文献李景峰,潘恒,杨丽娜. Visual C++串口通信技术详解. 机械工业出版社. 编辑:中国新闻技术工作者联合会
评论 点击评论