49 lines
3.5 KiB
C
49 lines
3.5 KiB
C
/*
|
||
* 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 */
|