基于电磁感应的多层管柱电磁探伤测井系统
。这里图例被设计成悬浮于绘图之上,可以跟随滚动条滑动而动。
图 26 电磁测井工具软件界面
USBCAN接收模块
由于采用了USBCAN-2A模块,因此,这里的使用了厂商提供的驱动程序和dll程序,但是提供的程序是基于c++的,我们的C#程序还需要进行适用于.Net架构的封装。这其中包括数据类型的转换,结构体重写和函数的引用。
函数引用使用DllImport语句,以打开设备函数为例:
[DllImport("ControlCAN.dll")]
public static extern UInt32 VCI_OpenDevice(UInt32 DeviceType, UInt32 DeviceInd, UInt32 Reserved);
这里引用的是ControlCAN.dll中的函数,使用静态和外部的引用方式。
第二个要重新封装的的是数据类型,由于.Net架构和C++的数据类型不同,因此需要进行大量的改写。如Dword类型应转换为Uint32类型,这种转换往往比较模式化,具体转换这里不再赘述。
第三个也是最重要的就是结构体的重写。例如
public struct VCI_CAN_OBJ
{
public UInt32 ID;
public UInt32 TimeStamp;
public Byte TimeFlag;
public Byte SendType;
public Byte RemoteFlag;//是否是远程帧
public Byte ExternFlag;//是否是扩展帧
public Byte DataLen;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public Byte[] Data;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public Byte[] Reserved;
};
这个结构体,需要在类中重新描述,其中的数据类型应按照标准数据类型转换,另外其中的数组应使用MarshalAs修饰符修饰,表示在托管代码和非托管代码之间传送数据。驱动程序中的代码被托管,这里要收集其数据,必须使用MarshalAs方法。
最后,由于我们程序使用的数据格式比较固定,因此本类中也对一些常用的方法进行了封装,使得CAN模块对上层程序透明,上层程序在接收数据的时候好像没有底层方法一样。例如CAN模块定义了打开设备,初始化设备,开始CAN三个方法,但是由于我们的参数是规定好的,因此在程序中就将这三个方法进行了一层封装,每当建立USBCAN实例的时候在构造函数中自动打开设备。
数据分析模块
CAN模块接收过来的数据需要对其进行分析。这里我们采用的是正则表达式分析方法。正则表达式在C#方便易用,效率高,功能强大。
每次接收过来的数据时8字节的小字符串,实际上是8个0-255的数,由于ASCII码最大只允许到127,超过127的数值都被转化成为值为63的"?"字符,因此这里采用ISO8859-1中规定的扩展ASCII码进行转码。
小字符串分为五种,分别用以下五种正则表达式进行匹配:@"^EMISTART$"、@"^FSTA((.|\n){4})$"、@"^((.|\n){8})$"、@"^EMITOEND$"、@"^((.|\n){4})FEND$",分别表示"测井开始"、"数据包开始"、"内容数据","测井结束","数据包结束"。分析出五种帧的不同,则可以进行相应的操作。如接收到测井开始帧,则创建新的测井实例,重置图片,重置存储文件。如果接收到测井结束,则销毁测井实例。收到数据包开始的标志时应创建新的消息实例,收到内容帧应在最后创建的消息包实例后附加信息。如果收到了数据包结束标志则开始数据的处理。
收到了数据包结束标志,马上开始的应该是数据处理的部分。其算法流程如下:
第一步是判断大小,一个标准的数据包大小是512字节,如果不是,则应该抛弃,这一步的判断大大节省了判断的时间,毕竟校验和还是比较麻烦的判别方法,很多错误的数据会由于大小不一致被抛弃。
第二步的校验和判断,这里采用的每四个字节拼合成一个32位整形数据,再进行加和的方式,最后得到数据和传递来的数据比较,一致则认为传递没有错误。经实测,传递错误率不足千分之一。
第三步是发送ACK和NAK信息。
第四步对数据进行分拆,从字符型数据得到有意义的整形或浮点型数据。分拆的过程同样使用的是正则表达式的技术,其表达式为:@"^FSTA((.|\n){3})D((.|\n){4})((.|\n){4})((.|\n){4})((.|\n){2})((.|\n){2})((.|\n){288})((.|\n){96})((.|\n){96})((.|\n){4})FEND$"
接受下来的数据采用移位递加的方式求其相应的整形值,如温度值为4字节32位数据,接收时首先加其最左侧字节,右移8位后加左数第二字节,依以此类推得到其整型值,由于我们规定传送的是其1000倍的数据,因此再除以1000即可。其他数据的计算方式类似。
软件滤波
由于AD采样的不确定性,很有可能造成某几个数
- LXI总线B类电压表的设计与实现(01-21)
- 基于PIC32的高性能扫频调谐频谱分析仪设计方案(10-26)
- 可用于检测单相或三相交流供电系统的电能质量检测分析平台(06-03)
- 便携式太阳能电池及蓄电池综合测试仪(04-18)
- CAN总线系统测试技术(05-11)
- 基于CAN总线的GaAs光电阴极制备测控系统(07-27)