From 2d9fd4e80a4d3ea92d9aa275124824970765699f Mon Sep 17 00:00:00 2001 From: Miguel Date: Sat, 19 Apr 2025 03:23:14 +0200 Subject: [PATCH] Intento de copiar SCL desde XML parcialmente --- BlenderCtrl__Main_simplified.json | 306 +++-- BlenderCtrl__Main_simplified_processed.json | 356 +++-- BlenderCtrl__Main_simplified_processed.scl | 245 ++-- TestLAD.xml | 1305 +++++++++++++++++-- TestLAD_simplified.json | 1101 ++++++++++++++-- TestLAD_simplified_processed.json | 1165 +++++++++++++++-- TestLAD_simplified_processed.scl | 44 +- x1_to_json.py | 323 +++-- x3_generate_scl.py | 71 +- 9 files changed, 4056 insertions(+), 860 deletions(-) diff --git a/BlenderCtrl__Main_simplified.json b/BlenderCtrl__Main_simplified.json index eaa9973..b261235 100644 --- a/BlenderCtrl__Main_simplified.json +++ b/BlenderCtrl__Main_simplified.json @@ -60,7 +60,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "1A", @@ -80,7 +81,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "2B", @@ -147,7 +149,8 @@ ] } } - ] + ], + "language": "LAD" }, { "id": "3C", @@ -217,7 +220,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "4D", @@ -448,7 +452,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "5E", @@ -464,15 +469,15 @@ }, "negated_pins": {}, "inputs": { - "en": { - "type": "powerrail" - }, "in": { "uid": "21", "scope": "LiteralConstant", "type": "constant", "datatype": "Int", "value": 0 + }, + "en": { + "type": "powerrail" } }, "outputs": { @@ -486,7 +491,8 @@ ] } } - ] + ], + "language": "LAD" }, { "id": "6F", @@ -519,6 +525,12 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "s": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "24", + "source_pin": "out" + }, "tv": { "uid": "23", "scope": "TypedConstant", @@ -526,12 +538,6 @@ "datatype": "TypedConstant", "value": "S5T#2S" }, - "s": { - "type": "connection", - "source_instruction_type": "Contact", - "source_instruction_uid": "24", - "source_pin": "out" - }, "en": { "type": "connection", "source_instruction_uid": "24", @@ -541,7 +547,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "80", @@ -589,7 +596,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "91", @@ -648,18 +656,18 @@ }, "negated_pins": {}, "inputs": { - "en": { - "type": "connection", - "source_instruction_type": "Contact", - "source_instruction_uid": "25", - "source_pin": "out" - }, "in": { "uid": "23", "scope": "LiteralConstant", "type": "constant", "datatype": "Int", "value": 19 + }, + "en": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "25", + "source_pin": "out" } }, "outputs": { @@ -673,7 +681,8 @@ ] } } - ] + ], + "language": "LAD" }, { "id": "A2", @@ -789,7 +798,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "B3", @@ -839,7 +849,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "C4", @@ -1000,7 +1011,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "D5", @@ -1116,7 +1128,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "E6", @@ -1348,7 +1361,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "F7", @@ -1381,6 +1395,12 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "s": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "25", + "source_pin": "out" + }, "tv": { "uid": "22", "scope": "TypedConstant", @@ -1388,12 +1408,6 @@ "datatype": "TypedConstant", "value": "S5T#1S" }, - "s": { - "type": "connection", - "source_instruction_type": "Contact", - "source_instruction_uid": "25", - "source_pin": "out" - }, "en": { "type": "connection", "source_instruction_uid": "25", @@ -1425,7 +1439,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "108", @@ -1498,7 +1513,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "119", @@ -1571,7 +1587,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "12A", @@ -1613,7 +1630,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "13B", @@ -1686,7 +1704,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "14C", @@ -1706,7 +1725,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "15D", @@ -1728,7 +1748,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "16E", @@ -1748,7 +1769,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "17F", @@ -1790,7 +1812,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "190", @@ -1810,7 +1833,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "1A1", @@ -1904,7 +1928,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "1B2", @@ -2013,7 +2038,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "1C3", @@ -2107,7 +2133,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "1D4", @@ -2201,7 +2228,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "1E5", @@ -2243,7 +2271,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "1F6", @@ -2263,7 +2292,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "207", @@ -2283,7 +2313,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "218", @@ -2303,7 +2334,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "229", @@ -2323,7 +2355,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "23A", @@ -2345,7 +2378,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "24B", @@ -2365,7 +2399,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "25C", @@ -2385,7 +2420,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "26D", @@ -2405,7 +2441,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "27E", @@ -2425,7 +2462,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "28F", @@ -2445,7 +2483,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "2A0", @@ -2465,7 +2504,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "2B1", @@ -2511,7 +2551,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "2C2", @@ -2531,7 +2572,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "2D3", @@ -2551,7 +2593,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "2E4", @@ -2593,7 +2636,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "2F5", @@ -2613,7 +2657,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "306", @@ -2633,7 +2678,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "317", @@ -2653,7 +2699,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "328", @@ -2673,7 +2720,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "339", @@ -2693,7 +2741,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "34A", @@ -2726,6 +2775,12 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "s": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "24", + "source_pin": "out" + }, "tv": { "uid": "22", "scope": "TypedConstant", @@ -2733,12 +2788,6 @@ "datatype": "TypedConstant", "value": "S5T#2S" }, - "s": { - "type": "connection", - "source_instruction_type": "Contact", - "source_instruction_uid": "24", - "source_pin": "out" - }, "en": { "type": "connection", "source_instruction_uid": "24", @@ -2748,7 +2797,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "35B", @@ -2824,6 +2874,12 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "s": { + "type": "connection", + "source_instruction_type": "O", + "source_instruction_uid": "28", + "source_pin": "out" + }, "tv": { "uid": "24", "scope": "TypedConstant", @@ -2831,12 +2887,6 @@ "datatype": "TypedConstant", "value": "S5T#2S" }, - "s": { - "type": "connection", - "source_instruction_type": "O", - "source_instruction_uid": "28", - "source_pin": "out" - }, "en": { "type": "connection", "source_instruction_uid": "28", @@ -2868,7 +2918,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "36C", @@ -2916,7 +2967,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "37D", @@ -2992,6 +3044,12 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "s": { + "type": "connection", + "source_instruction_type": "O", + "source_instruction_uid": "29", + "source_pin": "out" + }, "tv": { "uid": "24", "scope": "TypedConstant", @@ -2999,12 +3057,6 @@ "datatype": "TypedConstant", "value": "S5T#2S" }, - "s": { - "type": "connection", - "source_instruction_type": "O", - "source_instruction_uid": "29", - "source_pin": "out" - }, "en": { "type": "connection", "source_instruction_uid": "29", @@ -3058,7 +3110,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "38E", @@ -3106,7 +3159,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "39F", @@ -3182,6 +3236,12 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "s": { + "type": "connection", + "source_instruction_type": "O", + "source_instruction_uid": "28", + "source_pin": "out" + }, "tv": { "uid": "24", "scope": "TypedConstant", @@ -3189,12 +3249,6 @@ "datatype": "TypedConstant", "value": "S5T#2S" }, - "s": { - "type": "connection", - "source_instruction_type": "O", - "source_instruction_uid": "28", - "source_pin": "out" - }, "en": { "type": "connection", "source_instruction_uid": "28", @@ -3226,7 +3280,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "3B0", @@ -3274,7 +3329,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "3C1", @@ -3350,6 +3406,12 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "s": { + "type": "connection", + "source_instruction_type": "O", + "source_instruction_uid": "28", + "source_pin": "out" + }, "tv": { "uid": "24", "scope": "TypedConstant", @@ -3357,12 +3419,6 @@ "datatype": "TypedConstant", "value": "S5T#2S" }, - "s": { - "type": "connection", - "source_instruction_type": "O", - "source_instruction_uid": "28", - "source_pin": "out" - }, "en": { "type": "connection", "source_instruction_uid": "28", @@ -3394,7 +3450,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "3D2", @@ -3442,7 +3499,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "3E3", @@ -3490,7 +3548,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "3F4", @@ -3534,7 +3593,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "405", @@ -3554,7 +3614,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "416", @@ -3574,7 +3635,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "427", @@ -3594,7 +3656,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "438", @@ -3702,7 +3765,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "449", @@ -3722,7 +3786,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "45A", @@ -3964,7 +4029,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "46B", @@ -4008,7 +4074,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "47C", @@ -4028,7 +4095,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" } ] } \ No newline at end of file diff --git a/BlenderCtrl__Main_simplified_processed.json b/BlenderCtrl__Main_simplified_processed.json index eb63373..247fb6d 100644 --- a/BlenderCtrl__Main_simplified_processed.json +++ b/BlenderCtrl__Main_simplified_processed.json @@ -61,7 +61,8 @@ "outputs": {}, "scl": "Clock_Signal();" } - ] + ], + "language": "LAD" }, { "id": "1A", @@ -82,7 +83,8 @@ "outputs": {}, "scl": "BlenderCtrl_MachineInit();" } - ] + ], + "language": "LAD" }, { "id": "2B", @@ -151,7 +153,8 @@ }, "scl": "IF \"AUX FALSE\" THEN\n \"Block_Move_Err\" := BLKMOV(SRCBLK := \"HMI_PID\".\"PPM303\", DSTBLK => \"Filler_Head_Variables\".\"FillerHead\"); // ADVERTENCIA: BLKMOV usado directamente, probablemente no compile!\nEND_IF;" } - ] + ], + "language": "LAD" }, { "id": "3C", @@ -225,7 +228,8 @@ "outputs": {}, "scl": "\"gEmergencyPressed\" := NOT \"gIN_VoltageOk\" AND \"M19000\";\n\"M19000\" := \"gIN_VoltageOk\"; // N_TRIG(\"gIN_VoltageOk\")" } - ] + ], + "language": "LAD" }, { "id": "4D", @@ -466,7 +470,8 @@ "outputs": {}, "scl": "\"gBlenderSuppliesOk\" := ((\"gIN_LinePressCO2Ok\" OR (\"gWorkshopTest\" AND (NOT \"gWorkshop_Co2_Presence\")) AND (NOT \"gWorkshop_CIP_Signals\")) AND \"HMI_Digital\".\"_PAL_S11\".\"Filtered\") OR (\"gIN_LinePressCO2Ok\" OR (\"gWorkshopTest\" AND (NOT \"gWorkshop_Co2_Presence\")) AND (NOT \"gWorkshop_CIP_Signals\")) AND (NOT \"Disable_Bit\") AND \"gIN_VoltageOk\";" } - ] + ], + "language": "LAD" }, { "id": "5E", @@ -482,15 +487,15 @@ }, "negated_pins": {}, "inputs": { - "en": { - "type": "powerrail" - }, "in": { "uid": "21", "scope": "LiteralConstant", "type": "constant", "datatype": "Int", "value": 0 + }, + "en": { + "type": "powerrail" } }, "outputs": { @@ -505,7 +510,8 @@ }, "scl": "\"HMI_Variables_Status\".\"Procedures\".\"BlenderStateNum\" := 0;" } - ] + ], + "language": "LAD" }, { "id": "6F", @@ -539,6 +545,12 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "s": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "24", + "source_pin": "out" + }, "tv": { "uid": "23", "scope": "TypedConstant", @@ -546,12 +558,6 @@ "datatype": "TypedConstant", "value": "S5T#2S" }, - "s": { - "type": "connection", - "source_instruction_type": "Contact", - "source_instruction_uid": "24", - "source_pin": "out" - }, "en": { "type": "connection", "source_instruction_uid": "24", @@ -561,7 +567,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "80", @@ -611,7 +618,8 @@ "outputs": {}, "scl": "\"gBlenderProdMode\" := \"HMI_Variables_Status\".\"System\".\"Blender_Prod_CIP\";" } - ] + ], + "language": "LAD" }, { "id": "91", @@ -672,18 +680,18 @@ }, "negated_pins": {}, "inputs": { - "en": { - "type": "connection", - "source_instruction_type": "Contact", - "source_instruction_uid": "25", - "source_pin": "out" - }, "in": { "uid": "23", "scope": "LiteralConstant", "type": "constant", "datatype": "Int", "value": 19 + }, + "en": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "25", + "source_pin": "out" } }, "outputs": { @@ -698,7 +706,8 @@ }, "scl": "IF (NOT \"HMI_Variables_Status\".\"System\".\"Blender_Prod_CIP\") THEN\n \"HMI_Variables_Status\".\"Procedures\".\"BlenderStateNum\" := 19;\nEND_IF;" } - ] + ], + "language": "LAD" }, { "id": "A2", @@ -730,7 +739,7 @@ { "instruction_uid": "27", "uid": "27", - "type": "RCoil", + "type": "RCoil_scl", "template_values": {}, "negated_pins": {}, "inputs": { @@ -747,12 +756,13 @@ "name": "\"HMI_Variables_Status\".\"Meters\".\"QTM3012_PRD_Fault\"" } }, - "outputs": {} + "outputs": {}, + "scl": "IF (NOT \"AUX FALSE\") THEN\n \"HMI_Variables_Status\".\"Meters\".\"QTM3012_PRD_Fault\" := FALSE;\nEND_IF;" }, { "instruction_uid": "28", "uid": "28", - "type": "RCoil", + "type": "RCoil_scl", "template_values": {}, "negated_pins": {}, "inputs": { @@ -769,12 +779,13 @@ "name": "\"gmPDS2000_Error_Fault\"" } }, - "outputs": {} + "outputs": {}, + "scl": "IF (NOT \"AUX FALSE\") THEN\n \"gmPDS2000_Error_Fault\" := FALSE;\nEND_IF;" }, { "instruction_uid": "29", "uid": "29", - "type": "RCoil", + "type": "RCoil_scl", "template_values": {}, "negated_pins": {}, "inputs": { @@ -791,12 +802,13 @@ "name": "\"HMI_Variables_Status\".\"Meters\".\"QTM3012_PRD_Run\"" } }, - "outputs": {} + "outputs": {}, + "scl": "IF (NOT \"AUX FALSE\") THEN\n \"HMI_Variables_Status\".\"Meters\".\"QTM3012_PRD_Run\" := FALSE;\nEND_IF;" }, { "instruction_uid": "30", "uid": "30", - "type": "RCoil", + "type": "RCoil_scl", "template_values": {}, "negated_pins": {}, "inputs": { @@ -813,9 +825,11 @@ "name": "\"gNoFreezeProductMeter\"" } }, - "outputs": {} + "outputs": {}, + "scl": "IF (NOT \"AUX FALSE\") THEN\n \"gNoFreezeProductMeter\" := FALSE;\nEND_IF;" } - ] + ], + "language": "LAD" }, { "id": "B3", @@ -867,7 +881,8 @@ "outputs": {}, "scl": "\"System_RunOut_Variables\".\"ProdPipeRunOutFillerBott\" := (NOT \"System_RunOut_Variables\".\"ProdPipeRunOutWaterCount\");" } - ] + ], + "language": "LAD" }, { "id": "C4", @@ -1035,7 +1050,8 @@ "outputs": {}, "scl": "\"gStillWaterByPassEn\" := ((\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_StillWaterByPass\" OR (\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_ByPassDeair\" AND (NOT \"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_Deaireation\"))) AND \"Blender_Variables_Pers\".\"gWaterRecipe\") AND (NOT \"Blender_Variables_Pers\".\"gCarboStillRecipe\");" } - ] + ], + "language": "LAD" }, { "id": "D5", @@ -1156,7 +1172,8 @@ "outputs": {}, "scl": "\"gBlendFiStillWaterByPass\" := ((\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_BlendFillSystem\" AND \"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_StillWaterByPass\") AND \"Blender_Variables_Pers\".\"gWaterRecipe\") AND (NOT \"Blender_Variables_Pers\".\"gCarboStillRecipe\");" } - ] + ], + "language": "LAD" }, { "id": "E6", @@ -1398,7 +1415,8 @@ "outputs": {}, "scl": "\"gHVP301_Open\" := ((\"gSyrupRoomEn\" AND (NOT \"gIN_HVP301_Aux\")) AND (NOT \"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_FastChangeOverEnabled\") AND \"Procedure_Variables\".\"FTP302Line_Preparation\".\"Done\") AND (NOT \"Procedure_Variables\".\"Syr_RunOut\".\"Done\") OR ((((\"gSyrupRoomEn\" AND (NOT \"gIN_HVP301_Aux\")) AND \"gBlenderCIPMode\") AND \"gIN_CIP_CIPRunning\") AND \"Procedure_Variables\".\"Blender_Run\".\"Running\");" } - ] + ], + "language": "LAD" }, { "id": "F7", @@ -1432,6 +1450,12 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "s": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "25", + "source_pin": "out" + }, "tv": { "uid": "22", "scope": "TypedConstant", @@ -1439,12 +1463,6 @@ "datatype": "TypedConstant", "value": "S5T#1S" }, - "s": { - "type": "connection", - "source_instruction_type": "Contact", - "source_instruction_uid": "25", - "source_pin": "out" - }, "en": { "type": "connection", "source_instruction_uid": "25", @@ -1476,7 +1494,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "108", @@ -1552,7 +1571,8 @@ "outputs": {}, "scl": "IF \"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_MeterType\" = 6 THEN\n Maselli_PA_Control();\nEND_IF;" } - ] + ], + "language": "LAD" }, { "id": "119", @@ -1628,7 +1648,8 @@ "outputs": {}, "scl": "IF \"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_MeterType\" = 5 THEN\n mPDS_PA_Control();\nEND_IF;" } - ] + ], + "language": "LAD" }, { "id": "12A", @@ -1672,7 +1693,8 @@ "outputs": {}, "scl": "IF \"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_SyrBrixMeter\" THEN\n mPDS_SYR_PA_Control();\nEND_IF;" } - ] + ], + "language": "LAD" }, { "id": "13B", @@ -1748,7 +1770,8 @@ "outputs": {}, "scl": "IF \"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_MeterType\" = 3 THEN\n GetProdBrixCO2_Anal_Inpt();\nEND_IF;" } - ] + ], + "language": "LAD" }, { "id": "14C", @@ -1769,7 +1792,8 @@ "outputs": {}, "scl": "ProductQuality();" } - ] + ], + "language": "LAD" }, { "id": "15D", @@ -1792,7 +1816,8 @@ "outputs": {}, "scl": "\"Input_Data\"();" } - ] + ], + "language": "LAD" }, { "id": "16E", @@ -1813,7 +1838,8 @@ "outputs": {}, "scl": "SelCheckBrixSource();" } - ] + ], + "language": "LAD" }, { "id": "17F", @@ -1857,7 +1883,8 @@ "outputs": {}, "scl": "IF \"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_InverterRecirPumpPPM306\" THEN\n CTRLCoolingSystem();\nEND_IF;" } - ] + ], + "language": "LAD" }, { "id": "190", @@ -1878,7 +1905,8 @@ "outputs": {}, "scl": "TankLevel();" } - ] + ], + "language": "LAD" }, { "id": "1A1", @@ -1977,7 +2005,8 @@ "outputs": {}, "scl": "\"gProductionONS\" := (\"gBlenderProdMode\" AND NOT \"M19001\") AND (NOT \"mDelayPowerOnTmr\");" } - ] + ], + "language": "LAD" }, { "id": "1B2", @@ -2091,7 +2120,8 @@ "outputs": {}, "scl": "IF (\"gProductionONS\" OR \"Procedure_Variables\".\"Blender_Rinse\".\"ONS_Done\") AND (NOT \"Blender_Variables_Pers\".\"gBlenderStarted\") THEN\n BlenderCtrl_ProdModeInit();\nEND_IF;" } - ] + ], + "language": "LAD" }, { "id": "1C3", @@ -2190,7 +2220,8 @@ "outputs": {}, "scl": "\"gRinseONS\" := (\"HMI_Variables_Status\".\"System\".\"Blender_Prod_CIP\" AND NOT \"M19002\") AND (NOT \"mDelayPowerOnTmr\");" } - ] + ], + "language": "LAD" }, { "id": "1D4", @@ -2289,7 +2320,8 @@ "outputs": {}, "scl": "\"gCIPONS\" := (\"gBlenderCIPMode\" AND NOT \"M19003\") AND (NOT \"mDelayPowerOnTmr\");" } - ] + ], + "language": "LAD" }, { "id": "1E5", @@ -2333,7 +2365,8 @@ "outputs": {}, "scl": "IF \"gCIPONS\" THEN\n BlenderCtrl_CIPModeInit();\nEND_IF;" } - ] + ], + "language": "LAD" }, { "id": "1F6", @@ -2354,7 +2387,8 @@ "outputs": {}, "scl": "BlenderCtrl_ResetSPWord();" } - ] + ], + "language": "LAD" }, { "id": "207", @@ -2375,7 +2409,8 @@ "outputs": {}, "scl": "BlenderRun__Control();" } - ] + ], + "language": "LAD" }, { "id": "218", @@ -2396,7 +2431,8 @@ "outputs": {}, "scl": "Prod_Tank_PressCtrl();" } - ] + ], + "language": "LAD" }, { "id": "229", @@ -2417,7 +2453,8 @@ "outputs": {}, "scl": "Baialage();" } - ] + ], + "language": "LAD" }, { "id": "23A", @@ -2440,7 +2477,8 @@ "outputs": {}, "scl": "\"FirstProduction_Data\"();" } - ] + ], + "language": "LAD" }, { "id": "24B", @@ -2461,7 +2499,8 @@ "outputs": {}, "scl": "CIPMain();" } - ] + ], + "language": "LAD" }, { "id": "25C", @@ -2482,7 +2521,8 @@ "outputs": {}, "scl": "BlenderRinse();" } - ] + ], + "language": "LAD" }, { "id": "26D", @@ -2503,7 +2543,8 @@ "outputs": {}, "scl": "Safeties();" } - ] + ], + "language": "LAD" }, { "id": "27E", @@ -2524,7 +2565,8 @@ "outputs": {}, "scl": "Instrument_Scanner();" } - ] + ], + "language": "LAD" }, { "id": "28F", @@ -2545,7 +2587,8 @@ "outputs": {}, "scl": "VacuumCtrl();" } - ] + ], + "language": "LAD" }, { "id": "2A0", @@ -2566,7 +2609,8 @@ "outputs": {}, "scl": "SyrupRoomCtrl();" } - ] + ], + "language": "LAD" }, { "id": "2B1", @@ -2614,7 +2658,8 @@ "outputs": {}, "scl": "IF (NOT \"mDelayPowerOnTmr\") THEN\n \"Blender_Procedure Data\"();\nEND_IF;" } - ] + ], + "language": "LAD" }, { "id": "2C2", @@ -2635,7 +2680,8 @@ "outputs": {}, "scl": "Pneumatic_Valve_Ctrl();" } - ] + ], + "language": "LAD" }, { "id": "2D3", @@ -2656,7 +2702,8 @@ "outputs": {}, "scl": "PumpsControl();" } - ] + ], + "language": "LAD" }, { "id": "2E4", @@ -2700,7 +2747,8 @@ "outputs": {}, "scl": "IF \"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_Report\" THEN\n ProdReportManager();\nEND_IF;" } - ] + ], + "language": "LAD" }, { "id": "2F5", @@ -2721,7 +2769,8 @@ "outputs": {}, "scl": "Output();" } - ] + ], + "language": "LAD" }, { "id": "306", @@ -2742,7 +2791,8 @@ "outputs": {}, "scl": "SLIM_Block();" } - ] + ], + "language": "LAD" }, { "id": "317", @@ -2763,7 +2813,8 @@ "outputs": {}, "scl": "Interlocking_Panel_1();" } - ] + ], + "language": "LAD" }, { "id": "328", @@ -2784,7 +2835,8 @@ "outputs": {}, "scl": "FillerControl();" } - ] + ], + "language": "LAD" }, { "id": "339", @@ -2805,7 +2857,8 @@ "outputs": {}, "scl": "BlenderCtrl_UpdatePWord();" } - ] + ], + "language": "LAD" }, { "id": "34A", @@ -2839,6 +2892,12 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "s": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "24", + "source_pin": "out" + }, "tv": { "uid": "22", "scope": "TypedConstant", @@ -2846,12 +2905,6 @@ "datatype": "TypedConstant", "value": "S5T#2S" }, - "s": { - "type": "connection", - "source_instruction_type": "Contact", - "source_instruction_uid": "24", - "source_pin": "out" - }, "en": { "type": "connection", "source_instruction_uid": "24", @@ -2861,7 +2914,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "35B", @@ -2940,6 +2994,12 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "s": { + "type": "connection", + "source_instruction_type": "O", + "source_instruction_uid": "28", + "source_pin": "out" + }, "tv": { "uid": "24", "scope": "TypedConstant", @@ -2947,12 +3007,6 @@ "datatype": "TypedConstant", "value": "S5T#2S" }, - "s": { - "type": "connection", - "source_instruction_type": "O", - "source_instruction_uid": "28", - "source_pin": "out" - }, "en": { "type": "connection", "source_instruction_uid": "28", @@ -2984,7 +3038,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "36C", @@ -3014,7 +3069,7 @@ { "instruction_uid": "24", "uid": "24", - "type": "RCoil", + "type": "RCoil_scl", "template_values": {}, "negated_pins": {}, "inputs": { @@ -3031,9 +3086,11 @@ "name": "\"gFTN301_ResetTot\"" } }, - "outputs": {} + "outputs": {}, + "scl": "IF \"gFTN301_ResetTot\" THEN\n \"gFTN301_ResetTot\" := FALSE;\nEND_IF;" } - ] + ], + "language": "LAD" }, { "id": "37D", @@ -3112,6 +3169,12 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "s": { + "type": "connection", + "source_instruction_type": "O", + "source_instruction_uid": "29", + "source_pin": "out" + }, "tv": { "uid": "24", "scope": "TypedConstant", @@ -3119,12 +3182,6 @@ "datatype": "TypedConstant", "value": "S5T#2S" }, - "s": { - "type": "connection", - "source_instruction_type": "O", - "source_instruction_uid": "29", - "source_pin": "out" - }, "en": { "type": "connection", "source_instruction_uid": "29", @@ -3178,7 +3235,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "38E", @@ -3208,7 +3266,7 @@ { "instruction_uid": "24", "uid": "24", - "type": "RCoil", + "type": "RCoil_scl", "template_values": {}, "negated_pins": {}, "inputs": { @@ -3225,9 +3283,11 @@ "name": "\"gFTP302_ResetTot\"" } }, - "outputs": {} + "outputs": {}, + "scl": "IF \"gFTP302_ResetTot\" THEN\n \"gFTP302_ResetTot\" := FALSE;\nEND_IF;" } - ] + ], + "language": "LAD" }, { "id": "39F", @@ -3306,6 +3366,12 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "s": { + "type": "connection", + "source_instruction_type": "O", + "source_instruction_uid": "28", + "source_pin": "out" + }, "tv": { "uid": "24", "scope": "TypedConstant", @@ -3313,12 +3379,6 @@ "datatype": "TypedConstant", "value": "S5T#2S" }, - "s": { - "type": "connection", - "source_instruction_type": "O", - "source_instruction_uid": "28", - "source_pin": "out" - }, "en": { "type": "connection", "source_instruction_uid": "28", @@ -3350,7 +3410,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "3B0", @@ -3380,7 +3441,7 @@ { "instruction_uid": "24", "uid": "24", - "type": "RCoil", + "type": "RCoil_scl", "template_values": {}, "negated_pins": {}, "inputs": { @@ -3397,9 +3458,11 @@ "name": "\"gFTM303_ResetTot\"" } }, - "outputs": {} + "outputs": {}, + "scl": "IF \"gFTM303_ResetTot\" THEN\n \"gFTM303_ResetTot\" := FALSE;\nEND_IF;" } - ] + ], + "language": "LAD" }, { "id": "3C1", @@ -3478,6 +3541,12 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "s": { + "type": "connection", + "source_instruction_type": "O", + "source_instruction_uid": "28", + "source_pin": "out" + }, "tv": { "uid": "24", "scope": "TypedConstant", @@ -3485,12 +3554,6 @@ "datatype": "TypedConstant", "value": "S5T#2S" }, - "s": { - "type": "connection", - "source_instruction_type": "O", - "source_instruction_uid": "28", - "source_pin": "out" - }, "en": { "type": "connection", "source_instruction_uid": "28", @@ -3522,7 +3585,8 @@ }, "outputs": {} } - ] + ], + "language": "LAD" }, { "id": "3D2", @@ -3552,7 +3616,7 @@ { "instruction_uid": "24", "uid": "24", - "type": "RCoil", + "type": "RCoil_scl", "template_values": {}, "negated_pins": {}, "inputs": { @@ -3569,9 +3633,11 @@ "name": "\"gProductMFMResetTot\"" } }, - "outputs": {} + "outputs": {}, + "scl": "IF \"gProductMFMResetTot\" THEN\n \"gProductMFMResetTot\" := FALSE;\nEND_IF;" } - ] + ], + "language": "LAD" }, { "id": "3E3", @@ -3601,7 +3667,7 @@ { "instruction_uid": "24", "uid": "24", - "type": "RCoil", + "type": "RCoil_scl", "template_values": {}, "negated_pins": {}, "inputs": { @@ -3618,9 +3684,11 @@ "name": "\"gBlendResetTotalizer\"" } }, - "outputs": {} + "outputs": {}, + "scl": "IF \"gBlendResetTotalizer\" THEN\n \"gBlendResetTotalizer\" := FALSE;\nEND_IF;" } - ] + ], + "language": "LAD" }, { "id": "3F4", @@ -3666,7 +3734,8 @@ "outputs": {}, "scl": "IF (NOT \"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_Simulation\") THEN\n BlenderCtrl_MFM_Command();\nEND_IF;" } - ] + ], + "language": "LAD" }, { "id": "405", @@ -3687,7 +3756,8 @@ "outputs": {}, "scl": "CPU_DP_Global_Diag();" } - ] + ], + "language": "LAD" }, { "id": "416", @@ -3708,7 +3778,8 @@ "outputs": {}, "scl": "Profibus_Network();" } - ] + ], + "language": "LAD" }, { "id": "427", @@ -3729,7 +3800,8 @@ "outputs": {}, "scl": "ModValveFault();" } - ] + ], + "language": "LAD" }, { "id": "438", @@ -3843,7 +3915,8 @@ "outputs": {}, "scl": "\"HMI_Variables_Cmd\".\"Commands_From_HMI\".\"F7_DeviceControl\".\"Light\" := \"HMI_Variables_Cmd\".\"Commands_From_HMI\".\"F7_DeviceControl\".\"Command\" AND \"HMI_Variables_Cmd\".\"Commands_From_HMI\".\"F7_DeviceControl\".\"Enable\";" } - ] + ], + "language": "LAD" }, { "id": "449", @@ -3864,7 +3937,8 @@ "outputs": {}, "scl": "BlenderCtrl_ManualActive();" } - ] + ], + "language": "LAD" }, { "id": "45A", @@ -4094,7 +4168,7 @@ { "instruction_uid": "43", "uid": "43", - "type": "SCoil", + "type": "SCoil_scl", "template_values": {}, "negated_pins": {}, "inputs": { @@ -4111,9 +4185,11 @@ "name": "\"HMI_Variables_Cmd\".\"Recipe\".\"Edit\"" } }, - "outputs": {} + "outputs": {}, + "scl": "IF \"mAux_FP_M700_1\" THEN\n \"HMI_Variables_Cmd\".\"Recipe\".\"Edit\" := TRUE;\nEND_IF;" } - ] + ], + "language": "LAD" }, { "id": "46B", @@ -4159,7 +4235,8 @@ "outputs": {}, "scl": "IF \"AUX TRUE\" THEN\n \"RecipeManagement_Data\"();\nEND_IF;" } - ] + ], + "language": "LAD" }, { "id": "47C", @@ -4180,7 +4257,8 @@ "outputs": {}, "scl": "RecipeCalculation();" } - ] + ], + "language": "LAD" } ] } \ No newline at end of file diff --git a/BlenderCtrl__Main_simplified_processed.scl b/BlenderCtrl__Main_simplified_processed.scl index d96e2fe..5276434 100644 --- a/BlenderCtrl__Main_simplified_processed.scl +++ b/BlenderCtrl__Main_simplified_processed.scl @@ -27,374 +27,339 @@ END_VAR BEGIN - // Network 1: Clock Generation + // Network 1: Clock Generation (Original Language: LAD) Clock_Signal(); - // Network 2: Machine Init + // Network 2: Machine Init (Original Language: LAD) BlenderCtrl_MachineInit(); - // Network 3: Filler Head + // Network 3: Filler Head (Original Language: LAD) - // RLO: "AUX FALSE" IF "AUX FALSE" THEN "Block_Move_Err" := BLKMOV(SRCBLK := "HMI_PID"."PPM303", DSTBLK => "Filler_Head_Variables"."FillerHead"); // ADVERTENCIA: BLKMOV usado directamente, probablemente no compile! END_IF; - // Network 4: Emergency Pressed + // Network 4: Emergency Pressed (Original Language: LAD) - // RLO: "gIN_VoltageOk" // Logic moved to Coil 26 "gEmergencyPressed" := NOT "gIN_VoltageOk" AND "M19000"; "M19000" := "gIN_VoltageOk"; // N_TRIG("gIN_VoltageOk") - // Network 5: Air and CO2 pressure ok and auxiliary ok + // Network 5: Air and CO2 pressure ok and auxiliary ok (Original Language: LAD) - // RLO: "gIN_LinePressCO2Ok" - // RLO: "gWorkshopTest" - // RLO: "gWorkshopTest" AND (NOT "gWorkshop_Co2_Presence") - // RLO: ("gWorkshopTest" AND (NOT "gWorkshop_Co2_Presence")) AND (NOT "gWorkshop_CIP_Signals") - // RLO: ("gIN_LinePressCO2Ok" OR ("gWorkshopTest" AND (NOT "gWorkshop_Co2_Presence")) AND (NOT "gWorkshop_CIP_Signals")) AND "HMI_Digital"."_PAL_S11"."Filtered" - // RLO: ("gIN_LinePressCO2Ok" OR ("gWorkshopTest" AND (NOT "gWorkshop_Co2_Presence")) AND (NOT "gWorkshop_CIP_Signals")) AND (NOT "Disable_Bit") - // RLO: (("gIN_LinePressCO2Ok" OR ("gWorkshopTest" AND (NOT "gWorkshop_Co2_Presence")) AND (NOT "gWorkshop_CIP_Signals")) AND "HMI_Digital"."_PAL_S11"."Filtered") OR ("gIN_LinePressCO2Ok" OR ("gWorkshopTest" AND (NOT "gWorkshop_Co2_Presence")) AND (NOT "gWorkshop_CIP_Signals")) AND (NOT "Disable_Bit") AND "gIN_VoltageOk" "gBlenderSuppliesOk" := (("gIN_LinePressCO2Ok" OR ("gWorkshopTest" AND (NOT "gWorkshop_Co2_Presence")) AND (NOT "gWorkshop_CIP_Signals")) AND "HMI_Digital"."_PAL_S11"."Filtered") OR ("gIN_LinePressCO2Ok" OR ("gWorkshopTest" AND (NOT "gWorkshop_Co2_Presence")) AND (NOT "gWorkshop_CIP_Signals")) AND (NOT "Disable_Bit") AND "gIN_VoltageOk"; - // Network 6: Blender State Num + // Network 6: Blender State Num (Original Language: LAD) "HMI_Variables_Status"."Procedures"."BlenderStateNum" := 0; - // Network 7: Delay Power On + // Network 7: Delay Power On (Original Language: LAD) - // RLO: "FirstScan" + // Network did not produce printable SCL code. - // Network 8: Production Mode + // Network 8: Production Mode (Original Language: LAD) - // RLO: "HMI_Variables_Status"."System"."Blender_Prod_CIP" "gBlenderProdMode" := "HMI_Variables_Status"."System"."Blender_Prod_CIP"; - // Network 9: CIp Mode + // Network 9: CIp Mode (Original Language: LAD) - // RLO: (NOT "HMI_Variables_Status"."System"."Blender_Prod_CIP") "gBlenderCIPMode" := (NOT "HMI_Variables_Status"."System"."Blender_Prod_CIP"); IF (NOT "HMI_Variables_Status"."System"."Blender_Prod_CIP") THEN "HMI_Variables_Status"."Procedures"."BlenderStateNum" := 19; END_IF; - // Network 10: Error Faults + // Network 10: Error Faults (Original Language: LAD) - // RLO: (NOT "AUX FALSE") + IF (NOT "AUX FALSE") THEN + "HMI_Variables_Status"."Meters"."QTM3012_PRD_Fault" := FALSE; + END_IF; + IF (NOT "AUX FALSE") THEN + "gmPDS2000_Error_Fault" := FALSE; + END_IF; + IF (NOT "AUX FALSE") THEN + "HMI_Variables_Status"."Meters"."QTM3012_PRD_Run" := FALSE; + END_IF; + IF (NOT "AUX FALSE") THEN + "gNoFreezeProductMeter" := FALSE; + END_IF; - // Network 11: Filler Bottle Count Used to push Product + // Network 11: Filler Bottle Count Used to push Product (Original Language: LAD) - // RLO: (NOT "System_RunOut_Variables"."ProdPipeRunOutWaterCount") "System_RunOut_Variables"."ProdPipeRunOutFillerBott" := (NOT "System_RunOut_Variables"."ProdPipeRunOutWaterCount"); - // Network 12: Water Bypass Enable + // Network 12: Water Bypass Enable (Original Language: LAD) - // RLO: "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_StillWaterByPass" - // RLO: "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_ByPassDeair" - // RLO: "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_ByPassDeair" AND (NOT "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Deaireation") - // RLO: ("HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_StillWaterByPass" OR ("HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_ByPassDeair" AND (NOT "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Deaireation"))) AND "Blender_Variables_Pers"."gWaterRecipe" - // RLO: (("HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_StillWaterByPass" OR ("HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_ByPassDeair" AND (NOT "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Deaireation"))) AND "Blender_Variables_Pers"."gWaterRecipe") AND (NOT "Blender_Variables_Pers"."gCarboStillRecipe") "gStillWaterByPassEn" := (("HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_StillWaterByPass" OR ("HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_ByPassDeair" AND (NOT "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Deaireation"))) AND "Blender_Variables_Pers"."gWaterRecipe") AND (NOT "Blender_Variables_Pers"."gCarboStillRecipe"); - // Network 13: Still Water Bypass + // Network 13: Still Water Bypass (Original Language: LAD) - // RLO: "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_BlendFillSystem" - // RLO: "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_BlendFillSystem" AND "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_StillWaterByPass" - // RLO: ("HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_BlendFillSystem" AND "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_StillWaterByPass") AND "Blender_Variables_Pers"."gWaterRecipe" - // RLO: (("HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_BlendFillSystem" AND "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_StillWaterByPass") AND "Blender_Variables_Pers"."gWaterRecipe") AND (NOT "Blender_Variables_Pers"."gCarboStillRecipe") "gBlendFiStillWaterByPass" := (("HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_BlendFillSystem" AND "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_StillWaterByPass") AND "Blender_Variables_Pers"."gWaterRecipe") AND (NOT "Blender_Variables_Pers"."gCarboStillRecipe"); - // Network 14: Manual Syrup Drain Valve Open - Operator Alarm + // Network 14: Manual Syrup Drain Valve Open - Operator Alarm (Original Language: LAD) - // RLO: "gSyrupRoomEn" - // RLO: "gSyrupRoomEn" AND (NOT "gIN_HVP301_Aux") - // RLO: ("gSyrupRoomEn" AND (NOT "gIN_HVP301_Aux")) AND (NOT "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_FastChangeOverEnabled") - // RLO: ("gSyrupRoomEn" AND (NOT "gIN_HVP301_Aux")) AND (NOT "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_FastChangeOverEnabled") AND "Procedure_Variables"."FTP302Line_Preparation"."Done" - // RLO: (("gSyrupRoomEn" AND (NOT "gIN_HVP301_Aux")) AND (NOT "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_FastChangeOverEnabled") AND "Procedure_Variables"."FTP302Line_Preparation"."Done") AND (NOT "Procedure_Variables"."Syr_RunOut"."Done") - // RLO: ("gSyrupRoomEn" AND (NOT "gIN_HVP301_Aux")) AND "gBlenderCIPMode" - // RLO: (("gSyrupRoomEn" AND (NOT "gIN_HVP301_Aux")) AND "gBlenderCIPMode") AND "gIN_CIP_CIPRunning" - // RLO: ((("gSyrupRoomEn" AND (NOT "gIN_HVP301_Aux")) AND "gBlenderCIPMode") AND "gIN_CIP_CIPRunning") AND "Procedure_Variables"."Blender_Run"."Running" "gHVP301_Open" := (("gSyrupRoomEn" AND (NOT "gIN_HVP301_Aux")) AND (NOT "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_FastChangeOverEnabled") AND "Procedure_Variables"."FTP302Line_Preparation"."Done") AND (NOT "Procedure_Variables"."Syr_RunOut"."Done") OR (((("gSyrupRoomEn" AND (NOT "gIN_HVP301_Aux")) AND "gBlenderCIPMode") AND "gIN_CIP_CIPRunning") AND "Procedure_Variables"."Blender_Run"."Running"); - // Network 15: Manual Syrup Drain Valve Open - Operator Alarm + // Network 15: Manual Syrup Drain Valve Open - Operator Alarm (Original Language: LAD) - // RLO: "gIN_HVM302_Aux" + // Network did not produce printable SCL code. - // Network 16: Maselli Control + // Network 16: Maselli Control (Original Language: LAD) - // RLO: "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_BrixMeter" IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_MeterType" = 6 THEN Maselli_PA_Control(); END_IF; - // Network 17: mPDS Control + // Network 17: mPDS Control (Original Language: LAD) - // RLO: "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_BrixMeter" IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_MeterType" = 5 THEN mPDS_PA_Control(); END_IF; - // Network 18: mPDS Syrup Control + // Network 18: mPDS Syrup Control (Original Language: LAD) - // RLO: "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_SyrBrixMeter" IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_SyrBrixMeter" THEN mPDS_SYR_PA_Control(); END_IF; - // Network 19: Co2 Analog Input + // Network 19: Co2 Analog Input (Original Language: LAD) // GetProdBrixCO2_FromAnalogIn // CALL "GetProdBrixCO2_FromAn" // NOP 0 - // RLO: "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_BrixMeter" IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_MeterType" = 3 THEN GetProdBrixCO2_Anal_Inpt(); END_IF; - // Network 20: Quality + // Network 20: Quality (Original Language: LAD) ProductQuality(); - // Network 21: Input Data + // Network 21: Input Data (Original Language: LAD) "Input_Data"(); - // Network 22: Sel Brix Source Check + // Network 22: Sel Brix Source Check (Original Language: LAD) SelCheckBrixSource(); - // Network 23: Check Water Cooling System Temperature + // Network 23: Check Water Cooling System Temperature (Original Language: LAD) - // RLO: "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_InverterRecirPumpPPM306" IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_InverterRecirPumpPPM306" THEN CTRLCoolingSystem(); END_IF; - // Network 24: Tank Level + // Network 24: Tank Level (Original Language: LAD) TankLevel(); - // Network 25: Production ONS + // Network 25: Production ONS (Original Language: LAD) - // RLO: "gBlenderProdMode" // PBox Logic moved to consumer Coil - // RLO: ("gBlenderProdMode" AND NOT "M19001") AND (NOT "mDelayPowerOnTmr") "gProductionONS" := ("gBlenderProdMode" AND NOT "M19001") AND (NOT "mDelayPowerOnTmr"); - // Network 26: Blender Prod Mode Init + // Network 26: Blender Prod Mode Init (Original Language: LAD) - // RLO: "gProductionONS" - // RLO: "Procedure_Variables"."Blender_Rinse"."ONS_Done" - // RLO: ("gProductionONS" OR "Procedure_Variables"."Blender_Rinse"."ONS_Done") AND (NOT "Blender_Variables_Pers"."gBlenderStarted") IF ("gProductionONS" OR "Procedure_Variables"."Blender_Rinse"."ONS_Done") AND (NOT "Blender_Variables_Pers"."gBlenderStarted") THEN BlenderCtrl_ProdModeInit(); END_IF; - // Network 27: Rinse ONS + // Network 27: Rinse ONS (Original Language: LAD) - // RLO: "HMI_Variables_Status"."System"."Blender_Prod_CIP" // PBox Logic moved to consumer Coil - // RLO: ("HMI_Variables_Status"."System"."Blender_Prod_CIP" AND NOT "M19002") AND (NOT "mDelayPowerOnTmr") "gRinseONS" := ("HMI_Variables_Status"."System"."Blender_Prod_CIP" AND NOT "M19002") AND (NOT "mDelayPowerOnTmr"); - // Network 28: CIP ONS + // Network 28: CIP ONS (Original Language: LAD) - // RLO: "gBlenderCIPMode" // PBox Logic moved to consumer Coil - // RLO: ("gBlenderCIPMode" AND NOT "M19003") AND (NOT "mDelayPowerOnTmr") "gCIPONS" := ("gBlenderCIPMode" AND NOT "M19003") AND (NOT "mDelayPowerOnTmr"); - // Network 29: CIp Mode Init + // Network 29: CIp Mode Init (Original Language: LAD) - // RLO: "gCIPONS" IF "gCIPONS" THEN BlenderCtrl_CIPModeInit(); END_IF; - // Network 30: Reset SPWords + // Network 30: Reset SPWords (Original Language: LAD) BlenderCtrl_ResetSPWord(); - // Network 31: Blender Run Control + // Network 31: Blender Run Control (Original Language: LAD) BlenderRun__Control(); - // Network 32: Tank Pressure Control + // Network 32: Tank Pressure Control (Original Language: LAD) Prod_Tank_PressCtrl(); - // Network 33: Balaiage + // Network 33: Balaiage (Original Language: LAD) Baialage(); - // Network 34: First Production + // Network 34: First Production (Original Language: LAD) "FirstProduction_Data"(); - // Network 35: CIP MAIN Calling + // Network 35: CIP MAIN Calling (Original Language: LAD) CIPMain(); - // Network 36: Blender Rinse + // Network 36: Blender Rinse (Original Language: LAD) BlenderRinse(); - // Network 37: Safeties + // Network 37: Safeties (Original Language: LAD) Safeties(); - // Network 38: Instrument Scanner + // Network 38: Instrument Scanner (Original Language: LAD) Instrument_Scanner(); - // Network 39: Vacuum Control + // Network 39: Vacuum Control (Original Language: LAD) VacuumCtrl(); - // Network 40: Syrup Room Control + // Network 40: Syrup Room Control (Original Language: LAD) SyrupRoomCtrl(); - // Network 41: Blend Procedure Data + // Network 41: Blend Procedure Data (Original Language: LAD) - // RLO: (NOT "mDelayPowerOnTmr") IF (NOT "mDelayPowerOnTmr") THEN "Blender_Procedure Data"(); END_IF; - // Network 42: Pneumatic Valve Control + // Network 42: Pneumatic Valve Control (Original Language: LAD) Pneumatic_Valve_Ctrl(); - // Network 43: Pumps Control + // Network 43: Pumps Control (Original Language: LAD) PumpsControl(); - // Network 44: Prod Report Manager + // Network 44: Prod Report Manager (Original Language: LAD) - // RLO: "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Report" IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Report" THEN ProdReportManager(); END_IF; - // Network 45: Outputs + // Network 45: Outputs (Original Language: LAD) Output(); - // Network 46: SLIM BLOCK + // Network 46: SLIM BLOCK (Original Language: LAD) SLIM_Block(); - // Network 47: Interlocking Panel 1 + // Network 47: Interlocking Panel 1 (Original Language: LAD) Interlocking_Panel_1(); - // Network 48: Filler Control + // Network 48: Filler Control (Original Language: LAD) FillerControl(); - // Network 49: Blender Ctrl Update PWORD + // Network 49: Blender Ctrl Update PWORD (Original Language: LAD) BlenderCtrl_UpdatePWord(); - // Network 50: ResetTotalizer + // Network 50: ResetTotalizer (Original Language: LAD) - // RLO: "gBlendResetTotalizer" + // Network did not produce printable SCL code. - // Network 51: ResetWaterTot + // Network 51: ResetWaterTot (Original Language: LAD) - // RLO: "gFTN301_ResetTot" - // RLO: "mResetTotalizerTmr" + // Network did not produce printable SCL code. - // Network 52: Water VFM Reset Totalizer + // Network 52: Water VFM Reset Totalizer (Original Language: LAD) - // RLO: "gFTN301_ResetTot" + IF "gFTN301_ResetTot" THEN + "gFTN301_ResetTot" := FALSE; + END_IF; - // Network 53: ResetCO2Tot + // Network 53: ResetCO2Tot (Original Language: LAD) - // RLO: "gFTP302_ResetTot" - // RLO: "mResetTotalizerTmr" + // Network did not produce printable SCL code. - // Network 54: Syrup MFM Reset Totalizer + // Network 54: Syrup MFM Reset Totalizer (Original Language: LAD) - // RLO: "gFTP302_ResetTot" + IF "gFTP302_ResetTot" THEN + "gFTP302_ResetTot" := FALSE; + END_IF; - // Network 55: ResetProductTot + // Network 55: ResetProductTot (Original Language: LAD) - // RLO: "gFTM303_ResetTot" - // RLO: "mResetTotalizerTmr" + // Network did not produce printable SCL code. - // Network 56: CO2 MFM Reset Tot + // Network 56: CO2 MFM Reset Tot (Original Language: LAD) - // RLO: "gFTM303_ResetTot" + IF "gFTM303_ResetTot" THEN + "gFTM303_ResetTot" := FALSE; + END_IF; - // Network 57: ResetCO2Tot + // Network 57: ResetCO2Tot (Original Language: LAD) - // RLO: "gProductMFMResetTot" - // RLO: "mResetTotalizerTmr" + // Network did not produce printable SCL code. - // Network 58: Reset Totalizer + // Network 58: Reset Totalizer (Original Language: LAD) - // RLO: "gProductMFMResetTot" + IF "gProductMFMResetTot" THEN + "gProductMFMResetTot" := FALSE; + END_IF; - // Network 59: Reset Totalizer + // Network 59: Reset Totalizer (Original Language: LAD) - // RLO: "gBlendResetTotalizer" + IF "gBlendResetTotalizer" THEN + "gBlendResetTotalizer" := FALSE; + END_IF; - // Network 60: Blender Ctrl Command + // Network 60: Blender Ctrl Command (Original Language: LAD) - // RLO: (NOT "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Simulation") IF (NOT "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_Simulation") THEN BlenderCtrl_MFM_Command(); END_IF; - // Network 61: DP Global Diag + // Network 61: DP Global Diag (Original Language: LAD) CPU_DP_Global_Diag(); - // Network 62: Profibus + // Network 62: Profibus (Original Language: LAD) Profibus_Network(); - // Network 63: Valve Fault + // Network 63: Valve Fault (Original Language: LAD) ModValveFault(); - // Network 64: All Auto + // Network 64: All Auto (Original Language: LAD) - // RLO: "HMI_Variables_Cmd"."Commands_From_HMI"."F7_DeviceControl"."Command" - // RLO: "HMI_Variables_Cmd"."Commands_From_HMI"."F7_DeviceControl"."Command" AND "HMI_Variables_Cmd"."Commands_From_HMI"."F7_DeviceControl"."Enable" // NBox Logic moved to consumer Coil IF NOT ("HMI_Variables_Cmd"."Commands_From_HMI"."F7_DeviceControl"."Command" AND "HMI_Variables_Cmd"."Commands_From_HMI"."F7_DeviceControl"."Enable") AND "M19011" THEN BlenderCtrl_All_Auto(); END_IF; "HMI_Variables_Cmd"."Commands_From_HMI"."F7_DeviceControl"."Light" := "HMI_Variables_Cmd"."Commands_From_HMI"."F7_DeviceControl"."Command" AND "HMI_Variables_Cmd"."Commands_From_HMI"."F7_DeviceControl"."Enable"; - // Network 65: Ctrl HMI Manual Active + // Network 65: Ctrl HMI Manual Active (Original Language: LAD) BlenderCtrl_ManualActive(); - // Network 66: Mod Copy Recipe + // Network 66: Mod Copy Recipe (Original Language: LAD) - // RLO: "HMI_Variables_Cmd"."Recipe"."Main_Page" - // RLO: "HMI_Variables_Cmd"."Recipe"."Main_Page" AND (NOT "mFP_Recip_Main_Page") "mAux_FP_M700_1" := "HMI_Variables_Cmd"."Recipe"."Main_Page" AND (NOT "mFP_Recip_Main_Page"); "mFP_Recip_Main_Page" := "HMI_Variables_Cmd"."Recipe"."Main_Page"; - // RLO: "HMI_Variables_Cmd"."Recipe"."Main_Page" - // RLO: "HMI_Variables_Cmd"."Recipe"."Main_Page" AND "HMI_Variables_Cmd"."Recipe"."Edit" - // RLO: "mAux_FP_M700_1" + IF "mAux_FP_M700_1" THEN + "HMI_Variables_Cmd"."Recipe"."Edit" := TRUE; + END_IF; - // Network 67: to HMI - Recipe Management + // Network 67: to HMI - Recipe Management (Original Language: LAD) - // RLO: "AUX TRUE" IF "AUX TRUE" THEN "RecipeManagement_Data"(); END_IF; - // Network 68: Recipe Calculation + // Network 68: Recipe Calculation (Original Language: LAD) RecipeCalculation(); diff --git a/TestLAD.xml b/TestLAD.xml index 5c3eeea..3fe7fd2 100644 --- a/TestLAD.xml +++ b/TestLAD.xml @@ -77,7 +77,161 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LAD @@ -132,7 +286,7 @@ it-IT - + Manual Syrup Drain Valve Open - Operator Alarm @@ -181,55 +335,68 @@ - + - - + - - - - + + + S5T#1S + - - + - - Variant - + + - + - + - + - + - - - - - - + + - - + + + + + + + + + + + + + + + + + + + + + + @@ -287,7 +454,7 @@ it-IT - Filler Head + Manual Syrup Drain Valve Open - Operator Alarm @@ -332,68 +499,62 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - - - - - - - - - - - - - - true - - - - - - - - - - - - - - - SCL + + + + + + + + + + + + + + + S5T#2S + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LAD @@ -447,7 +608,7 @@ it-IT - + ResetTotalizer @@ -496,63 +657,90 @@ - + - - - + - + - + + + S5T#2S + + + - - - + - - + + + + 2 - - - - - + + - + - - - - - - - - - - - + + - - + + + + + + - + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + @@ -610,7 +798,7 @@ it-IT - Error Faults + ResetWaterTot @@ -653,45 +841,900 @@ - + + + + + + + + + + + + + + + + + + + + + + S5T#2S + + + + + + + + + + + + + + + + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LAD + - + + + + + it-IT + + + + + + de-DE + + + + + + en-US + + + + + + es-ES + + + + + + fr-FR + + + + + + zh-CN + + + + + + ja-JP + + + + + + + + + + it-IT + ResetCO2Tot + + + + + de-DE + + + + + + en-US + + + + + + es-ES + + + + + + fr-FR + + + + + + zh-CN + + + + + + ja-JP + + + + + + + + + + + + + + + + + + + + + + + + + + + + + S5T#2S + + + + + + + + + + + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LAD + + + + + + + it-IT + + + + + + de-DE + + + + + + en-US + + + + + + es-ES + + + + + + fr-FR + + + + + + zh-CN + + + + + + ja-JP + + + + + + + + + + it-IT + ResetProductTot + + + + + de-DE + + + + + + en-US + + + + + + es-ES + + + + + + fr-FR + + + + + + zh-CN + + + + + + ja-JP + + + + + + + + + + + + + + + + + + + + + + + + + + + + + S5T#2S + + + + + + + + + + + 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LAD + + + + + + + it-IT + + + + + + de-DE + + + + + + en-US + + + + + + es-ES + + + + + + fr-FR + + + + + + zh-CN + + + + + + ja-JP + + + + + + + + + + it-IT + ResetCO2Tot + + + + + de-DE + + + + + + en-US + + + + + + es-ES + + + + + + fr-FR + + + + + + zh-CN + + + + + + ja-JP + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + S5T#500ms + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LAD + + + + + + + it-IT + + + + + + de-DE + + + + + + en-US + + + + + + es-ES + + + + + + fr-FR + + + + + + zh-CN + + + + + + ja-JP + + + + + + + + + + it-IT + Mod Copy Recipe + + + + + de-DE + + + + + + en-US + + + + + + es-ES + + + + + + fr-FR + + + + + + zh-CN + + + + + + ja-JP + + + + + + + + + + it-IT - + de-DE - + en-US - + es-ES - + fr-FR - + zh-CN - + ja-JP diff --git a/TestLAD_simplified.json b/TestLAD_simplified.json index 0dcad1d..5116ea7 100644 --- a/TestLAD_simplified.json +++ b/TestLAD_simplified.json @@ -43,13 +43,13 @@ }, "networks": [ { - "id": "1A", - "title": "Filler Head", + "id": "9", + "title": "Manual Syrup Drain Valve Open - Operator Alarm", "comment": "", "logic": [ { - "instruction_uid": "25", - "uid": "25", + "instruction_uid": "30", + "uid": "30", "type": "Contact", "template_values": {}, "negated_pins": {}, @@ -58,7 +58,7 @@ "uid": "21", "scope": "GlobalVariable", "type": "variable", - "name": "\"AUX FALSE\"" + "name": "\"gSyrupRoomEn\"" }, "in": { "type": "powerrail" @@ -67,67 +67,231 @@ "outputs": {} }, { - "instruction_uid": "26", - "uid": "26", - "type": "BLKMOV", - "template_values": { - "blk_type": "Type" - }, - "negated_pins": {}, - "inputs": { - "SRCBLK": { - "uid": "22", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"HMI_PID\".\"PPM303\"" - }, - "en": { - "type": "connection", - "source_instruction_type": "Contact", - "source_instruction_uid": "25", - "source_pin": "out" - } - }, - "outputs": { - "RET_VAL": [ - { - "uid": "23", - "scope": "LocalVariable", - "type": "variable", - "name": "\"Block_Move_Err\"" - } - ], - "DSTBLK": [ - { - "uid": "24", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"Filler_Head_Variables\".\"FillerHead\"" - } - ] - } - } - ] - }, - { - "id": "3C", - "title": "Error Faults", - "comment": "", - "logic": [ - { - "instruction_uid": "25", - "uid": "25", + "instruction_uid": "31", + "uid": "31", "type": "Contact", "template_values": {}, "negated_pins": { "operand": true }, + "inputs": { + "operand": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gIN_HVP301_Aux\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "30", + "source_pin": "out" + } + }, + "outputs": {} + }, + { + "instruction_uid": "32", + "uid": "32", + "type": "Contact", + "template_values": {}, + "negated_pins": { + "operand": true + }, + "inputs": { + "operand": { + "uid": "23", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_FastChangeOverEnabled\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "31", + "source_pin": "out" + } + }, + "outputs": {} + }, + { + "instruction_uid": "33", + "uid": "33", + "type": "Contact", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "24", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"Procedure_Variables\".\"FTP302Line_Preparation\".\"Done\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "32", + "source_pin": "out" + } + }, + "outputs": {} + }, + { + "instruction_uid": "34", + "uid": "34", + "type": "Contact", + "template_values": {}, + "negated_pins": { + "operand": true + }, + "inputs": { + "operand": { + "uid": "25", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"Procedure_Variables\".\"Syr_RunOut\".\"Done\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "33", + "source_pin": "out" + } + }, + "outputs": {} + }, + { + "instruction_uid": "35", + "uid": "35", + "type": "Contact", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "26", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gBlenderCIPMode\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "31", + "source_pin": "out" + } + }, + "outputs": {} + }, + { + "instruction_uid": "36", + "uid": "36", + "type": "Contact", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "27", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gIN_CIP_CIPRunning\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "35", + "source_pin": "out" + } + }, + "outputs": {} + }, + { + "instruction_uid": "37", + "uid": "37", + "type": "Contact", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "28", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"Procedure_Variables\".\"Blender_Run\".\"Running\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "36", + "source_pin": "out" + } + }, + "outputs": {} + }, + { + "instruction_uid": "38", + "uid": "38", + "type": "O", + "template_values": { + "Card": "Cardinality" + }, + "negated_pins": {}, + "inputs": { + "in2": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "37", + "source_pin": "out" + }, + "in1": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "34", + "source_pin": "out" + } + }, + "outputs": {} + }, + { + "instruction_uid": "39", + "uid": "39", + "type": "Coil", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "29", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gHVP301_Open\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "O", + "source_instruction_uid": "38", + "source_pin": "out" + } + }, + "outputs": {} + } + ], + "language": "LAD" + }, + { + "id": "1A", + "title": "Manual Syrup Drain Valve Open - Operator Alarm", + "comment": "", + "logic": [ + { + "instruction_uid": "25", + "uid": "25", + "type": "Contact", + "template_values": {}, + "negated_pins": {}, "inputs": { "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", - "name": "\"AUX FALSE\"" + "name": "\"gIN_HVM302_Aux\"" }, "in": { "type": "powerrail" @@ -138,21 +302,28 @@ { "instruction_uid": "26", "uid": "26", - "type": "SCoil", + "type": "Sd", "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "22", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"HMI_Variables_Status\".\"Meters\".\"QTM3012_PRD_Fault\"" - }, - "in": { + "s": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "25", "source_pin": "out" + }, + "tv": { + "uid": "23", + "scope": "TypedConstant", + "type": "constant", + "datatype": "TypedConstant", + "value": "S5T#1S" + }, + "en": { + "type": "connection", + "source_instruction_uid": "25", + "source_instruction_type": "Contact", + "source_pin": "out" } }, "outputs": {} @@ -162,21 +333,121 @@ "uid": "27", "type": "Coil", "template_values": {}, - "negated_pins": { - "operand": true - }, + "negated_pins": {}, "inputs": { "operand": { - "uid": "23", + "uid": "24", "scope": "GlobalVariable", "type": "variable", - "name": "\"gmPDS2000_Error_Fault\"" + "name": "\"gHVM302_Open\"" }, "in": { + "type": "connection", + "source_instruction_type": "Sd", + "source_instruction_uid": "26", + "source_pin": "q" + } + }, + "outputs": {} + } + ], + "language": "LAD" + }, + { + "id": "2B", + "title": "ResetTotalizer", + "comment": "", + "logic": [ + { + "instruction_uid": "24", + "uid": "24", + "type": "Contact", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "21", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gBlendResetTotalizer\"" + }, + "in": { + "type": "powerrail" + } + }, + "outputs": {} + }, + { + "instruction_uid": "25", + "uid": "25", + "type": "Se", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "s": { "type": "connection", "source_instruction_type": "Contact", - "source_instruction_uid": "25", + "source_instruction_uid": "24", "source_pin": "out" + }, + "tv": { + "uid": "23", + "scope": "TypedConstant", + "type": "constant", + "datatype": "TypedConstant", + "value": "S5T#2S" + }, + "en": { + "type": "connection", + "source_instruction_uid": "24", + "source_instruction_type": "Contact", + "source_pin": "out" + } + }, + "outputs": {} + } + ], + "language": "LAD" + }, + { + "id": "3C", + "title": "ResetWaterTot", + "comment": "", + "logic": [ + { + "instruction_uid": "26", + "uid": "26", + "type": "Contact", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "21", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gFTN301_ResetTot\"" + }, + "in": { + "type": "powerrail" + } + }, + "outputs": {} + }, + { + "instruction_uid": "27", + "uid": "27", + "type": "Contact", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"mResetTotalizerTmr\"" + }, + "in": { + "type": "powerrail" } }, "outputs": {} @@ -184,7 +455,540 @@ { "instruction_uid": "28", "uid": "28", - "type": "RCoil", + "type": "O", + "template_values": { + "Card": "Cardinality" + }, + "negated_pins": {}, + "inputs": { + "in2": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "27", + "source_pin": "out" + }, + "in1": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "26", + "source_pin": "out" + } + }, + "outputs": {} + }, + { + "instruction_uid": "29", + "uid": "29", + "type": "Se", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "s": { + "type": "connection", + "source_instruction_type": "O", + "source_instruction_uid": "28", + "source_pin": "out" + }, + "tv": { + "uid": "24", + "scope": "TypedConstant", + "type": "constant", + "datatype": "TypedConstant", + "value": "S5T#2S" + }, + "en": { + "type": "connection", + "source_instruction_uid": "28", + "source_instruction_type": "O", + "source_pin": "out" + } + }, + "outputs": {} + }, + { + "instruction_uid": "30", + "uid": "30", + "type": "Coil", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "25", + "scope": "LocalVariable", + "type": "variable", + "name": "\"mResetWaterTot\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Se", + "source_instruction_uid": "29", + "source_pin": "q" + } + }, + "outputs": {} + } + ], + "language": "LAD" + }, + { + "id": "4D", + "title": "ResetCO2Tot", + "comment": "", + "logic": [ + { + "instruction_uid": "27", + "uid": "27", + "type": "Contact", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "21", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gFTP302_ResetTot\"" + }, + "in": { + "type": "powerrail" + } + }, + "outputs": {} + }, + { + "instruction_uid": "28", + "uid": "28", + "type": "Contact", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"mResetTotalizerTmr\"" + }, + "in": { + "type": "powerrail" + } + }, + "outputs": {} + }, + { + "instruction_uid": "29", + "uid": "29", + "type": "O", + "template_values": { + "Card": "Cardinality" + }, + "negated_pins": {}, + "inputs": { + "in2": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "28", + "source_pin": "out" + }, + "in1": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "27", + "source_pin": "out" + } + }, + "outputs": {} + }, + { + "instruction_uid": "30", + "uid": "30", + "type": "Se", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "s": { + "type": "connection", + "source_instruction_type": "O", + "source_instruction_uid": "29", + "source_pin": "out" + }, + "tv": { + "uid": "24", + "scope": "TypedConstant", + "type": "constant", + "datatype": "TypedConstant", + "value": "S5T#2S" + }, + "en": { + "type": "connection", + "source_instruction_uid": "29", + "source_instruction_type": "O", + "source_pin": "out" + } + }, + "outputs": {} + }, + { + "instruction_uid": "31", + "uid": "31", + "type": "Contact", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "25", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gSyrupRoomEn\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Se", + "source_instruction_uid": "30", + "source_pin": "q" + } + }, + "outputs": {} + }, + { + "instruction_uid": "32", + "uid": "32", + "type": "Coil", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "26", + "scope": "LocalVariable", + "type": "variable", + "name": "\"mResetSyrupTot\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "31", + "source_pin": "out" + } + }, + "outputs": {} + } + ], + "language": "LAD" + }, + { + "id": "5E", + "title": "ResetProductTot", + "comment": "", + "logic": [ + { + "instruction_uid": "26", + "uid": "26", + "type": "Contact", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "21", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gFTM303_ResetTot\"" + }, + "in": { + "type": "powerrail" + } + }, + "outputs": {} + }, + { + "instruction_uid": "27", + "uid": "27", + "type": "Contact", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"mResetTotalizerTmr\"" + }, + "in": { + "type": "powerrail" + } + }, + "outputs": {} + }, + { + "instruction_uid": "28", + "uid": "28", + "type": "O", + "template_values": { + "Card": "Cardinality" + }, + "negated_pins": {}, + "inputs": { + "in2": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "27", + "source_pin": "out" + }, + "in1": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "26", + "source_pin": "out" + } + }, + "outputs": {} + }, + { + "instruction_uid": "29", + "uid": "29", + "type": "Se", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "s": { + "type": "connection", + "source_instruction_type": "O", + "source_instruction_uid": "28", + "source_pin": "out" + }, + "tv": { + "uid": "24", + "scope": "TypedConstant", + "type": "constant", + "datatype": "TypedConstant", + "value": "S5T#2S" + }, + "en": { + "type": "connection", + "source_instruction_uid": "28", + "source_instruction_type": "O", + "source_pin": "out" + } + }, + "outputs": {} + }, + { + "instruction_uid": "30", + "uid": "30", + "type": "Coil", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "25", + "scope": "LocalVariable", + "type": "variable", + "name": "\"mResetCO2Tot\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Se", + "source_instruction_uid": "29", + "source_pin": "q" + } + }, + "outputs": {} + } + ], + "language": "LAD" + }, + { + "id": "6F", + "title": "ResetCO2Tot", + "comment": "", + "logic": [ + { + "instruction_uid": "26", + "uid": "26", + "type": "Contact", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "21", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gProductMFMResetTot\"" + }, + "in": { + "type": "powerrail" + } + }, + "outputs": {} + }, + { + "instruction_uid": "27", + "uid": "27", + "type": "Contact", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"mResetTotalizerTmr\"" + }, + "in": { + "type": "powerrail" + } + }, + "outputs": {} + }, + { + "instruction_uid": "28", + "uid": "28", + "type": "O", + "template_values": { + "Card": "Cardinality" + }, + "negated_pins": {}, + "inputs": { + "in2": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "27", + "source_pin": "out" + }, + "in1": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "26", + "source_pin": "out" + } + }, + "outputs": {} + }, + { + "instruction_uid": "29", + "uid": "29", + "type": "Se", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "s": { + "type": "connection", + "source_instruction_type": "O", + "source_instruction_uid": "28", + "source_pin": "out" + }, + "tv": { + "uid": "24", + "scope": "TypedConstant", + "type": "constant", + "datatype": "TypedConstant", + "value": "S5T#2S" + }, + "en": { + "type": "connection", + "source_instruction_uid": "28", + "source_instruction_type": "O", + "source_pin": "out" + } + }, + "outputs": {} + }, + { + "instruction_uid": "30", + "uid": "30", + "type": "Coil", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "25", + "scope": "LocalVariable", + "type": "variable", + "name": "\"mResetProductTot\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Se", + "source_instruction_uid": "29", + "source_pin": "q" + } + }, + "outputs": {} + } + ], + "language": "LAD" + }, + { + "id": "80", + "title": "Mod Copy Recipe", + "comment": "", + "logic": [ + { + "instruction_uid": "33", + "uid": "33", + "type": "Contact", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "21", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"HMI_Variables_Cmd\".\"Recipe\".\"Main_Page\"" + }, + "in": { + "type": "powerrail" + } + }, + "outputs": {} + }, + { + "instruction_uid": "34", + "uid": "34", + "type": "Contact", + "template_values": {}, + "negated_pins": { + "operand": true + }, + "inputs": { + "operand": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"mFP_Recip_Main_Page\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "33", + "source_pin": "out" + } + }, + "outputs": {} + }, + { + "instruction_uid": "35", + "uid": "35", + "type": "Coil", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "23", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"mAux_FP_M700_1\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "34", + "source_pin": "out" + } + }, + "outputs": {} + }, + { + "instruction_uid": "36", + "uid": "36", + "type": "Coil", "template_values": {}, "negated_pins": {}, "inputs": { @@ -192,18 +996,167 @@ "uid": "24", "scope": "GlobalVariable", "type": "variable", - "name": "\"HMI_Variables_Status\".\"Meters\".\"QTM3012_PRD_Run\"" + "name": "\"mFP_Recip_Main_Page\"" }, "in": { "type": "connection", "source_instruction_type": "Contact", - "source_instruction_uid": "25", + "source_instruction_uid": "33", + "source_pin": "out" + } + }, + "outputs": {} + }, + { + "instruction_uid": "37", + "uid": "37", + "type": "Contact", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "25", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"HMI_Variables_Cmd\".\"Recipe\".\"Main_Page\"" + }, + "in": { + "type": "powerrail" + } + }, + "outputs": {} + }, + { + "instruction_uid": "38", + "uid": "38", + "type": "Contact", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "26", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"HMI_Variables_Cmd\".\"Recipe\".\"Edit\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "37", + "source_pin": "out" + } + }, + "outputs": {} + }, + { + "instruction_uid": "39", + "uid": "39", + "type": "SdCoil", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "27", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"T_Pulse_Recipe_Edit\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "38", + "source_pin": "out" + } + }, + "outputs": {} + }, + { + "instruction_uid": "40", + "uid": "40", + "type": "Contact", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "29", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"T_Pulse_Recipe_Edit\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "SdCoil", + "source_instruction_uid": "39", + "source_pin": "out" + } + }, + "outputs": {} + }, + { + "instruction_uid": "41", + "uid": "41", + "type": "RCoil", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "30", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"HMI_Variables_Cmd\".\"Recipe\".\"Edit\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "40", + "source_pin": "out" + } + }, + "outputs": {} + }, + { + "instruction_uid": "42", + "uid": "42", + "type": "Contact", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "31", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"mAux_FP_M700_1\"" + }, + "in": { + "type": "powerrail" + } + }, + "outputs": {} + }, + { + "instruction_uid": "43", + "uid": "43", + "type": "SCoil", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "32", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"HMI_Variables_Cmd\".\"Recipe\".\"Edit\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "42", "source_pin": "out" } }, "outputs": {} } - ] + ], + "language": "LAD" } ] } \ No newline at end of file diff --git a/TestLAD_simplified_processed.json b/TestLAD_simplified_processed.json index 1efaaac..4680364 100644 --- a/TestLAD_simplified_processed.json +++ b/TestLAD_simplified_processed.json @@ -43,13 +43,13 @@ }, "networks": [ { - "id": "1A", - "title": "Filler Head", + "id": "9", + "title": "Manual Syrup Drain Valve Open - Operator Alarm", "comment": "", "logic": [ { - "instruction_uid": "25", - "uid": "25", + "instruction_uid": "30", + "uid": "30", "type": "Contact_scl", "template_values": {}, "negated_pins": {}, @@ -58,113 +58,44 @@ "uid": "21", "scope": "GlobalVariable", "type": "variable", - "name": "\"AUX FALSE\"" + "name": "\"gSyrupRoomEn\"" }, "in": { "type": "powerrail" } }, "outputs": {}, - "scl": "// RLO: \"AUX FALSE\"" + "scl": "// RLO: \"gSyrupRoomEn\"" }, { - "instruction_uid": "26", - "uid": "26", - "type": "BLKMOV_scl", - "template_values": { - "blk_type": "Type" - }, - "negated_pins": {}, - "inputs": { - "SRCBLK": { - "uid": "22", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"HMI_PID\".\"PPM303\"" - }, - "en": { - "type": "connection", - "source_instruction_type": "Contact", - "source_instruction_uid": "25", - "source_pin": "out" - } - }, - "outputs": { - "RET_VAL": [ - { - "uid": "23", - "scope": "LocalVariable", - "type": "variable", - "name": "\"Block_Move_Err\"" - } - ], - "DSTBLK": [ - { - "uid": "24", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"Filler_Head_Variables\".\"FillerHead\"" - } - ] - }, - "scl": "IF \"AUX FALSE\" THEN\n \"Block_Move_Err\" := BLKMOV(SRCBLK := \"HMI_PID\".\"PPM303\", DSTBLK => \"Filler_Head_Variables\".\"FillerHead\"); // ADVERTENCIA: BLKMOV usado directamente, probablemente no compile!\nEND_IF;" - } - ] - }, - { - "id": "3C", - "title": "Error Faults", - "comment": "", - "logic": [ - { - "instruction_uid": "25", - "uid": "25", + "instruction_uid": "31", + "uid": "31", "type": "Contact_scl", "template_values": {}, "negated_pins": { "operand": true }, - "inputs": { - "operand": { - "uid": "21", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"AUX FALSE\"" - }, - "in": { - "type": "powerrail" - } - }, - "outputs": {}, - "scl": "// RLO: (NOT \"AUX FALSE\")" - }, - { - "instruction_uid": "26", - "uid": "26", - "type": "SCoil_scl", - "template_values": {}, - "negated_pins": {}, "inputs": { "operand": { "uid": "22", "scope": "GlobalVariable", "type": "variable", - "name": "\"HMI_Variables_Status\".\"Meters\".\"QTM3012_PRD_Fault\"" + "name": "\"gIN_HVP301_Aux\"" }, "in": { "type": "connection", "source_instruction_type": "Contact", - "source_instruction_uid": "25", + "source_instruction_uid": "30", "source_pin": "out" } }, "outputs": {}, - "scl": "IF (NOT \"AUX FALSE\") THEN\n \"HMI_Variables_Status\".\"Meters\".\"QTM3012_PRD_Fault\" := TRUE;\nEND_IF;" + "scl": "// RLO: \"gSyrupRoomEn\" AND (NOT \"gIN_HVP301_Aux\")" }, { - "instruction_uid": "27", - "uid": "27", - "type": "Coil_scl", + "instruction_uid": "32", + "uid": "32", + "type": "Contact_scl", "template_values": {}, "negated_pins": { "operand": true @@ -174,22 +105,22 @@ "uid": "23", "scope": "GlobalVariable", "type": "variable", - "name": "\"gmPDS2000_Error_Fault\"" + "name": "\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_FastChangeOverEnabled\"" }, "in": { "type": "connection", "source_instruction_type": "Contact", - "source_instruction_uid": "25", + "source_instruction_uid": "31", "source_pin": "out" } }, "outputs": {}, - "scl": "\"gmPDS2000_Error_Fault\" := (NOT \"AUX FALSE\");" + "scl": "// RLO: (\"gSyrupRoomEn\" AND (NOT \"gIN_HVP301_Aux\")) AND (NOT \"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_FastChangeOverEnabled\")" }, { - "instruction_uid": "28", - "uid": "28", - "type": "RCoil_scl", + "instruction_uid": "33", + "uid": "33", + "type": "Contact_scl", "template_values": {}, "negated_pins": {}, "inputs": { @@ -197,19 +128,1067 @@ "uid": "24", "scope": "GlobalVariable", "type": "variable", - "name": "\"HMI_Variables_Status\".\"Meters\".\"QTM3012_PRD_Run\"" + "name": "\"Procedure_Variables\".\"FTP302Line_Preparation\".\"Done\"" }, "in": { "type": "connection", "source_instruction_type": "Contact", - "source_instruction_uid": "25", + "source_instruction_uid": "32", "source_pin": "out" } }, "outputs": {}, - "scl": "IF (NOT \"AUX FALSE\") THEN\n \"HMI_Variables_Status\".\"Meters\".\"QTM3012_PRD_Run\" := FALSE;\nEND_IF;" + "scl": "// RLO: (\"gSyrupRoomEn\" AND (NOT \"gIN_HVP301_Aux\")) AND (NOT \"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_FastChangeOverEnabled\") AND \"Procedure_Variables\".\"FTP302Line_Preparation\".\"Done\"" + }, + { + "instruction_uid": "34", + "uid": "34", + "type": "Contact_scl", + "template_values": {}, + "negated_pins": { + "operand": true + }, + "inputs": { + "operand": { + "uid": "25", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"Procedure_Variables\".\"Syr_RunOut\".\"Done\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "33", + "source_pin": "out" + } + }, + "outputs": {}, + "scl": "// RLO: ((\"gSyrupRoomEn\" AND (NOT \"gIN_HVP301_Aux\")) AND (NOT \"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_FastChangeOverEnabled\") AND \"Procedure_Variables\".\"FTP302Line_Preparation\".\"Done\") AND (NOT \"Procedure_Variables\".\"Syr_RunOut\".\"Done\")" + }, + { + "instruction_uid": "35", + "uid": "35", + "type": "Contact_scl", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "26", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gBlenderCIPMode\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "31", + "source_pin": "out" + } + }, + "outputs": {}, + "scl": "// RLO: (\"gSyrupRoomEn\" AND (NOT \"gIN_HVP301_Aux\")) AND \"gBlenderCIPMode\"" + }, + { + "instruction_uid": "36", + "uid": "36", + "type": "Contact_scl", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "27", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gIN_CIP_CIPRunning\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "35", + "source_pin": "out" + } + }, + "outputs": {}, + "scl": "// RLO: ((\"gSyrupRoomEn\" AND (NOT \"gIN_HVP301_Aux\")) AND \"gBlenderCIPMode\") AND \"gIN_CIP_CIPRunning\"" + }, + { + "instruction_uid": "37", + "uid": "37", + "type": "Contact_scl", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "28", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"Procedure_Variables\".\"Blender_Run\".\"Running\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "36", + "source_pin": "out" + } + }, + "outputs": {}, + "scl": "// RLO: (((\"gSyrupRoomEn\" AND (NOT \"gIN_HVP301_Aux\")) AND \"gBlenderCIPMode\") AND \"gIN_CIP_CIPRunning\") AND \"Procedure_Variables\".\"Blender_Run\".\"Running\"" + }, + { + "instruction_uid": "38", + "uid": "38", + "type": "O_scl", + "template_values": { + "Card": "Cardinality" + }, + "negated_pins": {}, + "inputs": { + "in2": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "37", + "source_pin": "out" + }, + "in1": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "34", + "source_pin": "out" + } + }, + "outputs": {}, + "scl": "// Logic O 38: ((\"gSyrupRoomEn\" AND (NOT \"gIN_HVP301_Aux\")) AND (NOT \"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_FastChangeOverEnabled\") AND \"Procedure_Variables\".\"FTP302Line_Preparation\".\"Done\") AND (NOT \"Procedure_Variables\".\"Syr_RunOut\".\"Done\") OR ((((\"gSyrupRoomEn\" AND (NOT \"gIN_HVP301_Aux\")) AND \"gBlenderCIPMode\") AND \"gIN_CIP_CIPRunning\") AND \"Procedure_Variables\".\"Blender_Run\".\"Running\")" + }, + { + "instruction_uid": "39", + "uid": "39", + "type": "Coil_scl", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "29", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gHVP301_Open\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "O", + "source_instruction_uid": "38", + "source_pin": "out" + } + }, + "outputs": {}, + "scl": "\"gHVP301_Open\" := ((\"gSyrupRoomEn\" AND (NOT \"gIN_HVP301_Aux\")) AND (NOT \"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_FastChangeOverEnabled\") AND \"Procedure_Variables\".\"FTP302Line_Preparation\".\"Done\") AND (NOT \"Procedure_Variables\".\"Syr_RunOut\".\"Done\") OR ((((\"gSyrupRoomEn\" AND (NOT \"gIN_HVP301_Aux\")) AND \"gBlenderCIPMode\") AND \"gIN_CIP_CIPRunning\") AND \"Procedure_Variables\".\"Blender_Run\".\"Running\");" } - ] + ], + "language": "LAD" + }, + { + "id": "1A", + "title": "Manual Syrup Drain Valve Open - Operator Alarm", + "comment": "", + "logic": [ + { + "instruction_uid": "25", + "uid": "25", + "type": "Contact_scl", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "21", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gIN_HVM302_Aux\"" + }, + "in": { + "type": "powerrail" + } + }, + "outputs": {}, + "scl": "// RLO: \"gIN_HVM302_Aux\"" + }, + { + "instruction_uid": "26", + "uid": "26", + "type": "Sd", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "s": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "25", + "source_pin": "out" + }, + "tv": { + "uid": "23", + "scope": "TypedConstant", + "type": "constant", + "datatype": "TypedConstant", + "value": "S5T#1S" + }, + "en": { + "type": "connection", + "source_instruction_uid": "25", + "source_instruction_type": "Contact", + "source_pin": "out" + } + }, + "outputs": {} + }, + { + "instruction_uid": "27", + "uid": "27", + "type": "Coil", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "24", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gHVM302_Open\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Sd", + "source_instruction_uid": "26", + "source_pin": "q" + } + }, + "outputs": {} + } + ], + "language": "LAD" + }, + { + "id": "2B", + "title": "ResetTotalizer", + "comment": "", + "logic": [ + { + "instruction_uid": "24", + "uid": "24", + "type": "Contact_scl", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "21", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gBlendResetTotalizer\"" + }, + "in": { + "type": "powerrail" + } + }, + "outputs": {}, + "scl": "// RLO: \"gBlendResetTotalizer\"" + }, + { + "instruction_uid": "25", + "uid": "25", + "type": "Se", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "s": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "24", + "source_pin": "out" + }, + "tv": { + "uid": "23", + "scope": "TypedConstant", + "type": "constant", + "datatype": "TypedConstant", + "value": "S5T#2S" + }, + "en": { + "type": "connection", + "source_instruction_uid": "24", + "source_instruction_type": "Contact", + "source_pin": "out" + } + }, + "outputs": {} + } + ], + "language": "LAD" + }, + { + "id": "3C", + "title": "ResetWaterTot", + "comment": "", + "logic": [ + { + "instruction_uid": "26", + "uid": "26", + "type": "Contact_scl", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "21", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gFTN301_ResetTot\"" + }, + "in": { + "type": "powerrail" + } + }, + "outputs": {}, + "scl": "// RLO: \"gFTN301_ResetTot\"" + }, + { + "instruction_uid": "27", + "uid": "27", + "type": "Contact_scl", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"mResetTotalizerTmr\"" + }, + "in": { + "type": "powerrail" + } + }, + "outputs": {}, + "scl": "// RLO: \"mResetTotalizerTmr\"" + }, + { + "instruction_uid": "28", + "uid": "28", + "type": "O_scl", + "template_values": { + "Card": "Cardinality" + }, + "negated_pins": {}, + "inputs": { + "in2": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "27", + "source_pin": "out" + }, + "in1": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "26", + "source_pin": "out" + } + }, + "outputs": {}, + "scl": "// Logic O 28: \"gFTN301_ResetTot\" OR \"mResetTotalizerTmr\"" + }, + { + "instruction_uid": "29", + "uid": "29", + "type": "Se", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "s": { + "type": "connection", + "source_instruction_type": "O", + "source_instruction_uid": "28", + "source_pin": "out" + }, + "tv": { + "uid": "24", + "scope": "TypedConstant", + "type": "constant", + "datatype": "TypedConstant", + "value": "S5T#2S" + }, + "en": { + "type": "connection", + "source_instruction_uid": "28", + "source_instruction_type": "O", + "source_pin": "out" + } + }, + "outputs": {} + }, + { + "instruction_uid": "30", + "uid": "30", + "type": "Coil", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "25", + "scope": "LocalVariable", + "type": "variable", + "name": "\"mResetWaterTot\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Se", + "source_instruction_uid": "29", + "source_pin": "q" + } + }, + "outputs": {} + } + ], + "language": "LAD" + }, + { + "id": "4D", + "title": "ResetCO2Tot", + "comment": "", + "logic": [ + { + "instruction_uid": "27", + "uid": "27", + "type": "Contact_scl", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "21", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gFTP302_ResetTot\"" + }, + "in": { + "type": "powerrail" + } + }, + "outputs": {}, + "scl": "// RLO: \"gFTP302_ResetTot\"" + }, + { + "instruction_uid": "28", + "uid": "28", + "type": "Contact_scl", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"mResetTotalizerTmr\"" + }, + "in": { + "type": "powerrail" + } + }, + "outputs": {}, + "scl": "// RLO: \"mResetTotalizerTmr\"" + }, + { + "instruction_uid": "29", + "uid": "29", + "type": "O_scl", + "template_values": { + "Card": "Cardinality" + }, + "negated_pins": {}, + "inputs": { + "in2": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "28", + "source_pin": "out" + }, + "in1": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "27", + "source_pin": "out" + } + }, + "outputs": {}, + "scl": "// Logic O 29: \"gFTP302_ResetTot\" OR \"mResetTotalizerTmr\"" + }, + { + "instruction_uid": "30", + "uid": "30", + "type": "Se", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "s": { + "type": "connection", + "source_instruction_type": "O", + "source_instruction_uid": "29", + "source_pin": "out" + }, + "tv": { + "uid": "24", + "scope": "TypedConstant", + "type": "constant", + "datatype": "TypedConstant", + "value": "S5T#2S" + }, + "en": { + "type": "connection", + "source_instruction_uid": "29", + "source_instruction_type": "O", + "source_pin": "out" + } + }, + "outputs": {} + }, + { + "instruction_uid": "31", + "uid": "31", + "type": "Contact", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "25", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gSyrupRoomEn\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Se", + "source_instruction_uid": "30", + "source_pin": "q" + } + }, + "outputs": {} + }, + { + "instruction_uid": "32", + "uid": "32", + "type": "Coil", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "26", + "scope": "LocalVariable", + "type": "variable", + "name": "\"mResetSyrupTot\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "31", + "source_pin": "out" + } + }, + "outputs": {} + } + ], + "language": "LAD" + }, + { + "id": "5E", + "title": "ResetProductTot", + "comment": "", + "logic": [ + { + "instruction_uid": "26", + "uid": "26", + "type": "Contact_scl", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "21", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gFTM303_ResetTot\"" + }, + "in": { + "type": "powerrail" + } + }, + "outputs": {}, + "scl": "// RLO: \"gFTM303_ResetTot\"" + }, + { + "instruction_uid": "27", + "uid": "27", + "type": "Contact_scl", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"mResetTotalizerTmr\"" + }, + "in": { + "type": "powerrail" + } + }, + "outputs": {}, + "scl": "// RLO: \"mResetTotalizerTmr\"" + }, + { + "instruction_uid": "28", + "uid": "28", + "type": "O_scl", + "template_values": { + "Card": "Cardinality" + }, + "negated_pins": {}, + "inputs": { + "in2": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "27", + "source_pin": "out" + }, + "in1": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "26", + "source_pin": "out" + } + }, + "outputs": {}, + "scl": "// Logic O 28: \"gFTM303_ResetTot\" OR \"mResetTotalizerTmr\"" + }, + { + "instruction_uid": "29", + "uid": "29", + "type": "Se", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "s": { + "type": "connection", + "source_instruction_type": "O", + "source_instruction_uid": "28", + "source_pin": "out" + }, + "tv": { + "uid": "24", + "scope": "TypedConstant", + "type": "constant", + "datatype": "TypedConstant", + "value": "S5T#2S" + }, + "en": { + "type": "connection", + "source_instruction_uid": "28", + "source_instruction_type": "O", + "source_pin": "out" + } + }, + "outputs": {} + }, + { + "instruction_uid": "30", + "uid": "30", + "type": "Coil", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "25", + "scope": "LocalVariable", + "type": "variable", + "name": "\"mResetCO2Tot\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Se", + "source_instruction_uid": "29", + "source_pin": "q" + } + }, + "outputs": {} + } + ], + "language": "LAD" + }, + { + "id": "6F", + "title": "ResetCO2Tot", + "comment": "", + "logic": [ + { + "instruction_uid": "26", + "uid": "26", + "type": "Contact_scl", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "21", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gProductMFMResetTot\"" + }, + "in": { + "type": "powerrail" + } + }, + "outputs": {}, + "scl": "// RLO: \"gProductMFMResetTot\"" + }, + { + "instruction_uid": "27", + "uid": "27", + "type": "Contact_scl", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"mResetTotalizerTmr\"" + }, + "in": { + "type": "powerrail" + } + }, + "outputs": {}, + "scl": "// RLO: \"mResetTotalizerTmr\"" + }, + { + "instruction_uid": "28", + "uid": "28", + "type": "O_scl", + "template_values": { + "Card": "Cardinality" + }, + "negated_pins": {}, + "inputs": { + "in2": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "27", + "source_pin": "out" + }, + "in1": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "26", + "source_pin": "out" + } + }, + "outputs": {}, + "scl": "// Logic O 28: \"gProductMFMResetTot\" OR \"mResetTotalizerTmr\"" + }, + { + "instruction_uid": "29", + "uid": "29", + "type": "Se", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "s": { + "type": "connection", + "source_instruction_type": "O", + "source_instruction_uid": "28", + "source_pin": "out" + }, + "tv": { + "uid": "24", + "scope": "TypedConstant", + "type": "constant", + "datatype": "TypedConstant", + "value": "S5T#2S" + }, + "en": { + "type": "connection", + "source_instruction_uid": "28", + "source_instruction_type": "O", + "source_pin": "out" + } + }, + "outputs": {} + }, + { + "instruction_uid": "30", + "uid": "30", + "type": "Coil", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "25", + "scope": "LocalVariable", + "type": "variable", + "name": "\"mResetProductTot\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Se", + "source_instruction_uid": "29", + "source_pin": "q" + } + }, + "outputs": {} + } + ], + "language": "LAD" + }, + { + "id": "80", + "title": "Mod Copy Recipe", + "comment": "", + "logic": [ + { + "instruction_uid": "33", + "uid": "33", + "type": "Contact_scl", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "21", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"HMI_Variables_Cmd\".\"Recipe\".\"Main_Page\"" + }, + "in": { + "type": "powerrail" + } + }, + "outputs": {}, + "scl": "// RLO: \"HMI_Variables_Cmd\".\"Recipe\".\"Main_Page\"" + }, + { + "instruction_uid": "34", + "uid": "34", + "type": "Contact_scl", + "template_values": {}, + "negated_pins": { + "operand": true + }, + "inputs": { + "operand": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"mFP_Recip_Main_Page\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "33", + "source_pin": "out" + } + }, + "outputs": {}, + "scl": "// RLO: \"HMI_Variables_Cmd\".\"Recipe\".\"Main_Page\" AND (NOT \"mFP_Recip_Main_Page\")" + }, + { + "instruction_uid": "35", + "uid": "35", + "type": "Coil_scl", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "23", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"mAux_FP_M700_1\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "34", + "source_pin": "out" + } + }, + "outputs": {}, + "scl": "\"mAux_FP_M700_1\" := \"HMI_Variables_Cmd\".\"Recipe\".\"Main_Page\" AND (NOT \"mFP_Recip_Main_Page\");" + }, + { + "instruction_uid": "36", + "uid": "36", + "type": "Coil_scl", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "24", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"mFP_Recip_Main_Page\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "33", + "source_pin": "out" + } + }, + "outputs": {}, + "scl": "\"mFP_Recip_Main_Page\" := \"HMI_Variables_Cmd\".\"Recipe\".\"Main_Page\";" + }, + { + "instruction_uid": "37", + "uid": "37", + "type": "Contact_scl", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "25", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"HMI_Variables_Cmd\".\"Recipe\".\"Main_Page\"" + }, + "in": { + "type": "powerrail" + } + }, + "outputs": {}, + "scl": "// RLO: \"HMI_Variables_Cmd\".\"Recipe\".\"Main_Page\"" + }, + { + "instruction_uid": "38", + "uid": "38", + "type": "Contact_scl", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "26", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"HMI_Variables_Cmd\".\"Recipe\".\"Edit\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "37", + "source_pin": "out" + } + }, + "outputs": {}, + "scl": "// RLO: \"HMI_Variables_Cmd\".\"Recipe\".\"Main_Page\" AND \"HMI_Variables_Cmd\".\"Recipe\".\"Edit\"" + }, + { + "instruction_uid": "39", + "uid": "39", + "type": "SdCoil", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "27", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"T_Pulse_Recipe_Edit\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "38", + "source_pin": "out" + } + }, + "outputs": {} + }, + { + "instruction_uid": "40", + "uid": "40", + "type": "Contact", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "29", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"T_Pulse_Recipe_Edit\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "SdCoil", + "source_instruction_uid": "39", + "source_pin": "out" + } + }, + "outputs": {} + }, + { + "instruction_uid": "41", + "uid": "41", + "type": "RCoil", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "30", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"HMI_Variables_Cmd\".\"Recipe\".\"Edit\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "40", + "source_pin": "out" + } + }, + "outputs": {} + }, + { + "instruction_uid": "42", + "uid": "42", + "type": "Contact_scl", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "31", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"mAux_FP_M700_1\"" + }, + "in": { + "type": "powerrail" + } + }, + "outputs": {}, + "scl": "// RLO: \"mAux_FP_M700_1\"" + }, + { + "instruction_uid": "43", + "uid": "43", + "type": "SCoil_scl", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "operand": { + "uid": "32", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"HMI_Variables_Cmd\".\"Recipe\".\"Edit\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "42", + "source_pin": "out" + } + }, + "outputs": {}, + "scl": "IF \"mAux_FP_M700_1\" THEN\n \"HMI_Variables_Cmd\".\"Recipe\".\"Edit\" := TRUE;\nEND_IF;" + } + ], + "language": "LAD" } ] } \ No newline at end of file diff --git a/TestLAD_simplified_processed.scl b/TestLAD_simplified_processed.scl index ba90e2a..c4dc244 100644 --- a/TestLAD_simplified_processed.scl +++ b/TestLAD_simplified_processed.scl @@ -27,22 +27,40 @@ END_VAR BEGIN - // Network 1: Filler Head + // Network 1: Manual Syrup Drain Valve Open - Operator Alarm (Original Language: LAD) - // RLO: "AUX FALSE" - IF "AUX FALSE" THEN - "Block_Move_Err" := BLKMOV(SRCBLK := "HMI_PID"."PPM303", DSTBLK => "Filler_Head_Variables"."FillerHead"); // ADVERTENCIA: BLKMOV usado directamente, probablemente no compile! - END_IF; + "gHVP301_Open" := (("gSyrupRoomEn" AND (NOT "gIN_HVP301_Aux")) AND (NOT "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_FastChangeOverEnabled") AND "Procedure_Variables"."FTP302Line_Preparation"."Done") AND (NOT "Procedure_Variables"."Syr_RunOut"."Done") OR (((("gSyrupRoomEn" AND (NOT "gIN_HVP301_Aux")) AND "gBlenderCIPMode") AND "gIN_CIP_CIPRunning") AND "Procedure_Variables"."Blender_Run"."Running"); - // Network 2: Error Faults + // Network 2: Manual Syrup Drain Valve Open - Operator Alarm (Original Language: LAD) - // RLO: (NOT "AUX FALSE") - IF (NOT "AUX FALSE") THEN - "HMI_Variables_Status"."Meters"."QTM3012_PRD_Fault" := TRUE; - END_IF; - "gmPDS2000_Error_Fault" := (NOT "AUX FALSE"); - IF (NOT "AUX FALSE") THEN - "HMI_Variables_Status"."Meters"."QTM3012_PRD_Run" := FALSE; + // Network did not produce printable SCL code. + + // Network 3: ResetTotalizer (Original Language: LAD) + + // Network did not produce printable SCL code. + + // Network 4: ResetWaterTot (Original Language: LAD) + + // Network did not produce printable SCL code. + + // Network 5: ResetCO2Tot (Original Language: LAD) + + // Network did not produce printable SCL code. + + // Network 6: ResetProductTot (Original Language: LAD) + + // Network did not produce printable SCL code. + + // Network 7: ResetCO2Tot (Original Language: LAD) + + // Network did not produce printable SCL code. + + // Network 8: Mod Copy Recipe (Original Language: LAD) + + "mAux_FP_M700_1" := "HMI_Variables_Cmd"."Recipe"."Main_Page" AND (NOT "mFP_Recip_Main_Page"); + "mFP_Recip_Main_Page" := "HMI_Variables_Cmd"."Recipe"."Main_Page"; + IF "mAux_FP_M700_1" THEN + "HMI_Variables_Cmd"."Recipe"."Edit" := TRUE; END_IF; END_FUNCTION_BLOCK diff --git a/x1_to_json.py b/x1_to_json.py index 1acd06c..1e99f63 100644 --- a/x1_to_json.py +++ b/x1_to_json.py @@ -7,9 +7,11 @@ import traceback from collections import defaultdict # --- Namespaces --- +# Se añade el namespace 'st' para Structured Text ns = { "iface": "http://www.siemens.com/automation/Openness/SW/Interface/v5", "flg": "http://www.siemens.com/automation/Openness/SW/NetworkSource/FlgNet/v4", + "st": "http://www.siemens.com/automation/Openness/SW/NetworkSource/StructuredText/v3" # <--- Added SCL namespace } @@ -141,6 +143,95 @@ def parse_call(call_element): if instance_scope: call_data["instance_scope"] = instance_scope return call_data +# EN x1_to_json.py, junto a otras funciones auxiliares + +def reconstruct_scl_from_tokens(st_node): + """ + Intenta reconstruir una cadena SCL a partir de los elementos hijos + de un nodo . Es una aproximación y puede no ser perfecta. + """ + if st_node is None: + return "// Error: StructuredText node not found.\n" + + scl_parts = [] + # Obtener todos los elementos hijos directos en orden + children = st_node.xpath("./st:*", namespaces=ns) + + for elem in children: + tag = etree.QName(elem.tag).localname + + if tag == "Token": + scl_parts.append(elem.get("Text", "")) + elif tag == "Blank": + scl_parts.append(" " * int(elem.get("Num", 1))) + elif tag == "NewLine": + # Añadir un salto de línea real. strip() al final de la línea actual + # para evitar espacios extra antes del salto. + scl_parts.append("\n") + elif tag == "Access": + # Reconstruir acceso (simplificado) + symbol_parts = [] + # Buscar componentes y puntos dentro del símbolo de este acceso + symbol_children = elem.xpath(".//st:Component | .//st:Token[@Text='.']", namespaces=ns) + for sym_child in symbol_children: + sym_tag = etree.QName(sym_child.tag).localname + if sym_tag == "Component": + comp_name = sym_child.get("Name", "_ERR_") + # Comprobar si necesita comillas (podríamos necesitar parsear BooleanAttribute) + # Simplificación: Añadir comillas si el nombre original parece tenerlas (o siempre para DBs?) + # Aquí usamos el nombre tal cual viene en el XML por ahora + # Si el XML tiene true podríamos usarlo + has_quotes_elem = sym_child.xpath("../st:BooleanAttribute[@Name='HasQuotes']/text()", namespaces=ns) + has_quotes = has_quotes_elem and has_quotes_elem[0].lower() == 'true' + + # Reconstrucción básica: poner comillas si HasQuotes es true o si es el primer componente (posible DB) + # Esto es heurístico y puede fallar. + # if has_quotes or (len(symbol_parts) == 0 and '.' not in comp_name): # Asumir primer componente es DB + # symbol_parts.append(f'"{comp_name}"') + # else: + # symbol_parts.append(comp_name) + + # Versión más simple: usar nombre tal cual del XML + symbol_parts.append(comp_name) + + elif sym_tag == "Token": # Solo nos interesa el punto aquí + symbol_parts.append(".") + access_str = "".join(symbol_parts) + + # Manejar llamadas a funciones/FB dentro de Access Scope="Call" + if elem.get("Scope") == "Call": + instruction_elem = elem.xpath("./st:Instruction", namespaces=ns) + if instruction_elem: + instr_name = instruction_elem[0].get("Name", "_UNKNOWN_CALL_") + # Reconstrucción básica de parámetros (muy simplificada) + # Necesitaría parsear Parameters, Tokens '(', ')', ':=', '=>', etc. + # Por ahora, solo añadimos el nombre y paréntesis vacíos + access_str = f"{instr_name}()" # Placeholder muy básico + + scl_parts.append(access_str) + + elif tag == "Comment" or tag == "LineComment": + # Añadir comentarios + comment_text = elem.text if elem.text else "" + if tag == "Comment" and "\n" in comment_text: # Comentario multi-línea + scl_parts.append(f"(*{comment_text}*)") + else: # Comentario de una línea + scl_parts.append(f"// {comment_text}") + else: + # Ignorar otros tipos de nodos por ahora o añadir manejo específico + pass + + # Unir todas las partes, limpiar espacios extra alrededor de saltos de línea + full_scl = "".join(scl_parts) + # Limpieza básica de formato + lines = [line.rstrip() for line in full_scl.split('\n')] + # Re-ensamblar, asegurando que líneas vacías (solo espacios previos) se mantengan + cleaned_scl = "\n".join(lines) + # Eliminar múltiples líneas vacías consecutivas (opcional) + # import re + # cleaned_scl = re.sub(r'\n\s*\n', '\n\n', cleaned_scl) + + return cleaned_scl.strip() # Quitar espacios/saltos al inicio/final # --- Función parse_network con XPath corregido para Title/Comment --- # --- Función parse_network MODIFICADA (maneja multi-destino en Wire) --- def parse_network(network_element): @@ -308,136 +399,6 @@ def parse_network(network_element): # 6. Ordenar y Devolver (sin cambios) network_logic_final = [all_logic_steps[uid] for uid in sorted_uids_for_en if uid in all_logic_steps] return {"id": network_id, "title": network_title, "comment": network_comment, "logic": network_logic_final} - """ - Parsea una red, extrae lógica y añade conexiones EN implícitas. - """ - if network_element is None: - return {"id": "ERROR", "title": "Invalid Network Element", "comment": "", "logic": [], "error": "Input element was None"} - - network_id = network_element.get("ID") - - # --- CORRECCIÓN XPath para Title y Comment --- - # Usar local-name() como en la versión original que funcionaba para esto - title_element = network_element.xpath( - ".//*[local-name()='MultilingualText'][@CompositionName='Title']" # Busca en cualquier nivel descendiente - ) - network_title = get_multilingual_text(title_element[0]) if title_element else f"Network {network_id}" - - comment_element = network_element.xpath( - "./*[local-name()='ObjectList']/*[local-name()='MultilingualText'][@CompositionName='Comment']" # Busca directamente bajo ObjectList - ) - network_comment = get_multilingual_text(comment_element[0]) if comment_element else "" - # --- FIN CORRECCIÓN XPath --- - - flgnet_list = network_element.xpath(".//flg:FlgNet", namespaces=ns) - if not flgnet_list: - return {"id": network_id, "title": network_title, "comment": network_comment, "logic": [], "error": "FlgNet not found"} - flgnet = flgnet_list[0] - - # 1. Parsear Access, Parts y Calls (usando parse_call corregido) - access_map = {acc_info["uid"]: acc_info for acc in flgnet.xpath(".//flg:Access", namespaces=ns) if (acc_info := parse_access(acc)) and acc_info['type'] != 'unknown'} - parts_and_calls_map = {} - instruction_elements = flgnet.xpath(".//flg:Part | .//flg:Call", namespaces=ns) - for element in instruction_elements: - parsed_info = None - if element.tag == etree.QName(ns["flg"], "Part"): parsed_info = parse_part(element) - elif element.tag == etree.QName(ns["flg"], "Call"): parsed_info = parse_call(element) # Usa la versión con fix DB - if parsed_info and "uid" in parsed_info: parts_and_calls_map[parsed_info["uid"]] = parsed_info - else: print(f"Advertencia: Se ignoró un Part/Call inválido en la red {network_id}") - - # 2. Parsear Wires (sin cambios) - wire_connections = defaultdict(list); source_connections = defaultdict(list); eno_outputs = defaultdict(list) - flg_ns_uri = ns["flg"] - for wire in flgnet.xpath(".//flg:Wire", namespaces=ns): - source_uid, source_pin, dest_uid, dest_pin = None, None, None, None - children = wire.getchildren(); - if len(children) < 2: continue - source_elem, dest_elem = children[0], children[1] - if source_elem.tag == etree.QName(flg_ns_uri, "Powerrail"): source_uid, source_pin = "POWERRAIL", "out" - elif source_elem.tag == etree.QName(flg_ns_uri, "IdentCon"): source_uid, source_pin = source_elem.get("UId"), "value" - elif source_elem.tag == etree.QName(flg_ns_uri, "NameCon"): source_uid, source_pin = source_elem.get("UId"), source_elem.get("Name") - if dest_elem.tag == etree.QName(flg_ns_uri, "IdentCon"): dest_uid, dest_pin = dest_elem.get("UId"), "value" - elif dest_elem.tag == etree.QName(flg_ns_uri, "NameCon"): dest_uid, dest_pin = dest_elem.get("UId"), dest_elem.get("Name") - if source_uid is not None and source_pin is not None and dest_uid is not None and dest_pin is not None: - dest_key = (dest_uid, dest_pin); source_info = (source_uid, source_pin) - if source_info not in wire_connections[dest_key]: wire_connections[dest_key].append(source_info) - source_key = (source_uid, source_pin); dest_info = (dest_uid, dest_pin) - if dest_info not in source_connections[source_key]: source_connections[source_key].append(dest_info) - if source_pin == "eno" and source_uid in parts_and_calls_map: - if dest_info not in eno_outputs[source_uid]: eno_outputs[source_uid].append(dest_info) - - # 3. Construcción Lógica Inicial (sin cambios) - all_logic_steps = {} - functional_block_types = ['Move', 'Add', 'Sub', 'Mul', 'Div', 'Mod', 'Convert', 'Call', 'Se', 'Sd', 'BLKMOV'] - rlo_generators = ['Contact', 'O', 'Eq', 'Ne', 'Gt', 'Lt', 'Ge', 'Le', 'And', 'Xor', 'PBox', 'NBox'] - for instruction_uid, instruction_info in parts_and_calls_map.items(): - instruction_repr = {"instruction_uid": instruction_uid, **instruction_info}; instruction_repr["inputs"] = {}; instruction_repr["outputs"] = {} - possible_input_pins = set(['en', 'in', 'in1', 'in2', 'in3', 'in4', 's', 'r', 'clk', 'cu', 'cd', 'ld', 'pv', 'tv', 'bit', 'operand', 'pre', 'SRCBLK']) - for dest_pin_name in possible_input_pins: - dest_key = (instruction_uid, dest_pin_name) - if dest_key in wire_connections: - sources_list = wire_connections[dest_key]; input_sources_repr = [] - for source_uid, source_pin in sources_list: - if source_uid == "POWERRAIL": input_sources_repr.append({"type": "powerrail"}) - elif source_uid in access_map: input_sources_repr.append(access_map[source_uid]) - elif source_uid in parts_and_calls_map: input_sources_repr.append({"type": "connection", "source_instruction_type": parts_and_calls_map[source_uid]["type"], "source_instruction_uid": source_uid, "source_pin": source_pin}) - else: input_sources_repr.append({"type": "unknown_source", "uid": source_uid}) - if len(input_sources_repr) == 1: instruction_repr["inputs"][dest_pin_name] = input_sources_repr[0] - elif len(input_sources_repr) > 1: instruction_repr["inputs"][dest_pin_name] = input_sources_repr - possible_output_pins = set(['out', 'out1', 'Q', 'eno', 'RET_VAL', 'DSTBLK', 'q', 'rt', 'rtbcd', 'cv', 'cvbcd']) - for source_pin_name in possible_output_pins: - source_key = (instruction_uid, source_pin_name) - if source_key in source_connections: - for dest_uid, dest_pin in source_connections[source_key]: - if dest_uid in access_map: - if source_pin_name not in instruction_repr["outputs"]: instruction_repr["outputs"][source_pin_name] = [] - if access_map[dest_uid] not in instruction_repr["outputs"][source_pin_name]: instruction_repr["outputs"][source_pin_name].append(access_map[dest_uid]) - all_logic_steps[instruction_uid] = instruction_repr - - # 4. Inferencia EN (sin cambios) - processed_blocks_en_inference = set(); something_changed = True; inference_passes = 0; max_inference_passes = len(all_logic_steps) + 5 - try: sorted_uids_for_en = sorted(all_logic_steps.keys(), key=lambda x: int(x) if x.isdigit() else float('inf')) - except ValueError: sorted_uids_for_en = sorted(all_logic_steps.keys()) - ordered_logic_list_for_en = [all_logic_steps[uid] for uid in sorted_uids_for_en if uid in all_logic_steps] - while something_changed and inference_passes < max_inference_passes: - something_changed = False; inference_passes += 1 - for i, instruction in enumerate(ordered_logic_list_for_en): - part_uid = instruction["instruction_uid"]; part_type_original = instruction["type"].replace('_scl', '').replace('_error', '') - if (part_type_original in functional_block_types and "en" not in instruction["inputs"] and part_uid not in processed_blocks_en_inference): - inferred_en_source = None - if i > 0: - for j in range(i - 1, -1, -1): - prev_instr = ordered_logic_list_for_en[j]; prev_uid = prev_instr["instruction_uid"]; prev_type_original = prev_instr["type"].replace('_scl', '').replace('_error', '') - if prev_type_original in rlo_generators: inferred_en_source = {"type": "connection", "source_instruction_uid": prev_uid, "source_instruction_type": prev_type_original, "source_pin": "out"}; break - elif prev_type_original in functional_block_types: - source_key_eno = (prev_uid, "eno") - if source_key_eno in source_connections: inferred_en_source = {"type": "connection", "source_instruction_uid": prev_uid, "source_instruction_type": prev_type_original, "source_pin": "eno"}; break - else: continue - elif prev_type_original in ['Coil', 'SCoil', 'RCoil', 'SetCoil', 'ResetCoil', 'SdCoil']: break - if inferred_en_source: all_logic_steps[part_uid]["inputs"]["en"] = inferred_en_source; processed_blocks_en_inference.add(part_uid); something_changed = True - - # 5. Añadir lógica ENO interesante (sin cambios) - for source_instr_uid, eno_destinations in eno_outputs.items(): - if source_instr_uid not in all_logic_steps: continue - interesting_eno_logic = [] - for dest_uid, dest_pin in eno_destinations: - is_direct_en_connection = False - if dest_uid in parts_and_calls_map and dest_pin == 'en': - try: - source_idx = sorted_uids_for_en.index(source_instr_uid); dest_idx = sorted_uids_for_en.index(dest_uid) - if dest_idx == source_idx + 1 and parts_and_calls_map[dest_uid]['type'] in functional_block_types: is_direct_en_connection = True - except ValueError: pass - if not is_direct_en_connection: - target_info = {"target_pin": dest_pin} - if dest_uid in parts_and_calls_map: target_info.update({"target_type": "instruction", "target_uid": dest_uid, "target_name": parts_and_calls_map[dest_uid].get("name", parts_and_calls_map[dest_uid].get("type"))}) - elif dest_uid in access_map: target_info.update({"target_type": "operand", "target_details": access_map[dest_uid]}) - else: target_info.update({"target_type": "unknown", "target_uid": dest_uid}) - interesting_eno_logic.append(target_info) - if interesting_eno_logic: all_logic_steps[source_instr_uid]["eno_logic"] = interesting_eno_logic - - # 6. Ordenar y Devolver (sin cambios) - network_logic_final = [all_logic_steps[uid] for uid in sorted_uids_for_en if uid in all_logic_steps] - return {"id": network_id, "title": network_title, "comment": network_comment, "logic": network_logic_final} # --- Función Principal convert_xml_to_json (sin cambios en su flujo general) --- def convert_xml_to_json(xml_filepath, json_filepath): @@ -494,20 +455,110 @@ def convert_xml_to_json(xml_filepath, json_filepath): if not result["interface"]: print("Advertencia: Interface sin secciones iface:Section válidas.") else: print("Advertencia: No se encontró dentro de .") if not result["interface"]: print("Advertencia: No se pudo extraer información de la interfaz.") + print("Paso 5: Extrayendo y PROCESANDO lógica de redes (CompileUnits)...") networks_processed_count = 0 + result["networks"] = [] # Initialize networks list here object_list_node = the_block.xpath("./*[local-name()='ObjectList']") + if object_list_node: compile_units = object_list_node[0].xpath("./*[local-name()='SW.Blocks.CompileUnit']") print(f"Paso 5: Se encontraron {len(compile_units)} elementos SW.Blocks.CompileUnit.") + for network_elem in compile_units: networks_processed_count += 1 - parsed_network = parse_network(network_elem) # Llamada a la función de parseo de red - if parsed_network and parsed_network.get("error") is None: result["networks"].append(parsed_network) - elif parsed_network: print(f"Error: Falló parseo red ID={parsed_network.get('id')}: {parsed_network.get('error')}") - else: print(f"Error Fatal: parse_network devolvió None para CompileUnit ID={network_elem.get('ID')}.") - if networks_processed_count == 0: print("Advertencia: ObjectList sin SW.Blocks.CompileUnit.") - else: print("Advertencia: No se encontró ObjectList para el bloque.") + network_id = network_elem.get("ID") + if not network_id: + print(" Advertencia: Se encontró CompileUnit sin ID. Saltando.") + continue + + # --- Detectar lenguaje de la red --- + attribute_list = network_elem.xpath("./*[local-name()='AttributeList']") + programming_language = "LAD" # Default a LAD si no se especifica + network_source_node = None # Nodo + + if attribute_list: + lang_node = attribute_list[0].xpath("./*[local-name()='ProgrammingLanguage']/text()") + if lang_node: + programming_language = lang_node[0].strip() + # Obtener el nodo NetworkSource para pasarlo a los parsers + network_source_list = attribute_list[0].xpath("./*[local-name()='NetworkSource']") + if network_source_list: + network_source_node = network_source_list[0] + + print(f" - Procesando Red ID={network_id}, Lenguaje={programming_language}") + + # --- Extraer título y comentario (común) --- + title_element = network_elem.xpath( + ".//*[local-name()='MultilingualText'][@CompositionName='Title']" + ) + network_title = get_multilingual_text(title_element[0]) if title_element else f"Network {network_id}" + + comment_element = network_elem.xpath( + "./*[local-name()='ObjectList']/*[local-name()='MultilingualText'][@CompositionName='Comment']" + ) + network_comment = get_multilingual_text(comment_element[0]) if comment_element else "" + + # --- Procesar según el lenguaje --- + parsed_network_data = None + if programming_language == "SCL": + structured_text_node = network_source_node.xpath("./st:StructuredText", namespaces=ns) if network_source_node is not None else None + + reconstructed_scl = f"// SCL extraction failed for Network {network_id}: StructuredText node not found.\n" + if structured_text_node: + print(f" Reconstruyendo SCL desde tokens para red {network_id}...") + reconstructed_scl = reconstruct_scl_from_tokens(structured_text_node[0]) + # print(f" ... SCL reconstruido (parcial):\n{reconstructed_scl[:200]}...") # Preview opcional + else: + print(f" Advertencia: No se encontró nodo para red SCL {network_id}.") + + parsed_network_data = { + "id": network_id, + "title": network_title, + "comment": network_comment, + "language": "SCL", + "logic": [{ + "instruction_uid": f"SCL_{network_id}", # UID inventado + "type": "RAW_SCL_CHUNK", + "scl": reconstructed_scl + }] + } + + elif programming_language in ["LAD", "FBD"]: + # Para LAD/FBD, llamar a parse_network (que espera FlgNet dentro de NetworkSource) + # parse_network ya maneja su propio título/comentario si es necesario, pero podemos pasar los extraídos + # Nota: parse_network espera el *CompileUnit* element, no el NetworkSource + parsed_network_data = parse_network(network_elem) + if parsed_network_data: + parsed_network_data["language"] = programming_language # Asegurar que el lenguaje se guarda + if parsed_network_data.get("error"): + print(f" Error al parsear red {programming_language} ID={network_id}: {parsed_network_data['error']}") + # parsed_network_data = None # Descomentar para omitir redes con error + else: + print(f" Error: parse_network devolvió None para red {programming_language} ID={network_id}") + + else: + # Manejar otros lenguajes o casos inesperados + print(f" Advertencia: Lenguaje no soportado '{programming_language}' en red ID={network_id}. Creando placeholder.") + parsed_network_data = { + "id": network_id, + "title": network_title, + "comment": network_comment, + "language": programming_language, + "logic": [{"instruction_uid": f"UNS_{network_id}", "type": "UNSUPPORTED_LANG", "scl": f"// Network {network_id} uses unsupported language: {programming_language}\n"}] + } + + # Añadir la red procesada (si es válida) al resultado + if parsed_network_data: + result["networks"].append(parsed_network_data) + + # --- Fin del bucle for network_elem --- + + if networks_processed_count == 0: + print("Advertencia: ObjectList no contenía elementos SW.Blocks.CompileUnit.") + else: + print("Advertencia: No se encontró ObjectList para el bloque.") + print("Paso 6: Escribiendo el resultado en el archivo JSON...") if not result["interface"]: print("ADVERTENCIA FINAL: 'interface' está vacía.") if not result["networks"]: print("ADVERTENCIA FINAL: 'networks' está vacía.") diff --git a/x3_generate_scl.py b/x3_generate_scl.py index ae9d662..50df658 100644 --- a/x3_generate_scl.py +++ b/x3_generate_scl.py @@ -156,32 +156,73 @@ def generate_scl(processed_json_filepath, output_scl_filepath): for i, network in enumerate(data.get('networks', [])): network_title = network.get('title', f'Network {network.get("id")}') network_comment = network.get('comment', '') - scl_output.append(f" // Network {i+1}: {network_title}") + # Obtener lenguaje original de la red, default a LAD si no está + network_lang = network.get('language', 'LAD') + + scl_output.append(f" // Network {i+1}: {network_title} (Original Language: {network_lang})") if network_comment: - # Añadir comentario de red indentado for line in network_comment.splitlines(): scl_output.append(f" // {line}") scl_output.append("") # Línea en blanco antes del código de la red network_has_code = False + # Iterar sobre la 'logica' de la red for instruction in network.get('logic', []): + instruction_type = instruction.get("type", "") scl_code = instruction.get('scl') - if scl_code: - network_has_code = True - # Indentar y añadir el código SCL de la instrucción - # Quitar comentarios "// RLO updated..." o "// Comparison..." - # ya que el código SCL resultante es la representación final. - # Mantener comentarios de PBox por claridad. - is_rlo_update_comment = scl_code.strip().startswith("// RLO updated") - is_comparison_comment = scl_code.strip().startswith("// Comparison") - is_logic_o_comment = scl_code.strip().startswith("// Logic O") - if not (is_rlo_update_comment or is_comparison_comment or is_logic_o_comment) or "PBox" in scl_code : - for line in scl_code.splitlines(): - scl_output.append(f" {line}") # Indentación de 2 espacios + # --- INICIO: Manejar RAW_SCL_CHUNK y otros tipos --- + if instruction_type == "RAW_SCL_CHUNK" and scl_code: + network_has_code = True + # Imprimir el SCL reconstruido directamente + for line in scl_code.splitlines(): + scl_output.append(f" {line}") # Añadir indentación + elif instruction_type == "UNSUPPORTED_LANG" and scl_code: + network_has_code = True + # Imprimir comentario para lenguajes no soportados + for line in scl_code.splitlines(): + scl_output.append(f" {line}") + elif instruction_type.endswith("_scl") and scl_code: + # Código SCL generado por x2_process.py para LAD/FBD + if instruction.get("grouped", False): # Ignorar si fue agrupado + continue + + # Lógica mejorada para omitir comentarios internos si no aportan + lines = scl_code.splitlines() + is_internal_comment_only = (len(lines) == 1 and + (lines[0].strip().startswith("// RLO") or + lines[0].strip().startswith("// Comparison") or + lines[0].strip().startswith("// Logic O") or + lines[0].strip().startswith("// Logic included in grouped IF") or # Usar GROUPED_COMMENT si lo importas + lines[0].strip().startswith("// P_TRIG") or + lines[0].strip().startswith("// N_TRIG") )) + + if not is_internal_comment_only: + network_has_code = True + for line in lines: + clean_line = line.strip() + # Omitir comentarios autogenerados específicos + if not (clean_line.startswith("// RLO:") or \ + clean_line.startswith("// Comparison") or \ + clean_line.startswith("// Logic O") or \ + clean_line == "// Logic included in grouped IF" or \ + clean_line.startswith("// P_TRIG(") or \ + clean_line.startswith("// N_TRIG(")): + scl_output.append(f" {line}") # Indentación + # Ignorar instrucciones no procesadas (sin _scl) o con error + # elif "_error" in instruction_type: + # scl_output.append(f" // Error processing instruction {instruction.get('instruction_uid')}: {scl_code}") + # network_has_code = True + + + # --- FIN: Manejar RAW_SCL_CHUNK y otros tipos --- if network_has_code: - scl_output.append("") # Añadir línea en blanco después del código de la red + scl_output.append("") # Añadir línea en blanco después del código de la red si hubo algo + else: + # Añadir comentario si la red estaba vacía o no generó código imprimible + scl_output.append(f" // Network did not produce printable SCL code.") + scl_output.append("") scl_output.append("END_FUNCTION_BLOCK")