微波EDA网,见证研发工程师的成长!
首页 > 测试测量 > 测试测量技术文库 > 基于电磁感应的多层管柱电磁探伤测井系统

基于电磁感应的多层管柱电磁探伤测井系统

时间:01-23 来源:3721RD 点击:

。这里图例被设计成悬浮于绘图之上,可以跟随滚动条滑动而动。

图 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采样的不确定性,很有可能造成某几个数

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top