允许发送的GOOSE报文个数为N(定义为宏,方便扩展),数据流程如图1所示:
图1 GOOSE发送数据流
① 根据IED标志将GOOSE发送的系统参数写入节点中;
② GOOSE实时参数有些部分需要写入节点中;
③ 根据GOOSE实时参数中allData总长度找到TxFrameBuf合适位 置(从尾部开始留出空间),再将实时参数中allData数据集转换成MMS格式并存储;
④ 将节点中数据按从Node_10到Node_0的逆顺序填充到TxFrameBuf中,将记录sqNum位置和帧头指针;
⑤ 将组织好的GOOSE报文发送到EMAC口,组织好超时时间和回调函数并加入到系统超时链中。
允许接收的GOOSE报文个数为N(定义为宏,方便扩展),数据流程如图2所示:
图2 GOOSE接收数据流
从EMAC接收的数据存储在RxFrameBuf中,根据stNum和sqNum的值判断本报文是否为重传,如果是重传将直接丢弃,否则执行如下解析:
① 首先根据判别ID知道IED的序号,再将GOOSE报文中的Head部分解析并存储到节点中;
② 将GOOSE报文allData的MMS格式转换成接口格式,转发给cRIO,如果allData数据量很大,那将会分片成多帧发送给cRIO;
③ 将GOOSE接收实时帧转发给cRIO。
要确保GOOSE报文重传需要如图3所示信息:p_Head指向重传GOOSE报文的头部,p_sqNum指向GOOSE报文中的域sqNum,TotLen等于GOOSE报文总长度,TOCnt保存下次重传时间(单位为毫秒)。
TOCnt的计算规则如下:
每次接收到GOOSE实时数据帧时赋初值为FirstInterval,以后每次执行如下语句操作:If (TOCnt < MaxInterval) TOCnt *= Mul;
图3 GOOSE重传数据结构
最后一步操作是将需要重传的相关信息加入到系统超时链中:TOCnt是超时时间(单位为毫秒),CallBack根据p_sqNum对sqNum进行加一操作,再将 GOOSE报文发送到EMAC,Arg是图3所示数据结构的指针。
图4 系统超时链
在定时器的IRQ中,对图4的系统超时链每个TOCnt不为0的元素进行减1操作,如果等于零,则传递指针Arg给CallBack并执行该回调函数。
图5 解析一个TLV