细说数据更新)
前言前面的文章用到了数据更新但是重点介绍的是方法然而IEC61850提供了多种数据类型都可能让使用者感觉无从下手所以需要有一篇文章进行全面的介绍本文重点根据类型区分介绍。本文所有样例源码已经上传至https://gitee.com/yunxingtianxia/yx-tools 的 yx-pis-dll\example\07 updateData 目录IEC61850都有哪些类型类型类型描述协议栈定义BOOLEAN布尔IEC61850_DATATYPE_BOOLEANINT8有符号整型IEC61850_DATATYPE_INT8INT16有符号整型IEC61850_DATATYPE_INT16INT32有符号整型IEC61850_DATATYPE_INT32INT64有符号整型IEC61850_DATATYPE_INT64INT8U无符号整型IEC61850_DATATYPE_INT8UINT16U无符号整型IEC61850_DATATYPE_INT16UINT32U无符号整型IEC61850_DATATYPE_INT32UFLOAT32单精度浮点型IEC61850_DATATYPE_FLOAT32FLOAT64双精度浮点型IEC61850_DATATYPE_FLOAT64ENUMERATED枚举IEC61850_DATATYPE_ENUMERATEDCODEDENUM枚举IEC61850_DATATYPE_CODED_ENUMOCTETSTRING八位组串IEC61850_DATATYPE_OCTET_STRINGVisibleString可视字符串IEC61850_DATATYPE_VISIBLE_STRINGUNICODESTRINGUnicode字符串IEC61850_DATATYPE_UNICODE_STRINGTimeStamp时间戳IEC61850_DATATYPE_TIMESTAMPQuality品质IEC61850_DATATYPE_QUALITY协议栈类型使用规则我们统一使用数据属性结构体IEC61850_DataAttributeData来进行数据模型中数据属性进行赋值取值的操作structIEC61850_DataAttributeData{unsignedchartype;/*! 数据类型。br取值为 enum IEC61850_DataType 类型的枚举值之一。br若数据类型为数组或者结构体则每个数组元素或结构体成员都将是一个单独的 IEC61850_DataAttributeData 类型的数据。 */intarrayIndex;/*! 数组元素索引。br若当前数据属性为数组类型数据中的某个元素时该值有效值为当前数据对应的数组元素索引否则该值无意义值为 0。 */unsignedintbitLength;/*! 数据长度信息。其值的意义因数据类型而异。br若数据类型是数组则该值代表数组元素数量br若数据类型是结构体则代表结构体成员的数量br若数据类型既不是数组也不是结构体则该值代表对应数据类型所占的实际位bit数。例如INT32 类型数据大小为 32 bit则该值对应为 32。 */void*pvData;/*! 数据值的指针。br该指针指向数据值所在的内存空间地址。br若数据类型为数组数据则该指针指向一个包含 bitLength 个 IEC61850_DataAttributeData 类型的数组元素的数组的首地址br若数据类型为结构体则该指针指向一个由 bitLength 个连续的 IEC61850_DataAttributeData 类型的结构体成员数据所构成的内存空间的首地址br若数据类型既不是数组也不是结构体则可以按照对应的数据类型对该地址解引用来获取数据值。 */}看看之前的例子IEC61850_ErrorCodeUpdateMMXUPhsAMagi(){IEC61850_ErrorCode resultS_OK;S32 newVal0;IEC61850_DataAttributeData daData{0};char*referenceTEMPLATELDevice1/MMXU0.A.phsA.cVal.mag.i;printf(Enter an S32 value: );scanf(%d,newVal);daData.bitLengthsizeof(S32)*8;daData.typeIEC61850_DATATYPE_INT32;daData.pvDatanewVal;resultIEC61850_UpdateWithReference(g_iec61850,reference,daData);}这里面和类型相关会存在差异的部分只有这四行S32 newVal0;//定义合适的变量daData.bitLengthsizeof(S32)*8;//指定数据长度daData.typeIEC61850_DATATYPE_INT32;//指定数据类型daData.pvDatanewVal;//指针指向正确的变量接下来就针对不同类型交代不同类型的这四行代码如何写建模建模工具直接访问云端版http://scl.yunxing.tech:8888也可在该地址下载桌面版。创建一个CID模型模型中尽量包含全面的数据类型。详细可查看本样例代码提供的CID文件这里为每个要更新的数据属性都设置了DAID。LNinst0lnClassGGIOlnTypeGGIO_0prefixDOIdescBehaviournameBehDAInamestValsAddr5.0.0.0.0/DAInamedsAddr5.0.0.0.1/DAInamedUsAddr5.0.0.0.2//DOIDOIdescGeneral single alarmnameAlm_boolDAInamestValsAddr0.0.0.0.1/DAInameqsAddr0.0.0.0.2/DAInametsAddr0.0.0.0.3//DOIDOIdescAnalogue inputnameAnIn_int8SDInamemagDAInameisAddr1.0.0.0.8//SDI/DOIDOIdescAnalogue inputnameAnIn_int16SDInamemagDAInameisAddr1.0.0.0.16//SDI/DOIDOIdescAnalogue inputnameAnIn_int32SDInamemagDAInameisAddr1.0.0.0.32//SDI/DOIDOIdescAnalogue inputnameAnIn_int64SDInamemagDAInameisAddr1.0.0.0.64//SDI/DOIDOIdescAnalogue inputnameAnIn_int8uSDInamemagDAInameisAddr2.0.0.0.8//SDI/DOIDOIdescAnalogue inputnameAnIn_int16uSDInamemagDAInameisAddr2.0.0.0.16//SDI/DOIDOIdescAnalogue inputnameAnIn_int32uSDInamemagDAInameisAddr2.0.0.0.32//SDI/DOIDOIdescAnalogue inputnameAnIn_float32SDInamemagDAInamefsAddr3.0.0.0.32//SDI/DOIDOIdescAnalogue inputnameAnIn_float64SDInamemagDAInamefsAddr3.0.0.0.64//SDI/DOIDOIdescDouble point controllable status outputnameDPCSO11DAInamestValsAddr6.0.0.0.0//DOI/LNBOOLEAN布尔Boolean newValTRUE;daData.bitLength8;daData.typeIEC61850_DATATYPE_BOOLEAN;daData.pvDatanewVal;INT8有符号整型S8 newVal123 daData.bitLength8;daData.typeIEC61850_DATATYPE_INT8;daData.pvDatanewVal;INT16有符号整型S16 newVal123 daData.bitLength16;daData.typeIEC61850_DATATYPE_INT16;daData.pvDatanewVal;INT32有符号整型S32 newVal123 daData.bitLength32;daData.typeIEC61850_DATATYPE_INT32;daData.pvDatanewVal;INT64有符号整型S64 newVal123 daData.bitLength64;daData.typeIEC61850_DATATYPE_INT64;daData.pvDatanewVal;INT8U无符号整型U8 newVal123;daData.bitLength8;daData.typeIEC61850_DATATYPE_INT8U;daData.pvDatanewVal;INT16U无符号整型U16 newVal123;daData.bitLength16;daData.typeIEC61850_DATATYPE_INT16U;daData.pvDatanewVal;INT32U无符号整型U32 newVal123;daData.bitLength32;daData.typeIEC61850_DATATYPE_INT32U;daData.pvDatanewVal;FLOAT32单精度浮点型Float32 newVal0.8;daData.bitLength32;daData.typeIEC61850_DATATYPE_FLOAT32;daData.pvDatanewVal;FLOAT64双精度浮点型Float64 newVal0.8;daData.bitLength64;daData.typeIEC61850_DATATYPE_FLOAT64;daData.pvDatanewVal;ENUMERATED枚举枚举类型还是有些特殊在CID建模中类型选择Enum并要其指定具体的定义不过一般我们用标准定义好的比如Beh的状态值定义如下EnumTypeidBehaviourModeKindEnumValord1on/EnumValEnumValord2blocked/EnumValEnumValord3test/EnumValEnumValord4test/blocked/EnumValEnumValord5off/EnumVal/EnumType其实所谓枚举值就是为该值赋值枚举定义的值这里面是1,2,3,4,5。以此为例代码如下tIEC61850Enum newVal1;daData.bitLengthIEC61850_ENUM_BITSIZE;daData.typeIEC61850_DATATYPE_ENUMERATED;daData.pvDatanewVal;CODEDENUM固定枚举这种是不需要自定义枚举值的而是固定的一些类型比如CID模型中的Tcmd、Dbpos等以Dbpos为例子其他的因为不常用如果确实用到可以联系我们eDbPosValues newValDBPOS_ON;daData.bitLengthIEC61850_DBPOS_BITSIZE;daData.typeIEC61850_DATATYPE_DBPOS;daData.pvDatanewVal;OCTETSTRING八位组串这个就略了因为几乎没有需要用户去更新和使用该类型的场景如果确实用到可以联系我们VisibleString可视字符串char*newValthis is new VisibleString;daData.bitLengthstrnlen(newVal,255)*8;daData.typeIEC61850_DATATYPE_VISIBLE_STRING;daData.pvDatanewVal;UNICODESTRINGUnicode字符串注意这里源码文件本身采用了utf8编码目前所使用的vs2022用安装了Force UTF-8(No Bom)2022插件char*newVal这里是中文;daData.bitLengthstrnlen(newVal,255)*8;daData.typeIEC61850_DATATYPE_UNICODE_STRING;daData.pvDatanewVal;TimeStamp时间戳IEC61850_TimeStamp t{0};IEC61850_GetTime(NULL,t);daData.bitLengthIEC61850_TIMESTAMP_BITSIZE;daData.typeIEC61850_DATATYPE_TIMESTAMP;daData.pvDatat;Quality品质IEC61850_QualityFlag qIEC61850_QUALITY_GOOD;daData.bitLengthIEC61850_QUALITY_BITSIZE;daData.typeIEC61850_DATATYPE_QUALITY;daData.pvDataq;