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

58 lines
3.7 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.
/*
* TcpServer实现的编译期容量配置,不属于业务接口。
* 修改后重新编译IEC104_TcpServer.c;SERVER_CAPACITY也用于IEC104_Slave.c,须一起重编译。
* 业务无需了解各内部对象的尺寸或对齐。
* 可通过编译器-D覆盖;所有存储来自模块内静态对象池,不使用malloc。
* 除SERVER_CAPACITY外,其余容量均按每个服务对象计算;增加服务数量会同比增加这些静态存储。
*/
#ifndef IEC104_TCPSERVER_CONFIG_H
#define IEC104_TCPSERVER_CONFIG_H
#ifndef IEC104_TCP_SERVER_CAPACITY
#define IEC104_TCP_SERVER_CAPACITY 1U /* 同时持有的服务器句柄数;每个支持一条主站连接。 */
#endif
#ifndef IEC104_TCP_RX_CAPACITY
#define IEC104_TCP_RX_CAPACITY 2048U /* 字节数:recv暂存及未消费尾部,默认可容纳每轮8个满长APDU。 */
#endif
/* 两级ASDU队列均须容纳一条最大ASDU:
* HIGH至少IEC104_ASDU_HIGH_ENTRY_HEADER_LEN+IEC104_MAX_ASDU_LEN;
* NORMAL至少IEC104_ASDU_NORMAL_ENTRY_HEADER_LEN+IEC104_MAX_ASDU_LEN。
* TcpServer.c按实际sizeof静态校验,过小的-D覆盖会导致编译失败。
* Send_Response的排队路径使用HIGH;Enqueue_Event始终使用NORMAL。 */
#ifndef IEC104_TCP_HIGH_CAPACITY
#define IEC104_TCP_HIGH_CAPACITY 1024U /* 字节数:包含HIGH条目头和ASDU原文;空间不足时拒绝入队。 */
#endif
#ifndef IEC104_TCP_NORMAL_CAPACITY
#define IEC104_TCP_NORMAL_CAPACITY 4096U /* 字节数:包含NORMAL条目头和原文;空间不足可覆盖最旧原文。 */
#endif
#ifndef IEC104_TCP_CONTROL_CAPACITY
#define IEC104_TCP_CONTROL_CAPACITY 8U /* 槽数:待发及正在发送的S/U帧,不占用业务I帧记录槽。 */
#endif
#ifndef IEC104_TCP_RECORD_CAPACITY
#define IEC104_TCP_RECORD_CAPACITY 32U /* 槽数:未转为事件的I帧记录,含待ACK及已ACK待转移记录。 */
#endif
#ifndef IEC104_TCP_EVENT_CAPACITY
#define IEC104_TCP_EVENT_CAPACITY 68U /* 保证条数:包含按最长通知计的普通配额、启停及断线收尾预留。 */
#endif
#ifndef IEC104_TCP_EVENT_STATE_RESERVE
#define IEC104_TCP_EVENT_STATE_RESERVE 4U /* 保证条数:启停专用;逐条保存变化,不借给普通通知。 */
#endif
/* 最多全部发送记录、一个已受理I帧和一个断开事件;这部分不能挪作普通事件。
* 普通通知容量=EVENT_CAPACITY-EVENT_STATE_RESERVE-EVENT_CLOSE_RESERVE,必须大于0;默认30。
* 宏名及条数推导不变,实际FIFO按有效载荷长度存放于字节环;短通知可多于保证条数。
* 普通字节数=普通配额×最长I帧通知;启停字节数=启停配额×连接通知。
* 收尾字节数=最长I帧通知+RECORD_CAPACITY×记录通知+断开通知;均包含内部头部。
* 三类容量属于同一个FIFO;已入队通知按顺序保存,不覆盖、不合并。
* 普通通知满仍可处理排在前面的S/U,不以普通容量阻挡CON;无处交付的I帧保留原帧并暂停续收。
* NextEvent腾出普通空间后恢复;已确认回执暂留内部记录,可能晚于后续启停通知交付。
* 启停专用槽满时保留旧通知,延后受理改变状态的ACT;NextEvent释放槽后由Process重试。
* CON写入和同状态重复ACT不产生新启停通知;已有CON不受启停通知容量阻挡。
* 通知积压不直接断连,但不延长协议期限;收尾预留保证关闭时已受理数据仍可交付。
* 这里的普通通知区不是NORMAL发送队列;NORMAL可覆盖旧ASDU原文,两者容量和用途独立。 */
#define IEC104_TCP_EVENT_CLOSE_RESERVE (IEC104_TCP_RECORD_CAPACITY + 2U)
#define IEC104_TCP_EVENT_NORMAL_CAPACITY \
(IEC104_TCP_EVENT_CAPACITY - IEC104_TCP_EVENT_STATE_RESERVE - IEC104_TCP_EVENT_CLOSE_RESERVE)
#endif /* IEC104_TCPSERVER_CONFIG_H */