Files
STM32F4-Base/IEC60870-Slave/104/business/IEC104_GeneralInterrogation.c
T
STF 7596f3371a
CI / L0 静态门禁 (pre-commit) (push) Failing after 44s
CI / L0.5 主机侧单测 (MSVC) (push) Failing after 42s
补充总召唤的广播地址,电度召唤+时钟同步业务的实现
2026-10-29 03:20:19 -07:00

55 lines
2.4 KiB
C

/*
* 104总召种类规则:C_IC_NA_1、QOI=20..36、无时标监视数据及主站撤销。
* 原IEC104_Interrogation_Create入口在此保留;调度、生命周期及发送由共用引擎维护。
*/
#include "IEC104_GeneralInterrogation.h"
#include "IEC104_Interrogation_Internal.h"
/* 解析首对象的IOA和QOI;总召没有FRZ,统一输出0供共用请求结构使用。 */
static bool General_Decode(const IEC60870_AsduInfo_t *info, uint32_t *ioa, uint8_t *qualifier, uint8_t *freeze)
{
IEC60870_InterrogationCommand_t command;
if (IEC60870_Asdu_Get_Element(info, 0U, &command, sizeof(command)) != IEC60870_ASDU_OK) { return false; }
*ioa = command.object.ioa;
*qualifier = command.qualifier;
*freeze = 0U;
return true;
}
/* QOI=20为站总召,21..36为16个分组;数据COT与合法QOI相同。 */
static bool General_Qualifier_Valid(uint8_t qualifier) { return qualifier >= 20U && qualifier <= 36U; }
static uint8_t General_Data_Cause(uint8_t qualifier) { return qualifier; }
/* 总召总是进入数据阶段;空点表也由应用Complete_Data结束,再发送ACT_TERM。 */
static bool General_Has_Data(uint8_t freeze) { (void)freeze; return true; }
/* 保持原总召的9种无时标监视类型,SQ=0/1由ASDU层校验;累计量由计数量实例处理。 */
static bool General_Data_Allowed(const IEC60870_AsduInfo_t *info, uint8_t freeze)
{
(void)freeze;
switch (info->type_id) {
case IEC60870_ASDU_M_SP_NA_1:
case IEC60870_ASDU_M_DP_NA_1:
case IEC60870_ASDU_M_ST_NA_1:
case IEC60870_ASDU_M_BO_NA_1:
case IEC60870_ASDU_M_ME_NA_1:
case IEC60870_ASDU_M_ME_NB_1:
case IEC60870_ASDU_M_ME_NC_1:
case IEC60870_ASDU_M_PS_NA_1:
case IEC60870_ASDU_M_ME_ND_1: return true;
default: return false;
}
}
/* 总召支持COT=8撤销;规则只负责声明能力,匹配请求及撤销清理由引擎执行。 */
const IEC104_InterrogationRules_t IEC104_GENERAL_INTERROGATION_RULES = {
IEC60870_ASDU_C_IC_NA_1, true, General_Decode, General_Qualifier_Valid,
General_Data_Cause, General_Data_Allowed, General_Has_Data
};
/* 保留旧公开函数名和签名;工程需同时编译本文件与共用引擎。 */
IEC104_Interrogation_t *IEC104_Interrogation_Create(IEC104_Slave_t *slave,
const IEC104_InterrogationConfig_t *config)
{
return IEC104_Interrogation_Create_With_Rules(slave, config, &IEC104_GENERAL_INTERROGATION_RULES);
}