1. COMTRADE文件格式初探第一次接触COMTRADE文件时我完全被这堆.HDR、.CFG、.DAT、.INF后缀的文件搞懵了。就像收到一个神秘包裹里面装着四个不同颜色的盒子每个盒子都藏着电力系统故障录波的关键信息。COMTRADECommon Format for Transient Data Exchange是电力行业公认的故障录波数据标准格式由IEEE制定专门用来记录电网发生故障时的电压、电流等关键参数变化。这个标准最早出现在1991年后来在1999年进行了修订。你可能好奇为什么电力系统需要这么复杂的文件格式想象一下电网发生短路故障的瞬间电压电流会在几毫秒内剧烈波动这些数据对分析故障原因至关重要。COMTRADE就像一台高速摄像机把故障过程的每个细节都记录下来供工程师后续分析。在实际工作中我经常遇到需要解析COMTRADE文件的场景。比如变电站继电保护装置动作后会生成一组COMTRADE文件包含故障前几个周波到故障后数十个周波的数据。理解这些文件的结构就像掌握了解读电网黑匣子的密码。2. 拆解COMTRADE文件结构2.1 标题文件(.HDR) - 数据的身份证.HDR文件是四个文件中最简单的一个它就像一本书的封面记录了最基本的信息。这个文件是可选的非结构化文本文件内容完全由设备厂商自定义。我见过各种风格的.HDR文件有的只写设备型号有的详细记录变电站名称、故障时间甚至还有厂商的版权声明。虽然.HDR不是必须的但我建议你养成检查它的习惯。有一次我分析一组故障数据.CFG和.DAT文件都正常但就是找不到故障发生的具体时间。最后在.HDR文件里发现了一行Fault time: 2023-05-12 14:30:45解决了大问题。2.2 配置文件(.CFG) - 数据的解码手册.CFG文件是整个COMTRADE文件组的核心它告诉你怎么解读.DAT文件中的原始数据。如果把.DAT比作加密的电报那么.CFG就是密码本。这个文件必须严格按照标准格式编写每个字段都有特定含义。我遇到过一个典型的.CFG文件开头是这样的NST3000_Simulation, 1,1999 176, 143A, 33D第一行包含厂站名称、记录装置ID和COMTRADE版本年份第二行说明总通道数176个其中模拟通道143个状态通道33个。最关键的模拟量转换公式就定义在这里y fCoefA * X fCoefB其中X是.DAT文件中的原始采样值y才是实际的物理量如kV或A。比如下面这行配置1, U2:A,A,U2:A,kV,0.002183,0.037750,0.0,-16376,16376,1.0,0.0,p表示第1通道是U2母线A相电压单位kV转换系数a0.002183b0.037750。如果.DAT中这个通道的采样值是10000那么实际电压就是0.002183×10000 0.037750 21.86775 kV。2.3 数据文件(.DAT) - 原始采样值仓库.DAT文件保存了所有通道的采样值就像一个大仓库。它有ASCII和二进制两种格式我更喜欢ASCII格式因为可以直接用文本编辑器查看。一个典型的ASCII格式.DAT文件片段长这样1, 0, 46, -54, 10, 0, 1204, -734, -442, 60, 0, 1, 0, 1 2, 200, 48, -54, 6, 0, 1218, -682, -504, 60, 0, 1, 0, 1每行代表一个采样点第一列是序号第二列是时间戳微秒后面依次是各模拟通道和状态通道的值。二进制格式的.DAT文件更紧凑但不易读它用固定字节存储每个值。比如模拟量通常用2字节整数表示状态量则每16个通道打包成2字节。我曾经写过一个Python解析脚本用struct模块解包这些二进制数据。2.4 信息文件(.INF) - 补充备忘录.INF文件是可选的非标准补充信息相当于数据的备忘录。不同厂商会在这里放不同的内容有的记录GPS时间同步状态有的保存故障录波器的触发条件甚至还有波形截图。这个文件没有固定格式完全看厂商心情。3. 实战解析COMTRADE文件3.1 从采样值到物理量的转换拿到COMTRADE文件后第一步就是把.DAT中的原始采样值转换为有意义的物理量。以这个配置为例3, U2:C,C,U2:C,kV,0.001855,0.095568,0.0,-16376,16376,1.0,0.0,p假设.DAT中对应通道的采样值是8000那么实际电压计算如下实际值 0.001855 × 8000 0.095568 14.935568 kV这里有个坑要注意有些老设备生成的.CFG文件中fMin和fMax值可能不准确。我建议在实际解析时应该扫描整个.DAT文件统计各通道的真实最小最大值。3.2 处理多采样率数据COMTRADE支持多采样率配置这在分析暂态过程时特别有用。比如下面这个配置50 2 5000, 6300 10, 200表示基波频率50Hz使用了两个采样率故障期间用5000Hz采了6300个点故障后用10Hz采了200个点。解析这种数据时需要根据采样点序号切换计算方式。3.3 二进制格式解析技巧二进制格式的.DAT文件解析起来更复杂但效率更高。每个采样点通常包含4字节序号4字节时间戳每个模拟通道2字节小端序每16个状态通道打包成2字节用Python解析的代码片段可能是这样的import struct with open(data.DAT, rb) as f: while True: sample f.read(4 4 2*analog_count 2*((digital_count15)//16)) if not sample: break n, timestamp struct.unpack(II, sample[:8]) analogs struct.unpack( h*analog_count, sample[8:82*analog_count])4. 常见问题与解决方案4.1 文件版本兼容性问题COMTRADE有1991和1999两个主要版本关键区别在于.CFG文件的字段定义。我建议解析前先检查.CFG第一行的版本年份。如果缺失默认按1991版处理。曾经遇到过一个1991版文件其中时间戳单位是毫秒而非微秒导致整个分析时间轴错乱。4.2 通道映射混乱有些设备生成的.CFG文件中通道顺序可能与实际接线不符。我开发了一个检查方法先找几个已知量如正常相的电压确认其通道位置是否正确。有一次发现A相电压通道实际接的是C相数据差点导致错误结论。4.3 数据不完整问题.DAT文件中可能出现99999ASCII或0x8000二进制这样的特殊值表示数据丢失。处理这种情况时建议用前后采样点的插值替代或者在绘图时断开连接。
从零解析COMTRADE:电力系统故障录波数据的标准格式
发布时间:2026/5/27 9:53:33
1. COMTRADE文件格式初探第一次接触COMTRADE文件时我完全被这堆.HDR、.CFG、.DAT、.INF后缀的文件搞懵了。就像收到一个神秘包裹里面装着四个不同颜色的盒子每个盒子都藏着电力系统故障录波的关键信息。COMTRADECommon Format for Transient Data Exchange是电力行业公认的故障录波数据标准格式由IEEE制定专门用来记录电网发生故障时的电压、电流等关键参数变化。这个标准最早出现在1991年后来在1999年进行了修订。你可能好奇为什么电力系统需要这么复杂的文件格式想象一下电网发生短路故障的瞬间电压电流会在几毫秒内剧烈波动这些数据对分析故障原因至关重要。COMTRADE就像一台高速摄像机把故障过程的每个细节都记录下来供工程师后续分析。在实际工作中我经常遇到需要解析COMTRADE文件的场景。比如变电站继电保护装置动作后会生成一组COMTRADE文件包含故障前几个周波到故障后数十个周波的数据。理解这些文件的结构就像掌握了解读电网黑匣子的密码。2. 拆解COMTRADE文件结构2.1 标题文件(.HDR) - 数据的身份证.HDR文件是四个文件中最简单的一个它就像一本书的封面记录了最基本的信息。这个文件是可选的非结构化文本文件内容完全由设备厂商自定义。我见过各种风格的.HDR文件有的只写设备型号有的详细记录变电站名称、故障时间甚至还有厂商的版权声明。虽然.HDR不是必须的但我建议你养成检查它的习惯。有一次我分析一组故障数据.CFG和.DAT文件都正常但就是找不到故障发生的具体时间。最后在.HDR文件里发现了一行Fault time: 2023-05-12 14:30:45解决了大问题。2.2 配置文件(.CFG) - 数据的解码手册.CFG文件是整个COMTRADE文件组的核心它告诉你怎么解读.DAT文件中的原始数据。如果把.DAT比作加密的电报那么.CFG就是密码本。这个文件必须严格按照标准格式编写每个字段都有特定含义。我遇到过一个典型的.CFG文件开头是这样的NST3000_Simulation, 1,1999 176, 143A, 33D第一行包含厂站名称、记录装置ID和COMTRADE版本年份第二行说明总通道数176个其中模拟通道143个状态通道33个。最关键的模拟量转换公式就定义在这里y fCoefA * X fCoefB其中X是.DAT文件中的原始采样值y才是实际的物理量如kV或A。比如下面这行配置1, U2:A,A,U2:A,kV,0.002183,0.037750,0.0,-16376,16376,1.0,0.0,p表示第1通道是U2母线A相电压单位kV转换系数a0.002183b0.037750。如果.DAT中这个通道的采样值是10000那么实际电压就是0.002183×10000 0.037750 21.86775 kV。2.3 数据文件(.DAT) - 原始采样值仓库.DAT文件保存了所有通道的采样值就像一个大仓库。它有ASCII和二进制两种格式我更喜欢ASCII格式因为可以直接用文本编辑器查看。一个典型的ASCII格式.DAT文件片段长这样1, 0, 46, -54, 10, 0, 1204, -734, -442, 60, 0, 1, 0, 1 2, 200, 48, -54, 6, 0, 1218, -682, -504, 60, 0, 1, 0, 1每行代表一个采样点第一列是序号第二列是时间戳微秒后面依次是各模拟通道和状态通道的值。二进制格式的.DAT文件更紧凑但不易读它用固定字节存储每个值。比如模拟量通常用2字节整数表示状态量则每16个通道打包成2字节。我曾经写过一个Python解析脚本用struct模块解包这些二进制数据。2.4 信息文件(.INF) - 补充备忘录.INF文件是可选的非标准补充信息相当于数据的备忘录。不同厂商会在这里放不同的内容有的记录GPS时间同步状态有的保存故障录波器的触发条件甚至还有波形截图。这个文件没有固定格式完全看厂商心情。3. 实战解析COMTRADE文件3.1 从采样值到物理量的转换拿到COMTRADE文件后第一步就是把.DAT中的原始采样值转换为有意义的物理量。以这个配置为例3, U2:C,C,U2:C,kV,0.001855,0.095568,0.0,-16376,16376,1.0,0.0,p假设.DAT中对应通道的采样值是8000那么实际电压计算如下实际值 0.001855 × 8000 0.095568 14.935568 kV这里有个坑要注意有些老设备生成的.CFG文件中fMin和fMax值可能不准确。我建议在实际解析时应该扫描整个.DAT文件统计各通道的真实最小最大值。3.2 处理多采样率数据COMTRADE支持多采样率配置这在分析暂态过程时特别有用。比如下面这个配置50 2 5000, 6300 10, 200表示基波频率50Hz使用了两个采样率故障期间用5000Hz采了6300个点故障后用10Hz采了200个点。解析这种数据时需要根据采样点序号切换计算方式。3.3 二进制格式解析技巧二进制格式的.DAT文件解析起来更复杂但效率更高。每个采样点通常包含4字节序号4字节时间戳每个模拟通道2字节小端序每16个状态通道打包成2字节用Python解析的代码片段可能是这样的import struct with open(data.DAT, rb) as f: while True: sample f.read(4 4 2*analog_count 2*((digital_count15)//16)) if not sample: break n, timestamp struct.unpack(II, sample[:8]) analogs struct.unpack( h*analog_count, sample[8:82*analog_count])4. 常见问题与解决方案4.1 文件版本兼容性问题COMTRADE有1991和1999两个主要版本关键区别在于.CFG文件的字段定义。我建议解析前先检查.CFG第一行的版本年份。如果缺失默认按1991版处理。曾经遇到过一个1991版文件其中时间戳单位是毫秒而非微秒导致整个分析时间轴错乱。4.2 通道映射混乱有些设备生成的.CFG文件中通道顺序可能与实际接线不符。我开发了一个检查方法先找几个已知量如正常相的电压确认其通道位置是否正确。有一次发现A相电压通道实际接的是C相数据差点导致错误结论。4.3 数据不完整问题.DAT文件中可能出现99999ASCII或0x8000二进制这样的特殊值表示数据丢失。处理这种情况时建议用前后采样点的插值替代或者在绘图时断开连接。