步骤D:用例 22_multi_instance(FB 共享体多实例隔离,a=102/204/306)+ 全量回归
This commit is contained in:
+2
-1
@@ -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_0;I0_1=0 未绑定)
|
## line1 真值表(回放:io.input 顺序 EmergencyStop, I0_0;I0_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
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
(* globals.st *)
|
||||||
|
VAR_GLOBAL
|
||||||
|
a : INT;
|
||||||
|
END_VAR
|
||||||
@@ -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"
|
||||||
@@ -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) {
|
||||||
|
|||||||
@@ -202,7 +202,7 @@ static bool test_all_cases() {
|
|||||||
}
|
}
|
||||||
++n;
|
++n;
|
||||||
}
|
}
|
||||||
CHECK(n == 21);
|
CHECK(n == 22);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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/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)
|
// 20 line1:I 组合 → 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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user