chore(编号): 存量编号全量转语义短语,门禁识别面与语料同批重打
登记簿、文档与代码注释里的存量字母加数字编号(N-x / S-x / T-x / E-x / A-x / 卡号) 一律改写为语义短语,净删 2,028 处引用;删除基线与待确认、并行分道方案、排期详述、 采集保护收尾 4 篇(内容已并入 docs/任务规划/README 与登记簿)。 门禁机器与三张账同批重打:check_ids.py 新增变更记录行豁免与第二根护栏 undecidable_total_ceiling;check_test_traceability.py 只加 stdout/stderr UTF-8 reconfigure(TC_RE 未动);check_cubemx_survival.py 的 --write 固定 newline=LF; id_registry / id_aliases(+19 条 retired-to-phrase)/ id_known_backlog 重打。 test/ 56 个文件同步 TC 标签语义化,其中 18 个 TU 改了 CHECK / printf 里的标签文字, 是本批唯一改变构建产物的文件集合。 为什么合成一笔、不拆四笔(实测撞闸,非偏好):pre-commit 跑钩子前会 stash 未 staged 部分,拆开后中间提交必然是「新规则 + 旧语料」——实跑可判定 85.15% < 基线 86.00%、 不可判定 1,453 > 上限 1,166,编号门禁直接拦下。编号识别面与它描述的语料只能同码移动。 实跑基线(工作区全量):754 文件 / 8,230 处编号字面量 / 可判定 7,079 = 86.01% (基线 86.0%,容差 0.1pp)/ 不可判定绝对数 1,151(上限 1,166)/ 校验 1-6 错误级 0 / 告警 = 悬空 2(App/algo/freq.c 的 S2,属 §4.4 同号不同义)+ 孤儿 50。 基线从 84.0 抬到 86.0 的理由见 docs/门禁说明/id-check.md §7.6:本批真删了 2,028 处 引用,可判定面随真实内容上升,不是把分母做小。同批新增排除 docs/硬件平台/ 语料,使 识别面少 264 处——芯片手册位号与网表料号不属编号空间(registry 有 excluded_paths_note)。 ⚠ 余量只剩 0.11pp(约 10 处)与绝对数 15 处:把「可判定的引用」改成散文会立刻撞第二 根护栏。另遗留一项:id_aliases 里 retired 的 N / S / T / A 别名没有 scope(U1~U5 有), 今后有人新写一个 A-4,校验 3 不会响,只能靠人,建议下批补 scope。 固件不变证据:115 个 .c/.h 剥注释并归一字符串后与 HEAD 逐字节全等,残留代码差异 0; App / Src / Drivers 的字符串字面量零改动。@build 0 错误 0 警告;40/40 主机套件、2,889 断言全通过;覆盖率 line 89.2% / func 92.6%;pre-commit 48 钩子 --all-files 全绿; check_doc_links --all 通过(176 文档,章节引用无法判定 0);逐字节卫生核过:14 个带 BOM 文件与 HEAD 一致、0 个 CR、0 个 U+FFFD,字符串字面量纯 ASCII。 .cubemx_survival_baseline.json 的 watchdog-module 哈希 56bf27 变 2bb051 属合法: Src/freertos.c 的 USER CODE 区内只有注释文字随编号改写,代码未变。 同批带上体积同码凭证与 RAM 台账行(@build 之后盖戳):RW_IRAM1 79,008 B / 60.3%, RW_CCM 57,376 B / 87.9%,阈值 92%。
This commit is contained in:
@@ -36,7 +36,7 @@
|
||||
* TC-IEC104-023 k 窗满 COV 不丢事件(pend 暂存,窗开后补发)
|
||||
* —— 以下为「数据可信」卡 9/卡 11(道D,2026-10-25;板端默认源 = 真实
|
||||
L2 链 ring→phasor→freq→meas,非桩)——
|
||||
* TC-IEC104-025 板端源读快照(024 号被存量 B7 用例的裸标签占用):未发布
|
||||
* TC-IEC104-025 板端源读快照(024 号已归 B7 用例):未发布
|
||||
* IV|NT / 值=基波有效值 / 削顶 CLIPPED
|
||||
* →线上 IV 清零 / 干净路品质 0 / 频率未新鲜 IV
|
||||
* TC-IEC104-026 0x401D 绑频:收敛后 ±0.02 Hz / freq_valid==0 → IV 清零
|
||||
@@ -440,17 +440,17 @@ static void tc_cp56(void)
|
||||
|
||||
iec104_epoch_ms_to_cp56(e1, b);
|
||||
rc = iec104_cp56_to_epoch_ms(b, &back);
|
||||
CHECK((rc == 0) && (back == e1), "TC-001 CP56 round trip on 2000-01-01");
|
||||
CHECK((rc == 0) && (back == e1), "TC-IEC104-001 CP56 round trip on 2000-01-01");
|
||||
iec104_epoch_ms_to_cp56(e2, b);
|
||||
back = 0u;
|
||||
rc = iec104_cp56_to_epoch_ms(b, &back);
|
||||
CHECK((rc == 0) && (back == e2), "TC-001 CP56 round trip on the leap day 2024-02-29");
|
||||
CHECK((rc == 0) && (back == e2), "TC-IEC104-001 CP56 round trip on the leap day 2024-02-29");
|
||||
b[2] |= 0x80u;
|
||||
CHECK(iec104_cp56_to_epoch_ms(b, &back) == -2, "TC-001 IV -> -2");
|
||||
CHECK(iec104_cp56_to_epoch_ms(b, &back) == -2, "TC-IEC104-001 IV -> -2");
|
||||
iec104_epoch_ms_to_cp56(0u, b); /* 早于 2000 → 钳位 */
|
||||
back = 0u;
|
||||
(void)iec104_cp56_to_epoch_ms(b, &back);
|
||||
CHECK(back == e1, "TC-001 a value before 2000 is clamped");
|
||||
CHECK(back == e1, "TC-IEC104-001 a value before 2000 is clamped");
|
||||
}
|
||||
|
||||
static void tc_ioa_float(void)
|
||||
@@ -459,12 +459,12 @@ static void tc_ioa_float(void)
|
||||
|
||||
iec104_put_ioa(b, 0x123456u);
|
||||
CHECK((iec104_get_ioa(b) == 0x123456u) && (b[0] == 0x56u) && (b[1] == 0x34u)
|
||||
&& (b[2] == 0x12u), "TC-002 IOA is 3 bytes little endian");
|
||||
&& (b[2] == 0x12u), "TC-IEC104-002 IOA is 3 bytes little endian");
|
||||
iec104_put_float(b, 1.0f);
|
||||
CHECK((b[0] == 0x00u) && (b[1] == 0x00u) && (b[2] == 0x80u)
|
||||
&& (b[3] == 0x3Fu), "TC-002 float in IEEE754 little endian");
|
||||
&& (b[3] == 0x3Fu), "TC-IEC104-002 float in IEEE754 little endian");
|
||||
iec104_put_float(b, -12.5f);
|
||||
CHECK(iec104_get_float(b) == -12.5f, "TC-002 float round trip");
|
||||
CHECK(iec104_get_float(b) == -12.5f, "TC-IEC104-002 float round trip");
|
||||
}
|
||||
|
||||
static void tc_apci(void)
|
||||
@@ -476,9 +476,9 @@ static void tc_apci(void)
|
||||
static const uint8_t b[6] = { 0x68u, 4u, 0x07u, 0u, 0u, 0u };
|
||||
|
||||
iec104_link_on_rx(&g_lk, b, 3u, now);
|
||||
CHECK(cap_u_count(0x0Bu) == 0, "TC-003 a half frame triggers nothing");
|
||||
CHECK(cap_u_count(0x0Bu) == 0, "TC-IEC104-003 a half frame triggers nothing");
|
||||
iec104_link_on_rx(&g_lk, &b[3], 3u, now);
|
||||
CHECK(cap_u_count(0x0Bu) == 1, "TC-003 a half frame is reassembled then con");
|
||||
CHECK(cap_u_count(0x0Bu) == 1, "TC-IEC104-003 a half frame is reassembled then con");
|
||||
}
|
||||
{
|
||||
static const uint8_t b[12] = {
|
||||
@@ -489,21 +489,21 @@ static void tc_apci(void)
|
||||
iec104_link_on_rx(&g_lk, b, 12u, now);
|
||||
CHECK((cap_u_count(0x83u) == 1)
|
||||
&& (iec104_link_state(&g_lk) == IEC104_ST_STOPPED),
|
||||
"TC-003 a coalesced frame is handled one by one and STOPDT takes effect");
|
||||
"TC-IEC104-003 a coalesced frame is handled one by one and STOPDT takes effect");
|
||||
}
|
||||
reset_all(now);
|
||||
{
|
||||
static const uint8_t b[6] = { 0x69u, 4u, 0x07u, 0u, 0u, 0u };
|
||||
|
||||
iec104_link_on_rx(&g_lk, b, 6u, now);
|
||||
CHECK(iec104_link_state(&g_lk) == IEC104_ST_IDLE, "TC-003 a bad start byte -> IDLE");
|
||||
CHECK(iec104_link_state(&g_lk) == IEC104_ST_IDLE, "TC-IEC104-003 a bad start byte -> IDLE");
|
||||
}
|
||||
reset_all(now);
|
||||
{
|
||||
static const uint8_t b[6] = { 0x68u, 3u, 0x07u, 0u, 0u, 0u };
|
||||
|
||||
iec104_link_on_rx(&g_lk, b, 6u, now);
|
||||
CHECK(iec104_link_state(&g_lk) == IEC104_ST_IDLE, "TC-003 a bad length -> IDLE");
|
||||
CHECK(iec104_link_state(&g_lk) == IEC104_ST_IDLE, "TC-IEC104-003 a bad length -> IDLE");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -512,10 +512,10 @@ static void tc_startdt(void)
|
||||
uint32_t now = 1000u;
|
||||
|
||||
reset_all(now);
|
||||
CHECK(iec104_link_state(&g_lk) == IEC104_ST_OPEN, "TC-004 open -> OPEN");
|
||||
CHECK(iec104_link_state(&g_lk) == IEC104_ST_OPEN, "TC-IEC104-004 open -> OPEN");
|
||||
handshake(now);
|
||||
CHECK((cap_u_count(0x0Bu) == 1)
|
||||
&& (iec104_link_state(&g_lk) == IEC104_ST_RUN), "TC-004 STARTDT -> RUN");
|
||||
&& (iec104_link_state(&g_lk) == IEC104_ST_RUN), "TC-IEC104-004 STARTDT -> RUN");
|
||||
}
|
||||
|
||||
static void tc_open_ignore(void)
|
||||
@@ -528,11 +528,11 @@ static void tc_open_ignore(void)
|
||||
n = mk_asdu(a, IEC104_T_C_RD_NA_1, 1u, IEC104_COT_REQ, 0u, 1u, 0x4011u, NULL, 0u);
|
||||
feed_i(a, n, now);
|
||||
CHECK((cap_i_count() == 0) && (iec104_link_state(&g_lk) == IEC104_ST_OPEN),
|
||||
"TC-005 an I frame in OPEN state is ignored");
|
||||
"TC-IEC104-005 an I frame in OPEN state is ignored");
|
||||
handshake(now);
|
||||
m_ns = 0u; /* OPEN 忽略不消费序号 → 主站仍从 0 起 */
|
||||
feed_i(a, n, now); /* ns=0 仍有效(序号未被消费) */
|
||||
CHECK(cap_i_count() == 1, "TC-005 after RUN the same ns is answered normally");
|
||||
CHECK(cap_i_count() == 1, "TC-IEC104-005 after RUN the same ns is answered normally");
|
||||
}
|
||||
|
||||
static void tc_interrogation(void)
|
||||
@@ -551,34 +551,34 @@ static void tc_interrogation(void)
|
||||
n = mk_asdu(a, IEC104_T_C_IC_NA_1, 1u, IEC104_COT_ACT, 0u, 1u, 0u, body, 1u);
|
||||
feed_i(a, n, now);
|
||||
CHECK((cap_i_count() == 1) && (cap_i(0, &c) == 0) && (c.type == 100u)
|
||||
&& (c.cot == IEC104_COT_ACTCON), "TC-006 actcon is sent right away, COT7");
|
||||
&& (c.cot == IEC104_COT_ACTCON), "TC-IEC104-006 actcon is sent right away, COT7");
|
||||
iec104_link_poll(&g_lk, now);
|
||||
CHECK(cap_i_count() == 5, "TC-006 the first poll uses the whole budget of 4 frames");
|
||||
CHECK(cap_i_count() == 5, "TC-IEC104-006 the first poll uses the whole budget of 4 frames");
|
||||
CHECK((cap_i(1, &c) == 0) && (c.type == 3u) && (c.cot == IEC104_COT_INIT)
|
||||
&& (c.vsq == (uint8_t)(IEC104_VSQ_SQ | 4u)) && (c.ioa == 1u),
|
||||
"TC-006 YX double-point group, first call COT=4");
|
||||
"TC-IEC104-006 YX double-point group, first call COT=4");
|
||||
CHECK((cap_i(2, &c) == 0) && (c.type == 1u)
|
||||
&& (c.vsq == (uint8_t)(IEC104_VSQ_SQ | 29u)) && (c.ioa == 5u),
|
||||
"TC-006 YX single-point group with 29 points");
|
||||
"TC-IEC104-006 YX single-point group with 29 points");
|
||||
CHECK((cap_i(3, &c) == 0) && (c.type == 13u)
|
||||
&& (c.vsq == (uint8_t)(IEC104_VSQ_SQ | 8u)) && (c.ioa == 0x4011u)
|
||||
&& (c.obj_len == 40u), "TC-006 YC group of 8 points, 40 bytes");
|
||||
&& (c.obj_len == 40u), "TC-IEC104-006 YC group of 8 points, 40 bytes");
|
||||
if (cap_i(3, &c) == 0) {
|
||||
CHECK((iec104_get_float(c.obj) == 111.0f) && (c.obj[4] == 0u),
|
||||
"TC-006 YC value 111.0 with QDS=0");
|
||||
CHECK(c.obj[9] == IEC104_QDS_IV, "TC-006 an invalid channel sets QDS=IV");
|
||||
"TC-IEC104-006 YC value 111.0 with QDS=0");
|
||||
CHECK(c.obj[9] == IEC104_QDS_IV, "TC-IEC104-006 an invalid channel sets QDS=IV");
|
||||
}
|
||||
CHECK((cap_i(4, &c) == 0) && (c.ioa == 0x401Du) && (c.vsq == 1u),
|
||||
"TC-006 frequency as a single point with SQ=0");
|
||||
"TC-IEC104-006 frequency as a single point with SQ=0");
|
||||
iec104_link_poll(&g_lk, now + 100u);
|
||||
CHECK((cap_i_count() == 6) && (cap_i(5, &c) == 0) && (c.type == 100u)
|
||||
&& (c.cot == IEC104_COT_ACTTERM), "TC-006 actterm closes the sequence");
|
||||
&& (c.cot == IEC104_COT_ACTTERM), "TC-IEC104-006 actterm closes the sequence");
|
||||
/* 二召:init 已清 → COT=2 */
|
||||
n = mk_asdu(a, IEC104_T_C_IC_NA_1, 1u, IEC104_COT_ACT, 0u, 1u, 0u, body, 1u);
|
||||
feed_i(a, n, now + 200u);
|
||||
iec104_link_poll(&g_lk, now + 200u);
|
||||
CHECK((cap_i(7, &c) == 0) && (c.type == 3u) && (c.cot == IEC104_COT_BG_SCAN),
|
||||
"TC-006 second call COT=2");
|
||||
"TC-IEC104-006 second call COT=2");
|
||||
/* RBT 位 → COT=4(actcon3 是第 12 个未确认帧 → 先 S 确认窗才开) */
|
||||
n = mk_asdu(a, IEC104_T_C_IC_NA_1, 1u, IEC104_COT_ACT, IEC104_COT_BIT_RBT,
|
||||
1u, 0u, body, 1u);
|
||||
@@ -586,7 +586,7 @@ static void tc_interrogation(void)
|
||||
feed_s(12u, now + 300u);
|
||||
iec104_link_poll(&g_lk, now + 300u);
|
||||
CHECK((cap_i(12, &c) == 0) && (c.type == 3u) && (c.cot == IEC104_COT_INIT),
|
||||
"TC-006 RBT -> COT=4");
|
||||
"TC-IEC104-006 RBT -> COT=4");
|
||||
}
|
||||
|
||||
static void tc_cov_yx(void)
|
||||
@@ -598,33 +598,33 @@ static void tc_cov_yx(void)
|
||||
reset_all(now);
|
||||
handshake(now);
|
||||
iec104_link_poll(&g_lk, now); /* 建快照 */
|
||||
CHECK(cap_i_count() == 0, "TC-007 the first poll sends nothing spontaneous");
|
||||
CHECK(cap_i_count() == 0, "TC-IEC104-007 the first poll sends nothing spontaneous");
|
||||
s_f_bits |= (1uLL << 15); /* YX16(idx15)动作 */
|
||||
iec104_link_poll(&g_lk, now + 100u);
|
||||
/* B9:单点 YX 自发 = M_SP_TB_1(30)带 CP56Time2a 时标(SOE 上送路径) */
|
||||
CHECK((cap_i_count() == 1) && (cap_i(0, &c) == 0) && (c.type == 30u)
|
||||
&& (c.cot == IEC104_COT_SPONT) && (c.ioa == 16u)
|
||||
&& (c.obj_len == 8u) && (c.obj[0] == 1u), "TC-007 a YX16 change of state sends COT3 with TB");
|
||||
&& (c.obj_len == 8u) && (c.obj[0] == 1u), "TC-IEC104-007 a YX16 change of state sends COT3 with TB");
|
||||
if ((cap_i(0, &c) == 0) && (c.obj_len == 8u)) {
|
||||
CHECK(iec104_cp56_to_epoch_ms(&c.obj[1], &back) == 0,
|
||||
"TC-007 the CP56 time tag decodes");
|
||||
CHECK(back == s_epoch_val, "TC-007 the time tag equals the epoch_ms source");
|
||||
"TC-IEC104-007 the CP56 time tag decodes");
|
||||
CHECK(back == s_epoch_val, "TC-IEC104-007 the time tag equals the epoch_ms source");
|
||||
}
|
||||
s_f_bits &= ~(1uLL << 15); /* 复归 */
|
||||
iec104_link_poll(&g_lk, now + 200u);
|
||||
CHECK((cap_i_count() == 2) && (cap_i(1, &c) == 0) && (c.type == 30u)
|
||||
&& (c.ioa == 16u) && (c.obj[0] == 0u), "TC-007 YX16 is reset and changes again");
|
||||
&& (c.ioa == 16u) && (c.obj[0] == 0u), "TC-IEC104-007 YX16 is reset and changes again");
|
||||
/* B9 IV 路径:时标源无效 → CP56 IV 位如实置位 */
|
||||
s_epoch_val = UINT64_MAX;
|
||||
s_f_bits |= (1uLL << 16); /* YX17(idx16)动作 */
|
||||
iec104_link_poll(&g_lk, now + 300u);
|
||||
CHECK((cap_i_count() == 3) && (cap_i(2, &c) == 0) && (c.type == 30u)
|
||||
&& (c.ioa == 17u) && ((c.obj[3] & 0x80u) != 0u),
|
||||
"TC-007 an invalid clock sets the CP56 IV bit");
|
||||
"TC-IEC104-007 an invalid clock sets the CP56 IV bit");
|
||||
s_epoch_val = 1760234567000ULL;
|
||||
s_f_bits |= (1uLL << 0); /* idx0 无效位 → 不触发 */
|
||||
iec104_link_poll(&g_lk, now + 400u);
|
||||
CHECK(cap_i_count() == 3, "TC-007 a change while the IV bit is set triggers nothing");
|
||||
CHECK(cap_i_count() == 3, "TC-IEC104-007 a change while the IV bit is set triggers nothing");
|
||||
}
|
||||
|
||||
static void tc_cov_yc(void)
|
||||
@@ -639,7 +639,7 @@ static void tc_cov_yc(void)
|
||||
s_f_yc[0] = 100.4f; /* 死区 0.5 V 内(卡 6 二次值口径:0.5 %×100 V,
|
||||
* 旧拟定码值死区 10 已由「数据可信」卡 6 重定) */
|
||||
iec104_link_poll(&g_lk, now + 100u);
|
||||
CHECK(cap_i_count() == 0, "TC-008 inside the deadband nothing is uploaded");
|
||||
CHECK(cap_i_count() == 0, "TC-IEC104-008 inside the deadband nothing is uploaded");
|
||||
s_f_yc[0] = 101.25f; /* 101.25-100=1.25 > 0.5,第 1 越点 */
|
||||
iec104_link_poll(&g_lk, now + 200u);
|
||||
CHECK(cap_i_count() == 0, "TC-IEC104-008 first deadband crossing only arms (2-point confirm)");
|
||||
@@ -669,12 +669,12 @@ static void tc_k_window(void)
|
||||
for (i = 0; i < 12; i++) {
|
||||
feed_rd(now);
|
||||
}
|
||||
CHECK(cap_i_count() == 12, "TC-009 the k=12 window caps the outstanding frames");
|
||||
CHECK(cap_i_count() == 12, "TC-IEC104-009 the k=12 window caps the outstanding frames");
|
||||
feed_rd(now);
|
||||
CHECK(cap_i_count() == 12, "TC-009 the 13th frame is suppressed by the k window");
|
||||
CHECK(cap_i_count() == 12, "TC-IEC104-009 the 13th frame is suppressed by the k window");
|
||||
feed_s(12u, now); /* 全确认 → 窗开 */
|
||||
feed_rd(now);
|
||||
CHECK(cap_i_count() == 13, "TC-009 sending resumes after the S acknowledgement");
|
||||
CHECK(cap_i_count() == 13, "TC-IEC104-009 sending resumes after the S acknowledgement");
|
||||
}
|
||||
|
||||
static void tc_w_thresh(void)
|
||||
@@ -688,9 +688,9 @@ static void tc_w_thresh(void)
|
||||
for (i = 0; i < 7; i++) {
|
||||
feed_rd(now);
|
||||
}
|
||||
CHECK(cap_has_s(&nr) == 0, "TC-010 after 7 received frames no S has been sent yet");
|
||||
CHECK(cap_has_s(&nr) == 0, "TC-IEC104-010 after 7 received frames no S has been sent yet");
|
||||
feed_rd(now); /* 第 8 个 → w 阈 */
|
||||
CHECK((cap_has_s(&nr) == 1) && (nr == 8u), "TC-010 w=8 -> S with nr=8");
|
||||
CHECK((cap_has_s(&nr) == 1) && (nr == 8u), "TC-IEC104-010 w=8 -> S with nr=8");
|
||||
}
|
||||
|
||||
static void tc_t2(void)
|
||||
@@ -702,9 +702,9 @@ static void tc_t2(void)
|
||||
handshake(now);
|
||||
feed_rd(now); /* rx_unacked=1,t2 起爆 */
|
||||
iec104_link_poll(&g_lk, now + 9999u);
|
||||
CHECK(cap_has_s(&nr) == 0, "TC-011 no S before t2 expires");
|
||||
CHECK(cap_has_s(&nr) == 0, "TC-IEC104-011 no S before t2 expires");
|
||||
iec104_link_poll(&g_lk, now + 10001u);
|
||||
CHECK((cap_has_s(&nr) == 1) && (nr == 1u), "TC-011 S is sent once t2 expires");
|
||||
CHECK((cap_has_s(&nr) == 1) && (nr == 1u), "TC-IEC104-011 S is sent once t2 expires");
|
||||
}
|
||||
|
||||
static void tc_t3_t1(void)
|
||||
@@ -714,19 +714,19 @@ static void tc_t3_t1(void)
|
||||
reset_all(now);
|
||||
handshake(now);
|
||||
iec104_link_poll(&g_lk, now + 19999u);
|
||||
CHECK(cap_u_count(0x43u) == 0, "TC-012 no TESTFR before t3 expires");
|
||||
CHECK(cap_u_count(0x43u) == 0, "TC-IEC104-012 no TESTFR before t3 expires");
|
||||
iec104_link_poll(&g_lk, now + 20001u);
|
||||
CHECK(cap_u_count(0x43u) == 1, "TC-012 TESTFR act is sent once t3 expires");
|
||||
CHECK(cap_u_count(0x43u) == 1, "TC-IEC104-012 TESTFR act is sent once t3 expires");
|
||||
iec104_link_poll(&g_lk, now + 20001u + 15001u);
|
||||
CHECK(iec104_link_state(&g_lk) == IEC104_ST_IDLE, "TC-012 an unanswered TESTFR hits t1 -> IDLE");
|
||||
CHECK(iec104_link_state(&g_lk) == IEC104_ST_IDLE, "TC-IEC104-012 an unanswered TESTFR hits t1 -> IDLE");
|
||||
/* con 清挂起 → 不误杀 */
|
||||
reset_all(now);
|
||||
handshake(now);
|
||||
iec104_link_poll(&g_lk, now + 20001u);
|
||||
CHECK(cap_u_count(0x43u) == 1, "TC-012 after reconnect t3 fires again");
|
||||
CHECK(cap_u_count(0x43u) == 1, "TC-IEC104-012 after reconnect t3 fires again");
|
||||
feed_u(0x83u, now + 20100u); /* TESTFR con */
|
||||
iec104_link_poll(&g_lk, now + 35000u);
|
||||
CHECK(iec104_link_state(&g_lk) == IEC104_ST_RUN, "TC-012 once con clears the pending frame t1 does not kill it by mistake");
|
||||
CHECK(iec104_link_state(&g_lk) == IEC104_ST_RUN, "TC-IEC104-012 once con clears the pending frame t1 does not kill it by mistake");
|
||||
}
|
||||
|
||||
static void tc_dc(void)
|
||||
@@ -743,13 +743,13 @@ static void tc_dc(void)
|
||||
n = mk_asdu(a, IEC104_T_C_DC_NA_1, 1u, IEC104_COT_ACT, 0u, 1u, 0x600Au, body, 1u);
|
||||
feed_i(a, n, now);
|
||||
CHECK((cap_i(0, &c) == 0) && (c.type == 52u) && (c.cot == IEC104_COT_ACTCON)
|
||||
&& ((c.cot_hi & IEC104_COT_BIT_PN) == 0u), "TC-013 the select phase answers actcon");
|
||||
CHECK((s_f_yk_sel == 1u) && (s_f_yk_ioa == 0x600Au), "TC-013 the select phase forwards the source");
|
||||
&& ((c.cot_hi & IEC104_COT_BIT_PN) == 0u), "TC-IEC104-013 the select phase answers actcon");
|
||||
CHECK((s_f_yk_sel == 1u) && (s_f_yk_ioa == 0x600Au), "TC-IEC104-013 the select phase forwards the source");
|
||||
body[0] = 0x02u; /* 执行 ON */
|
||||
n = mk_asdu(a, IEC104_T_C_DC_NA_1, 1u, IEC104_COT_ACT, 0u, 1u, 0x600Au, body, 1u);
|
||||
feed_i(a, n, now);
|
||||
CHECK((cap_i(1, &c) == 0) && ((c.cot_hi & IEC104_COT_BIT_PN) == 0u)
|
||||
&& (s_f_yk_sel == 0u), "TC-013 the execute phase answers actcon");
|
||||
&& (s_f_yk_sel == 0u), "TC-IEC104-013 the execute phase answers actcon");
|
||||
/* 失配:选 ON 执 OFF */
|
||||
body[0] = 0x82u;
|
||||
n = mk_asdu(a, IEC104_T_C_DC_NA_1, 1u, IEC104_COT_ACT, 0u, 1u, 0x600Au, body, 1u);
|
||||
@@ -758,16 +758,16 @@ static void tc_dc(void)
|
||||
n = mk_asdu(a, IEC104_T_C_DC_NA_1, 1u, IEC104_COT_ACT, 0u, 1u, 0x600Au, body, 1u);
|
||||
feed_i(a, n, now);
|
||||
CHECK((cap_i(3, &c) == 0) && ((c.cot_hi & IEC104_COT_BIT_PN) != 0u),
|
||||
"TC-013 a mismatching execute phase returns PN");
|
||||
"TC-IEC104-013 a mismatching execute phase returns PN");
|
||||
/* 拒绝类(YK1):选择段即 PN */
|
||||
body[0] = 0x82u;
|
||||
n = mk_asdu(a, IEC104_T_C_DC_NA_1, 1u, IEC104_COT_ACT, 0u, 1u, 0x6000u, body, 1u);
|
||||
feed_i(a, n, now);
|
||||
CHECK((cap_i(4, &c) == 0) && ((c.cot_hi & IEC104_COT_BIT_PN) != 0u),
|
||||
"TC-013 a YK without output hardware returns PN in the select phase");
|
||||
"TC-IEC104-013 a YK without output hardware returns PN in the select phase");
|
||||
}
|
||||
|
||||
/* TC-024(B7):YK12 全局软压板两段式转真(经真实板端源 + 原子封存) */
|
||||
/* TC-IEC104-024(B7):YK12 全局软压板两段式转真(经真实板端源 + 原子封存) */
|
||||
static void tc_dc_yk12(void)
|
||||
{
|
||||
uint32_t now = 1000u;
|
||||
@@ -778,21 +778,21 @@ static void tc_dc_yk12(void)
|
||||
|
||||
reset_all(now);
|
||||
handshake(now);
|
||||
CHECK(prot_set_get_ctl(PS_GLOBAL_EN) == 1u, "TC-024 soft plates are engaged by default");
|
||||
CHECK(prot_set_get_ctl(PS_GLOBAL_EN) == 1u, "TC-IEC104-024 soft plates are engaged by default");
|
||||
body[0] = 0x81u; /* S=1, DPC=OFF:选择段 */
|
||||
n = mk_asdu(a, IEC104_T_C_DC_NA_1, 1u, IEC104_COT_ACT, 0u, 1u, 0x600Bu, body, 1u);
|
||||
feed_i(a, n, now);
|
||||
CHECK((cap_i(0, &c) == 0) && (c.cot == IEC104_COT_ACTCON)
|
||||
&& ((c.cot_hi & IEC104_COT_BIT_PN) == 0u), "TC-024 the YK12 select phase answers actcon");
|
||||
CHECK(prot_set_get_ctl(PS_GLOBAL_EN) == 1u, "TC-024 the select phase performs no action");
|
||||
&& ((c.cot_hi & IEC104_COT_BIT_PN) == 0u), "TC-IEC104-024 the YK12 select phase answers actcon");
|
||||
CHECK(prot_set_get_ctl(PS_GLOBAL_EN) == 1u, "TC-IEC104-024 the select phase performs no action");
|
||||
body[0] = 0x01u; /* 执行 OFF */
|
||||
n = mk_asdu(a, IEC104_T_C_DC_NA_1, 1u, IEC104_COT_ACT, 0u, 1u, 0x600Bu, body, 1u);
|
||||
feed_i(a, n, now);
|
||||
CHECK((cap_i(1, &c) == 0) && ((c.cot_hi & IEC104_COT_BIT_PN) == 0u),
|
||||
"TC-024 the YK12 execute phase answers actcon");
|
||||
CHECK(prot_set_get_ctl(PS_GLOBAL_EN) == 0u, "TC-024 the execute phase drives the soft plate to the released state");
|
||||
CHECK(prot_set_selfcheck() == 0, "TC-024 set_sealed seals atomically and selfcheck passes");
|
||||
CHECK(prot_set_dirty_peek() == 1u, "TC-024 the dirty flag is set for persistence");
|
||||
"TC-IEC104-024 the YK12 execute phase answers actcon");
|
||||
CHECK(prot_set_get_ctl(PS_GLOBAL_EN) == 0u, "TC-IEC104-024 the execute phase drives the soft plate to the released state");
|
||||
CHECK(prot_set_selfcheck() == 0, "TC-IEC104-024 set_sealed seals atomically and selfcheck passes");
|
||||
CHECK(prot_set_dirty_peek() == 1u, "TC-IEC104-024 the dirty flag is set for persistence");
|
||||
body[0] = 0x82u; /* 再投入:选择 ON */
|
||||
n = mk_asdu(a, IEC104_T_C_DC_NA_1, 1u, IEC104_COT_ACT, 0u, 1u, 0x600Bu, body, 1u);
|
||||
feed_i(a, n, now);
|
||||
@@ -800,13 +800,13 @@ static void tc_dc_yk12(void)
|
||||
n = mk_asdu(a, IEC104_T_C_DC_NA_1, 1u, IEC104_COT_ACT, 0u, 1u, 0x600Bu, body, 1u);
|
||||
feed_i(a, n, now);
|
||||
CHECK((cap_i(3, &c) == 0) && ((c.cot_hi & IEC104_COT_BIT_PN) == 0u),
|
||||
"TC-024 the engage command executes with actcon");
|
||||
CHECK(prot_set_get_ctl(PS_GLOBAL_EN) == 1u, "TC-024 the soft plate reaches the engaged state");
|
||||
"TC-IEC104-024 the engage command executes with actcon");
|
||||
CHECK(prot_set_get_ctl(PS_GLOBAL_EN) == 1u, "TC-IEC104-024 the soft plate reaches the engaged state");
|
||||
body[0] = 0x80u; /* DPC=00 非法:选择段即 PN */
|
||||
n = mk_asdu(a, IEC104_T_C_DC_NA_1, 1u, IEC104_COT_ACT, 0u, 1u, 0x600Bu, body, 1u);
|
||||
feed_i(a, n, now);
|
||||
CHECK((cap_i(4, &c) == 0) && ((c.cot_hi & IEC104_COT_BIT_PN) != 0u),
|
||||
"TC-024 an invalid DPC returns PN in the select phase");
|
||||
"TC-IEC104-024 an invalid DPC returns PN in the select phase");
|
||||
}
|
||||
|
||||
static void tc_se(void)
|
||||
@@ -820,27 +820,27 @@ static void tc_se(void)
|
||||
|
||||
reset_all(now);
|
||||
handshake(now);
|
||||
CHECK(addr == 0x8858u, "TC-014 the OC1 current setting communication address");
|
||||
CHECK(addr == 0x8858u, "TC-IEC104-014 the OC1 current setting communication address");
|
||||
iec104_put_float(body, 5.0f);
|
||||
body[4] = IEC104_QDC_S; /* 选择段 */
|
||||
n = mk_asdu(a, IEC104_T_C_SE_NC_1, 1u, IEC104_COT_ACT, 0u, 1u, addr, body, 5u);
|
||||
feed_i(a, n, now);
|
||||
CHECK((cap_i(0, &c) == 0) && (c.type == 50u)
|
||||
&& ((c.cot_hi & IEC104_COT_BIT_PN) == 0u), "TC-014 selecting a setting answers actcon");
|
||||
&& ((c.cot_hi & IEC104_COT_BIT_PN) == 0u), "TC-IEC104-014 selecting a setting answers actcon");
|
||||
body[4] = 0u; /* 执行段 */
|
||||
n = mk_asdu(a, IEC104_T_C_SE_NC_1, 1u, IEC104_COT_ACT, 0u, 1u, addr, body, 5u);
|
||||
feed_i(a, n, now);
|
||||
CHECK((cap_i(1, &c) == 0) && ((c.cot_hi & IEC104_COT_BIT_PN) == 0u),
|
||||
"TC-014 executing a setting answers actcon");
|
||||
CHECK(prot_set_get_f(PS_OC1_CUR) == 5.0f, "TC-014 the setting really was written (real prot_set)");
|
||||
CHECK(prot_set_selfcheck() == 0, "TC-014 sealing after execute keeps selfcheck passing");
|
||||
CHECK(prot_set_dirty_peek() == 1u, "TC-014 the execute phase sets dirty (B7, waiting to be persisted)");
|
||||
"TC-IEC104-014 executing a setting answers actcon");
|
||||
CHECK(prot_set_get_f(PS_OC1_CUR) == 5.0f, "TC-IEC104-014 the setting really was written (real prot_set)");
|
||||
CHECK(prot_set_selfcheck() == 0, "TC-IEC104-014 sealing after execute keeps selfcheck passing");
|
||||
CHECK(prot_set_dirty_peek() == 1u, "TC-IEC104-014 the execute phase sets dirty (B7, waiting to be persisted)");
|
||||
iec104_put_float(body, 100000.0f); /* 越上限 */
|
||||
body[4] = IEC104_QDC_S;
|
||||
n = mk_asdu(a, IEC104_T_C_SE_NC_1, 1u, IEC104_COT_ACT, 0u, 1u, addr, body, 5u);
|
||||
feed_i(a, n, now);
|
||||
CHECK((cap_i(2, &c) == 0) && ((c.cot_hi & IEC104_COT_BIT_PN) != 0u),
|
||||
"TC-014 an out-of-range select phase returns PN");
|
||||
"TC-IEC104-014 an out-of-range select phase returns PN");
|
||||
}
|
||||
|
||||
static void tc_rd(void)
|
||||
@@ -856,20 +856,20 @@ static void tc_rd(void)
|
||||
n = mk_asdu(a, IEC104_T_C_RD_NA_1, 1u, IEC104_COT_REQ, 0u, 1u, 0x4011u, NULL, 0u);
|
||||
feed_i(a, n, now);
|
||||
CHECK((cap_i(0, &c) == 0) && (c.type == 13u) && (c.cot == IEC104_COT_REQ)
|
||||
&& (iec104_get_float(c.obj) == 222.0f), "TC-015 C_RD hits a YC group");
|
||||
&& (iec104_get_float(c.obj) == 222.0f), "TC-IEC104-015 C_RD hits a YC group");
|
||||
n = mk_asdu(a, IEC104_T_C_RD_NA_1, 1u, IEC104_COT_REQ, 0u, 1u, 0x8858u, NULL, 0u);
|
||||
feed_i(a, n, now);
|
||||
CHECK((cap_i(1, &c) == 0) && (c.type == 13u) && (c.ioa == 0x8858u),
|
||||
"TC-015 C_RD hits a setting");
|
||||
"TC-IEC104-015 C_RD hits a setting");
|
||||
n = mk_asdu(a, IEC104_T_C_RD_NA_1, 1u, IEC104_COT_REQ, 0u, 1u, 0x9999u, NULL, 0u);
|
||||
feed_i(a, n, now);
|
||||
CHECK((cap_i(2, &c) == 0) && (c.type == 102u)
|
||||
&& (c.cot == IEC104_COT_UNK_IOA) && ((c.oa & 0x80u) != 0u),
|
||||
"TC-015 an unknown IOA answers COT14 plus EVI");
|
||||
"TC-IEC104-015 an unknown IOA answers COT14 plus EVI");
|
||||
n = mk_asdu(a, IEC104_T_C_RD_NA_1, 1u, IEC104_COT_REQ, 0u, 1u, 0u, NULL, 0u);
|
||||
feed_i(a, n, now);
|
||||
CHECK((cap_i(3, &c) == 0) && (c.cot == IEC104_COT_UNK_IOA),
|
||||
"TC-015 a local setting item (comm_addr=0) is not addressable (B7)");
|
||||
"TC-IEC104-015 a local setting item (comm_addr=0) is not addressable (B7)");
|
||||
}
|
||||
|
||||
static void tc_cs(void)
|
||||
@@ -888,18 +888,18 @@ static void tc_cs(void)
|
||||
feed_i(a, n, now);
|
||||
CHECK((cap_i(0, &c) == 0) && (c.type == 103u)
|
||||
&& ((c.cot_hi & IEC104_COT_BIT_PN) == 0u) && (s_clock_ms == e),
|
||||
"TC-016 C_CS syncs the clock with an exact epoch");
|
||||
"TC-IEC104-016 C_CS syncs the clock with an exact epoch");
|
||||
cp[2] |= 0x80u; /* IV */
|
||||
n = mk_asdu(a, IEC104_T_C_CS_NA_1, 1u, IEC104_COT_ACT, 0u, 1u, 0u, cp, 7u);
|
||||
feed_i(a, n, now);
|
||||
CHECK((cap_i(1, &c) == 0) && ((c.cot_hi & IEC104_COT_BIT_PN) != 0u),
|
||||
"TC-016 CP56 IV -> PN");
|
||||
"TC-IEC104-016 CP56 IV -> PN");
|
||||
(void)iec104_epoch_ms_to_cp56(e, cp);
|
||||
s_clock_rc = -1; /* 系统侧拒绝 */
|
||||
n = mk_asdu(a, IEC104_T_C_CS_NA_1, 1u, IEC104_COT_ACT, 0u, 1u, 0u, cp, 7u);
|
||||
feed_i(a, n, now);
|
||||
CHECK((cap_i(2, &c) == 0) && ((c.cot_hi & IEC104_COT_BIT_PN) != 0u),
|
||||
"TC-016 a clock_sync failure -> PN");
|
||||
"TC-IEC104-016 a clock_sync failure -> PN");
|
||||
}
|
||||
|
||||
static void tc_err_resp(void)
|
||||
@@ -914,13 +914,13 @@ static void tc_err_resp(void)
|
||||
n = mk_asdu(a, 200u, 1u, IEC104_COT_ACT, 0u, 1u, 0u, NULL, 0u);
|
||||
feed_i(a, n, now);
|
||||
CHECK((cap_i(0, &c) == 0) && (c.type == 200u) && (c.cot == IEC104_COT_UNK_COT)
|
||||
&& ((c.oa & 0x80u) != 0u), "TC-017 an unknown type answers COT12 plus EVI");
|
||||
&& ((c.oa & 0x80u) != 0u), "TC-IEC104-017 an unknown type answers COT12 plus EVI");
|
||||
m = iec104_asdu_put_hdr(a, IEC104_T_C_IC_NA_1, 1u, IEC104_COT_ACT, 0u, 2u);
|
||||
a[m] = IEC104_RQT_GROUP1;
|
||||
m++;
|
||||
feed_i(a, m, now); /* ca=2 ≠ 1 */
|
||||
CHECK((cap_i(1, &c) == 0) && (c.cot == IEC104_COT_UNK_CA)
|
||||
&& ((c.oa & 0x80u) != 0u), "TC-017 a wrong common address answers COT13 plus EVI");
|
||||
&& ((c.oa & 0x80u) != 0u), "TC-IEC104-017 a wrong common address answers COT13 plus EVI");
|
||||
}
|
||||
|
||||
static void tc_stopdt(void)
|
||||
@@ -934,13 +934,13 @@ static void tc_stopdt(void)
|
||||
handshake(now);
|
||||
feed_u(0x13u, now); /* STOPDT act */
|
||||
CHECK((cap_u_count(0x23u) == 1)
|
||||
&& (iec104_link_state(&g_lk) == IEC104_ST_STOPPED), "TC-018 STOPDT con");
|
||||
&& (iec104_link_state(&g_lk) == IEC104_ST_STOPPED), "TC-IEC104-018 STOPDT con");
|
||||
body[0] = IEC104_RQT_GROUP1;
|
||||
n = mk_asdu(a, IEC104_T_C_IC_NA_1, 1u, IEC104_COT_ACT, 0u, 1u, 0u, body, 1u);
|
||||
feed_i(a, n, now);
|
||||
CHECK(cap_i_count() == 0, "TC-018 in STOPPED state the data service is off");
|
||||
CHECK(cap_i_count() == 0, "TC-IEC104-018 in STOPPED state the data service is off");
|
||||
feed_u(0x43u, now);
|
||||
CHECK(cap_u_count(0x83u) == 1, "TC-018 in STOPPED state TESTFR is still answered");
|
||||
CHECK(cap_u_count(0x83u) == 1, "TC-IEC104-018 in STOPPED state TESTFR is still answered");
|
||||
}
|
||||
|
||||
static void tc_seq_err(void)
|
||||
@@ -954,7 +954,7 @@ static void tc_seq_err(void)
|
||||
m_ns = 5u; /* 期望 0,投 5 */
|
||||
n = mk_asdu(a, IEC104_T_C_RD_NA_1, 1u, IEC104_COT_REQ, 0u, 1u, 0x4011u, NULL, 0u);
|
||||
feed_i(a, n, now);
|
||||
CHECK(iec104_link_state(&g_lk) == IEC104_ST_IDLE, "TC-019 a sequence error -> IDLE");
|
||||
CHECK(iec104_link_state(&g_lk) == IEC104_ST_IDLE, "TC-IEC104-019 a sequence error -> IDLE");
|
||||
}
|
||||
|
||||
static void tc_pts(void)
|
||||
@@ -965,23 +965,23 @@ static void tc_pts(void)
|
||||
|
||||
reset_all(1000u);
|
||||
CHECK((iec104_pts_yc_count() == 9u) && (iec104_pts_yx_count() == 33u)
|
||||
&& (iec104_pts_yc_ioa(8u) == 0x401Du), "TC-020 table size and IOA layout");
|
||||
&& (iec104_pts_yc_ioa(8u) == 0x401Du), "TC-IEC104-020 table size and IOA layout");
|
||||
s_f_yc[0] = 7.5f;
|
||||
CHECK((iec104_pts_yc_read(0u, &v, &q) == 0) && (v == 7.5f) && (q == 0u),
|
||||
"TC-020 a valid YC");
|
||||
"TC-IEC104-020 a valid YC");
|
||||
s_f_yc_rc[1] = -1;
|
||||
(void)iec104_pts_yc_read(1u, &v, &q);
|
||||
CHECK((v == 0.0f) && (q == IEC104_QDS_IV), "TC-020 an invalid channel gives IV");
|
||||
CHECK((v == 0.0f) && (q == IEC104_QDS_IV), "TC-IEC104-020 an invalid channel gives IV");
|
||||
s_f_yc_rc[2] = -2;
|
||||
(void)iec104_pts_yc_read(2u, &v, &q);
|
||||
CHECK(q == IEC104_QDS_NT, "TC-020 not ready gives NT");
|
||||
CHECK(q == IEC104_QDS_NT, "TC-IEC104-020 not ready gives NT");
|
||||
iec104_pts_yx_read(0u, &d);
|
||||
CHECK(d == IEC104_DIQ_IV, "TC-020 an invalid telemetry point gives IV");
|
||||
CHECK(d == IEC104_DIQ_IV, "TC-IEC104-020 an invalid telemetry point gives IV");
|
||||
CHECK((iec104_pts_yx_is_dp(0u) == 1u) && (iec104_pts_yx_is_dp(4u) == 0u),
|
||||
"TC-020 the is_dp boundary");
|
||||
"TC-IEC104-020 the is_dp boundary");
|
||||
s_f_bits = (1uLL << 15);
|
||||
iec104_pts_yx_read(15u, &d);
|
||||
CHECK(d == 1u, "TC-020 a valid telemetry point gives ON");
|
||||
CHECK(d == 1u, "TC-IEC104-020 a valid telemetry point gives ON");
|
||||
}
|
||||
|
||||
static void tc_ts_rp(void)
|
||||
@@ -998,11 +998,11 @@ static void tc_ts_rp(void)
|
||||
n = mk_asdu(a, IEC104_T_C_TS_NA_1, 1u, IEC104_COT_ACT, 0u, 1u, 0u, body, 1u);
|
||||
feed_i(a, n, now);
|
||||
CHECK((cap_i(0, &c) == 0) && (c.type == 104u) && (c.cot == IEC104_COT_ACTCON),
|
||||
"TC-021 C_TS actcon");
|
||||
"TC-IEC104-021 C_TS actcon");
|
||||
n = mk_asdu(a, IEC104_T_C_RP_NA_1, 1u, IEC104_COT_ACT, 0u, 1u, 0u, body, 1u);
|
||||
feed_i(a, n, now);
|
||||
CHECK((cap_i(1, &c) == 0) && (c.type == 105u) && (c.cot == IEC104_COT_ACTCON),
|
||||
"TC-021 C_RP actcon");
|
||||
"TC-IEC104-021 C_RP actcon");
|
||||
}
|
||||
|
||||
static void tc_periodic(void)
|
||||
@@ -1013,10 +1013,10 @@ static void tc_periodic(void)
|
||||
reset_all(now);
|
||||
handshake(now);
|
||||
iec104_link_poll(&g_lk, now + 60001u);
|
||||
CHECK(cap_i_count() == 2, "TC-022 the cyclic upload takes 2 frames");
|
||||
CHECK(cap_i_count() == 2, "TC-IEC104-022 the cyclic upload takes 2 frames");
|
||||
CHECK((cap_i(0, &c) == 0) && (c.type == 13u) && (c.cot == IEC104_COT_PERIODIC)
|
||||
&& (c.ioa == 0x4011u), "TC-022 the cyclic YC group uses COT=1");
|
||||
CHECK((cap_i(1, &c) == 0) && (c.ioa == 0x401Du), "TC-022 the cyclic frequency point");
|
||||
&& (c.ioa == 0x4011u), "TC-IEC104-022 the cyclic YC group uses COT=1");
|
||||
CHECK((cap_i(1, &c) == 0) && (c.ioa == 0x401Du), "TC-IEC104-022 the cyclic frequency point");
|
||||
}
|
||||
|
||||
static void tc_cov_kfull(void)
|
||||
@@ -1033,11 +1033,11 @@ static void tc_cov_kfull(void)
|
||||
}
|
||||
s_f_bits |= (1uLL << 14); /* YX15 变位 */
|
||||
iec104_link_poll(&g_lk, now + 100u);
|
||||
CHECK(cap_i_count() == 12, "TC-023 with k full nothing spontaneous can go out");
|
||||
CHECK(cap_i_count() == 12, "TC-IEC104-023 with k full nothing spontaneous can go out");
|
||||
feed_s(12u, now + 200u); /* 窗开 */
|
||||
iec104_link_poll(&g_lk, now + 300u);
|
||||
CHECK((cap_i_count() == 13) && (cap_i(12, &c) == 0) && (c.ioa == 15u)
|
||||
&& (c.cot == IEC104_COT_SPONT), "TC-023 once the window opens the backlogged event is sent, none lost");
|
||||
&& (c.cot == IEC104_COT_SPONT), "TC-IEC104-023 once the window opens the backlogged event is sent, none lost");
|
||||
}
|
||||
|
||||
/* ========== 卡 9/卡 11:板端默认源(真实 L2 链:ring→phasor→freq→meas) ========== */
|
||||
|
||||
Reference in New Issue
Block a user