diff --git a/Doc/全量验证表.md b/Doc/全量验证表.md index 739e5d9..3379440 100644 --- a/Doc/全量验证表.md +++ b/Doc/全量验证表.md @@ -27,6 +27,7 @@ | 19_recursive_call | 负例 | 编译 | REJECTED ok | link error: recursive call | | 20_line1 | 正例 | 编译+执行 | ok | 真值表 4 行全对 | | 21_var_temp | 正例 | 编译+执行 | ok | VAR_TEMP 每周期重置(a=10107/10108/10109) | +| 22_multi_instance | 正例 | 编译+执行 | ok | FB 共享体多实例隔离(a=102/204/306) | ## line1 真值表(回放:io.input 顺序 EmergencyStop, I0_0;I0_1=0 未绑定) @@ -37,4 +38,4 @@ | 1 | 0 | 0 | ok(急停生效) | | 0 | 1 | 1 | ok | -**结论:21/21 用例符合期望,ctest 14/14,全部绿。** +**结论:22/22 用例符合期望,ctest 14/14,全部绿。** diff --git a/tests/cases/22_multi_instance/EXPECTED.md b/tests/cases/22_multi_instance/EXPECTED.md new file mode 100644 index 0000000..f114d4a --- /dev/null +++ b/tests/cases/22_multi_instance/EXPECTED.md @@ -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 diff --git a/tests/cases/22_multi_instance/globals.st b/tests/cases/22_multi_instance/globals.st new file mode 100644 index 0000000..1b42e52 --- /dev/null +++ b/tests/cases/22_multi_instance/globals.st @@ -0,0 +1,4 @@ +(* globals.st *) +VAR_GLOBAL + a : INT; +END_VAR diff --git a/tests/cases/22_multi_instance/main.st b/tests/cases/22_multi_instance/main.st new file mode 100644 index 0000000..c1b2c76 --- /dev/null +++ b/tests/cases/22_multi_instance/main.st @@ -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 diff --git a/tests/cases/22_multi_instance/project.toml b/tests/cases/22_multi_instance/project.toml new file mode 100644 index 0000000..b78828d --- /dev/null +++ b/tests/cases/22_multi_instance/project.toml @@ -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" diff --git a/tests/src/cases_test.cpp b/tests/src/cases_test.cpp index 2dd9956..40ab3dc 100644 --- a/tests/src/cases_test.cpp +++ b/tests/src/cases_test.cpp @@ -66,6 +66,7 @@ namespace { {"19_recursive_call", Outcome::CompileError, "recursive call"}, {"20_line1", Outcome::Ok, ""}, {"21_var_temp", Outcome::Ok, ""}, + {"22_multi_instance", Outcome::Ok, ""}, }; bool run_case(const char* dir, Outcome want, const char* keyword) { diff --git a/tests/src/compiler_test.cpp b/tests/src/compiler_test.cpp index 337f51a..073c5ee 100644 --- a/tests/src/compiler_test.cpp +++ b/tests/src/compiler_test.cpp @@ -202,7 +202,7 @@ static bool test_all_cases() { } ++n; } - CHECK(n == 21); + CHECK(n == 22); return true; } diff --git a/tests/src/vm_test.cpp b/tests/src/vm_test.cpp index 019f9d4..b1dd07e 100644 --- a/tests/src/vm_test.cpp +++ b/tests/src/vm_test.cpp @@ -374,6 +374,15 @@ static bool test_cases_positive() { CHECK(m.run_cycle() == vm::Fault::None); CHECK(slot(m, 0) == 10109); + // 22 多实例共享体:Counter 单函数服务 c1/c2,a = 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 line1:I 组合 → Q0_0 真值表(槽 0=急停 1=I0_0 2=I0_1 3=Q0_0) CHECK(make_machine("tests/cases/20_line1", &m, &err)); struct {