前言
控制模型是IEC61850应用中最常用的服务模型,本文先从服务端入手介绍YX-PIS控制服务的实现方法
本文代码位置:yx-tools\yx-pis-dll\example\08 controlServer
控制的介绍
变电站中断路器及隔离开关的远方遥控、继电保护装置软压板的远方投退等操作都可以由IEC61850中的控制服务完成。
控制模型定义了下述服务:
----Select(选择)/SelectWithValue(带值选择)
----Cancel(取消)
----Operate(操作)/TimeActivatedOperate(时间激活操作)
----CommandTermination(命令终止)
本次仅用到Operate(操作)服务,该服务可以直接操作远端服务器的DA值。那么什么情况下会用到其他服务后面会逐步介绍,这里暂时不做详细解释。
控制服务定义了四种模型
----常规安全的直接控制
----常规安全的操作前选择控制
----增强安全的直接控制
----增强安全的操作前选择控制
上述的“操作前选择”简称为:SBO( select before operate)
所谓常规和增强的区别就是常规的不需要校验执行结果,增强型的需要校验。而操作前选择和直接控制的区别是前者需要在操作前进行选择操作,后者不需要。
常规安全的直接控制
常规安全的直接控制就是不需要校验执行结果也不需要在操作前进行选择,直接发起操作请求即可,是控制的最简单模型。
建模工具
建模工具直接访问云端版:
http://scl.yunxing.tech:8888
也可在该地址下载桌面版。
CID建模
1、本次以单点控制数据类SPC为例,具体可查阅7-3标准,根据7-4查阅选择包含SPC的逻辑节点类,这里采用GGIO
2、使用建模工具打开之前的testIED.cid或者新建一个cid模型,添加逻辑节点GGIO,具体步骤参考下列图片
3、设置控制模型为常规安全的直接控制,如下图为ctlModel添加值
4、为值选择常规安全的直接控制
5、具体实例部分内容如下(这里只列出SPC部分):
<DOIdesc="Single point controllable status output"name="SPCSO1"><DAIname="stVal"/><DAIname="ctlModel"><Val>direct-with-normal-security</Val></DAI></DOI>6、这里有必要对ctlModel的值做一下解释
status-only:该对象是不可控的,仅支持用于状态对象的服务,属性ctlVal是不存在的;
direct-with-normal-security:常规安全的直接控制;
sbo-with-normal-security:常规安全的操作前选择控制;
direct-with-enhanced-security:增强安全的直接控制;
sbo-with-enhanced-security:增强安全的操作前选择控制。
建模文件中的是direct-with-normal-security,就是对应本次介绍的模型:常规安全的直接控制。
编码
控制请求对于服务端是被动接收的,而且处理逻辑也是比较复杂的,但是这些在YX-PIS协议栈中已经准确的处理了,用户只需要处理好控制请求的回调就可以了
1、承接之前的工程,创建回调函数,首先新增CallBack.c和CallBack.h两个文件,用于存放回调函数,并增加回调函数
eCommandAddCauseOperateCallbackHandler(void*userData,constvoid*dataMap,constIEC61850_DataAttributeData*operateValue,constIEC61850_CommandParameter*operateParameters)具体函数内容暂时先不介绍。
2、指定回调函数:
将控制的Operate回调指向这个回调函数
IEC61850_Parameters param={0};// 参数结构体param.fnOperateCallback=(IEC61850_ControlOperateCallback)OperateCallbackHandler;// 指定操作的回调函数3、回调函数内容:
这里面需要说明一下,想先看下图:
控制操作是先控制了ctlVal,当ctlVal变化后再同步实际设备,也就是你在回调函数中要根据控制值控制实际设备,实际设备的状态再同步给stVal,本Demo并没有实际设备,为了简单直接在ctlVal变化后同步stVal,所以回调函数定义的代码如下:
eCommandAddCauseOperateCallbackHandler(void*userData,constvoid*dataMap,constIEC61850_DataAttributeData*operateValue,constIEC61850_CommandParameter*operateParameters){eCommandAddCause ErrorCode=IEC61850_COMMAND_ERROR_ADD_CAUSE_NONE;IEC61850_ErrorCode result=S_OK;IEC61850_DataAttributeData stValDAData={0};Boolean boolValue=FALSE;constchar*reference=(constchar*)dataMap;boolValue=*((Boolean*)operateValue->pvData);if(strcmp(reference,"ControlOperIEDLD0/GGIO0.SPCSO1")==0){SetCtlVal(boolValue,1);stValDAData.type=IEC61850_DATATYPE_BOOLEAN;stValDAData.bitLength=8;stValDAData.pvData=&boolValue;result=IEC61850_UpdateWithReference(g_iec61850,"ControlOperIEDLD0/GGIO0.SPCSO1.stVal",&stValDAData);if(result==IEC61850_ERROR_NONE){SetStVal(boolValue,1);}}PrintMainMenu();returnErrorCode;}测试
需要说明一点,这个控制模型里我们没有设置daid和短地址,所以回调中使用的是引用,而使用引用作为回调,需要设置如下参数
param.dataMapMode=IEC61850_MAP_MODE_REFERENCE;启动程序
如图:
启动sim860的客户端连接服务端,然后按照下面步骤操作
由于控制模型的初始值是分的状态,这里面第三步的第一次请求要选择控合,发出者要选择“orCat不被支持”的其他选项
点击操作按钮发起直接控制。
控制成功程序界面如下:
常规安全的操作前选择控制
前面我们学习了常规安全的直接控制,只有一个操作请求,是控制四大模型中最为简单的一种形式,这一章节我们来学习常规安全的操作前选择控制,从字面来看比直接控制多了一步操作前选择,也就是要先选择再操作,事实也确实如此。
这里我们学习一下四大模型所对应的操作:
| 模型 | 采用的服务 |
|---|---|
| DOns | Operate(操作)、 TimeActivatedOperate(时间激活操作) |
| SBOns | Select(选择) 、 Operate(操作)、 TimeActivatedOperate(时间激活 操作)和Cancel(取消) |
| DOes | Operate(操作)、 TimeActivatedOperate(时间激活操作)和 CommandTerminal(命令终止) |
| SBOes | SelectWithValue(带值的选择)、 cancel(取消)、 Operate(操作) 、 TimeActivatedOperate (时间激活操作)、 CommandTermination(命令终止)服 务 |
CID建模
1、添加第二个SPC,如图将ctlModel设置为常规安全的操作前选择
以上对于CMS版本就已经完成了,但是对于MMS版本还需要添加对应的CO模型
保存后如下:
编码
1、由于多了一个选择操作,所以我们需要增加一个选择回调
eCommandAddCauseSelectCallbackHandler(void*userData,constvoid*dataMap,constIEC61850_DataAttributeData*ptSelectValue,constIEC61850_CommandParameter*ptSelectParameters){eCommandAddCause ErrorCode=IEC61850_COMMAND_ERROR_ADD_CAUSE_NONE;printf("这里是选择回调\n");returnErrorCode;}这里选择回调我们不做什么处理,只是做了打印,然后返回成功.
2、选择功能可以通过取消请求进行撤回,我们也可以增加一个取消回调
eCommandAddCauseCancelCallbackHandler(void*userData,constvoid*dataMap,constIEC61850_CommandParameter*cancelParameters){eCommandAddCause ErrorCode=IEC61850_COMMAND_ERROR_ADD_CAUSE_NONE;printf("这里是取消回调\n");returnErrorCode;}同样取消回调我们也不做多余的处理,直接返回成功就好了。
3、在参数设置中指向回调
param.fnSelectCallback=(IEC61850_ControlSelectCallback)SelectCallbackHandler;// 指定选择的回调函数param.fnCancelCallback=(IEC61850_ControlCancelCallback)CancelCallbackHandler;// 指定取消的回调函数4、在操作回调中补充对SPC01模型的处理
elseif(strcmp(reference,"ControlOperIEDLD0/GGIO0.SPCSO2")==0){SetCtlVal(boolValue,2);stValDAData.type=IEC61850_DATATYPE_BOOLEAN;stValDAData.bitLength=8;stValDAData.pvData=&boolValue;result=IEC61850_UpdateWithReference(g_iec61850,"ControlOperIEDLD0/GGIO0.SPCSO2.stVal",&stValDAData);if(result==IEC61850_ERROR_NONE){SetStVal(boolValue,2);}}测试
启动程序
启动sim860客户端并连接,进入控制界面
也可以对选择操作进行取消,大家可以自行尝试
增强安全的直接控制
增强安全相比常规安全会多一步操作,就是服务端会根据实际状态值的变化向客户端补发命令终止,这个翻译可能不太好,其实就是补发最终的实际控制结果。常规安全只知道发起了成功的控制,而最终状态值是否成功变化是无法知晓的,而增强安全就解决了这个问题。
CID建模
ctlModel的值要选择增强安全的直接控制,如下图:
对于MMS版本要做如下操作
编码
回调都已经设置好了,只需要在操作回调中增加对应处理即可
}elseif(strcmp(reference,"ControlOperIEDLD0/GGIO0.SPCSO3")==0){SetCtlVal(boolValue,3);stValDAData.type=IEC61850_DATATYPE_BOOLEAN;stValDAData.bitLength=8;stValDAData.pvData=&boolValue;result=IEC61850_UpdateWithReference(g_iec61850,"ControlOperIEDLD0/GGIO0.SPCSO3.stVal",&stValDAData);if(result==IEC61850_ERROR_NONE){SetStVal(boolValue,3);}}测试
等待一段时间后,sim860界面会有最终的控制结果
增强安全的操作前选择控制
| 模型 | 采用的服务 |
|---|---|
| SBOns | Select(选择) 、 Operate(操作)、 TimeActivatedOperate(时间激活 操作)和Cancel(取消) |
| SBOes | SelectWithValue(带值的选择)、 cancel(取消)、 Operate(操作) 、 TimeActivatedOperate (时间激活操作)、 CommandTermination(命令终止)服 务 |
对比一下同样是操作前选择,常规安全和增强安全的区别,除了增加了CommandTermination,选择也变成了带值的选择。
CID建模
对于MMS版本,需要如下设置:
编码
仅需要操作回调增加如下代码
}elseif(strcmp(reference,"ControlOperIEDLD0/GGIO0.SPCSO4")==0){SetCtlVal(boolValue,4);stValDAData.type=IEC61850_DATATYPE_BOOLEAN;stValDAData.bitLength=8;stValDAData.pvData=&boolValue;result=IEC61850_UpdateWithReference(g_iec61850,"ControlOperIEDLD0/GGIO0.SPCSO4.stVal",&stValDAData);if(result==IEC61850_ERROR_NONE){SetStVal(boolValue,4);}}测试
等待一段时间后,sim860界面会有最终的控制结果
控制的状态机
常规安全直接控制
增强安全的直接控制
常规安全的操作前选择控制
增强安全的操作前选择控制
报文解析
CMS报文
常规安全的直接控制
操作请求:
操作应答:
常规安全的操作前选择控制
选择请求:(由于是不带值的选择,所以只有引用,没有后续内容)
选择应答:
后续的操作的报文,与前面介绍的基本一致
增强安全的直接控制
多了一个命令终止如下:(命令终止没有应答报文)
增强安全的操作前选择控制
带值选择的请求:
带值选择的应答:
其他报文没有与前面介绍部分基本相同
MMS报文
常规安全的直接控制
操作请求:
操作应答:
常规安全的操作前选择控制
选择请求:(由于是不带值的选择,所以只有引用,没有后续内容)
选择应答:
后续的操作的报文,与前面介绍的基本一致
增强安全的直接控制
多了一个命令终止如下:(命令终止没有应答报文)
增强安全的操作前选择控制
带值选择的请求:
其他报文没有与前面介绍部分基本相同
总结
控制流程的细节还是很复杂的,这里没有过多的介绍控制的细节,可以阅读IEC61850规范详细了解。