补充遥调业务代码
This commit is contained in:
@@ -25,13 +25,21 @@
|
||||
|
||||
## 2. 编译与运行
|
||||
|
||||
遥控专项入口为`test/iec104_command_test.c`,复用TCP事件环测试的可控Net后端,但独立驱动Slave和Command,不依赖示例的应用状态。`./scripts/build.ps1 -Test`同时构建和执行TCP容量1/2 × 遥控独立应答槽1/4的四种组合,每种27组。库源文件须包含`104/business/IEC104_Command.c`,测试本身包含可控TCP实现,不再额外链接Windows Net或第二份TcpServer。
|
||||
命令专项入口为`test/iec104_command_test.c`,复用TCP事件环测试的可控Net后端,但独立驱动Slave和Command,不依赖示例的应用状态。`./scripts/build.ps1 -Test`同时构建和执行TCP容量1/2 × 命令独立应答槽1/4的四种组合,每种53组(原46组迁移及7组按点回归);原45/46基线为每种27组。库源文件须包含`104/business/IEC104_Command.c`,测试本身包含可控TCP实现,不再额外链接Windows Net或第二份TcpServer。
|
||||
|
||||
遥控覆盖45/46选择和直接执行、匹配/忙拒绝/撤销、三类动作结果、成功失败及终止配置、零/多帧返回信息、完整ASDU校验、全局FIFO、回复池满、窗口/部分写入、结果先于确认、重复及迟到事件、FINISHED配对、三个期限和时钟倒退(含期限配置0)、STOP提交竞态/FATAL、NORMAL覆盖反例、站点删除重注册、引用和单/双服务生命周期。真实回环另验证45/46返回信息及终止、TEST、广播/未知IOA、47/58兜底和遥控后总召读到新值。
|
||||
命令原有覆盖45/46选择和直接执行、匹配/忙拒绝/撤销、三类动作结果、成功失败及终止配置、零/多帧返回信息、完整ASDU校验、全局FIFO、回复池满、窗口/部分写入、结果先于确认、重复及迟到事件、FINISHED配对、三个期限和时钟倒退(含期限配置0)、STOP提交竞态/FATAL、NORMAL覆盖反例、站点删除重注册、引用和单/双服务生命周期。扩展覆盖47–51/58–64;当前默认配置检查全局type_mask=0x3FFF及points=NULL、point_count=0。未启用47/58返回IGNORED的用例显式裁剪全局掩码,直接/选择执行由各点模式配置;非法配置使用保留bit14/15,另拒绝SELECT_EXECUTE点包含51/64、非法点表和时区越界。
|
||||
|
||||
全局默认掩码的14种完整流程测试提供显式点表:51/64配置DIRECT,其他类型配置SELECT_EXECUTE;7种带时标类型先验证无时间基准时否定,再设置基准走完流程。另单独检查原样默认空表不会执行点,避免把全局类型启用误认为已经配置命令点。
|
||||
|
||||
新增7组按点回归:原样默认空表逐14型;17项非法配置覆盖NULL/count配对、元素数乘法上限、CA/IOA范围、严格排序/唯一性、非法模式/点掩码及51/64模式限制;同类型不同点混合DIRECT/SELECT_EXECUTE及CA隔离;全局/点掩码交集及Config按值复制、点表只读借用;查点早于忙、决定期间同点静默/SELECTED跨类型MISMATCH/时效先于点策略;二分查找首中末、空隙及CA/IOA边界;选择超时、STOP和站点重新注册后的策略及身份隔离。完整实跑结果见最新验证记录。
|
||||
|
||||
变长输入采用测试侧独立手写长度表及报文字节,不共用Command布局清单。核对规范长度、额外尾字节、SQ、非法状态/CP56及NaN/Inf、带值动作参数、完整确认/撤销/终止回显;已知类型截短由Receiver拒绝,不能误记为Command接手并计rejected。匹配比较值与QU/QL并屏蔽S/E,CP56可不同,浮点+0/−0或跨类型仍失配;51/64数据位及CP56首字节不能被误读为S/E。回复池容量1/4下核对混合长度FIFO、WAIT重试和槽复用后的有效长度。
|
||||
|
||||
时标回归覆盖max=0、IV及UTC换算、无基准、等于/小于max、毫秒余数、超前、SU和时区、单调倒退与推算越界、回调内Set/Clear限制、失败设置保留原基准及STOP/断线保留基准。检查决定期间同点丢弃、忙时过期、SELECTED过期执行及寻址错误的顺序,区分time_expired、time_rejected、rejected与dropped_requests。真实回环核对45/46/49/58/59/62完整流程、限值拒绝、操作后总召当前值、47兜底,以及过期58没有应答、事件或动作。
|
||||
|
||||
决定期间同点激活的4组专项回归覆盖45/46、SELECT_WAIT与直接/选择后EXECUTE_WAIT、事件已取/未取、同批输入及发送背压。检查相同或不同命令字段均只增加dropped_requests,原事件、动作参数、回显和决定期限不变,不产生抢先的忙否定;另验证到期FINISHED配对、格式校验/type_mask/撤销/其他点忙拒绝,以及同CA重注册、STOP和重连的身份边界。
|
||||
|
||||
当前业务测试由99组总召、12组计数量、4组兜底及16组校时组成,共131组,单/双服务配置各跑一次。总召在原98组基础上新增双点批次发送WAIT后读取最新值的回归,验证站总召和遥信分组的单点/双点帧序、游标只在提交OK后推进;真实TCP另核对双点遥控后总召读到更新值。计数量覆盖独立实例、请求校验、Type15/37批次边界、忙隔离、冻结/复位、动作重复调用和WAIT/STALE/TEST、业务期限、STOP/断线、共享连接失败、发送背压及多站广播;兜底改用未支持的106/102,覆盖同批与反序/重复内容、窗口与写阻塞、HIGH满丢新及恢复、STOP/STOPSTART取消和活动总召中的应答。校时专项检查独立受理与执行、原文确认、补偿/期限、广播及生命周期。`iec104_interrogation_rules_test.c`另有3组规则测试,遍历限定词、数据COT和类型/SQ/FRZ矩阵并检查解析;没有网络交互。
|
||||
当前业务测试由99组总召、12组计数量、4组兜底、17组校时/时间接线和1组命令点表接线组成,共133组,单/双服务配置各跑一次。总召在原98组基础上新增双点批次发送WAIT后读取最新值的回归,验证站总召和遥信分组的单点/双点帧序、游标只在提交OK后推进;真实TCP另核对双点遥控后总召读到更新值。计数量覆盖独立实例、请求校验、Type15/37批次边界、忙隔离、冻结/复位、动作重复调用和WAIT/STALE/TEST、业务期限、STOP/断线、共享连接失败、发送背压及多站广播;兜底改用未支持的106/102,覆盖同批与反序/重复内容、窗口与写阻塞、HIGH满丢新及恢复、STOP/STOPSTART取消和活动总召中的应答。校时专项检查独立受理与执行、原文确认、补偿/期限、广播及生命周期;1组用mock Clock_Read/Set验证system启动、60秒刷新、失败清基准、校时回调外移交和NULL Command,仍链接真实Clock库,但不设置宿主系统时间。命令接线验证24个点、可配置CA及三组末点直接执行。`iec104_interrogation_rules_test.c`另有3组规则测试,遍历限定词、数据COT和类型/SQ/FRZ矩阵并检查解析;没有网络交互。
|
||||
|
||||
在项目根目录的PowerShell中执行,要求GCC可用。下述TCP事件环和调度测试已包含TcpServer实现且自行实现Net接口,构建时不要再次链接`IEC104_TcpServer.c`或`IEC104_Net_Windows.c`。
|
||||
|
||||
@@ -152,7 +160,7 @@ if ($LASTEXITCODE -ne 0) { throw 'Slave replies tests failed' }
|
||||
./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。这里没有真实计量设备、系统设时或遥控,不构成完整互操作认证。
|
||||
脚本输出单/双服务各`Slave service: 32 groups passed ...`、各`slave example + event interrogation tests: 133 groups passed ...`,以及四组命令专项、`interrogation rules: 3 groups passed ...`和`Slave example loopback: passed ...`。可控后端使用251字节HIGH和2槽召唤业务事件FIFO。真实回环使用默认存储、k=1、随机本机端口,验证总召与计数量交错、冻结/复位及后续读取、分组/广播、校时、混合点模式的命令操作、兜底、STOP/START、重连及正常退出。真实TCP校时使用模拟模式,system接线用mock单测,命令操作内存点表;实际主站、设备输出及宿主系统设时未纳入这组自动回归,不构成完整互操作认证。当前实际通过数量、STOP统计和测量产物见第5节。
|
||||
|
||||
## 3. 覆盖范围
|
||||
|
||||
@@ -219,7 +227,7 @@ if ($LASTEXITCODE -ne 0) { throw 'Large configuration tests failed' }
|
||||
|
||||
### 遥控固定存储与栈测量
|
||||
|
||||
2026-10-30 Windows x64、GCC 16.1.0、`-O2`实测(单位字节):
|
||||
下表是2026-10-30的45/46版本历史基线,Windows x64、GCC 16.1.0、`-O2`实测(单位字节);不是扩展后的当前容量:
|
||||
|
||||
| 对象 | 应答槽1 | 应答槽4(默认) |
|
||||
|---|---|---|
|
||||
@@ -228,12 +236,51 @@ if ($LASTEXITCODE -ne 0) { throw 'Large configuration tests failed' }
|
||||
| 单独立应答槽 | 56 | 56 |
|
||||
| Request / Event / Status | 48 / 88 / 120 | 48 / 88 / 120 |
|
||||
|
||||
默认TCP服务容量1时Command静态实例数组为616字节;容量2时实例数组按实例数增长。上述不含既有Slave、TCP和发送队列。探针源文件及可执行程序位于`.build/command-v1/size_probe.c`、`size_probe_1.exe`及`size_probe_4.exe`,探针包含Command实现以测量私有结构,只作本地测量,不增加公开接口。
|
||||
该历史版本在默认TCP服务容量1时Command静态实例数组为616字节;容量2时实例数组按实例数增长。上述不含既有Slave、TCP和发送队列。探针源文件及可执行程序位于`.build/command-v1/size_probe.c`、`size_probe_1.exe`及`size_probe_4.exe`,探针包含Command实现以测量私有结构,只作本地测量,不增加公开接口。
|
||||
|
||||
`-fstack-usage`单函数栈帧:Command Handle_Event 208、Accept 128、Submit_Return_Info 144、Submit_Head 144、Process 64字节;示例main由800增至848字节,模拟动作8字节。原始记录为`.build/command-v1/command-stack.su`、`example-before.su`及`example-after.su`。这些是Windows宿主ABI的单函数测量,不是最坏调用链或其他目标工具链的内存预算。
|
||||
历史`-fstack-usage`单函数栈帧:Command Handle_Event 208、Accept 128、Submit_Return_Info 144、Submit_Head 144、Process 64字节;示例main由800增至848字节,模拟动作8字节。原始记录为`.build/command-v1/command-stack.su`、`example-before.su`及`example-after.su`。这些是Windows宿主ABI的单函数测量,不是最坏调用链或其他目标工具链的内存预算。
|
||||
|
||||
2026-10-31的5a内部泛化阶段仍只启用45/46,但已由14种布局生成21字节最大缓冲。Windows x64实测实例为480/672字节(回复槽1/4),事务槽192、回复槽64,Request/Event/Config/Status仍为48/88/20/120。`-O2 -fstack-usage`单函数帧为Decode_Element 144、Copy_Request 96、Submit_Head 176、Handle_Event 304、Process 64、NextEvent 144、Accept 144、Submit_Return_Info 144字节;修改前同次探针的NextEvent为160字节。最终启用遥调和时标后的数值另记,不能把这一中间阶段当作最终内存预算。
|
||||
|
||||
5b增加value并启用47–51后,上述sizeof及栈帧测量均与5a相同;在此x64 ABI中value恰好使用Request原有对齐空隙,不代表其他目标布局不变。该阶段全量构建通过Slave 32组×2、示例131组×2、Command 33组×4、规则3组及真实TCP设定值流程,49执行后的总召读回通过。
|
||||
|
||||
5c启用58–64并加入时间基准后的最终Windows x64测量:
|
||||
|
||||
| 对象 | 应答槽1 | 应答槽4(默认) |
|
||||
|---|---|---|
|
||||
| Command实例 | 512 | 704 |
|
||||
| 单事务槽 / 单独立应答槽 | 192 / 64 | 192 / 64 |
|
||||
| Request / Event | 80 / 120 | 80 / 120 |
|
||||
| Config / Status | 28 / 128 | 28 / 128 |
|
||||
|
||||
相对45/46历史基线,每实例增加64/88字节;默认单服务Command静态实例数组为704字节。容量仍由布局清单最大规范长度推导,当前为21,不是接收时分配。最终GCC `-O2 -fstack-usage`单函数帧:Decode_Element 144、Copy_Request 112、Submit_Head 176、Handle_Event 288、Process 64、NextEvent 176、Accept 176、Submit_Return_Info 144字节。公开头C++11严格编译检查通过。以上仍为宿主单函数帧,不是调用链上界;STM32F4须以目标工具链重新测量,不能用这些数字代替目标RAM/栈预算。
|
||||
|
||||
本轮产物统一保存在`.build/command-extension-20261031/`,包含修改前`before/`、三个阶段的`5a/`、`5b/`、`5c/`及`RESULTS.txt`。私有故障探针另验证保存原文损坏时的两条收尾路径:未交付工作事件时NextEvent返回ERROR且不产生事件;已交付后Accept返回ERROR、不调用动作或发肯定确认,FINISHED(SERVICE_ERROR)恰好一次,读完后事务槽可复用。
|
||||
|
||||
按点配置版的当前Windows x64实测:Command实例由512/704增至528/720字节(回复槽1/4),Config由28增至48字节;事务192、回复槽64、Request80、Event120、Status128字节保持不变。每个IEC104_CommandPoint_t为16字节,由应用持有;示例ExampleApp为1848字节,其中24项点表占384字节静态RAM,因main中的ExampleApp为static,不计作main局部栈。
|
||||
|
||||
本版GCC `-O2 -fstack-usage`测得Create从48增至64字节、Handle_Event从288增至304字节;Decode_Element 144、Copy_Request 112、Submit_Head 176、Process 64、NextEvent 176、Accept 176、Submit_Return_Info 144字节保持不变。C++11公开头和点表初始化检查通过。产物目录为`.build/command-point-config-20261031/`;这些数值仍只针对宿主ABI,完整构建及回环验收见第5节。
|
||||
|
||||
## 5. 验证记录
|
||||
|
||||
2026-10-31 示例逐点显式配置:Example_Init_Command改为局部const点表逐行列出24个CA/IOA、类型掩码及模式,移除配置生成的嵌套循环和末点判断;运行时common_address保留`--ca`支持。Create前复制到ExampleApp.command_points稳定数组供模块借用,三组地址描述只作运行值映射。既有IOA、类型、执行模式和点表寿命均不变,不新增测试组。`./scripts/build.ps1 -Test`严格GCC构建无警告、退出0:Command 53组×4、示例133组×2、Slave 32组×2、规则3组及真实TCP点模式与六种命令完整流程全部通过。修改前快照及证据位于`.build/command-explicit-points-20261031/`。
|
||||
|
||||
本次GCC `-O2 -fstack-usage`修改前后测量:Example_Init_Command均内联到main,没有独立帧;main均为864字节,Example_Command_Point均为40字节。局部表理论大小384字节,但该编译配置下最终main帧未增加;ExampleApp和持久点数组布局未改。编译无警告,原始测量为任务目录内的`example-before.su`和`example-after.su`,不能将该优化结果当作其他工具链的栈保证。
|
||||
|
||||
2026-10-31 原生按点配置:移除全局select_required_mask,Config新增借用的points/point_count;按CA/IOA严格有序且唯一的点表配置允许类型及DIRECT/SELECT_EXECUTE。全局默认14种但空点表不执行命令;51/64只能DIRECT。查点放在撤销、决定期间同点丢弃、时标及SELECTED匹配之后、忙检查之前,保留跨类型MISMATCH和现有事务语义。示例24点中6008/6108/6308直接执行,其余21点先选择;时间策略不变。
|
||||
|
||||
本轮`./scripts/build.ps1 -Test`退出0,GCC `-std=c11 -O2 -Wall -Wextra -Werror`构建零警告;Command 53组×4、示例133组×2、Slave 32组×2、规则3组及真实Windows TCP回环全部通过。回环覆盖点级直接/选择执行、六种命令完整流程、直接点SELECT/未选执行/点类型拒绝、数值限值、时效、总召新值、STOP及重连;STOP为submitted=83、gi_submitted=11、command_selected=7、command_executed=9、command_completed=9、command_returns=9、command_time_expired=1、command_time_rejected=0。
|
||||
|
||||
尺寸及栈增量见第4节;C++11头文件及点表初始化、调用流程内实际两点示例的C11/C++11严格语法编译均通过。17份Markdown的357个本地链接及锚点、UTF-8/LF、16个公开函数覆盖和diff空白检查通过。修改前快照及验证证据位于`.build/command-point-config-20261031/`;修改与检查仅限IEC60870-Slave,未设置宿主时钟或进行目标硬件验收。下方记录中的类型选择掩码仅代表当时版本。
|
||||
|
||||
2026-10-31 默认启用全部控制命令:按应用接入要求,Config_Default的type_mask改为45–51/58–64全部14位(0x3FFF),select_required_mask默认排除没有S/E的51/64(0x1FBF),其余12种仍须先选择。应用裁剪类型时同步裁剪选择掩码;示例显式赋值为已接入的45/46/49/58/59/62,保留未接入47等类型的44兜底。10秒窗口、UTC+8及过期静默策略不变。新增默认14种类型完整受理与执行回归,`./scripts/build.ps1 -Test`严格GCC构建零警告、退出码0:Command 46组×4、示例132组×2、Slave 32组×2、规则3组和真实TCP六类命令流程均通过。此变更只调整默认掩码,不改变结构布局;Request/Event/Status保持80/120/128字节。修改前快照位于`.build/command-default-all-20261031/before/`;下方三阶段记录保留变更前事实。
|
||||
|
||||
2026-10-31 遥调与带时标命令:在原Command模块内分5a布局泛化、5b遥调、5c时标三阶段完成45–51/58–64扩展。5a原45/46逐字节回归四配置各27组保持预期通过,5b增加到33组;最终`./scripts/build.ps1 -Test`通过严格GCC构建及全部运行,Slave 32组×2、示例132组×2、Command 45组×4及规则3组均通过,真实Windows TCP回环通过。该次验收时默认类型为45/46,额外类型显式启用;X-macro统一推导规范长度和21字节容量,原文、回复及FIFO使用有效长度。
|
||||
|
||||
本轮回环覆盖45/46/49/58/59/62选择、执行、返回信息及ACT_TERM;49/62写入的遥测和58/59更新的遥信由既有总召读回,初值与帧序保持兼容。过期58与106同批发送,核对106应答、后续计数量全部帧和统计,确认没有58应答或动作。STOP实测submitted=83、gi_submitted=11,command_selected=7、command_executed=6、command_completed=6、command_returns=6、command_time_expired=1、command_time_rejected=0。时间边界、IV/SU、时区、基准异常、撤销和匹配顺序由可控时钟专项覆盖;system读时接线使用mock,未设置宿主时钟。
|
||||
|
||||
三阶段sizeof及GCC栈帧见第4节;公开头C++11检查、内部原文损坏收尾探针通过。17份Markdown的356个本地链接及锚点、UTF-8/LF、16个公开函数在API文档中的覆盖和diff空白检查均通过。基线快照、阶段产物和RESULTS记录位于`.build/command-extension-20261031/`。所有修改及验证限于IEC60870-Slave目录,未执行父工程Keil构建、目标RAM/栈测量或硬件主站联调;宿主结果不代替这些验收。
|
||||
|
||||
2026-10-30 恢复双点遥控地址映射:Type46命令恢复为十进制6101..6108,对应Type3遥信仍为1101..1108。示例帮助、当前说明和回环请求同步更新。原EXE被运行进程占用时首次构建链接失败;用户关闭后,`./scripts/build.ps1`成功更新常规示例EXE,严格GCC构建无诊断。真实TCP回环验证6103选择/执行后返回1103,后续站总召、遥信分组及重连均读到新值,并通过既有单点遥控、撤销、错误应答及生命周期场景。沙箱内首次回环因Node启动子进程EPERM失败,获准在沙箱外重跑相同命令后退出码0。
|
||||
|
||||
2026-10-30 双点遥信加入总召:QOI20按Type1、Type3、Type11依次返回各8点,共8帧;QOI21返回单点及双点共6帧,QOI22仅遥测仍4帧。沿用1101..1108及double_values,每批4点、每次发送重试重取值;只新增双点遍历游标,不增加点值数组或发送缓冲。TCP容量1/2下各131组示例C测试通过,严格GCC构建无诊断;真实TCP验证Type46操作1103后,站总召、遥信分组及重连读回均为新值,STOP submitted=83、gi_submitted=11。原示例进程运行中,`./scripts/build.ps1`因无法覆盖被占用的exe而链接失败;随后以相同源文件及编译参数生成`.build/slave-example/iec104_slave_example_double_gi.exe`并通过回环,未中断当前连接。旧进程退出后,常规`./scripts/build.ps1`重跑成功,更新`iec104_slave_example.exe`,退出码0。可控测试产物为同目录`iec104_slave_example_double_test_1.exe`及`_2.exe`。
|
||||
|
||||
Reference in New Issue
Block a user