下面是本站构建时跑过的固定场景和预期输出,用来做回归对比或精确复现;不是要求你手写 scenario。推荐先让 Agent 自己写场景,再和这份基线对照。
EXPECTED
PASS 第一路报警出现,确认后消失 (5 step(s), 5 scan(s))
PASS 同一个报警消失后再出现,算新报警 (4 step(s), 4 scan(s))
PASS 两路报警:确认只清新报警标志 (3 step(s), 3 scan(s))
RESULT: ALL PASS (12 scan(s))
BASELINE JSON
{
"sources": [
{
"name": "blocks/FB_AlarmManager.scl",
"source": "FUNCTION_BLOCK \"FB_AlarmManager\"\n{ S7_Optimized_Access := 'TRUE' }\nVERSION : 0.1\n VAR_INPUT\n Alarms : Word; // 16 路报警位,bit0 = 报警 1\n Ack : Bool; // HMI 确认按钮(电平,内部取上升沿)\n END_VAR\n\n VAR_OUTPUT\n Error : Bool; // 任意一路报警为 1\n NewError : Bool; // 有报警在本次确认之后首次出现\n NewBits : Word; // 哪些位是“新报警”\n State : Int; // 0=正常 1=有报警 2=有新报警\n END_VAR\n\n VAR\n Snapshot : Word; // 上次确认时的报警位\n AckPrev : Bool; // 确认按钮的上一周期状态\n ErrorInt : Bool;\n NewErrorInt : Bool;\n StateInt : Int := 0;\n END_VAR\n\n VAR_TEMP\n AckPulse : Bool;\n Rising : Word;\n END_VAR\nBEGIN\n REGION 报警汇总\n // 任何一位为 1 就表示有报警;Word 与 16#0000 比较,避免逐位判断。\n #ErrorInt := #Alarms <> 16#0000;\n END_REGION\n\n REGION 确认上升沿\n // 确认按钮只处理一次:按下的第一个扫描周期产生 AckPulse。\n #AckPulse := #Ack AND NOT #AckPrev;\n #AckPrev := #Ack;\n END_REGION\n\n REGION 新报警与快照\n // 当前为 1、快照为 0 的位就是新报警。\n #Rising := #Alarms AND NOT #Snapshot;\n IF #Rising <> 16#0000 THEN\n #NewErrorInt := TRUE;\n END_IF;\n\n // 消失的报警从快照中清除,下次再出现仍然算新报警。\n #Snapshot := #Snapshot AND #Alarms;\n\n // 确认:把所有当前报警记为已看过,并清掉新报警标志。\n IF #AckPulse THEN\n #Snapshot := #Alarms;\n #NewErrorInt := FALSE;\n END_IF;\n\n // 输出当前还未确认的新报警位(确认后自然为 0)。\n #NewBits := #Alarms AND NOT #Snapshot;\n END_REGION\n\n REGION 状态与输出\n IF NOT #ErrorInt THEN\n #StateInt := 0;\n ELSIF #NewErrorInt THEN\n #StateInt := 2;\n ELSE\n #StateInt := 1;\n END_IF;\n\n #Error := #ErrorInt;\n #NewError := #NewErrorInt;\n #State := #StateInt;\n END_REGION\nEND_FUNCTION_BLOCK\n"
}
],
"scenario": {
"docs": [
"FB_AlarmManager.scl"
],
"block": "FB_AlarmManager",
"tickMs": 10,
"seed": {
"Alarms": "16#0000",
"Ack": false
},
"always": [
"!(NewError && State == 0)",
"NewBits == 0 || NewError"
],
"scenarios": [
{
"name": "第一路报警出现,确认后消失",
"steps": [
{
"set": {
"Alarms": "16#0000"
},
"expect": {
"Error": false,
"NewError": false,
"NewBits": "16#0000",
"State": 0
}
},
{
"set": {
"Alarms": "16#0001"
},
"expect": {
"Error": true,
"NewError": true,
"NewBits": "16#0001",
"State": 2
}
},
{
"set": {
"Ack": true
},
"expect": {
"Error": true,
"NewError": false,
"NewBits": "16#0000",
"State": 1
}
},
{
"set": {
"Ack": false
},
"expect": {
"Error": true,
"NewError": false,
"State": 1
}
},
{
"set": {
"Alarms": "16#0000"
},
"expect": {
"Error": false,
"NewError": false,
"NewBits": "16#0000",
"State": 0
}
}
]
},
{
"name": "同一个报警消失后再出现,算新报警",
"steps": [
{
"set": {
"Alarms": "16#0001"
},
"expect": {
"NewError": true
}
},
{
"set": {
"Ack": true
}
},
{
"set": {
"Ack": false,
"Alarms": "16#0000"
},
"expect": {
"NewError": false
}
},
{
"set": {
"Alarms": "16#0001"
},
"expect": {
"NewError": true,
"State": 2
}
}
]
},
{
"name": "两路报警:确认只清新报警标志",
"steps": [
{
"set": {
"Alarms": "16#0005"
},
"expect": {
"NewBits": "16#0005",
"State": 2
}
},
{
"set": {
"Alarms": "16#0005",
"Ack": true
},
"expect": {
"NewBits": "16#0000",
"State": 1
}
},
{
"set": {
"Alarms": "16#0007",
"Ack": false
},
"expect": {
"NewBits": "16#0002",
"NewError": true,
"State": 2
}
}
]
}
]
}
}
打开 PLC 云仿真