diff --git a/AgentBin/simulator/CMS_DEMO.xml b/AgentBin/simulator/CMS_DEMO.xml index 65d09b5..5eac7bd 100644 --- a/AgentBin/simulator/CMS_DEMO.xml +++ b/AgentBin/simulator/CMS_DEMO.xml @@ -150,6 +150,8 @@ + + diff --git a/MTC_Sim/.vs/MTC_Sim/v14/.suo b/MTC_Sim/.vs/MTC_Sim/v14/.suo index 249a6bc..176111f 100644 Binary files a/MTC_Sim/.vs/MTC_Sim/v14/.suo and b/MTC_Sim/.vs/MTC_Sim/v14/.suo differ diff --git a/MTC_Sim/MTC_Sim/AdapterConf/CMS_FANUC.xml b/MTC_Sim/MTC_Sim/AdapterConf/CMS_FANUC.xml index f633571..c16d2e6 100644 --- a/MTC_Sim/MTC_Sim/AdapterConf/CMS_FANUC.xml +++ b/MTC_Sim/MTC_Sim/AdapterConf/CMS_FANUC.xml @@ -233,6 +233,14 @@ Path_01_ActiveAxes STROBE#R10520.3 + + Path_01_CodG_Act + STROBE#R10520.3 + + + Path_01_SubMode + STROBE#R10520.3 + diff --git a/MTC_Sim/MTC_Sim/AdapterConf/CMS_FANUC.xml.bak b/MTC_Sim/MTC_Sim/AdapterConf/CMS_FANUC.xml.bak deleted file mode 100644 index 9ecbf8a..0000000 --- a/MTC_Sim/MTC_Sim/AdapterConf/CMS_FANUC.xml.bak +++ /dev/null @@ -1,632 +0,0 @@ - - - 1 - CMS_ADAPTER_00 - FANUC - - - VacPump_01 - Pompa 1 - Random - - - VacPump_01_Status - 0#7 - - - - - VacPump_02 - Pompa 2 - Random - - - VacPump_02_Status - 0#7 - - - - - - - VacAct_01 - Attuatore vuoto 1 - Random - - - VacAct_01_Count - 0#15 - - - - - VacAct_02 - Attuatore vuoto 2 - Random - - - VacAct_02_Count - 0#15 - - - - - - - Lubro_01 - Lubrorefrigerante 1 - Random - - - Lubro_01_Num - 0#15 - - - - - Lubro_02 - Lubrorefrigerante 2 - Random - - - Lubro_02_Num - 0#15 - - - - - - - Cooler_01 - Cooler 1 - Random - - - Cooler_01_Status - 0#3 - - - - - Cooler_02 - Cooler 2 - Random - - - Cooler_02_Status - 0#3 - - - - - - - Press_01 - Pressostato 1 - Random - - - Press_01_Value - 0#7 - - - - - Press_02 - Pressostato 2 - Random - - - Press_02_Value - 0#7 - - - - - - - Temp_01 - Sonda Temperatura 1 - Random - - - Temp_01_Value - 0#7 - - - - - Temp_02 - Sonda Temperatura 2 - Random - - - Temp_02_Value - 0#7 - - - - - - - Path_01 - Path num 1 - Random - - - Path_01_FeedRate - INT#D8888.0 - - - Path_01_FeedOverr - INT#D8888.0 - - - Path_01_RapidOverr - INT#D8888.0 - - - Path_01_PosActX - FLOAT#D7777.0 - - - Path_01_PosActY - FLOAT#D7777.1 - - - Path_01_PosActZ - FLOAT#D7777.2 - - - Path_01_PosActI - FLOAT#D7777.3 - - - Path_01_PosActJ - FLOAT#D7777.4 - - - Path_01_PosActK - FLOAT#D7777.5 - - - Path_01_Type - FLAG#R10528.12 - - - Path_01_PartId - INT#D9999 - - - Path_01_PZ_TOT - INT#D9999 - - - Path_01_Cod_M - STROBE#R10520.0 - - - Path_01_Cod_S - STROBE#R10520.1 - - - Path_01_Cod_T - STROBE#R10520.2 - - - Path_01_RUN_MODE - FLAG#R10528.1:R10528.7 - - - Path_01_EXE_MODE - FLAG#R10528.8:R10528.11 - - - Path_01_CurrProg - STRING#D0000 - - - Path_01_CurrProg_RowNum - INT#D0001.0 - - - Path_01_ActiveAxes - STROBE#R10520.3 - - - - - - - UnOp_01 - Unita Op num 1 - Random - - - UnOp_01_ToolId - 0#7 - - - UnOp_01_NumCU - 8#15 - - - UnOp_01_Status - 16#23 - - - UnOp_01_VitaRes - 24#31 - - - UnOp_01_Speed - 32#39 - - - UnOp_01_Load - 40#47 - - - UnOp_01_AccTime - 48#55 - - - - - - - Axis_01 - Asse num 1 - Random - - - Axis_01_MainProc - 0#7 - - - Axis_01_IsMast - 8#15 - - - Axis_01_MastId - 16#23 - - - Axis_01_Type - 24#31 - - - Axis_01_Dir - 32#39 - - - Axis_01_Load - 40#47 - - - Axis_01_PosAct - 48#55 - - - Axis_01_PosTgt - 56#63 - - - Axis_01_FeedAct - 64#71 - - - Axis_01_FeedOver - 72#79 - - - Axis_01_AccelAct - 80#87 - - - Axis_01_AccTime - 88#95 - - - Axis_01_Battery - 96#103 - - - - - Axis_02 - Asse num 2 - Random - - - Axis_02_MainProc - 0#7 - - - Axis_02_IsMast - 8#15 - - - Axis_02_MastId - 16#23 - - - Axis_02_Type - 24#31 - - - Axis_02_Dir - 32#39 - - - Axis_02_Load - 40#47 - - - Axis_02_PosAct - 48#55 - - - Axis_02_PosTgt - 56#63 - - - Axis_02_FeedAct - 64#71 - - - Axis_02_FeedOver - 72#79 - - - Axis_02_AccelAct - 80#87 - - - Axis_02_AccTime - 88#95 - - - Axis_02_Battery - 96#103 - - - - - Axis_03 - Asse num 3 - Random - - - Axis_03_MainProc - 0#7 - - - Axis_03_IsMast - 8#15 - - - Axis_03_MastId - 16#23 - - - Axis_03_Type - 24#31 - - - Axis_03_Dir - 32#39 - - - Axis_03_Load - 40#47 - - - Axis_03_PosAct - 48#55 - - - Axis_03_PosTgt - 56#63 - - - Axis_03_FeedAct - 64#71 - - - Axis_03_FeedOver - 72#79 - - - Axis_03_AccelAct - 80#87 - - - Axis_03_AccTime - 88#95 - - - Axis_03_Battery - 96#103 - - - - - Axis_04 - Asse num 4 - Random - - - Axis_04_MainProc - 0#7 - - - Axis_04_IsMast - 8#15 - - - Axis_04_MastId - 16#23 - - - Axis_04_Type - 24#31 - - - Axis_04_Dir - 32#39 - - - Axis_04_Load - 40#47 - - - Axis_04_PosAct - 48#55 - - - Axis_04_PosTgt - 56#63 - - - Axis_04_FeedAct - 64#71 - - - Axis_04_FeedOver - 72#79 - - - Axis_04_AccelAct - 80#87 - - - Axis_04_AccTime - 88#95 - - - Axis_04_Battery - 96#103 - - - - - Axis_05 - Asse num 5 - Random - - - Axis_05_MainProc - 0#7 - - - Axis_05_IsMast - 8#15 - - - Axis_05_MastId - 16#23 - - - Axis_05_Type - 24#31 - - - Axis_05_Dir - 32#39 - - - Axis_05_Load - 40#47 - - - Axis_05_PosAct - 48#55 - - - Axis_05_PosTgt - 56#63 - - - Axis_05_FeedAct - 64#71 - - - Axis_05_FeedOver - 72#79 - - - Axis_05_AccelAct - 80#87 - - - Axis_05_AccTime - 88#95 - - - Axis_05_Battery - 96#103 - - - - - Axis_06 - Asse num 6 - Random - - - Axis_06_MainProc - 0#7 - - - Axis_06_IsMast - 8#15 - - - Axis_06_MastId - 16#23 - - - Axis_06_Type - 24#31 - - - Axis_06_Dir - 32#39 - - - Axis_06_Load - 40#47 - - - Axis_06_PosAct - 48#55 - - - Axis_06_PosTgt - 56#63 - - - Axis_06_FeedAct - 64#71 - - - Axis_06_FeedOver - 72#79 - - - Axis_06_AccelAct - 80#87 - - - Axis_06_AccTime - 88#95 - - - Axis_06_Battery - 96#103 - - - - - \ No newline at end of file diff --git a/MTC_Sim/MTC_Sim/AdapterFanuc.cs b/MTC_Sim/MTC_Sim/AdapterFanuc.cs index 145dbac..013f902 100644 --- a/MTC_Sim/MTC_Sim/AdapterFanuc.cs +++ b/MTC_Sim/MTC_Sim/AdapterFanuc.cs @@ -11,12 +11,6 @@ namespace MTC_Sim { protected FANUC FANUC_ref; -#if false - protected StatusBitMap CurrStatus; - protected StFlag8 Status8; - protected StFlag32 Status32; -#endif - /// /// estende l'init della classe base... /// @@ -83,7 +77,8 @@ namespace MTC_Sim // 2016.05.09 ci sono solo 4 bit x ora da controllare... // check COD_M bitNum = 0; - if (STRB_DW1.getBit(bitNum)) + //if (STRB_DW1.getBit(bitNum)) + if (STRB_DW1.HasFlag((StFlag32)Math.Pow(2, bitNum))) { memIndex = 10660; // recupero tutti i 16+16 bit del blocco @@ -103,7 +98,8 @@ namespace MTC_Sim // check COD_S bitNum = 1; - if (STRB_DW1.getBit(1)) + //if (STRB_DW1.getBit(bitNum)) + if (STRB_DW1.HasFlag((StFlag32)Math.Pow(2, bitNum))) { memIndex = 10682; // recupero tutti i 16+16 bit del blocco @@ -123,7 +119,8 @@ namespace MTC_Sim // check COD_T bitNum = 2; - if (STRB_DW1.getBit(2)) + //if (STRB_DW1.getBit(bitNum)) + if (STRB_DW1.HasFlag((StFlag32)Math.Pow(2, bitNum))) { memIndex = 10694; // recupero tutti i 16+16 bit del blocco @@ -143,7 +140,8 @@ namespace MTC_Sim // check assi assegnati al path 01... bitNum = 3; - if (STRB_DW1.getBit(3)) + //if (STRB_DW1.getBit(bitNum)) + if (STRB_DW1.HasFlag((StFlag32)Math.Pow(2, bitNum))) { // mi basta un solo byte... MemBlock = new byte[1]; @@ -156,7 +154,8 @@ namespace MTC_Sim // spazzo i bit, dove è 1 metto nella stringa degli assi attivi... for (int i = 0; i < 8; i++) { - if (StrobeBlock.getBit(i)) + //if (StrobeBlock.getBit(i)) + if (StrobeBlock.HasFlag((StFlag8)Math.Pow(2, i))) { AssiAttivi += string.Format(" {0}", i); } @@ -183,6 +182,52 @@ namespace MTC_Sim } /// + /// recupera allarmi ed agiorna strobe (privato) degli allarmi + /// + /// 32bit mask degli allarmi da aggiornare + /// boolean: se si debba tornare ACK + public override void refreshAlarmState(StFlag32 Alarm2Refresh, bool giveAck) + { + base.refreshAlarmState(Alarm2Refresh, giveAck); + + // byte di acknowledge... + byte[] retACK_DW0 = new byte[4]; + + if (Alarm2Refresh != StFlag32.NONE) + { + // blocco memoria x lettura dati + byte[] MemBlock = new byte[4]; + // primo blocco memoria allarmi + int memIndex = 10532; + // verifico gli allarmi di tutti i bit alzati... + for (int i = 0; i < 32; i++) + { + if (Alarm2Refresh.HasFlag((StFlag32)Math.Pow(2, i))) + { + // recupero tutti i 32 bit del blocco + FANUC_ref.F_RW_Byte(R, FANUC.MemType.R, memIndex + i * 4, ref MemBlock); + // aggiorno nel vettore allarmi i byte interessati + for (int j = 0; j < 4; j++) + { + AlarmFlags[i * 4 + j] = MemBlock[j]; + } + //AlarmFlags.SetValue(MemBlock, i * 4); + + // segnalo allarme letto! memorizzo allarme nel vettore ack.... + retACK_DW0 = utils.setBitOnStFlag(retACK_DW0, 1, i); + + } + } + if (giveAck) + { + // mi preparo a scrivere ACK + memIndex = 10500; + // scrivo update ad ack!!! + FANUC_ref.F_RW_Byte(W, FANUC.MemType.R, memIndex, ref retACK_DW0); + } + } + } + /// /// processing strobe degli allarmi /// public override void processAlarm() @@ -191,72 +236,43 @@ namespace MTC_Sim // se non sono connesso esco if (!FANUC_ref.Connected) return; - // procedo! - int memIndex = 0; // byte di acknowledge... byte[] retACK_DW0 = new byte[4]; - // controllo TUTTI i flag: se ce ne sono di alzati DEVO processare... - if (STRB_DW0 != StFlag32.NONE) + + // faccio refresh degli allarmi segnalati + refreshAlarmState(STRB_DW0, true); + + // variabili helper + StFlag32 AlarmBlock = 0; + allarme currAllarm; + // controllo TUTTI i bit della variabile COMPLETA degli status allarmi: se ce ne sono di alzati DEVO processare... + for (int i = 0; i < AlarmFlags.Length / 4; i++) { - // blocco memoria x lettura dati - byte[] MemBlock = new byte[4]; - StFlag32 AlarmBlock = 0; - allarme currAllarm; - // primo blocco memoria allarmi - memIndex = 10532; - // verifico gli allarmi di tutti i bit alzati... - for (int i = 0; i < 32; i++) + // leggo 32bit alla volta... + AlarmBlock = (StFlag32)BitConverter.ToUInt32(AlarmFlags, i * 4); + + for (int j = 0; j < 32; j++) { - if (STRB_DW0.getBit(i)) + // converto! e aggiungo allarmi sollevati al corretto controller allarmi... + //if (AlarmBlock.getBit(j)) + if (AlarmBlock.HasFlag((StFlag32)Math.Pow(2, j))) { - // recupero tutti i 32 bit del blocco - FANUC_ref.F_RW_Byte(R, FANUC.MemType.R, memIndex + i * 4, ref MemBlock); - AlarmBlock = (StFlag32)BitConverter.ToUInt32(MemBlock, 0); - for (int j = 0; j < 32; j++) + // recupero allarme da oggetto in memoria... + currAllarm = elencoAllarmi[i * 32 + j]; + // in base al gruppo decido dove assegnare come CONDITION... + switch (currAllarm.gruppo) { - // converto! - // e aggiungo allarmi sollevati al corretto controller allarmi... - if (AlarmBlock.getBit(j)) - { - // recupero allarme da oggetto in memoria... - currAllarm = elencoAllarmi[i * 32 + j]; - // in base al gruppo decido dove assegnare come CONDITION... - switch (currAllarm.gruppo) - { - case "PLC": - mAlarmPLC.Add(MTConnect.Condition.Level.FAULT, currAllarm.descrizione, currAllarm.codNum, "", ""); - break; - case "CNC": - default: - mAlarmCNC.Add(MTConnect.Condition.Level.FAULT, currAllarm.descrizione, currAllarm.codNum, "", ""); - break; - } - } + case "PLC": + mAlarmPLC.Add(MTConnect.Condition.Level.FAULT, currAllarm.descrizione, currAllarm.codNum, "", ""); + break; + case "CNC": + default: + mAlarmCNC.Add(MTConnect.Condition.Level.FAULT, currAllarm.descrizione, currAllarm.codNum, "", ""); + break; } - // memorizzo allarme nel vettore ack.... - retACK_DW0 = utils.setBitOnStFlag(retACK_DW0, 1, i); } -#if false - else - { - // abbasso eventuali flag di ack se non ne ho + dall'altro caso... - retACK_DW0 = utils.setBitOnStFlag(retACK_DW0, 0, i); - } -#endif } } - else - { - // se mi sono rimasti degli strobe di lettura allarmi alzati li abbasso - if (ACK_DW0 != StFlag32.NONE) - { - // inizializzo 4 byte a zero!!! - retACK_DW0 = new byte[4]; - } - } - memIndex = 10500; - // scrivo update ad ack!!! - FANUC_ref.F_RW_Byte(W, FANUC.MemType.R, memIndex, ref retACK_DW0); } /// /// processing! @@ -366,7 +382,7 @@ namespace MTC_Sim // !!!FARE!!! recuperare davvero dai dati del CNC e sostituire NA mOperator.Value = "NA"; - + // recupero SEMPRE dati ulteriori: status ON/OFF, clock, ... mStatus.Value = "NA"; mAccTime.Value = "NA"; @@ -382,7 +398,7 @@ namespace MTC_Sim public override void getPath() { base.getPath(); - + #if false // byte x lettura memoria... 8byte --> 64 bit! diff --git a/MTC_Sim/MTC_Sim/AdapterGeneric.cs b/MTC_Sim/MTC_Sim/AdapterGeneric.cs index 987312c..b08ce6f 100644 --- a/MTC_Sim/MTC_Sim/AdapterGeneric.cs +++ b/MTC_Sim/MTC_Sim/AdapterGeneric.cs @@ -285,6 +285,14 @@ namespace MTC_Sim /// public Sample mPathPosActK; /// + /// Stato dei codici G attivi + /// + public Event mPathCodG_Act; + /// + /// Stato dei SubMode attivi + /// + public Event mPathSubMode; + /// /// Allarmi CNC del PATH /// public Condition mPathAlarmCNC; @@ -327,6 +335,8 @@ namespace MTC_Sim mPathCurrProg = new Event(dataRefList[17].Key); mPathCurrProgRowNum = new Event(dataRefList[18].Key); mPathActiveAxes = new Event(dataRefList[19].Key); + mPathCodG_Act = new Event(dataRefList[20].Key); + mPathSubMode = new Event(dataRefList[21].Key); mPathAlarmCNC = new Condition(string.Format("{0}_AlarmCNC", ident)); mPathAlarmPLC = new Condition(string.Format("{0}_AlarmPLC", ident)); } @@ -518,6 +528,15 @@ namespace MTC_Sim // 16 bit di strobe in risposta (4 word da 32 bit di flags...) public byte[] Acknowl = new byte[16]; + // 1024 bit di strobe degli allarmi attivi (32 word da 4byte/32 bit di flags...) + public byte[] AlarmFlags; + + /// + /// Oggetto elenco allarmi + /// + public allarme[] elencoAllarmi; + + /// /// Prima word di strobe da array flag completo /// @@ -600,10 +619,6 @@ namespace MTC_Sim return (StFlag32)BitConverter.ToUInt32(Acknowl, 12); } } - /// - /// Oggetto elenco allarmi - /// - public allarme[] elencoAllarmi; #if true @@ -622,7 +637,7 @@ namespace MTC_Sim /// /// Variabili stato macchina principali /// - public StFlag8 ST_MACCH = 0; + public StFlag8 ST_MACCH = 0; #endif @@ -714,8 +729,6 @@ namespace MTC_Sim // salvo al form chiamante parentForm = caller; - loadAllarmi(); - // item disponibilità mAdapter.AddDataItem(mAvail); mAvail.Value = "AVAILABLE"; @@ -886,6 +899,11 @@ namespace MTC_Sim file.Close(); // ora trimmo vettore al solo numero VERO degli allarmi caricati... Array.Resize(ref elencoAllarmi, rumRiga); + + // inizializzo a zero il vettore allarmi... + int numByte = (int)Math.Ceiling(Convert.ToDecimal(rumRiga) / 8); + AlarmFlags = new byte[numByte]; + } /// /// Decodifica file allarme @@ -907,6 +925,13 @@ namespace MTC_Sim /// public virtual void startAdapter(int port) { + // inizializzo vettori di utility.. + loadAllarmi(); + + // carico status allarmi (completo) + StFlag32 forceAlarm = (StFlag32)unchecked((int)UInt32.MaxValue); + refreshAlarmState(forceAlarm, false); + // Start the adapter lib with the port number in the text box mAdapter.Port = port; mAdapter.Start(); @@ -920,6 +945,15 @@ namespace MTC_Sim mAlarmCNC.Normal(); mAlarmGeneral.Normal(); } + /// + /// Effettua refresh del vettore privato degli allarmi attivi + /// + /// flag mask degli allarmi da aggiornare + /// boolean: se si debba tornare ACK + public virtual void refreshAlarmState(StFlag32 Alarm2Refresh, bool giveAck) + { + // carco lo stato di tutti gli allarmi... forzo a 1 il flag degli allarmi + } /// /// ferma l'adapter... @@ -1005,7 +1039,7 @@ namespace MTC_Sim { } - + /// /// verifica gli status attivi @@ -1150,7 +1184,7 @@ namespace MTC_Sim return answ; } } - + /// /// recupera pezzi OK (fare override!) /// diff --git a/MTC_Sim/MTC_Sim/Appunti.txt b/MTC_Sim/MTC_Sim/Appunti.txt index f1aacc7..c452168 100644 --- a/MTC_Sim/MTC_Sim/Appunti.txt +++ b/MTC_Sim/MTC_Sim/Appunti.txt @@ -6,3 +6,13 @@ ATTENZIONE: aggiungere pos memoria x status e strobe x path Aggiungere condition (1) x ogni path e x ogni asse + + +- chiusura app --> FANUC_ref.disconnect + +1) rivedere GetBit (cambiare!!!) +2) strobe allarmi --> su cambio fronte --> serve vettore stato COMPLETO allarmi +3) lo strobe allarmi va inizializzato all'avvio (carica TUTTI i bit...) +4) da strobe allarmi --> vettore allarmi +5) CodS 5 cifre +6) CodM/CodT 3 cifre diff --git a/MTC_Sim/MTC_Sim/SetupAdapter.cs b/MTC_Sim/MTC_Sim/SetupAdapter.cs index 41c457e..4727bcd 100644 --- a/MTC_Sim/MTC_Sim/SetupAdapter.cs +++ b/MTC_Sim/MTC_Sim/SetupAdapter.cs @@ -357,6 +357,8 @@ namespace MTC_Sim listaDR.Add(new DataRefItem(string.Format("Path_{0:00}_CurrProg", i + 1), "STRING#D0000")); listaDR.Add(new DataRefItem(string.Format("Path_{0:00}_CurrProg_RowNum", i + 1), "INT#D0001.0")); listaDR.Add(new DataRefItem(string.Format("Path_{0:00}_ActiveAxes", i + 1), "STROBE#R10520.3")); + listaDR.Add(new DataRefItem(string.Format("Path_{0:00}_CodG_Act", i + 1), "STROBE#xxx")); + listaDR.Add(new DataRefItem(string.Format("Path_{0:00}_SubMode", i + 1), "STROBE#xxx")); Path[i] = new element(string.Format("Path_{0:00}", i + 1), string.Format("Path num {0}", i + 1), fonteDati.Random, listaDR); } diff --git a/MTC_Sim/MTC_Sim/utils.cs b/MTC_Sim/MTC_Sim/utils.cs index b1d412d..222cfe0 100644 --- a/MTC_Sim/MTC_Sim/utils.cs +++ b/MTC_Sim/MTC_Sim/utils.cs @@ -228,6 +228,8 @@ namespace MTC_Sim public string ProgrRow; public string PartId; public string ActiveAxes; + public string CodG_Act; + public string SubMode; public int PathFeedrate; public int PathFeedrateOver;