GSE主要出现在IEC61850-7-2和IEC61850-8中,前者定义了ACSI(抽象通信服务接口),后者实现了SCSM(具体通信服务映射)到GSE的映射。
在分布式的变电站自动化系统中,IED共同协助完成自动化功能的应用场合越来越多,如间隔层的设备之间的防误闭锁、分布式母线保护等,这些功能得以完成的重要前提条件是IED之间数据通信的可靠性和实时性。基于此,IEC61850中定义了通用变电站事件(Generic Substation Event,GSE)模型,该模型提供了在全系统范围内快速可靠地输入、输出数据值的功能。
GSE分为两种不同的控制类和报文结构:①面向通用对象的变电站事件(Generic Object Oriented Substation Event,GOOSE),支持由数据集(Data-Set)组织的公共数据交换:②通用变电站状态事件(Generic Substation State Event,GSSE),用于传输状态变位信息(双比特)。如果只从抽象通信服务模型控制块(Control Block)的属性和服务定义两方面比较,GOOSE和GSSE差异不大,但实际上,两者的报文传输内容和实现机制截然不同。
GOOSE采用发布者/订阅者通信结构,此通信结构支持多个通信节点之间的对等直接通信。与点对点通信结构和客户/服务器通信结构相比,发布者/订阅者通信结构是一个或多个数据源(即发布者)向多个接收者(即订阅者)发送数据的最佳解决方案,尤其适合数据流量大且实时性要求高的数据通信。发布者/订阅者通信结构符合GOOSE报文传输本质,是事件驱动的。
GSSE其实是UCA2.0中定义的GOOSE,但它不支持报文优先级和虚拟局域网、无特定的多播地址等。这使得当网络负荷较重时,难以保证报文传输的实时性。GSSE目前较少使用。
从协议解析层面来看,目前已知其报文格式,包括Header,DNA和User Bits三部分,DNA的格式也可以查到,但是源文档GOMSFE .9, January 14, 1999难以获得,其次网上找不到GSSE的PCAP包,故目前暂不支持GSSE的解析。
GSE涉及两个类,10种服务。分别是GOOSE控制块类和GSSE控制块类,每个类下有5种服务。这10种服务中只有SendGSSEMessage没有明确定义,其他均已支持解析。
GoCB类
属性名 | 属性类型 | FC | TrgOp | 值/值域/解释 |
---|---|---|---|---|
GoCBName | ObjectName | GO | - | GoCB实例的实例名 |
GoCBRef | ObjectReference | GO | - | GoCB实例的路径名 |
GoEna | BOOLEAN | GO | dchg | 使能 (TRUE) |停止使能 (FALSE) |
AppID | VISIBLE STRING65 | GO | 用户赋予发出 GOOSE的应用系统唯一标识,缺省为GoCRef | |
DatSet | ObjectReference | GO | dchg | 数据集,成员从1开始编号,每个成员有唯一数字和MemberReference或功能约束DataAttribute |
ConfRev | INT32U | GO | dchg | 表示由DatSet引用的DATA-SET配置改变次数的计数值 |
NdsCom | BOOLEAN | GO | dchg |
服务
服务 | 描述 |
---|---|
SendGOOSEMessage | 发送GOOSE报文. |
GetGoReference | 检索和GOOSE报文有关的DATA-SET特定成员的FCD/FCDA |
GetGOOSEElementNumber | 检索和FCD/FCDA的GOOSE报文有关的DATA-SET成员的位置 |
GetGoCBValues | 检索GoCB的属性 |
SetGoCBValues | 写GoCB的属性 |
GsCB类
属性名 | 属性类型 | FC | 值/值域/解释 |
---|---|---|---|
GsCBName | ObjectName | GsCB实例的实例名 | |
GsCBRef | ObjectReference | GsCB实例的路径名 | |
GsEna | BOOLEAN | GS | 使能(TRUE) | 停止使能(FALSE) |
AppID | VISIBLE STRING65 | GS | GsCB所位于的 LOGICAL-DEVICE |
DataLabel [1…n] | VISIBLE STRING65 | GS | LastSentData属性内每一个条目所使用的引用 |
LSentData [1…n] | GSSEData | GS | 取自GSSE报文,代表最近一次GSSE报文发送的数据值 |
服务
服务 | 描述 |
---|---|
SendGSSEMessage | 发送GSSE报文. |
GetGsReference | 检索和GSSE报文有关的特定值的DataLabel. |
GetGSEEDataOffset | 检索和DataLabel的GSSE报文有关的特定值的位置. |
GetGsCBValues | 检索GsCB的属性. |
SetGsCBValues | 写GsCB的属性. |
GSE的asn格式描述如下,但其不包含GSSE,来源是IEC61859-8-1,但是原始的代码格式已经不支持现在版本的ASN1编译器,以下代码是参考原始代码和wireshar代码修改过的版本。
IEC61850 DEFINITIONS ::= BEGIN
IEC61850SpecificProtocol ::= CHOICE {
gseMngtPdu [APPLICATION 0] IMPLICIT GSEMngtPdu,
goosePdu [APPLICATION 1] IMPLICIT IECGoosePdu
}
GSEMngtPdu ::= SEQUENCE {
stateID [0] IMPLICIT INTEGER,
security [3] ANY OPTIONAL,
requestResp RequestResponse
}
RequestResponse ::= CHOICE{
requests [1] EXPLICIT GSEMngtRequests,
responses [2] EXPLICIT GSEMngtResponses
}
GSEMngtRequests ::= CHOICE {
getGoReference [1] IMPLICIT GetReferenceRequestPdu,
getGOOSEElementNumber [2] IMPLICIT GetElementRequestPdu,
getGsReference [3] IMPLICIT GetReferenceRequestPdu,
getGSSEDataOffset [4] IMPLICIT GetElementRequestPdu,
...
}
GSEMngtResponses ::= CHOICE {
gseMngtNotSupported [0] IMPLICIT NULL,
getGoReference [1] IMPLICIT GSEMngtResponsePdu,
getGOOSEElementNumber [2] IMPLICIT GSEMngtResponsePdu,
getGsReference [3] IMPLICIT GSEMngtResponsePdu,
getGSSEDataOffset [4] IMPLICIT GSEMngtResponsePdu,
...
}
GetReferenceRequestPdu ::= SEQUENCE {
ident [0] IMPLICIT VisibleString,
-- 可支持多达 65个八位组
offset [1] IMPLICIT SEQUENCE OF INTEGER,
...
}
GetElementRequestPdu ::= SEQUENCE {
ident [0] IMPLICIT VisibleString,
--可支持多达 65个八位组
references [1] IMPLICIT SEQUENCE OF VisibleString,
...
}
GSEMngtResponsePdu ::= SEQUENCE {
ident [0] IMPLICIT VisibleString,
-- 返回请求的值
confRev [1] IMPLICIT INTEGER OPTIONAL,
posNeg PositiveNegative,
...
}
PositiveNegative ::= CHOICE{
responsePositive [2] IMPLICIT SEQUENCE {
datSet [0] IMPLICIT VisibleString OPTIONAL,
result [1] IMPLICIT SEQUENCE OF RequestResults
},
responseNegative [3] IMPLICIT GlbErrors
}
RequestResults::= CHOICE {
offset [0] IMPLICIT INTEGER,
reference [1] IMPLICIT IA5String,
error [2] IMPLICIT ErrorReason
}
GlbErrors ::= INTEGER {
other(0),
unknownControlBlock(1),
responseTooLarge(2),
controlBlockConfigurationError (3)
}
ErrorReason ::= INTEGER {
other (0),
notFound (1)
}
IECGoosePdu ::= SEQUENCE {
gocbRef [0] IMPLICIT VisibleString,
timeAllowedtoLive [1] IMPLICIT INTEGER,
datSet [2] IMPLICIT VisibleString,
goID [3] IMPLICIT VisibleString OPTIONAL,
t [4] IMPLICIT UtcTime,
stNum [5] IMPLICIT INTEGER,
sqNum [6] IMPLICIT INTEGER,
simulation [7] IMPLICIT BOOLEAN DEFAULT FALSE,
confRev [8] IMPLICIT INTEGER,
ndsCom [9] IMPLICIT BOOLEAN DEFAULT FALSE,
numDatSetEntries [10] IMPLICIT INTEGER,
allData [11] IMPLICIT SEQUENCE OF GooseData
}
GooseData ::= CHOICE
{
-- context tag 0 is reserved for AccessResult
array [1] IMPLICIT DataSequence,
structure [2] IMPLICIT DataSequence,
boolean [3] IMPLICIT BOOLEAN,
bitstring [4] IMPLICIT BIT STRING,
integer [5] IMPLICIT INTEGER,
unsigned [6] IMPLICIT INTEGER, -- shall not be negative
floatingpoint [7] IMPLICIT FloatingPoint,
-- [8] is reserved
octetstring [9] IMPLICIT OCTET STRING,
visiblestring [10] IMPLICIT VisibleString,
generalizedtime [11] IMPLICIT GeneralizedTime,
binarytime [12] IMPLICIT TimeOfDay,
bcd [13] IMPLICIT INTEGER,
booleanArray [14] IMPLICIT BIT STRING,
--objId [15] IMPLICIT OBJECT IDENTIFIER
mMSString [16] IMPLICIT MMSString, -- unicode string
utctime [17] IMPLICIT UtcTime --UTC Time
}
DataSequence ::= SEQUENCE OF GooseData
FloatingPoint ::= OCTET STRING
UtcTime ::= OCTET STRING -- 格式和大小规定在8.1.3.6.
MMSString ::= UTF8String
TimeOfDay ::= OCTET STRING -- (SIZE (4 | 6))
END
表B1-建议的分组广播地址例子
建议的地址范围 | ||
---|---|---|
服务 | 起始地址 (十六进制) | 结束地址 (十六进制) |
GOOSE | 01-0C-CD-01-00-00 | 01-0C-CD-01-01-FF |
GSSE | 01-0C-CD-02-00-00 | 01-0C-CD-02-01-FF |
分组广播采样值 | 01-0C-CD-04-00-00 | 01-0C-CD-04-01-FF |
表C2-以太网类型值分配
使用 | 以太网类型值 (十六进制) | APPID类型 |
---|---|---|
IEC 61850-8-1 GOOSE | 88-B8 | 0 0 |
IEC 61850-8-1 GSE 管理 | 88-B9 | 0 0 |
IEC 61850-9-2 采样值 | 88-BA | 0 1 |
参见 gseMngtPdu.gmind 文件
GOOSE和SV报文都是基于ISO/IEC 8802-3框架进行通讯,其基本帧结构如下
字节 | 总体结构 | 字段 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 说明 |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | 报文头 | 7字节前导码 | |||||||||
2 | |||||||||||
3 | |||||||||||
4 | |||||||||||
5 | |||||||||||
6 | |||||||||||
7 | |||||||||||
8 | 帧起始 | 1字节 | |||||||||
9 | MAC报头 | 目的地址 | 6字节目的地址 | ||||||||
10 | 前四字节固定 | ||||||||||
11 | 010CCD01 | ||||||||||
12 | |||||||||||
13 | |||||||||||
14 | |||||||||||
15 | 源地址 | 6字节源地址 | |||||||||
16 | |||||||||||
17 | |||||||||||
18 | |||||||||||
19 | |||||||||||
20 | |||||||||||
21 | 优先级标记 | TPID | 2字节 | ||||||||
22 | (可选) | 0x8100 | |||||||||
23 | TCI | 优先级 | CFI | VID | 优先级4,VID0 | ||||||
24 | |||||||||||
25 | 以太网类型 | 2字节 | |||||||||
26 | 0x88B8 | ||||||||||
27 | 以太网方式PDU | APPID | 应用标识,全站唯一 | ||||||||
28 | GOOSE的预留值范围是0x000到0x3fff | ||||||||||
29 | 长度 | GSE同上 | |||||||||
30 | |||||||||||
31 | 保留1 | ||||||||||
32 | |||||||||||
33 | 保留2 | ||||||||||
34 | |||||||||||
35 | APDU | ||||||||||
· | |||||||||||
· | |||||||||||
· | |||||||||||
· | |||||||||||
必要的填充字节 | |||||||||||
帧校验序列 | |||||||||||
GOOSE的APDU报文格式见下表
字段 | 描述 | 说明 |
---|---|---|
APDU T-L | 标记61H,长度 | 此长度占用可能为1,2,3…字节,由ASN.1格式而定 |
GoCBRef | 标记80H,长度≤65 | 由分层模型中的逻辑设备名、逻辑节点名、功能约束和控制块名级联而成 |
timeAllowedtoLive | 标记81H,长度,t | 该参数值一般为心跳时间T0值的2倍,如果接收端超过2T0时间内没有收到报文则判断报文丢失, 在4T0时间内没有收到下一帧报文即判断为GOOSE通信中断,判出中断后装置会发出GOOSE断链报警。 |
DatSet | 标记82H,长度≤65,Datset字符串 | 即GOOSE控制块所对应的GOOSE数据集引用名,由逻辑设备名、逻辑节点名和数据集名级联而成。报文中Data部分传输的就是该数据集的成员值。 |
GoID | 标记83H,长度≤65 | 该参数是每个GOOSE报文的唯一性标识,该参数的作用和目的地址、APPID的作用类似。接收方通过对目的地址、APPID和goID等参数进行检查,判断是否是其所订阅的报文。 |
t | 标记84H,长度=8,t | 即Event TimeStamp,事件时标,其值为GOOSE数据发生变位的时间,即状态号stNum加1的UTC时间。 |
StNum | 标记85H,长度≤5,StNum值 | 即StateNumber,状态序号,用于记录GOOSE数据发生变位的总次数。 |
SqNum | 标记86H,长度≤5,SqNum值 | 即SequenceNumber,顺序号SqNum,用于记录稳态情况下报文重复发出的帧数,装置每发出一帧GOOSE报文,SqNum应加1;当有GOOSE数据变化时,该值归0,从头开始重新计数。 |
simulation | 标记87H,长度=1,test值 | **布尔型变量,**检修标识,用于表示发出该GOOSE报文的装置是否处于检修状态。当检修压板投入时,test标识应为True。 |
confRev | 标记88H,长度≤5 | 配置版本号,Config Revision是一个计数器,代表GOOSE数据集配置被改变的次数。当对GOOSE数据集成员进行重新排序、删除等操作时,GOOSE数据集配置被改变。配置每改变一次,版本号应加1。 |
ndsCom | 标记89H,长度=1,Needs commissioning | 该参数是一个布尔型变量,用于指示GOOSE是否需要进一步配置。 |
numDatSetEntries | 标记8aH,长度≤5,总个数 | 即数据集条目数,(alldata中数据链的个数) |
allData T-L | 标记abH,长度 | 该部分是GOOSE报文所传输的数据当前值。Data部分各个条目的含义、先后次序和所属的数据类型都是由配置文件中的GOOSE数据集定义的。 |
allData | 具体数据 | 具体格式参见上一节GooseData ::= CHOICE,可以为布尔值,比特串,整型,浮点型,位串,字符串,时间等任意一种或其组合 |
allData中的数据由DatSet数据集定义,在不同系统中是不一样的,可以有SCL文件配置。