IEC61850开发实战(二)

IEC61850开发实战(二)

报告客户端实现

上次提供了IEC61850报告服务端的开发,从代码量上看工作量非常的小,这就是使用PIS-10的优势,他的理念就是让开发者把更多的精力和智慧用在业务层面的开发上,赢在起跑线。

下面将介绍报告客户端的开发过程。同样介绍了CID建模,编码实现和运行演示。

一、CID建模

首先把要与之通讯的Server端的CID文件拿过来,添加客户端的接入点和IED,接入点按照客户端所在主机的网络信息进行配置。至于IEC61850的服务模型就不需要了。(多个Server端的情况需要合并所有Server的CID)

截取部分信息:

<?xml version="1.0" encoding="UTF-8"?>
<SCL xmlns="http://www.iec.ch/61850/2003/SCL" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" revision="A" version="2007" xsi:schemaLocation="http://www.iec.ch/61850/2003/SCL SCL.xsd">
<Header id="0" version="0"/>
<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>
<ConnectedAP apName="SubStationRing2" iedName="Client IED">
<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.1</P>
<P type="IP-SUBNET">255.255.255.0</P>
<P type="IP-GATEWAY">192.168.248.2</P>
<P type="MAC-Address">00-50-56-C0-00-08</P>
</Address>
</ConnectedAP>
</SubNetwork>
</Communication>
<IED name="Client IED">
<AccessPoint name="SubStationRing2"/>
</IED>
<IED configVersion="1.0" manufacturer="大连云行" name="NewIED" type="RTUType">
<Services/>

解释:后面这个IED就是服务端的IED部分拿过来的,具体内容略掉,通过上面的观察可以对客户端CID配置有一个整体了解。

二、编码实现

和服务端几乎是一样的,这里只强调需要注意的地方

1、IEC61850_Parameters的ClientServerFlag需要设置成客户端,例如:

tClientParam.ClientServerFlag = IEC61850_CLIENT;

2、需要指定接收到报告后的回调函数,例如:

tClientParam.ptUpdateCallback = (IEC61850_UpdateCallback) UpdateCallbackHandler;

其他就几乎和服务端一样了,启动后就会按照CID的配置主动连接服务端进行通讯,这样服务端发送报告就会发到这个客户端来,十分简单。

那么收到后做点什么呢?

刚才我们指定了回调函数,编写回调函数的内容即可,参考如下:

void UpdateCallbackHandler(void *ptUserData, struct IEC61850_DataAttributeID * ptUpdateID, const struct IEC61850_DataAttributeData *ptNewValue)
{
enum IEC61850_ErrorCodes eErrorCode = IEC61850_ERROR_NONE;
struct IEC61850_DataAttributeID_Generic *DaidGeneric = (struct IEC61850_DataAttributeID_Generic *)ptUpdateID; //Type cast ptUpdateID to a generic ID
Integer32 int32NewVal = (*((Integer32*)ptNewValue->pvData));

printf("==发生了数据更新==\n");
printf("DAID=%d,%d,%d,%d,%d\n", DaidGeneric->uiField1, DaidGeneric->uiField2, DaidGeneric->uiField3, DaidGeneric->uiField4, DaidGeneric->uiField5);
printf("更新前值为:%d\n", int32LocalVal); //int32LocalVal是全局变量

printf("更新后值为:%d\n", int32NewVal);
int32LocalVal = int32NewVal;
}

三、实际演示效果

1、启动后如图:


2、在服务端更新报告的数据后效果如图(实际操作了2次):

好了,客户端的开发也完成了,同样非常非常的简单,如有什么疑问欢迎加入QQ群:365273095 进行交流和讨论。

发表评论