发布时间:2026-08-16

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

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

图1: WDF File Access Library官网地址

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

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

图4[1] : WDF File Access Library使用逻辑
如图5所示,使用该类库访问WDF文件也仅需三个步骤:
1.创建一个文件访问句柄
2.获取文件数据信息
3.销毁此句柄

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

图6[1] : API与各机型的WDF支持情况汇总
使用API的第一步是创建句柄,通过句柄访问文件。需要注意的是访问结束后必须调用销毁句柄API以释放文件,若不释放,文件将始终保持被访问状态,可能导致内存泄漏、数据被篡改或无法再次访问。

图7[1] : 创建/销售访问句柄API
通过此类API可获取通道数、通道名称等通道信息。

图8[1] : 获取通道信息API
通过此类API可获取测量时间、横纵轴偏移等波形信息。

图9[1] : 获取波形信息API
通过此类API可获取文件中保存的波形数据

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

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

图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](见文章末代码示例)。

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

图14[2] [3] : 实例中使用API获取数据的方法名称
有了横河WDF File Access Library,你再也不用被专用软件“捆绑”在查看界面上了。想怎么提取、怎么转换、怎么批量分析,全凭代码说了算。也欢迎工程师们在评论区分享你的使用心得或踩坑经验,我们一起努力把测试玩得更溜。
///此代码及示例输出仅作为实例参考,非商用,请勿复制。
private void DispWave(string filePath, string dllPath) {
////////// 输出CSV
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
#if X64
long handle;
int handle;
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]: 此代码及示例输出仅作为实例参考,非商用,请勿复制。
关于我们
横河测量技术(上海)有限公司作为日本横河电机株式会社的全资子公司全面负责YOKOGAWA测试仪器仪表在华销售、技术支持、售后服务等一条龙业务。主要产品涵盖YOKOGAWA波形类、电功类、光通讯类、记录类及现场在线类测量仪器仪表,是多方位综合通用仪器销售公司和全方位科技公司。

免 费 获 取 选 型 指 南
获取指南
Copyright © 2026 杭州鼎伟电子有限公司 All Rights Reserved. 浙ICP备13019838号
技术支持:予尚网络