IEC 61850:GOOSE报文详细解析(下篇)
🐈前置知识
🐈一、GOOSE报文结构
🐈⬛1.1 报文头(共26字节)
1、MAC地址(12字节)
2、Tag标签头信息(4字节)(可选字段)
3、Ethertype以太网类型值(2字节)
4、APPID应用标识(2字节)
5、Length长度字段(2字节)
6、Reserved保留位(4字节)
🐈⬛1.2 应用协议数据单元APDU
1、APDU数据T-L(TL格式)
2、GoCBRef(TLV格式):GOOSE控制块引用
3、Time Allowed to Live(TLV格式):最长等待时长
4、DataSet(TLV格式):数据集引用名
5、GoID(TLV格式):GOOSE报文唯一标识
6、StNum时间(TLV格式):事件时标(t)
7、StNum值(TLV格式):状态号
8、SqNum值(TLV格式):顺序号
9、Test(TLV格式):检修标识
10、ConfRev(TLV格式):配置版本号
11、NdsCom(TLV格式):未配置标志
12、NumDataSetEntries(TLV格式):数据集条目数
13、GOOSE数据T-L(TL格式):字节数量Data
14、AllData(TLV格式):全体数据项,由许多TLV链组成
15、补充说明GOOSE数据的q属性
🐈⬛1.3 尾部填充与帧校验域(PAD/FCS 段)
1、MAC 填充(PAD,若干0x00)
2、MAC 计算检验(CRC,4 字节)⭐⭐⭐
🐈二、GOOSE报文字段速查表⭐⭐⭐⭐⭐⭐
🐈⬛2.1 GOOSE的报文帧格式
🐈⬛2.2 GOOSE的APDU格式
🐈前置知识
详见GOOSE报文详细解析(上篇)
GOOSE报文详细解析(上篇)https://blog.csdn.net/m0_62876521/article/details/161718719
🐈一、GOOSE报文结构
🐈⬛1.1 报文头(共26字节)
GOOSE报文头由以太网数据帧18字节 + GOOSE报文头8字节组成,共计26字节。
1、MAC地址(12字节)
目的地址(6字节):GOOSE报文目的地址前四个字节固定为"01-0C-CD-01",第四个字节为"01"时代表GOOSE。后两字节按应用层 GOOSE 控制块 APPID分配,拥有相同APPID的MAC也是相同的。
IEC61850规定GOOSE报文目的地址取值范围为01-0C-CD-01-00-00到01-0C-CD-01-01-FF,一共有512个可用组播MAC地址
源地址(6字节):发送方设备的MAC地址。
2、Tag标签头信息(4字节)(可选字段)
TPID(2字节)+ TCI(2字节),共4字节。
IEC61850仅推荐 GOOSE 划分 VLAN,VLAN 标签在 GOOSE 协议定义里是可选字段,非强制必填,这个点我们会在后续其他文章中继续关注。
(1)TPID(Tag Protocol Identifier)标签协议标识(2字节)
固定为0x8100
交换机接收到帧,读到0x8100就判定帧携带VLAN标签,继续解析后面TCI
(2)TCI(Tag Control Information)标签控制信息(2字节)
TCI=PCP+DEI+VID
| 字段 | 位数 | 说明 |
|---|---|---|
| PCP | 3bit | 用户优先级代码点,定义数据链路层转发优先级(802.1p),用于QoS流量调度,交换机端口队列按PCP值区分调度,高优先级流量优先转发,减少延迟。 |
| DEI | 1bit | 丢弃指示位,拥塞时的丢弃标记。0=默认不可优先丢弃(重要流量),1=允许优先丢弃(多用于日志、备份、监控等)。 |
| CFI | 1bit | 规范格式指示,和DEI复用。0=标准以太网格式(默认固定值),1=令牌环等非以太网格式,目前CFI 彻底废弃恒为 0,不计入2字节TCI。 |
| VID | 12bit | VLAN编号,VLAN唯一标识。VID=0保留(仅透传PCP优先级),VID=1~4094用户可配置,VID=4095系统内部保留。 |
3、Ethertype以太网类型值(2字节)
0x88B8,代表该数据帧是一个GOOSE报文
0x88BA,代表该数据帧是一个SMV报文
0x88B9,代表该数据帧是一个GSSE报文
IEC 61850中各种报文的以太网类型已经由IEEE的著作权注册机构进行了注册,是独一无二的
4、APPID应用标识(2字节)
取值范围:0x0001 ~ 0x3FFF,代表当前数据流的应用编号。
同一变电站内/同一组播网段里,所有GOOSE、SV流的APPID不能重复,用来唯一标识一组GOOSE控制块/SV采样值流,拥有相同APPID的MAC也是相同的。
收到报文后,设备通过APPID匹配本地配置,判断是哪一路业务数据。
有时候,APPID和MAC地址最后两个字节完全一样,因为都具有唯一性,所以常作为标识。
5、Length长度字段(2字节)
表示数据帧从应用标识APPID(2字节)开始到应用协议数据单元APDU结束的部分共有多少个字节,注意虽然Length排在APPID之后,但是总长度是从APPID开始算的。
6、Reserved保留位(4字节)
Reserved 1(2字节)+ Reserved 2(2字节),共4字节
默认值为"00 00 00 00"
🐈⬛1.2 应用协议数据单元APDU
1、APDU数据T-L(TL格式)
标记61H,长度可变。标志GOOSE的APDU正式开始。
2、GoCBRef(TLV格式):GOOSE控制块引用
(1)作用:用于在SCD/ICD模型、报文、配置文件中精准定位某一个GOOSE控制块。遵循IEC 61850分层命名规则,全站唯一。
(2)命名格式:IED名称/访问点/逻辑设备/逻辑节点.控制块名
- 举例:
IED1/AP1/LD1/XCBR1.GO$GOOSE1
(3)功能约束 FC:
给数据对象划分用途标签,限定这条数据能干什么、哪种报文能带它
gocbRef → GOOSE 控制块 → FC=GO,数据进入 GOOSE 数据集,通过 GOOSE(0x88B8)组播发送。
svcbRef → SV 采样控制块 → FC=SV,数据进入 SV 数据集,通过 SV(0x88BA)组播发送。
3、Time Allowed to Live(TLV格式):最长等待时长
允许生存时间 / 存活超时时间
心跳保活机制:GOOSE除了变位突发报文,还会周期发送心跳报文
正常工况:发送端按固定周期发GOOSE心跳帧,接收端每次收到报文,刷新本地超时计时器。心跳发送间隔 < TAL,计时器永远达不到TAL,链路状态正常
异常工况:接收端持续收不到报文,计时器不断累加;一旦计时 ≥ TAL,则判定断网/装置死机/链路中断,立即上送GOOSE通信中断告警
4、DataSet(TLV格式):数据集引用名
(1)本质:把多个遥信、遥测等数据打包成一组,GOOSE/SV 按整包上送,不单点单发。
(2)绑定关系:
1 个 GOCB(GOOSE 控制块)只能绑定 1 个 DataSet;
1 个 DataSet可被多个 GOCB/SVCB 共用。
(3)报文作用:报文中携带数据集名称,接收方依靠名称匹配本地数据集,解包取出所有点位数据。
(4)命名规则:全站唯一,防止订阅匹配错误。
5、GoID(TLV格式):GOOSE报文唯一标识
每个GOOSE报文的唯一性标识
接收方通过对目的地址、APPID和goID等参数进行检查,判断是否是其所订阅的报文
订阅过滤机制🔅:
接收端收到GOOSE帧后,依次校验:目的MAC地址 → APPID → GOID,全部匹配才解析数据,否则直接丢弃报文。
目的MAC:大铁门(拦大流量)
APPID:应用门(区分不同业务流)
GOID:身份牌(最终确认是不是我要订阅的这路GOOSE)
6、StNum时间(TLV格式):事件时标(t)
GOOSE报文产生时的时标,其值为GOOSE数据发生变位的时间,即状态号StNum加1时候的UTC格林威治时间,国内本地时间 = UTC时间 + 8小时。
记录数据变位、stNum自增的真实发生时刻,而不是报文发送时间!
最后一个字节代表品质因数,时间品质反应最后一次状态变位发生时候的时间品质,而不是当前状态的时间品质
7、StNum值(TLV格式):状态号
用于记录GOOSE数据发生变位的总次数。
变位时自增1,稳态保持不变。
稳态周期补发报文,stNum 数值不变。
8、SqNum值(TLV格式):顺序号
用于记录稳态情况下报文重复发出的帧数。
装置每发出一帧GOOSE报文,SqNum应加1。
当有GOOSE数据变化时,StNum+1 ,SqNum归0,从头开始重新计数。
9、Test(TLV格式):检修标识
布尔型(True/False),用于标记发送端装置检修状态
跨装置检修闭锁的核心机制
只要装置检修压板状态改变,后续所有发出的GOOSE报文,test位同步更新:
检修压板投入 → test = True
检修压板退出 → test = False
接收装置必须比对自身检修压板状态与报文内test位:
状态一致(同为检修/非检修):报文判定有效,正常解析、执行动作、上送信号
状态不一致:报文判定无效,直接闭锁,不执行跳闸、联跳等危险动作,仅可做监视
10、ConfRev(TLV格式):配置版本号
整型字段,标记GOOSE数据集的配置变更次数
(1)初始值:数据集首次配置完成后,赋予初始版本
(2)触发自增:只要数据集内容/结构改动,confRev就+1
模型中增、删数据成员
调整数据项排列顺序
修改数据集关联属性
(3)不触发自增:仅修改压板、APPID、MAC、心跳周期、TAL、goID等非数据集本身参数,版本号不变
(4)接收端校验逻辑:
接收装置本地缓存已订阅流的ConfRev;若报文版本号 ≠ 本地记录,判定两端数据集配置不一致,上送配置不匹配告警,停止解析执行业务,避免因点位错位导致误动。
11、NdsCom(TLV格式):未配置标志
布尔型变量,用于指示GOOSE链路/控制块是否需要进一步配置
校验优先级很高
接收设备收到报文后,会先检查该位:
为True:判定链路未就绪,通常闭锁业务动作、仅做状态监视,不上送有效遥信/不执行联跳。抓包看到ndsCom=True,直接定位模型/配置未下装完整,不用逐条核对参数
为False:配置正常,结合test、confRev等其他校验项,正常处理报文
触发ndsCom变更的场景:
| 状态 | 触发场景 |
|---|---|
| 置为True | 装置恢复出厂、清空配置;重新导入ICD/SCD文件、修改GOCB/Dataset后未完成重启/生效;链路、订阅关系、通信参数未完整配置 |
| 置为False | 完整下装配置、装置重启生效;所有关联参数(APPID、MAC、订阅、数据集)配置齐全并自检正常 |
12、NumDataSetEntries(TLV格式):数据集条目数
GOOSE数据的ASN.1编码单元个数
其值为多少即代表该GOOSE数据集中含有多少个成员,相应地报文AllData部分含有多少个数据项(一整个TLV链算一个数据项)
13、GOOSE数据T-L(TL格式):字节数量Data
GOOSE数据T-L格式,该部分是GOOSE报文所传输的数据当前值。
该部分各个条目的含义、先后次序和所属的数据类型都是由配置文件中的GOOSE数据集定义的。长度即为AllData中全部数据的总字节长度。
14、AllData(TLV格式):全体数据项,由许多TLV链组成
8301 00是一个数据项,对应NumDataSetEntries=1,对应Data=3;
8301 008403 03 00 009108 00 00 00 00 00 00 00 00是三个数据项,对应NumDataSetEntries=3,对应Data=18。
(1)GOOSE状态:RPIT/XCBR1.Pos.stVal(数据1),标记=83H,长度=1字节
含义:断路器本体实际分合位置值(双点位)
用途:GOOSE 核心变位数据,分合闸变位优先触发 GOOSE 推送
双点规范取值:0:中间位置、1:分位、2:合位、3:异常故障位
(2)GOOSE状态:RPIT/XCBR1.Pos.q(数据2),标记=84H,长度=2字节
含义:位置数据质量品质码(2 字节 IEC61850 品质标志)
用途:用来判断 stVal 位置数据是否可信、有无异常失真
(3)GOOSE状态:RPIT/XCBR1.Pos.t(数据3),标记=91H,长度=8字节
含义:断路器位置最近一次变位的 UTC 高精度时间戳(IEEE64bit 时间,秒 + 纳秒)
用途:记录分合闸动作发生时刻,故障时序溯源、多间隔开关动作先后顺序校对
(4)GOOSE整型:RPIT/DT1ZBAT1.Vol.mag.i(数据4),标记=85H,长度=4字节
(5)GOOSE浮点:RPIT/DT1ZBAT1.Vol.mag.f(数据5),标记=87H,长度=5字节,固定前缀08H
15、补充说明GOOSE数据的q属性
GOOSE状态:RPIT/XCBR1.Pos.q(数据2),标记=84H,长度=2字节
| bit15 | bit14 | bit13 | bit12 | bit11 | bit10 | bit9 | bit8 | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1/0 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 未用 | 未用 | 未用 | 操作员闭锁 | 测试 | 源 | 不精确 | 不一致 | 旧数据 | 故障 | 抖动 | 坏基准值 | 超值域 | 溢出 | 有效性:00 = 好,01 = 无效,10 = 保留,11 = 可疑 |
🐈⬛1.3 尾部填充与帧校验域(PAD/FCS 段)
1、MAC 填充(PAD,若干0x00)
(1)位置:APDU之后、CRC 之前,字段长度可变、按需添加若干0x00,无则空缺。
(2)作用:以太网整帧(目的 MAC~末尾 CRC)最小 64 字节。
标准无 VLAN 帧
以太网帧头固定:DMAC (6)+SMAC (6)+EtherType (2) = 14字节
末尾CRC固定:4字节
APDU+PAD最小:46字节
若APDU 实际长度<46 字节 → 补充 PAD(全 0x00)补齐至 46 字节
若APDU≥46 字节 → 无填充字节
带 VLAN (802.1Q) 标签
以太网帧头固定:DMAC (6)+SMAC (6)+VLAN(TPID(2)+TCI(2))+EtherType (2) = 18字节
末尾CRC固定:4字节
APDU+PAD最小:42字节
若APDU 实际长度<42 字节 → 补充 PAD(全 0x00)补齐至 42 字节
若APDU≥42 字节 → 无填充字节
2、MAC 计算检验(CRC,4 字节)⭐⭐⭐
(1)长度:固定4 字节(32bit)
(2)范围:从 GOOSE 报文头起到 APDU 最后一字节,包含PAD,不含 CRC本身。
(3)CRC报文存放:低字节在前、高字节在后(小端 )
例:CRC 计算结果 = 0x11223344
报文存放:
44 33 22 11(首字节:低 8 位,第四字节:高 8 位)
(4)算法:CRC-32-IEEE(标准 IEEE 802.3 CRC32)
初始值:
0xFFFFFFFF多项式:
0xEDB88320结果异或值:
0xFFFFFFFF
运算过程描述:
1. 寄存器一开始 =
0xFFFFFFFF,把每一个字节依次丢进去运算;2. 先取当前字节最低 1 位(bit0),与寄存器最低位 XOR,寄存器右移 1 位;
3. 如果XOR 结果 = 1,寄存器异或多项式 0xEDB88320;
4. 如果XOR 结果 = 0,不异或,直接继续,然后处理字节的bit1 → bit2 → ... → bit7;
5. 一个字节处理完,继续下一个字节,所有字节算完后,用此结果再次异或0xFFFFFFFF,最后得到最终 CRC 结果。
(5)算法过程示例:
CRC初始值:0xFFFFFFFF
待检验数据:00000000
第一次循环开始:bit0 = 0
XOR 结果 = bit0 ⊕ CRC最低位 = 0 ^ 1 = 1
CRC右移1位,低位去1,高位补0 :0xFFFFFFFF→ 0x7FFFFFFF
XOR 结果 = 1,寄存器 0x7FFFFFFF异或多项式 0xEDB88320
0x7FFFFFFF ^ 0xEDB88320= 0x92477CDF
仿照次循环进行剩余7此循环
循环结束后结果为0xD202EF8D,用此结果再次异或0xFFFFFFFF得到最终结果
最终结果为0x2DFD1072
小端方式存放到报文中为72 10 FD 2D
(6)作用
链路差错校验:接收方重新计算整包 CRC,和报文末尾 4 字节比对,不一致直接丢弃报文; 完全一样则校验正确,报文有效。
防止传输中 AllData 内点位值、品质 q、时标 t、浮点数据出现比特畸变。
🐈二、GOOSE报文字段速查表⭐⭐⭐⭐⭐⭐
🐈⬛2.1 GOOSE的报文帧格式
| 说明 | 报文内容 |
|---|---|
| MAC目的地址(6字节) | 01-0C-CD-01-00-00到01-0C-CD-01-01-FF |
| MAC源地址(6字节) | 发送方设备的MAC地址 |
| TPID(2字节) | 固定值0x8100 |
| TCI(2字节) | 默认值0x4000,可修改 |
| Ethertype(2字节) | 固定值0x88B8 |
| APPID(2字节) | 0x0000~0x3FFF |
| Length(2字节) | APPID+Length+Reserved 1/ 2+APDU(共2+2+2+2+m字节) |
| Reserved 1(2字节) | 默认值0x0000 |
| Reserved 2(2字节) | 默认值0x0000 |
| APDU(m字节) | m个字节 < 1493 |
| MAC填充(若干字节) | 若干字节 |
| MAC计算检验(4字节) | CRC(4字节) |
🐈⬛2.2 GOOSE的APDU格式
| 说明 | 报文内容(TLV格式) |
|---|---|
| APDU数据T-L | 标记=61H,长度=后续全部字节数量 |
| GoCBRef | 标记=80H,长度≤65,GOOSE控制块索引 |
| TAL | 标记=81H,长度≤5,允许生存时间 |
| DataSet | 标记=82H,长度≤65,DataSet字符串 |
| GoID | 标记=83H,长度≤65,GoID字符串 |
| t | 标记=84H,长度=8,事件时标,UTC时间 |
| StNum | 标记=85H,长度≤5,StNum初始值为1,值0保留 |
| SqNum | 标记=86H,长度≤5,SqNum初始值为1,StNum变化时值为0 |
| Test | 标记=87H,长度=1,bool值 |
| ConfRev | 标记=88H,长度=1,配置版本号 |
| NdsCom | 标记=89H,长度=1,未配置好标志 |
| NumDataSetEntries | 标记=8aH,长度≤5,ASN.1编码单元总个数 |
| GOOSE数据T-L | 标记=abH,长度为所传输全部数据的总字节长度 |
| GOOSE状态 | 标记=83H/84H/91H,长度=1/2/8,stVal/q/t |
| GOOSE整型 | 标记=85H,长度=4,INIT32(4字节) |
| GOOSE浮点 | 标记=87H,长度=5,含固定前缀08H,INIT32(4字节) |
