Files
STM32F4-Base/IEC60870-Slave/104/business/IEC104_CounterInterrogation.h
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

49 lines
3.5 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.
/*
* 104计数量召唤(C_CI_NA_1):读取冻结值,或由应用执行冻结/复位。
* 本模块提供种类规则和创建/动作入口;事件、调度、广播、期限与清理由共用引擎维护。
* 返回的句柄沿用Interrogation的驱动接口,所有调用在所属事件循环中串行执行。
*/
#ifndef IEC104_COUNTER_INTERROGATION_H
#define IEC104_COUNTER_INTERROGATION_H
#include "IEC104_Interrogation.h"
#ifdef __cplusplus
extern "C" {
#endif
/* 创建计数量实例:复制配置、借用Slave;参数或容量不满足要求时返回NULL,不操作网络。
* 同一Slave可同时拥有总召和计数量各一个实例,须分别提供广播状态区并接收全部连接/启停通知。
* RQT=1..4选择分组,5选择全部;FRZ=0读取冻结值,接受Type15(SQ=0/1)或Type37(SQ=0),
* 数据COT使用request.data_cause;104计数量不接受带CP24时标的Type16。
* FRZ=1冻结,2冻结并复位,3仅复位;肯定ACT_CON提交后即完成,不生成NEED_DATA或ACT_TERM。
* gi_submitted在此实例统计完成响应的提交次数:读取为ACT_TERM,动作命令为ACT_CON。
* 不支持COT=8撤销,回COT=45;TEST冻结/复位请求否定且不执行动作。
* 销毁前先Cancel并读完FINISHED;连接关闭会同时影响共享该连接的其他业务。 */
IEC104_Interrogation_t *IEC104_CounterInterrogation_Create(IEC104_Slave_t *slave,
const IEC104_InterrogationConfig_t *config);
/* 同步动作回调:context为应用上下文,request为引擎保存的请求信息,仅在回调期间借用。
* true表示所选组的动作已完成;false必须保证未改变任何计数器,不能部分清零后报告失败。
* 应先检查整个组的资源和条件,再提交修改;动作须短时完成,不访问网络或执行阻塞I/O。
* 不得重入引擎或推进协议事件循环;真实计数器值、冻结值、序号和品质均由应用维护。 */
typedef bool (*IEC104_CounterInterrogationAction_t)(void *context,
const IEC104_InterrogationRequest_t *request);
/* 应答已取出的FRZ=1..3 BEGIN;event须原样传回,action非NULL,context原样传给回调。
* 先校验实例、事件、会话和期限;WAIT/STALE/ERROR均不调用action,也不会修改计数器。
* 校验通过后先消费BEGIN,再调用一次action;返回OK表示交互已消费,不表示动作一定成功。
* action返回true排队肯定确认,返回false排队否定确认;TEST请求直接否定,不调用action。
* 同一事件再次提交返回STALE;只保证本次BEGIN不重复执行,主站重发的新请求仍可能再次执行。
* 动作成功后等待肯定确认期间停止业务期限,避免计数器已改变却因排队超时改发否定确认。
* 传输超时、STOP、断线及本地Cancel仍可终结协议任务并交付FINISHED,但不回滚已执行动作。
* 本接口不管理异步外部电表事务;这类事务须另定义执行状态、迟到结果和重复请求策略。
* FRZ=0使用Reply_Begin及数据接口,整轮读取(含WAIT重试)应保持同一冻结快照。
* 动作命令没有NEED_DATA,拿其BEGIN调用Submit_Batch会返回STALE,不发送数据。 */
IEC104_InterrogationReplyResult_t IEC104_CounterInterrogation_Execute_Begin(
IEC104_Interrogation_t *self, const IEC104_InterrogationEvent_t *event,
IEC104_CounterInterrogationAction_t action, void *context);
#ifdef __cplusplus
}
#endif
#endif /* IEC104_COUNTER_INTERROGATION_H */