联系热线:

13606521434

横河设备数据轻松转!WDF转CSV实战指南

发布时间:2026-08-16

你有没有遇到过这样的场景:测试做完,数据全在WDF文件里,却怎么都打不开?作为横河波形测量仪器的专用格式,它里面积攒着关键的测量数据,却因为二进制特性,让测试人员无法直接读取。以往工程师们只能依赖官方的Xviewer或IS8000来查看,如果要做数据处理,还得手动导出。
1.png

现在,另一种更灵活的解析方法登场了,用户可借助横河官方提供的WDF File Access Library(文件访问库),直接调用API提取文件中的原始数据,并按需一键转换为CSV格式。这样一来,数据不仅能看,还能自由分析,测试效率一下子就上来了。接下来我们就手把手带你搞定这套“数据翻译官”的快速设置。


2.png

WDF File Access Library与使用流程

                     

WDF File Access Library 是横河官网提供的类库,旨在帮助编程人员快速读取 WDF 文件中的测量通道、时间及数据信息。如图1所示,用户可在横河官网免费下载。该类库中的 API 支持访问横河主流示波器及示波记录仪所生成的 WDF 文件。其构造概览、所支持的 WDF 文件种类(基于仪器类型)及使用逻辑分别如图2、图3、图4所示。

3.png

图1: WDF File Access Library官网地址

4.png

图2[1]: WDF File Access Library使用概要与要求

5.png

图3[1]: WDF File Access Library支持的WDF种类

6.png

图4[1] : WDF File Access Library使用逻辑

如图5所示,使用该类库访问WDF文件也仅需三个步骤:

1.创建一个文件访问句柄

2.获取文件数据信息

3.销毁此句柄

7.png

图5[1] : API使用流程



四类API详解

                     

WDF File Access Library 共包含四类API,详细说明请参考WDF File Access Library User’s Manual 4.1 Definition of Data Structure。需要注意的是,因不同仪器功能存在差异,并非所有API都支持全部机型生成的WDF文件,详情请参照图6。

8.png

图6[1] : API与各机型的WDF支持情况汇总



01
创建/销毁访问句柄API(图7):

使用API的第一步是创建句柄,通过句柄访问文件。需要注意的是访问结束后必须调用销毁句柄API以释放文件,若不释放,文件将始终保持被访问状态,可能导致内存泄漏、数据被篡改或无法再次访问。


9.png

图7[1] : 创建/销售访问句柄API


02
获取通道信息API(图8)

通过此类API可获取通道数、通道名称等通道信息。

10.png

图8[1] : 获取通道信息API



03
获取波形信息API(图9)

通过此类API可获取测量时间、横纵轴偏移等波形信息。

11.png

图9[1] : 获取波形信息API


04
获取波形数据API(图10)

通过此类API可获取文件中保存的波形数据

12.png

图10[1] : 获取波形数据API


从下载到实战:多通道数据获取与CSV导出

                     

