Files
STM32F4-Base/IEC60870-Slave/common/IEC60870_Codec.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

55 lines
2.6 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共用的ASDU公共头解析与参数检查,不包含传输帧接口。 */
#ifndef IEC60870_CODEC_H
#define IEC60870_CODEC_H
#include "IEC60870_Types.h"
#ifdef __cplusplus
extern "C" {
#endif
/* ASDU公共头的解析结果;本模块不解析具体信息对象,调用方按type_id另行处理。 */
typedef struct {
uint8_t type_id; /* 类型标识 */
uint8_t object_count; /* VSQ中的信息对象数量 */
uint8_t is_sequence; /* VSQ中的SQ标志 */
uint8_t cause_of_transmission; /* 传送原因,不含标志位 */
uint8_t is_negative_confirm; /* 传送原因中的P/N标志 */
uint8_t is_test; /* 传送原因中的TEST标志 */
uint8_t originator_address; /* 源发地址 */
uint16_t common_address; /* ASDU公共地址 */
const uint8_t *information_objects; /* 信息对象区首地址 */
uint16_t information_objects_len; /* 信息对象区长度 */
const IEC60870_AppLayerParameters_t *parameters; /* 借用本次解析参数,不可修改。 */
} IEC60870_AsduInfo_t;
/**
* 功能:校验应用层字段宽度、默认源发地址及ASDU总长上限。
* 输入参数:parameters——待检查参数,允许NULL。
* 输出参数:无。
* 返回值:合法返回1,NULL或非法值返回0。
* 说明:不修改参数,不替调用方选择101/104的传输配置。
*/
extern int IEC60870_AppLayerParameters_Valid(const IEC60870_AppLayerParameters_t *parameters);
/**
* 功能:检查ASDU公共头及已知固定长度对象的最低载荷长度,解析公共头。
* 输入参数:parameters——非空应用层参数;asdu——ASDU首地址;asdu_len——总长度。
* 输出参数:asdu_info——解析成功时写入公共头字段和信息对象区位置。
* 返回值:解析成功返回1,参数或长度非法返回0且不修改asdu_info。
* 说明:头长为2+sizeOfCOT+sizeOfCA,IOA及最低载荷长度按sizeOfIOA计算。
* 未知/变长类型及零对象不做载荷检查;不检查多余尾字节、SQ/数量的类型约束、
* 传送原因、地址或信息对象内容是否合法。接收器在链路受理前调用本函数。
* information_objects及parameters均为借用,取对象期间报文和参数必须有效且不变。
*/
extern int IEC60870_Parse_ASDU_Header(const IEC60870_AppLayerParameters_t *parameters,
const uint8_t *asdu,
uint16_t asdu_len,
IEC60870_AsduInfo_t *asdu_info);
#ifdef __cplusplus
}
#endif
#endif /* IEC60870_CODEC_H */