本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
1 应用背景
本系统用来监控杭州、温州、宁波等城市的微波站,主控站在城市机房,受控站则在内地或海边的山顶,环境比较恶劣。共有6个主控站,每个主控站带1个受控站,采用总线型的主控机和受控机两级结构,通过微波信道(图1粗黑线所示)在主控机之间传送数据,但在某一时刻只有一台主控机Polling所属受控机,被Polling受控机作应答处理,其余主控机处于侦听(Listen)状态。主控机Polling完所属受控机后,转移Polling权,由下一台主控机接管Polling权……如此循环。监控内容主要包括柴油发电机、开关电源、市电、蓄电池等的工作状态、环境温度、湿度、防盗等。系统结构如图1所示。
2 硬件设计
油机监控器是与大型柴油发电机配套的专用监控器,采用双机热备;1600与2800也是与原设备配套的专用监控器,其中1600主要用来监控市电和环境参数,2800对两组蓄电池(各节)进行监控;报警开关量(遥信)输入模块采用7041,控制开关量(遥控)采用7067模块,受控机的主控模块则选用7188。7188有四个串行口,其中两个RS232(仅含Rx、Tx、GND信号线),一个RS485,一个9针全信号RS232口(通过内部跳线,可将此口改变为RS485口)。7188模块接口多,抗恶劣环境,同时,提供丰富的内部函数,有利于快速开发出性能可靠的下位机监控系统程序。受控站系统的硬件结构见图2所示。由于各监控模块均使用RS485接口,所以需要两个RS232/RS485转换接口。COM1口为全信号RS232,连接专用Modem,从而进入微波信道进行数据的传输。主控站通过RS232接口与专用Modem连接,进入微波信道。
3 软件实现
3.1 主控机部分
主控机部分采用组态王5.1来实现。该系统可运行于Win98/NT平台,真正32位程序,实时多任务、多线程,采样速度快,可靠性高,同时,支持分布式历史数据库及拨号网络,具有丰富的ActiveX控件,广泛应用于钢铁、化工、环保、国防、航空航天等重大领域。
利用组态王开发实时计算机监控系统方便快捷。首先,定义设备,加载通讯驱动程序。如对于本系统,是利用RS232接口来与受控机通讯的,其定义设备时选取的顺序如下:智能模块—I-7000系列—I-7188—Modbus RTU Extention。然后,再规定RS232的工作参数。其次,定义数据词典,规定变量名、数据类型、寄存器之间的关系。数据词典中的变量可以根据原始数值自动计算所对应的线性目标值。最后,根据组态王提供的图元控件设计用户界面,无论是字符串还是图元,均可建立“动画链接”,从而,将数据变量和数据的显示结合起来。数据显示包括两种形式,一是数据的文本格式的显示,二是数据的动画表示,如对于报警量,正常显示绿灯,报警显示红灯等。如此三步,主控机软件开发基本完工。
3.2 受控机部分
3.2.1 受控机主程序设计
7188提供了丰富而方便的库函数,其中包括关键的看门狗、相关的数据发送和接收函数、时钟中断函数等等,同时,还提供了丰富的例程,因而,使得受控机软件逻辑简捷,开发极其迅速可靠,与其它厂家的模块也能极其友好地连接。7188的一个串口控制两台智能设备,这是通过地址来区分的。对于泓格产品的7000系列模块,其工作参数及模块地址是可调的,可在系统组装之前对其进行设置。而其它智能模块的工作参数和地址则是由厂家设定的,不可更改。
由于7188内嵌基本的DOS环境,因而,采用TC2.0来编写受控机程序。主程序首先初始化系统,包括对各串口的初始化及系统运行参数的初始化,并安装用户时钟中断。由于该用户中断固定为1ms,因而,在中断程序中应避免接收和发送数据,因为监控系统中的波特率一般不超过9600(太高可能导致数据传输的不可靠),而对于9600的波特率,传输1个字节的数据大约需要1ms,一般情况下,所选择的波特率低于9600,而且,一次发送和接收的数据一般超过2个字节,因而,会引起DOS重入,从而使系统不可靠。所以,时钟中断程序应尽量简捷,主要完成各个工作节拍之间的协调问题,主要工作在主程序中进行,即轮询时间或节拍到,即向智能模块或设备发送查询命令,而当有数据返回时,再去读取数据并处理。其软件系统框图如图3所示。
3.2.2 通讯问题及解决方案
对于计算机监控系统,最关键的问题是数据通讯的可靠性。泓格产品的I/O设备数据传输平稳,能与7188可靠地连接,但其它厂家模块的数据传输并不象所想象的那么连续,因而,应该根据所接收的数据的不连续性作相应的等待,时间太短,数据将可能丢失,时间太长,则可能造成死机或将下一批的数据也一块接收进来。数据接收程序见算法1中的ReadDataDelay子程序。经过反复调试,对于本系统,发现延时数据大于0x0140即可,小于0x0130则数据错误率达1/4左右,并且,主要是每次丢失1~2个字节的数据。0x0130与0x0140之间为临界值。数据发送也用一个统一的子程序来完成,见算法1中的SendData子程序,数组中第一个字节用来存放收到的字节数,其后为数据内容。以下算法对嵌入式模块的程序设计具有通用性,其基本原理可以广泛使用。
/****************************************************/
/* ReadDataDelay:读取串口nPort中的数据,放入 */
/* bData中,nDealy为需要等待的节拍数 */
/****************************************************/
void ReadDataDelay(int nPort, unsigned char *bData, int nDelay)
{
int nData=0; /*接收到的字节数*/
int iCount=0; /*等待计时*/
while(iCount {
if(IsCom(nPort)==QueueIsNotEmpty) /*nPort口有数据*/
{
nData++;
bData[nData] = ReadCom(nPort); /*读取一个字节的数据*/
iCount = 0; /*有数据,计时清零*/
}
else iCount++; /*没有数据,则等待计时*/
}
/*bData数据中第一个字节地址存放收到的字节数,其余为字节内容*/
bData[0] = nData;
ClearCom(nPort); /*清除串口数据内容,为下次数据接收作准备*/
}
/*********************************************************/
/* SendData:nPort为串口号,ComData为需要发送的数据 */
/*********************************************************/
void SendData(int nPort, unsigned char *ComData)
{
int nlength, i;
nlength = ComData[0];
if(2 == nPort) Set485DirToTransmit(nPort);
for(i=0; i{
ToCom(nPort, ComData[i+1]);
if(2 == nPort) WaitTransmitOver(nPort);
}
/*Com2为485口,应调整其数据传输方向*/
if(2 == nPort) Set485DirToReceive(nPort);
return;
}
4 调试及结论
泓格产品的7000系列组合方便,而且,7188有四个RS232/485串口,价格却非常便宜,一块7188主控模块只要2000多元,且同样抗恶劣环境,曾用电吹风对其连续劲吹,使其表面发烫(温度在50℃以上),却依然可靠地工作。由于上位机提供了组态软件,因而,上位机程序开发迅速,性能可靠;下位机提供了丰富的库函数和例程,使得下位机软件的逻辑简捷,编程灵活而迅速,看门狗功能又能使其自动恢复。
作者长期从事计算机监控方面的项目与研究工作,设计了“通用多功能计算机监控系统测试软件”,专门用来通过RS232或RS485测试监控系统或相应的智能设备 [1] 。该软件既能充当受控机用来测试主控机程序,又能充当主控机用来测试受控机程序,并在多个监控系统中得到验证。在测试过程中发现,7000系列的模块数据传输平稳,并且,连续测试48小时(5秒测试1次),非泓格产品的监控器平均发生25次数据传输错误,而对于7000系列的模块却没有一次错误记录;用该测试软件模拟受控机对主控机(组态软件)进行测试,也没有错误记录。目前,该系统已经在实验室调试通过,效果良好。由于采用了泓格产品的组态软件及7000系列的模块,该系统开发迅速,性能可靠,因而,极有推广价值(onspring@sina.com)。
参考文献∶
[1] 马玉春, 宋瀚涛. 串行通讯协议的研究与应用. 计算机应用研究, 2004.4, p228 |