步骤D:用例 22_multi_instance(FB 共享体多实例隔离,a=102/204/306)+ 全量回归

This commit is contained in:
2026-08-27 09:21:22 +08:00
parent c19e306512
commit 766e3a39b2
8 changed files with 61 additions and 2 deletions
+2 -1
View File
@@ -27,6 +27,7 @@
| 19_recursive_call | 负例 | 编译 | REJECTED ok | link error: recursive call | | 19_recursive_call | 负例 | 编译 | REJECTED ok | link error: recursive call |
| 20_line1 | 正例 | 编译+执行 | ok | 真值表 4 行全对 | | 20_line1 | 正例 | 编译+执行 | ok | 真值表 4 行全对 |
| 21_var_temp | 正例 | 编译+执行 | ok | VAR_TEMP 每周期重置(a=10107/10108/10109 | | 21_var_temp | 正例 | 编译+执行 | ok | VAR_TEMP 每周期重置(a=10107/10108/10109 |
| 22_multi_instance | 正例 | 编译+执行 | ok | FB 共享体多实例隔离(a=102/204/306 |
## line1 真值表(回放:io.input 顺序 EmergencyStop, I0_0I0_1=0 未绑定) ## line1 真值表(回放:io.input 顺序 EmergencyStop, I0_0I0_1=0 未绑定)
@@ -37,4 +38,4 @@
| 1 | 0 | 0 | ok(急停生效) | | 1 | 0 | 0 | ok(急停生效) |
| 0 | 1 | 1 | ok | | 0 | 1 | 1 | ok |
**结论:21/21 用例符合期望,ctest 14/14,全部绿。** **结论:22/22 用例符合期望,ctest 14/14,全部绿。**
@@ -0,0 +1,6 @@
# 期望:编译通过;FB 共享体多实例隔离
- Counter 编译为**单一共享函数**fn 0),MAIN 两次 `CALL 0`(c1/c2 各一次,c2 两次调用)
- 调用点 `LOADK r1` 装载**不同实例地址**(值区偏移),字段访问 `LOAD_PTR/STORE_PTR r1+off`
- `count` 是实例字段:c1 每周期 +1、c2 每周期 +2,互不干扰
- 全局 `a = c1.q * 100 + c2.q`:周期 1/2/3 = 102 / 204 / 306
+4
View File
@@ -0,0 +1,4 @@
(* globals.st *)
VAR_GLOBAL
a : INT;
END_VAR
+27
View File
@@ -0,0 +1,27 @@
(* main.st *)
FUNCTION_BLOCK Counter
VAR_INPUT
inc : BOOL;
END_VAR
VAR_OUTPUT
q : INT;
END_VAR
VAR
count : INT;
END_VAR
IF inc THEN
count := count + 1;
END_IF
q := count;
END_FUNCTION_BLOCK
PROGRAM MAIN
VAR
c1 : Counter;
c2 : Counter;
END_VAR
c1(inc := TRUE);
c2(inc := TRUE);
c2(inc := TRUE);
a := c1.q * 100 + c2.q;
END_PROGRAM
@@ -0,0 +1,11 @@
[project]
name = "case22"
entry = "program MAIN"
cycle_limit = 1000
dt_ms = 10
[files]
st = ["globals.st", "main.st"]
[gvl]
file = "globals.st"
+1
View File
@@ -66,6 +66,7 @@ namespace {
{"19_recursive_call", Outcome::CompileError, "recursive call"}, {"19_recursive_call", Outcome::CompileError, "recursive call"},
{"20_line1", Outcome::Ok, ""}, {"20_line1", Outcome::Ok, ""},
{"21_var_temp", Outcome::Ok, ""}, {"21_var_temp", Outcome::Ok, ""},
{"22_multi_instance", Outcome::Ok, ""},
}; };
bool run_case(const char* dir, Outcome want, const char* keyword) { bool run_case(const char* dir, Outcome want, const char* keyword) {
+1 -1
View File
@@ -202,7 +202,7 @@ static bool test_all_cases() {
} }
++n; ++n;
} }
CHECK(n == 21); CHECK(n == 22);
return true; return true;
} }
+9
View File
@@ -374,6 +374,15 @@ static bool test_cases_positive() {
CHECK(m.run_cycle() == vm::Fault::None); CHECK(m.run_cycle() == vm::Fault::None);
CHECK(slot(m, 0) == 10109); CHECK(slot(m, 0) == 10109);
// 22 多实例共享体:Counter 单函数服务 c1/c2a = 102/204/306
CHECK(make_machine("tests/cases/22_multi_instance", &m, &err));
m.run_cycle();
CHECK(slot(m, 0) == 102);
m.run_cycle();
CHECK(slot(m, 0) == 204);
CHECK(m.run_cycle() == vm::Fault::None);
CHECK(slot(m, 0) == 306);
// 20 line1I 组合 → Q0_0 真值表(槽 0=急停 1=I0_0 2=I0_1 3=Q0_0 // 20 line1I 组合 → Q0_0 真值表(槽 0=急停 1=I0_0 2=I0_1 3=Q0_0
CHECK(make_machine("tests/cases/20_line1", &m, &err)); CHECK(make_machine("tests/cases/20_line1", &m, &err));
struct { struct {