1 引言
目前船舶测控设备存在参数测量、数据采集、计算、控制、通讯和供电等多种功能模块,以前在对这些功能模块和插件进行调试和维修时,都需要人工搭设调试台架,手动加载输入信号,再测量输出信号,通过输入信号和输出信号的对比分析来验证功能模块的性能或诊断其故障。以这种方式进行调试、校准和维修需要耗费大量的时间和人力、物力,而且容易由于人的误操产生错误,船舶测控设备校验装置可以对船舶测控设备进行智能校验,确诊故障,实现对设备元器件级故障快速定位,可在被校验功能模块原理图上标出故障具体所在位置,并给出故障产生原因,提供专家维修知识,大大缩短设备调试、校准和维修时间,本文重点介绍船舶测控设备校验装置的数据采集系统的设计和开发过程。
2 校验装置总体设计
由工控机系统通过PCI总线控制被校验功能模块的输入接口设备,按需要向被校验功能模块提供所需的输入信号,被校验功能模块处于工作状态,按其功能完成输入输出关系转换,工控机系统通过PCI总线采集被校验功能模块的输出信号,根据每一种被校验功能模块的校验逻辑进行输出信号正确性匹配,当被校验功能模块功能正确,转换精度满足技术指标要求时,校验装置给出合格的校验结论,并显示被校验功能模块的校验记录和功能曲线;当被校验功能模块功能不正确或转换精度超标时,校验装置给出不合格的校验结论,并根据被校验功能模块的故障现象,利用故障诊断专家知识,通过规则推理、故障特征匹配,完成被校功能模块的故障诊断,并给出维修方法。工控机能打印校验结果及故障处理意见,同时能自动存储校验结果,便于对历史诊断信息的查看和维护管理。
校验装置的工作原理图如图1所示。
3 数据采集系统硬件设计
3.1 硬件组成
船舶测控设备智能校验装置硬件上主要由电源部分、工控机系统、校验信号转换接口装置及被校功能模块组成,数据采集系统功能主要是由工控机系统实现的,如图2中所示的工业控制计算机系统。
工控机系统选用了研华(中国)有限公司生产的工业控制计算机,可安装十多块PCI板卡,带冗余电源,并配备17″液晶显示器和激光打印机。由于本校验装置功能复杂,校验对象数量多,在板卡选择上要尽量选择输入输出通道多的板卡,同时为了保证校验精度,要尽量选用高分辨率、高精度的板卡。本校验系统具体选用了以下输入、输出板卡:
PCI-1713:PCI总线的隔离高速模拟量输入卡,它提供了32个模拟量输入通道,采样频率可达100KHz、12位分辨率及2500V(DC)的直流隔离保护[1]。
PCI-1724:14位32通道的隔离模拟量输出卡,多种输出范围(+/-10V,0mA~20mA,4mA~20mA),具有同步输出功能。
PCI-1758UDI:数字量输入卡,可以提供128路隔离数字量输入通道,5V~25V的宽输入范围,2500V(DC)的直流隔离保护。
PCI-1758UDO:数字量输出卡,可以提供128路隔离数字量输出通道,5V~40V的宽输出范围,2500V(DC)的直流隔离保护,具有端口电流保护功能。
PCI-1753:隔离型数字量输入/输出模块,PCI总线的96路数字量I/O卡。用户可以使用软件配置每个端口作为输入或输出端口。
PCI-1612CU:四端口隔离型串口通讯板,提供四个串口,可以通过设置板卡上的跳线来设置RS-232、RS-422和RS-485三种通讯方式。
3.2 硬件的安装和使用
a) 插入驱动光盘,安装PCI板卡的驱动程序及配置软件(Device Manager),然后关机;
b) 将PCI卡插入工控机底板对应插槽,然后开机;
c) 用研华提供的配置软件对板卡进行配置。
工控机主板通过底板上的PCI总线控制D/A模块输出电压信号,控制隔离型数字量输出模块输出数字量信号,模拟量和数字量信号通过校验信号转换接口装置转化为被校功能模块板所需输入信号,两种信号加载到被校验功能模块输入端,被校验功能模块的输出信号经过校验信号转换接口装置转化为标准的模拟量和数字量信号,模拟量信号传输至底板上的A/D模块,转换成相对应的数字量输入到主板CPU,数字量信号由隔离型数字量输入模块输入到主板CPU,由CPU进行数据处理,这个过程完成了工控机数据采集和处理过程,通过输入信号和输出信号的对比分析来验证功能模块性能或诊断其故障。
4 数据采集系统软件设计
4.1 研华函数
Advantech(研华)为其多种板卡开发了通用的“Advantech DLL Driver” [2]驱动软件,其中Adsapi32.DLL为用户提供了能对硬件设备直接I/O操作的函数,便于用户方便快速的开发上位机监控程序。“Advantech DLL Driver”为VC用户提供了Adsapi32.lib库文件和Driver.h头文件,在这些文件中声明了有关常量、变量、DLL函数及相应的结构。用户编程时,只需将Adsapi32.lib导入Resource File文件夹,将Driver.h头文件导入External Dependencies文件夹下就可省去自己声明DLL函数的麻烦[3]。
Advantech PCI 系列有很多函数,下面列出主要函数:
DRV_DeviceOpen ( ULONG DeviceNum, LONG * DriverHandle ); 打开板卡
DRV_DeviceClose ( LONG * DriverHandle );关闭板卡
DRV_AIConfig ( LONG DriverHandle, LPT_AIConfig lpAIConfig );配置输入通道参数
DRV_AIVoltageIn ( LONG DriverHandle, LPT_AIVoltageIn lpAIVoltageIn );模拟量输入
DRV_AOVoltageOut( LONG DriverHandle,LPT_AOVoltageOut lpAOVoltageOut );模拟量输出
DRV_DioReadPortByte ( LONG DriverHandle,LPT_DioReadPortByte lpDioReadPortByte );数字量输入,读取某个DI 端口的输入状态
DRV_DioWritePortByte ( LONG DriverHandle,LPT_DioWritePortByte lpDioWritePortByte );数字量输出,向某个DO端口写一个字节的数据
4.2 VC编程实现
本文利用VC++6.0编程方便地实现在Windows环境下与Advantech PCI系列的操作,成功地实现了对模拟量输入\输出PCI卡、数字量输入\输出PCI卡的数据的采集和处理,下面简要介绍使用VC++6.0编程使用过程。
a) 启动VC++6.0,建立一个工程文件;
b) 在工程文件中加入“Driver.h”,这个头文件定义了研华在动态链接库中要用到的函数和变量;
c) 在工程设置中添加库文件“Adsapi32.LIB”;
d) 在需要数据采集的文件中添加相关的程序代码。
在OnInitialUpdate()函数里面对设备进行初始化和打开[4]。
if((Errcode=DRV_DeviceGetNumOfList((SHORT far*)&m_nNumOfDevices))!=SUCCESS)//得到研华设备管理器中设备列表个数
{DRV_GetErrorMessage(Errcode,(LPSTR)szErrMsg);
MessageBox((LPCSTR)szErrMsg);}
if(m_nNumOfDevices>MAX_DEVICES)
m_nNumOfDevices=MAX_DEVICES;
if(Errcode=DRV_DeviceGetList((DEVLIST far*)&m_DeviceList[0],(SHORT)m_nNumOfDevices, (SHORT far*)&nOutEntries)) != (LONG)SUCCESS)
{DRV_GetErrorMessage(Errcode,(LPSTR)szErrMsg);}
for(i=0;i<m_nNumOfDevices;i++)
{Errcode=DRV_DeviceOpen(m_DeviceList[i].dwDeviceNum,(LONG far*)&DriverHandle[i]);//打开设备
if (Errcode != SUCCESS)
{strcpy(szErrMsg,"Device open error !"); MessageBox((LPCSTR)szErrMsg,"Device Open",MB_OK);}}
// 1713模拟量输入,设置为差分式模拟输入连接,采用多通道输入,读取15个通道的模拟量值存入fVoltageIn数组里
ptMAIVoltageIn.NumChan=15;
ptMAIVoltageIn.StartChan=0;
ptMAIVoltageIn.GainArray=(USHORT far*)&usGainCode[0];//设置1713的输入模拟量范围
ptMAIVoltageIn.TrigMode=0;//内部触发模式
ptMAIVoltageIn.VoltageArray=(FLOAT far*)&fVoltageIn[0];
if(Errcode=DRV_MAIVoltageIn(DriverHandle,(LPT_MAIVoltageIn)&ptMAIVoltageIn)!=0)
{DRV_GetErrorMessage(Errcode,(LPSTR)szErrMsg);AfxMessageBox((LPCSTR)szErrMsg,MB_OK);
DRV_DeviceClose((LONG far*)
&DriverHandle); }
//PCI-1724模拟量输出
ptAOVoltageOut.chan=chanAO;//输出通道
ptAOVoltageOut.OutputValue=fVoltageOut[n];//输出电压值
if((Errcode=DRV_AOVoltageOut(DriverHandle,(LPT_AOVoltageOut)&ptAOVoltageOut))!=0)
{DRV_GetErrorMessage(Errcode,(LPSTR)szErrMsg);
AfxMessageBox((LPCSTR)szErrMsg,MB_OK);
DRV_DeviceClose((LONGfar*)&DriverHandle);
}
// 1758UDI数字量输入:
ptDioReadPortByte.port=11;//输入通道
ptDioReadPortByte.value=(USHORT far*)&gwDIValue;//数字量输入值
Errcode=DRV_DioReadPortByte(DriverHandle,(LPT_DioReadPortByte)&ptDioReadPortByte);
if(Errcode != 0)
{ DRV_GetErrorMessage(Errcode,(LPSTR)szErrMsg);
AfxMessageBox((LPCSTR)szErrMsg, MB_OK);
DRV_DeviceClose((LONG far*)
&DriverHandle);
}
//1758UDO数字量输出
ptDioWritePortByte.port=6;//数字量输出端口
ptDioWritePortByte.mask=0x07;//掩码
ptDioWritePortByte.state=gwData; //数字量输出值
if((Errcode=DRV_DioWritePortByte(DriverHandle,(LPT_DioWritePortByte)&ptDioWritePortByte))!=0)
{
DRV_GetErrorMessage(Errcode,(LPSTR)szErrMsg);
AfxMessageBox((LPCSTR)szErrMsg,MB_OK);
DRV_DeviceClose((LONG far *)&DriverHandle);
}
在析构函数里面对设备进行关闭。
for(int i=0;i<m_nNumOfDevices;i++)
{DRV_DeviceClose((LONG far*)&
DriverHandle[i]); }
PCI-1753是隔离型数字量输入/输出模块,当软件配置其为数字量输入时,使用函数同1758UDI数字量输入一样;当软件配置其为数字量输出时,使用函数同1758UDO数字量输出一样。PCI-1612CU是四端口隔离型串口通讯板,安装后会出现四个串口,使用方法同普通串口一样。PCI-1753和PCI-1612的函数这里就不再撰述。
5 结束语
本数据采集系统是为船舶测控设备智能校验装置设计的,通过采用VC编程实现了对工业控制计算机PCI卡多路模拟量和数字量的采集和处理,满足校验装置数据采集实时性和高精度的要求,同时也可以应用到其它数据采集系统中。
参考文献:
[1] Advantech Device Driver’s Manual[Z].2004.
[2] Advantech Inc.Advantech DLL Drivers User’s Manual and Programmer’s Reference[Z].2004.
[3] 李善文,林辉.基于PCI-1716的高速数据采集系统方案设计[J].仪器仪表学报,2008,29(8):343-344.
[4] Advantech Device Driver Example Manual[Z].2004.
作者简介:余海燕(1981-),女,工程师,主要从事核动力装置控制工作。