Files
STM32F4-Base/IEC60870-Slave/common/IEC60870_InformationObjects.h
T
STF 4c55544f05
CI / L0 静态门禁 (pre-commit) (push) Failing after 45s
CI / L0.5 主机侧单测 (MSVC) (push) Failing after 42s
通信协议代码
2026-10-26 08:31:48 -04:00

2027 lines
120 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* 101/104共用的信息对象层:每种类型有独立结构、构造器和解析器;编码经只读函数表分派。
* 所有内存由调用方提供,Create不会分配内存,也无需Destroy。对象可按值复制。
* Create/Get_From_Buffer失败不修改对象;修改数值后再次编码仍会检查字段合法性。
* 所有接口只处理数据,不操作网络、点表、系统时钟或选择/执行状态机。
*
* 使用顺序:具体类型Create -> ASDU添加对象;含base成员的类型传base.object,其余传object。
* 接收顺序:ASDU按Type ID选择具体解析器 -> Get_From_Buffer -> 独立具体对象。
* Create/Get_From_Buffer设置身份,编码时借此找到函数表;程序不使用C位域映射报文。
*/
#ifndef IEC60870_INFORMATION_OBJECTS_H
#define IEC60870_INFORMATION_OBJECTS_H
#include "IEC60870_Types.h"
#include "IEC60870_Time.h"
#include <stddef.h>
#ifdef __cplusplus
extern "C" {
#endif
#define IEC60870_ASDU_MAX_OBJECTS 127U /* VSQ低7位保存对象数量,最高位为SQ。 */
#define IEC60870_ASDU_MAX_IOA UINT32_C(0xFFFFFF) /* 3字节信息对象地址的最大值。 */
/* 不可按布尔值判断。只有 OK 修改输出;FULL/ERROR/UNSUPPORTED 保持输出不变。 */
typedef enum {
IEC60870_ASDU_UNSUPPORTED = -2, /* 当前入口不支持该Type ID或该类型类别。 */
IEC60870_ASDU_ERROR = -1, /* 参数、布局、字段内容或构造器状态非法。 */
IEC60870_ASDU_FULL = 0, /* 本次未写入:字节容量不足或对象数量已达上限。 */
IEC60870_ASDU_OK = 1 /* 操作成功;组包成功不表示已经发送或执行。 */
} IEC60870_AsduResult_t;
/* 数值就是ASDU首字节的Type ID;本枚举只列本模块已实现的类型。 */
typedef enum {
IEC60870_ASDU_M_SP_NA_1 = 1, /* 单点信息,SIQ。 */
IEC60870_ASDU_M_SP_TA_1 = 2, /* 带CP24单点信息。 */
IEC60870_ASDU_M_DP_NA_1 = 3, /* 双点信息,DIQ。 */
IEC60870_ASDU_M_DP_TA_1 = 4, /* 带CP24双点信息。 */
IEC60870_ASDU_M_ST_NA_1 = 5, /* 步位置信息。 */
IEC60870_ASDU_M_ST_TA_1 = 6, /* 带CP24步位置信息。 */
IEC60870_ASDU_M_BO_NA_1 = 7, /* 32位比特串监视。 */
IEC60870_ASDU_M_BO_TA_1 = 8, /* 带CP24比特串监视。 */
IEC60870_ASDU_M_ME_NA_1 = 9, /* 归一化测量值,NVA和QDS。 */
IEC60870_ASDU_M_ME_TA_1 = 10, /* 带CP24归一化测量值。 */
IEC60870_ASDU_M_ME_NB_1 = 11, /* 标度化测量值,SVA和QDS。 */
IEC60870_ASDU_M_ME_TB_1 = 12, /* 带CP24标度化测量值。 */
IEC60870_ASDU_M_ME_NC_1 = 13, /* 短浮点测量值,IEEE 754 binary32和QDS。 */
IEC60870_ASDU_M_ME_TC_1 = 14, /* 带CP24短浮点测量值。 */
IEC60870_ASDU_M_IT_NA_1 = 15, /* 累计量,BCR。 */
IEC60870_ASDU_M_IT_TA_1 = 16, /* 带CP24累计量。 */
IEC60870_ASDU_M_EP_TA_1 = 17, /* 带CP24保护事件。 */
IEC60870_ASDU_M_EP_TB_1 = 18, /* 带CP24成组保护启动事件。 */
IEC60870_ASDU_M_EP_TC_1 = 19, /* 带CP24保护输出电路信息。 */
IEC60870_ASDU_M_PS_NA_1 = 20, /* 带变位检测的成组单点。 */
IEC60870_ASDU_M_ME_ND_1 = 21, /* 无品质归一化测量值。 */
IEC60870_ASDU_M_SP_TB_1 = 30, /* 单点信息及CP56Time2a。 */
IEC60870_ASDU_M_DP_TB_1 = 31, /* 双点信息及CP56Time2a。 */
IEC60870_ASDU_M_ST_TB_1 = 32, /* 带CP56步位置信息。 */
IEC60870_ASDU_M_BO_TB_1 = 33, /* 带CP56比特串监视。 */
IEC60870_ASDU_M_ME_TD_1 = 34, /* 归一化测量值及CP56Time2a。 */
IEC60870_ASDU_M_ME_TE_1 = 35, /* 标度化测量值及CP56Time2a。 */
IEC60870_ASDU_M_ME_TF_1 = 36, /* 短浮点测量值及CP56Time2a。 */
IEC60870_ASDU_M_IT_TB_1 = 37, /* 累计量及CP56Time2a。 */
IEC60870_ASDU_M_EP_TD_1 = 38, /* 带CP56保护事件。 */
IEC60870_ASDU_M_EP_TE_1 = 39, /* 带CP56成组保护启动事件。 */
IEC60870_ASDU_M_EP_TF_1 = 40, /* 带CP56保护输出电路信息。 */
IEC60870_ASDU_C_SC_NA_1 = 45, /* 单命令,SCO。 */
IEC60870_ASDU_C_DC_NA_1 = 46, /* 双命令,DCO。 */
IEC60870_ASDU_C_RC_NA_1 = 47, /* 步调节命令,RCO。 */
IEC60870_ASDU_C_SE_NA_1 = 48, /* 归一化设定值命令,NVA和QOS。 */
IEC60870_ASDU_C_SE_NB_1 = 49, /* 标度化设定值命令,SVA和QOS。 */
IEC60870_ASDU_C_SE_NC_1 = 50, /* 短浮点设定值命令,浮点值和QOS。 */
IEC60870_ASDU_C_BO_NA_1 = 51, /* 32位比特串命令。 */
IEC60870_ASDU_C_SC_TA_1 = 58, /* 单命令及CP56Time2a。 */
IEC60870_ASDU_C_DC_TA_1 = 59, /* 双命令及CP56Time2a。 */
IEC60870_ASDU_C_RC_TA_1 = 60, /* 步调节命令及CP56Time2a。 */
IEC60870_ASDU_C_SE_TA_1 = 61, /* 归一化设定值命令及CP56Time2a。 */
IEC60870_ASDU_C_SE_TB_1 = 62, /* 标度化设定值命令及CP56Time2a。 */
IEC60870_ASDU_C_SE_TC_1 = 63, /* 短浮点设定值命令及CP56Time2a。 */
IEC60870_ASDU_C_BO_TA_1 = 64, /* 带CP56比特串命令。 */
IEC60870_ASDU_M_EI_NA_1 = 70, /* 初始化结束。 */
IEC60870_ASDU_C_IC_NA_1 = 100, /* 总召唤命令,QOI。 */
IEC60870_ASDU_C_CI_NA_1 = 101, /* 电能脉冲召唤命令,QCC。 */
IEC60870_ASDU_C_RD_NA_1 = 102, /* 读命令,仅携带IOA。 */
IEC60870_ASDU_C_CS_NA_1 = 103, /* 时钟同步命令,携带CP56Time2a。 */
IEC60870_ASDU_C_TS_NA_1 = 104, /* 无时标测试命令。 */
IEC60870_ASDU_C_RP_NA_1 = 105, /* 复位进程命令,QRP。 */
IEC60870_ASDU_C_CD_NA_1 = 106, /* 延时获得命令。 */
IEC60870_ASDU_C_TS_TA_1 = 107, /* 带CP56Time2a的测试命令,另含2字节测试序号。 */
IEC60870_ASDU_P_ME_NA_1 = 110, /* 归一化测量值参数。 */
IEC60870_ASDU_P_ME_NB_1 = 111, /* 标度化测量值参数。 */
IEC60870_ASDU_P_ME_NC_1 = 112, /* 短浮点测量值参数。 */
IEC60870_ASDU_P_AC_NA_1 = 113, /* 参数激活。 */
IEC60870_ASDU_F_FR_NA_1 = 120, /* 文件准备就绪。 */
IEC60870_ASDU_F_SR_NA_1 = 121, /* 节准备就绪。 */
IEC60870_ASDU_F_SC_NA_1 = 122, /* 文件/节召唤或选择。 */
IEC60870_ASDU_F_LS_NA_1 = 123, /* 最后文件段或节。 */
IEC60870_ASDU_F_AF_NA_1 = 124, /* 文件/节确认。 */
IEC60870_ASDU_F_SG_NA_1 = 125, /* 文件段。 */
IEC60870_ASDU_F_DR_TA_1 = 126, /* 文件目录。 */
IEC60870_ASDU_F_SC_NB_1 = 127 /* 归档查询。 */
} IEC60870_AsduType_t;
/* 单点/双点仅允许 BL/SB/NT/IV;测量值还允许 OV;累计量使用独立 BCR 字段。 */
enum {
IEC60870_ASDU_QUALITY_OV = 0x01, /* 溢出;用于带QDS的对象,不用于SIQ/DIQ/QDP。 */
IEC60870_ASDU_QUALITY_EI = 0x08, /* 保护事件的经过时间无效;仅用于QDP。 */
IEC60870_ASDU_QUALITY_BL = 0x10, /* 被封锁。 */
IEC60870_ASDU_QUALITY_SB = 0x20, /* 被取代。 */
IEC60870_ASDU_QUALITY_NT = 0x40, /* 非当前值。 */
IEC60870_ASDU_QUALITY_IV = 0x80 /* 无效。 */
};
/* BCR的4字节计数和1字节状态按字段保存,不直接把结构体复制到报文。 */
typedef struct {
int32_t value; /* 32位有符号累计值。 */
uint8_t sequence_number; /* BCR 序号 0..31,与 ASDU 的 SQ 无关 */
uint8_t has_carry; /* CY:发生进位,0/1。 */
uint8_t is_adjusted; /* CA:计数已调整,0/1;此处不是ASDU公共地址。 */
uint8_t is_invalid; /* IV:计数无效,0/1。 */
} IEC60870_BinaryCounterReading_t;
/* 公共基类只保存身份、地址和编码分派表;由具体类型的Create或解析器初始化。
* type_id和virtual_function_table只读,禁止手工伪造。ioa可在所选宽度内修改。
* 每个具体类型必须以本基类(或以本基类开头的基础类型)为首成员。
* 带时标对象的base.object仍保存带时标Type ID和函数表。只能复制完整具体对象;
* 不得把base截取成独立基础对象后编码,否则函数表会按较大的带时标结构访问。
* 要转换成无时标类型,应调用对应基础类型的Create,显式传入值、品质及地址。 */
struct IEC60870_InformationObjectVTable;
typedef struct {
uint32_t ioa; /* 构造时允许24位,实际编码再按1/2/3字节配置检查;不是公共地址CA。 */
uint8_t type_id; /* 对应ASDU首字节;由具体Create/解析器设置,调用方只读。 */
const struct IEC60870_InformationObjectVTable *virtual_function_table; /* 静态只读编码函数表,无需释放。 */
} IEC60870_InformationObject_t;
/* Type 1:单点信息。 */
typedef struct {
IEC60870_InformationObject_t object; /* 公共基类,必须位于首成员。 */
uint8_t value; /* 0/1。 */
uint8_t quality; /* 点信息仅高4位;测量值另允许bit0溢出。 */
} IEC60870_SinglePointInformation_t;
/* Type 3:双点信息。 */
typedef struct {
IEC60870_InformationObject_t object; /* 公共基类,必须位于首成员。 */
uint8_t value; /* 0..3,含中间及不确定状态。 */
uint8_t quality; /* 点信息仅高4位;测量值另允许bit0溢出。 */
} IEC60870_DoublePointInformation_t;
/* Type 9:归一化测量值(原始16位定点值)。 */
typedef struct {
IEC60870_InformationObject_t object; /* 公共基类,必须位于首成员。 */
int16_t value; /* 实际值=value/32768.0。 */
uint8_t quality; /* 点信息仅高4位;测量值另允许bit0溢出。 */
} IEC60870_MeasuredValueNormalized_t;
/* Type 11:标度化测量值。 */
typedef struct {
IEC60870_InformationObject_t object; /* 公共基类,必须位于首成员。 */
int16_t value; /* 有符号16位整数。 */
uint8_t quality; /* 点信息仅高4位;测量值另允许bit0溢出。 */
} IEC60870_MeasuredValueScaled_t;
/* Type 13:短浮点测量值。 */
typedef struct {
IEC60870_InformationObject_t object; /* 公共基类,必须位于首成员。 */
float value; /* IEEE 754 binary32,保留NaN/Inf位模式。 */
uint8_t quality; /* 点信息仅高4位;测量值另允许bit0溢出。 */
} IEC60870_MeasuredValueShort_t;
/* Type 15:累计量。 */
typedef struct {
IEC60870_InformationObject_t object; /* 公共基类,必须位于首成员。 */
IEC60870_BinaryCounterReading_t value; /* 计数及BCR标志,不使用QDS。 */
} IEC60870_IntegratedTotals_t;
/* Type 30:带时标单点信息。 */
typedef struct {
IEC60870_SinglePointInformation_t base; /* 首成员为基础对象;时标复用其值编解码。 */
IEC60870_CP56Time2a_t time; /* CP56保留IV/SU,不执行时区转换或校时。 */
} IEC60870_SinglePointWithCP56Time2a_t;
/* Type 31:带时标双点信息。 */
typedef struct {
IEC60870_DoublePointInformation_t base; /* 首成员为基础对象;时标复用其值编解码。 */
IEC60870_CP56Time2a_t time; /* CP56保留IV/SU,不执行时区转换或校时。 */
} IEC60870_DoublePointWithCP56Time2a_t;
/* Type 34:带时标归一化测量值。 */
typedef struct {
IEC60870_MeasuredValueNormalized_t base; /* 首成员为基础对象;时标复用其值编解码。 */
IEC60870_CP56Time2a_t time; /* CP56保留IV/SU,不执行时区转换或校时。 */
} IEC60870_MeasuredValueNormalizedWithCP56Time2a_t;
/* Type 35:带时标标度化测量值。 */
typedef struct {
IEC60870_MeasuredValueScaled_t base; /* 首成员为基础对象;时标复用其值编解码。 */
IEC60870_CP56Time2a_t time; /* CP56保留IV/SU,不执行时区转换或校时。 */
} IEC60870_MeasuredValueScaledWithCP56Time2a_t;
/* Type 36:带时标短浮点测量值。 */
typedef struct {
IEC60870_MeasuredValueShort_t base; /* 首成员为基础对象;时标复用其值编解码。 */
IEC60870_CP56Time2a_t time; /* CP56保留IV/SU,不执行时区转换或校时。 */
} IEC60870_MeasuredValueShortWithCP56Time2a_t;
/* Type 37:带时标累计量。 */
typedef struct {
IEC60870_IntegratedTotals_t base; /* 首成员为基础对象;时标复用其值编解码。 */
IEC60870_CP56Time2a_t time; /* CP56保留IV/SU,不执行时区转换或校时。 */
} IEC60870_IntegratedTotalsWithCP56Time2a_t;
/* Type 45:单命令。 */
typedef struct {
IEC60870_InformationObject_t object; /* 公共基类,必须位于首成员。 */
uint8_t state; /* 0/1。 */
uint8_t is_select; /* S/E:1选择、0执行。 */
uint8_t qualifier; /* QU:0..31,业务判断具体支持值。 */
} IEC60870_SingleCommand_t;
/* Type 46:双命令。 */
typedef struct {
IEC60870_InformationObject_t object; /* 公共基类,必须位于首成员。 */
uint8_t state; /* 仅1/2。 */
uint8_t is_select; /* S/E:1选择、0执行。 */
uint8_t qualifier; /* QU:0..31,业务判断具体支持值。 */
} IEC60870_DoubleCommand_t;
/* Type 47:步调节命令。 */
typedef struct {
IEC60870_InformationObject_t object; /* 公共基类,必须位于首成员。 */
uint8_t state; /* 仅1/2。 */
uint8_t is_select; /* S/E:1选择、0执行。 */
uint8_t qualifier; /* QU:0..31,业务判断具体支持值。 */
} IEC60870_StepCommand_t;
/* Type 48:归一化设定值命令(原始16位定点值)。 */
typedef struct {
IEC60870_InformationObject_t object; /* 公共基类,必须位于首成员。 */
int16_t value; /* 归一化原始16位定点值。 */
uint8_t is_select; /* S/E:0/1。 */
uint8_t qualifier; /* QL:0..127。 */
} IEC60870_SetpointCommandNormalized_t;
/* Type 49:标度化设定值命令。 */
typedef struct {
IEC60870_InformationObject_t object; /* 公共基类,必须位于首成员。 */
int16_t value; /* 有符号16位标度值。 */
uint8_t is_select; /* S/E:0/1。 */
uint8_t qualifier; /* QL:0..127。 */
} IEC60870_SetpointCommandScaled_t;
/* Type 50:短浮点设定值命令。 */
typedef struct {
IEC60870_InformationObject_t object; /* 公共基类,必须位于首成员。 */
float value; /* IEEE 754 binary32。 */
uint8_t is_select; /* S/E:0/1。 */
uint8_t qualifier; /* QL:0..127。 */
} IEC60870_SetpointCommandShort_t;
/* Type 58:带时标单命令。 */
typedef struct {
IEC60870_SingleCommand_t base; /* 首成员为基础对象;时标复用其值编解码。 */
IEC60870_CP56Time2a_t time; /* CP56保留IV/SU,不执行时区转换或校时。 */
} IEC60870_SingleCommandWithCP56Time2a_t;
/* Type 59:带时标双命令。 */
typedef struct {
IEC60870_DoubleCommand_t base; /* 首成员为基础对象;时标复用其值编解码。 */
IEC60870_CP56Time2a_t time; /* CP56保留IV/SU,不执行时区转换或校时。 */
} IEC60870_DoubleCommandWithCP56Time2a_t;
/* Type 60:带时标步调节命令。 */
typedef struct {
IEC60870_StepCommand_t base; /* 首成员为基础对象;时标复用其值编解码。 */
IEC60870_CP56Time2a_t time; /* CP56保留IV/SU,不执行时区转换或校时。 */
} IEC60870_StepCommandWithCP56Time2a_t;
/* Type 61:带时标归一化设定值命令。 */
typedef struct {
IEC60870_SetpointCommandNormalized_t base; /* 首成员为基础对象;时标复用其值编解码。 */
IEC60870_CP56Time2a_t time; /* CP56保留IV/SU,不执行时区转换或校时。 */
} IEC60870_SetpointCommandNormalizedWithCP56Time2a_t;
/* Type 62:带时标标度化设定值命令。 */
typedef struct {
IEC60870_SetpointCommandScaled_t base; /* 首成员为基础对象;时标复用其值编解码。 */
IEC60870_CP56Time2a_t time; /* CP56保留IV/SU,不执行时区转换或校时。 */
} IEC60870_SetpointCommandScaledWithCP56Time2a_t;
/* Type 63:带时标短浮点设定值命令。 */
typedef struct {
IEC60870_SetpointCommandShort_t base; /* 首成员为基础对象;时标复用其值编解码。 */
IEC60870_CP56Time2a_t time; /* CP56保留IV/SU,不执行时区转换或校时。 */
} IEC60870_SetpointCommandShortWithCP56Time2a_t;
/* Type 100:总召唤命令。 */
typedef struct {
IEC60870_InformationObject_t object; /* 公共基类,必须位于首成员。 */
uint8_t qualifier; /* QOI:0..255,业务判断适用性。 */
} IEC60870_InterrogationCommand_t;
/* Type 101:电能脉冲召唤命令。 */
typedef struct {
IEC60870_InformationObject_t object; /* 公共基类,必须位于首成员。 */
uint8_t qualifier; /* RQT:0..63。 */
uint8_t freeze; /* FR:0..3。 */
} IEC60870_CounterInterrogationCommand_t;
/* Type 102:读命令。 */
typedef struct {
IEC60870_InformationObject_t object; /* 公共基类,必须位于首成员。 */
} IEC60870_ReadCommand_t;
/* Type 103:时钟同步命令。 */
typedef struct {
IEC60870_InformationObject_t object; /* 公共基类,必须位于首成员。 */
IEC60870_CP56Time2a_t time; /* 时间按值保存;允许IV=1,不代表可执行校时。 */
} IEC60870_ClockSynchronizationCommand_t;
/* Type 105:复位进程命令。 */
typedef struct {
IEC60870_InformationObject_t object; /* 公共基类,必须位于首成员。 */
uint8_t qualifier; /* QRP:0..255,业务判断适用性。 */
} IEC60870_ResetProcessCommand_t;
/* Type 107:带时标测试命令。 */
typedef struct {
IEC60870_InformationObject_t object; /* 公共基类,必须位于首成员。 */
uint16_t sequence; /* 2字节测试序号,与链路序号无关。 */
IEC60870_CP56Time2a_t time; /* 时间按值保存;允许IV=1,不代表可执行校时。 */
} IEC60870_TestCommandWithCP56Time2a_t;
/* Type 5:步位置信息;布局:VTI(1:低7位补码位置、bit7瞬态) + QDS(1)。 */
typedef struct {
IEC60870_InformationObject_t object; /* 公共基类,必须为首成员。 */
int8_t value; /* VTI有符号步位置,-64..63。 */
uint8_t is_transient; /* VTI瞬态标志,0/1。 */
uint8_t quality; /* QDS,仅允许0xF1范围内的位。 */
} IEC60870_StepPositionInformation_t;
/* Type 7:32位比特串监视;布局:BSI(4) + QDS(1)。 */
typedef struct {
IEC60870_InformationObject_t object; /* 公共基类,必须为首成员。 */
uint32_t value; /* 32位状态比特串。 */
uint8_t quality; /* QDS,仅允许0xF1范围内的位。 */
} IEC60870_BitString32_t;
/* Type 2:带CP24单点信息;布局:基础值(1) + CP24(3)。 */
typedef struct {
IEC60870_SinglePointInformation_t base; /* 首成员为基础对象,值处理复用基础类型。 */
IEC60870_CP24Time2a_t time; /* CP24时标,按值保存。 */
} IEC60870_SinglePointWithCP24Time2a_t;
/* Type 4:带CP24双点信息;布局:基础值(1) + CP24(3)。 */
typedef struct {
IEC60870_DoublePointInformation_t base; /* 首成员为基础对象,值处理复用基础类型。 */
IEC60870_CP24Time2a_t time; /* CP24时标,按值保存。 */
} IEC60870_DoublePointWithCP24Time2a_t;
/* Type 6:带CP24步位置信息;布局:基础值(2) + CP24(3)。 */
typedef struct {
IEC60870_StepPositionInformation_t base; /* 首成员为基础对象,值处理复用基础类型。 */
IEC60870_CP24Time2a_t time; /* CP24时标,按值保存。 */
} IEC60870_StepPositionWithCP24Time2a_t;
/* Type 8:带CP24比特串监视;布局:基础值(5) + CP24(3)。 */
typedef struct {
IEC60870_BitString32_t base; /* 首成员为基础对象,值处理复用基础类型。 */
IEC60870_CP24Time2a_t time; /* CP24时标,按值保存。 */
} IEC60870_Bitstring32WithCP24Time2a_t;
/* Type 10:带CP24归一化测量值;布局:基础值(3) + CP24(3)。 */
typedef struct {
IEC60870_MeasuredValueNormalized_t base; /* 首成员为基础对象,值处理复用基础类型。 */
IEC60870_CP24Time2a_t time; /* CP24时标,按值保存。 */
} IEC60870_MeasuredValueNormalizedWithCP24Time2a_t;
/* Type 12:带CP24标度化测量值;布局:基础值(3) + CP24(3)。 */
typedef struct {
IEC60870_MeasuredValueScaled_t base; /* 首成员为基础对象,值处理复用基础类型。 */
IEC60870_CP24Time2a_t time; /* CP24时标,按值保存。 */
} IEC60870_MeasuredValueScaledWithCP24Time2a_t;
/* Type 14:带CP24短浮点测量值;布局:基础值(5) + CP24(3)。 */
typedef struct {
IEC60870_MeasuredValueShort_t base; /* 首成员为基础对象,值处理复用基础类型。 */
IEC60870_CP24Time2a_t time; /* CP24时标,按值保存。 */
} IEC60870_MeasuredValueShortWithCP24Time2a_t;
/* Type 16:带CP24累计量;布局:基础值(5) + CP24(3)。 */
typedef struct {
IEC60870_IntegratedTotals_t base; /* 首成员为基础对象,值处理复用基础类型。 */
IEC60870_CP24Time2a_t time; /* CP24时标,按值保存。 */
} IEC60870_IntegratedTotalsWithCP24Time2a_t;
/* Type 32:带CP56步位置信息;布局:基础值(2) + CP56(7)。 */
typedef struct {
IEC60870_StepPositionInformation_t base; /* 首成员为基础对象,值处理复用基础类型。 */
IEC60870_CP56Time2a_t time; /* CP56时标,按值保存。 */
} IEC60870_StepPositionWithCP56Time2a_t;
/* Type 33:带CP56比特串监视;布局:基础值(5) + CP56(7)。 */
typedef struct {
IEC60870_BitString32_t base; /* 首成员为基础对象,值处理复用基础类型。 */
IEC60870_CP56Time2a_t time; /* CP56时标,按值保存。 */
} IEC60870_Bitstring32WithCP56Time2a_t;
/* Type 17:带CP24保护事件;布局:SEP(1:ES低2位,QDP高5位) + CP16(2) + CP24(3)。 */
typedef struct {
IEC60870_InformationObject_t object; /* 公共基类,必须为首成员。 */
uint8_t event; /* 事件状态/位掩码,0..3。 */
uint8_t quality; /* 保护品质QDP,EI/BL/SB/NT/IV,掩码0xF8。 */
IEC60870_CP16Time2a_t elapsed_time; /* 事件经过时间,0..65535毫秒。 */
IEC60870_CP24Time2a_t time; /* CP24事件时标。 */
} IEC60870_EventOfProtectionEquipment_t;
/* Type 18:带CP24成组保护启动事件;布局:事件(1) + QDP(1) + CP16(2) + CP24(3)。 */
typedef struct {
IEC60870_InformationObject_t object; /* 公共基类,必须为首成员。 */
uint8_t event; /* 事件状态/位掩码,0..63。 */
uint8_t quality; /* 保护品质QDP,EI/BL/SB/NT/IV,掩码0xF8。 */
IEC60870_CP16Time2a_t elapsed_time; /* 事件经过时间,0..65535毫秒。 */
IEC60870_CP24Time2a_t time; /* CP24事件时标。 */
} IEC60870_PackedStartEventsOfProtectionEquipment_t;
/* Type 19:带CP24保护输出电路信息;布局:事件(1) + QDP(1) + CP16(2) + CP24(3)。 */
typedef struct {
IEC60870_InformationObject_t object; /* 公共基类,必须为首成员。 */
uint8_t event; /* 事件状态/位掩码,0..15。 */
uint8_t quality; /* 保护品质QDP,EI/BL/SB/NT/IV,掩码0xF8。 */
IEC60870_CP16Time2a_t elapsed_time; /* 输出电路动作时间,0..65535毫秒。 */
IEC60870_CP24Time2a_t time; /* CP24事件时标。 */
} IEC60870_PackedOutputCircuitInfo_t;
/* Type 38:带CP56保护事件;布局:SEP(1:ES低2位,QDP高5位) + CP16(2) + CP56(7)。 */
typedef struct {
IEC60870_InformationObject_t object; /* 公共基类,必须为首成员。 */
uint8_t event; /* 事件状态/位掩码,0..3。 */
uint8_t quality; /* 保护品质QDP,EI/BL/SB/NT/IV,掩码0xF8。 */
IEC60870_CP16Time2a_t elapsed_time; /* 事件经过时间,0..65535毫秒。 */
IEC60870_CP56Time2a_t time; /* CP56事件时标。 */
} IEC60870_EventOfProtectionEquipmentWithCP56Time2a_t;
/* Type 39:带CP56成组保护启动事件;布局:事件(1) + QDP(1) + CP16(2) + CP56(7)。 */
typedef struct {
IEC60870_InformationObject_t object; /* 公共基类,必须为首成员。 */
uint8_t event; /* 事件状态/位掩码,0..63。 */
uint8_t quality; /* 保护品质QDP,EI/BL/SB/NT/IV,掩码0xF8。 */
IEC60870_CP16Time2a_t elapsed_time; /* 事件经过时间,0..65535毫秒。 */
IEC60870_CP56Time2a_t time; /* CP56事件时标。 */
} IEC60870_PackedStartEventsOfProtectionEquipmentWithCP56Time2a_t;
/* Type 40:带CP56保护输出电路信息;布局:事件(1) + QDP(1) + CP16(2) + CP56(7)。 */
typedef struct {
IEC60870_InformationObject_t object; /* 公共基类,必须为首成员。 */
uint8_t event; /* 事件状态/位掩码,0..15。 */
uint8_t quality; /* 保护品质QDP,EI/BL/SB/NT/IV,掩码0xF8。 */
IEC60870_CP16Time2a_t elapsed_time; /* 输出电路动作时间,0..65535毫秒。 */
IEC60870_CP56Time2a_t time; /* CP56事件时标。 */
} IEC60870_PackedOutputCircuitInfoWithCP56Time2a_t;
/* Type 20:带变位检测的成组单点;布局:SCD(4:状态16位 + 变位16位) + QDS(1)。 */
typedef struct {
IEC60870_InformationObject_t object; /* 公共基类,必须为首成员。 */
uint16_t status; /* 16个单点当前状态,低位对应组内首点。 */
uint16_t change; /* 16个变位检测标志,与status逐位对应。 */
uint8_t quality; /* QDS,仅允许0xF1范围内的位。 */
} IEC60870_PackedSinglePointWithSCD_t;
/* Type 21:无品质归一化测量值;布局:NVA(2),不包含QDS。 */
typedef struct {
IEC60870_InformationObject_t object; /* 公共基类,必须为首成员。 */
int16_t value; /* 归一化原始定点值,实际值=value/32768.0。 */
} IEC60870_MeasuredValueNormalizedWithoutQuality_t;
/* Type 51:32位比特串命令;布局:BSI(4),不包含QDS。 */
typedef struct {
IEC60870_InformationObject_t object; /* 公共基类,必须为首成员。 */
uint32_t value; /* 完整32位命令比特串,无品质或选择位。 */
} IEC60870_Bitstring32Command_t;
/* Type 64:带CP56比特串命令;布局:基础值(4) + CP56(7)。 */
typedef struct {
IEC60870_Bitstring32Command_t base; /* 首成员为基础对象,值处理复用基础类型。 */
IEC60870_CP56Time2a_t time; /* CP56时标,按值保存。 */
} IEC60870_Bitstring32CommandWithCP56Time2a_t;
/* Type 70:初始化结束;布局:COI(1),地址适用性由应用判断。 */
typedef struct {
IEC60870_InformationObject_t object; /* 公共基类,必须为首成员。 */
uint8_t cause; /* COI:低7位初始化原因,bit7表示本地参数改变。 */
} IEC60870_EndOfInitialization_t;
/* Type 104:无时标测试命令;布局:固定测试图样AA 55。 */
typedef struct {
IEC60870_InformationObject_t object; /* 公共基类,必须为首成员。 */
} IEC60870_TestCommand_t;
/* Type 106:延时获得命令;布局:CP16(2)。 */
typedef struct {
IEC60870_InformationObject_t object; /* 公共基类,必须为首成员。 */
IEC60870_CP16Time2a_t delay; /* 延时时间,0..65535毫秒。 */
} IEC60870_DelayAcquisitionCommand_t;
/* Type 110:归一化测量值参数;布局:参数值(2) + QPM(1),QPM不是QDS。 */
typedef struct {
IEC60870_InformationObject_t object; /* 公共基类,必须为首成员。 */
int16_t value; /* 16位参数值;归一化类型按原始定点值保存。 */
uint8_t qualifier; /* QPM完整字节:低6位参数种类,bit6本地改变、bit7运行状态。 */
} IEC60870_ParameterNormalizedValue_t;
/* Type 111:标度化测量值参数;布局:参数值(2) + QPM(1),QPM不是QDS。 */
typedef struct {
IEC60870_InformationObject_t object; /* 公共基类,必须为首成员。 */
int16_t value; /* 16位参数值;归一化类型按原始定点值保存。 */
uint8_t qualifier; /* QPM完整字节:低6位参数种类,bit6本地改变、bit7运行状态。 */
} IEC60870_ParameterScaledValue_t;
/* Type 112:短浮点测量值参数;布局:参数值(4) + QPM(1),QPM不是QDS。 */
typedef struct {
IEC60870_InformationObject_t object; /* 公共基类,必须为首成员。 */
float value; /* IEEE 754 binary32参数值。 */
uint8_t qualifier; /* QPM完整字节:低6位参数种类,bit6本地改变、bit7运行状态。 */
} IEC60870_ParameterFloatValue_t;
/* Type 113:参数激活;布局:QPA(1)。 */
typedef struct {
IEC60870_InformationObject_t object; /* 公共基类,必须为首成员。 */
uint8_t qualifier; /* QPA完整字节,限定词的业务适用性由应用判断。 */
} IEC60870_ParameterActivation_t;
/* Type 120:文件准备就绪;布局:NOF(2) + LOF(3) + FRQ(1)。 */
typedef struct {
IEC60870_InformationObject_t object; /* 公共基类,必须为首成员。 */
uint16_t file_name; /* NOF,文件标识,不是字符串文件名。 */
uint32_t file_length; /* LOF,24位文件长度,0..0xFFFFFF。 */
uint8_t qualifier; /* FRQ,仅bit7可置1,表示否定;低7位保留。 */
} IEC60870_FileReady_t;
/* Type 121:节准备就绪;布局:NOF(2) + NOS(1) + LOS(3) + SRQ(1)。 */
typedef struct {
IEC60870_InformationObject_t object; /* 公共基类,必须为首成员。 */
uint16_t file_name; /* NOF,文件标识,不是字符串文件名。 */
uint8_t section; /* NOS,节编号,0..255。 */
uint32_t section_length; /* LOS,24位节长度,0..0xFFFFFF。 */
uint8_t qualifier; /* SRQ,仅bit7可置1,表示否定;低7位保留。 */
} IEC60870_SectionReady_t;
/* Type 122:文件/节召唤或选择;布局:NOF(2) + NOS(1) + SCQ(1)。 */
typedef struct {
IEC60870_InformationObject_t object; /* 公共基类,必须为首成员。 */
uint16_t file_name; /* NOF,文件标识,不是字符串文件名。 */
uint8_t section; /* NOS,节编号,0..255。 */
uint8_t qualifier; /* SCQ完整字节,具体限定词由业务判断。 */
} IEC60870_FileCallOrSelect_t;
/* Type 124:文件/节确认;布局:NOF(2) + NOS(1) + AFQ(1)。 */
typedef struct {
IEC60870_InformationObject_t object; /* 公共基类,必须为首成员。 */
uint16_t file_name; /* NOF,文件标识,不是字符串文件名。 */
uint8_t section; /* NOS,节编号,0..255。 */
uint8_t qualifier; /* AFQ完整字节,具体限定词由业务判断。 */
} IEC60870_FileACK_t;
/* Type 123:最后文件段或节;布局:NOF(2) + NOS(1) + LSQ(1) + CHS(1),这里只传递校验和。 */
typedef struct {
IEC60870_InformationObject_t object; /* 公共基类,必须为首成员。 */
uint16_t file_name; /* NOF,文件标识,不是字符串文件名。 */
uint8_t section; /* NOS,节编号,0..255。 */
uint8_t qualifier; /* LSQ,最后段/节限定词。 */
uint8_t checksum; /* CHS,文件/节校验和;业务按传输范围计算。 */
} IEC60870_FileLastSegmentOrSection_t;
/* Type 125:文件段;布局:NOF(2) + NOS(1) + LOS(1) + 段数据(LOS),SQ=0且仅一个对象。 */
typedef struct {
IEC60870_InformationObject_t object; /* 公共基类,必须为首成员。 */
uint16_t file_name; /* NOF,文件标识,不是字符串文件名。 */
uint8_t section; /* NOS,节编号,0..255。 */
uint8_t length; /* LOS,段数据长度0..255;能否装入ASDU由所选配置决定。 */
uint8_t data[255]; /* 独立保存段数据,不借用输入。 */
} IEC60870_FileSegment_t;
/* Type 126:文件目录;布局:NOF(2) + LOF(3) + SOF(1) + CP56(7)。 */
typedef struct {
IEC60870_InformationObject_t object; /* 公共基类,必须为首成员。 */
uint16_t file_name; /* NOF,文件标识,不是字符串文件名。 */
uint32_t file_length; /* LOF,24位文件长度。 */
uint8_t status; /* SOF,低5位文件状态,bit5/6/7为LFD/FOR/FA。 */
IEC60870_CP56Time2a_t creation_time; /* 文件创建时间。 */
} IEC60870_FileDirectory_t;
/* Type 127:归档查询;布局:NOF(2) + 查询起始CP56(7) + 查询结束CP56(7)。 */
typedef struct {
IEC60870_InformationObject_t object; /* 公共基类,必须为首成员。 */
uint16_t file_name; /* NOF,文件标识,不是字符串文件名。 */
IEC60870_CP56Time2a_t start_time; /* 查询开始时间。 */
IEC60870_CP56Time2a_t stop_time; /* 查询结束时间,区间适用性由业务判断。 */
} IEC60870_QueryLog_t;
/**
* 功能:构造Type 5(步位置信息)。
* 输入参数:ioa——0..0xFFFFFF;其余参数见对应结构字段注释,时间和数据指针只在调用期间借用。
* 输出参数:self——调用方提供的具体对象存储。
* 返回值:OK成功;ERROR参数、字段或时间非法,输出不变。
* 说明:VTI(1:低7位补码位置、bit7瞬态) + QDS(1);不分配内存,不执行业务。
*/
IEC60870_AsduResult_t IEC60870_StepPositionInformation_Create(IEC60870_StepPositionInformation_t *self,
uint32_t ioa, int value, int is_transient, int quality);
/**
* 功能:解析Type 5(步位置信息)的独立值载荷。
* 输入参数:ioa——已解析地址;payload——不含IOA;length——载荷实际字节数。
* 输出参数:self——按值保存的独立对象,失败保持原值。
* 返回值:OK成功;ERROR地址、长度、字段或时间非法。
* 说明:长度必须恰好为2字节;不借用原报文。
*/
IEC60870_AsduResult_t IEC60870_StepPositionInformation_Get_From_Buffer(IEC60870_StepPositionInformation_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 7(32位比特串监视)。
* 输入参数:ioa——0..0xFFFFFF;其余参数见对应结构字段注释,时间和数据指针只在调用期间借用。
* 输出参数:self——调用方提供的具体对象存储。
* 返回值:OK成功;ERROR参数、字段或时间非法,输出不变。
* 说明:BSI(4) + QDS(1);不分配内存,不执行业务。
*/
IEC60870_AsduResult_t IEC60870_BitString32_Create(IEC60870_BitString32_t *self,
uint32_t ioa, uint32_t value, int quality);
/**
* 功能:解析Type 7(32位比特串监视)的独立值载荷。
* 输入参数:ioa——已解析地址;payload——不含IOA;length——载荷实际字节数。
* 输出参数:self——按值保存的独立对象,失败保持原值。
* 返回值:OK成功;ERROR地址、长度、字段或时间非法。
* 说明:长度必须恰好为5字节;不借用原报文。
*/
IEC60870_AsduResult_t IEC60870_BitString32_Get_From_Buffer(IEC60870_BitString32_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 2(带CP24单点信息)。
* 输入参数:ioa——0..0xFFFFFF;其余参数见对应结构字段注释,时间和数据指针只在调用期间借用。
* 输出参数:self——调用方提供的具体对象存储。
* 返回值:OK成功;ERROR参数、字段或时间非法,输出不变。
* 说明:基础值(1) + CP24(3);不分配内存,不执行业务。
*/
IEC60870_AsduResult_t IEC60870_SinglePointWithCP24Time2a_Create(IEC60870_SinglePointWithCP24Time2a_t *self,
uint32_t ioa, int value, int quality, const IEC60870_CP24Time2a_t *time);
/**
* 功能:解析Type 2(带CP24单点信息)的独立值载荷。
* 输入参数:ioa——已解析地址;payload——不含IOA;length——载荷实际字节数。
* 输出参数:self——按值保存的独立对象,失败保持原值。
* 返回值:OK成功;ERROR地址、长度、字段或时间非法。
* 说明:长度必须恰好为4字节;不借用原报文。
*/
IEC60870_AsduResult_t IEC60870_SinglePointWithCP24Time2a_Get_From_Buffer(IEC60870_SinglePointWithCP24Time2a_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 4(带CP24双点信息)。
* 输入参数:ioa——0..0xFFFFFF;其余参数见对应结构字段注释,时间和数据指针只在调用期间借用。
* 输出参数:self——调用方提供的具体对象存储。
* 返回值:OK成功;ERROR参数、字段或时间非法,输出不变。
* 说明:基础值(1) + CP24(3);不分配内存,不执行业务。
*/
IEC60870_AsduResult_t IEC60870_DoublePointWithCP24Time2a_Create(IEC60870_DoublePointWithCP24Time2a_t *self,
uint32_t ioa, int value, int quality, const IEC60870_CP24Time2a_t *time);
/**
* 功能:解析Type 4(带CP24双点信息)的独立值载荷。
* 输入参数:ioa——已解析地址;payload——不含IOA;length——载荷实际字节数。
* 输出参数:self——按值保存的独立对象,失败保持原值。
* 返回值:OK成功;ERROR地址、长度、字段或时间非法。
* 说明:长度必须恰好为4字节;不借用原报文。
*/
IEC60870_AsduResult_t IEC60870_DoublePointWithCP24Time2a_Get_From_Buffer(IEC60870_DoublePointWithCP24Time2a_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 6(带CP24步位置信息)。
* 输入参数:ioa——0..0xFFFFFF;其余参数见对应结构字段注释,时间和数据指针只在调用期间借用。
* 输出参数:self——调用方提供的具体对象存储。
* 返回值:OK成功;ERROR参数、字段或时间非法,输出不变。
* 说明:基础值(2) + CP24(3);不分配内存,不执行业务。
*/
IEC60870_AsduResult_t IEC60870_StepPositionWithCP24Time2a_Create(IEC60870_StepPositionWithCP24Time2a_t *self,
uint32_t ioa, int value, int is_transient, int quality, const IEC60870_CP24Time2a_t *time);
/**
* 功能:解析Type 6(带CP24步位置信息)的独立值载荷。
* 输入参数:ioa——已解析地址;payload——不含IOA;length——载荷实际字节数。
* 输出参数:self——按值保存的独立对象,失败保持原值。
* 返回值:OK成功;ERROR地址、长度、字段或时间非法。
* 说明:长度必须恰好为5字节;不借用原报文。
*/
IEC60870_AsduResult_t IEC60870_StepPositionWithCP24Time2a_Get_From_Buffer(IEC60870_StepPositionWithCP24Time2a_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 8(带CP24比特串监视)。
* 输入参数:ioa——0..0xFFFFFF;其余参数见对应结构字段注释,时间和数据指针只在调用期间借用。
* 输出参数:self——调用方提供的具体对象存储。
* 返回值:OK成功;ERROR参数、字段或时间非法,输出不变。
* 说明:基础值(5) + CP24(3);不分配内存,不执行业务。
*/
IEC60870_AsduResult_t IEC60870_Bitstring32WithCP24Time2a_Create(IEC60870_Bitstring32WithCP24Time2a_t *self,
uint32_t ioa, uint32_t value, int quality, const IEC60870_CP24Time2a_t *time);
/**
* 功能:解析Type 8(带CP24比特串监视)的独立值载荷。
* 输入参数:ioa——已解析地址;payload——不含IOA;length——载荷实际字节数。
* 输出参数:self——按值保存的独立对象,失败保持原值。
* 返回值:OK成功;ERROR地址、长度、字段或时间非法。
* 说明:长度必须恰好为8字节;不借用原报文。
*/
IEC60870_AsduResult_t IEC60870_Bitstring32WithCP24Time2a_Get_From_Buffer(IEC60870_Bitstring32WithCP24Time2a_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 10(带CP24归一化测量值)。
* 输入参数:ioa——0..0xFFFFFF;其余参数见对应结构字段注释,时间和数据指针只在调用期间借用。
* 输出参数:self——调用方提供的具体对象存储。
* 返回值:OK成功;ERROR参数、字段或时间非法,输出不变。
* 说明:基础值(3) + CP24(3);不分配内存,不执行业务。
*/
IEC60870_AsduResult_t IEC60870_MeasuredValueNormalizedWithCP24Time2a_Create(IEC60870_MeasuredValueNormalizedWithCP24Time2a_t *self,
uint32_t ioa, int16_t value, int quality, const IEC60870_CP24Time2a_t *time);
/**
* 功能:解析Type 10(带CP24归一化测量值)的独立值载荷。
* 输入参数:ioa——已解析地址;payload——不含IOA;length——载荷实际字节数。
* 输出参数:self——按值保存的独立对象,失败保持原值。
* 返回值:OK成功;ERROR地址、长度、字段或时间非法。
* 说明:长度必须恰好为6字节;不借用原报文。
*/
IEC60870_AsduResult_t IEC60870_MeasuredValueNormalizedWithCP24Time2a_Get_From_Buffer(IEC60870_MeasuredValueNormalizedWithCP24Time2a_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 12(带CP24标度化测量值)。
* 输入参数:ioa——0..0xFFFFFF;其余参数见对应结构字段注释,时间和数据指针只在调用期间借用。
* 输出参数:self——调用方提供的具体对象存储。
* 返回值:OK成功;ERROR参数、字段或时间非法,输出不变。
* 说明:基础值(3) + CP24(3);不分配内存,不执行业务。
*/
IEC60870_AsduResult_t IEC60870_MeasuredValueScaledWithCP24Time2a_Create(IEC60870_MeasuredValueScaledWithCP24Time2a_t *self,
uint32_t ioa, int16_t value, int quality, const IEC60870_CP24Time2a_t *time);
/**
* 功能:解析Type 12(带CP24标度化测量值)的独立值载荷。
* 输入参数:ioa——已解析地址;payload——不含IOA;length——载荷实际字节数。
* 输出参数:self——按值保存的独立对象,失败保持原值。
* 返回值:OK成功;ERROR地址、长度、字段或时间非法。
* 说明:长度必须恰好为6字节;不借用原报文。
*/
IEC60870_AsduResult_t IEC60870_MeasuredValueScaledWithCP24Time2a_Get_From_Buffer(IEC60870_MeasuredValueScaledWithCP24Time2a_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 14(带CP24短浮点测量值)。
* 输入参数:ioa——0..0xFFFFFF;其余参数见对应结构字段注释,时间和数据指针只在调用期间借用。
* 输出参数:self——调用方提供的具体对象存储。
* 返回值:OK成功;ERROR参数、字段或时间非法,输出不变。
* 说明:基础值(5) + CP24(3);不分配内存,不执行业务。
*/
IEC60870_AsduResult_t IEC60870_MeasuredValueShortWithCP24Time2a_Create(IEC60870_MeasuredValueShortWithCP24Time2a_t *self,
uint32_t ioa, float value, int quality, const IEC60870_CP24Time2a_t *time);
/**
* 功能:解析Type 14(带CP24短浮点测量值)的独立值载荷。
* 输入参数:ioa——已解析地址;payload——不含IOA;length——载荷实际字节数。
* 输出参数:self——按值保存的独立对象,失败保持原值。
* 返回值:OK成功;ERROR地址、长度、字段或时间非法。
* 说明:长度必须恰好为8字节;不借用原报文。
*/
IEC60870_AsduResult_t IEC60870_MeasuredValueShortWithCP24Time2a_Get_From_Buffer(IEC60870_MeasuredValueShortWithCP24Time2a_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 16(带CP24累计量)。
* 输入参数:ioa——0..0xFFFFFF;其余参数见对应结构字段注释,时间和数据指针只在调用期间借用。
* 输出参数:self——调用方提供的具体对象存储。
* 返回值:OK成功;ERROR参数、字段或时间非法,输出不变。
* 说明:基础值(5) + CP24(3);不分配内存,不执行业务。
*/
IEC60870_AsduResult_t IEC60870_IntegratedTotalsWithCP24Time2a_Create(IEC60870_IntegratedTotalsWithCP24Time2a_t *self,
uint32_t ioa, const IEC60870_BinaryCounterReading_t *value, const IEC60870_CP24Time2a_t *time);
/**
* 功能:解析Type 16(带CP24累计量)的独立值载荷。
* 输入参数:ioa——已解析地址;payload——不含IOA;length——载荷实际字节数。
* 输出参数:self——按值保存的独立对象,失败保持原值。
* 返回值:OK成功;ERROR地址、长度、字段或时间非法。
* 说明:长度必须恰好为8字节;不借用原报文。
*/
IEC60870_AsduResult_t IEC60870_IntegratedTotalsWithCP24Time2a_Get_From_Buffer(IEC60870_IntegratedTotalsWithCP24Time2a_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 32(带CP56步位置信息)。
* 输入参数:ioa——0..0xFFFFFF;其余参数见对应结构字段注释,时间和数据指针只在调用期间借用。
* 输出参数:self——调用方提供的具体对象存储。
* 返回值:OK成功;ERROR参数、字段或时间非法,输出不变。
* 说明:基础值(2) + CP56(7);不分配内存,不执行业务。
*/
IEC60870_AsduResult_t IEC60870_StepPositionWithCP56Time2a_Create(IEC60870_StepPositionWithCP56Time2a_t *self,
uint32_t ioa, int value, int is_transient, int quality, const IEC60870_CP56Time2a_t *time);
/**
* 功能:解析Type 32(带CP56步位置信息)的独立值载荷。
* 输入参数:ioa——已解析地址;payload——不含IOA;length——载荷实际字节数。
* 输出参数:self——按值保存的独立对象,失败保持原值。
* 返回值:OK成功;ERROR地址、长度、字段或时间非法。
* 说明:长度必须恰好为9字节;不借用原报文。
*/
IEC60870_AsduResult_t IEC60870_StepPositionWithCP56Time2a_Get_From_Buffer(IEC60870_StepPositionWithCP56Time2a_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 33(带CP56比特串监视)。
* 输入参数:ioa——0..0xFFFFFF;其余参数见对应结构字段注释,时间和数据指针只在调用期间借用。
* 输出参数:self——调用方提供的具体对象存储。
* 返回值:OK成功;ERROR参数、字段或时间非法,输出不变。
* 说明:基础值(5) + CP56(7);不分配内存,不执行业务。
*/
IEC60870_AsduResult_t IEC60870_Bitstring32WithCP56Time2a_Create(IEC60870_Bitstring32WithCP56Time2a_t *self,
uint32_t ioa, uint32_t value, int quality, const IEC60870_CP56Time2a_t *time);
/**
* 功能:解析Type 33(带CP56比特串监视)的独立值载荷。
* 输入参数:ioa——已解析地址;payload——不含IOA;length——载荷实际字节数。
* 输出参数:self——按值保存的独立对象,失败保持原值。
* 返回值:OK成功;ERROR地址、长度、字段或时间非法。
* 说明:长度必须恰好为12字节;不借用原报文。
*/
IEC60870_AsduResult_t IEC60870_Bitstring32WithCP56Time2a_Get_From_Buffer(IEC60870_Bitstring32WithCP56Time2a_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 17(带CP24保护事件)。
* 输入参数:ioa——0..0xFFFFFF;其余参数见对应结构字段注释,时间和数据指针只在调用期间借用。
* 输出参数:self——调用方提供的具体对象存储。
* 返回值:OK成功;ERROR参数、字段或时间非法,输出不变。
* 说明:SEP(1:ES低2位,QDP高5位) + CP16(2) + CP24(3);不分配内存,不执行业务。
*/
IEC60870_AsduResult_t IEC60870_EventOfProtectionEquipment_Create(IEC60870_EventOfProtectionEquipment_t *self,
uint32_t ioa, int event, int quality, const IEC60870_CP16Time2a_t *elapsed_time, const IEC60870_CP24Time2a_t *time);
/**
* 功能:解析Type 17(带CP24保护事件)的独立值载荷。
* 输入参数:ioa——已解析地址;payload——不含IOA;length——载荷实际字节数。
* 输出参数:self——按值保存的独立对象,失败保持原值。
* 返回值:OK成功;ERROR地址、长度、字段或时间非法。
* 说明:长度必须恰好为6字节;不借用原报文。
*/
IEC60870_AsduResult_t IEC60870_EventOfProtectionEquipment_Get_From_Buffer(IEC60870_EventOfProtectionEquipment_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 18(带CP24成组保护启动事件)。
* 输入参数:ioa——0..0xFFFFFF;其余参数见对应结构字段注释,时间和数据指针只在调用期间借用。
* 输出参数:self——调用方提供的具体对象存储。
* 返回值:OK成功;ERROR参数、字段或时间非法,输出不变。
* 说明:事件(1) + QDP(1) + CP16(2) + CP24(3);不分配内存,不执行业务。
*/
IEC60870_AsduResult_t IEC60870_PackedStartEventsOfProtectionEquipment_Create(IEC60870_PackedStartEventsOfProtectionEquipment_t *self,
uint32_t ioa, int event, int quality, const IEC60870_CP16Time2a_t *elapsed_time, const IEC60870_CP24Time2a_t *time);
/**
* 功能:解析Type 18(带CP24成组保护启动事件)的独立值载荷。
* 输入参数:ioa——已解析地址;payload——不含IOA;length——载荷实际字节数。
* 输出参数:self——按值保存的独立对象,失败保持原值。
* 返回值:OK成功;ERROR地址、长度、字段或时间非法。
* 说明:长度必须恰好为7字节;不借用原报文。
*/
IEC60870_AsduResult_t IEC60870_PackedStartEventsOfProtectionEquipment_Get_From_Buffer(IEC60870_PackedStartEventsOfProtectionEquipment_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 19(带CP24保护输出电路信息)。
* 输入参数:ioa——0..0xFFFFFF;其余参数见对应结构字段注释,时间和数据指针只在调用期间借用。
* 输出参数:self——调用方提供的具体对象存储。
* 返回值:OK成功;ERROR参数、字段或时间非法,输出不变。
* 说明:事件(1) + QDP(1) + CP16(2) + CP24(3);不分配内存,不执行业务。
*/
IEC60870_AsduResult_t IEC60870_PackedOutputCircuitInfo_Create(IEC60870_PackedOutputCircuitInfo_t *self,
uint32_t ioa, int event, int quality, const IEC60870_CP16Time2a_t *elapsed_time, const IEC60870_CP24Time2a_t *time);
/**
* 功能:解析Type 19(带CP24保护输出电路信息)的独立值载荷。
* 输入参数:ioa——已解析地址;payload——不含IOA;length——载荷实际字节数。
* 输出参数:self——按值保存的独立对象,失败保持原值。
* 返回值:OK成功;ERROR地址、长度、字段或时间非法。
* 说明:长度必须恰好为7字节;不借用原报文。
*/
IEC60870_AsduResult_t IEC60870_PackedOutputCircuitInfo_Get_From_Buffer(IEC60870_PackedOutputCircuitInfo_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 38(带CP56保护事件)。
* 输入参数:ioa——0..0xFFFFFF;其余参数见对应结构字段注释,时间和数据指针只在调用期间借用。
* 输出参数:self——调用方提供的具体对象存储。
* 返回值:OK成功;ERROR参数、字段或时间非法,输出不变。
* 说明:SEP(1:ES低2位,QDP高5位) + CP16(2) + CP56(7);不分配内存,不执行业务。
*/
IEC60870_AsduResult_t IEC60870_EventOfProtectionEquipmentWithCP56Time2a_Create(IEC60870_EventOfProtectionEquipmentWithCP56Time2a_t *self,
uint32_t ioa, int event, int quality, const IEC60870_CP16Time2a_t *elapsed_time, const IEC60870_CP56Time2a_t *time);
/**
* 功能:解析Type 38(带CP56保护事件)的独立值载荷。
* 输入参数:ioa——已解析地址;payload——不含IOA;length——载荷实际字节数。
* 输出参数:self——按值保存的独立对象,失败保持原值。
* 返回值:OK成功;ERROR地址、长度、字段或时间非法。
* 说明:长度必须恰好为10字节;不借用原报文。
*/
IEC60870_AsduResult_t IEC60870_EventOfProtectionEquipmentWithCP56Time2a_Get_From_Buffer(IEC60870_EventOfProtectionEquipmentWithCP56Time2a_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 39(带CP56成组保护启动事件)。
* 输入参数:ioa——0..0xFFFFFF;其余参数见对应结构字段注释,时间和数据指针只在调用期间借用。
* 输出参数:self——调用方提供的具体对象存储。
* 返回值:OK成功;ERROR参数、字段或时间非法,输出不变。
* 说明:事件(1) + QDP(1) + CP16(2) + CP56(7);不分配内存,不执行业务。
*/
IEC60870_AsduResult_t IEC60870_PackedStartEventsOfProtectionEquipmentWithCP56Time2a_Create(IEC60870_PackedStartEventsOfProtectionEquipmentWithCP56Time2a_t *self,
uint32_t ioa, int event, int quality, const IEC60870_CP16Time2a_t *elapsed_time, const IEC60870_CP56Time2a_t *time);
/**
* 功能:解析Type 39(带CP56成组保护启动事件)的独立值载荷。
* 输入参数:ioa——已解析地址;payload——不含IOA;length——载荷实际字节数。
* 输出参数:self——按值保存的独立对象,失败保持原值。
* 返回值:OK成功;ERROR地址、长度、字段或时间非法。
* 说明:长度必须恰好为11字节;不借用原报文。
*/
IEC60870_AsduResult_t IEC60870_PackedStartEventsOfProtectionEquipmentWithCP56Time2a_Get_From_Buffer(IEC60870_PackedStartEventsOfProtectionEquipmentWithCP56Time2a_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 40(带CP56保护输出电路信息)。
* 输入参数:ioa——0..0xFFFFFF;其余参数见对应结构字段注释,时间和数据指针只在调用期间借用。
* 输出参数:self——调用方提供的具体对象存储。
* 返回值:OK成功;ERROR参数、字段或时间非法,输出不变。
* 说明:事件(1) + QDP(1) + CP16(2) + CP56(7);不分配内存,不执行业务。
*/
IEC60870_AsduResult_t IEC60870_PackedOutputCircuitInfoWithCP56Time2a_Create(IEC60870_PackedOutputCircuitInfoWithCP56Time2a_t *self,
uint32_t ioa, int event, int quality, const IEC60870_CP16Time2a_t *elapsed_time, const IEC60870_CP56Time2a_t *time);
/**
* 功能:解析Type 40(带CP56保护输出电路信息)的独立值载荷。
* 输入参数:ioa——已解析地址;payload——不含IOA;length——载荷实际字节数。
* 输出参数:self——按值保存的独立对象,失败保持原值。
* 返回值:OK成功;ERROR地址、长度、字段或时间非法。
* 说明:长度必须恰好为11字节;不借用原报文。
*/
IEC60870_AsduResult_t IEC60870_PackedOutputCircuitInfoWithCP56Time2a_Get_From_Buffer(IEC60870_PackedOutputCircuitInfoWithCP56Time2a_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 20(带变位检测的成组单点)。
* 输入参数:ioa——0..0xFFFFFF;其余参数见对应结构字段注释,时间和数据指针只在调用期间借用。
* 输出参数:self——调用方提供的具体对象存储。
* 返回值:OK成功;ERROR参数、字段或时间非法,输出不变。
* 说明:SCD(4:状态16位 + 变位16位) + QDS(1);不分配内存,不执行业务。
*/
IEC60870_AsduResult_t IEC60870_PackedSinglePointWithSCD_Create(IEC60870_PackedSinglePointWithSCD_t *self,
uint32_t ioa, uint16_t status, uint16_t change, int quality);
/**
* 功能:解析Type 20(带变位检测的成组单点)的独立值载荷。
* 输入参数:ioa——已解析地址;payload——不含IOA;length——载荷实际字节数。
* 输出参数:self——按值保存的独立对象,失败保持原值。
* 返回值:OK成功;ERROR地址、长度、字段或时间非法。
* 说明:长度必须恰好为5字节;不借用原报文。
*/
IEC60870_AsduResult_t IEC60870_PackedSinglePointWithSCD_Get_From_Buffer(IEC60870_PackedSinglePointWithSCD_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 21(无品质归一化测量值)。
* 输入参数:ioa——0..0xFFFFFF;其余参数见对应结构字段注释,时间和数据指针只在调用期间借用。
* 输出参数:self——调用方提供的具体对象存储。
* 返回值:OK成功;ERROR参数、字段或时间非法,输出不变。
* 说明:NVA(2),不包含QDS;不分配内存,不执行业务。
*/
IEC60870_AsduResult_t IEC60870_MeasuredValueNormalizedWithoutQuality_Create(IEC60870_MeasuredValueNormalizedWithoutQuality_t *self,
uint32_t ioa, int16_t value);
/**
* 功能:解析Type 21(无品质归一化测量值)的独立值载荷。
* 输入参数:ioa——已解析地址;payload——不含IOA;length——载荷实际字节数。
* 输出参数:self——按值保存的独立对象,失败保持原值。
* 返回值:OK成功;ERROR地址、长度、字段或时间非法。
* 说明:长度必须恰好为2字节;不借用原报文。
*/
IEC60870_AsduResult_t IEC60870_MeasuredValueNormalizedWithoutQuality_Get_From_Buffer(IEC60870_MeasuredValueNormalizedWithoutQuality_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 51(32位比特串命令)。
* 输入参数:ioa——0..0xFFFFFF;其余参数见对应结构字段注释,时间和数据指针只在调用期间借用。
* 输出参数:self——调用方提供的具体对象存储。
* 返回值:OK成功;ERROR参数、字段或时间非法,输出不变。
* 说明:BSI(4),不包含QDS;不分配内存,不执行业务。
*/
IEC60870_AsduResult_t IEC60870_Bitstring32Command_Create(IEC60870_Bitstring32Command_t *self,
uint32_t ioa, uint32_t value);
/**
* 功能:解析Type 51(32位比特串命令)的独立值载荷。
* 输入参数:ioa——已解析地址;payload——不含IOA;length——载荷实际字节数。
* 输出参数:self——按值保存的独立对象,失败保持原值。
* 返回值:OK成功;ERROR地址、长度、字段或时间非法。
* 说明:长度必须恰好为4字节;不借用原报文。
*/
IEC60870_AsduResult_t IEC60870_Bitstring32Command_Get_From_Buffer(IEC60870_Bitstring32Command_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 64(带CP56比特串命令)。
* 输入参数:ioa——0..0xFFFFFF;其余参数见对应结构字段注释,时间和数据指针只在调用期间借用。
* 输出参数:self——调用方提供的具体对象存储。
* 返回值:OK成功;ERROR参数、字段或时间非法,输出不变。
* 说明:基础值(4) + CP56(7);不分配内存,不执行业务。
*/
IEC60870_AsduResult_t IEC60870_Bitstring32CommandWithCP56Time2a_Create(IEC60870_Bitstring32CommandWithCP56Time2a_t *self,
uint32_t ioa, uint32_t value, const IEC60870_CP56Time2a_t *time);
/**
* 功能:解析Type 64(带CP56比特串命令)的独立值载荷。
* 输入参数:ioa——已解析地址;payload——不含IOA;length——载荷实际字节数。
* 输出参数:self——按值保存的独立对象,失败保持原值。
* 返回值:OK成功;ERROR地址、长度、字段或时间非法。
* 说明:长度必须恰好为11字节;不借用原报文。
*/
IEC60870_AsduResult_t IEC60870_Bitstring32CommandWithCP56Time2a_Get_From_Buffer(IEC60870_Bitstring32CommandWithCP56Time2a_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 70(初始化结束)。
* 输入参数:ioa——0..0xFFFFFF;其余参数见对应结构字段注释,时间和数据指针只在调用期间借用。
* 输出参数:self——调用方提供的具体对象存储。
* 返回值:OK成功;ERROR参数、字段或时间非法,输出不变。
* 说明:COI(1),地址适用性由应用判断;不分配内存,不执行业务。
*/
IEC60870_AsduResult_t IEC60870_EndOfInitialization_Create(IEC60870_EndOfInitialization_t *self,
uint32_t ioa, int cause);
/**
* 功能:解析Type 70(初始化结束)的独立值载荷。
* 输入参数:ioa——已解析地址;payload——不含IOA;length——载荷实际字节数。
* 输出参数:self——按值保存的独立对象,失败保持原值。
* 返回值:OK成功;ERROR地址、长度、字段或时间非法。
* 说明:长度必须恰好为1字节;不借用原报文。
*/
IEC60870_AsduResult_t IEC60870_EndOfInitialization_Get_From_Buffer(IEC60870_EndOfInitialization_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 104(无时标测试命令)。
* 输入参数:ioa——0..0xFFFFFF;无附加值参数。
* 输出参数:self——调用方提供的具体对象存储。
* 返回值:OK成功;ERROR参数、字段或时间非法,输出不变。
* 说明:固定测试图样AA 55;不分配内存,不执行业务。
*/
IEC60870_AsduResult_t IEC60870_TestCommand_Create(IEC60870_TestCommand_t *self,
uint32_t ioa);
/**
* 功能:解析Type 104(无时标测试命令)的独立值载荷。
* 输入参数:ioa——已解析地址;payload——不含IOA;length——载荷实际字节数。
* 输出参数:self——按值保存的独立对象,失败保持原值。
* 返回值:OK成功;ERROR地址、长度、字段或时间非法。
* 说明:长度必须恰好为2字节;不借用原报文。
*/
IEC60870_AsduResult_t IEC60870_TestCommand_Get_From_Buffer(IEC60870_TestCommand_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 106(延时获得命令)。
* 输入参数:ioa——0..0xFFFFFF;其余参数见对应结构字段注释,时间和数据指针只在调用期间借用。
* 输出参数:self——调用方提供的具体对象存储。
* 返回值:OK成功;ERROR参数、字段或时间非法,输出不变。
* 说明:CP16(2);不分配内存,不执行业务。
*/
IEC60870_AsduResult_t IEC60870_DelayAcquisitionCommand_Create(IEC60870_DelayAcquisitionCommand_t *self,
uint32_t ioa, const IEC60870_CP16Time2a_t *delay);
/**
* 功能:解析Type 106(延时获得命令)的独立值载荷。
* 输入参数:ioa——已解析地址;payload——不含IOA;length——载荷实际字节数。
* 输出参数:self——按值保存的独立对象,失败保持原值。
* 返回值:OK成功;ERROR地址、长度、字段或时间非法。
* 说明:长度必须恰好为2字节;不借用原报文。
*/
IEC60870_AsduResult_t IEC60870_DelayAcquisitionCommand_Get_From_Buffer(IEC60870_DelayAcquisitionCommand_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 110(归一化测量值参数)。
* 输入参数:ioa——0..0xFFFFFF;其余参数见对应结构字段注释,时间和数据指针只在调用期间借用。
* 输出参数:self——调用方提供的具体对象存储。
* 返回值:OK成功;ERROR参数、字段或时间非法,输出不变。
* 说明:参数值(2) + QPM(1),QPM不是QDS;不分配内存,不执行业务。
*/
IEC60870_AsduResult_t IEC60870_ParameterNormalizedValue_Create(IEC60870_ParameterNormalizedValue_t *self,
uint32_t ioa, int16_t value, int qualifier);
/**
* 功能:解析Type 110(归一化测量值参数)的独立值载荷。
* 输入参数:ioa——已解析地址;payload——不含IOA;length——载荷实际字节数。
* 输出参数:self——按值保存的独立对象,失败保持原值。
* 返回值:OK成功;ERROR地址、长度、字段或时间非法。
* 说明:长度必须恰好为3字节;不借用原报文。
*/
IEC60870_AsduResult_t IEC60870_ParameterNormalizedValue_Get_From_Buffer(IEC60870_ParameterNormalizedValue_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 111(标度化测量值参数)。
* 输入参数:ioa——0..0xFFFFFF;其余参数见对应结构字段注释,时间和数据指针只在调用期间借用。
* 输出参数:self——调用方提供的具体对象存储。
* 返回值:OK成功;ERROR参数、字段或时间非法,输出不变。
* 说明:参数值(2) + QPM(1),QPM不是QDS;不分配内存,不执行业务。
*/
IEC60870_AsduResult_t IEC60870_ParameterScaledValue_Create(IEC60870_ParameterScaledValue_t *self,
uint32_t ioa, int16_t value, int qualifier);
/**
* 功能:解析Type 111(标度化测量值参数)的独立值载荷。
* 输入参数:ioa——已解析地址;payload——不含IOA;length——载荷实际字节数。
* 输出参数:self——按值保存的独立对象,失败保持原值。
* 返回值:OK成功;ERROR地址、长度、字段或时间非法。
* 说明:长度必须恰好为3字节;不借用原报文。
*/
IEC60870_AsduResult_t IEC60870_ParameterScaledValue_Get_From_Buffer(IEC60870_ParameterScaledValue_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 112(短浮点测量值参数)。
* 输入参数:ioa——0..0xFFFFFF;其余参数见对应结构字段注释,时间和数据指针只在调用期间借用。
* 输出参数:self——调用方提供的具体对象存储。
* 返回值:OK成功;ERROR参数、字段或时间非法,输出不变。
* 说明:参数值(4) + QPM(1),QPM不是QDS;不分配内存,不执行业务。
*/
IEC60870_AsduResult_t IEC60870_ParameterFloatValue_Create(IEC60870_ParameterFloatValue_t *self,
uint32_t ioa, float value, int qualifier);
/**
* 功能:解析Type 112(短浮点测量值参数)的独立值载荷。
* 输入参数:ioa——已解析地址;payload——不含IOA;length——载荷实际字节数。
* 输出参数:self——按值保存的独立对象,失败保持原值。
* 返回值:OK成功;ERROR地址、长度、字段或时间非法。
* 说明:长度必须恰好为5字节;不借用原报文。
*/
IEC60870_AsduResult_t IEC60870_ParameterFloatValue_Get_From_Buffer(IEC60870_ParameterFloatValue_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 113(参数激活)。
* 输入参数:ioa——0..0xFFFFFF;其余参数见对应结构字段注释,时间和数据指针只在调用期间借用。
* 输出参数:self——调用方提供的具体对象存储。
* 返回值:OK成功;ERROR参数、字段或时间非法,输出不变。
* 说明:QPA(1);不分配内存,不执行业务。
*/
IEC60870_AsduResult_t IEC60870_ParameterActivation_Create(IEC60870_ParameterActivation_t *self,
uint32_t ioa, int qualifier);
/**
* 功能:解析Type 113(参数激活)的独立值载荷。
* 输入参数:ioa——已解析地址;payload——不含IOA;length——载荷实际字节数。
* 输出参数:self——按值保存的独立对象,失败保持原值。
* 返回值:OK成功;ERROR地址、长度、字段或时间非法。
* 说明:长度必须恰好为1字节;不借用原报文。
*/
IEC60870_AsduResult_t IEC60870_ParameterActivation_Get_From_Buffer(IEC60870_ParameterActivation_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 120(文件准备就绪)。
* 输入参数:ioa——0..0xFFFFFF;其余参数见对应结构字段注释,时间和数据指针只在调用期间借用。
* 输出参数:self——调用方提供的具体对象存储。
* 返回值:OK成功;ERROR参数、字段或时间非法,输出不变。
* 说明:NOF(2) + LOF(3) + FRQ(1);不分配内存,不执行业务。
*/
IEC60870_AsduResult_t IEC60870_FileReady_Create(IEC60870_FileReady_t *self,
uint32_t ioa, uint16_t file_name, uint32_t file_length, int qualifier);
/**
* 功能:解析Type 120(文件准备就绪)的独立值载荷。
* 输入参数:ioa——已解析地址;payload——不含IOA;length——载荷实际字节数。
* 输出参数:self——按值保存的独立对象,失败保持原值。
* 返回值:OK成功;ERROR地址、长度、字段或时间非法。
* 说明:长度必须恰好为6字节;不借用原报文。
*/
IEC60870_AsduResult_t IEC60870_FileReady_Get_From_Buffer(IEC60870_FileReady_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 121(节准备就绪)。
* 输入参数:ioa——0..0xFFFFFF;其余参数见对应结构字段注释,时间和数据指针只在调用期间借用。
* 输出参数:self——调用方提供的具体对象存储。
* 返回值:OK成功;ERROR参数、字段或时间非法,输出不变。
* 说明:NOF(2) + NOS(1) + LOS(3) + SRQ(1);不分配内存,不执行业务。
*/
IEC60870_AsduResult_t IEC60870_SectionReady_Create(IEC60870_SectionReady_t *self,
uint32_t ioa, uint16_t file_name, int section, uint32_t section_length, int qualifier);
/**
* 功能:解析Type 121(节准备就绪)的独立值载荷。
* 输入参数:ioa——已解析地址;payload——不含IOA;length——载荷实际字节数。
* 输出参数:self——按值保存的独立对象,失败保持原值。
* 返回值:OK成功;ERROR地址、长度、字段或时间非法。
* 说明:长度必须恰好为7字节;不借用原报文。
*/
IEC60870_AsduResult_t IEC60870_SectionReady_Get_From_Buffer(IEC60870_SectionReady_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 122(文件/节召唤或选择)。
* 输入参数:ioa——0..0xFFFFFF;其余参数见对应结构字段注释,时间和数据指针只在调用期间借用。
* 输出参数:self——调用方提供的具体对象存储。
* 返回值:OK成功;ERROR参数、字段或时间非法,输出不变。
* 说明:NOF(2) + NOS(1) + SCQ(1);不分配内存,不执行业务。
*/
IEC60870_AsduResult_t IEC60870_FileCallOrSelect_Create(IEC60870_FileCallOrSelect_t *self,
uint32_t ioa, uint16_t file_name, int section, int qualifier);
/**
* 功能:解析Type 122(文件/节召唤或选择)的独立值载荷。
* 输入参数:ioa——已解析地址;payload——不含IOA;length——载荷实际字节数。
* 输出参数:self——按值保存的独立对象,失败保持原值。
* 返回值:OK成功;ERROR地址、长度、字段或时间非法。
* 说明:长度必须恰好为4字节;不借用原报文。
*/
IEC60870_AsduResult_t IEC60870_FileCallOrSelect_Get_From_Buffer(IEC60870_FileCallOrSelect_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 124(文件/节确认)。
* 输入参数:ioa——0..0xFFFFFF;其余参数见对应结构字段注释,时间和数据指针只在调用期间借用。
* 输出参数:self——调用方提供的具体对象存储。
* 返回值:OK成功;ERROR参数、字段或时间非法,输出不变。
* 说明:NOF(2) + NOS(1) + AFQ(1);不分配内存,不执行业务。
*/
IEC60870_AsduResult_t IEC60870_FileACK_Create(IEC60870_FileACK_t *self,
uint32_t ioa, uint16_t file_name, int section, int qualifier);
/**
* 功能:解析Type 124(文件/节确认)的独立值载荷。
* 输入参数:ioa——已解析地址;payload——不含IOA;length——载荷实际字节数。
* 输出参数:self——按值保存的独立对象,失败保持原值。
* 返回值:OK成功;ERROR地址、长度、字段或时间非法。
* 说明:长度必须恰好为4字节;不借用原报文。
*/
IEC60870_AsduResult_t IEC60870_FileACK_Get_From_Buffer(IEC60870_FileACK_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 123(最后文件段或节)。
* 输入参数:ioa——0..0xFFFFFF;其余参数见对应结构字段注释,时间和数据指针只在调用期间借用。
* 输出参数:self——调用方提供的具体对象存储。
* 返回值:OK成功;ERROR参数、字段或时间非法,输出不变。
* 说明:NOF(2) + NOS(1) + LSQ(1) + CHS(1),这里只传递校验和;不分配内存,不执行业务。
*/
IEC60870_AsduResult_t IEC60870_FileLastSegmentOrSection_Create(IEC60870_FileLastSegmentOrSection_t *self,
uint32_t ioa, uint16_t file_name, int section, int qualifier, int checksum);
/**
* 功能:解析Type 123(最后文件段或节)的独立值载荷。
* 输入参数:ioa——已解析地址;payload——不含IOA;length——载荷实际字节数。
* 输出参数:self——按值保存的独立对象,失败保持原值。
* 返回值:OK成功;ERROR地址、长度、字段或时间非法。
* 说明:长度必须恰好为5字节;不借用原报文。
*/
IEC60870_AsduResult_t IEC60870_FileLastSegmentOrSection_Get_From_Buffer(IEC60870_FileLastSegmentOrSection_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 125(文件段)。
* 输入参数:ioa——0..0xFFFFFF;其余参数见对应结构字段注释,时间和数据指针只在调用期间借用。
* 输出参数:self——调用方提供的具体对象存储。
* 返回值:OK成功;ERROR参数、字段或时间非法,输出不变。
* 说明:NOF(2) + NOS(1) + LOS(1) + 段数据(LOS),SQ=0且仅一个对象;不分配内存,不执行业务。
*/
IEC60870_AsduResult_t IEC60870_FileSegment_Create(IEC60870_FileSegment_t *self,
uint32_t ioa, uint16_t file_name, int section, const uint8_t *data, uint16_t data_length);
/**
* 功能:解析Type 125(文件段)的独立值载荷。
* 输入参数:ioa——已解析地址;payload——不含IOA;length——载荷实际字节数。
* 输出参数:self——按值保存的独立对象,失败保持原值。
* 返回值:OK成功;ERROR地址、长度、字段或时间非法。
* 说明:长度必须等于4+LOS,先校验长度再复制段数据;不借用原报文。
*/
IEC60870_AsduResult_t IEC60870_FileSegment_Get_From_Buffer(IEC60870_FileSegment_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 126(文件目录)。
* 输入参数:ioa——0..0xFFFFFF;其余参数见对应结构字段注释,时间和数据指针只在调用期间借用。
* 输出参数:self——调用方提供的具体对象存储。
* 返回值:OK成功;ERROR参数、字段或时间非法,输出不变。
* 说明:NOF(2) + LOF(3) + SOF(1) + CP56(7);不分配内存,不执行业务。
*/
IEC60870_AsduResult_t IEC60870_FileDirectory_Create(IEC60870_FileDirectory_t *self,
uint32_t ioa, uint16_t file_name, uint32_t file_length, int status, const IEC60870_CP56Time2a_t *creation_time);
/**
* 功能:解析Type 126(文件目录)的独立值载荷。
* 输入参数:ioa——已解析地址;payload——不含IOA;length——载荷实际字节数。
* 输出参数:self——按值保存的独立对象,失败保持原值。
* 返回值:OK成功;ERROR地址、长度、字段或时间非法。
* 说明:长度必须恰好为13字节;不借用原报文。
*/
IEC60870_AsduResult_t IEC60870_FileDirectory_Get_From_Buffer(IEC60870_FileDirectory_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 127(归档查询)。
* 输入参数:ioa——0..0xFFFFFF;其余参数见对应结构字段注释,时间和数据指针只在调用期间借用。
* 输出参数:self——调用方提供的具体对象存储。
* 返回值:OK成功;ERROR参数、字段或时间非法,输出不变。
* 说明:NOF(2) + 查询起始CP56(7) + 查询结束CP56(7);不分配内存,不执行业务。
*/
IEC60870_AsduResult_t IEC60870_QueryLog_Create(IEC60870_QueryLog_t *self,
uint32_t ioa, uint16_t file_name, const IEC60870_CP56Time2a_t *start_time, const IEC60870_CP56Time2a_t *stop_time);
/**
* 功能:解析Type 127(归档查询)的独立值载荷。
* 输入参数:ioa——已解析地址;payload——不含IOA;length——载荷实际字节数。
* 输出参数:self——按值保存的独立对象,失败保持原值。
* 返回值:OK成功;ERROR地址、长度、字段或时间非法。
* 说明:长度必须恰好为16字节;不借用原报文。
*/
IEC60870_AsduResult_t IEC60870_QueryLog_Get_From_Buffer(IEC60870_QueryLog_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:取得当前配置下一条ASDU能容纳的最大文件段数据长度。
* 输入参数:parameters——合法应用层参数,包含最大ASDU长度和字段宽度。
* 输出参数:无。
* 返回值:0..255为数据容量;-1表示参数非法或连空文件段也容纳不下。
* 说明:扣除公共头、IOA和4字节段头;104默认配置返回236。
*/
int IEC60870_FileSegment_Get_Max_Data_Size(const IEC60870_AppLayerParameters_t *parameters);
/**
* 功能:取得对象Type ID,并核对类型与函数表是否匹配。
* 输入参数:object——已构造/解析的基类指针,可为NULL。
* 输出参数:无。
* 返回值:合法身份的Type ID;NULL、未知类型或函数表不匹配返回0。
* 说明:不验证数值、品质、IOA和时标;实际编码入口负责这些检查。
*/
uint8_t IEC60870_InformationObject_Get_Type(const IEC60870_InformationObject_t *object);
/* 编码一个对象(可带IOA),不包含ASDU头。is_sequence=1表示省略本对象IOA,
* 仅供连续地址监视对象使用;SQ=1的首对象仍必须传0。ASDU入口负责连续性。
* 参数须非空;IOA按sizeOfIOA检查。FULL表示空间不足,所有失败保留buffer/length。
* buffer、length与对象不得重叠;length只在成功时写入实际字节数。 */
IEC60870_AsduResult_t IEC60870_InformationObject_Encode(
const IEC60870_InformationObject_t *object, const IEC60870_AppLayerParameters_t *parameters,
int is_sequence, uint8_t *buffer, uint16_t capacity, uint16_t *length);
/* 各类型Create都写入调用方提供的非空对象,ioa范围0..0xFFFFFF。
* 参数中的指针(BCR、CP56)必须非空,成功后按值复制,不借用这些输入。
* Get_From_Buffer只解码IOA之后的载荷,长度必须精确;ioa由ASDU层解析后传入。
* 读命令的载荷长度为0,可以传NULL;其他类型要求非空载荷。
* 所有失败均保留对象,调用方的输出对象不得与输入载荷重叠。
* 归一化值采用原始int16_t;QU/QL/QOI/RQT/QRP与COT/CA/IOA的业务适用性由应用判断。 */
/**
* 功能:构造Type 1:单点信息,线上值载荷1字节,不含IOA。
* 输入参数:ioa——信息对象地址,0..0xFFFFFF;编码时再按配置的IOA宽度检查上限。
* value——单点状态,0或1。
* quality——品质仅允许BL/SB/NT/IV(0xF0范围内的位),不得夹带状态或保留位。
* 输出参数:self——调用方提供的非空具体对象;成功后可直接传给ASDU添加入口。
* 返回值:OK表示构造成功,ERROR表示参数或字段非法;失败保留原对象,不分配内存。
*/
IEC60870_AsduResult_t IEC60870_SinglePointInformation_Create(IEC60870_SinglePointInformation_t *self,
uint32_t ioa, int value, int quality);
/**
* 功能:解析Type 1的1字节值载荷,IOA由调用方单独传入。
* 输入参数:ioa——已解析/还原的地址,0..0xFFFFFF。
* payload——不含IOA的载荷,必须非空。
* length——必须恰好为1。
* 输出参数:self——非空具体对象,成功后不借用输入;失败保持原值。
* 返回值:OK表示解析成功,ERROR表示参数、长度或字段非法。
*/
IEC60870_AsduResult_t IEC60870_SinglePointInformation_Get_From_Buffer(IEC60870_SinglePointInformation_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 3:双点信息,线上值载荷1字节,不含IOA。
* 输入参数:ioa——信息对象地址,0..0xFFFFFF;编码时再按配置的IOA宽度检查上限。
* value——双点状态,0..3,包含中间状态和不确定状态。
* quality——品质仅允许BL/SB/NT/IV(0xF0范围内的位),不得夹带状态或保留位。
* 输出参数:self——调用方提供的非空具体对象;成功后可直接传给ASDU添加入口。
* 返回值:OK表示构造成功,ERROR表示参数或字段非法;失败保留原对象,不分配内存。
*/
IEC60870_AsduResult_t IEC60870_DoublePointInformation_Create(IEC60870_DoublePointInformation_t *self,
uint32_t ioa, int value, int quality);
/**
* 功能:解析Type 3的1字节值载荷,IOA由调用方单独传入。
* 输入参数:ioa——已解析/还原的地址,0..0xFFFFFF。
* payload——不含IOA的载荷,必须非空。
* length——必须恰好为1。
* 输出参数:self——非空具体对象,成功后不借用输入;失败保持原值。
* 返回值:OK表示解析成功,ERROR表示参数、长度或字段非法。
*/
IEC60870_AsduResult_t IEC60870_DoublePointInformation_Get_From_Buffer(IEC60870_DoublePointInformation_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 9:归一化测量值(原始16位定点值),线上值载荷3字节,不含IOA。
* 输入参数:ioa——信息对象地址,0..0xFFFFFF;编码时再按配置的IOA宽度检查上限。
* value——归一化原始int16_t定点值,实际数值为value/32768.0。
* quality——QDS品质仅允许OV/BL/SB/NT/IV(0xF1范围内的位),bit1..3必须为0。
* 输出参数:self——调用方提供的非空具体对象;成功后可直接传给ASDU添加入口。
* 返回值:OK表示构造成功,ERROR表示参数或字段非法;失败保留原对象,不分配内存。
*/
IEC60870_AsduResult_t IEC60870_MeasuredValueNormalized_Create(IEC60870_MeasuredValueNormalized_t *self,
uint32_t ioa, int16_t value, int quality);
/**
* 功能:解析Type 9的3字节值载荷,IOA由调用方单独传入。
* 输入参数:ioa——已解析/还原的地址,0..0xFFFFFF。
* payload——不含IOA的载荷,必须非空。
* length——必须恰好为3。
* 输出参数:self——非空具体对象,成功后不借用输入;失败保持原值。
* 返回值:OK表示解析成功,ERROR表示参数、长度或字段非法。
*/
IEC60870_AsduResult_t IEC60870_MeasuredValueNormalized_Get_From_Buffer(IEC60870_MeasuredValueNormalized_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 11:标度化测量值,线上值载荷3字节,不含IOA。
* 输入参数:ioa——信息对象地址,0..0xFFFFFF;编码时再按配置的IOA宽度检查上限。
* value——有符号16位标度值,范围-32768..32767。
* quality——QDS品质仅允许OV/BL/SB/NT/IV(0xF1范围内的位),bit1..3必须为0。
* 输出参数:self——调用方提供的非空具体对象;成功后可直接传给ASDU添加入口。
* 返回值:OK表示构造成功,ERROR表示参数或字段非法;失败保留原对象,不分配内存。
*/
IEC60870_AsduResult_t IEC60870_MeasuredValueScaled_Create(IEC60870_MeasuredValueScaled_t *self,
uint32_t ioa, int16_t value, int quality);
/**
* 功能:解析Type 11的3字节值载荷,IOA由调用方单独传入。
* 输入参数:ioa——已解析/还原的地址,0..0xFFFFFF。
* payload——不含IOA的载荷,必须非空。
* length——必须恰好为3。
* 输出参数:self——非空具体对象,成功后不借用输入;失败保持原值。
* 返回值:OK表示解析成功,ERROR表示参数、长度或字段非法。
*/
IEC60870_AsduResult_t IEC60870_MeasuredValueScaled_Get_From_Buffer(IEC60870_MeasuredValueScaled_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 13:短浮点测量值,线上值载荷5字节,不含IOA。
* 输入参数:ioa——信息对象地址,0..0xFFFFFF;编码时再按配置的IOA宽度检查上限。
* value——短浮点值,采用IEEE 754 binary32,不进行NaN/Inf业务过滤。
* quality——QDS品质仅允许OV/BL/SB/NT/IV(0xF1范围内的位),bit1..3必须为0。
* 输出参数:self——调用方提供的非空具体对象;成功后可直接传给ASDU添加入口。
* 返回值:OK表示构造成功,ERROR表示参数或字段非法;失败保留原对象,不分配内存。
*/
IEC60870_AsduResult_t IEC60870_MeasuredValueShort_Create(IEC60870_MeasuredValueShort_t *self,
uint32_t ioa, float value, int quality);
/**
* 功能:解析Type 13的5字节值载荷,IOA由调用方单独传入。
* 输入参数:ioa——已解析/还原的地址,0..0xFFFFFF。
* payload——不含IOA的载荷,必须非空。
* length——必须恰好为5。
* 输出参数:self——非空具体对象,成功后不借用输入;失败保持原值。
* 返回值:OK表示解析成功,ERROR表示参数、长度或字段非法。
*/
IEC60870_AsduResult_t IEC60870_MeasuredValueShort_Get_From_Buffer(IEC60870_MeasuredValueShort_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 15:累计量,线上值载荷5字节,不含IOA。
* 输入参数:ioa——信息对象地址,0..0xFFFFFF;编码时再按配置的IOA宽度检查上限。
* value——非空BCR指针;计数为int32_t,序号0..31,CY/CA/IV均为0/1。
* 输出参数:self——调用方提供的非空具体对象;成功后可直接传给ASDU添加入口。
* 返回值:OK表示构造成功,ERROR表示参数或字段非法;失败保留原对象,不分配内存。
*/
IEC60870_AsduResult_t IEC60870_IntegratedTotals_Create(IEC60870_IntegratedTotals_t *self,
uint32_t ioa, const IEC60870_BinaryCounterReading_t *value);
/**
* 功能:解析Type 15的5字节值载荷,IOA由调用方单独传入。
* 输入参数:ioa——已解析/还原的地址,0..0xFFFFFF。
* payload——不含IOA的载荷,必须非空。
* length——必须恰好为5。
* 输出参数:self——非空具体对象,成功后不借用输入;失败保持原值。
* 返回值:OK表示解析成功,ERROR表示参数、长度或字段非法。
*/
IEC60870_AsduResult_t IEC60870_IntegratedTotals_Get_From_Buffer(IEC60870_IntegratedTotals_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 30:带时标单点信息,线上值载荷8字节,不含IOA。
* 输入参数:ioa——信息对象地址,0..0xFFFFFF;编码时再按配置的IOA宽度检查上限。
* value——单点状态,0或1。
* quality——品质仅允许BL/SB/NT/IV(0xF0范围内的位),不得夹带状态或保留位。
* time——非空CP56日历指针,采用2000..2099年约定;保留IV/SU,成功后按值复制。
* 输出参数:self——调用方提供的非空具体对象;成功后可直接传给ASDU添加入口。
* 返回值:OK表示构造成功,ERROR表示参数或字段非法;失败保留原对象,不分配内存。
*/
IEC60870_AsduResult_t IEC60870_SinglePointWithCP56Time2a_Create(IEC60870_SinglePointWithCP56Time2a_t *self,
uint32_t ioa, int value, int quality, const IEC60870_CP56Time2a_t *time);
/**
* 功能:解析Type 30的8字节值载荷,IOA由调用方单独传入。
* 输入参数:ioa——已解析/还原的地址,0..0xFFFFFF。
* payload——不含IOA的载荷,必须非空。
* length——必须恰好为8。
* 输出参数:self——非空具体对象,成功后不借用输入;失败保持原值。
* 返回值:OK表示解析成功,ERROR表示参数、长度或字段非法。
*/
IEC60870_AsduResult_t IEC60870_SinglePointWithCP56Time2a_Get_From_Buffer(IEC60870_SinglePointWithCP56Time2a_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 31:带时标双点信息,线上值载荷8字节,不含IOA。
* 输入参数:ioa——信息对象地址,0..0xFFFFFF;编码时再按配置的IOA宽度检查上限。
* value——双点状态,0..3,包含中间状态和不确定状态。
* quality——品质仅允许BL/SB/NT/IV(0xF0范围内的位),不得夹带状态或保留位。
* time——非空CP56日历指针,采用2000..2099年约定;保留IV/SU,成功后按值复制。
* 输出参数:self——调用方提供的非空具体对象;成功后可直接传给ASDU添加入口。
* 返回值:OK表示构造成功,ERROR表示参数或字段非法;失败保留原对象,不分配内存。
*/
IEC60870_AsduResult_t IEC60870_DoublePointWithCP56Time2a_Create(IEC60870_DoublePointWithCP56Time2a_t *self,
uint32_t ioa, int value, int quality, const IEC60870_CP56Time2a_t *time);
/**
* 功能:解析Type 31的8字节值载荷,IOA由调用方单独传入。
* 输入参数:ioa——已解析/还原的地址,0..0xFFFFFF。
* payload——不含IOA的载荷,必须非空。
* length——必须恰好为8。
* 输出参数:self——非空具体对象,成功后不借用输入;失败保持原值。
* 返回值:OK表示解析成功,ERROR表示参数、长度或字段非法。
*/
IEC60870_AsduResult_t IEC60870_DoublePointWithCP56Time2a_Get_From_Buffer(IEC60870_DoublePointWithCP56Time2a_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 34:带时标归一化测量值,线上值载荷10字节,不含IOA。
* 输入参数:ioa——信息对象地址,0..0xFFFFFF;编码时再按配置的IOA宽度检查上限。
* value——归一化原始int16_t定点值,实际数值为value/32768.0。
* quality——QDS品质仅允许OV/BL/SB/NT/IV(0xF1范围内的位),bit1..3必须为0。
* time——非空CP56日历指针,采用2000..2099年约定;保留IV/SU,成功后按值复制。
* 输出参数:self——调用方提供的非空具体对象;成功后可直接传给ASDU添加入口。
* 返回值:OK表示构造成功,ERROR表示参数或字段非法;失败保留原对象,不分配内存。
*/
IEC60870_AsduResult_t IEC60870_MeasuredValueNormalizedWithCP56Time2a_Create(IEC60870_MeasuredValueNormalizedWithCP56Time2a_t *self,
uint32_t ioa, int16_t value, int quality, const IEC60870_CP56Time2a_t *time);
/**
* 功能:解析Type 34的10字节值载荷,IOA由调用方单独传入。
* 输入参数:ioa——已解析/还原的地址,0..0xFFFFFF。
* payload——不含IOA的载荷,必须非空。
* length——必须恰好为10。
* 输出参数:self——非空具体对象,成功后不借用输入;失败保持原值。
* 返回值:OK表示解析成功,ERROR表示参数、长度或字段非法。
*/
IEC60870_AsduResult_t IEC60870_MeasuredValueNormalizedWithCP56Time2a_Get_From_Buffer(IEC60870_MeasuredValueNormalizedWithCP56Time2a_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 35:带时标标度化测量值,线上值载荷10字节,不含IOA。
* 输入参数:ioa——信息对象地址,0..0xFFFFFF;编码时再按配置的IOA宽度检查上限。
* value——有符号16位标度值,范围-32768..32767。
* quality——QDS品质仅允许OV/BL/SB/NT/IV(0xF1范围内的位),bit1..3必须为0。
* time——非空CP56日历指针,采用2000..2099年约定;保留IV/SU,成功后按值复制。
* 输出参数:self——调用方提供的非空具体对象;成功后可直接传给ASDU添加入口。
* 返回值:OK表示构造成功,ERROR表示参数或字段非法;失败保留原对象,不分配内存。
*/
IEC60870_AsduResult_t IEC60870_MeasuredValueScaledWithCP56Time2a_Create(IEC60870_MeasuredValueScaledWithCP56Time2a_t *self,
uint32_t ioa, int16_t value, int quality, const IEC60870_CP56Time2a_t *time);
/**
* 功能:解析Type 35的10字节值载荷,IOA由调用方单独传入。
* 输入参数:ioa——已解析/还原的地址,0..0xFFFFFF。
* payload——不含IOA的载荷,必须非空。
* length——必须恰好为10。
* 输出参数:self——非空具体对象,成功后不借用输入;失败保持原值。
* 返回值:OK表示解析成功,ERROR表示参数、长度或字段非法。
*/
IEC60870_AsduResult_t IEC60870_MeasuredValueScaledWithCP56Time2a_Get_From_Buffer(IEC60870_MeasuredValueScaledWithCP56Time2a_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 36:带时标短浮点测量值,线上值载荷12字节,不含IOA。
* 输入参数:ioa——信息对象地址,0..0xFFFFFF;编码时再按配置的IOA宽度检查上限。
* value——短浮点值,采用IEEE 754 binary32,不进行NaN/Inf业务过滤。
* quality——QDS品质仅允许OV/BL/SB/NT/IV(0xF1范围内的位),bit1..3必须为0。
* time——非空CP56日历指针,采用2000..2099年约定;保留IV/SU,成功后按值复制。
* 输出参数:self——调用方提供的非空具体对象;成功后可直接传给ASDU添加入口。
* 返回值:OK表示构造成功,ERROR表示参数或字段非法;失败保留原对象,不分配内存。
*/
IEC60870_AsduResult_t IEC60870_MeasuredValueShortWithCP56Time2a_Create(IEC60870_MeasuredValueShortWithCP56Time2a_t *self,
uint32_t ioa, float value, int quality, const IEC60870_CP56Time2a_t *time);
/**
* 功能:解析Type 36的12字节值载荷,IOA由调用方单独传入。
* 输入参数:ioa——已解析/还原的地址,0..0xFFFFFF。
* payload——不含IOA的载荷,必须非空。
* length——必须恰好为12。
* 输出参数:self——非空具体对象,成功后不借用输入;失败保持原值。
* 返回值:OK表示解析成功,ERROR表示参数、长度或字段非法。
*/
IEC60870_AsduResult_t IEC60870_MeasuredValueShortWithCP56Time2a_Get_From_Buffer(IEC60870_MeasuredValueShortWithCP56Time2a_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 37:带时标累计量,线上值载荷12字节,不含IOA。
* 输入参数:ioa——信息对象地址,0..0xFFFFFF;编码时再按配置的IOA宽度检查上限。
* value——非空BCR指针;计数为int32_t,序号0..31,CY/CA/IV均为0/1。
* time——非空CP56日历指针,采用2000..2099年约定;保留IV/SU,成功后按值复制。
* 输出参数:self——调用方提供的非空具体对象;成功后可直接传给ASDU添加入口。
* 返回值:OK表示构造成功,ERROR表示参数或字段非法;失败保留原对象,不分配内存。
*/
IEC60870_AsduResult_t IEC60870_IntegratedTotalsWithCP56Time2a_Create(IEC60870_IntegratedTotalsWithCP56Time2a_t *self,
uint32_t ioa, const IEC60870_BinaryCounterReading_t *value, const IEC60870_CP56Time2a_t *time);
/**
* 功能:解析Type 37的12字节值载荷,IOA由调用方单独传入。
* 输入参数:ioa——已解析/还原的地址,0..0xFFFFFF。
* payload——不含IOA的载荷,必须非空。
* length——必须恰好为12。
* 输出参数:self——非空具体对象,成功后不借用输入;失败保持原值。
* 返回值:OK表示解析成功,ERROR表示参数、长度或字段非法。
*/
IEC60870_AsduResult_t IEC60870_IntegratedTotalsWithCP56Time2a_Get_From_Buffer(IEC60870_IntegratedTotalsWithCP56Time2a_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 45:单命令,线上值载荷1字节,不含IOA。
* 输入参数:ioa——信息对象地址,0..0xFFFFFF;编码时再按配置的IOA宽度检查上限。
* state——单命令状态,0或1;SCO保留位由编码器保持为0。
* is_select——选择/执行标志S/E,1为选择、0为执行;本函数不执行命令。
* qualifier——命令限定词QU,0..31;具体业务含义由应用判断。
* 输出参数:self——调用方提供的非空具体对象;成功后可直接传给ASDU添加入口。
* 返回值:OK表示构造成功,ERROR表示参数或字段非法;失败保留原对象,不分配内存。
*/
IEC60870_AsduResult_t IEC60870_SingleCommand_Create(IEC60870_SingleCommand_t *self,
uint32_t ioa, int state, int is_select, int qualifier);
/**
* 功能:解析Type 45的1字节值载荷,IOA由调用方单独传入。
* 输入参数:ioa——已解析/还原的地址,0..0xFFFFFF。
* payload——不含IOA的载荷,必须非空。
* length——必须恰好为1。
* 输出参数:self——非空具体对象,成功后不借用输入;失败保持原值。
* 返回值:OK表示解析成功,ERROR表示参数、长度或字段非法。
*/
IEC60870_AsduResult_t IEC60870_SingleCommand_Get_From_Buffer(IEC60870_SingleCommand_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 46:双命令,线上值载荷1字节,不含IOA。
* 输入参数:ioa——信息对象地址,0..0xFFFFFF;编码时再按配置的IOA宽度检查上限。
* state——双命令/步调节状态,仅允许1或2。
* is_select——选择/执行标志S/E,1为选择、0为执行;本函数不执行命令。
* qualifier——命令限定词QU,0..31;具体业务含义由应用判断。
* 输出参数:self——调用方提供的非空具体对象;成功后可直接传给ASDU添加入口。
* 返回值:OK表示构造成功,ERROR表示参数或字段非法;失败保留原对象,不分配内存。
*/
IEC60870_AsduResult_t IEC60870_DoubleCommand_Create(IEC60870_DoubleCommand_t *self,
uint32_t ioa, int state, int is_select, int qualifier);
/**
* 功能:解析Type 46的1字节值载荷,IOA由调用方单独传入。
* 输入参数:ioa——已解析/还原的地址,0..0xFFFFFF。
* payload——不含IOA的载荷,必须非空。
* length——必须恰好为1。
* 输出参数:self——非空具体对象,成功后不借用输入;失败保持原值。
* 返回值:OK表示解析成功,ERROR表示参数、长度或字段非法。
*/
IEC60870_AsduResult_t IEC60870_DoubleCommand_Get_From_Buffer(IEC60870_DoubleCommand_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 47:步调节命令,线上值载荷1字节,不含IOA。
* 输入参数:ioa——信息对象地址,0..0xFFFFFF;编码时再按配置的IOA宽度检查上限。
* state——双命令/步调节状态,仅允许1或2。
* is_select——选择/执行标志S/E,1为选择、0为执行;本函数不执行命令。
* qualifier——命令限定词QU,0..31;具体业务含义由应用判断。
* 输出参数:self——调用方提供的非空具体对象;成功后可直接传给ASDU添加入口。
* 返回值:OK表示构造成功,ERROR表示参数或字段非法;失败保留原对象,不分配内存。
*/
IEC60870_AsduResult_t IEC60870_StepCommand_Create(IEC60870_StepCommand_t *self,
uint32_t ioa, int state, int is_select, int qualifier);
/**
* 功能:解析Type 47的1字节值载荷,IOA由调用方单独传入。
* 输入参数:ioa——已解析/还原的地址,0..0xFFFFFF。
* payload——不含IOA的载荷,必须非空。
* length——必须恰好为1。
* 输出参数:self——非空具体对象,成功后不借用输入;失败保持原值。
* 返回值:OK表示解析成功,ERROR表示参数、长度或字段非法。
*/
IEC60870_AsduResult_t IEC60870_StepCommand_Get_From_Buffer(IEC60870_StepCommand_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 48:归一化设定值命令(原始16位定点值),线上值载荷3字节,不含IOA。
* 输入参数:ioa——信息对象地址,0..0xFFFFFF;编码时再按配置的IOA宽度检查上限。
* value——归一化原始int16_t定点值,实际数值为value/32768.0。
* is_select——选择/执行标志S/E,1为选择、0为执行;本函数不执行命令。
* qualifier——设定值限定词QL,0..127;编码到QOS低7位。
* 输出参数:self——调用方提供的非空具体对象;成功后可直接传给ASDU添加入口。
* 返回值:OK表示构造成功,ERROR表示参数或字段非法;失败保留原对象,不分配内存。
*/
IEC60870_AsduResult_t IEC60870_SetpointCommandNormalized_Create(IEC60870_SetpointCommandNormalized_t *self,
uint32_t ioa, int16_t value, int is_select, int qualifier);
/**
* 功能:解析Type 48的3字节值载荷,IOA由调用方单独传入。
* 输入参数:ioa——已解析/还原的地址,0..0xFFFFFF。
* payload——不含IOA的载荷,必须非空。
* length——必须恰好为3。
* 输出参数:self——非空具体对象,成功后不借用输入;失败保持原值。
* 返回值:OK表示解析成功,ERROR表示参数、长度或字段非法。
*/
IEC60870_AsduResult_t IEC60870_SetpointCommandNormalized_Get_From_Buffer(IEC60870_SetpointCommandNormalized_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 49:标度化设定值命令,线上值载荷3字节,不含IOA。
* 输入参数:ioa——信息对象地址,0..0xFFFFFF;编码时再按配置的IOA宽度检查上限。
* value——有符号16位标度值,范围-32768..32767。
* is_select——选择/执行标志S/E,1为选择、0为执行;本函数不执行命令。
* qualifier——设定值限定词QL,0..127;编码到QOS低7位。
* 输出参数:self——调用方提供的非空具体对象;成功后可直接传给ASDU添加入口。
* 返回值:OK表示构造成功,ERROR表示参数或字段非法;失败保留原对象,不分配内存。
*/
IEC60870_AsduResult_t IEC60870_SetpointCommandScaled_Create(IEC60870_SetpointCommandScaled_t *self,
uint32_t ioa, int16_t value, int is_select, int qualifier);
/**
* 功能:解析Type 49的3字节值载荷,IOA由调用方单独传入。
* 输入参数:ioa——已解析/还原的地址,0..0xFFFFFF。
* payload——不含IOA的载荷,必须非空。
* length——必须恰好为3。
* 输出参数:self——非空具体对象,成功后不借用输入;失败保持原值。
* 返回值:OK表示解析成功,ERROR表示参数、长度或字段非法。
*/
IEC60870_AsduResult_t IEC60870_SetpointCommandScaled_Get_From_Buffer(IEC60870_SetpointCommandScaled_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 50:短浮点设定值命令,线上值载荷5字节,不含IOA。
* 输入参数:ioa——信息对象地址,0..0xFFFFFF;编码时再按配置的IOA宽度检查上限。
* value——短浮点值,采用IEEE 754 binary32,不进行NaN/Inf业务过滤。
* is_select——选择/执行标志S/E,1为选择、0为执行;本函数不执行命令。
* qualifier——设定值限定词QL,0..127;编码到QOS低7位。
* 输出参数:self——调用方提供的非空具体对象;成功后可直接传给ASDU添加入口。
* 返回值:OK表示构造成功,ERROR表示参数或字段非法;失败保留原对象,不分配内存。
*/
IEC60870_AsduResult_t IEC60870_SetpointCommandShort_Create(IEC60870_SetpointCommandShort_t *self,
uint32_t ioa, float value, int is_select, int qualifier);
/**
* 功能:解析Type 50的5字节值载荷,IOA由调用方单独传入。
* 输入参数:ioa——已解析/还原的地址,0..0xFFFFFF。
* payload——不含IOA的载荷,必须非空。
* length——必须恰好为5。
* 输出参数:self——非空具体对象,成功后不借用输入;失败保持原值。
* 返回值:OK表示解析成功,ERROR表示参数、长度或字段非法。
*/
IEC60870_AsduResult_t IEC60870_SetpointCommandShort_Get_From_Buffer(IEC60870_SetpointCommandShort_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 58:带时标单命令,线上值载荷8字节,不含IOA。
* 输入参数:ioa——信息对象地址,0..0xFFFFFF;编码时再按配置的IOA宽度检查上限。
* state——单命令状态,0或1;SCO保留位由编码器保持为0。
* is_select——选择/执行标志S/E,1为选择、0为执行;本函数不执行命令。
* qualifier——命令限定词QU,0..31;具体业务含义由应用判断。
* time——非空CP56日历指针,采用2000..2099年约定;保留IV/SU,成功后按值复制。
* 输出参数:self——调用方提供的非空具体对象;成功后可直接传给ASDU添加入口。
* 返回值:OK表示构造成功,ERROR表示参数或字段非法;失败保留原对象,不分配内存。
*/
IEC60870_AsduResult_t IEC60870_SingleCommandWithCP56Time2a_Create(IEC60870_SingleCommandWithCP56Time2a_t *self,
uint32_t ioa, int state, int is_select, int qualifier, const IEC60870_CP56Time2a_t *time);
/**
* 功能:解析Type 58的8字节值载荷,IOA由调用方单独传入。
* 输入参数:ioa——已解析/还原的地址,0..0xFFFFFF。
* payload——不含IOA的载荷,必须非空。
* length——必须恰好为8。
* 输出参数:self——非空具体对象,成功后不借用输入;失败保持原值。
* 返回值:OK表示解析成功,ERROR表示参数、长度或字段非法。
*/
IEC60870_AsduResult_t IEC60870_SingleCommandWithCP56Time2a_Get_From_Buffer(IEC60870_SingleCommandWithCP56Time2a_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 59:带时标双命令,线上值载荷8字节,不含IOA。
* 输入参数:ioa——信息对象地址,0..0xFFFFFF;编码时再按配置的IOA宽度检查上限。
* state——双命令/步调节状态,仅允许1或2。
* is_select——选择/执行标志S/E,1为选择、0为执行;本函数不执行命令。
* qualifier——命令限定词QU,0..31;具体业务含义由应用判断。
* time——非空CP56日历指针,采用2000..2099年约定;保留IV/SU,成功后按值复制。
* 输出参数:self——调用方提供的非空具体对象;成功后可直接传给ASDU添加入口。
* 返回值:OK表示构造成功,ERROR表示参数或字段非法;失败保留原对象,不分配内存。
*/
IEC60870_AsduResult_t IEC60870_DoubleCommandWithCP56Time2a_Create(IEC60870_DoubleCommandWithCP56Time2a_t *self,
uint32_t ioa, int state, int is_select, int qualifier, const IEC60870_CP56Time2a_t *time);
/**
* 功能:解析Type 59的8字节值载荷,IOA由调用方单独传入。
* 输入参数:ioa——已解析/还原的地址,0..0xFFFFFF。
* payload——不含IOA的载荷,必须非空。
* length——必须恰好为8。
* 输出参数:self——非空具体对象,成功后不借用输入;失败保持原值。
* 返回值:OK表示解析成功,ERROR表示参数、长度或字段非法。
*/
IEC60870_AsduResult_t IEC60870_DoubleCommandWithCP56Time2a_Get_From_Buffer(IEC60870_DoubleCommandWithCP56Time2a_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 60:带时标步调节命令,线上值载荷8字节,不含IOA。
* 输入参数:ioa——信息对象地址,0..0xFFFFFF;编码时再按配置的IOA宽度检查上限。
* state——双命令/步调节状态,仅允许1或2。
* is_select——选择/执行标志S/E,1为选择、0为执行;本函数不执行命令。
* qualifier——命令限定词QU,0..31;具体业务含义由应用判断。
* time——非空CP56日历指针,采用2000..2099年约定;保留IV/SU,成功后按值复制。
* 输出参数:self——调用方提供的非空具体对象;成功后可直接传给ASDU添加入口。
* 返回值:OK表示构造成功,ERROR表示参数或字段非法;失败保留原对象,不分配内存。
*/
IEC60870_AsduResult_t IEC60870_StepCommandWithCP56Time2a_Create(IEC60870_StepCommandWithCP56Time2a_t *self,
uint32_t ioa, int state, int is_select, int qualifier, const IEC60870_CP56Time2a_t *time);
/**
* 功能:解析Type 60的8字节值载荷,IOA由调用方单独传入。
* 输入参数:ioa——已解析/还原的地址,0..0xFFFFFF。
* payload——不含IOA的载荷,必须非空。
* length——必须恰好为8。
* 输出参数:self——非空具体对象,成功后不借用输入;失败保持原值。
* 返回值:OK表示解析成功,ERROR表示参数、长度或字段非法。
*/
IEC60870_AsduResult_t IEC60870_StepCommandWithCP56Time2a_Get_From_Buffer(IEC60870_StepCommandWithCP56Time2a_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 61:带时标归一化设定值命令,线上值载荷10字节,不含IOA。
* 输入参数:ioa——信息对象地址,0..0xFFFFFF;编码时再按配置的IOA宽度检查上限。
* value——归一化原始int16_t定点值,实际数值为value/32768.0。
* is_select——选择/执行标志S/E,1为选择、0为执行;本函数不执行命令。
* qualifier——设定值限定词QL,0..127;编码到QOS低7位。
* time——非空CP56日历指针,采用2000..2099年约定;保留IV/SU,成功后按值复制。
* 输出参数:self——调用方提供的非空具体对象;成功后可直接传给ASDU添加入口。
* 返回值:OK表示构造成功,ERROR表示参数或字段非法;失败保留原对象,不分配内存。
*/
IEC60870_AsduResult_t IEC60870_SetpointCommandNormalizedWithCP56Time2a_Create(IEC60870_SetpointCommandNormalizedWithCP56Time2a_t *self,
uint32_t ioa, int16_t value, int is_select, int qualifier, const IEC60870_CP56Time2a_t *time);
/**
* 功能:解析Type 61的10字节值载荷,IOA由调用方单独传入。
* 输入参数:ioa——已解析/还原的地址,0..0xFFFFFF。
* payload——不含IOA的载荷,必须非空。
* length——必须恰好为10。
* 输出参数:self——非空具体对象,成功后不借用输入;失败保持原值。
* 返回值:OK表示解析成功,ERROR表示参数、长度或字段非法。
*/
IEC60870_AsduResult_t IEC60870_SetpointCommandNormalizedWithCP56Time2a_Get_From_Buffer(IEC60870_SetpointCommandNormalizedWithCP56Time2a_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 62:带时标标度化设定值命令,线上值载荷10字节,不含IOA。
* 输入参数:ioa——信息对象地址,0..0xFFFFFF;编码时再按配置的IOA宽度检查上限。
* value——有符号16位标度值,范围-32768..32767。
* is_select——选择/执行标志S/E,1为选择、0为执行;本函数不执行命令。
* qualifier——设定值限定词QL,0..127;编码到QOS低7位。
* time——非空CP56日历指针,采用2000..2099年约定;保留IV/SU,成功后按值复制。
* 输出参数:self——调用方提供的非空具体对象;成功后可直接传给ASDU添加入口。
* 返回值:OK表示构造成功,ERROR表示参数或字段非法;失败保留原对象,不分配内存。
*/
IEC60870_AsduResult_t IEC60870_SetpointCommandScaledWithCP56Time2a_Create(IEC60870_SetpointCommandScaledWithCP56Time2a_t *self,
uint32_t ioa, int16_t value, int is_select, int qualifier, const IEC60870_CP56Time2a_t *time);
/**
* 功能:解析Type 62的10字节值载荷,IOA由调用方单独传入。
* 输入参数:ioa——已解析/还原的地址,0..0xFFFFFF。
* payload——不含IOA的载荷,必须非空。
* length——必须恰好为10。
* 输出参数:self——非空具体对象,成功后不借用输入;失败保持原值。
* 返回值:OK表示解析成功,ERROR表示参数、长度或字段非法。
*/
IEC60870_AsduResult_t IEC60870_SetpointCommandScaledWithCP56Time2a_Get_From_Buffer(IEC60870_SetpointCommandScaledWithCP56Time2a_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 63:带时标短浮点设定值命令,线上值载荷12字节,不含IOA。
* 输入参数:ioa——信息对象地址,0..0xFFFFFF;编码时再按配置的IOA宽度检查上限。
* value——短浮点值,采用IEEE 754 binary32,不进行NaN/Inf业务过滤。
* is_select——选择/执行标志S/E,1为选择、0为执行;本函数不执行命令。
* qualifier——设定值限定词QL,0..127;编码到QOS低7位。
* time——非空CP56日历指针,采用2000..2099年约定;保留IV/SU,成功后按值复制。
* 输出参数:self——调用方提供的非空具体对象;成功后可直接传给ASDU添加入口。
* 返回值:OK表示构造成功,ERROR表示参数或字段非法;失败保留原对象,不分配内存。
*/
IEC60870_AsduResult_t IEC60870_SetpointCommandShortWithCP56Time2a_Create(IEC60870_SetpointCommandShortWithCP56Time2a_t *self,
uint32_t ioa, float value, int is_select, int qualifier, const IEC60870_CP56Time2a_t *time);
/**
* 功能:解析Type 63的12字节值载荷,IOA由调用方单独传入。
* 输入参数:ioa——已解析/还原的地址,0..0xFFFFFF。
* payload——不含IOA的载荷,必须非空。
* length——必须恰好为12。
* 输出参数:self——非空具体对象,成功后不借用输入;失败保持原值。
* 返回值:OK表示解析成功,ERROR表示参数、长度或字段非法。
*/
IEC60870_AsduResult_t IEC60870_SetpointCommandShortWithCP56Time2a_Get_From_Buffer(IEC60870_SetpointCommandShortWithCP56Time2a_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 100:总召唤命令,线上值载荷1字节,不含IOA。
* 输入参数:ioa——信息对象地址,0..0xFFFFFF;编码时再按配置的IOA宽度检查上限。
* qualifier——总召唤限定词QOI,0..255;本层保留全部编码值。
* 输出参数:self——调用方提供的非空具体对象;成功后可直接传给ASDU添加入口。
* 返回值:OK表示构造成功,ERROR表示参数或字段非法;失败保留原对象,不分配内存。
*/
IEC60870_AsduResult_t IEC60870_InterrogationCommand_Create(IEC60870_InterrogationCommand_t *self,
uint32_t ioa, int qualifier);
/**
* 功能:解析Type 100的1字节值载荷,IOA由调用方单独传入。
* 输入参数:ioa——已解析/还原的地址,0..0xFFFFFF。
* payload——不含IOA的载荷,必须非空。
* length——必须恰好为1。
* 输出参数:self——非空具体对象,成功后不借用输入;失败保持原值。
* 返回值:OK表示解析成功,ERROR表示参数、长度或字段非法。
*/
IEC60870_AsduResult_t IEC60870_InterrogationCommand_Get_From_Buffer(IEC60870_InterrogationCommand_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 101:电能脉冲召唤命令,线上值载荷1字节,不含IOA。
* 输入参数:ioa——信息对象地址,0..0xFFFFFF;编码时再按配置的IOA宽度检查上限。
* qualifier——电能脉冲请求限定词RQT,0..63。
* freeze——冻结限定词FR,0..3,编码到QCC高2位。
* 输出参数:self——调用方提供的非空具体对象;成功后可直接传给ASDU添加入口。
* 返回值:OK表示构造成功,ERROR表示参数或字段非法;失败保留原对象,不分配内存。
*/
IEC60870_AsduResult_t IEC60870_CounterInterrogationCommand_Create(IEC60870_CounterInterrogationCommand_t *self,
uint32_t ioa, int qualifier, int freeze);
/**
* 功能:解析Type 101的1字节值载荷,IOA由调用方单独传入。
* 输入参数:ioa——已解析/还原的地址,0..0xFFFFFF。
* payload——不含IOA的载荷,必须非空。
* length——必须恰好为1。
* 输出参数:self——非空具体对象,成功后不借用输入;失败保持原值。
* 返回值:OK表示解析成功,ERROR表示参数、长度或字段非法。
*/
IEC60870_AsduResult_t IEC60870_CounterInterrogationCommand_Get_From_Buffer(IEC60870_CounterInterrogationCommand_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 102:读命令,线上值载荷0字节,不含IOA。
* 输入参数:ioa——信息对象地址,0..0xFFFFFF;编码时再按配置的IOA宽度检查上限。
* 输出参数:self——调用方提供的非空具体对象;成功后可直接传给ASDU添加入口。
* 返回值:OK表示构造成功,ERROR表示参数或字段非法;失败保留原对象,不分配内存。
*/
IEC60870_AsduResult_t IEC60870_ReadCommand_Create(IEC60870_ReadCommand_t *self,
uint32_t ioa);
/**
* 功能:解析Type 102的0字节值载荷,IOA由调用方单独传入。
* 输入参数:ioa——已解析/还原的地址,0..0xFFFFFF。
* payload——不含IOA的载荷,本类型允许NULL。
* length——必须恰好为0。
* 输出参数:self——非空具体对象,成功后不借用输入;失败保持原值。
* 返回值:OK表示解析成功,ERROR表示参数、长度或字段非法。
*/
IEC60870_AsduResult_t IEC60870_ReadCommand_Get_From_Buffer(IEC60870_ReadCommand_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 103:时钟同步命令,线上值载荷7字节,不含IOA。
* 输入参数:ioa——信息对象地址,0..0xFFFFFF;编码时再按配置的IOA宽度检查上限。
* time——非空CP56日历指针,采用2000..2099年约定;保留IV/SU,成功后按值复制。
* 输出参数:self——调用方提供的非空具体对象;成功后可直接传给ASDU添加入口。
* 返回值:OK表示构造成功,ERROR表示参数或字段非法;失败保留原对象,不分配内存。
*/
IEC60870_AsduResult_t IEC60870_ClockSynchronizationCommand_Create(IEC60870_ClockSynchronizationCommand_t *self,
uint32_t ioa, const IEC60870_CP56Time2a_t *time);
/**
* 功能:解析Type 103的7字节值载荷,IOA由调用方单独传入。
* 输入参数:ioa——已解析/还原的地址,0..0xFFFFFF。
* payload——不含IOA的载荷,必须非空。
* length——必须恰好为7。
* 输出参数:self——非空具体对象,成功后不借用输入;失败保持原值。
* 返回值:OK表示解析成功,ERROR表示参数、长度或字段非法。
*/
IEC60870_AsduResult_t IEC60870_ClockSynchronizationCommand_Get_From_Buffer(IEC60870_ClockSynchronizationCommand_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 105:复位进程命令,线上值载荷1字节,不含IOA。
* 输入参数:ioa——信息对象地址,0..0xFFFFFF;编码时再按配置的IOA宽度检查上限。
* qualifier——复位进程限定词QRP,0..255;本层不执行复位。
* 输出参数:self——调用方提供的非空具体对象;成功后可直接传给ASDU添加入口。
* 返回值:OK表示构造成功,ERROR表示参数或字段非法;失败保留原对象,不分配内存。
*/
IEC60870_AsduResult_t IEC60870_ResetProcessCommand_Create(IEC60870_ResetProcessCommand_t *self,
uint32_t ioa, int qualifier);
/**
* 功能:解析Type 105的1字节值载荷,IOA由调用方单独传入。
* 输入参数:ioa——已解析/还原的地址,0..0xFFFFFF。
* payload——不含IOA的载荷,必须非空。
* length——必须恰好为1。
* 输出参数:self——非空具体对象,成功后不借用输入;失败保持原值。
* 返回值:OK表示解析成功,ERROR表示参数、长度或字段非法。
*/
IEC60870_AsduResult_t IEC60870_ResetProcessCommand_Get_From_Buffer(IEC60870_ResetProcessCommand_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
/**
* 功能:构造Type 107:带时标测试命令,线上值载荷9字节,不含IOA。
* 输入参数:ioa——信息对象地址,0..0xFFFFFF;编码时再按配置的IOA宽度检查上限。
* sequence——16位测试序号,0..65535,与APCI的N(S)/N(R)无关。
* time——非空CP56日历指针,采用2000..2099年约定;保留IV/SU,成功后按值复制。
* 输出参数:self——调用方提供的非空具体对象;成功后可直接传给ASDU添加入口。
* 返回值:OK表示构造成功,ERROR表示参数或字段非法;失败保留原对象,不分配内存。
*/
IEC60870_AsduResult_t IEC60870_TestCommandWithCP56Time2a_Create(IEC60870_TestCommandWithCP56Time2a_t *self,
uint32_t ioa, uint16_t sequence, const IEC60870_CP56Time2a_t *time);
/**
* 功能:解析Type 107的9字节值载荷,IOA由调用方单独传入。
* 输入参数:ioa——已解析/还原的地址,0..0xFFFFFF。
* payload——不含IOA的载荷,必须非空。
* length——必须恰好为9。
* 输出参数:self——非空具体对象,成功后不借用输入;失败保持原值。
* 返回值:OK表示解析成功,ERROR表示参数、长度或字段非法。
*/
IEC60870_AsduResult_t IEC60870_TestCommandWithCP56Time2a_Get_From_Buffer(IEC60870_TestCommandWithCP56Time2a_t *self,
uint32_t ioa, const uint8_t *payload, uint16_t length);
#ifdef __cplusplus
}
#endif
#endif /* IEC60870_INFORMATION_OBJECTS_H */