123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548 |
- /*
- * iec61850_common.h
- *
- * Copyright 2013-2019 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 <http://www.gnu.org/licenses/>.
- *
- * See COPYING file for the complete license text.
- */
- #ifndef IEC61850_COMMON_H_
- #define IEC61850_COMMON_H_
- #ifdef __cplusplus
- extern "C" {
- #endif
- #include "libiec61850_common_api.h"
- #include "logging_api.h"
- #include "linked_list.h"
- /**
- * @defgroup iec61850_common_api_group IEC 61850 API common parts
- */
- /**@{*/
- /** IEC 61850 edition 1 */
- #define IEC_61850_EDITION_1 0
- /** IEC 61850 edition 2 */
- #define IEC_61850_EDITION_2 1
- /** IEC 61850 edition 2.1 */
- #define IEC_61850_EDITION_2_1 2
- /** PhyComAddress type contains Ethernet address and VLAN attributes */
- typedef struct {
- uint8_t vlanPriority;
- uint16_t vlanId;
- uint16_t appId;
- uint8_t dstAddress[6];
- } PhyComAddress;
- /**
- * \brief Control model (represented by "ctlModel" attribute)
- */
- typedef enum {
- /**
- * No support for control functions. Control object only support status information.
- */
- CONTROL_MODEL_STATUS_ONLY = 0,
- /**
- * Direct control with normal security: Supports Operate, TimeActivatedOperate (optional),
- * and Cancel (optional).
- */
- CONTROL_MODEL_DIRECT_NORMAL = 1,
- /**
- * Select before operate (SBO) with normal security: Supports Select, Operate, TimeActivatedOperate (optional),
- * and Cancel (optional).
- */
- CONTROL_MODEL_SBO_NORMAL = 2,
- /**
- * Direct control with enhanced security (enhanced security includes the CommandTermination service)
- */
- CONTROL_MODEL_DIRECT_ENHANCED = 3,
- /**
- * Select before operate (SBO) with enhanced security (enhanced security includes the CommandTermination service)
- */
- CONTROL_MODEL_SBO_ENHANCED = 4
- } ControlModel;
- /**
- * @defgroup TRIGGER_OPTIONS Trigger options (bit values combinable)
- *
- * @{
- */
- /** Report will be triggered when data changes */
- #define TRG_OPT_DATA_CHANGED 1
- /** Report will be triggered when quality changes */
- #define TRG_OPT_QUALITY_CHANGED 2
- /** Report will be triggered when data is updated */
- #define TRG_OPT_DATA_UPDATE 4
- /** Report will be triggered periodically */
- #define TRG_OPT_INTEGRITY 8
- /** Report will be triggered by GI (general interrogation) request */
- #define TRG_OPT_GI 16
- /** Report will be triggered only on rising edge (transient variable */
- #define TRG_OPT_TRANSIENT 128
- /** @} */
- /**
- * @defgroup REPORT_OPTIONS Report options (bit values combinable)
- *
- * @{
- */
- /** Report contains sequence number */
- #define RPT_OPT_SEQ_NUM 1
- /** Report contains a report timestamp */
- #define RPT_OPT_TIME_STAMP 2
- /** Report contains reason for inclusion value for each included data set member */
- #define RPT_OPT_REASON_FOR_INCLUSION 4
- /** Report contains data set object reference */
- #define RPT_OPT_DATA_SET 8
- /** Report contains data reference for each included data set member */
- #define RPT_OPT_DATA_REFERENCE 16
- /** Report contains buffer overflow flag */
- #define RPT_OPT_BUFFER_OVERFLOW 32
- /** Report contains entry id */
- #define RPT_OPT_ENTRY_ID 64
- /** Report contains configuration revision */
- #define RPT_OPT_CONF_REV 128
- /** @} */
- /**
- * @defgroup ORIGINATOR_CATEGORIES Originator categories (orCat)
- *
- * @{
- */
- /** Not supported - should not be used */
- #define CONTROL_ORCAT_NOT_SUPPORTED 0
- /** Control operation issued from an operator using a client located at bay level */
- #define CONTROL_ORCAT_BAY_CONTROL 1
- /** Control operation issued from an operator using a client located at station level */
- #define CONTROL_ORCAT_STATION_CONTROL 2
- /** Control operation from a remote operator outside the substation (for example network control center) */
- #define CONTROL_ORCAT_REMOTE_CONTROL 3
- /** Control operation issued from an automatic function at bay level */
- #define CONTROL_ORCAT_AUTOMATIC_BAY 4
- /** Control operation issued from an automatic function at station level */
- #define CONTROL_ORCAT_AUTOMATIC_STATION 5
- /** Control operation issued from a automatic function outside of the substation */
- #define CONTROL_ORCAT_AUTOMATIC_REMOTE 6
- /** Control operation issued from a maintenance/service tool */
- #define CONTROL_ORCAT_MAINTENANCE 7
- /** Status change occurred without control action (for example external trip of a circuit breaker or failure inside the breaker) */
- #define CONTROL_ORCAT_PROCESS 8
- /** @} */
- /**
- * @defgroup CONTROL_ADD_CAUSE Definition for addCause type - used in control models
- *
- * @{
- */
- /** AddCause - additional cause information for control model errors */
- typedef enum {
- ADD_CAUSE_UNKNOWN = 0,
- ADD_CAUSE_NOT_SUPPORTED = 1,
- ADD_CAUSE_BLOCKED_BY_SWITCHING_HIERARCHY = 2,
- ADD_CAUSE_SELECT_FAILED = 3,
- ADD_CAUSE_INVALID_POSITION = 4,
- ADD_CAUSE_POSITION_REACHED = 5,
- ADD_CAUSE_PARAMETER_CHANGE_IN_EXECUTION = 6,
- ADD_CAUSE_STEP_LIMIT = 7,
- ADD_CAUSE_BLOCKED_BY_MODE = 8,
- ADD_CAUSE_BLOCKED_BY_PROCESS = 9,
- ADD_CAUSE_BLOCKED_BY_INTERLOCKING = 10,
- ADD_CAUSE_BLOCKED_BY_SYNCHROCHECK = 11,
- ADD_CAUSE_COMMAND_ALREADY_IN_EXECUTION = 12,
- ADD_CAUSE_BLOCKED_BY_HEALTH = 13,
- ADD_CAUSE_1_OF_N_CONTROL = 14,
- ADD_CAUSE_ABORTION_BY_CANCEL = 15,
- ADD_CAUSE_TIME_LIMIT_OVER = 16,
- ADD_CAUSE_ABORTION_BY_TRIP = 17,
- ADD_CAUSE_OBJECT_NOT_SELECTED = 18,
- ADD_CAUSE_OBJECT_ALREADY_SELECTED = 19,
- ADD_CAUSE_NO_ACCESS_AUTHORITY = 20,
- ADD_CAUSE_ENDED_WITH_OVERSHOOT = 21,
- ADD_CAUSE_ABORTION_DUE_TO_DEVIATION = 22,
- ADD_CAUSE_ABORTION_BY_COMMUNICATION_LOSS = 23,
- ADD_CAUSE_ABORTION_BY_COMMAND = 24,
- ADD_CAUSE_NONE = 25,
- ADD_CAUSE_INCONSISTENT_PARAMETERS = 26,
- ADD_CAUSE_LOCKED_BY_OTHER_CLIENT = 27
- } ControlAddCause;
- /** @} */
- /**
- * @defgroup CONTROL_LAST_APPL_ERROR Definition for LastAppError error type - used in control models
- *
- * @{
- */
- typedef enum {
- CONTROL_ERROR_NO_ERROR = 0,
- CONTROL_ERROR_UNKNOWN = 1,
- CONTROL_ERROR_TIMEOUT_TEST = 2,
- CONTROL_ERROR_OPERATOR_TEST = 3
- } ControlLastApplError;
- /** @} */
- /**
- * @defgroup FUNCTIONAL_CONSTRAINTS Definitions and functions related to functional constraints (FCs)
- *
- * @{
- */
- #if (CONFIG_PROVIDE_OLD_FC_DEFINES == 1)
- #define ST IEC61850_FC_ST
- #define MX IEC61850_FC_MX
- #define SP IEC61850_FC_SP
- #define SV IEC61850_FC_SV
- #define CF IEC61850_FC_CF
- #define DC IEC61850_FC_DC
- #define SG IEC61850_FC_SG
- #define SE IEC61850_FC_SE
- #define SR IEC61850_FC_SR
- #define OR IEC61850_FC_OR
- #define BL IEC61850_FC_BL
- #define EX IEC61850_FC_EX
- #define CO IEC61850_FC_CO
- #define ALL IEC61850_FC_ALL
- #define NONE IEC61850_FC_NONE
- #endif /* (CONFIG_PROVIDE_OLD_FC_DEFINES == 1) */
- /** FCs (Functional constraints) according to IEC 61850-7-2 */
- typedef enum eFunctionalConstraint {
- /** Status information */
- IEC61850_FC_ST = 0,
- /** Measurands - analog values */
- IEC61850_FC_MX = 1,
- /** Setpoint */
- IEC61850_FC_SP = 2,
- /** Substitution */
- IEC61850_FC_SV = 3,
- /** Configuration */
- IEC61850_FC_CF = 4,
- /** Description */
- IEC61850_FC_DC = 5,
- /** Setting group */
- IEC61850_FC_SG = 6,
- /** Setting group editable */
- IEC61850_FC_SE = 7,
- /** Service response / Service tracking */
- IEC61850_FC_SR = 8,
- /** Operate received */
- IEC61850_FC_OR = 9,
- /** Blocking */
- IEC61850_FC_BL = 10,
- /** Extended definition */
- IEC61850_FC_EX = 11,
- /** Control */
- IEC61850_FC_CO = 12,
- /** Unicast SV */
- IEC61850_FC_US = 13,
- /** Multicast SV */
- IEC61850_FC_MS = 14,
- /** Unbuffered report */
- IEC61850_FC_RP = 15,
- /** Buffered report */
- IEC61850_FC_BR = 16,
- /** Log control blocks */
- IEC61850_FC_LG = 17,
- /** Goose control blocks */
- IEC61850_FC_GO = 18,
- /** All FCs - wildcard value */
- IEC61850_FC_ALL = 99,
- IEC61850_FC_NONE = -1
- } FunctionalConstraint;
- /**extern "C" {
- * \brief convert a function constraint to a static string
- */
- LIB61850_API char*
- FunctionalConstraint_toString(FunctionalConstraint fc);
- /**
- * \brief parse a string treated as a functional constraint representation
- */
- LIB61850_API FunctionalConstraint
- FunctionalConstraint_fromString(const char* fcString);
- /** @} */
- /**
- * @defgroup QUALITY Definitions and functions related to data attribute quality
- *
- * @{
- */
- typedef uint16_t Quality;
- typedef uint16_t Validity;
- #define QUALITY_VALIDITY_GOOD 0
- #define QUALITY_VALIDITY_INVALID 2
- #define QUALITY_VALIDITY_RESERVED 1
- #define QUALITY_VALIDITY_QUESTIONABLE 3
- #define QUALITY_DETAIL_OVERFLOW 4
- #define QUALITY_DETAIL_OUT_OF_RANGE 8
- #define QUALITY_DETAIL_BAD_REFERENCE 16
- #define QUALITY_DETAIL_OSCILLATORY 32
- #define QUALITY_DETAIL_FAILURE 64
- #define QUALITY_DETAIL_OLD_DATA 128
- #define QUALITY_DETAIL_INCONSISTENT 256
- #define QUALITY_DETAIL_INACCURATE 512
- #define QUALITY_SOURCE_SUBSTITUTED 1024
- #define QUALITY_TEST 2048
- #define QUALITY_OPERATOR_BLOCKED 4096
- #define QUALITY_DERIVED 8192
- LIB61850_API Validity
- Quality_getValidity(Quality* self);
- LIB61850_API void
- Quality_setValidity(Quality* self, Validity validity);
- LIB61850_API void
- Quality_setFlag(Quality* self, int flag);
- LIB61850_API void
- Quality_unsetFlag(Quality* self, int flag);
- LIB61850_API bool
- Quality_isFlagSet(Quality* self, int flag);
- LIB61850_API Quality
- Quality_fromMmsValue(const MmsValue* mmsValue);
- LIB61850_API MmsValue*
- Quality_toMmsValue(Quality* self, MmsValue* mmsValue);
- /** @} */
- /**
- * @defgroup DBPOS Definitions and functions related to IEC 61850 Dbpos (a CODED ENUM) data type
- *
- * @{
- */
- typedef enum {
- DBPOS_INTERMEDIATE_STATE = 0,
- DBPOS_OFF = 1,
- DBPOS_ON = 2,
- DBPOS_BAD_STATE = 3
- } Dbpos;
- /**
- * \brief convert MMS bit string to Dbpos enumeration type
- *
- * \param mmsValue the MmsValue instance representing the Dbpos value
- *
- * \return the corresponding Dbpos value
- */
- LIB61850_API Dbpos
- Dbpos_fromMmsValue(const MmsValue* mmsValue);
- /**
- * \brief conver Dbpos to MMS bit string
- *
- * \param mmsValue the MmsValue instance representing a Dbpos value or NULL to create a new MmsValue instance
- * \param a Dbpos value
- *
- * \return the corresponding MmsValue instance
- */
- LIB61850_API MmsValue*
- Dbpos_toMmsValue(MmsValue* mmsValue, Dbpos dbpos);
- /** @} */
- /**
- * @defgroup TIMESTAMP Definitions and functions related to IEC 61850 Timestamp (UTC Time) data type
- *
- * @{
- */
- typedef union {
- uint8_t val[8];
- } Timestamp;
- LIB61850_API Timestamp*
- Timestamp_create(void);
- LIB61850_API Timestamp*
- Timestamp_createFromByteArray(const uint8_t* byteArray);
- LIB61850_API void
- Timestamp_destroy(Timestamp* self);
- LIB61850_API void
- Timestamp_clearFlags(Timestamp* self);
- LIB61850_API uint32_t
- Timestamp_getTimeInSeconds(Timestamp* self);
- LIB61850_API msSinceEpoch
- Timestamp_getTimeInMs(Timestamp* self);
- LIB61850_API nsSinceEpoch
- Timestamp_getTimeInNs(Timestamp* self);
- LIB61850_API bool
- Timestamp_isLeapSecondKnown(Timestamp* self);
- LIB61850_API void
- Timestamp_setLeapSecondKnown(Timestamp* self, bool value);
- LIB61850_API bool
- Timestamp_hasClockFailure(Timestamp* self);
- LIB61850_API void
- Timestamp_setClockFailure(Timestamp* self, bool value);
- LIB61850_API bool
- Timestamp_isClockNotSynchronized(Timestamp* self);
- LIB61850_API void
- Timestamp_setClockNotSynchronized(Timestamp* self, bool value);
- LIB61850_API int
- Timestamp_getSubsecondPrecision(Timestamp* self);
- /**
- * \brief Set the subsecond precision value of the time stamp
- *
- * \param subsecondPrecision the number of significant bits of the fractionOfSecond part of the time stamp
- */
- LIB61850_API void
- Timestamp_setSubsecondPrecision(Timestamp* self, int subsecondPrecision);
- /**
- * \brief Set the time in seconds
- *
- * NOTE: the fractionOfSecond part is set to zero
- * NOTE: the subSecondPrecision is not touched
- *
- * \param self the Timestamp instance
- * \param secondsSinceEpoch the seconds since unix epoch (unix timestamp)
- */
- LIB61850_API void
- Timestamp_setTimeInSeconds(Timestamp* self, uint32_t secondsSinceEpoch);
- /**
- * \brief Set the time in milliseconds
- *
- * NOTE: the subSecondPrecision is not touched
- *
- * \param self the Timestamp instance
- * \param msTime the milliseconds since unix epoch
- */
- LIB61850_API void
- Timestamp_setTimeInMilliseconds(Timestamp* self, msSinceEpoch msTime);
- /**
- * \brief Set the time in nanoseconds
- *
- * NOTE: the subSecondPrecision is not touched
- *
- * \param self the Timestamp instance
- * \param msTime the nanoseconds since unix epoch
- */
- LIB61850_API void
- Timestamp_setTimeInNanoseconds(Timestamp* self, nsSinceEpoch nsTime);
- LIB61850_API void
- Timestamp_setByMmsUtcTime(Timestamp* self, const MmsValue* mmsValue);
- /**
- * \brief Set an MmsValue instance of type UTCTime to the timestamp value
- *
- * \param self the Timestamp instance
- * \param mmsValue the mmsValue instance, if NULL a new instance will be created
- */
- LIB61850_API MmsValue*
- Timestamp_toMmsValue(Timestamp* self, MmsValue* mmsValue);
- /**
- * \brief Get the Timestamp value from an MmsValue instance of type MMS_UTC_TIME
- *
- * \param self the Timestamp instance or NULL to create a new instance
- * \param mmsValue the mmsValue instance of type MMS_UTC_TIME
- *
- * \return the updated Timestamp value or NULL in case of an error
- */
- LIB61850_API Timestamp*
- Timestamp_fromMmsValue(Timestamp* self, MmsValue* mmsValue);
- /**
- * \brief Get the version of the library as string
- *
- * \return the version of the library (e.g. "1.2.2")
- */
- LIB61850_API char*
- LibIEC61850_getVersionString(void);
- /** @} */
- /**@}*/
- #ifdef __cplusplus
- }
- #endif
- #endif /* IEC61850_COMMON_H_ */
|