下面是本站构建时跑过的固定场景和预期输出,用来做回归对比或精确复现;不是要求你手写 scenario 。推荐先让 Agent 自己写场景,再和这份基线对照。
EXPECTED 复制结果
PASS 罐 101 -> 装车台 900:允许 (1 step(s), 1 scan(s))
PASS 源 ID 不在表里:清 0 (1 step(s), 1 scan(s))
PASS 目标 ID 不在表里:清 0 (1 step(s), 1 scan(s))
PASS 罐 -> 装车台被禁止:清目标 (1 step(s), 1 scan(s))
PASS 装车台 -> 罐被禁止:清源 (1 step(s), 1 scan(s))
PASS 罐 -> 罐被禁止:清源 (1 step(s), 1 scan(s))
PASS 装车台 -> 装车台:永远清源 (1 step(s), 1 scan(s))
RESULT: ALL PASS (7 scan(s))
BASELINE JSON 复制基线请求
{
"sources": [
{
"name": "blocks/FC_IsTankID.scl",
"source": "FUNCTION \"FC_IsTankID\" : Bool\n{ S7_Optimized_Access := 'TRUE' }\nVERSION : 0.1\n VAR_INPUT\n id : UInt; // 要查的罐号 ID\n END_VAR\n\n VAR_IN_OUT\n T : Array[1..8] of UInt; // 罐 ID 表\n END_VAR\n\n VAR_TEMP\n idx : Int; // 查表下标\n END_VAR\nBEGIN\n REGION 默认结果\n // 先假设“不是罐”,找到再改成 TRUE;这样不会返回未赋值的 Bool。\n #Ret_Val := FALSE;\n END_REGION\n\n REGION 线性查找\n FOR #idx := 1 TO 8 DO\n IF #id = #T[#idx] THEN\n #Ret_Val := TRUE;\n RETURN; // 找到就结束,不再继续扫后面的空位\n END_IF;\n END_FOR;\n END_REGION\nEND_FUNCTION\n"
},
{
"name": "blocks/FC_ID_CHECK.scl",
"source": "FUNCTION \"FC_ID_CHECK\" : Void\n{ S7_Optimized_Access := 'TRUE' }\nVERSION : 0.1\n VAR_INPUT\n ID_T1 : UInt; // 罐 1 ID\n ID_T2 : UInt; // 罐 2 ID\n ID_T3 : UInt; // 罐 3 ID\n ID_T4 : UInt; // 罐 4 ID\n ID_T5 : UInt; // 罐 5 ID\n ID_T6 : UInt; // 罐 6 ID\n ID_T7 : UInt; // 罐 7 ID\n ID_T8 : UInt; // 罐 8 ID\n ID_V : UInt; // 装车台 ID\n AllowTankToLoading : Bool; // 允许 罐 -> 装车台\n AllowLoadingToTank : Bool; // 允许 装车台 -> 罐\n AllowTankToTank : Bool; // 允许 罐 -> 罐\n END_VAR\n\n VAR_IN_OUT\n ID_Source : UInt; // 源 ID,非法时被清 0\n ID_Target : UInt; // 目标 ID,非法时被清 0\n END_VAR\n\n VAR_TEMP\n T : Array[1..8] of UInt; // 罐 ID 表\n SourceIsTank : Bool;\n TargetIsTank : Bool;\n SourceValid : Bool;\n TargetValid : Bool;\n END_VAR\nBEGIN\n REGION 组装 ID 表\n #T[1] := #ID_T1;\n #T[2] := #ID_T2;\n #T[3] := #ID_T3;\n #T[4] := #ID_T4;\n #T[5] := #ID_T5;\n #T[6] := #ID_T6;\n #T[7] := #ID_T7;\n #T[8] := #ID_T8;\n END_REGION\n\n REGION 源和目标是否在场\n // 罐 ID 在表里,装车台 ID 单独比较;两者都算“在场”。\n #SourceIsTank := \"FC_IsTankID\"(id := #ID_Source, T := #T);\n #TargetIsTank := \"FC_IsTankID\"(id := #ID_Target, T := #T);\n #SourceValid := #SourceIsTank OR (#ID_Source = #ID_V);\n #TargetValid := #TargetIsTank OR (#ID_Target = #ID_V);\n\n IF NOT #SourceValid THEN\n #ID_Source := 0;\n END_IF;\n IF NOT #TargetValid THEN\n #ID_Target := 0;\n END_IF;\n END_REGION\n\n REGION 路径许可\n // 只有在源和目标都有效时才检查路径;无效的一侧在上一步已经清 0,不会进入这里。\n IF #SourceValid AND #TargetValid THEN\n IF #SourceIsTank AND #TargetIsTank THEN\n IF NOT #AllowTankToTank THEN\n #ID_Source := 0;\n END_IF;\n ELSIF #SourceIsTank AND (#ID_Target = #ID_V) THEN\n IF NOT #AllowTankToLoading THEN\n #ID_Target := 0;\n END_IF;\n ELSIF (#ID_Source = #ID_V) AND #TargetIsTank THEN\n IF NOT #AllowLoadingToTank THEN\n #ID_Source := 0;\n END_IF;\n ELSIF (#ID_Source = #ID_V) AND (#ID_Target = #ID_V) THEN\n // 装车台 -> 装车台永远不允许。\n #ID_Source := 0;\n END_IF;\n END_IF;\n END_REGION\nEND_FUNCTION\n"
}
],
"scenario": {
"docs": [
"FC_IsTankID.scl",
"FC_ID_CHECK.scl"
],
"block": "FC_ID_CHECK",
"tickMs": 10,
"seed": {
"ID_T1": 101,
"ID_T2": 102,
"ID_T3": 103,
"ID_T4": 104,
"ID_T5": 105,
"ID_T6": 106,
"ID_T7": 107,
"ID_T8": 108,
"ID_V": 900,
"AllowTankToLoading": true,
"AllowLoadingToTank": true,
"AllowTankToTank": true
},
"scenarios": [
{
"name": "罐 101 -> 装车台 900:允许",
"steps": [
{
"set": {
"ID_Source": 101,
"ID_Target": 900
},
"expect": {
"ID_Source": 101,
"ID_Target": 900
}
}
]
},
{
"name": "源 ID 不在表里:清 0",
"steps": [
{
"set": {
"ID_Source": 555,
"ID_Target": 900
},
"expect": {
"ID_Source": 0,
"ID_Target": 900
}
}
]
},
{
"name": "目标 ID 不在表里:清 0",
"steps": [
{
"set": {
"ID_Source": 101,
"ID_Target": 555
},
"expect": {
"ID_Source": 101,
"ID_Target": 0
}
}
]
},
{
"name": "罐 -> 装车台被禁止:清目标",
"steps": [
{
"set": {
"AllowTankToLoading": false,
"ID_Source": 101,
"ID_Target": 900
},
"expect": {
"ID_Source": 101,
"ID_Target": 0
}
}
]
},
{
"name": "装车台 -> 罐被禁止:清源",
"steps": [
{
"set": {
"AllowLoadingToTank": false,
"ID_Source": 900,
"ID_Target": 101
},
"expect": {
"ID_Source": 0,
"ID_Target": 101
}
}
]
},
{
"name": "罐 -> 罐被禁止:清源",
"steps": [
{
"set": {
"AllowTankToTank": false,
"ID_Source": 101,
"ID_Target": 102
},
"expect": {
"ID_Source": 0,
"ID_Target": 102
}
}
]
},
{
"name": "装车台 -> 装车台:永远清源",
"steps": [
{
"set": {
"ID_Source": 900,
"ID_Target": 900
},
"expect": {
"ID_Source": 0,
"ID_Target": 900
}
}
]
}
]
}
}
打开 PLC 云仿真