文档介绍:继电保护仿真培训体系设计
WinPcap软件包简介
由于IEC61850的采样值数据包和GOOSE数据包都是直接建立在以太网链路层之上的,在ISO7层协议中与IP协议处于同等的位置,因而不能使用TCP/IP协议发送和接收,需采用更底层的继电保护仿真培训体系设计
WinPcap软件包简介
由于IEC61850的采样值数据包和GOOSE数据包都是直接建立在以太网链路层之上的,在ISO7层协议中与IP协议处于同等的位置,因而不能使用TCP/IP协议发送和接收,需采用更底层的以太网通信函数[3-4]。WinPcap工具软件包满足上述的要求,可以更底层地操作网卡。此外,WinPcap中还提供了发送以太网原始数据包的功能,因而非常适合于开发智能变电站的网络通信软件。WinPcap具有捕获数据包、发送数据包、统计网络流量3个主要功能。捕获数据包的基本流程如下[5](1)通过接口函数pcap_findalldevs_ex枚举所有可用的网络设备。(2)根据枚举返回的网络设备名称打开一个设备,对应接口函数为pcap_open()。(3)如果需要,设置数据包的过滤条件,对应接口函数为pcap_setfilter。(4)捕获原始的数据包有2种方法:一种方法是以回调函数的方式由接口pcap_loop或pcap_dispatch完成,其基本方法是底层收集数据包,当满足一定的条件(timeout或者缓冲区满),就调用回调函数,把收集到的原始数据包通过数据缓存区交给用户;另一种方法是pcap_next_ex()的方法,每当一个包到达后,接口pcap_next_ex()就会返回,返回的数据缓冲区中只包含一个包。其中,pcap_loop()函数是基于回调的原理来进行数据捕获,在很多情况下都是一种很好的选择,但由于该方式有时并不实用,且会增加程序的复杂性,特别是在拥有多线程的C++程序中,因此,本文选用pcap_next_ex()方法。使用WinPcap发送数据包首先要枚举和打开网络设备,然后调用pcap_sendpacket()函数,发送单个数据包。WinPcap还提供了发送队列的方式,但由于pcap_sendpacket()功能已足够满足需求,简单且效率高,因此本文采用pcap_sendpacket发送数据包。
IEC61850报文解析
采样值(SV)报文解析IEC61850-9标准中,采样值报文在链路层传输都是基于ISO/IEC8802-3的以太网帧结构[6-7]。解析采样值报文时,首先判断以太网类型(Ethertype)是否为0x88BA。若是,则根据AsduNum和AsduLength找出ASDU,然后解码标记(Tag)和数据类型均已知的标志符(svID,Tag=80)、SmpCnt(Tag=82)等数据段;最后将Samples中数据按8路采样值格式进行解析[8]。采样值报文的组帧是与读取Comtrade格式录波文件一样的,即按照Comtrade文件格式要求读取录波文件[9-10],然后将其中的电流、电压数据按照IEC61850-9-2LE标准的要求进行组帧并发送出去。报文组帧过程是解析的逆过程,此处不再赘述。
GOOSE报文解析对GOOSE解包,首先判断以太网类型是否为0x88B8。如果是,则依次解析出目的MAC地址、源MAC地址和报文长度等。对于虚拟局域网部分