From 766e3a39b255a2a7c84ef74a74e43e26a989b24b Mon Sep 17 00:00:00 2001 From: chentianya Date: Thu, 27 Aug 2026 09:21:22 +0800 Subject: [PATCH] =?UTF-8?q?=E6=AD=A5=E9=AA=A4D=EF=BC=9A=E7=94=A8=E4=BE=8B?= =?UTF-8?q?=2022=5Fmulti=5Finstance=EF=BC=88FB=20=E5=85=B1=E4=BA=AB?= =?UTF-8?q?=E4=BD=93=E5=A4=9A=E5=AE=9E=E4=BE=8B=E9=9A=94=E7=A6=BB=EF=BC=8C?= =?UTF-8?q?a=3D102/204/306=EF=BC=89+=20=E5=85=A8=E9=87=8F=E5=9B=9E?= =?UTF-8?q?=E5=BD=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Doc/全量验证表.md | 3 ++- tests/cases/22_multi_instance/EXPECTED.md | 6 +++++ tests/cases/22_multi_instance/globals.st | 4 ++++ tests/cases/22_multi_instance/main.st | 27 ++++++++++++++++++++++ tests/cases/22_multi_instance/project.toml | 11 +++++++++ tests/src/cases_test.cpp | 1 + tests/src/compiler_test.cpp | 2 +- tests/src/vm_test.cpp | 9 ++++++++ 8 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 tests/cases/22_multi_instance/EXPECTED.md create mode 100644 tests/cases/22_multi_instance/globals.st create mode 100644 tests/cases/22_multi_instance/main.st create mode 100644 tests/cases/22_multi_instance/project.toml 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 {