
简介智能变电站GOOSE/SV报文解析是电力自动化运维中的关键技能这份资源面向需要深入理解IEC 61850报文格式的二次系统工程师与电力通信开发人员围绕通用对象事件与采样值两类核心协议系统讲解基于ASN.1编码的报文结构和字段提取方法。压缩包共13个文件以C源文件、头文件及Visual C工程配置为主并附带goose.txt和smv.txt等报文示例文本整体仅10KB便于快速阅读与直接编译调试。资源中的可运行解码程序内置完整的ASN.1解析逻辑读者可以对照示例报文学习如何识别设备标识、数据值、采样率、时间戳等关键字段并进一步构建自己的报文分析工具或形成排错思路。目前已有2824人学习下载对正在从事智能变电站调试、继电保护或电力通信协议研究的工程师有较强的实用参考价值。1. 进站调试第一次被GOOSE/SV报文难住是怎么破局的前几年我去一座新建的智能变电站做保护调试后台监控频繁报“GOOSE断链”“SV采样异常”但保护装置本身又没有闭锁硬压板也好端端的。老师傅说拿录波器看看结果录波器里一条报文都没有几个人围着机柜转了一下午。后来我干脆把笔记本接进交换机镜像口装了个Wireshark一抓才发现问题根本不在装置而是交换机上VLAN配置没放通GOOSE组播报文压根没传到装置那个端口。从这以后我就明白智能变电站的二次调试如果不懂报文解析基本等于闭着眼睛干活。智能变电站里保护、测控、合并单元、智能终端之间靠的都是网络通信而GOOSE和SV是其中最关键的两类报文GOOSE负责传开关量状态和跳合闸命令SV负责传电压电流采样值。它们都基于IEC 61850标准跑在以太网上从链路层直接组播发送不走TCP/IP协议栈。这个特性决定了解析方式跟平时看网络数据包完全不一样。所以这篇文章我打算把GOOSE/SV报文解析这件事从头到尾讲透。从抓包准备到逐层拆解再到现场最容易踩的坑尽量把我实操时的心得写出来。不管你是刚接触智能站的调试新人还是已经做了几年保护检修的工程师这套方法都能直接用上。1.1 为什么非要自己学会解析报文很多人觉得我有厂家调试软件有后台监控系统报文内容都能看到何必自己抓包解析。这话对一半。厂家软件能看到的是“它想让你看到的”比如保护装置收到了几帧SV、某个开关量是合位还是分位。但当你需要判断“报文为什么没收到”“链路断在哪一环”“为什么这台装置收得到、那台收不到”的时候后台软件往往帮不上忙因为问题很可能在交换机配置、光纤链路、组播地址映射这些底层环节上。另外智能变电站的SCD配置文件里GOOSE和SV的发送地址、APPID、VLAN ID、数据集类型都是提前配好的。现场调试时SCD文件改一处后面所有装置的虚端子连线就得跟着校验。如果自己会解析报文就能直接验证装置实际发出的报文和SCD文件里定义的参数是否一致这一步是任何后台软件都不能替代的。1.2 解析前必须搞清的三件套组播、VLAN、APPIDGOOSE和SV都是在链路层直接组播的报文它们不发到IP层所以没有IP地址和端口号这些概念。要正确识别和解析它们有三个关键标识必须先搞明白第一是组播MAC地址。GOOSE组播MAC通常在01:0C:CD:01开头SV组播MAC通常在01:0C:CD:04开头。这个前缀相当于报文的“门牌照”Wireshark只要看到这个MAC段就能判断这是IEC 61850家族的报文。第二是VLAN也就是虚拟局域网。智能变电站的站控层网络、过程层网络一般会划分不同VLAN来隔离广播域。GOOSE和SV报文在以太网头后面通常带一个802.1Q VLAN标签里面有VLAN ID和优先级字段。如果交换机没把对应VLAN放到某个端口报文就传不过去。很多调试难题最后都出在这一步。第三是APPID应用标识。它占用两个字节用于在同一VLAN内区分不同的GOOSE控制块或SV控制块。SCD文件里每个控制块都有唯一的APPID抓包时看APPID就能快速定位是哪一条链路在发包。2. 抓包准备一台笔记本加一个镜像口就够了工欲善其事必先利其器。做GOOSE/SV报文解析不需要多贵的专用设备笔记本加Wireshark加一个正确的网络接入点就能覆盖90%以上的现场调试场景。2.1 抓包链路怎么搭第一步是把笔记本接到过程层交换机上。但这里有个关键细节不能直接插普通业务口要插在镜像口上。因为过程层交换机的业务口本身是VLAN隔离的插上去只能收到本端口的组播流量而且会干扰装置之间原有的通信。镜像口的原理是把交换机上几个业务口收发的报文复制一份转发出来如同在通信线路上接了一个读头不影响原通信。具体做法是登录交换机管理界面找到端口镜像配置页把连着合并单元、保护装置、智能终端的几个关键端口全部设为镜像源端口把笔记本电脑接的端口设为目的端口。有些交换机支持把镜像目的端口改成“不入VLAN”模式这样抓包时不会因为VLAN成员关系影响报文接收建议开启。第二步是配置网卡。Wireshark默认能识别绝大多数千兆网卡但如果笔记本只有一个网口而现场要同时抓SV和GOOSE两套网络建议带一个USB千兆网卡备用。另外有些型号的笔记本网卡驱动默认关闭混杂模式需要在Wireshark里把网卡设为“混杂模式”否则只能收到目的MAC是自己网卡的报文组播包基本看不着。第三步是用光纤还是网线。现在很多智能变电站过程层网络是光纤组网装置背板是LC或ST光口。你可以用光模块把光信号转成电信号后再接网口也可以直接把光电转换器接到笔记本上。实测下来USB免驱的光电转换器最方便不用装驱动即插即用。2.2 Wireshark过滤器的正确打开方式抓包的时候过程层网络上流量不会只有GOOSE和SV还有可能混着MMS报文、PTP对时报文、甚至一些设备主动发的广播包。如果不过滤直接看Wireshark的滚动列表会让人眼花缭乱。最常用的过滤器就这几条# 只看GOOSE报文不带VLAN标签时 eth.type 0x88b8 # 只看SV报文 eth.type 0x88ba # 同时看GOOSE和SV eth.type 0x88b8 || eth.type 0x88ba # 如果报文带了VLAN标签用下面这种 vlan (eth.type 0x88b8 || eth.type 0x88ba) # 更省事的方法Wireshark自带解析器名称 goose || sv这里要注意新版本Wireshark对IEC 61850协议支持已经比较完善只要抓到GOOSE或SV会自动在Protocol列显示“GOOSE”或“SV”并且把APDU内部字段逐层展开。我见过一些人不会用过滤器在几百万条报文里手动翻找效率极低。正确做法是先用过滤器把范围缩小再根据需要添加更细的条件比如只看某个具体APPIDgoose goose.appid 0x1001 sv sv.appid 0x40012.3 如何判断抓到的包“合法”抓到包以后别急着解析字段先做三个快速判断。第一看报文长度GOOSE报文通常在二百字节左右SV报文因为带采样值数据集一般在二百多字节如果长度明显异常比如只有几十字节可能是网线质量问题或光电转换器丢帧。第二看报文的连续性GOOSE在稳定状态下是周期性重发的SV是按采样率定时发送的如果抓包列表里有大段空白或者间隔忽大忽小说明网络里有丢包或拥塞。第三看是否有CRC错误帧Wireshark里那些带“TCP checksum offload”标记的帧不用管但如果出现大量bad CRC基本可以判断是物理链路或光模块问题。3. GOOSE报文逐层拆开跳闸信号是怎么从装置到装置的GOOSE报文是智能变电站里最重要的一类报文因为保护装置的跳闸命令、闭锁信号、重合闸命令全是靠它传的。一旦GOOSE链路出问题保护逻辑再正确也没用因为命令根本送不出去。3.1 二层头里藏着定位信息打开一条GOOSE报文第一层是以太网帧头。以太网帧头一共14字节分布如下字段长度说明目的MAC6字节组播地址通常是01:0C:CD:01开头源MAC6字节发送装置网口的MAC地址EtherType2字节0x88B8标识这是GOOSE报文目的MAC前面提到过是组播地址。这里有一个实用的点每台装置发送GOOSE的源MAC会落在它自己的物理网口上调试时可以把“源MAC”和“装置铭牌”对应起来。后续抓包时一看到这个MAC就知道是哪台装置发的不用每次都对台账。EtherType是0x88B8这是IEEE分配给GOOSE的专用类型。但要注意很多报文前面会带VLAN标签这时代理头字段会变成TPID 0x8100加TCI真正的EtherType被VLAN标签“挤”到了后面。如果用Wireshark看它会在VLAN字段里面再显示一次EtherType初学的人容易看晕。记住一点VLAN标签不改变报文原来的类型标识只是多包了一层。EtherType往后是APPID字段占了2个字节。我习惯在抓包时先看APPID因为它直接对应SCD里的控制块。比如保护装置A发的GOOSE若是APPID0x1001那我在Wireshark里过滤goose.appid 0x1001过滤出来的每一帧都应该是保护装置A发出的。3.2 APDU里面的TLV心脏stNum与sqNum跳过APPID之后还有长度字段、保留字段然后在报文末尾出现真正的核心内容——APDU应用协议数据单元。IEC 61850-8-1规定GOOSE的APDU采用ASN.1 BER编码核心是BASIC-BER的TLV结构即“标签-长度-值”Tag-Length-Value。调试中不需要深究每一层ASN.1编码但有两个字段必须看懂stNum和sqNum。stNum是状态号也称事件计数。数据集里任意一个成员值发生变化比如断路器从分位变成合位stNum就会加1。sqNum是序号在同一stNum周期内的每一次重发sqNum依次加1。这两个字段组合起来就是判断GOOSE链路健康状态的“心电图”。稳定状态下装置会按照心跳间隔周期重发同一帧此时stNum不变sqNum缓慢增长。一旦有事件发生stNum立刻加1sqNum归零同时报文按照“快速重发”机制连续发好几帧。抓包时如果看到stNum频繁跳动说明被监视的设备状态在反复变化如果长时间不发帧说明链路断了或者装置死机了。3.3 一个真实GOOSE报文的现场解析我拿一个实际抓包例子来走一遍。假设抓到的GOOSE报文Wireshark展开后的关键字段为Ethernet II Destination: 01:0c:cd:01:00:01 Source: 00:0e:08:5a:23:11 Type: 0x88b8 (GOOSE) 802.1Q Virtual LAN ID: 100 Priority: 4 GOOSE APPID: 0x1001 Length: 152 Reserved 1: 0 Reserved 2: 0 APDU: ... gocbRef: AA01/LLN0$GO$GOOSE1 timeAllowedtoLive: 5000 datSet: AA01/LLN0$dsGOOSE1 goID: AA01/LLN0/LLN0$GO$GOOSE1 t: 2024-05-16 10:30:22.123456 stNum: 25 sqNum: 3 test: False confRev: 1 ndsCom: False numDatSetEntries: 4 allData: 4 items Data: 1 (Boolean) Data: 0 (Boolean) Quality: 0x0000 (good) Data: 100 (Integer)这条报文从哪里看起先看gocbRef和datSet它们对应SCD文件里的控制块名称和数据集名称。如果现场配置有改动这两个名字对不上基本就是SCD一致性有问题。再看timeAllowedtoLive这个值一般设置为5000毫秒表示接收方如果在5秒内收不到下一帧GOOSE就判定链路中断这在装置里叫做“GOOSE断链告警”。所以现场调试时如果装置报断链可以先看抓包里的timeAllowedtoLive是不是符合预期。然后看stNum和sqNum。这条报文stNum25sqNum3说明这是一次事件后被重发出来的帧属于事件后的快速重发过程。最后看allData里面是数据集的实际内容。第一个Data是1可能对应一个断路器位置信号第二个Data是0对应另一个开入量。旁边的Quality字段是品质位good表示数据有效。这里的具体含义取决于SCD文件里的虚端子定义抓包只能帮你看到“值”要理解“值”代表什么设备状态还得翻配置。3.4 重发机制为什么事件后报文不是一条刚开始做报文解析的人常有个疑问一个跳闸命令为什么抓包会抓到好几条一模一样的GOOSE这不是网络故障而是GOOSE的防丢帧机制。IEC 61850规定GOOSE在事件发生后按照T1、T1、T2、T3……的时间间隔快速重发间隔从2毫秒开始逐次翻倍直到回到稳定状态的T0心跳间隔。这样做的目的是保证即使网络里丢了一两帧接收方也能在极短时间内收到兜底报文。我在现场看抓包时习惯把时间列显示出来观察一条事件发生后GOOSE的时间间隔变化。正常波形是事件发生瞬间发出第一条隔2毫秒发第二条再隔2毫秒发第三条然后4毫秒、8毫秒、16毫秒……直到间隔拉到心跳值。如果抓包看到事件后只发了一条就不再发或者重发间隔变成几秒说明装置的GOOSE机制异常需要联系厂家处理。4. SV报文完全不是“一条命令”那么回事和GOOSE相比SV报文解析更枯燥也更需要细心。SV的全称是Sampled Value采样值由合并单元按固定频率发送给保护、测控装置。读好SV报文本质上就是和“采样率、变比、品质位”这三个词打交道。4.1 SV的格式与送数频率SV报文在以太网二层上的格式和GOOSE很像也是目的MAC加源MAC加VLAN加EtherType不过EtherType是0x88BA。最大的区别在后面SV的APDU是savPdu结构里面先是一个noASDU字段表示后面有几个ASDU再按顺序排列每个ASDU。合并单元的采样率决定了SV报文的发送频率。国内常见的采样率有每周波80点对应4000Hz和每周波256点对应12800Hz两种模式。每周波80点多用于保护每周波256点多用于计量。抓SV包时如果发现每秒收到的报文数量远低于采样率乘以频率比如50Hz下每周波80点应该是每秒4000帧大概率是丢包了。打开一条SV报文Wireshark里的字段大概长这样SV APPID: 0x4001 Length: 142 APDU: ... savPdu noASDU: 1 ASDU 1 svID: MU01/LLN0$MS$SV1 smpCnt: 3520 confRev: 1 smpSynch: 0 seqData Data: 12345 Data: 6789 ...注意这里的svID它对应SCD文件里的采样值控制块名称。smpCnt是采样计数器每收到一帧smpCnt按序增加增加到一周波最大点数后归零重新计数。调试时看smpCnt是否连续增加是判断SV链路有没有丢帧最直接的方法。4.2 ASDU里的采样值到底怎么读SV报文的ASDU里seqData存放的是采样值本身一般用32位整型INT32或浮点型编码。这里容易踩坑的地方是报文里的原始值不能直接当二次电流电压的物理值用。举个例子某线路合并单元的CT变比是1200/1A二次额定电流是1A。保护用SV每周波80点采样ASDU里的原始采样值如果是12345它对应的实际电流值是多少得看合并单元的“采样值缩放因子”。有的工程配置里一个LSB代表1mA即缩放因子0.001那12345就代表12.345A的二次瞬时值。另一些工程用满量程映射原始值和二次值之间的关系就不一样了。所以做SV报文解析时一定先查SCD文件或合并单元的配置确认采样值的类型、缩放因子再换算成能直接做判断的物理量。我在现场吃过这个亏刚开始看SV原始值觉得电流大得离谱后来才发现是没乘缩放因子白白排查了一个下午。4.3 从smpCnt看丢帧从品质位看健康除了数值本身SV报文里的品质位是判断数据是否可信的重要依据。SV的DataQuality里包含有效性validity、溢出overflow、超范围outOfRange、测试test等标志位。正常情况下品质位是good但合并单元自身检测到异常时会在品质位里打上invalid或questionable标记。我记得有一次某间隔合并单元的SV报文看起来一直在正常发送但保护装置频繁报“SV异常”。我抓包一看smpCnt连续性没有问题报文间隔也稳定但品质位全都显示invalid。后来查下来是合并单元内部时钟同步丢失导致采样数据打上了无效标记。如果不看品质位以为报文在发就是健康那就被表象骗了。5. 调试现场最容易翻车的几个坑写了这么多原理接下来把我在现场踩过或者看别人踩过的坑集中梳理一下这些坑往往只靠书本是碰不到的。5.1 以为解析软件能搞定一切抓包解析只是手段不是目的。有些厂家提供的报文解析软件确实能把字段拉成中文表格甚至直接显示含义但它有个局限只能解析“它能识别的报文”。如果SCD文件里新增了一个私有数据集或者合并单元用的采样值编码方式比较特殊厂家软件可能直接识别不出来这时候手工用Wireshark逐层看反而最可靠。所以我现在的习惯是厂家软件和Wireshark同时开一个用来快速看业务信息一个用来核对底层字段。5.2 VLAN没放通导致“明明抓到了报文但装置收不到”这个坑我在文章开头提过值得再强调。镜像口抓包有个特点你能抓到报文不代表目标装置就一定能收到。因为镜像口本身是复制流量的它把业务口的报文复制了一份给你并不影响业务口原本的转发行为。如果交换机目标端口的VLAN成员关系里没有包含GOOSE或SV所在的VLAN镜像口抓得到业务装置却收不到两者不能混为一谈。遇到这种情况先看镜像源端口和目标端口是否同时放通了对应VLAN再在Wireshark里看报文的VLAN ID最后去装置的液晶面板或后台看GOOSE/SV接收统计。按这个顺序排查可以快速定位问题在哪一跳。5.3 把SV报文里的原始值当一次值直接用这个坑在前面4.2节提到过这里换个角度再说。SV报文里面传的是合并单元采样后的数字量本质上已经是“二次值”的数字表示。要还原成一次电流电压首先要除以电流互感器变比。在调试时如果直接用原始值去核对保护装置的采样显示会发现两个数对不上。正确做法是先用Wireshark导出SV原始值再用Excel或者脚本按变比和缩放因子换算最后再和保护装置的显示值比对偏差应该在千分之几以内才算正常。5.4 双网配置下抓错网络智能变电站过程层网络为了保证可靠性经常采用双网配置即保护A网和保护B网两套网络在物理上完全隔离装置分别各用一个网口接入。这样设计没问题但调试时容易抓错网络明明故障点在B网结果你一直在A网抓包怎么抓都正常。我的建议是抓包前先确认装置当前的收发端口。有些装置液晶面板上可以看到A网B网各自的GOOSE接收计数和SV接收计数如果A网计数在增长而B网停住不动就去B网的交换机上抓包别只盯着一台交换机。特别是在检修时两条链路都要看一遍别只验证主链路就签字了。6. 工具选型与后续还能怎么玩报文的工具链路除了Wireshark之外还可以补充一些工程化的手段。传统做法里后台监控厂家一般自带GOOSE/SV报文监视功能能看到丢帧率、报文计数但看不到完整的应用层字段也不方便对照SCD虚端子。用Wireshark加Lua脚本可以自己写插件把私有字段解析成中文标签适合有编程基础的工程师。另外一些基于Scapy的Python脚本也能用来做离线报文批处理比如批量检查SCD文件和实抓报文的APPID一致性或者自动统计一段时间的SV丢帧率把日常巡检变成半自动化的脚本任务。做工具选型时我一般按场景来分日常巡视用后台监控自带的报文统计就够用故障排查用Wireshark手工抓包大批量比对校验用脚本自动化处理。不是工具越高级越好关键是手头有什么、现场需要什么组合起来用效率最高。前阵子我写了个小脚本输入一个PCAP文件输出GOOSE各控制块的stNum变化时间点、sqNum跳变情况以及SV的丢帧率统计。以前这几项要花一上午手工录数现在丢进去几秒钟出结果而且不会漏看。我觉得做报文解析这条路前期靠手工逐层看是打基本功中期靠Wireshark提高效率后期靠脚本把重复劳动消灭掉这才是这份技能真正的完整闭环。最后还是那句话报文解析不是看热闹是看门道。把每一层字段都拆明白了智能变电站的二次设备在你眼里就不再是黑盒子排起故障也有底气得多。本文还有配套的精品资源点击获取