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

81 lines
4.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.
/**
* 链路模块内部的跨文件协作声明,不属于供业务调用的稳定公开API。
*
* “内部”指使用范围限于链路实现,不是C语言的static内部链接。
* 本文件声明的函数均定义在IEC104_Link.c,供公共链路及角色实现调用,
* 因此采用外部链接。角色状态组合校验是Link.c中的static函数,不在此声明。
* 若改为static,必须同时消除跨编译单元调用;仅移动或删除头文件声明无效。
* 只在一个.c内使用的辅助函数直接定义为static,不应加入本头文件。
*
* 校验调用顺序:Role_Valid -> State_Valid -> Link.c内对应角色的static State_Consistent。
* 最后一级不能反调前两级,否则形成递归。其余辅助函数依赖各自列出的前置条件。
* 同一连接的检查、编码、状态提交和完成事件由调用方串行化;这里不提供锁或调度。
* 业务调用方使用Common、Master_StartStop、Slave_StartStop公开头文件,或兼容总头文件IEC104_Link.h。
* SendManager通过公开的Get_Send_Progress和Is_Initial_State查询,不包含本头文件。
*/
#ifndef IEC104_LINK_INTERNAL_H
#define IEC104_LINK_INTERNAL_H
#include "IEC104_Link_Common.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* 功能:检查公共字段定义域、S状态/快照组合,以及当前角色的启停状态约束。
* 定义/调用:定义于IEC104_Link.c;公共接口及主站超时查询使用,角色入口经Role_Valid使用。
* 输入参数:state——待检查对象;允许NULL,返回0。
* 输出参数:无,不修改state。
* 返回值:通过检查为1,否则为0;不是IEC104_LinkResult_t事件结果。
* 说明:不判断TCP连接、FIFO事件身份或本次报文序号;这些由对应处理步骤负责。
*/
int IEC104_Link_State_Valid_Internal(const IEC104_LinkState_t *state);
/**
* 功能:完成上述状态检查,并要求本端角色与指定接口相符。
* 定义/调用:定义于IEC104_Link.c;主站和子站的角色专用入口调用。
* 输入参数:state——待检查对象;role——入口要求的CONTROLLING或CONTROLLED。
* 输出参数:无,不修改state。
* 返回值:状态合法且角色匹配为1;NULL、状态非法或角色不匹配为0。
* 说明:检查的是本端固定角色,不会设置角色,也不会推进启停过程。
*/
int IEC104_Link_Role_Valid_Internal(const IEC104_LinkState_t *state, IEC104_LinkRole_t role);
/**
* 功能:计算已收但尚未由成功发送的I/S帧确认的I帧数。
* 定义/调用:定义于IEC104_Link.c;公共确认逻辑和子站停止排空使用。
* 前置条件:state非NULL,acked_nr和vr为有效15位序号,未确认区间未占满序号环。
* 输出参数:无,不修改state;不重复执行完整状态校验。
* 返回值:从acked_nr到vr的循环距离,范围0..32767;0表示无待确认数据。
*/
uint16_t IEC104_Link_Unconfirmed_Rx_Internal(const IEC104_LinkState_t *state);
/**
* 功能:判断当前接收位置已确认,或已由在途S帧的N(R)完整覆盖。
* 定义/调用:定义于IEC104_Link.c;主站准备STOPDT_ACT及接收STOPDT_CON使用。
* 前置条件:state已通过完整状态校验;调用方保证同连接FIFO与事件串行顺序。
* 输出参数:无,不修改state。
* 返回值:acked_nr==vr,或在途S帧s_ack_nr==vr时为1,否则为0。
* 说明:返回1不等于S已发送完成,不能据此推进acked_nr;旧V(R)快照不算完整覆盖。
*/
int IEC104_Link_Rx_Ack_Covered_Internal(const IEC104_LinkState_t *state);
/**
* 功能:编码一帧S确认并保存它的实际N(R)快照,供普通确认及两端STOPDT复用。
* 定义/调用:定义于IEC104_Link.c;公共S准备、主站/子站停止准备调用。
* 前置条件:state已校验且无S帧在途;response非NULL且至少有IEC104_APCI_LEN字节;
* receive_number是本次选定的有效15位确认号。容量和是否应确认由调用方判断。
* 输出参数:成功写入response,设置s_ack_nr及S_ACK_SEND_PENDING;不更新acked_nr。
* 返回值:6表示构帧成功,-1表示编码失败且不提交状态;不执行网络发送。
* 说明:完整发送后才能通过Complete_S_Ack_Send提交确认;本函数不重新读取vr或规划报文。
*/
int IEC104_Link_Prepare_S_Ack_Internal(IEC104_LinkState_t *state,
uint8_t *response, uint16_t receive_number);
#ifdef __cplusplus
}
#endif
#endif /* IEC104_LINK_INTERNAL_H */