如图11所示,从官方网站下载该API后,将压缩包解压至目标文件夹,即可得到API、DLL、Doc、Sample四个子文件夹(图12)。其中,API文件夹包含此Library的引用文件,DLL文件夹中存放着相关仪器的DLL文件,Doc文件夹提供使用文档,图12中的Sample文件夹则包含C++、.NET(C#)和Python的使用案例。

13.png

图11:WDF File Access Library 下载后示例(v6080)

14.png

图12:WDF File Access Library 解压缩后示例(v6080)

以访问DLM生成的WDF为例,打开Sample_DLM,选择SampleNet(C# x64示例)并打开SampleNet.sln即可。相关API的使用代码位于Form.cs中;图13则展示了采用C# delegate方式引用的API代码。在DispWave方法中给出了获取数据的样例,该方法仅演示了单通道数据获取,如需获取多通道数据,则需进行相应修改。此外,生成CSV文件的方法也需工程师自行编写,相关样例可参考DispWave多通道数据获取及转CSV [3](见文章末代码示例)。

15.png

图13[2] [3] : 实例中所引用的API相关代码

16.png

图14[2] [3] : 实例中使用API获取数据的方法名称

有了横河WDF File Access Library,你再也不用被专用软件“捆绑”在查看界面上了。想怎么提取、怎么转换、怎么批量分析,全凭代码说了算。也欢迎工程师们在评论区分享你的使用心得或踩坑经验,我们一起努力把测试玩得更溜。

 DsipWave多通道数据转CSV示例 

///此代码及示例输出仅作为实例参考,非商用,请勿复制。

private void DispWave(string filePath, string dllPath) {

    //////////  输出CSV

    Stopwatch stopwatch = new Stopwatch();

    stopwatch.Start();

    #if X64

    long handle;

    #else

    int handle;

    #endif

    double maxValue = 0;

    double minValue = 0;

    uint num = 0;

    uint blockNumber = 0;

    Double vResolution = 0;

    Double vOffset = 0;

    int blockSize = 0;

    WDFAccessParam param = new WDFAccessParam();

    WDFVDataType vDataType;

    string traceName;

    // temp

    Process currentProcess = Process.GetCurrentProcess();

    string exePath = Directory.GetCurrentDirectory();

    //dllPath = Path.Combine(exePath, "DLM5000.dll");

    dllPath = Path.Combine(exePath, "DLM3000.dll");

    IntPtr dllHandle = LoadLibrary(dllPath);

    IntPtr funcPtr = GetProcAddress(dllHandle, "WdfOpenFile");

    WdfOpenFile openFileEx =             (WdfOpenFile)Marshal.GetDelegateForFunctionPointer(funcPtr,     typeof(WdfOpenFile));

    int result = openFileEx(out handle, filePath);

    uint traceNumber;

    funcPtr = GetProcAddress(dllHandle, "WdfGetTraceNumber");

    WdfGetTraceNumber getTraceNumber =     (WdfGetTraceNumber)Marshal.GetDelegateForFunctionPointer(funcPtr, typeof(WdfGetTraceNumber));

    getTraceNumber(handle, out traceNumber);

    string fileFullName =         Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Test.csv");

    double[,] values = new double[blockSize, traceNumber];

    bool hasArray = false;

    GCHandle h = GCHandle.Alloc(null, GCHandleType.Pinned); ;

    for (num = 0; num < traceNumber; num++) {

        funcPtr = GetProcAddress(dllHandle, "WdfGetVResolution");

        WdfGetVResolution getVResolution =                              (WdfGetVResolution)Marshal.GetDelegateForFunctionPointer(funcPtr, typeof(WdfGetVResolution));

        getVResolution(handle, num, blockNumber, out vResolution);

        funcPtr = GetProcAddress(dllHandle, "WdfGetVOffset");

        WdfGetVOffset getVOffset =         (WdfGetVOffset)Marshal.GetDelegateForFunctionPointer(funcPtr, typeof(WdfGetVOffset));

        getVOffset(handle, num, blockNumber, out vOffset);

        funcPtr = GetProcAddress(dllHandle, "WdfGetBlockSize");

        WdfGetBlockSize getBlockSize =         (WdfGetBlockSize)Marshal.GetDelegateForFunctionPointer(funcPtr, typeof(WdfGetBlockSize));

        getBlockSize(handle, num, blockNumber, out blockSize);

        funcPtr = GetProcAddress(dllHandle, "WdfGetVDataType");

        WdfGetVDataType getVDataType =         (WdfGetVDataType)Marshal.GetDelegateForFunctionPointer(funcPtr, typeof(WdfGetVDataType));

        getVDataType(handle, num, blockNumber, out vDataType);

        StringBuilder chType = new StringBuilder(255);

        funcPtr = GetProcAddress(dllHandle, "WdfGetTraceName");

        WdfGetTraceName getTraceName = (WdfGetTraceName)Marshal.GetDelegateForFunctionPointer(funcPtr, typeof(WdfGetTraceName));

        getTraceName(handle, num, chType);

        traceName = chType.ToString();

         param.version=                 (uint)WDFDefaultValue.WDF_DEFAULT_ACSPRM_VERSION;

param.trace = num;

         param.block = 0;

        param.start = 0;

        param.count = blockSize;

        param.ppRate =                 (int)WDFDefaultValue.WDF_DEFAULT_ACSPRM_PPRATE;

        param.waveType = (int)WDFDefaultValue.WDF_DEFAULT_ACSPRM_WAVETYPE;

        param.dataType = (int)WDFDefaultValue.WDF_DEFAULT_ACSPRM_DATATYPE;

        param.cntOut = 0;

        param.box = 0;

        param.compMode =         (int)WDFDefaultValue.WDF_DEFAULT_ACSPRM_COMPMODE;

        byte[] buff = new byte[blockSize * 4];

        h = GCHandle.Alloc(buff, GCHandleType.Pinned);

        IntPtr p = Marshal.UnsafeAddrOfPinnedArrayElement(buff, 0);

        param.dst = p;

        double[] m_dbuf = new double[blockSize];

        ////////// 初始化二维数组

        if (!hasArray) {

            values = new double[blockSize, traceNumber];

            hasArray = true;

            }

            funcPtr = GetProcAddress(dllHandle, "WdfGetScaleWave");

            WdfGetScaleWave getScaleWave =         (WdfGetScaleWave)Marshal.GetDelegateForFunctionPointer(funcPtr,             typeof(WdfGetScaleWave));

            result = getScaleWave(handle, out param);

            GetPhysicalValue(buff, (int)blockSize, (double)vOffset, vResolution, ref m_dbuf);

            GetMinMaxData(m_dbuf, (int)blockSize, out minValue, out maxValue);

            //DrawWave(m_dbuf, (int)blockSize, minValue, maxValue);

uint column = num;

            if (hasArray) {

                for (int row = 0; row < blockSize; row++) {

                values[row, column] = m_dbuf[row];

                }

            }

        }

    RecordDataToCSV(fileFullName, values); // 需自行编写定义

    stopwatch.Stop();

    MessageBox.Show(stopwatch.ElapsedMilliseconds.ToString() + "ms");

    funcPtr = GetProcAddress(dllHandle, "WdfCloseFile");

    WdfCloseFile closeFile =     (WdfCloseFile)Marshal.GetDelegateForFunctionPointer(funcPtr,     typeof(WdfCloseFile));

    closeFile(out handle);

    h.Free();

    FreeLibrary(dllHandle);

 }

[1]: 引用图片均来自WDF File Access Library User’s Manual【IM B8074XP-01En 9th Edition】,仅示例,非商用。

[2]: 引用图片使用Visual Studio 2022中的截图,仅示例,非商用。

[3]: 此代码及示例输出仅作为实例参考,非商用,请勿复制。

17.jpg

关于我们

横河测量技术(上海)有限公司作为日本横河电机株式会社的全资子公司全面负责YOKOGAWA测试仪器仪表在华销售、技术支持、售后服务等一条龙业务。主要产品涵盖YOKOGAWA波形类、电功类、光通讯类、记录类及现场在线类测量仪器仪表,是多方位综合通用仪器销售公司和全方位科技公司。  

18.jpg

获取指南

Copyright © 2026 杭州鼎伟电子有限公司 All Rights Reserved. 浙ICP备13019838号

技术支持:予尚网络

在线咨询
微信二维码
微信二维码