/** * 主站启停公开接口:本端为CONTROLLING,主动发送STARTDT/STOPDT_ACT并接收CON。 * START:Prepare -> 实际发送 -> Complete -> Handle CON; * STOP:Request -> Prepare(S/ACT)-> 按tx类型发送并Complete -> Handle CON。 * 主站的两个CON处理接口都只接受CON_WAITING过程,不缓存ACT完成前的CON; * 调用方必须先提交已知的ACT完整发送结果。I/S与TESTFR使用Common.h的公共接口。 * 主动启停须等本次CON成功处理后再发起下一过程;忙或重复请求不得重发ACT或重启计时。 * 实现见Master_StartStop.c;Internal.h仅供实现协作,不供业务调用。 */ #ifndef IEC104_LINK_MASTER_STARTSTOP_H #define IEC104_LINK_MASTER_STARTSTOP_H #include "IEC104_Link_Common.h" #ifdef __cplusplus extern "C" { #endif /** * 适用端:仅控制站。 * 功能:生成主动启动请求STARTDT_ACT,并记录等待最终发送结果的状态。 * 输入参数:state——链路状态;request——输出缓冲;capacity——实际容量,至少6字节。 * 输出参数:request——写入68 04 07 00 00 00;state——主动请求转ACT_SEND_PENDING。 * 返回值:6表示生成新请求;0表示已有启停过程或链路已启动; * -1表示参数或状态非法。返回0或-1时不修改状态和输出缓冲。 * 说明:仅控制站可调用,只允许从STOPPED且过程IDLE时开始;不执行网络发送,不修改序号。 * 返回6后必须提交最终发送结果;同一连接的三个主动启动接口须串行调用。 * ACT成功入队后,控制站可预留命令I帧,不必等待CON;ACT必须在 * 同一FIFO中先于这些I帧发送和提交Complete。未受理STARTDT前仍禁止I帧。 */ extern int IEC104_Link_Prepare_Startdt_Act(IEC104_LinkState_t *state, uint8_t *request, uint16_t capacity); /** * 适用端:仅控制站。 * 功能:记录主动STARTDT_ACT的最终发送结果。 * 输入参数:state——链路状态;sent_len——最终累计成功发送字节数,恰好6表示成功。 * 输出参数:有匹配ACT时,完整成功转START_CON_WAITING,发送失败回IDLE; * 无匹配过程或状态/角色非法时不修改状态。所有分支均不改变稳定状态。 * 返回值:OK表示完整发送并开始等待CON;IGNORED表示没有ACT等待完成; * FATAL表示状态/角色非法或发送失败。 * 说明:失败后上层须断连。部分写入未结束时不要调用;调用方必须与具体枚举值比较。 * 状态合法但无匹配ACT时先返回IGNORED,不检查sent_len;成功提交后才处理CON。 * ACT失败后不得继续发送其后已预留的I帧,也不得回滚vs后复用当前连接。 */ extern IEC104_LinkResult_t IEC104_Link_Complete_Startdt_Act_Send( IEC104_LinkState_t *state, int sent_len); /** * 适用端:仅控制站。 * 功能:接受正在等待的STARTDT_CON,完成本端主动启动。 * 输入参数:state——链路状态;apci——已通过APCI解析的STARTDT_CON。 * 输出参数:过程回IDLE,dt_state进入STARTED。 * 返回值:OK表示接受并提交;IGNORED表示当前未等待CON; * FATAL表示参数、角色、报文或状态非法。 * 说明:仅控制站可调用;不修改序号、确认位置及TESTFR状态。 * START_ACT_SEND_PENDING时返回IGNORED,不保存提前CON;须先完成本ACT的Complete。 * 报文/角色/状态检查先于等待过程检查,非法输入不会因当前未等待而被忽略。 */ extern IEC104_LinkResult_t IEC104_Link_Handle_Startdt_Con( IEC104_LinkState_t *state, const IEC104_ApciInfo_t *apci); /** * 适用端:控制站与被控站;实际超时只适用于控制站等待CON的过程。 * 功能:判断主动STARTDT_ACT发送成功后等待STARTDT_CON是否达到t1超时。 * 输入参数:state——链路状态;elapsed_ms——等待STARTDT_CON的毫秒数; * t1_ms——t1配置值,必须大于0。 * 输出参数:无,不修改链路状态。 * 返回值:1表示正在等待STARTDT_CON且已经超时;0表示未等待或尚未超时; * -1表示参数或链路状态非法。 * 说明:调用方在Complete_Startdt_Act_Send()成功后,以ACT实际完整发送时刻为单调计时起点, * Handle_Startdt_Con()成功时取消计时;返回1后的断连由调用方执行。 * 同一次ACT的计时起点只记录一次;重复调用、业务收发或无匹配的完成事件不重置起点。 * 合法被控站没有对应等待过程,返回0;角色与过程组合非法仍返回-1。 */ extern int IEC104_Link_T1_Startdt_Con_Expired( const IEC104_LinkState_t *state, uint32_t elapsed_ms, uint32_t t1_ms); /** * 适用端:仅控制站。 * 功能:受理主动停止意图,进入STOP_REQUESTED,立即禁止新的业务I帧预留。 * 输入参数:state——控制站链路状态。 * 输出参数:ACCEPTED时dt_procedure转为STOP_REQUESTED,保留稳定状态和序号。 * 返回值:ACCEPTED表示新受理;ALREADY_STOPPED表示已经停止;IN_PROGRESS表示 * 停止已在进行;BUSY表示存在其他启停过程;REQUEST_ERROR表示参数、角色 * 或状态非法。除ACCEPTED外均不修改状态。 * 说明:不构帧;重复请求不重置进度。受理后调用Prepare_Stopdt_Request推进, * 接收数据和发送完成事件到达后继续推进;等待期间停止意图始终保留。 * 只有ACCEPTED代表新过程;其余结果不得重启已有的准备/排队或CON等待计时。 * 等待CON的t1须等ACT完整发送成功后开始,不能从本接口受理时刻开始计算。 */ extern IEC104_StopdtRequestResult_t IEC104_Link_Request_Stopdt( IEC104_LinkState_t *state); /** * 适用端:仅控制站。 * 功能:推进已受理的主动停止,按需生成S确认或STOPDT_ACT。 * 输入参数:state——控制站链路状态;request——输出缓冲;capacity——至少6字节; * tx——本次报文类型和长度的输出地址,须随报文保存在FIFO节点中。 * 输出参数:FRAME_READY时写入request和tx,并提交S确认或STOPDT_ACT待发送状态。 * 返回值:FRAME_READY表示生成报文;NOT_ACTIVE表示没有对应停止过程; * WAIT_SEND表示等待已有S/ACT发送完成;WAIT_PEER_CON表示等待STOPDT_CON; * PREPARE_ERROR表示参数、角色、状态或编码结果非法。 * 非FRAME_READY时不修改状态和输出;NOT_ACTIVE不会隐式受理停止请求。 * 说明:在途S帧覆盖当前V(R)时可生成ACT,否则等待S完成后补确认。 * 本端未获确认的I帧不阻止生成ACT;收到CON时检查V(A)==V(S)及接收确认覆盖。 * 调用方须先取得有界FIFO节点,再构帧并按生成顺序排队;无法入队须断连。 * 将tx与报文共同保存:S_ACK完成调用Complete_S_Ack_Send,ACT完成调用 * Complete_Stopdt_Act_Send。 * 同一连接按FIFO提交完成事件,不能因当前状态改变而重新猜测报文类型。 * 等待CON的t1仍从ACT完整发送成功开始;准备/排队超时由连接层管理。 */ extern IEC104_StopdtPrepareResult_t IEC104_Link_Prepare_Stopdt_Request( IEC104_LinkState_t *state, uint8_t *request, uint16_t capacity, IEC104_StopdtTx_t *tx); /** * 适用端:仅控制站。 * 功能:记录主动STOPDT_ACT的最终发送结果。 * 输入参数:state——链路状态;sent_len——最终累计成功发送字节数,恰好6表示成功。 * 输出参数:有匹配ACT时,完整成功转STOP_CON_WAITING,发送失败回IDLE; * 无匹配过程或状态/角色非法时不修改状态。 * 返回值:OK表示完整发送并开始等待CON;IGNORED表示没有ACT等待完成; * FATAL表示状态/角色非法或发送失败。 * 说明:失败后上层须断连。部分写入未结束时不要调用;调用方必须与具体枚举值比较。 * 状态合法但无匹配ACT时先返回IGNORED,不检查sent_len;匹配ACT发送失败时 * dt_state仍为STARTED,不能因过程回IDLE而继续业务发送。 * 成功提交后才处理STOPDT_CON;本接口不能代替前序S帧的Complete_S_Ack_Send。 */ extern IEC104_LinkResult_t IEC104_Link_Complete_Stopdt_Act_Send( IEC104_LinkState_t *state, int sent_len); /** * 适用端:仅控制站。 * 功能:接受正在等待的STOPDT_CON,完成本端主动停止。 * 输入参数:state——链路状态;apci——已通过APCI解析的STOPDT_CON。 * 输出参数:过程回IDLE,dt_state进入STOPPED。 * 返回值:OK表示接受并提交;IGNORED表示当前未等待CON;FATAL表示参数、角色、 * 报文或状态非法、发送方向未排空,或接收数据未确认且无完整覆盖的在途S帧。 * 说明:要求V(A)==V(S),并且acked_nr==V(R)或在途S帧s_ack_nr==V(R)。 * 覆盖完整时允许CON早于本地S完成回调;保留S待完成状态和确认快照, * 后续Complete_S_Ack_Send成功才推进确认位置,发送失败仍要求上层断连。 * 非OK结果不修改状态;始终不修改序号、确认位置及TESTFR状态。 * STOP_ACT_SEND_PENDING时返回IGNORED且不缓存CON;允许S完成回调晚到, * 不代表允许本ACT完成回调晚到。V(A)==V(S)时,公共序号约束保证 * sent_vs也已经到达vs;这些I帧的本地发送完成必须先于ACK提交。 */ extern IEC104_LinkResult_t IEC104_Link_Handle_Stopdt_Con( IEC104_LinkState_t *state, const IEC104_ApciInfo_t *apci); /** * 适用端:控制站与被控站;实际超时只适用于控制站等待CON的过程。 * 功能:判断主动STOPDT_ACT发送成功后等待STOPDT_CON是否达到t1超时。 * 输入参数:state——链路状态;elapsed_ms——等待STOPDT_CON的毫秒数; * t1_ms——t1配置值,必须大于0。 * 输出参数:无,不修改链路状态。 * 返回值:1表示正在等待STOPDT_CON且已经超时;0表示未等待或尚未超时; * -1表示参数或链路状态非法。 * 说明:调用方在Complete_Stopdt_Act_Send()成功后,以ACT实际完整发送时刻为单调计时起点, * Handle_Stopdt_Con()成功时取消计时;返回1后的断连由调用方执行。 * 同一次ACT的计时起点只记录一次;重复请求、I/S收发及WAIT_*结果均不重置起点。 * 合法被控站没有对应等待过程,返回0;角色与过程组合非法仍返回-1。 */ extern int IEC104_Link_T1_Stopdt_Con_Expired( const IEC104_LinkState_t *state, uint32_t elapsed_ms, uint32_t t1_ms); #ifdef __cplusplus } #endif #endif /* IEC104_LINK_MASTER_STARTSTOP_H */