/* * cdc.h * * Copyright 2014 Michael Zillgith * * This file is part of libIEC61850. * * libIEC61850 is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * libIEC61850 is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with libIEC61850. If not, see . * * See COPYING file for the complete license text. */ #ifndef CDC_H_ #define CDC_H_ #ifdef __cplusplus extern "C" { #endif /** \addtogroup server_api_group * @{ */ /** * @defgroup COMMON_DATA_CLASSES Helper functions to create common data classes (CDC) using the dynamic model API * * Currently supports CDCs from IEC 61850-7-3:2010 (Edition 2) * * @{ */ /** * \brief optional parts of CDCs */ #define CDC_OPTION_PICS_SUBST (1 << 0) #define CDC_OPTION_BLK_ENA (1 << 1) #define CDC_OPTION_DESC (1 << 2) #define CDC_OPTION_DESC_UNICODE (1 << 3) #define CDC_OPTION_AC_DLNDA (1 << 4) #define CDC_OPTION_AC_DLN (1 << 5) #define CDC_OPTION_UNIT (1 << 6) #define CDC_OPTION_FROZEN_VALUE (1 << 7) #define CDC_OPTION_ADDR (1 << 8) #define CDC_OPTION_ADDINFO (1 << 9) #define CDC_OPTION_INST_MAG (1 << 10) #define CDC_OPTION_RANGE (1 << 11) #define CDC_OPTION_UNIT_MULTIPLIER (1 << 12) #define CDC_OPTION_AC_SCAV (1 << 13) #define CDC_OPTION_MIN (1 << 14) #define CDC_OPTION_MAX (1 << 15) #define CDC_OPTION_AC_CLC_O (1 << 16) #define CDC_OPTION_RANGE_ANG (1 << 17) #define CDC_OPTION_PHASE_A (1 << 18) #define CDC_OPTION_PHASE_B (1 << 19) #define CDC_OPTION_PHASE_C (1 << 20) #define CDC_OPTION_PHASE_NEUT (1 << 21) #define CDC_OPTION_PHASES_ABC (CDC_OPTION_PHASE_A | CDC_OPTION_PHASE_B | CDC_OPTION_PHASE_C) #define CDC_OPTION_PHASES_ALL (CDC_OPTION_PHASE_A | CDC_OPTION_PHASE_B | CDC_OPTION_PHASE_C | CDC_OPTION_PHASE_NEUT) #define CDC_OPTION_STEP_SIZE (1 << 22) #define CDC_OPTION_ANGLE_REF (1 << 23) /** * \brief Control model types */ #define CDC_CTL_MODEL_NONE 0 #define CDC_CTL_MODEL_DIRECT_NORMAL 1 #define CDC_CTL_MODEL_SBO_NORMAL 2 #define CDC_CTL_MODEL_DIRECT_ENHANCED 3 #define CDC_CTL_MODEL_SBO_ENHANCED 4 #define CDC_CTL_MODEL_HAS_CANCEL (1 << 4) #define CDC_CTL_MODEL_IS_TIME_ACTIVATED (1 << 5) #define CDC_CTL_OPTION_ORIGIN (1 << 6) #define CDC_CTL_OPTION_CTL_NUM (1 << 7) #define CDC_CTL_OPTION_ST_SELD (1 << 8) #define CDC_CTL_OPTION_OP_RCVD (1 << 9) #define CDC_CTL_OPTION_OP_OK (1 << 10) #define CDC_CTL_OPTION_T_OP_OK (1 << 11) #define CDC_CTL_OPTION_SBO_TIMEOUT (1 << 12) #define CDC_CTL_OPTION_SBO_CLASS (1 << 13) #define CDC_CTL_OPTION_OPER_TIMEOUT (1 << 14) /**************************************************** * Constructed Attribute Classes (CAC) ***************************************************/ DataAttribute* CAC_AnalogueValue_create(const char* name, ModelNode* parent, FunctionalConstraint fc, uint8_t triggerOptions, bool isIntegerNotFloat); /** * \brief create a ValWithTrans constructed data attribute * * \param hasTransInd */ DataAttribute* CAC_ValWithTrans_create(const char* name, ModelNode* parent, FunctionalConstraint fc, uint8_t triggerOptions, bool hasTransientIndicator); /** * CDC_OPTION_AC_CLC_O */ DataAttribute* CAC_Vector_create(const char* name, ModelNode* parent, uint32_t options, FunctionalConstraint fc, uint8_t triggerOptions); DataAttribute* CAC_Point_create(const char* name, ModelNode* parent, FunctionalConstraint fc, uint8_t triggerOptions, bool hasZVal); DataAttribute* CAC_ScaledValueConfig_create(const char* name, ModelNode* parent); DataAttribute* CAC_Unit_create(const char* name, ModelNode* parent, bool hasMagnitude); DataAttribute* CDA_OperBoolean(ModelNode* parent, bool isTImeActivated); /**************************************************** * Common Data Classes (CDC) ***************************************************/ DataObject* CDC_SPS_create(const char* dataObjectName, ModelNode* parent, uint32_t options); DataObject* CDC_DPS_create(const char* dataObjectName, ModelNode* parent, uint32_t options); DataObject* CDC_INS_create(const char* dataObjectName, ModelNode* parent, uint32_t options); DataObject* CDC_ENS_create(const char* dataObjectName, ModelNode* parent, uint32_t options); DataObject* CDC_BCR_create(const char* dataObjectName, ModelNode* parent, uint32_t options); /** * \brief create a new SEC (Security violation) CDC instance (data object) * * Allowed parent types are LogicalNode and DataObject. * * options: * standard (include standard optional elements like extension namespaces and descriptions (d, dU). * * CDC_OPTION_ADDR (address of the client causing the security violation) * CDC_OPTION_ADDINFO (additional info text) * * \param dataObjectName the name of the new object * \param parent the parent of the new data object (either a LogicalNode or another DataObject) * \param options bit mask to encode required optional elements */ DataObject* CDC_SEC_create(const char* dataObjectName, ModelNode* parent, uint32_t options); /** * \brief create a new MV (Measured value) CDC instance (data object) * * Allowed parent types are LogicalNode and DataObject. * * possible options: * CDC_OPTION_INST_MAG * CDC_OPTION_RANGE * CDC_OPTION_PICS_SUBST * standard (include standard optional elements like extension namespaces and descriptions (d, dU). * * \param dataObjectName the name of the new object * \param parent the parent of the new data object (either a LogicalNode or another DataObject) * \param options bit mask to encode required optional elements * \param isIntegerNotFloat if true the AnalogueValue instance have integer instead of float * */ DataObject* CDC_MV_create(const char* dataObjectName, ModelNode* parent, uint32_t options, bool isIntegerNotFloat); /** * CDC_OPTION_INST_MAG * CDC_OPTION_RANGE */ DataObject* CDC_CMV_create(const char* dataObjectName, ModelNode* parent, uint32_t options); /** * \brief create a new SAV (Sampled analog value) CDC instance (data object) * * Allowed parent types are LogicalNode and DataObject. * * possible options: * CDC_OPTION_UNIT * CDC_OPTION_AC_SCAV * CDC_OPTION_MIN * CDC_OPTION_MAX * standard (include standard optional elements like extension namespaces and descriptions (d, dU). * * \param dataObjectName the name of the new object * \param parent the parent of the new data object (either a LogicalNode or another DataObject) * \param options bit mask to encode required optional elements * \param isIntegerNotFloat if true the AnalogueValue instance have integer instead of float * */ DataObject* CDC_SAV_create(const char* dataObjectName, ModelNode* parent, uint32_t options, bool isIntegerNotFloat); DataObject* CDC_LPL_create(const char* dataObjectName, ModelNode* parent, uint32_t options); DataObject* CDC_HST_create(const char* dataObjectName, ModelNode* parent, uint32_t options, uint16_t maxPts); /** * \brief Directional protection activation information (ACD) * * Allowed parent types are LogicalNode and DataObject. * * possible options: * CDC_OPTION_PHASE_A * CDC_OPTION_PHASE_B * CDC_OPTION_PHASE_C * CDC_OPTION_PHASE_NEUT * CDC_OPTION_PHASES_ABC * CDC_OPTION_PHASES_ALL * standard (include standard optional elements like extension namespaces and descriptions (d, dU). * * \param dataObjectName the name of the new object * \param parent the parent of the new data object (either a LogicalNode or another DataObject) * \param options bit mask to encode required optional elements */ DataObject* CDC_ACD_create(const char* dataObjectName, ModelNode* parent, uint32_t options); /** * \brief Protection activation information (ACT) */ DataObject* CDC_ACT_create(const char* dataObjectName, ModelNode* parent, uint32_t options); /** * \brief Single point setting (SPG) * * \param dataObjectName the name of the new object * \param parent the parent of the new data object (either a LogicalNode or another DataObject) * \param options bit mask to encode required optional elements */ DataObject* CDC_SPG_create(const char* dataObjectName, ModelNode* parent, uint32_t options); /** * \brief Enumerated status setting (ENG) * * \param dataObjectName the name of the new object * \param parent the parent of the new data object (either a LogicalNode or another DataObject) * \param options bit mask to encode required optional elements */ DataObject* CDC_ENG_create(const char* dataObjectName, ModelNode* parent, uint32_t options); /** * \brief Integer status setting (ING) * * possible options: * CDC_OPTION_UNIT * CDC_OPTION_MIN * CDC_OPTION_MAX * CDC_OPTION_STEP_SIZE * standard (include standard optional elements like extension namespaces and descriptions (d, dU). * */ DataObject* CDC_ING_create(const char* dataObjectName, ModelNode* parent, uint32_t options); /** * \brief Analogue Setting (ASG) * * possible options: * CDC_OPTION_UNIT * CDC_OPTION_MIN * CDC_OPTION_MAX * CDC_OPTION_STEP_SIZE * standard (include standard optional elements like extension namespaces and descriptions (d, dU). * */ DataObject* CDC_ASG_create(const char* dataObjectName, ModelNode* parent, uint32_t options, bool isIntegerNotFloat); /** * \brief Phase to ground/neutral related measured values of a three-phase system (WYE) * * possible options: * CDC_OPTION_ANGLE_REF */ DataObject* CDC_WYE_create(const char* dataObjectName, ModelNode* parent, uint32_t options); /** * \brief Phase to phase related measured values of a three-phase system (DEL) * * possible options: * CDC_OPTION_ANGLE_REF */ DataObject* CDC_DEL_create(const char* dataObjectName, ModelNode* parent, uint32_t options); /*************************** * Controls ***************************/ /** * \brief Controllable single point (SPC) * * \param controlOptions specify which control model to set as default and other control related options */ DataObject* CDC_SPC_create(const char* dataObjectName, ModelNode* parent, uint32_t options, uint32_t controlOptions); /** * \brief Controllable double point (DPC) * * CDC_OPTION_IS_TIME_ACTICATED * * substitution options * CDC_OPTION_BLK_ENA * standard description and namespace options * * \param dataObjectName the name of the new object * \param parent the parent of the new data object (either a LogicalNode or another DataObject) * \param options bit mask to encode required optional elements * \param defaultControlModel specify which control model to set as default. * */ DataObject* CDC_DPC_create(const char* dataObjectName, ModelNode* parent, uint32_t options, uint32_t controlOptions); /** * \brief Controllable integer status (INC) * * CDC_OPTION_IS_TIME_ACTICATED * * CDC_OPTION_MIN * CDC_OPTION_MAX * CDC_OPTION_STEP_SIZE * * substitution options * CDC_OPTION_BLK_ENA * standard description and namespace options * * \param dataObjectName the name of the new object * \param parent the parent of the new data object (either a LogicalNode or another DataObject) * \param options bit mask to encode required optional elements * \param defaultControlModel specify which control model to set as default. * */ DataObject* CDC_INC_create(const char* dataObjectName, ModelNode* parent, uint32_t options, uint32_t controlOptions); /** * \brief Controllable enumerated status (ENC) * * CDC_OPTION_IS_TIME_ACTICATED * * substitution options * CDC_OPTION_BLK_ENA * standard description and namespace options * * \param dataObjectName the name of the new object * \param parent the parent of the new data object (either a LogicalNode or another DataObject) * \param options bit mask to encode required optional elements * \param defaultControlModel specify which control model to set as default. * */ DataObject* CDC_ENC_create(const char* dataObjectName, ModelNode* parent, uint32_t options, uint32_t controlOptions); /** * \brief Controllable enumerated status (ENC) * * CDC_OPTION_IS_TIME_ACTICATED * * substitution options * CDC_OPTION_BLK_ENA * standard description and namespace options * * \param dataObjectName the name of the new object * \param parent the parent of the new data object (either a LogicalNode or another DataObject) * \param options bit mask to encode required optional elements * \param controlOptions specify which control model to set as default and other control specific options * \param hasTransientIndicator specifies if the step position information contains the transient indicator * */ DataObject* CDC_BSC_create(const char* dataObjectName, ModelNode* parent, uint32_t options, uint32_t controlOptions, bool hasTransientIndicator); /** * \brief Controllable analogue process value (APC) * * CDC_OPTION_IS_TIME_ACTICATED * * substitution options * CDC_OPTION_BLK_ENA * standard description and namespace options * * \param dataObjectName the name of the new object * \param parent the parent of the new data object (either a LogicalNode or another DataObject) * \param options bit mask to encode required optional elements * \param controlOptions specify which control model to set as default and other control specific options * \param isIntegerNotFloat */ DataObject* CDC_APC_create(const char* dataObjectName, ModelNode* parent, uint32_t options, uint32_t controlOptions, bool isIntegerNotFloat); /** Minimum measured value */ #define CDC_OPTION_61400_MIN_MX_VAL (1 << 10) /** Maximum measured value */ #define CDC_OPTION_61400_MAX_MX_VAL (1 << 11) /** Total average value of data */ #define CDC_OPTION_61400_TOT_AV_VAL (1 << 12) /** Standard deviation of data */ #define CDC_OPTION_61400_SDV_VAL (1 << 13) /** Rate of increase */ #define CDC_OPTION_61400_INC_RATE (1 << 14) /** Rate of decrease */ #define CDC_OPTION_61400_DEC_RATE (1 << 15) /** Setpoint or parameter access level (low/medium/high) */ #define CDC_OPTION_61400_SP_ACS (1 << 16) /** Time periodical reset (hourly/daily/weekly/monthly) */ #define CDC_OPTION_61400_CHA_PER_RS (1 << 17) /** Command access level */ #define CDC_OPTION_61400_CM_ACS (1 << 18) /** Total time duration of a state */ #define CDC_OPTION_61400_TM_TOT (1 << 19) /** Daily counting data */ #define CDC_OPTION_61400_COUNTING_DAILY (1 << 20) /** Monthly counting data */ #define CDC_OPTION_61400_COUNTING_MONTHLY (1 << 21) /** Yearly counting data */ #define CDC_OPTION_61400_COUNTING_YEARLY (1 << 22) /** Total counting data */ #define CDC_OPTION_61400_COUNTING_TOTAL (1 << 23) /** All counting data */ #define CDC_OPTION_61400_COUNTING_ALL (CDC_OPTION_61400_COUNTING_DAILY | CDC_OPTION_61400_COUNTING_MONTHLY | CDC_OPTION_61400_COUNTING_YEARLY | CDC_OPTION_61400_COUNTING_TOTAL) DataObject* CDC_SPV_create(const char* dataObjectName, ModelNode* parent, uint32_t options, uint32_t controlOptions, uint32_t wpOptions, bool hasChaManRs); DataObject* CDC_STV_create(const char* dataObjectName, ModelNode* parent, uint32_t options, uint32_t controlOptions, uint32_t wpOptions, bool hasOldStatus); DataObject* CDC_CMD_create(const char* dataObjectName, ModelNode* parent, uint32_t options, uint32_t controlOptions, uint32_t wpOptions, bool hasOldStatus, bool hasCmTm, bool hasCmCt); DataObject* CDC_ALM_create(const char* dataObjectName, ModelNode* parent, uint32_t options, uint32_t controlOptions, uint32_t wpOptions, bool hasOldStatus); DataObject* CDC_CTE_create(const char* dataObjectName, ModelNode* parent, uint32_t options, uint32_t controlOptions, uint32_t wpOptions, bool hasHisRs); DataObject* CDC_TMS_create(const char* dataObjectName, ModelNode* parent, uint32_t options, uint32_t controlOptions, uint32_t wpOptions, bool hasHisRs); /**@}*/ /**@}*/ #ifdef __cplusplus } #endif #endif /* CDC_H_ */