58 lines
3.7 KiB
C
58 lines
3.7 KiB
C
/*
|
||
* 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 */
|