添加遥控业务代码
This commit is contained in:
@@ -0,0 +1,271 @@
|
||||
# IEC104 测试说明
|
||||
|
||||
> **目录与命令同步日期**:2026-10-29。测试代码位于根目录的 `test/`,本文仅列出当前保留的测试入口及可运行命令。
|
||||
> **配套文档**:[TCP服务设计](../104/IEC104_TcpServer_设计架构.md)、[链路设计](../104/IEC104_Link_设计架构.md)、[发送模块设计](../104/IEC104_发送模块_设计架构.md)。
|
||||
|
||||
## 1. 当前测试入口
|
||||
|
||||
`iec60870_asdu_test.c`包含10组信息对象编解码测试,使用独立预期报文字节覆盖12种监视类型(各SQ=0/1)、18种命令编解码和12种COT/CA/IOA宽度组合。它不创建socket、不读取或设置系统时钟。覆盖可配置容量、249/254字节边界、127对象限制、失败原子性、地址连续性与溢出、品质和CP56校验、应答原文保留、重叠复制及公共地址修改。
|
||||
|
||||
`iec60870_asdu_extended_test.c`新增7组测试,以独立预期字节覆盖其余37种类型的696组布局。两套ASDU测试合计覆盖67种类型、1200组COT/CA/IOA及SQ布局。新增测试检查CP16完整数值范围、CP24边界/保留位、步位置负数、QDP、QPM、变长文件段0/255字节及配置容量、249/254总长、对象复制独立性、截短/多余字节、SQ/数量约束和失败原子性。
|
||||
|
||||
`iec104_tcp_event_ring_test.c`包含13个TCP事件字节环场景。它使用可控Net后端,不创建真实socket、不执行真实等待;通过直接包含`IEC104_TcpServer.c`检查内部容量、跨环尾布局和损坏数据的出队行为。
|
||||
|
||||
`iec104_tcp_scheduler_test.c`复用上述可控Net后端,包含25个调度场景;其中2个明确验证原有严格容量背压策略仍会超时,不能把测试通过解释为消除了队头阻塞。`iec104_net_pending_input_test.c`使用当前Windows后端进行真实本机回环检查。
|
||||
|
||||
`iec104_slave_test.c`复用可控Net后端,共32组统一入口测试,覆盖ASDU视图、共用发送分派、确认/终止字节、HIGH背压、非法参数、原连接身份、延迟复制、服务复用、生命周期、外部调度及离线上报。站点测试覆盖13节点、CA/context隔离、删除即时退出路由与引用延迟回收、同CA替代节点的注册编号、快照期间增删/嵌套/结束回收、显式集合锁及跨服务误用;新增9组同步拒绝回归。共用层非104参数测试不代表已提供101串口传输。
|
||||
|
||||
因接口过期而无法编译的旧协议、发送管理器、TCP模拟后端和Windows回环测试及其专用辅助文件已删除。这里新增的测试均使用当前接口,历史测试未恢复。
|
||||
|
||||
`iec104_slave_example_test.c`包含原98组总召基线,覆盖总召报文、部分写入、各阶段WAIT、忙拒绝、撤销、STOP/断线、need_process、突发排序、不排队提交及业务/链路期限。提交期通知覆盖三个入口的STOPPED归因、FATAL与STOP并存、非STOP的ERROR、OK/WAIT伴随新回执及START后恢复。畸形请求覆盖可靠否定/丢弃边界、基础截短仍被Receiver拒绝、输入原文保持、活动总召/期限不变、背压满槽及广播撤销隔离。多站覆盖13站三阶段顺序、非空混合批次、状态区不足/重叠、已确认未来站删除与同CA重建、超出2槽FIFO的FINISHED交付、各阶段定向及满槽广播撤销、拒绝与撤销同时等待、非当前站总期限,以及总期限禁用、BEGIN先到期和两项同时到期的处理优先级。`test/slave_example_loopback_test.cjs`通过Windows后端与真实TCP验证命令行单站,多CA由可控Net回归覆盖。构建及点表见[示例说明](../examples/IEC104子站示例.md)。
|
||||
|
||||
同步拒绝接口回归检查COT=44..47的原文回显、TEST/OA/CA/VSQ及对象字节保留、输入事件和最近提交结果不变、非法参数及原服务/会话隔离。未读启停通知拒绝提交;已消费STOP/START后的旧事件不在同步接口允许的调用范围内,不能用状态计数为0证明其仍有效。示例回归覆盖连续及重复内容的新命令、HIGH真满时丢新且保留连接/旧应答、活动总召中的兜底、启停与发送故障收尾;原同批兜底回归继续保留。接入校时后的真实TCP对103与102同批发送分别核对ACT_CON和COT=44,不保证跨业务响应顺序。接口与丢新语义见[同步拒绝当前请求](../104/IEC104_API接口汇总.md#reject-request)。
|
||||
|
||||
校时测试使用模拟action及可控单调时钟,不设置Windows时间。覆盖Handle/Process不执行应用、显式执行一次、原CP56回显、COT/CA/IOA校验优先级、TEST/IV/非法CP56拒绝、SU/时区转换、受理起滞留补偿、日期上界和64位运算、期限与倒退、Try背压不重复动作、FIFO/满槽、STOP/断线/旧会话、广播快照及删除目标,以及action内只读状态。真实设备写入耗时、权限及失败后的硬件状态不由这些模拟测试证明,边界见[时钟同步设计](../104/IEC104_ClockSynchronization_设计架构.md)。
|
||||
|
||||
## 2. 编译与运行
|
||||
|
||||
当前业务测试由98组总召、12组计数量、4组兜底及16组校时组成,共130组,单/双服务配置各跑一次。计数量覆盖独立实例、请求校验、Type15/37批次边界、忙隔离、冻结/复位、动作重复调用和WAIT/STALE/TEST、业务期限、STOP/断线、共享连接失败、发送背压及多站广播;兜底改用未支持的106/102,覆盖同批与反序/重复内容、窗口与写阻塞、HIGH满丢新及恢复、STOP/STOPSTART取消和活动总召中的应答。校时专项检查独立受理与执行、原文确认、补偿/期限、广播及生命周期。`iec104_interrogation_rules_test.c`另有3组规则测试,遍历限定词、数据COT和类型/SQ/FRZ矩阵并检查解析;没有网络交互。
|
||||
|
||||
在项目根目录的PowerShell中执行,要求GCC可用。下述TCP事件环和调度测试已包含TcpServer实现且自行实现Net接口,构建时不要再次链接`IEC104_TcpServer.c`或`IEC104_Net_Windows.c`。
|
||||
|
||||
```powershell
|
||||
Get-Command gcc -ErrorAction Stop | Out-Null
|
||||
New-Item -ItemType Directory -Path .build -Force | Out-Null
|
||||
$testSources = @(
|
||||
'test/iec104_tcp_event_ring_test.c',
|
||||
'104/IEC104_Connection.c',
|
||||
'104/IEC104_Receiver.c',
|
||||
'104/IEC104_SendManager.c',
|
||||
'104/IEC104_SendBuffer.c',
|
||||
'104/IEC104_AsduQueue.c',
|
||||
'104/IEC104_Codec.c',
|
||||
'common/IEC60870_Codec.c',
|
||||
'104/IEC104_Link.c',
|
||||
'104/IEC104_Link_Slave_StartStop.c'
|
||||
)
|
||||
gcc -std=c11 -O2 -I104 -Icommon -Wall -Wextra -Werror @testSources -o .build/iec104_tcp_event_ring_test.exe
|
||||
if ($LASTEXITCODE -ne 0) { throw 'TCP event ring build failed' }
|
||||
./.build/iec104_tcp_event_ring_test.exe
|
||||
if ($LASTEXITCODE -ne 0) { throw 'TCP event ring tests failed' }
|
||||
```
|
||||
|
||||
成功时末行输出`TCP event ring: 13 cases passed`,进程退出码为0。任何断言失败都会输出函数名、行号和条件并以非零状态退出。编译失败后立即停止,不能继续运行旧二进制。
|
||||
|
||||
沿用上述`$testSources`编译调度测试;它已经包含字节环测试源文件,不能重复链接:
|
||||
|
||||
```powershell
|
||||
$schedulerSources = @('test/iec104_tcp_scheduler_test.c') + $testSources[1..($testSources.Length - 1)]
|
||||
gcc -std=c11 -O2 -I104 -Icommon -Wall -Wextra -Werror @schedulerSources -o .build/iec104_tcp_scheduler_test.exe
|
||||
if ($LASTEXITCODE -ne 0) { throw 'TCP scheduler build failed' }
|
||||
./.build/iec104_tcp_scheduler_test.exe
|
||||
if ($LASTEXITCODE -ne 0) { throw 'TCP scheduler tests failed' }
|
||||
|
||||
gcc -std=c11 -O2 -I104 -Icommon -Wall -Wextra -Werror test/iec104_net_pending_input_test.c 104/IEC104_Net_Windows.c -lws2_32 -o .build/iec104_net_pending_input_test.exe
|
||||
if ($LASTEXITCODE -ne 0) { throw 'Net loopback build failed' }
|
||||
./.build/iec104_net_pending_input_test.exe
|
||||
if ($LASTEXITCODE -ne 0) { throw 'Net loopback test failed' }
|
||||
```
|
||||
|
||||
分别输出`TCP scheduler: 25 cases passed (including strict backpressure policy checks)`和`Windows Net pending input: loopback passed`。
|
||||
|
||||
两套公共ASDU测试仅链接 `IEC60870_*.c`,不包含104头文件,不依赖104 Codec、TCP、Net或Clock。以下分别使用默认Windows时间实现和纯整数实现:
|
||||
|
||||
```powershell
|
||||
New-Item -ItemType Directory -Path .build -Force | Out-Null
|
||||
$asduSources = @('test/iec60870_asdu_test.c', 'common/IEC60870_Asdu.c', 'common/IEC60870_InformationObjects.c', 'common/IEC60870_Codec.c', 'common/IEC60870_Time.c')
|
||||
gcc -std=c11 -O2 -Icommon -Wall -Wextra -Werror @asduSources -o .build/iec60870_asdu_test.exe
|
||||
if ($LASTEXITCODE -ne 0) { throw 'ASDU build failed' }
|
||||
./.build/iec60870_asdu_test.exe
|
||||
if ($LASTEXITCODE -ne 0) { throw 'ASDU tests failed' }
|
||||
|
||||
gcc -std=c11 -O2 -Icommon -Wall -Wextra -Werror -DIEC60870_TIME_USE_PLATFORM=0 @asduSources -o .build/iec60870_asdu_integer_time_test.exe
|
||||
if ($LASTEXITCODE -ne 0) { throw 'ASDU integer-time build failed' }
|
||||
./.build/iec60870_asdu_integer_time_test.exe
|
||||
if ($LASTEXITCODE -ne 0) { throw 'ASDU integer-time tests failed' }
|
||||
```
|
||||
|
||||
两次均应输出`ASDU: 10 groups passed (30 concrete types, 504 wire layouts, 12 parameter configurations)`。源码中的完整字节向量不通过待测编码器生成;另外检查未对齐输入、浮点位模式(含NaN/Inf)及有符号累计量边界。对每种监视/命令向量检查截短和多余尾字节;命令另检查非法SQ/数量、SCO保留位、DCO/RCO无效状态和时标错误。测试允许业务自行判断未知COT、地址及限定词,并验证原始字段不会被解析器丢失。
|
||||
|
||||
新增类型测试使用相同生产依赖,可分别验证默认时间后端和纯整数后端:
|
||||
|
||||
```powershell
|
||||
$extendedSources = @('test/iec60870_asdu_extended_test.c', 'common/IEC60870_Asdu.c', 'common/IEC60870_InformationObjects.c', 'common/IEC60870_Codec.c', 'common/IEC60870_Time.c')
|
||||
gcc -std=c11 -O2 -Icommon -Wall -Wextra -Werror @extendedSources -o .build/iec60870_asdu_extended_test.exe
|
||||
if ($LASTEXITCODE -ne 0) { throw 'Extended ASDU build failed' }
|
||||
./.build/iec60870_asdu_extended_test.exe
|
||||
if ($LASTEXITCODE -ne 0) { throw 'Extended ASDU tests failed' }
|
||||
|
||||
gcc -std=c11 -O2 -Icommon -Wall -Wextra -Werror -DIEC60870_TIME_USE_PLATFORM=0 @extendedSources -o .build/iec60870_asdu_extended_integer_test.exe
|
||||
if ($LASTEXITCODE -ne 0) { throw 'Extended integer-time build failed' }
|
||||
./.build/iec60870_asdu_extended_integer_test.exe
|
||||
if ($LASTEXITCODE -ne 0) { throw 'Extended integer-time tests failed' }
|
||||
```
|
||||
|
||||
输出`Extended ASDU: 696 independent wire layouts verified`及`Extended ASDU: 7 groups passed (37 additional types, short times, variable file segments)`。这里验证无状态编解码,未模拟文件传输业务或真实设备互操作。
|
||||
|
||||
104封装检查独立放在 `iec104_asdu_transport_test.c`:复用公共套件的独立载荷向量,验证30种类型的42种类型/SQ组合、I帧序号与完整字节、249字节可发送及250/254字节拒绝。公共套件的测试入口仅用于复用夹具,不会在此重复运行。
|
||||
|
||||
```powershell
|
||||
$transportSources = @('test/iec104_asdu_transport_test.c', 'common/IEC60870_Asdu.c', 'common/IEC60870_InformationObjects.c', 'common/IEC60870_Codec.c', 'common/IEC60870_Time.c', '104/IEC104_Codec.c')
|
||||
gcc -std=c11 -O2 -I104 -Icommon -Wall -Wextra -Werror @transportSources -o .build/iec104_asdu_transport_test.exe
|
||||
if ($LASTEXITCODE -ne 0) { throw '104 ASDU transport build failed' }
|
||||
./.build/iec104_asdu_transport_test.exe
|
||||
if ($LASTEXITCODE -ne 0) { throw '104 ASDU transport tests failed' }
|
||||
```
|
||||
|
||||
输出 `104 ASDU transport: 2 groups passed (42 layouts, 249/254-byte boundary)`。
|
||||
|
||||
共用应答接口测试同时覆盖ASDU对象与104真实提交路径,不链接真实网络后端:
|
||||
|
||||
```powershell
|
||||
$slaveSources = @(
|
||||
'test/iec104_slave_test.c', 'common/IEC60870_Slave.c', '104/IEC104_Slave.c',
|
||||
'common/IEC60870_Asdu.c', 'common/IEC60870_InformationObjects.c', 'common/IEC60870_Time.c',
|
||||
'104/IEC104_Connection.c', '104/IEC104_Receiver.c', '104/IEC104_SendManager.c',
|
||||
'104/IEC104_SendBuffer.c', '104/IEC104_AsduQueue.c', '104/IEC104_Codec.c', 'common/IEC60870_Codec.c',
|
||||
'104/IEC104_Link.c', '104/IEC104_Link_Slave_StartStop.c'
|
||||
)
|
||||
gcc -std=c11 -O2 -I104 -Icommon -Wall -Wextra -Werror @slaveSources -o .build/iec104_slave_test.exe
|
||||
if ($LASTEXITCODE -ne 0) { throw 'Slave replies build failed' }
|
||||
./.build/iec104_slave_test.exe
|
||||
if ($LASTEXITCODE -ne 0) { throw 'Slave replies tests failed' }
|
||||
```
|
||||
|
||||
输出`Slave service: 32 groups passed (replies, identities, stations, lifecycle, backpressure, rejection)`。默认及`-DIEC104_TCP_SERVER_CAPACITY=2`均运行同一套测试。确认及终止字节由独立请求向量和明确COT比较,不用待测函数生成期望。失败且未接手时不增加队列条目,旧代次不能写入新连接;FATAL注入验证结果传递,不代表穷尽所有发送故障组合,也不能把取消计数解释为确定没有字节写出。
|
||||
|
||||
参数矩阵遍历COT=1/2、CA=1/2、IOA=1/2/3:288组双对象监视报文布局、216组命令编解码报文;应答单独遍历全部30类型、12种配置、7种COT及两种P/N。所有布局检查截短输入及额外尾字节。边界测试检查省略OA、1字节CA溢出、三种IOA连续地址溢出、非法/NULL参数、容量与配置上限分别生效、4字节未知类型应答的重叠复制及5字节读命令。通用ASDU可编码/解析254字节报文,而104 I帧封装仍拒绝该长度。
|
||||
|
||||
另逐类验证具体Create/Get_From_Buffer、编码函数表身份、输出存储尺寸、首对象失败不设置类型、命令数量上限、非法SQ及修改对象后重新编码的校验。具体解析结果按值保存,覆盖输入载荷被清零后对象仍有效。
|
||||
|
||||
以上编解码和共用接口用例验证信息对象格式和接口契约,具体业务流程由下面的示例测试验证。两种时间配置通过同一CP56用例,不等同于全部日历转换函数的一致性覆盖。
|
||||
|
||||
单文件示例及其业务测试通过一个脚本构建;需要MinGW GCC,真实回环测试另需Node.js(仅使用内置模块):
|
||||
|
||||
```powershell
|
||||
./scripts/build.ps1 -Test
|
||||
```
|
||||
|
||||
脚本输出两次`Slave service: 32 groups passed ...`(单/双服务)、两次`slave example + event interrogation tests: 130 groups passed ...`、`interrogation rules: 3 groups passed ...`和`Slave example loopback: passed ...`。可控后端使用251字节HIGH和2槽召唤业务事件FIFO。真实回环使用默认存储、k=1、随机本机端口,验证总召与计数量交错、冻结/复位及后续读取、分组/广播、TEST拒绝、COT=8返回45、106/102同批回44、STOP/START、重连及8秒后的正常退出。校时另核对正常7、TEST否定7、COT=5否定45、广播实际CA及103/102同批先44再7,全部使用模拟时钟且连接保留;STOP为submitted=65、clock_executed=3、clock_synchronized=3、clock_submitted=5。这里没有真实计量设备、系统设时或遥控,不构成完整互操作认证。
|
||||
|
||||
## 3. 覆盖范围
|
||||
|
||||
| 场景 | 验证内容 |
|
||||
|---|---|
|
||||
| 跨环尾往返 | 每个环起点、短长I帧、RECORD和全部连接通知;头部及载荷跨界、短帧尾部清零、历史代次交付 |
|
||||
| 满容量预留 | 普通区、启停区、全部收尾项同时占满;失败入队保持原数据,FIFO次序不变 |
|
||||
| 容量边界 | CONNECT按实际大小判断;旧启停通知及收尾占用对新接入和启停的限制 |
|
||||
| 损坏项拒绝 | 非法类型、代次、长度、游标和计数;ERROR保持输出和队列不变 |
|
||||
| 短帧背压恢复 | 默认普通区缓存185条16字节APDU,下一帧暂留Receiver;消费后按序恢复 |
|
||||
| I帧先于回执 | 等待空间的长I帧阻止较短RECORD提前转移 |
|
||||
| 空间不足时回执延后 | 回执暂留内部,启停通知和CON仍推进 |
|
||||
| 预算用尽时回执延后 | 回执可晚于随后受理的启停通知交付 |
|
||||
| 收尾与重连 | 剩余I帧、全部记录、DISCONNECTED的次序,以及新连接下读取旧代次事件 |
|
||||
| 启停配额背压 | 精确核对CON字节数和帧内容;未受理ACT不回CON,消费一条通知后受理并确认,剩余通知及状态快照按序保留 |
|
||||
| 同状态重复ACT | 已启动时START、已停止时STOP均回CON而不通知;无未读通知及配额满时均覆盖两个方向 |
|
||||
| 跨代次启停顺序 | 旧启停通知读完前不接入;读完后可保留旧断开通知接入,严格交付DISCONNECTED(旧)→CONNECTED(新)→ACTIVATED(新)及各自快照 |
|
||||
| 分包与每轮预算 | 默认一次recv容纳8个满长APDU;分段输入完整交付且不重复 |
|
||||
|
||||
这些场景不等同于完整协议测试,也不覆盖真实网络、全部异常超时、多线程并发或ASDU业务语义。性能模拟的测量方法和局限见[TCP服务设计中的验证记录](../104/IEC104_TcpServer_设计架构.md)。
|
||||
|
||||
调度专项覆盖:
|
||||
|
||||
| 场景 | 验证内容 |
|
||||
|---|---|
|
||||
| ACK边界(8组) | t1边界前置7/8/9/33个I帧;1/16/17字节recv分段;满长APDU突发;按序交付且每轮I事件不超过8条 |
|
||||
| 有限快照(3组) | 用户态尾部、内核分段输入及跨Feed预算的S流;持续新输入不能扩大旧快照或无限推迟缺ACK超时 |
|
||||
| 真正缺ACK | 没有输入时按原t1触发I_ACK_TIMEOUT |
|
||||
| 持续接收发送(2组) | 每轮8个I帧且业务读空FIFO,完整/部分send均持续推进 |
|
||||
| 业务发送 | 事件预算用尽后NORMAL业务仍能实际写出 |
|
||||
| 不可写(2组) | WOULD_BLOCK不忙重试;恢复可写后发送,持续不可写仍触发LOCAL_SEND_TIMEOUT |
|
||||
| TESTFR(2组) | CON在事件预算后仍受理;没有CON时仍触发TESTFR_TIMEOUT |
|
||||
| 真实容量背压(2组) | I帧普通区满、启停配额满仍按原策略暂停接收并检查严格期限 |
|
||||
| 续收时提交应答 | 业务在轮次之间可正常Send_Response,不提前误判旧ACK超时 |
|
||||
| 非法ACK | 续收不屏蔽越界ACK,仍以PROTOCOL收尾 |
|
||||
| 快照查询失败 | 保留输入与事件收尾,以TRANSPORT报告网络失败 |
|
||||
| EOF与应答 | 先交付I帧让业务提交应答,再读取EOF排空 |
|
||||
|
||||
Windows回环专项验证查询不会消费字节、部分recv后计数准确、输入耗尽与EOF均可返回零字节、非法参数不修改输出。它不代表真实网络下的协议性能或吞吐测试。
|
||||
|
||||
## 4. 配置覆盖
|
||||
|
||||
沿用上一节的`$testSources`,分别编译和运行:
|
||||
|
||||
```powershell
|
||||
gcc -std=c11 -O2 -I104 -Icommon -Wall -Wextra -Werror -DIEC104_TCP_RECORD_CAPACITY=3 -DIEC104_TCP_EVENT_CAPACITY=12 -DIEC104_TCP_EVENT_STATE_RESERVE=2 @testSources -o .build/iec104_tcp_event_ring_small.exe
|
||||
if ($LASTEXITCODE -ne 0) { throw 'Small configuration build failed' }
|
||||
./.build/iec104_tcp_event_ring_small.exe
|
||||
if ($LASTEXITCODE -ne 0) { throw 'Small configuration tests failed' }
|
||||
|
||||
gcc -std=c11 -O2 -I104 -Icommon -Wall -Wextra -Werror -DIEC104_TCP_RECORD_CAPACITY=40 -DIEC104_TCP_EVENT_CAPACITY=100 -DIEC104_TCP_EVENT_STATE_RESERVE=6 -DIEC104_TCP_RX_CAPACITY=4096 @testSources -o .build/iec104_tcp_event_ring_large.exe
|
||||
if ($LASTEXITCODE -ne 0) { throw 'Large configuration build failed' }
|
||||
./.build/iec104_tcp_event_ring_large.exe
|
||||
if ($LASTEXITCODE -ne 0) { throw 'Large configuration tests failed' }
|
||||
```
|
||||
|
||||
调度专项使用同样的配置参数,将命令中的`@testSources`换为`@schedulerSources`并使用独立输出文件名即可。
|
||||
|
||||
### 校时固定存储与栈测量
|
||||
|
||||
2026-10-29 Windows x64 GCC默认配置实测:ClockTask为104字节,含4槽的ClockSynchronization实例为568字节,Request为80字节,Status为72字节;默认单服务的校时静态实例数组占568字节,不是完整协议库RAM总量。探针及产物位于`.build/clock-synchronization-20261029/size_probe.c/exe`。
|
||||
|
||||
`-O2 -fstack-usage`报告的单函数栈帧:Handle_Event 256、Execute_Next 240、Submit_Head 224、Process 64、Get_Status 80字节;示例main由修改前768增至800字节,Clock_Action为48字节。记录为同目录的`example-before.su`、`example-after.su`及`clock.su`。这些是x64宿主ABI和单函数测量,不是最坏调用链,也不代表ARMCC/MCU的RAM或栈占用;嵌入式接入须按实际工具链重新核算。
|
||||
|
||||
## 5. 验证记录
|
||||
|
||||
2026-10-29 Type 103时钟同步:新增独立静态池模块、显式Execute_Next动作、64位受理后滞留补偿、执行期限、原文ACT_CON及广播快照确认;示例默认模拟,显式system模式才设置Windows时间。整合`build.ps1 -Test`中GCC `-std=c11 -O2 -Wall -Wextra -Werror`构建无诊断,Slave单/双服务各32组、业务单/双服务各130组(98总召、12计数量、4兜底、16校时)及3组规则测试均通过。脚本内首次Node启动因沙箱`spawnSync EPERM`失败,因此该次脚本整体不是成功退出;随后获准单独重跑相同Node回环命令,退出码0,真实本机TCP通过,核对submitted=65、clock_executed=3、clock_synchronized=3、clock_submitted=5。默认模拟校时的正常/TEST/COT=5/广播及103+102同批均覆盖,未执行system模式或真实设备设时。改前基线、大小探针及栈测量位于`.build/clock-synchronization-20261029/`。
|
||||
|
||||
2026-10-28 业务目录整理:共用召唤引擎、内部规则头、总召和计数量共7个源码/头文件移到`104/business/`,迁移前后SHA256逐字节一致;构建加入该目录的头文件搜索路径,同步测试直接包含路径及文档源码链接。严格GCC构建通过,单/双服务各110组业务测试、23组Slave测试及3组规则测试通过,公开头C++检查和真实Windows TCP回环通过。沙箱限制Node启动子进程时,回环使用原授权命令在沙箱外执行。迁移清单及备份位于`.build/business-layout-20261028/`,修改仅限IEC60870-Slave;未执行Keil目标构建或硬件联调。
|
||||
|
||||
2026-10-28 计数量召唤:先验证原98组总召、单/双服务各23组Slave及真实TCP基线;拆分规则后原98组不修改通过。新实现用独立规则和实例复用引擎,动作接口校验后执行一次,冻结/复位只确认,不制造取数阶段;总召接口名称和行为保留。严格GCC构建通过,110组业务测试在单/双服务配置均通过,3组规则测试、10组ASDU和7组扩展ASDU测试通过。真实Windows TCP回环通过;沙箱限制Node子进程启动(EPERM)时,原回环命令在获准的环境中运行通过。只链接总召或只链接计数量(实例容量1)的创建/销毁检查通过。修改前字节备份和验证产物位于`.build/counter-interrogation-20261028/`。未执行Keil目标构建或硬件联调;本次仅修改IEC60870-Slave目录。
|
||||
|
||||
同日Windows x64 GCC实测:实例1240→1248字节,默认单服务池1240→2496字节,请求32字节、事件80字节、广播每站48字节不变。新增请求字段使用原尾部填充,旧字段偏移保留;此测量不代替ARMCC目标的RAM/栈预算。只用一种业务可显式缩小实例池。
|
||||
|
||||
2026-10-27 广播总期限判定收敛:Task_Timeout以同一次取时返回最近期限、原因及已确认站到期标志,Expire不再重复遍历。公开API、固定存储容量及超时处理策略不变。新增总期限禁用、BEGIN先到期和同时到期用例,重构前后均通过。GCC C11严格警告构建、98组总召、单/双服务各23组Slave及真实Windows TCP回环通过;回环在沙箱内因子进程EPERM失败,按原命令在沙箱外重跑通过。修改及验证限本目录,未执行Keil构建或硬件联调。
|
||||
|
||||
2026-10-27 提交期STOP归因:总召三个发送入口仅在ERROR时复核原连接正常停用状态,先交付DEACTIVATED,保留STOPPED原因;其他ERROR/FATAL不降级,成功路径不增加查询。目录内严格编译、97组总召、单/双服务各23组Slave及真实Windows TCP回环通过。新增真实通知容量背压复现,以及其他入口的容量/故障注入;验证等待不推进批次、不停止取数计时、不重复提交,STOP伴随FATAL仍为SEND_ERROR,OK/WAIT交付新回执后暂停后续提交。原临时复现程序已迁入正式测试,公开接口和固定存储容量不变。
|
||||
|
||||
2026-10-27 总召畸形请求隔离:单对象完整但SQ/尾字节错误时规范化否定应答,零/多对象丢弃;公共视图失败交公共入口,基础截短仍由Receiver处理。目录内生产示例通过严格警告编译,92组总召回归及单/双服务各23组Slave回归通过,真实Windows TCP回环通过(沙箱子进程EPERM后按原命令重跑)。覆盖畸形激活/撤销不取消已有总召、不刷新期限、不修改输入,以及FIFO背压、满槽丢弃和多CA活动广播继续完成。未增加任务槽或发送缓冲,修改及验证均限IEC60870-Slave目录。
|
||||
|
||||
2026-10-27 c104广播发送顺序:合法多目标广播改为全部ACT_CON、逐站数据、全部ACT_TERM,调用方提供每站状态区,仍共用一个任务。87组总召及23组Slave回归在单/双服务配置下通过C11严格警告编译及运行;生产示例构建和真实Windows TCP回环通过。新增覆盖状态区不足/重叠、非空多站报文、已确认未来站删除、13条FINISHED通过2槽FIFO无损交付、满槽及跨阶段撤销、拒绝与撤销并存、非当前站总期限。回环因沙箱子进程EPERM按原授权命令重跑。Windows x64默认配置实测管理对象1240B、每站状态48B,通信队列容量和覆盖策略不变。文档197个本地链接及锚点、UTF-8编码和diff空白检查通过;修改及验证均限本目录。
|
||||
|
||||
2026-10-27 多CA总召及站点删除:Remove即时退出路由,引用/快照结束后回收;总召按请求CA选站,广播以一个任务逐站推进。23组Slave及78组总召测试均在单/双服务配置下通过`-std=c11 -O2 -Wall -Wextra -Werror`编译和运行,包含13站广播、同CA替换、三阶段WAIT及撤销/超时/STOP。生产示例严格编译和真实TCP回环通过;回环子进程EPERM后以已授权原命令运行。Windows x64默认配置测量:站点40B、快照32B、Slave40B、总召1192B、任务168B;通信队列容量及事件覆盖策略未变。本次修改与验证仅在IEC60870-Slave目录内进行。
|
||||
|
||||
2026-10-27 共用站点基础:Slave提供调用方节点注册、按CA查找、context、引用及集合锁,总召可绑定已注册节点,示例改为注册一次CA后复用。22组Slave测试及70组总召测试均在单/双服务配置下通过`-std=c11 -O2 -Wall -Wextra -Werror`构建与运行;生产示例严格编译及真实Windows TCP回环通过。回环因沙箱子进程EPERM使用已授权原命令重跑。当前总召仍只处理一个绑定站点,未验证或宣称多CA总召调度。x64测量每节点32字节,Slave32字节,总召968字节,通信队列及业务槽容量不变。仓库`.venv`和可执行Python缺失,`@build`及RAM/栈报告入口未能启动;未执行ARMCC目标验证或硬件联调。
|
||||
|
||||
2026-10-27 总召请求存储精简:任务改为保存原事件身份及10字节Type100原文,发送时临时建立ASDU视图;Slave新增按身份发送/尝试发送/关闭接口,保留原服务实例与连接代次校验。任务、事件及传输队列容量和覆盖策略未调整,内存测量见[固定存储](../104/IEC104_Interrogation_设计架构.md#2-对象身份与固定存储)。68组总召回归、18组Slave回归(默认及双服务配置)和真实Windows TCP回环通过严格警告构建及运行。新增验证源事件复用、输入存储释放、HIGH接手条数不变、Try等待不入队/覆盖及旧身份隔离;原总召回归继续覆盖忙拒绝、广播错误字段、满槽撤销、超时、STOP和新旧数据排序。回环子进程经已授权的原命令运行;未执行Keil目标构建或硬件联调。
|
||||
|
||||
2026-10-27 总召与突发发送排序:总召数据改为不排队提交,有未提交HIGH/NORMAL、当前帧或窗口背压时返回WAIT;应用保留事件及游标,重读当前值后重试。有效批次遇发送WAIT后停止本批取数期限,下一批重新计时;示例仅在OK后推进游标。68组总召测试、13个TCP事件环场景、25个调度场景及15组Slave测试通过C11严格警告编译与运行;真实Windows TCP回环通过。回环子进程在沙箱内遇EPERM,经授权使用原命令重跑通过。新增场景覆盖新旧突发及总召顺序、部分写入、窗口和期限边界、提交故障;产物位于`.build/`,未连接实际设备。
|
||||
|
||||
2026-10-26 总召本地续跑:状态新增need_process,示例直接据此决定立即续跑;实时检查未读Slave通知,发送WAIT后让出,网络推进后继续重试。62组可控网络测试通过C11严格警告编译与运行,覆盖业务应答、旧FINISHED出队释放空位、短应答、四类发送背压、到期及STOP/START优先;真实Windows TCP回环通过。回环在沙箱内启动子进程遇到EPERM,经授权使用原测试命令重跑通过。产物位于`.build/slave-example/`,未连接实际设备。
|
||||
|
||||
2026-10-26 目录整理:104协议、公共模块、示例、测试、文档和构建脚本分别归入 `104/`、`common/`、`examples/`、`test/`、`docs/` 和 `scripts/`,同步头文件搜索路径、示例引用及文档命令。49个生产源码/头文件的SHA256与迁移前一致,21个生产C文件通过C11严格警告检查。按本文命令运行的默认/纯整数时间ASDU测试(各10组)、扩展ASDU测试(各7组)、104封装2组、子站15组、TCP事件环默认/小容量/大容量各13组、调度25组及Windows输入查询回环均通过;从非项目根目录调用构建脚本,示例编译及59组总召测试通过。真实TCP回环核对62个ASDU和11次正常完成的总召通过。当前执行环境拒绝Node默认子进程管道(EPERM);本次回环以临时文件接收真实子进程输出,原测试代码、网络交互和断言未修改。迁移清单、路径校验及临时运行适配保存在 `.build/layout-migration/`,未连接实际设备。
|
||||
|
||||
2026-10-26 广播地址处理重构:新增固定协议常量IEC104_CA_BROADCAST,Type100入口一次确定应答CA,统一在内部请求副本建立时写入;Process及发送重试直接沿用该地址。移除重复任务header,批次COT/OA/TEST从info校验,CA继续按本站配置校验。原59组可控网络测试通过C11严格警告编译与运行,覆盖广播及定向总召、错误CA回显、发送WAIT、忙拒绝、撤销及确认前失败。真实Windows TCP回环继续通过,核对62个ASDU和11次正常完成的总召。修改前备份与可控测试产物位于`.build/interrogation-address-copy-20261026-031956/`;公开函数签名、事件及配置字段不变。
|
||||
|
||||
2026-10-26 总召广播公共地址:Type100激活和撤销接受65535,业务事件、确认、数据、终止及广播错误应答使用本站CA;其他错误CA仍原值回显,输入Slave事件不变。新增共用Asdu_Set_CA,1/2字节CA及COT组合、空/非空构造容器、借用原文、越界及无效容器不写入均通过测试。ASDU共10组,总召可控网络共59组,均通过C11严格警告编译与运行;总召覆盖QOI=20..36、发送WAIT、满槽忙拒绝、确认前失败、四种激活/撤销地址组合、非法数据CA和广播Type101隔离。真实Windows TCP回环逐帧核对62个ASDU和11次正常完成的总召,通过广播全站/分组、忙拒绝与重试、撤销、错误应答、STOP/START及重连。API文档359个声明与源码一致,声明块通过C11/C++17严格检查,API及流程链接和总召设计格式检查通过。备份与可控测试产物位于`.build/interrogation-broadcast-20261026-000144/`,实际服务产物位于`.build/slave-example/`。未执行真实设备联调。
|
||||
|
||||
2026-10-23 单文件子站示例:新增`examples/iec104_slave_example.c`,模拟点表、请求分派、总召状态机和main集中在一个文件;使用现有Slave接口,不修改协议库实现。示例及9组业务测试通过C11严格警告编译,可控后端验证逐阶段WAIT、部分发送、拒绝及任务取消;独立Node主站通过真实Windows本机TCP验证分片输入、k=1、3次完整总召、错误应答、STOP/START、重连及正常关闭。未连接实际主站设备,未设置系统时间。产物位于`.build/slave-example/`。
|
||||
|
||||
2026-10-23 子站统一入口:IEC104_Slave内部持有静态池TCP服务,NextEvent自动交付ASDU及原连接发送接口,Copy_Event复制延迟任务并重建自引用。删除手动SlaveConnection_Init接口,生命周期、主动上报、查询和关闭统一由Slave提供;TCP共享值类型迁至IEC104_TcpTypes.h,通信状态机及发送调度代码保持不变。默认及双服务容量各通过13组Slave回归,TCP事件环13个场景、调度25个场景通过;20个生产源文件通过C11严格警告检查,公开入口示例通过C11/C++11检查,依赖清单确认Slave业务头不引入TcpServer操作接口或内部对象头。Slave.c通过实际`-fanalyzer -c`分析。源码及文档修改前备份、测试产物位于`.build/slave-service-20261023/`。未执行真实设备联调。
|
||||
|
||||
2026-10-22 公共应用层拆分:信息对象、ASDU、参数和公共头解析统一为IEC60870命名,移除原信息对象/ASDU文件与符号,更新104接入及文档构建清单。两套公共ASDU测试仅链接IEC60870源文件,在默认及纯整数时间配置下各通过9组/504布局和7组/696布局;104封装独立通过2组/42布局及249/254字节边界。共用应答8组、TCP事件环13个场景、调度25个场景通过;20个生产源文件通过严格警告语法检查,公共及104接入头通过C++11严格检查。编译器依赖清单确认公共层不包含104头文件;源码对照确认对象与容器算法仅迁移名称和包含路径,接口汇总保持323个模块接口及7个内部协作函数。未实现101串口链路,未进行真实设备联调。
|
||||
|
||||
2026-10-22 常规类型补齐:新增37种对象及CP16/CP24工具,完整支持67种类型;ASDU接入变长文件段和独立SQ/数量约束。原ASDU套件9组、504组布局通过;新增套件在默认及纯整数时间配置下各通过7组、696组布局。共用应答8组、TCP事件环13个场景、调度25个场景通过。19个生产源文件通过严格警告语法检查;新公共头通过C++11检查;Asdu、InformationObjects和Time通过实际`-fanalyzer -c`分析。代码及文档沿用原有中文注释格式,未执行真实设备联调。
|
||||
|
||||
2026-10-21 对象分层:新增30种具体对象,统一ASDU创建/添加/解析/取对象,移除旧联合体与分类接口。默认及纯整数时间配置各通过9组测试(504种完整报文布局);17个生产源文件通过严格警告语法检查,Asdu与InformationObjects通过 `-O2 -fanalyzer -c -Wall -Wextra -Werror`。TCP事件环13个场景、调度25个场景重新编译运行通过。未执行真实设备联调。
|
||||
|
||||
2026-10-21 ASDU参数化:所有相关入口直接改为显式传入应用层参数,不保留旧签名。默认及`IEC60870_TIME_USE_PLATFORM=0`各通过12组测试,编译选项为`-std=c11 -O2 -Wall -Wextra -Werror`;`IEC60870_Asdu.c`和`IEC104_Codec.c`通过`-fanalyzer -c`严格警告分析。现有默认配置TCP事件环13个场景及调度25个场景重新编译运行通过。未执行真实设备联调或系统设时。
|
||||
|
||||
2026-10-20启停通知测试补强:默认、小容量及大容量配置各通过13个字节环场景,默认配置通过25个调度场景,均使用`-std=c11 -O2 -Wall -Wextra -Werror`构建。可执行文件及修改前字节环测试源码保存在`.build/state-events-coverage-20261020/`。
|
||||
|
||||
补充单槽边界(`IEC104_TCP_EVENT_STATE_RESERVE=1`):本次加强的启停背压及新增的重复ACT、跨代次顺序共3个场景单独运行通过;完整字节环套件在原有`test_delayed_receipt`的回执计数断言处失败,修改前源码也在同一位置失败。单槽配置未计入整套通过结果。
|
||||
|
||||
2026-10-20调度修复:默认、小容量及大容量配置各通过11个字节环场景和25个调度场景;Windows输入快照真实回环及生产库严格警告构建通过。默认服务对象为21472字节,比上一版增加8字节;事件环及RX容量不变。验证输出及修改前备份在`.build/scheduler-fix-20261020/`。此前每帧增加0.02–0.03 μs的结果仅对应存储改造,不涵盖本次新增查询与调度行为。
|
||||
|
||||
使用`-fanalyzer -c`实际编译时,TcpServer和Connection通过。Windows后端严格分析仍报告Listen/Accept处的3条文件描述符诊断(第142、151、190行);修改前备份产生相同诊断,均不在新增输入查询函数中。未修改既有socket代码或屏蔽告警;完整对照保存在`net_analysis_before.log`和`net_analysis_after.log`。因此不将Windows后端描述为静态分析全通过。
|
||||
|
||||
2026-10-19字节环改造验证:GCC 16.1.0(MinGW-W64 x64),默认、小容量及大容量配置各通过11个场景。Windows生产库严格警告构建及GCC静态分析通过。源码哈希、完整命令和测量输出位于`.build/fifo-byte-ring-20261019/`。
|
||||
|
||||
历史测试及构建记录仍保存在`.build`中,仅描述当时的源码版本,不属于当前可运行测试。本文不再提供已删除测试的构建命令,也不将其历史通过数计入当前结果。
|
||||
|
||||
Reference in New Issue
Block a user