diff --git a/BlenderCtrl__Main_simplified.json b/BlenderCtrl__Main_simplified.json index 3241dd5..a4d5006 100644 --- a/BlenderCtrl__Main_simplified.json +++ b/BlenderCtrl__Main_simplified.json @@ -94,14 +94,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"AUX FALSE\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {} @@ -115,6 +115,12 @@ }, "negated_pins": {}, "inputs": { + "SRCBLK": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"HMI_PID\".\"PPM303\"" + }, "en": { "type": "connection", "source_instruction_type": "Contact", @@ -122,7 +128,24 @@ "source_pin": "out" } }, - "outputs": {} + "outputs": { + "DSTBLK": [ + { + "uid": "24", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"Filler_Head_Variables\".\"FillerHead\"" + } + ], + "RET_VAL": [ + { + "uid": "23", + "scope": "LocalVariable", + "type": "variable", + "name": "\"Block_Move_Err\"" + } + ] + } } ] }, @@ -138,14 +161,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"gIN_VoltageOk\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {} @@ -157,17 +180,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "in": { - "type": "connection", - "source_instruction_type": "Contact", - "source_instruction_uid": "24", - "source_pin": "out" - }, "bit": { "uid": "22", "scope": "GlobalVariable", "type": "variable", "name": "\"M19000\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "24", + "source_pin": "out" } }, "outputs": {} @@ -179,17 +202,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "23", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"gEmergencyPressed\"" - }, "in": { "type": "connection", "source_instruction_type": "NBox", "source_instruction_uid": "25", "source_pin": "out" + }, + "operand": { + "uid": "23", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gEmergencyPressed\"" } }, "outputs": {} @@ -208,14 +231,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"gIN_LinePressCO2Ok\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {} @@ -245,17 +268,17 @@ "operand": true }, "inputs": { - "operand": { - "uid": "23", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"gWorkshop_Co2_Presence\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "30", "source_pin": "out" + }, + "operand": { + "uid": "23", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gWorkshop_Co2_Presence\"" } }, "outputs": {} @@ -269,17 +292,17 @@ "operand": true }, "inputs": { - "operand": { - "uid": "24", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"gWorkshop_CIP_Signals\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "31", "source_pin": "out" + }, + "operand": { + "uid": "24", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gWorkshop_CIP_Signals\"" } }, "outputs": {} @@ -315,17 +338,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "25", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"HMI_Digital\".\"_PAL_S11\".\"Filtered\"" - }, "in": { "type": "connection", "source_instruction_type": "O", "source_instruction_uid": "33", "source_pin": "out" + }, + "operand": { + "uid": "25", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"HMI_Digital\".\"_PAL_S11\".\"Filtered\"" } }, "outputs": {} @@ -379,17 +402,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "27", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"gIN_VoltageOk\"" - }, "in": { "type": "connection", "source_instruction_type": "O", "source_instruction_uid": "36", "source_pin": "out" + }, + "operand": { + "uid": "27", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gIN_VoltageOk\"" } }, "outputs": {} @@ -401,17 +424,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "28", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"gBlenderSuppliesOk\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "37", "source_pin": "out" + }, + "operand": { + "uid": "28", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gBlenderSuppliesOk\"" } }, "outputs": {} @@ -468,14 +491,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"FirstScan\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {} @@ -486,7 +509,27 @@ "type": "Se", "template_values": {}, "negated_pins": {}, - "inputs": {}, + "inputs": { + "tv": { + "uid": "23", + "scope": "TypedConstant", + "type": "constant", + "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", + "source_instruction_type": "Contact", + "source_pin": "out" + } + }, "outputs": {} } ] @@ -503,14 +546,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"HMI_Variables_Status\".\"System\".\"Blender_Prod_CIP\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {} @@ -522,17 +565,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "22", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"gBlenderProdMode\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "23", "source_pin": "out" + }, + "operand": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gBlenderProdMode\"" } }, "outputs": {} @@ -553,14 +596,14 @@ "operand": true }, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"HMI_Variables_Status\".\"System\".\"Blender_Prod_CIP\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {} @@ -572,17 +615,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "22", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"gBlenderCIPMode\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "25", "source_pin": "out" + }, + "operand": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gBlenderCIPMode\"" } }, "outputs": {} @@ -602,12 +645,6 @@ "type": "constant", "datatype": "Int", "value": 19 - }, - "en": { - "type": "connection", - "source_instruction_uid": "25", - "source_instruction_type": "Contact", - "source_pin": "out" } }, "outputs": { @@ -637,14 +674,14 @@ "operand": true }, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"AUX FALSE\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {} @@ -656,17 +693,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "22", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"HMI_Variables_Status\".\"Meters\".\"QTM3012_PRD_Fault\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "26", "source_pin": "out" + }, + "operand": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"HMI_Variables_Status\".\"Meters\".\"QTM3012_PRD_Fault\"" } }, "outputs": {} @@ -735,14 +772,14 @@ "operand": true }, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"System_RunOut_Variables\".\"ProdPipeRunOutWaterCount\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {} @@ -754,17 +791,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "22", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"System_RunOut_Variables\".\"ProdPipeRunOutFillerBott\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "23", "source_pin": "out" + }, + "operand": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"System_RunOut_Variables\".\"ProdPipeRunOutFillerBott\"" } }, "outputs": {} @@ -783,14 +820,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_StillWaterByPass\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {} @@ -820,17 +857,17 @@ "operand": true }, "inputs": { - "operand": { - "uid": "23", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_Deaireation\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "28", "source_pin": "out" + }, + "operand": { + "uid": "23", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_Deaireation\"" } }, "outputs": {} @@ -866,17 +903,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "24", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"Blender_Variables_Pers\".\"gWaterRecipe\"" - }, "in": { "type": "connection", "source_instruction_type": "O", "source_instruction_uid": "30", "source_pin": "out" + }, + "operand": { + "uid": "24", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"Blender_Variables_Pers\".\"gWaterRecipe\"" } }, "outputs": {} @@ -890,17 +927,17 @@ "operand": true }, "inputs": { - "operand": { - "uid": "25", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"Blender_Variables_Pers\".\"gCarboStillRecipe\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "31", "source_pin": "out" + }, + "operand": { + "uid": "25", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"Blender_Variables_Pers\".\"gCarboStillRecipe\"" } }, "outputs": {} @@ -912,17 +949,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "26", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"gStillWaterByPassEn\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "32", "source_pin": "out" + }, + "operand": { + "uid": "26", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gStillWaterByPassEn\"" } }, "outputs": {} @@ -941,14 +978,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_BlendFillSystem\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {} @@ -960,17 +997,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "22", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_StillWaterByPass\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "26", "source_pin": "out" + }, + "operand": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_StillWaterByPass\"" } }, "outputs": {} @@ -982,17 +1019,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "23", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"Blender_Variables_Pers\".\"gWaterRecipe\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "27", "source_pin": "out" + }, + "operand": { + "uid": "23", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"Blender_Variables_Pers\".\"gWaterRecipe\"" } }, "outputs": {} @@ -1006,17 +1043,17 @@ "operand": true }, "inputs": { - "operand": { - "uid": "24", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"Blender_Variables_Pers\".\"gCarboStillRecipe\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "28", "source_pin": "out" + }, + "operand": { + "uid": "24", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"Blender_Variables_Pers\".\"gCarboStillRecipe\"" } }, "outputs": {} @@ -1028,17 +1065,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "25", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"gBlendFiStillWaterByPass\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "29", "source_pin": "out" + }, + "operand": { + "uid": "25", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gBlendFiStillWaterByPass\"" } }, "outputs": {} @@ -1057,14 +1094,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"gSyrupRoomEn\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {} @@ -1078,17 +1115,17 @@ "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" + }, + "operand": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gIN_HVP301_Aux\"" } }, "outputs": {} @@ -1102,17 +1139,17 @@ "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" + }, + "operand": { + "uid": "23", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_FastChangeOverEnabled\"" } }, "outputs": {} @@ -1124,17 +1161,17 @@ "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" + }, + "operand": { + "uid": "24", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"Procedure_Variables\".\"FTP302Line_Preparation\".\"Done\"" } }, "outputs": {} @@ -1148,17 +1185,17 @@ "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" + }, + "operand": { + "uid": "25", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"Procedure_Variables\".\"Syr_RunOut\".\"Done\"" } }, "outputs": {} @@ -1186,17 +1223,17 @@ "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" + }, + "operand": { + "uid": "27", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gIN_CIP_CIPRunning\"" } }, "outputs": {} @@ -1208,17 +1245,17 @@ "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" + }, + "operand": { + "uid": "28", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"Procedure_Variables\".\"Blender_Run\".\"Running\"" } }, "outputs": {} @@ -1254,17 +1291,17 @@ "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" + }, + "operand": { + "uid": "29", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gHVP301_Open\"" } }, "outputs": {} @@ -1283,14 +1320,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"gIN_HVM302_Aux\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {} @@ -1301,7 +1338,27 @@ "type": "Sd", "template_values": {}, "negated_pins": {}, - "inputs": {}, + "inputs": { + "tv": { + "uid": "22", + "scope": "TypedConstant", + "type": "constant", + "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", + "source_instruction_type": "Contact", + "source_pin": "out" + } + }, "outputs": {} }, { @@ -1311,17 +1368,17 @@ "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" + }, + "operand": { + "uid": "24", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gHVM302_Open\"" } }, "outputs": {} @@ -1340,14 +1397,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_BrixMeter\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {} @@ -1361,18 +1418,18 @@ }, "negated_pins": {}, "inputs": { - "in1": { - "uid": "22", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_MeterType\"" - }, "pre": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "24", "source_pin": "out" }, + "in1": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_MeterType\"" + }, "in2": { "uid": "23", "scope": "LiteralConstant", @@ -1413,14 +1470,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_BrixMeter\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {} @@ -1434,18 +1491,18 @@ }, "negated_pins": {}, "inputs": { - "in1": { - "uid": "22", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_MeterType\"" - }, "pre": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "24", "source_pin": "out" }, + "in1": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_MeterType\"" + }, "in2": { "uid": "23", "scope": "LiteralConstant", @@ -1486,14 +1543,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_SyrBrixMeter\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {} @@ -1528,14 +1585,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_BrixMeter\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {} @@ -1549,18 +1606,18 @@ }, "negated_pins": {}, "inputs": { - "in1": { - "uid": "22", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_MeterType\"" - }, "pre": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "24", "source_pin": "out" }, + "in1": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_MeterType\"" + }, "in2": { "uid": "23", "scope": "LiteralConstant", @@ -1620,6 +1677,7 @@ "type": "Call", "block_name": "Input", "block_type": "FB", + "instance_db": "\"Input_Data\"", "instance_scope": "GlobalVariable", "inputs": { "en": { @@ -1662,14 +1720,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_InverterRecirPumpPPM306\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {} @@ -1724,14 +1782,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"gBlenderProdMode\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {} @@ -1743,17 +1801,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "in": { - "type": "connection", - "source_instruction_type": "Contact", - "source_instruction_uid": "25", - "source_pin": "out" - }, "bit": { "uid": "22", "scope": "GlobalVariable", "type": "variable", "name": "\"M19001\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "25", + "source_pin": "out" } }, "outputs": {} @@ -1767,17 +1825,17 @@ "operand": true }, "inputs": { - "operand": { - "uid": "23", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"mDelayPowerOnTmr\"" - }, "in": { "type": "connection", "source_instruction_type": "PBox", "source_instruction_uid": "26", "source_pin": "out" + }, + "operand": { + "uid": "23", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"mDelayPowerOnTmr\"" } }, "outputs": {} @@ -1789,17 +1847,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "24", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"gProductionONS\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "27", "source_pin": "out" + }, + "operand": { + "uid": "24", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gProductionONS\"" } }, "outputs": {} @@ -1818,14 +1876,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"gProductionONS\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {} @@ -1879,17 +1937,17 @@ "operand": true }, "inputs": { - "operand": { - "uid": "23", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"Blender_Variables_Pers\".\"gBlenderStarted\"" - }, "in": { "type": "connection", "source_instruction_type": "O", "source_instruction_uid": "26", "source_pin": "out" + }, + "operand": { + "uid": "23", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"Blender_Variables_Pers\".\"gBlenderStarted\"" } }, "outputs": {} @@ -1924,14 +1982,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"HMI_Variables_Status\".\"System\".\"Blender_Prod_CIP\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {} @@ -1943,17 +2001,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "in": { - "type": "connection", - "source_instruction_type": "Contact", - "source_instruction_uid": "25", - "source_pin": "out" - }, "bit": { "uid": "22", "scope": "GlobalVariable", "type": "variable", "name": "\"M19002\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "25", + "source_pin": "out" } }, "outputs": {} @@ -1967,17 +2025,17 @@ "operand": true }, "inputs": { - "operand": { - "uid": "23", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"mDelayPowerOnTmr\"" - }, "in": { "type": "connection", "source_instruction_type": "PBox", "source_instruction_uid": "26", "source_pin": "out" + }, + "operand": { + "uid": "23", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"mDelayPowerOnTmr\"" } }, "outputs": {} @@ -1989,17 +2047,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "24", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"gRinseONS\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "27", "source_pin": "out" + }, + "operand": { + "uid": "24", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gRinseONS\"" } }, "outputs": {} @@ -2018,14 +2076,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"gBlenderCIPMode\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {} @@ -2037,17 +2095,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "in": { - "type": "connection", - "source_instruction_type": "Contact", - "source_instruction_uid": "25", - "source_pin": "out" - }, "bit": { "uid": "22", "scope": "GlobalVariable", "type": "variable", "name": "\"M19003\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "25", + "source_pin": "out" } }, "outputs": {} @@ -2061,17 +2119,17 @@ "operand": true }, "inputs": { - "operand": { - "uid": "23", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"mDelayPowerOnTmr\"" - }, "in": { "type": "connection", "source_instruction_type": "PBox", "source_instruction_uid": "26", "source_pin": "out" + }, + "operand": { + "uid": "23", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"mDelayPowerOnTmr\"" } }, "outputs": {} @@ -2083,17 +2141,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "24", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"gCIPONS\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "27", "source_pin": "out" + }, + "operand": { + "uid": "24", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gCIPONS\"" } }, "outputs": {} @@ -2112,14 +2170,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"gCIPONS\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {} @@ -2233,6 +2291,7 @@ "type": "Call", "block_name": "ProcedureFirstProduction", "block_type": "FB", + "instance_db": "\"FirstProduction_Data\"", "instance_scope": "GlobalVariable", "inputs": { "en": { @@ -2377,14 +2436,14 @@ "operand": true }, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"mDelayPowerOnTmr\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {} @@ -2395,6 +2454,7 @@ "type": "Call", "block_name": "Procedure", "block_type": "FB", + "instance_db": "\"Blender_Procedure Data\"", "instance_scope": "GlobalVariable", "inputs": { "en": { @@ -2460,14 +2520,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_Report\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {} @@ -2602,14 +2662,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"gBlendResetTotalizer\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {} @@ -2620,7 +2680,27 @@ "type": "Se", "template_values": {}, "negated_pins": {}, - "inputs": {}, + "inputs": { + "tv": { + "uid": "22", + "scope": "TypedConstant", + "type": "constant", + "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", + "source_instruction_type": "Contact", + "source_pin": "out" + } + }, "outputs": {} } ] @@ -2637,14 +2717,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"gFTN301_ResetTot\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {} @@ -2695,7 +2775,27 @@ "type": "Se", "template_values": {}, "negated_pins": {}, - "inputs": {}, + "inputs": { + "tv": { + "uid": "24", + "scope": "TypedConstant", + "type": "constant", + "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", + "source_instruction_type": "O", + "source_pin": "out" + } + }, "outputs": {} }, { @@ -2705,17 +2805,17 @@ "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" + }, + "operand": { + "uid": "25", + "scope": "LocalVariable", + "type": "variable", + "name": "\"mResetWaterTot\"" } }, "outputs": {} @@ -2734,14 +2834,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"gFTN301_ResetTot\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {} @@ -2753,17 +2853,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "22", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"gFTN301_ResetTot\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "23", "source_pin": "out" + }, + "operand": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gFTN301_ResetTot\"" } }, "outputs": {} @@ -2782,14 +2882,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"gFTP302_ResetTot\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {} @@ -2840,7 +2940,27 @@ "type": "Se", "template_values": {}, "negated_pins": {}, - "inputs": {}, + "inputs": { + "tv": { + "uid": "24", + "scope": "TypedConstant", + "type": "constant", + "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", + "source_instruction_type": "O", + "source_pin": "out" + } + }, "outputs": {} }, { @@ -2850,17 +2970,17 @@ "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" + }, + "operand": { + "uid": "25", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gSyrupRoomEn\"" } }, "outputs": {} @@ -2872,17 +2992,17 @@ "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" + }, + "operand": { + "uid": "26", + "scope": "LocalVariable", + "type": "variable", + "name": "\"mResetSyrupTot\"" } }, "outputs": {} @@ -2901,14 +3021,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"gFTP302_ResetTot\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {} @@ -2920,17 +3040,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "22", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"gFTP302_ResetTot\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "23", "source_pin": "out" + }, + "operand": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gFTP302_ResetTot\"" } }, "outputs": {} @@ -2949,14 +3069,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"gFTM303_ResetTot\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {} @@ -3007,7 +3127,27 @@ "type": "Se", "template_values": {}, "negated_pins": {}, - "inputs": {}, + "inputs": { + "tv": { + "uid": "24", + "scope": "TypedConstant", + "type": "constant", + "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", + "source_instruction_type": "O", + "source_pin": "out" + } + }, "outputs": {} }, { @@ -3017,17 +3157,17 @@ "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" + }, + "operand": { + "uid": "25", + "scope": "LocalVariable", + "type": "variable", + "name": "\"mResetCO2Tot\"" } }, "outputs": {} @@ -3046,14 +3186,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"gFTM303_ResetTot\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {} @@ -3065,17 +3205,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "22", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"gFTM303_ResetTot\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "23", "source_pin": "out" + }, + "operand": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gFTM303_ResetTot\"" } }, "outputs": {} @@ -3094,14 +3234,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"gProductMFMResetTot\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {} @@ -3152,7 +3292,27 @@ "type": "Se", "template_values": {}, "negated_pins": {}, - "inputs": {}, + "inputs": { + "tv": { + "uid": "24", + "scope": "TypedConstant", + "type": "constant", + "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", + "source_instruction_type": "O", + "source_pin": "out" + } + }, "outputs": {} }, { @@ -3162,17 +3322,17 @@ "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" + }, + "operand": { + "uid": "25", + "scope": "LocalVariable", + "type": "variable", + "name": "\"mResetProductTot\"" } }, "outputs": {} @@ -3191,14 +3351,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"gProductMFMResetTot\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {} @@ -3210,17 +3370,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "22", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"gProductMFMResetTot\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "23", "source_pin": "out" + }, + "operand": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gProductMFMResetTot\"" } }, "outputs": {} @@ -3239,14 +3399,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"gBlendResetTotalizer\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {} @@ -3258,17 +3418,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "22", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"gBlendResetTotalizer\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "23", "source_pin": "out" + }, + "operand": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gBlendResetTotalizer\"" } }, "outputs": {} @@ -3289,14 +3449,14 @@ "operand": true }, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_Simulation\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {} @@ -3391,14 +3551,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"HMI_Variables_Cmd\".\"Commands_From_HMI\".\"F7_DeviceControl\".\"Command\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {} @@ -3410,17 +3570,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "22", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"HMI_Variables_Cmd\".\"Commands_From_HMI\".\"F7_DeviceControl\".\"Enable\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "25", "source_pin": "out" + }, + "operand": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"HMI_Variables_Cmd\".\"Commands_From_HMI\".\"F7_DeviceControl\".\"Enable\"" } }, "outputs": {} @@ -3432,17 +3592,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "in": { - "type": "connection", - "source_instruction_type": "Contact", - "source_instruction_uid": "26", - "source_pin": "out" - }, "bit": { "uid": "23", "scope": "GlobalVariable", "type": "variable", "name": "\"M19011\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "26", + "source_pin": "out" } }, "outputs": {} @@ -3513,14 +3673,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"HMI_Variables_Cmd\".\"Recipe\".\"Main_Page\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {} @@ -3534,17 +3694,17 @@ "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" + }, + "operand": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"mFP_Recip_Main_Page\"" } }, "outputs": {} @@ -3556,17 +3716,17 @@ "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" + }, + "operand": { + "uid": "23", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"mAux_FP_M700_1\"" } }, "outputs": {} @@ -3610,17 +3770,17 @@ "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" + }, + "operand": { + "uid": "26", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"HMI_Variables_Cmd\".\"Recipe\".\"Edit\"" } }, "outputs": {} @@ -3632,17 +3792,17 @@ "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" + }, + "operand": { + "uid": "27", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"T_Pulse_Recipe_Edit\"" } }, "outputs": {} @@ -3654,17 +3814,17 @@ "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" + }, + "operand": { + "uid": "29", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"T_Pulse_Recipe_Edit\"" } }, "outputs": {} @@ -3676,17 +3836,17 @@ "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" + }, + "operand": { + "uid": "30", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"HMI_Variables_Cmd\".\"Recipe\".\"Edit\"" } }, "outputs": {} @@ -3714,17 +3874,17 @@ "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" + }, + "operand": { + "uid": "32", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"HMI_Variables_Cmd\".\"Recipe\".\"Edit\"" } }, "outputs": {} @@ -3743,14 +3903,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"AUX TRUE\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {} @@ -3761,6 +3921,7 @@ "type": "Call", "block_name": "RecipeManagement - Prod", "block_type": "FB", + "instance_db": "\"RecipeManagement_Data\"", "instance_scope": "GlobalVariable", "inputs": { "en": { diff --git a/BlenderCtrl__Main_simplified_processed.json b/BlenderCtrl__Main_simplified_processed.json index 8f11f95..c555ee5 100644 --- a/BlenderCtrl__Main_simplified_processed.json +++ b/BlenderCtrl__Main_simplified_processed.json @@ -96,14 +96,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"AUX FALSE\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {}, @@ -118,6 +118,12 @@ }, "negated_pins": {}, "inputs": { + "SRCBLK": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"HMI_PID\".\"PPM303\"" + }, "en": { "type": "connection", "source_instruction_type": "Contact", @@ -125,7 +131,24 @@ "source_pin": "out" } }, - "outputs": {} + "outputs": { + "DSTBLK": [ + { + "uid": "24", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"Filler_Head_Variables\".\"FillerHead\"" + } + ], + "RET_VAL": [ + { + "uid": "23", + "scope": "LocalVariable", + "type": "variable", + "name": "\"Block_Move_Err\"" + } + ] + } } ] }, @@ -141,14 +164,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"gIN_VoltageOk\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {}, @@ -161,17 +184,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "in": { - "type": "connection", - "source_instruction_type": "Contact", - "source_instruction_uid": "24", - "source_pin": "out" - }, "bit": { "uid": "22", "scope": "GlobalVariable", "type": "variable", "name": "\"M19000\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "24", + "source_pin": "out" } }, "outputs": {} @@ -183,17 +206,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "23", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"gEmergencyPressed\"" - }, "in": { "type": "connection", "source_instruction_type": "NBox", "source_instruction_uid": "25", "source_pin": "out" + }, + "operand": { + "uid": "23", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gEmergencyPressed\"" } }, "outputs": {} @@ -212,14 +235,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"gIN_LinePressCO2Ok\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {}, @@ -251,17 +274,17 @@ "operand": true }, "inputs": { - "operand": { - "uid": "23", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"gWorkshop_Co2_Presence\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "30", "source_pin": "out" + }, + "operand": { + "uid": "23", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gWorkshop_Co2_Presence\"" } }, "outputs": {}, @@ -276,17 +299,17 @@ "operand": true }, "inputs": { - "operand": { - "uid": "24", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"gWorkshop_CIP_Signals\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "31", "source_pin": "out" + }, + "operand": { + "uid": "24", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gWorkshop_CIP_Signals\"" } }, "outputs": {}, @@ -324,17 +347,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "25", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"HMI_Digital\".\"_PAL_S11\".\"Filtered\"" - }, "in": { "type": "connection", "source_instruction_type": "O", "source_instruction_uid": "33", "source_pin": "out" + }, + "operand": { + "uid": "25", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"HMI_Digital\".\"_PAL_S11\".\"Filtered\"" } }, "outputs": {}, @@ -391,17 +414,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "27", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"gIN_VoltageOk\"" - }, "in": { "type": "connection", "source_instruction_type": "O", "source_instruction_uid": "36", "source_pin": "out" + }, + "operand": { + "uid": "27", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gIN_VoltageOk\"" } }, "outputs": {}, @@ -414,17 +437,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "28", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"gBlenderSuppliesOk\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "37", "source_pin": "out" + }, + "operand": { + "uid": "28", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gBlenderSuppliesOk\"" } }, "outputs": {}, @@ -483,14 +506,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"FirstScan\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {}, @@ -502,7 +525,27 @@ "type": "Se", "template_values": {}, "negated_pins": {}, - "inputs": {}, + "inputs": { + "tv": { + "uid": "23", + "scope": "TypedConstant", + "type": "constant", + "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", + "source_instruction_type": "Contact", + "source_pin": "out" + } + }, "outputs": {} } ] @@ -519,14 +562,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"HMI_Variables_Status\".\"System\".\"Blender_Prod_CIP\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {}, @@ -539,17 +582,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "22", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"gBlenderProdMode\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "23", "source_pin": "out" + }, + "operand": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gBlenderProdMode\"" } }, "outputs": {}, @@ -571,14 +614,14 @@ "operand": true }, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"HMI_Variables_Status\".\"System\".\"Blender_Prod_CIP\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {}, @@ -591,17 +634,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "22", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"gBlenderCIPMode\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "25", "source_pin": "out" + }, + "operand": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gBlenderCIPMode\"" } }, "outputs": {}, @@ -622,12 +665,6 @@ "type": "constant", "datatype": "Int", "value": 19 - }, - "en": { - "type": "connection", - "source_instruction_uid": "25", - "source_instruction_type": "Contact", - "source_pin": "out" } }, "outputs": { @@ -640,7 +677,7 @@ } ] }, - "scl": "IF (NOT \"HMI_Variables_Status\".\"System\".\"Blender_Prod_CIP\") THEN\n \"HMI_Variables_Status\".\"Procedures\".\"BlenderStateNum\" := 19;\nEND_IF;" + "scl": "\"HMI_Variables_Status\".\"Procedures\".\"BlenderStateNum\" := 19;" } ] }, @@ -658,14 +695,14 @@ "operand": true }, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"AUX FALSE\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {}, @@ -678,17 +715,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "22", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"HMI_Variables_Status\".\"Meters\".\"QTM3012_PRD_Fault\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "26", "source_pin": "out" + }, + "operand": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"HMI_Variables_Status\".\"Meters\".\"QTM3012_PRD_Fault\"" } }, "outputs": {} @@ -757,14 +794,14 @@ "operand": true }, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"System_RunOut_Variables\".\"ProdPipeRunOutWaterCount\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {}, @@ -777,17 +814,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "22", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"System_RunOut_Variables\".\"ProdPipeRunOutFillerBott\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "23", "source_pin": "out" + }, + "operand": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"System_RunOut_Variables\".\"ProdPipeRunOutFillerBott\"" } }, "outputs": {}, @@ -807,14 +844,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_StillWaterByPass\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {}, @@ -846,17 +883,17 @@ "operand": true }, "inputs": { - "operand": { - "uid": "23", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_Deaireation\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "28", "source_pin": "out" + }, + "operand": { + "uid": "23", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_Deaireation\"" } }, "outputs": {}, @@ -894,17 +931,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "24", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"Blender_Variables_Pers\".\"gWaterRecipe\"" - }, "in": { "type": "connection", "source_instruction_type": "O", "source_instruction_uid": "30", "source_pin": "out" + }, + "operand": { + "uid": "24", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"Blender_Variables_Pers\".\"gWaterRecipe\"" } }, "outputs": {}, @@ -919,17 +956,17 @@ "operand": true }, "inputs": { - "operand": { - "uid": "25", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"Blender_Variables_Pers\".\"gCarboStillRecipe\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "31", "source_pin": "out" + }, + "operand": { + "uid": "25", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"Blender_Variables_Pers\".\"gCarboStillRecipe\"" } }, "outputs": {}, @@ -942,17 +979,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "26", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"gStillWaterByPassEn\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "32", "source_pin": "out" + }, + "operand": { + "uid": "26", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gStillWaterByPassEn\"" } }, "outputs": {}, @@ -972,14 +1009,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_BlendFillSystem\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {}, @@ -992,17 +1029,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "22", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_StillWaterByPass\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "26", "source_pin": "out" + }, + "operand": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_StillWaterByPass\"" } }, "outputs": {}, @@ -1015,17 +1052,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "23", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"Blender_Variables_Pers\".\"gWaterRecipe\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "27", "source_pin": "out" + }, + "operand": { + "uid": "23", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"Blender_Variables_Pers\".\"gWaterRecipe\"" } }, "outputs": {}, @@ -1040,17 +1077,17 @@ "operand": true }, "inputs": { - "operand": { - "uid": "24", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"Blender_Variables_Pers\".\"gCarboStillRecipe\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "28", "source_pin": "out" + }, + "operand": { + "uid": "24", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"Blender_Variables_Pers\".\"gCarboStillRecipe\"" } }, "outputs": {}, @@ -1063,17 +1100,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "25", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"gBlendFiStillWaterByPass\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "29", "source_pin": "out" + }, + "operand": { + "uid": "25", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gBlendFiStillWaterByPass\"" } }, "outputs": {}, @@ -1093,14 +1130,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"gSyrupRoomEn\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {}, @@ -1115,17 +1152,17 @@ "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" + }, + "operand": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gIN_HVP301_Aux\"" } }, "outputs": {}, @@ -1140,17 +1177,17 @@ "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" + }, + "operand": { + "uid": "23", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_FastChangeOverEnabled\"" } }, "outputs": {}, @@ -1163,17 +1200,17 @@ "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" + }, + "operand": { + "uid": "24", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"Procedure_Variables\".\"FTP302Line_Preparation\".\"Done\"" } }, "outputs": {}, @@ -1188,17 +1225,17 @@ "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" + }, + "operand": { + "uid": "25", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"Procedure_Variables\".\"Syr_RunOut\".\"Done\"" } }, "outputs": {}, @@ -1228,17 +1265,17 @@ "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" + }, + "operand": { + "uid": "27", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gIN_CIP_CIPRunning\"" } }, "outputs": {}, @@ -1251,17 +1288,17 @@ "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" + }, + "operand": { + "uid": "28", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"Procedure_Variables\".\"Blender_Run\".\"Running\"" } }, "outputs": {}, @@ -1299,17 +1336,17 @@ "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" + }, + "operand": { + "uid": "29", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gHVP301_Open\"" } }, "outputs": {}, @@ -1329,14 +1366,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"gIN_HVM302_Aux\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {}, @@ -1348,7 +1385,27 @@ "type": "Sd", "template_values": {}, "negated_pins": {}, - "inputs": {}, + "inputs": { + "tv": { + "uid": "22", + "scope": "TypedConstant", + "type": "constant", + "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", + "source_instruction_type": "Contact", + "source_pin": "out" + } + }, "outputs": {} }, { @@ -1358,17 +1415,17 @@ "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" + }, + "operand": { + "uid": "24", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gHVM302_Open\"" } }, "outputs": {} @@ -1387,14 +1444,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_BrixMeter\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {}, @@ -1409,18 +1466,18 @@ }, "negated_pins": {}, "inputs": { - "in1": { - "uid": "22", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_MeterType\"" - }, "pre": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "24", "source_pin": "out" }, + "in1": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_MeterType\"" + }, "in2": { "uid": "23", "scope": "LiteralConstant", @@ -1463,14 +1520,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_BrixMeter\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {}, @@ -1485,18 +1542,18 @@ }, "negated_pins": {}, "inputs": { - "in1": { - "uid": "22", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_MeterType\"" - }, "pre": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "24", "source_pin": "out" }, + "in1": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_MeterType\"" + }, "in2": { "uid": "23", "scope": "LiteralConstant", @@ -1539,14 +1596,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_SyrBrixMeter\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {}, @@ -1583,14 +1640,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_BrixMeter\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {}, @@ -1605,18 +1662,18 @@ }, "negated_pins": {}, "inputs": { - "in1": { - "uid": "22", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_MeterType\"" - }, "pre": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "24", "source_pin": "out" }, + "in1": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_MeterType\"" + }, "in2": { "uid": "23", "scope": "LiteralConstant", @@ -1676,9 +1733,10 @@ { "instruction_uid": "21", "uid": "21", - "type": "Call_FB_error", + "type": "Call_FB_scl", "block_name": "Input", "block_type": "FB", + "instance_db": "\"Input_Data\"", "instance_scope": "GlobalVariable", "inputs": { "en": { @@ -1686,7 +1744,7 @@ } }, "outputs": {}, - "scl": "// ERROR: FB Call Input sin instancia" + "scl": "\"Input_Data\"();" } ] }, @@ -1723,14 +1781,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_InverterRecirPumpPPM306\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {}, @@ -1788,14 +1846,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"gBlenderProdMode\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {}, @@ -1808,17 +1866,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "in": { - "type": "connection", - "source_instruction_type": "Contact", - "source_instruction_uid": "25", - "source_pin": "out" - }, "bit": { "uid": "22", "scope": "GlobalVariable", "type": "variable", "name": "\"M19001\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "25", + "source_pin": "out" } }, "outputs": {}, @@ -1833,17 +1891,17 @@ "operand": true }, "inputs": { - "operand": { - "uid": "23", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"mDelayPowerOnTmr\"" - }, "in": { "type": "connection", "source_instruction_type": "PBox", "source_instruction_uid": "26", "source_pin": "out" + }, + "operand": { + "uid": "23", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"mDelayPowerOnTmr\"" } }, "outputs": {}, @@ -1856,17 +1914,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "24", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"gProductionONS\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "27", "source_pin": "out" + }, + "operand": { + "uid": "24", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gProductionONS\"" } }, "outputs": {}, @@ -1886,14 +1944,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"gProductionONS\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {}, @@ -1950,17 +2008,17 @@ "operand": true }, "inputs": { - "operand": { - "uid": "23", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"Blender_Variables_Pers\".\"gBlenderStarted\"" - }, "in": { "type": "connection", "source_instruction_type": "O", "source_instruction_uid": "26", "source_pin": "out" + }, + "operand": { + "uid": "23", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"Blender_Variables_Pers\".\"gBlenderStarted\"" } }, "outputs": {}, @@ -1997,14 +2055,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"HMI_Variables_Status\".\"System\".\"Blender_Prod_CIP\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {}, @@ -2017,17 +2075,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "in": { - "type": "connection", - "source_instruction_type": "Contact", - "source_instruction_uid": "25", - "source_pin": "out" - }, "bit": { "uid": "22", "scope": "GlobalVariable", "type": "variable", "name": "\"M19002\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "25", + "source_pin": "out" } }, "outputs": {}, @@ -2042,17 +2100,17 @@ "operand": true }, "inputs": { - "operand": { - "uid": "23", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"mDelayPowerOnTmr\"" - }, "in": { "type": "connection", "source_instruction_type": "PBox", "source_instruction_uid": "26", "source_pin": "out" + }, + "operand": { + "uid": "23", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"mDelayPowerOnTmr\"" } }, "outputs": {}, @@ -2065,17 +2123,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "24", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"gRinseONS\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "27", "source_pin": "out" + }, + "operand": { + "uid": "24", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gRinseONS\"" } }, "outputs": {}, @@ -2095,14 +2153,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"gBlenderCIPMode\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {}, @@ -2115,17 +2173,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "in": { - "type": "connection", - "source_instruction_type": "Contact", - "source_instruction_uid": "25", - "source_pin": "out" - }, "bit": { "uid": "22", "scope": "GlobalVariable", "type": "variable", "name": "\"M19003\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "25", + "source_pin": "out" } }, "outputs": {}, @@ -2140,17 +2198,17 @@ "operand": true }, "inputs": { - "operand": { - "uid": "23", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"mDelayPowerOnTmr\"" - }, "in": { "type": "connection", "source_instruction_type": "PBox", "source_instruction_uid": "26", "source_pin": "out" + }, + "operand": { + "uid": "23", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"mDelayPowerOnTmr\"" } }, "outputs": {}, @@ -2163,17 +2221,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "24", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"gCIPONS\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "27", "source_pin": "out" + }, + "operand": { + "uid": "24", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gCIPONS\"" } }, "outputs": {}, @@ -2193,14 +2251,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"gCIPONS\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {}, @@ -2317,9 +2375,10 @@ { "instruction_uid": "21", "uid": "21", - "type": "Call_FB_error", + "type": "Call_FB_scl", "block_name": "ProcedureFirstProduction", "block_type": "FB", + "instance_db": "\"FirstProduction_Data\"", "instance_scope": "GlobalVariable", "inputs": { "en": { @@ -2327,7 +2386,7 @@ } }, "outputs": {}, - "scl": "// ERROR: FB Call ProcedureFirstProduction sin instancia" + "scl": "\"FirstProduction_Data\"();" } ] }, @@ -2471,14 +2530,14 @@ "operand": true }, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"mDelayPowerOnTmr\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {}, @@ -2487,9 +2546,10 @@ { "instruction_uid": "23", "uid": "23", - "type": "Call_FB_error", + "type": "Call_FB_scl", "block_name": "Procedure", "block_type": "FB", + "instance_db": "\"Blender_Procedure Data\"", "instance_scope": "GlobalVariable", "inputs": { "en": { @@ -2500,7 +2560,7 @@ } }, "outputs": {}, - "scl": "// ERROR: FB Call Procedure sin instancia" + "scl": "IF (NOT \"mDelayPowerOnTmr\") THEN\n \"Blender_Procedure Data\"();\nEND_IF;" } ] }, @@ -2558,14 +2618,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_Report\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {}, @@ -2707,14 +2767,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"gBlendResetTotalizer\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {}, @@ -2726,7 +2786,27 @@ "type": "Se", "template_values": {}, "negated_pins": {}, - "inputs": {}, + "inputs": { + "tv": { + "uid": "22", + "scope": "TypedConstant", + "type": "constant", + "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", + "source_instruction_type": "Contact", + "source_pin": "out" + } + }, "outputs": {} } ] @@ -2743,14 +2823,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"gFTN301_ResetTot\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {}, @@ -2804,7 +2884,27 @@ "type": "Se", "template_values": {}, "negated_pins": {}, - "inputs": {}, + "inputs": { + "tv": { + "uid": "24", + "scope": "TypedConstant", + "type": "constant", + "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", + "source_instruction_type": "O", + "source_pin": "out" + } + }, "outputs": {} }, { @@ -2814,17 +2914,17 @@ "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" + }, + "operand": { + "uid": "25", + "scope": "LocalVariable", + "type": "variable", + "name": "\"mResetWaterTot\"" } }, "outputs": {} @@ -2843,14 +2943,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"gFTN301_ResetTot\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {}, @@ -2863,17 +2963,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "22", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"gFTN301_ResetTot\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "23", "source_pin": "out" + }, + "operand": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gFTN301_ResetTot\"" } }, "outputs": {} @@ -2892,14 +2992,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"gFTP302_ResetTot\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {}, @@ -2953,7 +3053,27 @@ "type": "Se", "template_values": {}, "negated_pins": {}, - "inputs": {}, + "inputs": { + "tv": { + "uid": "24", + "scope": "TypedConstant", + "type": "constant", + "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", + "source_instruction_type": "O", + "source_pin": "out" + } + }, "outputs": {} }, { @@ -2963,17 +3083,17 @@ "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" + }, + "operand": { + "uid": "25", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gSyrupRoomEn\"" } }, "outputs": {} @@ -2985,17 +3105,17 @@ "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" + }, + "operand": { + "uid": "26", + "scope": "LocalVariable", + "type": "variable", + "name": "\"mResetSyrupTot\"" } }, "outputs": {} @@ -3014,14 +3134,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"gFTP302_ResetTot\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {}, @@ -3034,17 +3154,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "22", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"gFTP302_ResetTot\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "23", "source_pin": "out" + }, + "operand": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gFTP302_ResetTot\"" } }, "outputs": {} @@ -3063,14 +3183,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"gFTM303_ResetTot\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {}, @@ -3124,7 +3244,27 @@ "type": "Se", "template_values": {}, "negated_pins": {}, - "inputs": {}, + "inputs": { + "tv": { + "uid": "24", + "scope": "TypedConstant", + "type": "constant", + "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", + "source_instruction_type": "O", + "source_pin": "out" + } + }, "outputs": {} }, { @@ -3134,17 +3274,17 @@ "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" + }, + "operand": { + "uid": "25", + "scope": "LocalVariable", + "type": "variable", + "name": "\"mResetCO2Tot\"" } }, "outputs": {} @@ -3163,14 +3303,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"gFTM303_ResetTot\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {}, @@ -3183,17 +3323,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "22", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"gFTM303_ResetTot\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "23", "source_pin": "out" + }, + "operand": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gFTM303_ResetTot\"" } }, "outputs": {} @@ -3212,14 +3352,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"gProductMFMResetTot\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {}, @@ -3273,7 +3413,27 @@ "type": "Se", "template_values": {}, "negated_pins": {}, - "inputs": {}, + "inputs": { + "tv": { + "uid": "24", + "scope": "TypedConstant", + "type": "constant", + "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", + "source_instruction_type": "O", + "source_pin": "out" + } + }, "outputs": {} }, { @@ -3283,17 +3443,17 @@ "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" + }, + "operand": { + "uid": "25", + "scope": "LocalVariable", + "type": "variable", + "name": "\"mResetProductTot\"" } }, "outputs": {} @@ -3312,14 +3472,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"gProductMFMResetTot\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {}, @@ -3332,17 +3492,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "22", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"gProductMFMResetTot\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "23", "source_pin": "out" + }, + "operand": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gProductMFMResetTot\"" } }, "outputs": {} @@ -3361,14 +3521,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"gBlendResetTotalizer\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {}, @@ -3381,17 +3541,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "22", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"gBlendResetTotalizer\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "23", "source_pin": "out" + }, + "operand": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"gBlendResetTotalizer\"" } }, "outputs": {} @@ -3412,14 +3572,14 @@ "operand": true }, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"HMI_Blender_Parameters\".\"Processor_Options\".\"Blender_OPT\".\"_Simulation\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {}, @@ -3519,14 +3679,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"HMI_Variables_Cmd\".\"Commands_From_HMI\".\"F7_DeviceControl\".\"Command\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {}, @@ -3539,17 +3699,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "operand": { - "uid": "22", - "scope": "GlobalVariable", - "type": "variable", - "name": "\"HMI_Variables_Cmd\".\"Commands_From_HMI\".\"F7_DeviceControl\".\"Enable\"" - }, "in": { "type": "connection", "source_instruction_type": "Contact", "source_instruction_uid": "25", "source_pin": "out" + }, + "operand": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"HMI_Variables_Cmd\".\"Commands_From_HMI\".\"F7_DeviceControl\".\"Enable\"" } }, "outputs": {}, @@ -3562,17 +3722,17 @@ "template_values": {}, "negated_pins": {}, "inputs": { - "in": { - "type": "connection", - "source_instruction_type": "Contact", - "source_instruction_uid": "26", - "source_pin": "out" - }, "bit": { "uid": "23", "scope": "GlobalVariable", "type": "variable", "name": "\"M19011\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "26", + "source_pin": "out" } }, "outputs": {} @@ -3644,14 +3804,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"HMI_Variables_Cmd\".\"Recipe\".\"Main_Page\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {}, @@ -3666,17 +3826,17 @@ "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" + }, + "operand": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"mFP_Recip_Main_Page\"" } }, "outputs": {}, @@ -3689,17 +3849,17 @@ "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" + }, + "operand": { + "uid": "23", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"mAux_FP_M700_1\"" } }, "outputs": {}, @@ -3745,17 +3905,17 @@ "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" + }, + "operand": { + "uid": "26", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"HMI_Variables_Cmd\".\"Recipe\".\"Edit\"" } }, "outputs": {}, @@ -3768,17 +3928,17 @@ "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" + }, + "operand": { + "uid": "27", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"T_Pulse_Recipe_Edit\"" } }, "outputs": {} @@ -3790,17 +3950,17 @@ "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" + }, + "operand": { + "uid": "29", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"T_Pulse_Recipe_Edit\"" } }, "outputs": {} @@ -3812,17 +3972,17 @@ "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" + }, + "operand": { + "uid": "30", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"HMI_Variables_Cmd\".\"Recipe\".\"Edit\"" } }, "outputs": {} @@ -3851,17 +4011,17 @@ "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" + }, + "operand": { + "uid": "32", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"HMI_Variables_Cmd\".\"Recipe\".\"Edit\"" } }, "outputs": {} @@ -3880,14 +4040,14 @@ "template_values": {}, "negated_pins": {}, "inputs": { + "in": { + "type": "powerrail" + }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"AUX TRUE\"" - }, - "in": { - "type": "powerrail" } }, "outputs": {}, @@ -3896,9 +4056,10 @@ { "instruction_uid": "43", "uid": "43", - "type": "Call_FB_error", + "type": "Call_FB_scl", "block_name": "RecipeManagement - Prod", "block_type": "FB", + "instance_db": "\"RecipeManagement_Data\"", "instance_scope": "GlobalVariable", "inputs": { "en": { @@ -3909,7 +4070,7 @@ } }, "outputs": {}, - "scl": "// ERROR: FB Call RecipeManagement___Prod sin instancia" + "scl": "IF \"AUX TRUE\" THEN\n \"RecipeManagement_Data\"();\nEND_IF;" } ] }, diff --git a/BlenderCtrl__Main_simplified_processed.scl.txt b/BlenderCtrl__Main_simplified_processed.scl similarity index 97% rename from BlenderCtrl__Main_simplified_processed.scl.txt rename to BlenderCtrl__Main_simplified_processed.scl index f3e79d1..854cf71 100644 --- a/BlenderCtrl__Main_simplified_processed.scl.txt +++ b/BlenderCtrl__Main_simplified_processed.scl @@ -71,9 +71,7 @@ BEGIN // 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; + "HMI_Variables_Status"."Procedures"."BlenderStateNum" := 19; // Network 10: Error Faults @@ -154,7 +152,7 @@ BEGIN // Network 21: Input Data - // ERROR: FB Call Input sin instancia + "Input_Data"(); // Network 22: Sel Brix Source Check @@ -226,7 +224,7 @@ BEGIN // Network 34: First Production - // ERROR: FB Call ProcedureFirstProduction sin instancia + "FirstProduction_Data"(); // Network 35: CIP MAIN Calling @@ -255,7 +253,9 @@ BEGIN // Network 41: Blend Procedure Data // RLO: (NOT "mDelayPowerOnTmr") - // ERROR: FB Call Procedure sin instancia + IF (NOT "mDelayPowerOnTmr") THEN + "Blender_Procedure Data"(); + END_IF; // Network 42: Pneumatic Valve Control @@ -376,7 +376,9 @@ BEGIN // Network 67: to HMI - Recipe Management // RLO: "AUX TRUE" - // ERROR: FB Call RecipeManagement___Prod sin instancia + IF "AUX TRUE" THEN + "RecipeManagement_Data"(); + END_IF; // Network 68: Recipe Calculation diff --git a/TestLAD.xml b/TestLAD.xml index b9a9111..13f5962 100644 --- a/TestLAD.xml +++ b/TestLAD.xml @@ -77,30 +77,44 @@ + + + + + - - + + + - - - - - - - - - + - + + + + + + + + + + + + + + + + + LAD @@ -210,32 +224,46 @@ + + + + + - + - + + - - - - - - - - - + - + + + + + + + + + + + + + + + + + LAD diff --git a/TestLAD_simplified.json b/TestLAD_simplified.json index 56f91e2..8c1a085 100644 --- a/TestLAD_simplified.json +++ b/TestLAD_simplified.json @@ -18,42 +18,64 @@ "comment": "", "logic": [ { - "instruction_uid": "23", - "uid": "23", + "instruction_uid": "24", + "uid": "24", "type": "Contact", "template_values": {}, "negated_pins": {}, "inputs": { - "in": { - "type": "powerrail" - }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"Clock_10Hz\"" + }, + "in": { + "type": "powerrail" } }, "outputs": {} }, { - "instruction_uid": "24", - "uid": "24", + "instruction_uid": "25", + "uid": "25", + "type": "PBox", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "bit": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"M19001\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "24", + "source_pin": "out" + } + }, + "outputs": {} + }, + { + "instruction_uid": "26", + "uid": "26", "type": "Coil", "template_values": {}, "negated_pins": {}, "inputs": { - "in": { - "type": "connection", - "source_instruction_type": "Contact", - "source_instruction_uid": "23", - "source_pin": "out" - }, "operand": { - "uid": "22", + "uid": "23", "scope": "GlobalVariable", "type": "variable", "name": "\"Clock_5Hz\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "PBox", + "source_instruction_uid": "25", + "source_pin": "out" } }, "outputs": {} @@ -66,56 +88,71 @@ "comment": "", "logic": [ { - "instruction_uid": "23", - "uid": "23", + "instruction_uid": "24", + "uid": "24", "type": "Contact", "template_values": {}, "negated_pins": { "operand": true }, "inputs": { - "in": { - "type": "powerrail" - }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"Clock_10Hz\"" + }, + "in": { + "type": "powerrail" } }, "outputs": {} }, { - "instruction_uid": "24", - "uid": "24", + "instruction_uid": "25", + "uid": "25", + "type": "NBox", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "bit": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"M19001\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "24", + "source_pin": "out" + } + }, + "outputs": {} + }, + { + "instruction_uid": "26", + "uid": "26", "type": "Coil", "template_values": {}, "negated_pins": {}, "inputs": { - "in": { - "type": "connection", - "source_instruction_type": "Contact", - "source_instruction_uid": "23", - "source_pin": "out" - }, "operand": { - "uid": "22", + "uid": "23", "scope": "GlobalVariable", "type": "variable", "name": "\"Clock_5Hz\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "NBox", + "source_instruction_uid": "25", + "source_pin": "out" } }, "outputs": {} } ] - }, - { - "id": "2B", - "title": "", - "comment": "", - "logic": [], - "error": "FlgNet not found" } ] } \ No newline at end of file diff --git a/TestLAD_simplified_processed.json b/TestLAD_simplified_processed.json index 20b13e6..74eb330 100644 --- a/TestLAD_simplified_processed.json +++ b/TestLAD_simplified_processed.json @@ -18,47 +18,70 @@ "comment": "", "logic": [ { - "instruction_uid": "23", - "uid": "23", + "instruction_uid": "24", + "uid": "24", "type": "Contact_scl", "template_values": {}, "negated_pins": {}, "inputs": { - "in": { - "type": "powerrail" - }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"Clock_10Hz\"" + }, + "in": { + "type": "powerrail" } }, "outputs": {}, "scl": "// RLO: \"Clock_10Hz\"" }, { - "instruction_uid": "24", - "uid": "24", + "instruction_uid": "25", + "uid": "25", + "type": "PBox_scl", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "bit": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"M19001\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "24", + "source_pin": "out" + } + }, + "outputs": {}, + "scl": "\"stat_M19001\" := \"Clock_10Hz\"; // P_TRIG: \"Clock_10Hz\" AND NOT \"stat_M19001\"" + }, + { + "instruction_uid": "26", + "uid": "26", "type": "Coil_scl", "template_values": {}, "negated_pins": {}, "inputs": { - "in": { - "type": "connection", - "source_instruction_type": "Contact", - "source_instruction_uid": "23", - "source_pin": "out" - }, "operand": { - "uid": "22", + "uid": "23", "scope": "GlobalVariable", "type": "variable", "name": "\"Clock_5Hz\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "PBox", + "source_instruction_uid": "25", + "source_pin": "out" } }, "outputs": {}, - "scl": "\"Clock_5Hz\" := \"Clock_10Hz\";" + "scl": "\"Clock_5Hz\" := \"Clock_10Hz\" AND NOT \"stat_M19001\";" } ] }, @@ -68,58 +91,74 @@ "comment": "", "logic": [ { - "instruction_uid": "23", - "uid": "23", + "instruction_uid": "24", + "uid": "24", "type": "Contact_scl", "template_values": {}, "negated_pins": { "operand": true }, "inputs": { - "in": { - "type": "powerrail" - }, "operand": { "uid": "21", "scope": "GlobalVariable", "type": "variable", "name": "\"Clock_10Hz\"" + }, + "in": { + "type": "powerrail" } }, "outputs": {}, "scl": "// RLO: (NOT \"Clock_10Hz\")" }, { - "instruction_uid": "24", - "uid": "24", + "instruction_uid": "25", + "uid": "25", + "type": "NBox_scl", + "template_values": {}, + "negated_pins": {}, + "inputs": { + "bit": { + "uid": "22", + "scope": "GlobalVariable", + "type": "variable", + "name": "\"M19001\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "Contact", + "source_instruction_uid": "24", + "source_pin": "out" + } + }, + "outputs": {}, + "scl": "\"stat_M19001\" := (NOT \"Clock_10Hz\"); // N_TRIG: NOT (NOT \"Clock_10Hz\") AND \"stat_M19001\"" + }, + { + "instruction_uid": "26", + "uid": "26", "type": "Coil_scl", "template_values": {}, "negated_pins": {}, "inputs": { - "in": { - "type": "connection", - "source_instruction_type": "Contact", - "source_instruction_uid": "23", - "source_pin": "out" - }, "operand": { - "uid": "22", + "uid": "23", "scope": "GlobalVariable", "type": "variable", "name": "\"Clock_5Hz\"" + }, + "in": { + "type": "connection", + "source_instruction_type": "NBox", + "source_instruction_uid": "25", + "source_pin": "out" } }, "outputs": {}, - "scl": "\"Clock_5Hz\" := (NOT \"Clock_10Hz\");" + "scl": "\"Clock_5Hz\" := NOT (NOT \"Clock_10Hz\") AND \"stat_M19001\";" } ] - }, - { - "id": "2B", - "title": "", - "comment": "", - "logic": [], - "error": "FlgNet not found" } ] } \ No newline at end of file diff --git a/TestLAD_simplified_processed.scl b/TestLAD_simplified_processed.scl index 6113687..1d1cc38 100644 --- a/TestLAD_simplified_processed.scl +++ b/TestLAD_simplified_processed.scl @@ -15,6 +15,10 @@ END_VAR VAR_IN_OUT END_VAR +VAR_STAT + "stat_M19001" : Bool; // Memory for edge detection +END_VAR + VAR_TEMP END_VAR @@ -23,13 +27,13 @@ BEGIN // Network 1: Clock Bit // RLO: "Clock_10Hz" - "Clock_5Hz" := "Clock_10Hz"; + "stat_M19001" := "Clock_10Hz"; // P_TRIG: "Clock_10Hz" AND NOT "stat_M19001" + "Clock_5Hz" := "Clock_10Hz" AND NOT "stat_M19001"; // Network 2: Clock Bit // RLO: (NOT "Clock_10Hz") - "Clock_5Hz" := (NOT "Clock_10Hz"); - - // Network 3: + "stat_M19001" := (NOT "Clock_10Hz"); // N_TRIG: NOT (NOT "Clock_10Hz") AND "stat_M19001" + "Clock_5Hz" := NOT (NOT "Clock_10Hz") AND "stat_M19001"; END_FUNCTION_BLOCK diff --git a/x1_to_json.py b/x1_to_json.py index c3c5423..8142a67 100644 --- a/x1_to_json.py +++ b/x1_to_json.py @@ -13,9 +13,8 @@ ns = { # --- Helper Functions --- -# (get_multilingual_text, get_symbol_name, parse_access, parse_part - sin cambios) -# ... (código de estas funciones aquí) ... def get_multilingual_text(element, default_lang="en-US", fallback_lang="it-IT"): + # (Sin cambios respecto a la versión anterior) if element is None: return "" try: @@ -42,8 +41,8 @@ def get_multilingual_text(element, default_lang="en-US", fallback_lang="it-IT"): print(f"Advertencia: Error extrayendo MultilingualText: {e}") return "" - def get_symbol_name(symbol_element): + # (Sin cambios respecto a la versión anterior) if symbol_element is None: return None try: @@ -53,668 +52,312 @@ def get_symbol_name(symbol_element): print(f"Advertencia: Excepción en get_symbol_name: {e}") return None - def parse_access(access_element): - if access_element is None: - return None - uid = access_element.get("UId") - scope = access_element.get("Scope") + # (Sin cambios respecto a la versión anterior) + if access_element is None: return None + uid = access_element.get("UId"); scope = access_element.get("Scope") info = {"uid": uid, "scope": scope, "type": "unknown"} symbol = access_element.xpath("./*[local-name()='Symbol']") constant = access_element.xpath("./*[local-name()='Constant']") if symbol: info["type"] = "variable" info["name"] = get_symbol_name(symbol[0]) - if info["name"] is None: - info["type"] = "error_parsing_symbol" - print(f"Error: No se pudo parsear nombre símbolo Access UID={uid}") - return info + if info["name"] is None: info["type"] = "error_parsing_symbol"; print(f"Error: No se pudo parsear nombre símbolo Access UID={uid}"); return info elif constant: info["type"] = "constant" const_type_elem = constant[0].xpath("./*[local-name()='ConstantType']") const_val_elem = constant[0].xpath("./*[local-name()='ConstantValue']") - info["datatype"] = ( - const_type_elem[0].text - if const_type_elem and const_type_elem[0].text is not None - else "Unknown" - ) - value_str = ( - const_val_elem[0].text - if const_val_elem and const_val_elem[0].text is not None - else None - ) - if value_str is None: - info["type"] = "error_parsing_constant" - info["value"] = None - print(f"Error: Constante sin valor Access UID={uid}") - return info + info["datatype"] = const_type_elem[0].text if const_type_elem and const_type_elem[0].text is not None else "Unknown" + value_str = const_val_elem[0].text if const_val_elem and const_val_elem[0].text is not None else None + if value_str is None: info["type"] = "error_parsing_constant"; info["value"] = None; print(f"Error: Constante sin valor Access UID={uid}"); return info if info["datatype"] == "Unknown": val_lower = value_str.lower() - if val_lower in ["true", "false"]: - info["datatype"] = "Bool" - elif value_str.isdigit() or ( - value_str.startswith("-") and value_str[1:].isdigit() - ): - info["datatype"] = "Int" - elif "." in value_str: - try: - float(value_str) - info["datatype"] = "Real" - except ValueError: - pass - elif "#" in value_str: - info["datatype"] = "TypedConstant" + if val_lower in ["true", "false"]: info["datatype"] = "Bool" + elif value_str.isdigit() or (value_str.startswith('-') and value_str[1:].isdigit()): info["datatype"] = "Int" + elif '.' in value_str: + try: float(value_str); info["datatype"] = "Real" + except ValueError: pass + elif '#' in value_str: info["datatype"] = "TypedConstant" info["value"] = value_str dtype_lower = info["datatype"].lower() - val_str_processed = value_str.split("#")[-1] if "#" in value_str else value_str + val_str_processed = value_str.split('#')[-1] if '#' in value_str else value_str try: - if dtype_lower in [ - "int", - "dint", - "udint", - "sint", - "usint", - "lint", - "ulint", - "word", - "dword", - "lword", - "byte", - ]: - info["value"] = int(val_str_processed) - elif dtype_lower == "bool": - info["value"] = ( - val_str_processed.lower() == "true" or val_str_processed == "1" - ) - elif dtype_lower in ["real", "lreal"]: - info["value"] = float(val_str_processed) - elif dtype_lower == "typedconstant": - info["value"] = value_str - except (ValueError, TypeError) as e: - print( - f"Advertencia: No se pudo convertir valor '{val_str_processed}' a {dtype_lower} UID={uid}. Error: {e}" - ) - info["value"] = value_str - else: - info["type"] = "unknown_structure" - print(f"Advertencia: Access UID={uid} no es Symbol ni Constant.") - return info - if info["type"] == "variable" and info.get("name") is None: - print(f"Error Interno: parse_access var sin nombre UID {uid}.") - info["type"] = "error_no_name" - return info + if dtype_lower in ['int', 'dint', 'udint', 'sint', 'usint', 'lint', 'ulint', 'word', 'dword', 'lword', 'byte']: info["value"] = int(val_str_processed) + elif dtype_lower == 'bool': info["value"] = (val_str_processed.lower() == 'true' or val_str_processed == '1') + elif dtype_lower in ['real', 'lreal']: info["value"] = float(val_str_processed) + elif dtype_lower == 'typedconstant': info["value"] = value_str + except (ValueError, TypeError) as e: print(f"Advertencia: No se pudo convertir valor '{val_str_processed}' a {dtype_lower} UID={uid}. Error: {e}"); info["value"] = value_str + else: info["type"] = "unknown_structure"; print(f"Advertencia: Access UID={uid} no es Symbol ni Constant."); return info + if info['type'] == 'variable' and info.get('name') is None: print(f"Error Interno: parse_access var sin nombre UID {uid}."); info['type'] = "error_no_name"; return info return info - def parse_part(part_element): - """ - Parsea un elemento Part (instrucción) y extrae UID, nombre, - valores de plantilla y pines negados. - """ + # (Sin cambios respecto a la versión anterior) if part_element is None: return None uid = part_element.get('UId'); name = part_element.get('Name') if not uid or not name: print(f"Error: Part sin UID o Name: {etree.tostring(part_element, encoding='unicode')}"); return None - template_values = {} try: for tv in part_element.xpath("./*[local-name()='TemplateValue']"): tv_name = tv.get('Name'); tv_type = tv.get('Type') if tv_name and tv_type: template_values[tv_name] = tv_type except Exception as e: print(f"Advertencia: Error extrayendo TemplateValues Part UID={uid}: {e}") - - # --- INICIO NUEVA LÓGICA PARA NEGACIÓN --- - negated_pins = {} # Diccionario para pines negados: {pin_name: True} + negated_pins = {} try: for negated_elem in part_element.xpath("./*[local-name()='Negated']"): negated_pin_name = negated_elem.get('Name') - if negated_pin_name: - negated_pins[negated_pin_name] = True - # print(f"DEBUG: Pin negado detectado: {name} UID {uid}, Pin: {negated_pin_name}") # Debug + if negated_pin_name: negated_pins[negated_pin_name] = True except Exception as e: print(f"Advertencia: Error extrayendo Negated Pins Part UID={uid}: {e}") - return { - 'uid': uid, - 'type': name, # Usar 'type' para consistencia - 'template_values': template_values, - 'negated_pins': negated_pins # Añadir diccionario de pines negados - } + return {'uid': uid, 'type': name, 'template_values': template_values, 'negated_pins': negated_pins} - -# --- NUEVA FUNCIÓN parse_call --- def parse_call(call_element): - """ - Parsea un elemento Call (llamada a FC/FB) y extrae su información. - """ - if call_element is None: - return None + # (Mantiene la corrección para DB de instancia) + if call_element is None: return None uid = call_element.get("UId") - if not uid: - print( - f"Error: Call encontrado sin UID: {etree.tostring(call_element, encoding='unicode')}" - ) - return None - + if not uid: print(f"Error: Call encontrado sin UID: {etree.tostring(call_element, encoding='unicode')}"); return None call_info_elem = call_element.xpath("./*[local-name()='CallInfo']") - if not call_info_elem: - print(f"Error: Call UID {uid} sin elemento CallInfo.") - return None + if not call_info_elem: print(f"Error: Call UID {uid} sin elemento CallInfo."); return None call_info = call_info_elem[0] - block_name = call_info.get("Name") - block_type = call_info.get("BlockType") # FC, FB, etc. - instance_name = None - instance_scope = None - - # Si es una llamada a FB, puede tener información de instancia - instance_elem = call_info.xpath("./*[local-name()='Instance']") - if instance_elem: - instance = instance_elem[0] - instance_scope = instance.get("Scope") # Ej: GlobalVariable, InstanceDB - # El nombre de la instancia DB suele estar en Component dentro de Symbol - symbol_elem = instance.xpath("./*[local-name()='Symbol']") - if symbol_elem: - instance_name = get_symbol_name(symbol_elem[0]) - - if not block_name or not block_type: - print(f"Error: CallInfo para UID {uid} sin Name o BlockType.") - return None - - call_data = { - "uid": uid, - "type": "Call", # Tipo genérico para nuestra estructura JSON - "block_name": block_name, - "block_type": block_type, - } - if instance_name: - call_data["instance_db"] = instance_name - if instance_scope: - call_data["instance_scope"] = instance_scope - + block_type = call_info.get("BlockType") + instance_name = None; instance_scope = None + if not block_name or not block_type: print(f"Error: CallInfo para UID {uid} sin Name o BlockType."); return None + if block_type == "FB": + instance_elem_list = call_info.xpath("./*[local-name()='Instance']") + if instance_elem_list: + instance_elem = instance_elem_list[0] + instance_scope = instance_elem.get("Scope") + component_elem_list = instance_elem.xpath("./*[local-name()='Component']") # Busca Component directo + if component_elem_list: + component_elem = component_elem_list[0] + db_name_raw = component_elem.get('Name') + if db_name_raw: instance_name = f'"{db_name_raw}"' # Añade comillas + else: print(f"Advertencia: dentro de para FB Call UID {uid} no tiene atributo 'Name'.") + else: print(f"Advertencia: No se encontró dentro de para FB Call UID {uid}. No se pudo obtener el nombre del DB.") + else: print(f"Advertencia: FB Call '{block_name}' UID {uid} no tiene elemento .") + call_data = {"uid": uid, "type": "Call", "block_name": block_name, "block_type": block_type} + if instance_name: call_data["instance_db"] = instance_name + if instance_scope: call_data["instance_scope"] = instance_scope return call_data -# --- FIN NUEVA FUNCIÓN --- - - -# --- Función parse_network MODIFICADA --- +# --- Función parse_network con XPath corregido para Title/Comment --- def parse_network(network_element): """ - Parsea una red, extrae lógica (incluyendo Calls) y añade conexiones EN implícitas. + 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", - } + 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']" + ".//*[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_title_element = network_element.xpath( - "./*[local-name()='ObjectList']/*[local-name()='MultilingualText'][@CompositionName='Comment']" - ) - network_comment = ( - get_multilingual_text(comment_title_element[0]) if comment_title_element else "" + 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", - } + 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 - access_map = { - acc_info["uid"]: acc_info - for acc in flgnet.xpath(".//flg:Access", namespaces=ns) - if (acc_info := parse_access(acc)) - } - - # --- MODIFICADO: Unir Parts y Calls en un solo mapa --- + # 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 - ) # Buscar ambos tipos - + instruction_elements = flgnet.xpath(".//flg:Part | .//flg:Call", namespaces=ns) for element in instruction_elements: parsed_info = None - if element.tag.endswith("Part"): - parsed_info = parse_part(element) - elif element.tag.endswith("Call"): - parsed_info = parse_call(element) + 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}") - 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}" - ) - # --- FIN MODIFICADO --- - - # 2. Parsear Wires y construir mapas de conexiones - wire_connections = defaultdict(list) - source_connections = defaultdict(list) - eno_outputs = defaultdict(list) + # 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 + 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 dest_uid and dest_pin and source_uid is not None: - dest_key = (dest_uid, dest_pin) - source_key = (source_uid, source_pin) - source_info = (source_uid, source_pin) - dest_info = (dest_uid, dest_pin) - if source_info not in wire_connections[dest_key]: - wire_connections[dest_key].append(source_info) - 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 - ): # Usar mapa combinado - if dest_info not in eno_outputs[source_uid]: - eno_outputs[source_uid].append(dest_info) + 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. Construir la representación lógica INICIAL + # 3. Construcción Lógica Inicial (sin cambios) all_logic_steps = {} - functional_block_types = [ - "Move", - "Add", - "Sub", - "Mul", - "Div", - "Mod", - "Convert", - "Call", - ] # Añadir Call - rlo_generators = [ - "Contact", - "O", - "Eq", - "Ne", - "Gt", - "Lt", - "Ge", - "Le", - "And", - "Xor", - "PBox", - ] - - # --- MODIFICADO: Iterar sobre el mapa combinado --- + 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(): - # Usar directamente la info parseada (part_info o call_info) - instruction_repr = { - "instruction_uid": instruction_uid, - **instruction_info, - } # Copiar datos base - instruction_repr["inputs"] = {} - instruction_repr["outputs"] = {} - # --- FIN MODIFICADO --- - - # Rellenar inputs explícitos - # Añadir más pines si las llamadas a FB los usan (ej: parámetros FC/FB) - possible_pins = set( - ["en", "in", "in1", "in2", "in3", "in4", "bit", "operand", "pre", "clk"] - ) - # Añadir pines específicos de la llamada si es un FB? Más complejo. - for dest_pin_name in possible_pins: + 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 = [] + 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: # Usar mapa combinado - input_sources_repr.append( - { - "type": "connection", - # Usar el tipo del mapa combinado - "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 - - # Rellenar outputs explícitos (hacia Access) - for source_pin_name in [ - "out", - "out1", - "Q", - "eno", - ]: # Añadir salidas comunes de FC/FB si es necesario + 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] - ) - + 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 Y PROPAGACIÓN DE CONEXIONES 'EN' IMPLÍCITAS --- - # (Esta lógica probablemente necesite ajustes para considerar 'Call' como bloque funcional) - # print(f"DEBUG: Iniciando inferencia EN para Red {network_id}...") - processed_blocks_en_inference = set() - something_changed = True - inference_passes = 0 - max_inference_passes = len(all_logic_steps) + 5 + # 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 - try: - sorted_uids_for_pass = sorted( - all_logic_steps.keys(), - key=lambda x: int(x) if x.isdigit() else float("inf"), - ) - except ValueError: - sorted_uids_for_pass = sorted(all_logic_steps.keys()) - - current_logic_list = [ - all_logic_steps[uid] - for uid in sorted_uids_for_pass - if uid in all_logic_steps - ] - - for i, instruction in enumerate( - current_logic_list - ): # Usar enumerate para obtener índice - part_uid = instruction["instruction_uid"] - part_type = instruction["type"] # Ahora puede ser 'Call' - - # Si es un bloque funcional (incluyendo Call) sin 'en' explícito - if ( - part_type in functional_block_types - and "en" not in instruction["inputs"] - and part_uid not in processed_blocks_en_inference - ): + 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 - my_index = i # Ya tenemos el índice - - if my_index > 0: - for j in range(my_index - 1, -1, -1): # Buscar hacia atrás - prev_instr = current_logic_list[j] - prev_uid = prev_instr["instruction_uid"] - prev_type = prev_instr["type"] - if prev_type in rlo_generators: - inferred_en_source = { - "type": "connection", - "source_instruction_uid": prev_uid, - "source_instruction_type": prev_type, - "source_pin": "out", - } - break - elif prev_type in functional_block_types: + 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, - "source_pin": "eno", - } - break + 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 - if inferred_en_source: - # Asegurarse de que 'instruction' se refiera al diccionario original - 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 --- - # (Necesita usar parts_and_calls_map ahora) + # 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 + 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 = ( - dest_uid in parts_and_calls_map and dest_pin == "en" - ) # Check en mapa combinado + 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") - ), - } - ) # Usar 'name' si existe (Part) o 'type' (Call) - 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} - ) + 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 + if interesting_eno_logic: all_logic_steps[source_instr_uid]["eno_logic"] = interesting_eno_logic - # --- 6. Ordenar Lógica Final y Devolver --- - try: - sorted_uids = sorted( - all_logic_steps.keys(), - key=lambda x: int(x) if x.isdigit() else float("inf"), - ) - except ValueError: - print(f"Advertencia: UIDs no numéricos red {network_id}. Orden alfabético.") - sorted_uids = sorted(all_logic_steps.keys()) - network_logic = [ - all_logic_steps[uid] for uid in sorted_uids if uid in all_logic_steps - ] - - return { - "id": network_id, - "title": network_title, - "comment": network_comment, - "logic": network_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) --- +# --- Función Principal convert_xml_to_json (sin cambios en su flujo general) --- def convert_xml_to_json(xml_filepath, json_filepath): print(f"Iniciando conversión de '{xml_filepath}' a '{json_filepath}'...") - if not os.path.exists(xml_filepath): - print(f"Error Crítico: Archivo XML no encontrado: '{xml_filepath}'") - return + if not os.path.exists(xml_filepath): print(f"Error Crítico: Archivo XML no encontrado: '{xml_filepath}'"); return try: print("Paso 1: Parseando archivo XML...") parser = etree.XMLParser(remove_blank_text=True) tree = etree.parse(xml_filepath, parser) root = tree.getroot() print("Paso 1: Parseo XML completado.") - print("Paso 2: Buscando el bloque SW.Blocks.FC...") - fc_block_list = root.xpath("//*[local-name()='SW.Blocks.FC']") - if not fc_block_list: - print("Error Crítico: No se encontró .") - return - fc_block = fc_block_list[0] - print(f"Paso 2: Bloque SW.Blocks.FC encontrado (ID={fc_block.get('ID')}).") + print("Paso 2: Buscando el bloque SW.Blocks.FC...") # Asume FC primero + block_list = root.xpath("//*[local-name()='SW.Blocks.FC']") + block_type_found = "FC" + if not block_list: + block_list = root.xpath("//*[local-name()='SW.Blocks.FB']") # Busca FB si no hay FC + block_type_found = "FB" + if not block_list: print("Error Crítico: No se encontró ni ."); return + else: print("Advertencia: Se encontró en lugar de .") + the_block = block_list[0] + print(f"Paso 2: Bloque SW.Blocks.{block_type_found} encontrado (ID={the_block.get('ID')}).") print("Paso 3: Extrayendo atributos del bloque...") - attribute_list_node = fc_block.xpath("./*[local-name()='AttributeList']") + attribute_list_node = the_block.xpath("./*[local-name()='AttributeList']") block_name_val, block_number_val, block_lang_val = "Unknown", None, "Unknown" if attribute_list_node: attr_list = attribute_list_node[0] name_node = attr_list.xpath("./*[local-name()='Name']/text()") block_name_val = name_node[0].strip() if name_node else block_name_val num_node = attr_list.xpath("./*[local-name()='Number']/text()") - block_number_val = ( - int(num_node[0]) - if num_node and num_node[0].isdigit() - else block_number_val - ) - lang_node = attr_list.xpath( - "./*[local-name()='ProgrammingLanguage']/text()" - ) + try: block_number_val = int(num_node[0]) if num_node else None + except ValueError: block_number_val = None + lang_node = attr_list.xpath("./*[local-name()='ProgrammingLanguage']/text()") block_lang_val = lang_node[0].strip() if lang_node else block_lang_val - print( - f"Paso 3: Atributos: Nombre='{block_name_val}', Número={block_number_val}, Lenguaje='{block_lang_val}'" - ) - else: - print("Advertencia: No se encontró AttributeList para el bloque FC.") + print(f"Paso 3: Atributos: Nombre='{block_name_val}', Número={block_number_val}, Lenguaje='{block_lang_val}'") + else: print(f"Advertencia: No se encontró AttributeList para el bloque {block_type_found}.") block_comment_val = "" - comment_node_list = fc_block.xpath( - "./*[local-name()='ObjectList']/*[local-name()='MultilingualText'][@CompositionName='Comment']" - ) - if comment_node_list: - block_comment_val = get_multilingual_text(comment_node_list[0]) - print(f"Paso 3b: Comentario bloque: '{block_comment_val[:50]}...'") - result = { - "block_name": block_name_val, - "block_number": block_number_val, - "language": block_lang_val, - "block_comment": block_comment_val, - "interface": {}, - "networks": [], - } + comment_node_list = the_block.xpath("./*[local-name()='ObjectList']/*[local-name()='MultilingualText'][@CompositionName='Comment']") + if comment_node_list: block_comment_val = get_multilingual_text(comment_node_list[0]); print(f"Paso 3b: Comentario bloque: '{block_comment_val[:50]}...'") + result = {"block_name": block_name_val, "block_number": block_number_val, "language": block_lang_val, "block_comment": block_comment_val, "interface": {}, "networks": []} print("Paso 4: Extrayendo la interfaz del bloque...") if attribute_list_node: - interface_node_list = attribute_list_node[0].xpath( - "./*[local-name()='Interface']" - ) + interface_node_list = attribute_list_node[0].xpath(".//*[local-name()='Interface']") if interface_node_list: interface_node = interface_node_list[0] print("Paso 4: Nodo Interface encontrado.") for section in interface_node.xpath(".//iface:Section", namespaces=ns): - section_name = section.get("Name") + section_name = section.get("Name"); + if not section_name: continue members = [] for member in section.xpath("./iface:Member", namespaces=ns): - member_name = member.get("Name") - member_dtype = member.get("Datatype") - if member_name and member_dtype: - members.append( - {"name": member_name, "datatype": member_dtype} - ) - if members: - result["interface"][section_name] = members - 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.") - + member_name = member.get("Name"); member_dtype = member.get("Datatype") + if member_name and member_dtype: members.append({"name": member_name, "datatype": member_dtype}) + if members: result["interface"][section_name] = members + 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 - object_list_node = fc_block.xpath("./*[local-name()='ObjectList']") + 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." - ) + 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 - # print(f"DEBUG: Procesando red #{networks_processed_count} (ID={network_elem.get('ID')})...") - parsed_network = parse_network( - network_elem - ) # Llamada a la función modificada - 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')}" - ) - result["networks"].append(parsed_network) - else: - print( - f"Error: 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.") - + 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.") 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.") - # else: # Chequeo ENO logic - # eno_logic_found = any(instr.get('eno_logic') for net in result.get('networks', []) if net.get('error') is None for instr in net.get('logic', [])) - # if eno_logic_found: print("INFO FINAL: Lógica ENO interesante detectada.") - # else: print("INFO FINAL: No se detectó lógica ENO interesante.") - + if not result["interface"]: print("ADVERTENCIA FINAL: 'interface' está vacía.") + if not result["networks"]: print("ADVERTENCIA FINAL: 'networks' está vacía.") try: - with open(json_filepath, "w", encoding="utf-8") as f: - json.dump(result, f, indent=4, ensure_ascii=False) - print(f"Paso 6: Escritura completada.") - print(f"Conversión finalizada. JSON guardado en: '{json_filepath}'") - except IOError as e: - print( - f"Error Crítico: No se pudo escribir JSON en '{json_filepath}'. Error: {e}" - ) - except TypeError as e: - print(f"Error Crítico: Problema al serializar a JSON. Error: {e}") - - except etree.XMLSyntaxError as e: - print(f"Error Crítico: Sintaxis XML en '{xml_filepath}'. Detalles: {e}") - except Exception as e: - print(f"Error Crítico: Error inesperado: {e}") - print("--- Traceback ---") - traceback.print_exc() - print("--- Fin Traceback ---") - + with open(json_filepath, "w", encoding="utf-8") as f: json.dump(result, f, indent=4, ensure_ascii=False) + print("Paso 6: Escritura completada."); print(f"Conversión finalizada. JSON guardado en: '{json_filepath}'") + except IOError as e: print(f"Error Crítico: No se pudo escribir JSON en '{json_filepath}'. Error: {e}") + except TypeError as e: print(f"Error Crítico: Problema al serializar a JSON. Error: {e}") + except etree.XMLSyntaxError as e: print(f"Error Crítico: Sintaxis XML inválida en '{xml_filepath}'. Detalles: {e}") + except Exception as e: print(f"Error Crítico: Error inesperado durante la conversión: {e}"); print("--- Traceback ---"); traceback.print_exc(); print("--- Fin Traceback ---") # --- Punto de Entrada Principal --- if __name__ == "__main__": - xml_file = "TestLAD.xml" # CAMBIAR AL NUEVO ARCHIVO XML - json_file = xml_file.replace( - ".xml", "_simplified.json" - ) # Nombre de salida dinámico - convert_xml_to_json(xml_file, json_file) + xml_filename_base = "TestLAD" + xml_file = f"{xml_filename_base}.xml" + json_file = f"{xml_filename_base}_simplified.json" + convert_xml_to_json(xml_file, json_file) \ No newline at end of file diff --git a/x2_process.py b/x2_process.py index e8c8f6a..f2512de 100644 --- a/x2_process.py +++ b/x2_process.py @@ -608,223 +608,93 @@ def process_move(instruction, network_id, scl_map, access_map): return True -def process_pbox(instruction, network_id, scl_map, access_map, network_logic_list): +def process_edge_detector(instruction, network_id, scl_map, access_map): + """Genera SCL para PBox (P_TRIG) o NBox (N_TRIG).""" instr_uid = instruction["instruction_uid"] - instr_type = instruction["type"] - if instr_type.endswith(SCL_SUFFIX) or "_error" in instr_type: + instr_type_original = instruction["type"] # PBox o NBox + if instr_type_original.endswith(SCL_SUFFIX) or "_error" in instr_type_original: return False + # Obtener CLK (señal de entrada) y MemBit (bit de memoria) + clk_input = instruction["inputs"].get("in") mem_bit_input = instruction["inputs"].get("bit") - mem_bit_scl = get_scl_representation(mem_bit_input, network_id, scl_map, access_map) - if mem_bit_scl is None: - return False # Dependencia no lista + clk_scl = get_scl_representation(clk_input, network_id, scl_map, access_map) + mem_bit_scl_original = get_scl_representation( + mem_bit_input, network_id, scl_map, access_map + ) - # Validar y formatear el bit de memoria + if clk_scl is None or mem_bit_scl_original is None: + # print(f"DEBUG Edge: Esperando dependencias para {instr_type_original} UID {instr_uid}") + return False # Dependencias no listas + + # Validar que el bit de memoria sea una variable if not (mem_bit_input and mem_bit_input.get("type") == "variable"): - print(f"Error: PBOX {instr_uid} 'bit' no es variable o falta información.") - instruction["scl"] = ( - f"// ERROR: PBox {instr_uid} 'bit' no es variable o falta info" + print( + f"Error: {instr_type_original} {instr_uid} 'bit' no es variable o falta información." ) - instruction["type"] += "_error" + instruction["scl"] = ( + f"// ERROR: {instr_type_original} {instr_uid} 'bit' no es variable." + ) + instruction["type"] = instr_type_original + "_error" return True # Procesado con error - mem_bit_scl_formatted = format_variable_name(mem_bit_scl) + # --- Renombrar bit de memoria para VAR_STAT --- + # Quitar comillas existentes, añadir prefijo "stat_" y volver a añadir comillas + mem_bit_name_clean = mem_bit_scl_original.strip('"') + stat_mem_bit_scl = ( + f'"stat_{mem_bit_name_clean}"' # Nombre SCL para la variable estática + ) - # --- Lógica para inferir CLK (similar a la versión anterior) --- - # Determinar si es P_TRIG (conectado a una bobina) - is_likely_p_trig = False - consuming_coil_uid = None - for potential_consumer in network_logic_list: - coil_input_signal = potential_consumer.get("inputs", {}).get("in") - if ( - isinstance(coil_input_signal, dict) - and coil_input_signal.get("type") == "connection" - and coil_input_signal.get("source_instruction_uid") == instr_uid - and coil_input_signal.get("source_pin") - == "out" # PBox output alimenta la bobina - ): - consumer_type_original = ( - potential_consumer.get("type", "") - .replace("_scl", "") - .replace("_error", "") - ) - if consumer_type_original == "Coil": - is_likely_p_trig = True - consuming_coil_uid = potential_consumer.get("instruction_uid") - break # Encontrado consumidor de bobina + # Asegurar paréntesis alrededor de CLK si es complejo + # Formatear CLK + clk_scl_formatted = clk_scl + # Añadir paréntesis si es necesario (expresión compleja o asignación previa) + # No añadir paréntesis a TRUE/FALSE literales + if ( + clk_scl not in ["TRUE", "FALSE"] + and (" " in clk_scl or "AND" in clk_scl or "OR" in clk_scl or ":=" in clk_scl) + and not (clk_scl.startswith("(") and clk_scl.endswith(")")) + ): + clk_scl_formatted = f"({clk_scl})" - rlo_scl = None # Este será el CLK inferido - if is_likely_p_trig: - # Buscar hacia atrás la fuente del RLO que alimenta este PBox - clk_source_found = False - current_instr_index = -1 - for i, instr in enumerate(network_logic_list): - if instr["instruction_uid"] == instr_uid: - current_instr_index = i - break + # --- Generar Lógica SCL --- + result_scl = "FALSE" # SCL para la salida del flanco (pin 'out') + scl_comment = "" # Comentario informativo - if current_instr_index != -1: - # Buscar la entrada 'in' del PBox si existe explícitamente - pbox_in_signal = instruction.get("inputs", {}).get("in") - if pbox_in_signal: - rlo_scl = get_scl_representation( - pbox_in_signal, network_id, scl_map, access_map - ) - if rlo_scl is not None: - clk_source_found = True - # print(f"DEBUG: PBox {instr_uid} CLK encontrado por pin 'in': {rlo_scl}") - - # Si no hay pin 'in' explícito, buscar hacia atrás (lógica LAD clásica) - if not clk_source_found: - # print(f"DEBUG: PBox {instr_uid} buscando CLK hacia atrás...") - for i in range(current_instr_index - 1, -1, -1): - prev_instr = network_logic_list[i] - prev_instr_uid = prev_instr["instruction_uid"] - prev_instr_type_original = ( - prev_instr.get("type", "") - .replace(SCL_SUFFIX, "") - .replace("_error", "") - ) - - # ¿Es una instrucción que genera RLO booleano? - if prev_instr_type_original in [ - "Contact", - "Eq", - "O", - "PBox", - "And", - "Xor", - "Ne", - "Gt", - "Lt", - "Ge", - "Le", - ]: - map_key_prev_out = (network_id, prev_instr_uid, "out") - potential_clk_scl = scl_map.get(map_key_prev_out) - if potential_clk_scl is not None: - rlo_scl = potential_clk_scl - clk_source_found = True - # print(f"DEBUG: PBox {instr_uid} CLK encontrado de {prev_instr_type_original} {prev_instr_uid} (out): {rlo_scl}") - break - # ¿Es un bloque funcional cuya salida ENO podría ser el RLO? - elif prev_instr_type_original in [ - "Move", - "Add", - "Convert", - "Mod", - "Call", - ]: # Añadir otros bloques funcionales - map_key_prev_eno = (network_id, prev_instr_uid, "eno") - potential_clk_scl = scl_map.get(map_key_prev_eno) - if potential_clk_scl is not None: - rlo_scl = potential_clk_scl - clk_source_found = True - # print(f"DEBUG: PBox {instr_uid} CLK encontrado de {prev_instr_type_original} {prev_instr_uid} (eno): {rlo_scl}") - break - # Si encontramos una bobina, el RLO se detiene ahí - elif prev_instr_type_original == "Coil": - # print(f"DEBUG: PBox {instr_uid} búsqueda CLK detenida por Coil {prev_instr_uid}") - break - - if not clk_source_found: - print(f"Error: No se pudo inferir CLK para P_TRIG PBOX {instr_uid}") - instruction["scl"] = f"// ERROR: PBox {instr_uid} (P_TRIG) sin CLK inferido" - instruction["type"] += "_error" - return True # Procesado con error - - if rlo_scl is None: - # print(f"DEBUG: PBox {instr_uid} CLK encontrado pero valor es None, esperando...") - return False # Dependencia (CLK) no resuelta aún - - # --- Generar SCL --- - scl_comment = "" - result_scl = "" # El valor que PBox pone en scl_map['out'] - - if is_likely_p_trig: - # Formatear CLK si es variable (poco probable, suele ser resultado lógico) - # clk_signal_formatted = format_variable_name(rlo_scl) if ... else rlo_scl - clk_signal_formatted = ( - rlo_scl # Asumir que ya está bien formateado o es una expresión + if instr_type_original == "PBox": # Flanco Positivo (P_TRIG) + result_scl = f"{clk_scl_formatted} AND NOT {stat_mem_bit_scl}" + scl_comment = f"// P_TRIG: {result_scl}" + elif instr_type_original == "NBox": # Flanco Negativo (N_TRIG) + result_scl = f"NOT {clk_scl_formatted} AND {stat_mem_bit_scl}" + scl_comment = f"// N_TRIG: {result_scl}" + else: + # No debería ocurrir si el mapeo de procesadores es correcto + print( + f"Error interno: process_edge_detector llamado para tipo inesperado {instr_type_original}" ) - - # Añadir paréntesis si CLK es complejo - if ( - " " in clk_signal_formatted - or "AND" in clk_signal_formatted - or "OR" in clk_signal_formatted - ) and not ( - clk_signal_formatted.startswith("(") and clk_signal_formatted.endswith(")") - ): - clk_signal_formatted = f"({clk_signal_formatted})" - - # Generar llamada a función de flanco (asumimos P_TRIG) - # Necesitamos un nombre para la instancia del flanco, usualmente una variable STAT - # Podríamos generarla automáticamente o requerirla en el XML. - # Generación automática: - stat_var_name = f"stat_{network_id}_{instr_uid}_ptrig" - stat_var_name_scl = format_variable_name(f'"{stat_var_name}"') # Poner comillas - - # La generación SCL real depende de si usamos una función o lógica explícita. - # Usando función estándar (requiere declarar la instancia 'stat_var_name_scl' como P_TRIG en VAR_STAT): - # result_scl = f"{stat_var_name_scl}(CLK := {clk_signal_formatted})" # La función devuelve Q - # scl_comment = f"// P_TRIG {instr_uid}: {result_scl}" - # instruction["scl"] = f"{stat_var_name_scl}(CLK := {clk_signal_formatted}); // Generates edge pulse" # La llamada en sí - # result_scl = f"{stat_var_name_scl}.Q" # La salida es el pin Q de la instancia - - # Usando lógica explícita (más portable si no se declaran instancias): - result_scl = f"{clk_signal_formatted} AND NOT {mem_bit_scl_formatted}" - scl_comment = f"// P_TRIG Logic {instr_uid}: {result_scl}" - # La actualización del bit de memoria se hace aparte instruction["scl"] = ( - f"{mem_bit_scl_formatted} := {clk_signal_formatted}; // Update edge memory bit" + f"// ERROR: Tipo de flanco inesperado {instr_type_original}" ) + instruction["type"] = instr_type_original + "_error" + return True - else: # Si no es P_TRIG (ej. N_TRIG o simplemente pasando el bit) - # Aquí asumimos que es N_TRIG si tiene TemplateValue "Negated" o similar - is_negated_pbox = ( - instruction.get("template_values", {}).get("Negated") == "true" - ) - if is_negated_pbox: - # Lógica N_TRIG explícita - clk_signal_formatted = rlo_scl # Asumimos que CLK se infiere igual - if clk_signal_formatted is None: - return False # Esperar CLK + # La actualización del bit de memoria es igual para P_TRIG y N_TRIG estándar + scl_mem_update = f"{stat_mem_bit_scl} := {clk_scl_formatted};" - if ( - " " in clk_signal_formatted - or "AND" in clk_signal_formatted - or "OR" in clk_signal_formatted - ) and not ( - clk_signal_formatted.startswith("(") - and clk_signal_formatted.endswith(")") - ): - clk_signal_formatted = f"({clk_signal_formatted})" - - result_scl = f"NOT {clk_signal_formatted} AND {mem_bit_scl_formatted}" - scl_comment = f"// N_TRIG Logic {instr_uid}: {result_scl}" - instruction["scl"] = ( - f"{mem_bit_scl_formatted} := {clk_signal_formatted}; // Update edge memory bit" - ) - else: - # Comportamiento por defecto: pasar el bit de memoria (raro para PBox) - print( - f"Advertencia: PBox {instr_uid} no parece ser P_TRIG ni N_TRIG. Pasando bit de memoria." - ) - result_scl = mem_bit_scl_formatted - scl_comment = f"// PBox {instr_uid} - Passing memory bit: {result_scl}" - instruction["scl"] = f"// {scl_comment}" # Solo comentario - - # Actualizar el mapa SCL con el resultado booleano del flanco/paso + # --- Almacenar Resultados --- + # El pulso resultante va al mapa SCL para que lo usen las instrucciones siguientes map_key_out = (network_id, instr_uid, "out") scl_map[map_key_out] = result_scl - # ENO sigue al CLK (si existe) o es TRUE por defecto? Asumimos que sigue al CLK si es P/N_TRIG - map_key_eno = (network_id, instr_uid, "eno") - scl_map[map_key_eno] = rlo_scl if rlo_scl is not None else "TRUE" + # La actualización de memoria es la acción principal de esta instrucción en SCL + instruction["scl"] = f"{scl_mem_update} {scl_comment}" + instruction["type"] = instr_type_original + SCL_SUFFIX + + # El pin ENO normalmente sigue al CLK en los bloques de flanco estándar + map_key_eno = (network_id, instr_uid, "eno") + scl_map[map_key_eno] = clk_scl # Usar clk_scl original sin formateo extra - instruction["type"] = instr_type + SCL_SUFFIX return True @@ -1238,25 +1108,26 @@ def process_json_to_scl(json_filepath): process_eq, process_contact, process_o, - process_pbox, + process_edge_detector, # Usar la nueva función unificada process_add, process_move, process_call, process_coil, - # Añadir aquí nuevos procesadores base para otros tipos de instrucciones + # ... otros procesadores base ... ] # Crear mapa por nombre de tipo original (en minúsculas) processor_map = {} for func in base_processors: - # Extraer tipo del nombre de la función (p.ej., 'process_contact' -> 'contact') match = re.match(r"process_(\w+)", func.__name__) if match: type_name = match.group(1).lower() - # Manejar casos especiales como 'call' que puede ser FC o FB if type_name == "call": processor_map["call_fc"] = func processor_map["call_fb"] = func - processor_map["call"] = func # Genérico por si acaso + processor_map["call"] = func + elif type_name == "edge_detector": # Mapear PBox y NBox a la nueva función + processor_map["pbox"] = func + processor_map["nbox"] = func else: processor_map[type_name] = func @@ -1308,20 +1179,10 @@ def process_json_to_scl(json_filepath): if func_to_call: try: - changed = False # Pasar la lista de lógica completa solo si es necesario (PBox) - if func_to_call == process_pbox: - changed = func_to_call( - instruction, - network_id, - scl_map, - access_map, - network_logic, - ) - else: - changed = func_to_call( - instruction, network_id, scl_map, access_map - ) + changed = func_to_call( + instruction, network_id, scl_map, access_map + ) if changed: made_change_in_base_pass = True diff --git a/xcopy.py b/xcopy.py new file mode 100644 index 0000000..72e8a25 --- /dev/null +++ b/xcopy.py @@ -0,0 +1,508 @@ +# -*- coding: utf-8 -*- +import json +import os +import copy +import traceback +import re + +# --- Constantes y Configuración --- +SCL_SUFFIX = "_scl" +GROUPED_COMMENT = "// Logic included in grouped IF" + +# Global data variable +data = {} + + +# --- Helper Functions --- +# (get_scl_representation, format_variable_name, generate_temp_var_name, get_target_scl_name - sin cambios) +def get_scl_representation(source_info, network_id, scl_map, access_map): + # ... (código sin cambios) + if not source_info: + return None + if isinstance(source_info, list): + scl_parts = [] + all_resolved = True + for sub_source in source_info: + sub_scl = get_scl_representation( + sub_source, network_id, scl_map, access_map + ) + if sub_scl is None: + all_resolved = False + break + if ( + sub_scl in ["TRUE", "FALSE"] + or (sub_scl.startswith('"') and sub_scl.endswith('"')) + or sub_scl.isdigit() + or (sub_scl.startswith("(") and sub_scl.endswith(")")) + ): + scl_parts.append(sub_scl) + else: + scl_parts.append(f"({sub_scl})") + return ( + " OR ".join(scl_parts) + if len(scl_parts) > 1 + else (scl_parts[0] if scl_parts else "FALSE") if all_resolved else None + ) + source_type = source_info.get("type") + if source_type == "powerrail": + return "TRUE" + elif source_type == "variable": + name = source_info.get("name") + return ( + format_variable_name(name) # Asegura formato correcto aquí también + if name + else f"_ERR_VAR_NO_NAME_{source_info.get('uid')}_" + ) + elif source_type == "constant": + dtype = str(source_info.get("datatype", "")).upper() + value = source_info.get("value") + try: + if dtype == "BOOL": return str(value).upper() + elif dtype in ["INT", "DINT", "SINT", "USINT", "UINT", "UDINT", "LINT", "ULINT", "WORD", "DWORD", "LWORD", "BYTE"]: return str(value) + elif dtype in ["REAL", "LREAL"]: s_val = str(value); return s_val if "." in s_val or "e" in s_val.lower() else s_val + ".0" + elif dtype == "STRING": str_val = str(value).replace("'", "''"); return f"'{str_val}'" + elif dtype == "TYPEDCONSTANT": return str(value) # Ej: T#5s + else: str_val = str(value).replace("'", "''"); return f"'{str_val}'" + except Exception as e: print(f"Advertencia: Error formateando constante {source_info}: {e}"); return f"_ERR_CONST_FORMAT_{source_info.get('uid')}_" + elif source_type == "connection": + map_key = (network_id, source_info.get("source_instruction_uid"), source_info.get("source_pin")) + return scl_map.get(map_key) + elif source_type == "unknown_source": print(f"Advertencia: Refiriendo a fuente desconocida UID: {source_info.get('uid')}"); return f"_ERR_UNKNOWN_SRC_{source_info.get('uid')}_" + else: print(f"Advertencia: Tipo de fuente desconocido: {source_info}"); return f"_ERR_INVALID_SRC_TYPE_" + +def format_variable_name(name): + # ... (código sin cambios) + if not name: return "_INVALID_NAME_" + if name.startswith('"') and name.endswith('"'): return name + prefix = ""; + if name.startswith("#"): prefix = "#"; name = name[1:] + if name and name[0].isdigit(): name = "_" + name + name = re.sub(r"[^a-zA-Z0-9_]", "_", name) + return prefix + name + +def generate_temp_var_name(network_id, instr_uid, pin_name): + # ... (código sin cambios) + net_id_clean = str(network_id).replace("-", "_") + instr_uid_clean = str(instr_uid).replace("-", "_") + pin_name_clean = str(pin_name).replace("-", "_").lower() + return f"#_temp_{net_id_clean}_{instr_uid_clean}_{pin_name_clean}" + +def get_target_scl_name(instruction, output_pin_name, network_id, default_to_temp=True): + # ... (código sin cambios) + instr_uid = instruction["instruction_uid"] + output_pin_data = instruction["outputs"].get(output_pin_name) + target_scl = None + if output_pin_data and isinstance(output_pin_data, list) and len(output_pin_data) == 1: + dest_access = output_pin_data[0] + if dest_access.get("type") == "variable": + target_scl = dest_access.get("name") + if target_scl: target_scl = format_variable_name(target_scl) + else: print(f"Error: Var destino {instr_uid}.{output_pin_name} sin nombre (UID: {dest_access.get('uid')}). {'Usando temp.' if default_to_temp else 'Ignorando.'}"); target_scl = generate_temp_var_name(network_id, instr_uid, output_pin_name) if default_to_temp else None + elif dest_access.get("type") == "constant": print(f"Advertencia: Instr {instr_uid} escribe en const UID {dest_access.get('uid')}. {'Usando temp.' if default_to_temp else 'Ignorando.'}"); target_scl = generate_temp_var_name(network_id, instr_uid, output_pin_name) if default_to_temp else None + else: print(f"Advertencia: Destino {instr_uid}.{output_pin_name} no es var/const: {dest_access.get('type')}. {'Usando temp.' if default_to_temp else 'Ignorando.'}"); target_scl = generate_temp_var_name(network_id, instr_uid, output_pin_name) if default_to_temp else None + elif default_to_temp: target_scl = generate_temp_var_name(network_id, instr_uid, output_pin_name) + if target_scl is None and not default_to_temp: return None + if target_scl is None and default_to_temp: target_scl = generate_temp_var_name(network_id, instr_uid, output_pin_name) + return target_scl + + +# --- Procesadores de Instrucciones --- +# (process_contact, process_eq, process_coil, process_convert, process_mod, +# process_add, process_move, process_o, process_call - sin cambios significativos) +# ... (resto de procesadores base aquí) ... +def process_contact(instruction, network_id, scl_map, access_map): + # ... (código sin cambios) ... + instr_uid = instruction["instruction_uid"]; instr_type = instruction["type"] + if instr_type.endswith(SCL_SUFFIX) or "_error" in instr_type: return False + is_negated = instruction.get("negated_pins", {}).get("operand", False) + in_input = instruction["inputs"].get("in") + in_rlo_scl = "TRUE" if in_input is None else get_scl_representation(in_input, network_id, scl_map, access_map) + operand_scl = get_scl_representation(instruction["inputs"].get("operand"), network_id, scl_map, access_map) + if in_rlo_scl is None or operand_scl is None: return False + term = f"NOT {operand_scl}" if is_negated else operand_scl + if not (term.startswith('"') and term.endswith('"')): + if is_negated or (" " in term and not (term.startswith("(") and term.endswith(")"))): term = f"({term})" + new_rlo_scl = term if in_rlo_scl == "TRUE" else (f"({in_rlo_scl}) AND {term}" if ("AND" in in_rlo_scl or "OR" in in_rlo_scl) and not (in_rlo_scl.startswith("(") and in_rlo_scl.endswith(")")) else f"{in_rlo_scl} AND {term}") + map_key = (network_id, instr_uid, "out"); scl_map[map_key] = new_rlo_scl + instruction["scl"] = f"// RLO: {new_rlo_scl}"; instruction["type"] = instr_type + SCL_SUFFIX + return True + +def process_eq(instruction, network_id, scl_map, access_map): + # ... (código sin cambios) ... + instr_uid = instruction["instruction_uid"]; instr_type = instruction["type"] + if instr_type.endswith(SCL_SUFFIX) or "_error" in instr_type: return False + in1_info = instruction["inputs"].get("in1"); in2_info = instruction["inputs"].get("in2") + in1_scl = get_scl_representation(in1_info, network_id, scl_map, access_map); in2_scl = get_scl_representation(in2_info, network_id, scl_map, access_map) + if in1_scl is None or in2_scl is None: return False + op1 = format_variable_name(in1_scl) if in1_info and in1_info.get("type") == "variable" else in1_scl + op2 = format_variable_name(in2_scl) if in2_info and in2_info.get("type") == "variable" else in2_scl + op1 = f"({op1})" if " " in op1 and not op1.startswith("(") else op1; op2 = f"({op2})" if " " in op2 and not op2.startswith("(") else op2 + comparison_scl = f"{op1} = {op2}"; map_key_out = (network_id, instr_uid, "out"); scl_map[map_key_out] = comparison_scl + pre_input = instruction["inputs"].get("pre"); pre_scl = "TRUE" if pre_input is None else get_scl_representation(pre_input, network_id, scl_map, access_map) + if pre_scl is None: return False + map_key_eno = (network_id, instr_uid, "eno"); scl_map[map_key_eno] = pre_scl + instruction["scl"] = f"// Comparison Eq {instr_uid}: {comparison_scl}"; instruction["type"] = instr_type + SCL_SUFFIX + return True + +def process_coil(instruction, network_id, scl_map, access_map): + # ... (código sin cambios) ... + instr_uid = instruction["instruction_uid"]; instr_type = instruction["type"] + if instr_type.endswith(SCL_SUFFIX) or "_error" in instr_type: return False + in_rlo_scl = get_scl_representation(instruction["inputs"].get("in"), network_id, scl_map, access_map) + operand_info = instruction["inputs"].get("operand"); operand_scl = get_scl_representation(operand_info, network_id, scl_map, access_map) + if in_rlo_scl is None or operand_scl is None: return False + if not (operand_info and operand_info.get("type") == "variable"): print(f"Error: Operando COIL {instr_uid} no es variable o falta información."); instruction["scl"] = f"// ERROR: Coil {instr_uid} operando no es variable o falta info"; instruction["type"] = instr_type + "_error"; return True + operand_scl_formatted = format_variable_name(operand_scl) + if in_rlo_scl == "(TRUE)": in_rlo_scl = "TRUE"; + elif in_rlo_scl == "(FALSE)": in_rlo_scl = "FALSE" + scl_final = f"{operand_scl_formatted} := {in_rlo_scl};"; instruction["scl"] = scl_final; instruction["type"] = instr_type + SCL_SUFFIX + return True + +def process_convert(instruction, network_id, scl_map, access_map): + # ... (código sin cambios) ... + instr_uid = instruction["instruction_uid"]; instr_type = instruction["type"]; + if instr_type.endswith(SCL_SUFFIX) or "_error" in instr_type: return False + en_input = instruction["inputs"].get("en"); en_scl = get_scl_representation(en_input, network_id, scl_map, access_map) if en_input else "TRUE" + in_info = instruction["inputs"].get("in"); in_scl = get_scl_representation(in_info, network_id, scl_map, access_map) + if en_scl is None or in_scl is None: return False + target_scl = get_target_scl_name(instruction, "out", network_id, default_to_temp=True) + if target_scl is None: print(f"Error: Sin destino claro para CONVERT {instr_uid}"); instruction["scl"] = f"// ERROR: Convert {instr_uid} sin destino"; instruction["type"] += "_error"; return True + in_scl_formatted = format_variable_name(in_scl) if in_info and in_info.get("type") == "variable" else in_scl + conversion_expr = in_scl_formatted # Simplificación, asume asignación directa + scl_core = f"{target_scl} := {conversion_expr};" + scl_final = f"IF {en_scl} THEN\n {scl_core}\nEND_IF;" if en_scl != "TRUE" else scl_core + instruction["scl"] = scl_final; instruction["type"] = instr_type + SCL_SUFFIX + map_key_out = (network_id, instr_uid, "out"); scl_map[map_key_out] = target_scl + map_key_eno = (network_id, instr_uid, "eno"); scl_map[map_key_eno] = en_scl + return True + +def process_mod(instruction, network_id, scl_map, access_map): + # ... (código sin cambios) ... + instr_uid = instruction["instruction_uid"]; instr_type = instruction["type"]; + if instr_type.endswith(SCL_SUFFIX) or "_error" in instr_type: return False + en_input = instruction["inputs"].get("en"); en_scl = get_scl_representation(en_input, network_id, scl_map, access_map) if en_input else "TRUE" + in1_info = instruction["inputs"].get("in1"); in2_info = instruction["inputs"].get("in2") + in1_scl = get_scl_representation(in1_info, network_id, scl_map, access_map); in2_scl = get_scl_representation(in2_info, network_id, scl_map, access_map) + if en_scl is None or in1_scl is None or in2_scl is None: return False + target_scl = get_target_scl_name(instruction, "out", network_id, default_to_temp=True) + if target_scl is None: print(f"Error: Sin destino MOD {instr_uid}"); instruction["scl"] = f"// ERROR: Mod {instr_uid} sin destino"; instruction["type"] += "_error"; return True + op1 = format_variable_name(in1_scl) if in1_info and in1_info.get("type") == "variable" else in1_scl + op2 = format_variable_name(in2_scl) if in2_info and in2_info.get("type") == "variable" else in2_scl + op1 = f"({op1})" if " " in op1 and not op1.startswith("(") else op1; op2 = f"({op2})" if " " in op2 and not op2.startswith("(") else op2 + scl_core = f"{target_scl} := {op1} MOD {op2};"; scl_final = f"IF {en_scl} THEN\n {scl_core}\nEND_IF;" if en_scl != "TRUE" else scl_core + instruction["scl"] = scl_final; instruction["type"] = instr_type + SCL_SUFFIX + map_key_out = (network_id, instr_uid, "out"); scl_map[map_key_out] = target_scl + map_key_eno = (network_id, instr_uid, "eno"); scl_map[map_key_eno] = en_scl + return True + +def process_add(instruction, network_id, scl_map, access_map): + # ... (código sin cambios) ... + instr_uid = instruction["instruction_uid"]; instr_type = instruction["type"] + if instr_type.endswith(SCL_SUFFIX) or "_error" in instr_type: return False + en_input = instruction["inputs"].get("en"); en_scl = get_scl_representation(en_input, network_id, scl_map, access_map) if en_input else "TRUE" + in1_info = instruction["inputs"].get("in1"); in2_info = instruction["inputs"].get("in2") + in1_scl = get_scl_representation(in1_info, network_id, scl_map, access_map); in2_scl = get_scl_representation(in2_info, network_id, scl_map, access_map) + if en_scl is None or in1_scl is None or in2_scl is None: return False + target_scl = get_target_scl_name(instruction, "out", network_id, default_to_temp=True) + if target_scl is None: print(f"Error: Sin destino ADD {instr_uid}"); instruction["scl"] = f"// ERROR: Add {instr_uid} sin destino"; instruction["type"] += "_error"; return True + op1 = format_variable_name(in1_scl) if in1_info and in1_info.get("type") == "variable" else in1_scl + op2 = format_variable_name(in2_scl) if in2_info and in2_info.get("type") == "variable" else in2_scl + op1 = f"({op1})" if " " in op1 and not op1.startswith("(") else op1; op2 = f"({op2})" if " " in op2 and not op2.startswith("(") else op2 + scl_core = f"{target_scl} := {op1} + {op2};"; scl_final = f"IF {en_scl} THEN\n {scl_core}\nEND_IF;" if en_scl != "TRUE" else scl_core + instruction["scl"] = scl_final; instruction["type"] = instr_type + SCL_SUFFIX + map_key_out = (network_id, instr_uid, "out"); scl_map[map_key_out] = target_scl + map_key_eno = (network_id, instr_uid, "eno"); scl_map[map_key_eno] = en_scl + return True + +def process_move(instruction, network_id, scl_map, access_map): + # ... (código sin cambios) ... + instr_uid = instruction["instruction_uid"]; instr_type = instruction["type"] + if instr_type.endswith(SCL_SUFFIX) or "_error" in instr_type: return False + en_input = instruction["inputs"].get("en"); en_scl = get_scl_representation(en_input, network_id, scl_map, access_map) if en_input else "TRUE" + in_info = instruction["inputs"].get("in"); in_scl = get_scl_representation(in_info, network_id, scl_map, access_map) + if en_scl is None or in_scl is None: return False + target_scl = get_target_scl_name(instruction, "out1", network_id, default_to_temp=False) + if target_scl is None: target_scl = get_target_scl_name(instruction, "out", network_id, default_to_temp=False) + if target_scl is None: print(f"Advertencia/Error: MOVE {instr_uid} sin destino claro en 'out' o 'out1'."); return False + in_scl_formatted = format_variable_name(in_scl) if in_info and in_info.get("type") == "variable" else in_scl + scl_core = f"{target_scl} := {in_scl_formatted};"; scl_final = f"IF {en_scl} THEN\n {scl_core}\nEND_IF;" if en_scl != "TRUE" else scl_core + instruction["scl"] = scl_final; instruction["type"] = instr_type + SCL_SUFFIX + map_key_out = (network_id, instr_uid, "out"); scl_map[map_key_out] = target_scl + map_key_out1 = (network_id, instr_uid, "out1"); scl_map[map_key_out1] = target_scl + map_key_eno = (network_id, instr_uid, "eno"); scl_map[map_key_eno] = en_scl + return True + +# --- NUEVA FUNCIÓN UNIFICADA para PBox y NBox --- +def process_edge_detector(instruction, network_id, scl_map, access_map): + """Genera SCL para PBox (P_TRIG) o NBox (N_TRIG).""" + instr_uid = instruction["instruction_uid"] + instr_type_original = instruction["type"] # PBox o NBox + if instr_type_original.endswith(SCL_SUFFIX) or "_error" in instr_type_original: + return False + + # Obtener CLK (señal de entrada) y MemBit (bit de memoria) + clk_input = instruction["inputs"].get("in") + mem_bit_input = instruction["inputs"].get("bit") + + clk_scl = get_scl_representation(clk_input, network_id, scl_map, access_map) + mem_bit_scl_original = get_scl_representation(mem_bit_input, network_id, scl_map, access_map) + + if clk_scl is None or mem_bit_scl_original is None: + # print(f"DEBUG Edge: Esperando dependencias para {instr_type_original} UID {instr_uid}") + return False # Dependencias no listas + + # Validar que el bit de memoria sea una variable + if not (mem_bit_input and mem_bit_input.get("type") == "variable"): + print(f"Error: {instr_type_original} {instr_uid} 'bit' no es variable o falta información.") + instruction["scl"] = f"// ERROR: {instr_type_original} {instr_uid} 'bit' no es variable." + instruction["type"] = instr_type_original + "_error" + return True # Procesado con error + + # --- Renombrar bit de memoria para VAR_STAT --- + # Quitar comillas existentes, añadir prefijo "stat_" y volver a añadir comillas + mem_bit_name_clean = mem_bit_scl_original.strip('"') + stat_mem_bit_scl = f'"stat_{mem_bit_name_clean}"' # Nombre SCL para la variable estática + + # Asegurar paréntesis alrededor de CLK si es complejo + clk_scl_formatted = clk_scl + if (' ' in clk_scl or 'AND' in clk_scl or 'OR' in clk_scl) and not (clk_scl.startswith('(') and clk_scl.endswith(')')): + clk_scl_formatted = f"({clk_scl})" + + # --- Generar Lógica SCL --- + result_scl = "FALSE" # SCL para la salida del flanco (pin 'out') + scl_comment = "" # Comentario informativo + + if instr_type_original == "PBox": # Flanco Positivo (P_TRIG) + result_scl = f"{clk_scl_formatted} AND NOT {stat_mem_bit_scl}" + scl_comment = f"// P_TRIG: {result_scl}" + elif instr_type_original == "NBox": # Flanco Negativo (N_TRIG) + result_scl = f"NOT {clk_scl_formatted} AND {stat_mem_bit_scl}" + scl_comment = f"// N_TRIG: {result_scl}" + else: + # No debería ocurrir si el mapeo de procesadores es correcto + print(f"Error interno: process_edge_detector llamado para tipo inesperado {instr_type_original}") + instruction["scl"] = f"// ERROR: Tipo de flanco inesperado {instr_type_original}" + instruction["type"] = instr_type_original + "_error" + return True + + # La actualización del bit de memoria es igual para P_TRIG y N_TRIG estándar + scl_mem_update = f"{stat_mem_bit_scl} := {clk_scl_formatted};" + + # --- Almacenar Resultados --- + # El pulso resultante va al mapa SCL para que lo usen las instrucciones siguientes + map_key_out = (network_id, instr_uid, "out") + scl_map[map_key_out] = result_scl + + # La actualización de memoria es la acción principal de esta instrucción en SCL + instruction["scl"] = f"{scl_mem_update} {scl_comment}" + instruction["type"] = instr_type_original + SCL_SUFFIX + + # El pin ENO normalmente sigue al CLK en los bloques de flanco estándar + map_key_eno = (network_id, instr_uid, "eno") + scl_map[map_key_eno] = clk_scl # Usar clk_scl original sin formateo extra + + return True +# --- FIN NUEVA FUNCIÓN UNIFICADA --- + + +def process_o(instruction, network_id, scl_map, access_map): + # ... (código sin cambios) ... + instr_uid = instruction["instruction_uid"]; instr_type = instruction["type"] + if instr_type.endswith(SCL_SUFFIX) or "_error" in instr_type: return False + input_pins = sorted([pin for pin in instruction["inputs"] if pin.startswith("in")]) + if not input_pins: print(f"Error: O {instr_uid} sin pines de entrada (inX)."); instruction["scl"] = f"// ERROR: O {instr_uid} sin pines inX"; instruction["type"] += "_error"; return True + scl_parts = []; all_resolved = True + for pin in input_pins: + in_scl = get_scl_representation(instruction["inputs"][pin], network_id, scl_map, access_map) + if in_scl is None: all_resolved = False; break + term = in_scl; + if (" " in term or "AND" in term) and not (term.startswith("(") and term.endswith(")")): term = f"({term})" + scl_parts.append(term) + if not all_resolved: return False + result_scl = "FALSE"; + if scl_parts: + result_scl = " OR ".join(scl_parts) + if len(scl_parts) == 1: result_scl = scl_parts[0] + map_key_out = (network_id, instr_uid, "out"); scl_map[map_key_out] = result_scl + instruction["scl"] = f"// Logic O {instr_uid}: {result_scl}"; instruction["type"] = instr_type + SCL_SUFFIX + return True + +def process_call(instruction, network_id, scl_map, access_map): + # ... (código sin cambios) ... + instr_uid = instruction["instruction_uid"]; instr_type = instruction.get("type", "") + if instr_type.endswith(SCL_SUFFIX) or "_error" in instr_type: return False + block_name = instruction.get("block_name", f"UnknownCall_{instr_uid}"); block_type = instruction.get("block_type") + instance_db = instruction.get("instance_db"); instance_db_scl = format_variable_name(instance_db) if instance_db else None + block_name_scl = format_variable_name(block_name) + en_input = instruction["inputs"].get("en"); en_scl = get_scl_representation(en_input, network_id, scl_map, access_map) if en_input else "TRUE" + if en_scl is None: return False + scl_call_params = []; processed_inputs = {"en"} + for pin_name, source_info in instruction.get("inputs", {}).items(): + if pin_name not in processed_inputs: + param_scl = get_scl_representation(source_info, network_id, scl_map, access_map) + if param_scl is None: return False + param_scl_formatted = format_variable_name(param_scl) if source_info.get("type") == "variable" else param_scl + scl_call_params.append(f"{format_variable_name(pin_name)} := {param_scl_formatted}") + processed_inputs.add(pin_name) + scl_call_body = ""; param_string = ", ".join(scl_call_params) + if block_type == "FB": + if not instance_db_scl: print(f"Error: Llamada a FB '{block_name_scl}' (UID {instr_uid}) sin DB de instancia especificado."); instruction["scl"] = f"// ERROR: FB Call {block_name_scl} sin instancia"; instruction["type"] = "Call_FB_error"; return True + scl_call_body = f"{instance_db_scl}({param_string});" + elif block_type == "FC": scl_call_body = f"{block_name_scl}({param_string});" + else: print(f"Advertencia: Tipo de bloque no soportado para Call UID {instr_uid}: {block_type}"); scl_call_body = f"// ERROR: Call a bloque tipo '{block_type}' no soportado: {block_name_scl}"; instruction["type"] = f"Call_{block_type}_error" + scl_final = ""; + if en_scl != "TRUE": indented_call = "\\n".join([f" {line}" for line in scl_call_body.splitlines()]); scl_final = f"IF {en_scl} THEN\\n{indented_call}\\nEND_IF;" + else: scl_final = scl_call_body + instruction["scl"] = scl_final; instruction["type"] = f"Call_{block_type}_scl" if "_error" not in instruction["type"] else instruction["type"] + map_key_eno = (network_id, instr_uid, "eno"); scl_map[map_key_eno] = en_scl + return True + + +# --- Procesador de Agrupación (Sin cambios) --- +def process_group_ifs(instruction, network_id, scl_map, access_map): + # ... (código sin cambios) ... + instr_uid = instruction["instruction_uid"]; instr_type = instruction["type"]; instr_type_original = instr_type.replace("_scl", "").replace("_error", "") + made_change = False + if (not instr_type.endswith("_scl") or "_error" in instr_type or instruction.get("grouped", False) or instr_type_original not in ["Contact", "O", "Eq", "Ne", "Gt", "Lt", "Ge", "Le", "PBox", "NBox", "And", "Xor"]): return False # Añadido NBox aquí + current_scl = instruction.get("scl", "") + if (current_scl.strip().startswith("IF") and "END_IF;" in current_scl) or (current_scl.strip().startswith("//") and "IF" in current_scl): return False + map_key_out = (network_id, instr_uid, "out"); condition_scl = scl_map.get(map_key_out) + if condition_scl is None or condition_scl in ["TRUE", "FALSE"]: return False + grouped_instructions_cores = []; consumer_instr_list = [] + network_logic = next((net["logic"] for net in data["networks"] if net["id"] == network_id), []); + if not network_logic: return False + groupable_types = ["Move", "Add", "Sub", "Mul", "Div", "Mod", "Convert", "Call_FC", "Call_FB"] + for consumer_instr in network_logic: + consumer_uid = consumer_instr["instruction_uid"] + if consumer_instr.get("grouped", False) or consumer_uid == instr_uid: continue + consumer_en = consumer_instr.get("inputs", {}).get("en"); consumer_type = consumer_instr.get("type", ""); consumer_type_original = consumer_type.replace("_scl", "").replace("_error", "") + is_enabled_by_us = False + if (isinstance(consumer_en, dict) and consumer_en.get("type") == "connection" and consumer_en.get("source_instruction_uid") == instr_uid and consumer_en.get("source_pin") == "out"): is_enabled_by_us = True + if (is_enabled_by_us and consumer_type.endswith("_scl") and consumer_type_original in groupable_types): + consumer_scl = consumer_instr.get("scl", ""); core_scl = None + if consumer_scl.strip().startswith("IF"): + match = re.search(r"IF\\s+.*\\s+THEN\\s*(.*?)\\s*END_IF;", consumer_scl, re.DOTALL | re.IGNORECASE) + if match: core_scl = match.group(1).strip() + elif consumer_scl and not consumer_scl.strip().startswith("//"): core_scl = consumer_scl.strip() + if core_scl: grouped_instructions_cores.append(core_scl); consumer_instr_list.append(consumer_instr) + if len(grouped_instructions_cores) > 1: + print(f"INFO: Agrupando {len(grouped_instructions_cores)} instrucciones bajo condición de {instr_type_original} UID {instr_uid} (Cond: {condition_scl})") + scl_grouped = [f"IF {condition_scl} THEN"] + for core_line in grouped_instructions_cores: indented_core = "\\n".join([f" {line.strip()}" for line in core_line.splitlines()]); scl_grouped.append(indented_core) + scl_grouped.append("END_IF;"); final_grouped_scl = "\\n".join(scl_grouped) + instruction["scl"] = final_grouped_scl + for consumer_instr in consumer_instr_list: consumer_instr["scl"] = f"{GROUPED_COMMENT} (by UID {instr_uid})"; consumer_instr["grouped"] = True + made_change = True + return made_change + + +# --- Bucle Principal de Procesamiento --- +def process_json_to_scl(json_filepath): + # ... (Inicio sin cambios) ... + if not os.path.exists(json_filepath): print(f"Error: JSON no encontrado: {json_filepath}"); return + print(f"Cargando JSON desde: {json_filepath}") + try: global data; data = json.load(f) + except Exception as e: print(f"Error al cargar JSON: {e}"); traceback.print_exc(); return + network_access_maps = {} + for network in data.get("networks", []): + net_id = network["id"]; current_access_map = {} + for instr in network.get("logic", []): + for _, source in instr.get("inputs", {}).items(): + sources_to_check = source if isinstance(source, list) else ([source] if isinstance(source, dict) else []) + for src in sources_to_check: + if isinstance(src, dict) and src.get("uid") and src.get("type") in ["variable", "constant"]: current_access_map[src["uid"]] = src + for _, dest_list in instr.get("outputs", {}).items(): + if isinstance(dest_list, list): + for dest in dest_list: + if isinstance(dest, dict) and dest.get("uid") and dest.get("type") in ["variable", "constant"]: current_access_map[dest["uid"]] = dest + network_access_maps[net_id] = current_access_map + scl_map = {} + max_passes = 30; passes = 0; processing_complete = False + + # --- MODIFICACIÓN: Añadir process_edge_detector al mapa --- + base_processors = [ + process_convert, process_mod, process_eq, process_contact, process_o, + process_edge_detector, # Usar la nueva función unificada + process_add, process_move, process_call, process_coil, + # ... otros procesadores base ... + ] + processor_map = {} + for func in base_processors: + match = re.match(r"process_(\w+)", func.__name__) + if match: + type_name = match.group(1).lower() + if type_name == "call": + processor_map["call_fc"] = func; processor_map["call_fb"] = func; processor_map["call"] = func + elif type_name == "edge_detector": # Mapear PBox y NBox a la nueva función + processor_map["pbox"] = func + processor_map["nbox"] = func + else: processor_map[type_name] = func + # --- FIN MODIFICACIÓN --- + + + print("\\n--- Iniciando Bucle de Procesamiento Iterativo ---") + while passes < max_passes and not processing_complete: + # ... (Lógica del bucle iterativo sin cambios, + # ahora usará process_edge_detector para PBox y NBox + # a través del processor_map actualizado) ... + passes += 1; made_change_in_base_pass = False; made_change_in_group_pass = False + print(f"\\n--- Pase {passes} ---"); num_processed_this_pass = 0; num_grouped_this_pass = 0 + for network in data.get("networks", []): + network_id = network["id"]; access_map = network_access_maps.get(network_id, {}) + network_logic = network.get("logic", []) + for instruction in network_logic: + instr_uid = instruction.get("instruction_uid"); instr_type_original = instruction.get("type", "Unknown") + if (instr_type_original.endswith(SCL_SUFFIX) or "_error" in instr_type_original or instruction.get("grouped", False)): continue + lookup_key = instr_type_original.lower() + if instr_type_original == "Call": + block_type = instruction.get("block_type", "").upper() + if block_type == "FC": lookup_key = "call_fc" + elif block_type == "FB": lookup_key = "call_fb" + func_to_call = processor_map.get(lookup_key) + if func_to_call: + try: + # No necesita pasar network_logic excepto para la versión anterior de PBox + changed = func_to_call(instruction, network_id, scl_map, access_map) + if changed: made_change_in_base_pass = True; num_processed_this_pass += 1 + except Exception as e: print(f"ERROR(Base) al procesar {instr_type_original} UID {instr_uid} con {func_to_call.__name__}: {e}"); traceback.print_exc(); instruction["scl"] = f"// ERROR en procesador base: {e}"; instruction["type"] = instr_type_original + "_error"; made_change_in_base_pass = True + if made_change_in_base_pass or passes == 1: + for network in data.get("networks", []): + network_id = network["id"]; access_map = network_access_maps.get(network_id, {}); network_logic = network.get("logic", []) + for instruction in network_logic: + if instruction["type"].endswith("_scl") and not instruction.get("grouped", False): + try: + group_changed = process_group_ifs(instruction, network_id, scl_map, access_map) + if group_changed: made_change_in_group_pass = True; num_grouped_this_pass += 1 + except Exception as e: print(f"ERROR(Group) al intentar agrupar desde UID {instruction.get('instruction_uid')}: {e}"); traceback.print_exc() + if not made_change_in_base_pass and not made_change_in_group_pass: print(f"\\n--- No se hicieron más cambios en el pase {passes}. Proceso iterativo completado. ---"); processing_complete = True + else: print(f"--- Fin Pase {passes}: {num_processed_this_pass} procesados, {num_grouped_this_pass} agrupados. Continuando...") + if passes == max_passes and not processing_complete: print(f"\\n--- ADVERTENCIA: Límite de {max_passes} pases alcanzado. Puede haber dependencias no resueltas. ---") + + # --- Verificación Final y Guardado (Sin cambios) --- + print("\\n--- Verificación Final de Instrucciones No Procesadas ---"); unprocessed_count = 0; unprocessed_details = [] + for network in data.get("networks", []): + network_id = network.get("id", "Unknown ID"); network_title = network.get("title", f"Network {network_id}") + for instruction in network.get("logic", []): + instr_uid = instruction.get("instruction_uid", "Unknown UID"); instr_type = instruction.get("type", "Unknown Type"); is_grouped = instruction.get("grouped", False) + if (not instr_type.endswith(SCL_SUFFIX) and "_error" not in instr_type and not is_grouped): + unprocessed_count += 1; unprocessed_details.append(f" - Red '{network_title}' (ID: {network_id}), Instrucción UID: {instr_uid}, Tipo Original: '{instr_type}'") + if unprocessed_count > 0: print(f"ADVERTENCIA: Se encontraron {unprocessed_count} instrucciones que no pudieron ser procesadas a SCL:"); + for detail in unprocessed_details: print(detail) + print(">>> Estos tipos de instrucción podrían necesitar un procesador específico en 'x2_process.py'.") + else: print("INFO: Todas las instrucciones fueron procesadas a SCL, marcadas como error o agrupadas exitosamente.") + output_filename = json_filepath.replace("_simplified.json", "_simplified_processed.json") + print(f"\\nGuardando JSON procesado en: {output_filename}") + try: + with open(output_filename, "w", encoding="utf-8") as f: json.dump(data, f, indent=4, ensure_ascii=False) + print("Guardado completado.") + except Exception as e: print(f"Error Crítico al guardar JSON procesado: {e}"); traceback.print_exc() + + +# --- Ejecución --- +if __name__ == "__main__": + # Asegurarse de usar el nombre base del XML de prueba + xml_filename_base = "TestLAD" # <--- CAMBIADO PARA USAR TestLAD + input_json_file = f"{xml_filename_base}_simplified.json" + + if not os.path.exists(input_json_file): print(f"Error Fatal: El archivo de entrada JSON simplificado no existe: '{input_json_file}'"); print("Asegúrate de haber ejecutado 'x1_to_json.py' primero sobre el archivo XML correcto.") + else: process_json_to_scl(input_json_file) \ No newline at end of file