You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

478 lines
15 KiB
C

1 year ago
/*
* sv_publisher.h
*
* Copyright 2016-2018 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 LIBIEC61850_SRC_SAMPLED_VALUES_SV_PUBLISHER_H_
#define LIBIEC61850_SRC_SAMPLED_VALUES_SV_PUBLISHER_H_
#include "libiec61850_platform_includes.h"
#include "iec61850_common.h"
#ifdef __cplusplus
extern "C" {
#endif
#ifndef GOOSE_SV_COMM_PARAMETERS
#define GOOSE_SV_COMM_PARAMETERS
typedef struct sCommParameters {
uint8_t vlanPriority;
uint16_t vlanId;
uint16_t appId;
uint8_t dstAddress[6];
} CommParameters;
#endif
/**
* \defgroup sv_publisher_api_group IEC 61850 Sampled Values (SV) publisher API
*/
/**@{*/
#define IEC61850_SV_SMPSYNC_NOT_SYNCHRONIZED 0
#define IEC61850_SV_SMPSYNC_SYNCED_UNSPEC_LOCAL_CLOCK 1
#define IEC61850_SV_SMPSYNC_SYNCED_GLOBAL_CLOCK 2
#define IEC61850_SV_SMPMOD_PER_NOMINAL_PERIOD 0
#define IEC61850_SV_SMPMOD_SAMPLES_PER_SECOND 1
#define IEC61850_SV_SMPMOD_SECONDS_PER_SAMPLE 2
/**
* \brief An opaque type representing an IEC 61850-9-2 Sampled Values publisher.
*/
typedef struct sSVPublisher* SVPublisher;
/**
* \brief An opaque type representing an IEC 61850-9-2 Sampled Values Application Service Data Unit (ASDU).
*/
typedef struct sSVPublisher_ASDU* SVPublisher_ASDU;
/**
* \brief Create a new IEC61850-9-2 Sampled Values publisher.
*
* NOTE: VLAN tagging is enabled when calling this constructor. To disable VLAN tagging
* use \ref SVPublisher_createEx instead.
*
* \param[in] interfaceId the name of the interface over which the SV publisher should send SV packets.
* \param[in] parameters optional parameters for setting VLAN options and destination MAC address. Use NULL for default values.
* \return the new SV publisher instance.
*/
LIB61850_API SVPublisher
SVPublisher_create(CommParameters* parameters, const char* interfaceId);
/**
* \brief Create a new IEC61850-9-2 Sampled Values publisher.
*
* \param[in] interfaceId the name of the interface over which the SV publisher should send SV packets.
* \param[in] parameters optional parameters for setting VLAN options and destination MAC address. Use NULL for default values.
* \param[in] useVlanTags enable(true)/disable(false) VLAN tagging
* \return the new SV publisher instance.
*/
LIB61850_API SVPublisher
SVPublisher_createEx(CommParameters* parameters, const char* interfaceId, bool useVlanTag);
/**
* \brief Create an Application Service Data Unit (ASDU) and add it to an existing Sampled Values publisher.
*
* \param[in] svID
* \param[in] datset
* \param[in] confRev Configuration revision number. Should be incremented each time that the configuration of the logical device changes.
* \return the new ASDU instance.
*/
LIB61850_API SVPublisher_ASDU
SVPublisher_addASDU(SVPublisher self, const char* svID, const char* datset, uint32_t confRev);
/**
* \brief Prepare the publisher for publishing.
*
* This method must be called before SVPublisher_publish().
*
* \param[in] self the Sampled Values publisher instance.
*/
LIB61850_API void
SVPublisher_setupComplete(SVPublisher self);
/**
* \brief Publish all registered ASDUs
*
* \param[in] self the Sampled Values publisher instance.
*/
LIB61850_API void
SVPublisher_publish(SVPublisher self);
/**
* \brief Destroy an IEC61850-9-2 Sampled Values instance.
*
* \param[in] self the Sampled Values publisher instance.
*/
LIB61850_API void
SVPublisher_destroy(SVPublisher self);
/**
* \addtogroup sv_publisher_asdu_group Values Application Service Data Unit (ASDU)
* @{
*/
/**
* \brief Reset the internal data buffer of an ASDU.
*
* All data elements added by SVPublisher_ASDU_add*() functions are removed.
* SVPublisher_setupComplete() must be called afterwards.
*
* \param[in] self the Sampled Values ASDU instance.
*/
LIB61850_API void
SVPublisher_ASDU_resetBuffer(SVPublisher_ASDU self);
/**
* \brief Reserve memory for a signed 8-bit integer in the ASDU.
*
* \param[in] self the Sampled Values ASDU instance.
* \return the offset in bytes within the ASDU data block.
*/
LIB61850_API int
SVPublisher_ASDU_addINT8(SVPublisher_ASDU self);
/**
* \brief Set the value of a 8-bit integer in the ASDU.
*
* \param[in] self the Sampled Values ASDU instance.
* \param[in] index The offset within the data block of the ASDU in bytes.
* \param[in] value The value which should be set.
*/
LIB61850_API void
SVPublisher_ASDU_setINT8(SVPublisher_ASDU self, int index, int8_t value);
/**
* \brief Reserve memory for a signed 32-bit integer in the ASDU.
*
* \param[in] self the Sampled Values ASDU instance.
* \return the offset in bytes within the ASDU data block.
*/
LIB61850_API int
SVPublisher_ASDU_addINT32(SVPublisher_ASDU self);
/**
* \brief Set the value of a 32-bit integer in the ASDU.
*
* \param[in] self the Sampled Values ASDU instance.
* \param[in] index The offset within the data block of the ASDU in bytes.
* \param[in] value The value which should be set.
*/
LIB61850_API void
SVPublisher_ASDU_setINT32(SVPublisher_ASDU self, int index, int32_t value);
/**
* \brief Reserve memory for a signed 64-bit integer in the ASDU.
*
* \param[in] self the Sampled Values ASDU instance.
* \return the offset in bytes of the new element within the ASDU data block.
*/
LIB61850_API int
SVPublisher_ASDU_addINT64(SVPublisher_ASDU self);
/**
* \brief Set the value of a 64-bit integer in the ASDU.
*
* \param[in] self the Sampled Values ASDU instance.
* \param[in] index The offset within the data block of the ASDU in bytes.
* \param[in] value The value which should be set.
*/
LIB61850_API void
SVPublisher_ASDU_setINT64(SVPublisher_ASDU self, int index, int64_t value);
/**
* \brief Reserve memory for a single precision floating point number in the ASDU.
*
* \param[in] self the Sampled Values ASDU instance.
* \return the offset in bytes of the new element within the ASDU data block.
*/
LIB61850_API int
SVPublisher_ASDU_addFLOAT(SVPublisher_ASDU self);
/**
* \brief Set the value of a single precision floating point number in the ASDU.
*
* \param[in] self the Sampled Values ASDU instance.
* \param[in] index The offset within the data block of the ASDU in bytes.
* \param[in] value The value which should be set.
*/
LIB61850_API void
SVPublisher_ASDU_setFLOAT(SVPublisher_ASDU self, int index, float value);
/**
* \brief Reserve memory for a double precision floating point number in the ASDU.
*
* \param[in] self the Sampled Values ASDU instance.
* \return the offset in bytes of the new element within the ASDU data block.
*/
LIB61850_API int
SVPublisher_ASDU_addFLOAT64(SVPublisher_ASDU self);
/**
* \brief Set the value of a double precision floating pointer number in the ASDU.
*
* \param[in] self the Sampled Values ASDU instance.
* \param[in] index The offset within the data block of the ASDU in bytes.
* \param[in] value The value which should be set.
*/
LIB61850_API void
SVPublisher_ASDU_setFLOAT64(SVPublisher_ASDU self, int index, double value);
/**
* \brief Reserve memory for a 64 bit time stamp in the ASDU
*
* \param[in] self the Sampled Values ASDU instance.
* \return the offset in bytes of the new element within the ASDU data block.
*/
LIB61850_API int
SVPublisher_ASDU_addTimestamp(SVPublisher_ASDU self);
/**
* \brief Set the value of a 64 bit time stamp in the ASDU.
*
* \param[in] self the Sampled Values ASDU instance.
* \param[in] index The offset within the data block of the ASDU in bytes.
* \param[in] value The value which should be set.
*/
LIB61850_API void
SVPublisher_ASDU_setTimestamp(SVPublisher_ASDU self, int index, Timestamp value);
/**
* \brief Reserve memory for a quality value in the ASDU
*
* NOTE: Quality is encoded as BITSTRING (4 byte)
*
* \param[in] self the Sampled Values ASDU instance.
* \return the offset in bytes of the new element within the ASDU data block.
*/
LIB61850_API int
SVPublisher_ASDU_addQuality(SVPublisher_ASDU self);
/**
* \brief Set the value of a quality attribute in the ASDU.
*
* \param[in] self the Sampled Values ASDU instance.
* \param[in] index The offset within the data block of the ASDU in bytes.
* \param[in] value The value which should be set.
*/
LIB61850_API void
SVPublisher_ASDU_setQuality(SVPublisher_ASDU self, int index, Quality value);
/**
* \brief Set the sample count attribute of the ASDU.
*
* \param[in] self the Sampled Values ASDU instance.
* \param[in] value the new value of the attribute.
*/
LIB61850_API void
SVPublisher_ASDU_setSmpCnt(SVPublisher_ASDU self, uint16_t value);
/**
* \brief Get the sample count attribute of the ASDU.
*
* \param[in] self the Sampled Values ASDU instance.
*/
LIB61850_API uint16_t
SVPublisher_ASDU_getSmpCnt(SVPublisher_ASDU self);
/**
* \brief Increment the sample count attribute of the ASDU.
*
* The parameter SmpCnt shall contain the values of a counter, which is incremented each time a new sample of the analogue value is taken.
* The sample values shall be kept in the right order.
* If the counter is used to indicate time consistency of various sampled values, the counter shall be reset by an external synchronization event.
*
* \param[in] self the Sampled Values ASDU instance.
*/
LIB61850_API void
SVPublisher_ASDU_increaseSmpCnt(SVPublisher_ASDU self);
/**
* \brief Set the roll-over (wrap) limit for the sample counter. When reaching the limit the
* sample counter will be reset to 0 (default is no limit)
*
* \param[in] self the Sampled Values ASDU instance.
* \param[in] value the new sample counter limit
*/
LIB61850_API void
SVPublisher_ASDU_setSmpCntWrap(SVPublisher_ASDU self, uint16_t value);
/**
* \brief Enables the transmission of refresh time attribute of the ASDU
*
* The refresh time is the time when the data in put into the sampled values buffer
*
* \param[in] self the Sampled Values ASDU instance.
*/
LIB61850_API void
SVPublisher_ASDU_enableRefrTm(SVPublisher_ASDU self);
/**
* \brief Set the refresh time attribute of the ASDU.
*
* \param[in] self the Sampled Values ASDU instance.
*/
LIB61850_API void
SVPublisher_ASDU_setRefrTm(SVPublisher_ASDU self, uint64_t refrTm);
/**
* \brief Set the sample mode attribute of the ASDU.
*
* The attribute SmpMod shall specify if the sample rate is defined in units of samples per nominal period, samples per second or seconds per sample.
* If it is missing, the default value is samples per period.
*
* NOTE: Function has to be called before calling \ref SVPublisher_setupComplete
*
* \param[in] self the Sampled Values ASDU instance.
* \param[in] smpMod one of IEC61850_SV_SMPMOD_PER_NOMINAL_PERIOD, IEC61850_SV_SMPMOD_SAMPLES_PER_SECOND or IEC61850_SV_SMPMOD_SECONDS_PER_SAMPLE
*/
LIB61850_API void
SVPublisher_ASDU_setSmpMod(SVPublisher_ASDU self, uint8_t smpMod);
/**
* \brief Set the sample rate attribute of the ASDU.
*
* The attribute SmpRate shall specify the sample rate.
* The value shall be interpreted depending on the value of the SmpMod attribute.
*
* NOTE: Function has to be called before calling \ref SVPublisher_setupComplete
*
* \param[in] self the Sampled Values ASDU instance.
* \param[in] smpRate Amount of samples (default per nominal period, see SmpMod).
*/
LIB61850_API void
SVPublisher_ASDU_setSmpRate(SVPublisher_ASDU self, uint16_t smpRate);
/**
* \brief Set the clock synchronization information
*
* Default value is not synchronized (0).
* Possible values are:
* 0 = SV are not synchronized by an external clock signal.
* 1 = SV are synchronized by a clock signal from an unspecified local area clock.
* 2 = SV are synchronized by a global area clock signal (time traceable).
* 5 to 254 = SV are synchronized by a clock signal from a local area clock identified by this value.
* 3;4;255 = Reserved values Do not use.
*
* \param[in] self the Sampled Values ASDU instance.
* \param[in] smpSynch the clock synchronization state
*/
LIB61850_API void
SVPublisher_ASDU_setSmpSynch(SVPublisher_ASDU self, uint16_t smpSynch);
/**@} @}*/
#ifndef DEPRECATED
#if defined(__GNUC__) || defined(__clang__)
#define DEPRECATED __attribute__((deprecated))
#else
#define DEPRECATED
#endif
#endif
/**
* \addtogroup sv_publisher_deprecated_api_group Deprecated API
* \ingroup sv_publisher_api_group IEC 61850 Sampled Values (SV) publisher API
* \deprecated
* @{
*/
typedef struct sSVPublisher* SampledValuesPublisher;
typedef struct sSV_ASDU* SV_ASDU;
LIB61850_API DEPRECATED SVPublisher
SampledValuesPublisher_create(CommParameters* parameters, const char* interfaceId);
LIB61850_API DEPRECATED SVPublisher_ASDU
SampledValuesPublisher_addASDU(SVPublisher self, char* svID, char* datset, uint32_t confRev);
LIB61850_API DEPRECATED void
SampledValuesPublisher_setupComplete(SVPublisher self);
LIB61850_API DEPRECATED void
SampledValuesPublisher_publish(SVPublisher self);
LIB61850_API DEPRECATED void
SampledValuesPublisher_destroy(SVPublisher self);
LIB61850_API DEPRECATED void
SV_ASDU_resetBuffer(SVPublisher_ASDU self);
LIB61850_API DEPRECATED int
SV_ASDU_addINT8(SVPublisher_ASDU self);
LIB61850_API DEPRECATED void
SV_ASDU_setINT8(SVPublisher_ASDU self, int index, int8_t value);
LIB61850_API DEPRECATED int
SV_ASDU_addINT32(SVPublisher_ASDU self);
LIB61850_API DEPRECATED void
SV_ASDU_setINT32(SVPublisher_ASDU self, int index, int32_t value);
LIB61850_API DEPRECATED int
SV_ASDU_addINT64(SVPublisher_ASDU self);
LIB61850_API DEPRECATED void
SV_ASDU_setINT64(SVPublisher_ASDU self, int index, int64_t value);
LIB61850_API DEPRECATED int
SV_ASDU_addFLOAT(SVPublisher_ASDU self);
LIB61850_API DEPRECATED void
SV_ASDU_setFLOAT(SVPublisher_ASDU self, int index, float value);
LIB61850_API DEPRECATED int
SV_ASDU_addFLOAT64(SVPublisher_ASDU self);
LIB61850_API DEPRECATED void
SV_ASDU_setFLOAT64(SVPublisher_ASDU self, int index, double value);
LIB61850_API DEPRECATED void
SV_ASDU_setSmpCnt(SVPublisher_ASDU self, uint16_t value);
LIB61850_API DEPRECATED uint16_t
SV_ASDU_getSmpCnt(SVPublisher_ASDU self);
LIB61850_API DEPRECATED void
SV_ASDU_increaseSmpCnt(SVPublisher_ASDU self);
LIB61850_API DEPRECATED void
SV_ASDU_setRefrTm(SVPublisher_ASDU self, uint64_t refrTm);
LIB61850_API DEPRECATED void
SV_ASDU_setSmpMod(SVPublisher_ASDU self, uint8_t smpMod);
LIB61850_API DEPRECATED void
SV_ASDU_setSmpRate(SVPublisher_ASDU self, uint16_t smpRate);
/**@}*/
#ifdef __cplusplus
}
#endif
#endif /* LIBIEC61850_SRC_SAMPLED_VALUES_SV_PUBLISHER_H_ */