本文讲述的是IEC61850中最常用的报告功能服务端的实现方法,内容包含了CID建模,编码实现,还包括后面的运行效果、MMS报文等。
一、CID建模
1、通讯部分: <Communication>
<SubNetwork name="SubNetworkName">
<ConnectedAP apName="SubstationRing1" iedName="NewIED"> <Address>
<P type="OSI-AP-Title">1,1,9999,1</P>
<P type="OSI-AE-Qualifier">12</P>
<P type="OSI-PSEL">00000001</P>
<P type="OSI-SSEL">0001</P>
<P type="OSI-TSEL">0001</P>
<P type="IP">192.168.95.128</P>
<P type="IP-SUBNET">255.255.255.0</P>
<P type="IP-GATEWAY">192.168.95.2</P>
<P type="MAC-Address">00-0C-29-D0-7D-33</P>
</Address>
</ConnectedAP>
</SubNetwork>
</Communication>
这里重点关注P type为"IP""IP-SUBNET""IP-GATEWAY""MAC-Address"四个配置,分别代表了本机IP地址,子网掩码、网关IP地址、本机MAC地址。需要按照报告服务端装置的实际情况配置,多网卡情况需要根据实际需要选择一个网卡进行配置。
2、服务、逻辑设备、逻辑节点、数据、数据属性
按照这个顺序逐一添加,这里考虑读者具备基本的建模知识,所以建模相关知识就不详细介绍了。
这里截取部分CID信息如下:
逻辑节点MMXU:
<LN desc="" inst="0" lnClass="MMXU" lnType="MMXU_0" prefix=""> 数据和数据属性:
<DOI desc="" name="A">
<SDI name="phsA">
<SDI name="cVal">
<SDI name="mag">
<DAI name="i"></DAI>
</SDI>
</SDI>
<DAI name="q"></DAI>
<DAI name="t"></DAI>
</SDI>
</DOI>
因为是要开发报告服务端,所以要配置报告控制块,那么配置控制块之前就需要创建数据集如下:
<DataSet name="MMXUDataSet">
<FCDA daName="phsA" doName="A" fc="MX" ldInst="Example" lnClass="MMXU" lnInst="0" prefix=""/>
</DataSet>
下面就是报告控制块的设置(非缓存报告控制块URCB):
<ReportControl confRev="1" datSet="MMXUDataSet" desc="" name="Measurement" rptID="MMXUID">
<TrgOps dupd="true"/>
<OptFields dataSet="true" reasonCode="true" seqNum="true" timeStamp="true"/>
<RptEnabled max="3"/>
</ReportControl>
如果是要设置缓存报告控制块BRCB,需要加上缓存时间和缓存标志,例如: <ReportControl bufTime="50000" buffered="true" confRev......
触发选项TrgOps部分设置了数据更新,也就是代表数据集中数据属性的值发生刷新就会触发内部事件,对于非缓存报告控制块会立即发送报告。
二、编码
如下是服务端开发使用的PIS-10的方法(PIS-10的lib包下载链接:/s/1c06VRm4 密码:d3aj)
IEC61850_Create() 和 IEC61850_Free() 用于创建或删除客户端/服务端对象。
IEC61850_LoadSCLFile() 使用SCL文件配置客户端/服务器。如果想重新对客户端/服务器进行配置则必须首先删除客户端/服务端(通过IEC61850_Free()实现) 并将新的配置下装到新的客户端/服务端(由 IEC61850_Create()创建)。 IEC61850_Start() 和IEC61850_Stop() 用于启动或停止客户端/服务端的服务(如 GOOSE、MMS等)。
调用IEC61850_Create()函数时必须向其传递IEC61850_Parameters参量。该参量包含一个用了标识MMS行为的标志位、一个可选标志位、命令超时结束的时间值、支持的最大连接数以及已定义的任何回调函数的指针。. 整个结构在使用之前应该在内存中被置为0以避免内存中的随机值影响函数的正确执行。 代码示例如下:
struct IEC61850_Parameters tServerParam = {0};
memset(&tServerParam, 0, sizeof(struct IEC61850_Parameters) );
tServerParam.ClientServerFlag = IEC61850_SERVER; //服务端 tServerParam.Ed1_Ed2_Flag = IEC61850_Edition2; //采用2.0
tServerParam.uiOptions = 0; //可查阅AIP手册了解
//下面是对回调函数的指定,因为这次不需要回调所以可以不写回调,但是PIS-10要求必须指定测试的回调,所以请添加如下代码:
tServerParam.ptOprTestCallback = (IEC61850_ControlOperativeTestCallback) OperativeTestCallbackHandler;
完成这些后即可创建服务端对象,代码如下: myIEC61850Object= IEC61850_Create(&tServerParam, &eErrorCode); 创建成功后可以加载前面创建的CID文件,代码如下: returnError = LoadSCLFile("../cidFiles/server.cid");
加载CID成功后可以执行如下代码完成服务端的运行:
eErrorCode = IEC61850_Start(myIEC61850Object);
报告的触发条件,按照服务端主动发送的有:完整性、数据变化、数据更新、质量变化,完整性非常简单,只需要在CID建模的时候设置一下即可,设置方法如下:
1、在<ReportControl>节点增加属性intgPd来设置完整性发送的周期,例如intgPd="30000"(代表周期为30秒);
2、在<OptFields>节点中设置period="true"。
这样设置后就已经可以按照周期发送报告了。如果要使用数据更新来触发要如何做呢?PIS-10提供了DAID的方式,下面为您介绍:
首先需要CID建模的时候为DA设置DAID <DOI desc="" name="A">
<SDI name="phsA">
<SDI name="cVal">
<SDI name="mag">
<DAI name="i"></DAI>
这个DA设置后就应该是: <DOI desc="" name="A">
<SDI name="phsA">
<SDI name="cVal">
<SDI name="mag">
<DAI name="i">
<Private type="SystemCorp_Generic">
<SystemCorp_Generic:GenericPrivateObject xmlns:SystemCorp_Generic=".au/61850/SCL/Generic" Field1="3" Field2="1" Field3="1" Field4="1" Field5="1"/>
</Private>
</DAI>
</SDI>
</SDI>
这里就是用3,1,1,1,1来对应DA name="i"的这个DA,如何更新呢?请看如下代码:
enum IEC61850_ErrorCodes UpdateValueByDaid() {
struct IEC61850_DataAttributeID_Generic updateDAID = { 0 }; //定义一个DAID的结构体变量(PIS-10标准结构体) struct IEC61850_DataAttributeData updateDAData = { 0 }; // 定义一个数据属性结构体变量(PIS-10标准结构体)
IEC61850 myIEC61850Object = GetMyServerClient(); //获取IEC61850对象
//更新DAID对应的DA
eErrorCode = IEC61850_Update(myIEC61850Object, (struct IEC61850_DataAttributeID*)&updateDAID, &updateDAData, 1);
/* 数据属性结构体设置 */ updateDAData.uiBitLength = sizeof(Integer32)* 8; updateDAData.ucType = IEC61850_DATATYPE_INT32; printf("请输入要更新的值: "); scanf("%d", &nInputValue); updateDAData.pvData = &nInputValue; //DAID结构体设置 updateDAID.Generic_type = IEC61850_DAID_GENERIC; printf("请输入DAID的Field1值: "); scanf("%d", &updateDAID.uiField1); printf("请输入DAID的Field2值: "); scanf("%d", &updateDAID.uiField2); printf("请输入DAID的Field3值: "); scanf("%d", &updateDAID.uiField3); printf("请输入DAID的Field4值: "); scanf("%d", &updateDAID.uiField4); printf("请输入DAID的Field5值: "); scanf("%d", &updateDAID.uiField5); Integer32 nInputValue = 0; enum IEC61850_ErrorCodes eErrorCode = IEC61850_ERROR_NONE;
if (eErrorCode == IEC61850_ERROR_NONE) { char strError[SIZE_OF_ERROR_STRING] = { 0 }; snprintf(strError, SIZE_OF_ERROR_STRING, "更新成功:DAID(%d,%d,%d,%d,%d)更新为[%d]\n", updateDAID.uiField1, updateDAID.uiField2, updateDAID.uiField3, updateDAID.uiField4, updateDAID.uiField5, nInputValue);
} else { char strError[SIZE_OF_ERROR_STRING] = { 0 }; SetErrorString(strError, SIZE_OF_ERROR_STRING);
snprintf(strError, SIZE_OF_ERROR_STRING, "更新失败:(%i) %s\n", eErrorCode,
IEC61850_ErrorString(eErrorCode));
}
三、运行和抓包
为了方便运行这里写了一个循环菜单,运行效果如图: return eErrorCode; } SetErrorString(strError, SIZE_OF_ERROR_STRING);
上面是输入命令1后按照提示一点点输入,最后回车效果如下:
由于我们这里运行了客户端程序,所以能够抓到报告的消息包,如下图:
第二篇:IEC61850标准
IEC61850标准
IEC61850《变电站网络与通信协议》标准(以下简称IEC61850)是新一代的变电站网络通信体系,适应分层的IED和变电站自动化系统。该标准根据电力系统生产过程的特点,制定了满足实时信息传输要求的服务模型;采用抽象通信服务接口、特定通信服务映射,以适应网络发展。采用面向对象建模技术,面向设备建模和自我描述,以适应功能扩展,满足应用开放互操作要求。采用配置语言,配备配置工具,在信息源定义数据和数据属性。定义和传输元数据,扩充数据和设备管理功能,传输采样测量值等。该标准还包括变电站通信网络和系统总体要求、系统和工程管理、一致性测试等。
IEC61850标准是全世界唯一的变电站网络通信标准,也将成为电力系统中从调度中心到变电站、变电站内、配电自动化无缝自动化标准。IEC61850标准的发展方向是实现“即插即用”,在工业控制通信上实现“一个世界、一种技术、一个标准”。IEC61850标准为电力系统自动化产品的“统一标准、统一模型、互联开放”的格局奠定了基础,使变电站信息建模标准化成为可能,信息共享具备了可实施的基础前提。
IEC61850系列标准简介
1、什么是IEC 61850
IEC 61850系列标准的全称是变电站通信网络和系统(Communication
Networks and Systems in Substations),它规范了变电站内智能电子设备(IED)之间的通信行为和相关的系统要求
IEC 61850系列标准是由国际电工委员会第57技术委员会(IEC TC57)从19xx年开始制订的,目前,IEC61850共14个部份已经全部通过为国际标准。我国的标准化委员会对61850系列标准进行了同步的跟踪和翻译工作
IEC 61850系列标准吸收了多种国际最先进的新技术,并且大量引用了目前正在使用的多个领域内的其它国际标准作为61850系列标准的一部分。所以它是一个十分庞大的标准体系,而不仅仅是一个通信协议标准
IEC 61850看起来很像又一新的协议。其实它不是。确切地说,它是一种新的变电站自动化的方法,一种影响工程、维护、运行和电力行业组织的新方法 它采用面向对象的建模技术,面向未来通讯的可扩展架构,来实现“一个世界,一种技术,一个标准”的目标
2、主要目的及特点
开放性:
全部通信协议集将基于已有的IEC/IEEE/ISO/ OSI可用 的通信标准的基础上;不考虑具体实现
先进性:
采用ACSI、SCSM、OO的技术; 采用抽象的MMS作为应用层协议; 自我描述,在线读取/修改参数和配置
采用XML语言来描述变电站的配置
完整性:
适用对象几乎包容了变电站内所有IED,例如:常规的测控装置、保护装置、RTU、站级计算机、 可选的同期、VQC装置
未来可能广泛使用的数字式一次设备如PT、CT、开关
3、内容简介及理解
61850-1 介绍和概述
该标准介绍了整个61850系列标准的制定目的、历史沿革,对61850的其它标准的核心内容作了一个提炼并加以介绍,对以后的标准中涉及的核心概念作了初步的阐述
61850-2 术语
该标准搜集了整个61850系列标准所涉及的术语解释、缩写名词定义、规范性引用文件
61850-3 总体要求
该标准从质量要求、环境条件、供电条件三个方面对SAS系统的性能进行了规范
质量要求包括可靠性、系统可用性、可维护性、安全性、数据完整性
环境条件包括对温度、湿度、大气压、振动、污染、腐蚀、电磁干扰的耐受能力
供电条件包括对供电电源的电压、频率范围以及瞬时失电的耐受能力