diff --git a/AgentBin/simulator/CMS_DEMO.xml b/AgentBin/simulator/CMS_DEMO.xml index e220017..0fb9166 100644 --- a/AgentBin/simulator/CMS_DEMO.xml +++ b/AgentBin/simulator/CMS_DEMO.xml @@ -114,31 +114,6 @@ --> - - - - - - - - - - - - - - - - - @@ -191,15 +166,6 @@ --> - diff --git a/MTC_Sim/.vs/MTC_Sim/v14/.suo b/MTC_Sim/.vs/MTC_Sim/v14/.suo index acdb068..7f81c4d 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/AdapterDemo.cs b/MTC_Sim/MTC_Sim/AdapterDemo.cs index 577db86..141350c 100644 --- a/MTC_Sim/MTC_Sim/AdapterDemo.cs +++ b/MTC_Sim/MTC_Sim/AdapterDemo.cs @@ -43,11 +43,6 @@ namespace MTC_Sim // serve?!? base.getCurrProgramData(); - // recupero programma da FORM!!! - mProgram.Value = parentForm.datiProd.ProgramName; - mProgRowNum.Value = parentForm.datiProd.ProgrRow; - mPartId.Value = parentForm.datiProd.PartId; - mOperator.Value = parentForm.datiProd.Operator; // recupero SEMPRE dati ulteriori: status ON/OFF, clock, ... @@ -57,9 +52,9 @@ namespace MTC_Sim mPower.Value = parentForm.datiProd.Power; } - public override void getCurrMode() + public override void getStrobeStatus() { - base.getCurrMode(); + base.getStrobeStatus(); // controllo bool allarmi... if (parentForm.datiProd.EmrStop) @@ -70,13 +65,7 @@ namespace MTC_Sim { mEStop.Value = "ARMED"; } - - // imposto RUN mode - mMode.Value = parentForm.datiProd.RunMode; - - // imposto EXE mode - mExec.Value = parentForm.datiProd.ExeMode; - + // imposto func mode... mFunctionalMode.Value = parentForm.datiProd.FuncMode; @@ -106,9 +95,9 @@ namespace MTC_Sim mAlarmGeneral.Add(Condition.Level.FAULT, string.Format("ERR_{0:###}: Errore {1}", allarme.Key, allarme.Value), string.Format("ERR_{0:###}_{1}", allarme.Key, allarme.Value)); } - public override void getAlarms() + public override void processStrobe() { - base.getAlarms(); + base.processStrobe(); if (parentForm.systemAlarm.Count > 0) { @@ -156,6 +145,23 @@ namespace MTC_Sim vettPath[PtData.PathSel].mPathPosActI.Value = PtData.PathPosAct.i; vettPath[PtData.PathSel].mPathPosActJ.Value = PtData.PathPosAct.j; vettPath[PtData.PathSel].mPathPosActK.Value = PtData.PathPosAct.k; + + + + // aggiunta x revisione 2016.05.05 + vettPath[PtData.PathSel].mPathType.Value = PtData.PathType; + vettPath[PtData.PathSel].mPathPartId.Value = PtData.PartId; + vettPath[PtData.PathSel].mPathPartCount.Value = PtData.pzTot; +#if false + vettPath[PtData.PathSel].mPathCodM.Value = PtData.co; + vettPath[PtData.PathSel].mPathCodS.Value = PtData.PathType; + vettPath[PtData.PathSel].mPathCodT.Value = PtData.PathType; +#endif + vettPath[PtData.PathSel].mPathRunMode.Value = PtData.RunMode; + vettPath[PtData.PathSel].mPathExeMode.Value = PtData.ExeMode; + vettPath[PtData.PathSel].mPathCurrProg.Value = PtData.ProgramName; + vettPath[PtData.PathSel].mPathCurrProgRowNum.Value = PtData.ProgrRow; + vettPath[PtData.PathSel].mPathActiveAxes.Value = PtData.ActiveAxes; } } @@ -198,26 +204,6 @@ namespace MTC_Sim vettAxis[AxData.AxisSel].mAxBattery.Value = AxData.AxisBattery; } } - - /// - /// Recupero dati da form... - /// - public override int getNumPzKo - { - get - { - return parentForm.datiProd.pzKo; - } - } - /// - /// Recupero dati da form... - /// - public override int getNumPzOk - { - get - { - return parentForm.datiProd.pzOk; - } - } + } } diff --git a/MTC_Sim/MTC_Sim/AdapterFanuc.cs b/MTC_Sim/MTC_Sim/AdapterFanuc.cs index a3be696..a72df5d 100644 --- a/MTC_Sim/MTC_Sim/AdapterFanuc.cs +++ b/MTC_Sim/MTC_Sim/AdapterFanuc.cs @@ -28,11 +28,130 @@ namespace MTC_Sim string szStatusConnection = ""; FANUC_ref.Connect(ref szStatusConnection); + + } + /// + /// Effettuo lettura dei 16 byte di strobe/status + /// + public override void getStrobeStatus() + { + base.getStrobeStatus(); + + // se non sono connesso esco + if (!FANUC_ref.Connected) return; - //CMSCncLib.App.Runtime.CreateRuntime(); + // hard coded: leggo 16 word R10516--> R10532 + FANUC_ref.F_RW_Byte(R, FANUC.MemType.R, 10516, ref Strobes); + } + /// + /// processing strobe! + /// + public override void processStrobe() + { + } + /// + /// processing strobe degli allarmi + /// + public override void processAlarm() + { + base.processAlarm(); + // controllo TUTTI i flag: se ce ne sono di alzati DEVO processare... + } + /// + /// processing! + /// + public override void processStatus() + { + base.processStrobe(); - //Runtime.NC.Initialize(); - //Config.Settings.Settings.TypeNC = CNC.NcType.FANUC; + // update status da DW3 + + // EMstop: verifico BIT e di conseguenza imposto + if(STRB_DW3.HasFlag(StFlag32.B00)) + { + mEStop.Value = "TRIGGERED"; + } + else + { + mEStop.Value = "ARMED"; + } + + // HARD CODE: forzo path 1 (indice 0...) + int idxPath = 0; + // switch su run mode... + switch (STRB_DW3) + { + case StFlag32.B01: + vettPath[idxPath].mPathRunMode.Value = "AUTO"; + break; + case StFlag32.B02: + vettPath[idxPath].mPathRunMode.Value = "EDIT"; + break; + case StFlag32.B03: + vettPath[idxPath].mPathRunMode.Value = "MDI"; + break; + case StFlag32.B04: + vettPath[idxPath].mPathRunMode.Value = "REF"; + break; + case StFlag32.B05: + vettPath[idxPath].mPathRunMode.Value = "JOG"; + break; + case StFlag32.B06: + vettPath[idxPath].mPathRunMode.Value = "JOGINC"; + break; + case StFlag32.B07: + vettPath[idxPath].mPathRunMode.Value = "HANDLE"; + break; + } + // switch su EXE mode... + switch (STRB_DW3) + { + case StFlag32.B08: + vettPath[idxPath].mPathExeMode.Value = "RUN"; + break; + case StFlag32.B09: + vettPath[idxPath].mPathExeMode.Value = "READY"; + break; + case StFlag32.B10: + vettPath[idxPath].mPathExeMode.Value = "HOLD"; + break; + case StFlag32.B11: + vettPath[idxPath].mPathExeMode.Value = "FEEDHOLD"; + break; + } + + // verifico tipo path... + if (STRB_DW3.HasFlag(StFlag32.B12)) + { + vettPath[idxPath].mPathType.Value = "LAVORO"; + } + else + { + vettPath[idxPath].mPathType.Value = "ASSERV"; + } + + + +#if false + + // IPOTESI DA VERIFICARE!!! + // leggo primo byte, i cui bit indicano run mode (3450.0 --> 3450.7) + RunStatus = (StFlag8)status[0]; + // leggo primo byte, i cui bit indicano run mode (3451.0 --> 3451.7) + ExeStatus = (StFlag8)status[1]; + + // se devo prendere sotto insiemi di byte --> BitConverter + //BitConverter.ToUInt32 + + // check bit 0... SE è presente + Status8.Has(StFlag8.B0); + + // check bit 0... SE è SOLO QUELLO + Status8.Is(StFlag8.B0); + + // check bit 18... + Status8.Has(StFlag32.B18); +#endif } public override void getCurrProgramData() diff --git a/MTC_Sim/MTC_Sim/AdapterGeneric.cs b/MTC_Sim/MTC_Sim/AdapterGeneric.cs index d891cb3..c6a7e6e 100644 --- a/MTC_Sim/MTC_Sim/AdapterGeneric.cs +++ b/MTC_Sim/MTC_Sim/AdapterGeneric.cs @@ -479,6 +479,7 @@ namespace MTC_Sim public bool R = false; public bool W = true; + protected bool adpRunning; /// /// adapter globale @@ -489,6 +490,95 @@ namespace MTC_Sim #region altri oggetti + // 16 bit di strobe (4 word da 32 bit di flags...) + public byte[] Strobes = new byte[16]; + // 16 bit di strobe in risposta (4 word da 32 bit di flags...) + public byte[] Acknowl = new byte[16]; + + /// + /// Prima word di strobe da array flag completo + /// + public StFlag32 STRB_DW0 + { + get + { + //byte[] answ = new byte[4]; + //answ = (byte[])Strobes.Skip(0).Take(4); + return (StFlag32)BitConverter.ToUInt32(Strobes, 0); + } + } + /// + /// Seconda word di strobe da array flag completo + /// + public StFlag32 STRB_DW1 + { + get + { + return (StFlag32)BitConverter.ToUInt32(Strobes, 4); + } + } + /// + /// Terza word di strobe da array flag completo + /// + public StFlag32 STRB_DW2 + { + get + { + return (StFlag32)BitConverter.ToUInt32(Strobes, 8); + } + } + /// + /// Quarta word di strobe da array flag completo + /// + public StFlag32 STRB_DW3 + { + get + { + return (StFlag32)BitConverter.ToUInt32(Strobes, 12); + } + } + /// + /// Prima word di ACKnowledgment da array flag completo + /// + public StFlag32 ACK_DW0 + { + get + { + return (StFlag32)BitConverter.ToUInt32(Acknowl, 0); + } + } + /// + /// Seconda word di ACKnowledgment da array flag completo + /// + public StFlag32 ACK_DW1 + { + get + { + return (StFlag32)BitConverter.ToUInt32(Acknowl, 4); + } + } + /// + /// Terza word di ACKnowledgment da array flag completo + /// + public StFlag32 ACK_DW2 + { + get + { + return (StFlag32)BitConverter.ToUInt32(Acknowl, 8); + } + } + /// + /// Quarta word di ACKnowledgment da array flag completo + /// + public StFlag32 ACK_DW3 + { + get + { + return (StFlag32)BitConverter.ToUInt32(Acknowl, 12); + } + } + +#if true /// /// Strobe mask PLC /// @@ -504,7 +594,8 @@ namespace MTC_Sim /// /// Variabili stato macchina principali /// - public StFlag8 ST_MACCH = 0; + public StFlag8 ST_MACCH = 0; +#endif public List codaM = new List(); @@ -544,58 +635,6 @@ namespace MTC_Sim /// public Event mOperator = new Event("OperatorId"); -#if true - - /// - /// CURR_PROG - programma in esecuzione - /// - public Event mProgram = new Event("CurrProg"); - /// - /// CURR_PROG_ROWNUM - programma in esecuzione - /// - public Event mProgRowNum = new Event("CurrProg_RowNum"); - /// - /// PartId - particolare prodotto - /// - public Event mPartId = new Event("PartID"); - - /// - /// D.D1.P1.RUN_MODE - modalità esecuzione - /// - public Event mMode = new Event("RUN_MODE"); - /// - /// D.D1.P1.PATH_STATUS - status macchina - /// - public Event mExec = new Event("EXECUTION"); - - /// - /// M_CODE - /// - public Event mCod_M = new Event("Cod_M"); - /// - /// S_CODE - /// - public Event mCod_S = new Event("Cod_S"); - /// - /// T_CODE - /// - public Event mCod_T = new Event("Cod_T"); - - - /// - /// Pezzi totali - /// - public Event mPz_Tot = new Event("PZ_TOT"); - /// - /// Pezzi OK - /// - public Event mPz_Ok = new Event("PZ_OK"); - /// - /// Pezzi KO - /// - public Event mPz_Ko = new Event("PZ_KO"); -#endif - /// /// modalità funzionale /// @@ -660,22 +699,9 @@ namespace MTC_Sim mAdapter.AddDataItem(mEStop); // programma e produzione - mAdapter.AddDataItem(mProgram); - mAdapter.AddDataItem(mProgRowNum); - mAdapter.AddDataItem(mPartId); - mAdapter.AddDataItem(mPz_Tot); - mAdapter.AddDataItem(mPz_Ok); - mAdapter.AddDataItem(mPz_Ko); mAdapter.AddDataItem(mOperator); - // codici speciali M/S/T - mAdapter.AddDataItem(mCod_M); - mAdapter.AddDataItem(mCod_S); - mAdapter.AddDataItem(mCod_T); - // modalità esecutiva e funzionale - mAdapter.AddDataItem(mMode); - mAdapter.AddDataItem(mExec); mAdapter.AddDataItem(mFunctionalMode); // Pompe vuoto @@ -731,7 +757,6 @@ namespace MTC_Sim for (int i = 0; i < adpConf.nPath; i++) { vettPath[i] = new Path(adpConf.Path[i]); - //mAdapter.AddDataItem(vettPath[i].mPathAlias); mAdapter.AddDataItem(vettPath[i].mPathFeed); mAdapter.AddDataItem(vettPath[i].mPathFeedOver); mAdapter.AddDataItem(vettPath[i].mPathRapidOver); @@ -741,6 +766,18 @@ namespace MTC_Sim mAdapter.AddDataItem(vettPath[i].mPathPosActI); mAdapter.AddDataItem(vettPath[i].mPathPosActJ); mAdapter.AddDataItem(vettPath[i].mPathPosActK); + // aggiunta x revisione 2016.05.05 + mAdapter.AddDataItem(vettPath[i].mPathType); + mAdapter.AddDataItem(vettPath[i].mPathPartId); + mAdapter.AddDataItem(vettPath[i].mPathPartCount); + mAdapter.AddDataItem(vettPath[i].mPathCodM); + mAdapter.AddDataItem(vettPath[i].mPathCodS); + mAdapter.AddDataItem(vettPath[i].mPathCodT); + mAdapter.AddDataItem(vettPath[i].mPathRunMode); + mAdapter.AddDataItem(vettPath[i].mPathExeMode); + mAdapter.AddDataItem(vettPath[i].mPathCurrProg); + mAdapter.AddDataItem(vettPath[i].mPathCurrProgRowNum); + mAdapter.AddDataItem(vettPath[i].mPathActiveAxes); } // UnOp vettUnOp = new UnOp[adpConf.nUnOp]; @@ -803,6 +840,8 @@ namespace MTC_Sim mAdapter.Port = port; mAdapter.Start(); + // resetto running flag... + adpRunning = false; mAlarmSystem.Normal(); mAlarmCNC.Normal(); @@ -826,47 +865,55 @@ namespace MTC_Sim /// public void gaterAndSend(gatherCycle ciclo) { - // avvio fase raccolta dati - mAdapter.Begin(); - - // parte che eseguo SEMPRE: strobe/status - // dati stato macchina (allarmi, modalità RUN/EXEC, ...) - getCurrMode(); - - // gestione allarmi - getAlarms(); - - if (ciclo == gatherCycle.HF) + // controllo non sia già in esecuzione... + if (!adpRunning) { + adpRunning = true; - // gestisco strobe... + // avvio fase raccolta dati + mAdapter.Begin(); - // di conseguenza leggo valori variati + // parte che eseguo SEMPRE: RECUPERO stato di tutti gli strobe/status + getStrobeStatus(); - // fix codici M/S/T - getCodMST(); + // acquisizione degli status + processStatus(); + // processing degli strobes di allarme + processAlarm(); + + // processing condizionale x parti non sempre valutate, 3 cicli a frequenza decrescente (HF/MF/LF) + if (ciclo == gatherCycle.HF) + { + // processo strobe restanti (non allarmi) + processStrobe(); + // fix codici M/S/T + getCodMST(); + } + else if (ciclo == gatherCycle.MF) + { + // leggo parametri a media freq (path, assi) + getPath(); + + getUnOp(); + + getAxis(); + } + else + { + // leggo parametri da config file + getConfigParam(); + // bassa freq leggo altri valori... + getProduzione(); + ///acquisisco dati su programma in esecuzione e dati generali (stato, orologio, power...) + getCurrProgramData(); + } + + // INVIO dati variati! + mAdapter.SendChanged(); + + // tolgo flag running + adpRunning = false; } - else if (ciclo == gatherCycle.MF) - { - // leggo parametri a media freq (path, assi) - getPath(); - - getUnOp(); - - getAxis(); - } - else - { - // leggo parametri da config file - getConfigParam(); - // bassa freq leggo altri valori... - getProduzione(); - ///acquisisco dati su programma in esecuzione e dati generali (stato, orologio, power...) - getCurrProgramData(); - } - - // INVIO dati variati! - mAdapter.SendChanged(); } /// @@ -899,9 +946,23 @@ namespace MTC_Sim } /// - /// recupero allarmi + /// verifica gli status attivi /// - public virtual void getAlarms() + public virtual void processStatus() + { + // da gestire su ogni adapter... + } + /// + /// processo tutti gli strobe attivi + /// + public virtual void processStrobe() + { + // da gestire su ogni adapter... + } + /// + /// processo gli strobe degli allarmi + /// + public virtual void processAlarm() { // da gestire su ogni adapter... } @@ -932,11 +993,11 @@ namespace MTC_Sim // da gestire su ogni adapter... } /// - /// dati relativi al RUN mode + /// recupero iniziale di TUTTI gli strobes/status attivi /// - public virtual void getCurrMode() + public virtual void getStrobeStatus() { - // da gestire su ogni adapter... + // da gestire su ogni adapter... legge tutto array STROBE!!! } #endregion @@ -1034,6 +1095,8 @@ namespace MTC_Sim public void checkProd() { + // non usiamo strobe x produzione...b +#if false if (utils.IsSetAny(STROBE_PLC, Strobe.PZ_OK | Strobe.PZ_KO)) { // leggo i valori pezzi OK / KO e li salvo (insieme a tot...) @@ -1050,7 +1113,8 @@ namespace MTC_Sim // resetto eventuali flag di lettura... if (utils.IsSetAll(STROBE_ADP, Strobe.PZ_OK)) STROBE_ADP -= Strobe.PZ_OK; if (utils.IsSetAll(STROBE_ADP, Strobe.PZ_KO)) STROBE_ADP -= Strobe.PZ_KO; - } + } +#endif } /// /// recupera pezzi OK (fare override!) diff --git a/MTC_Sim/MTC_Sim/CMS_MachineSim.cs b/MTC_Sim/MTC_Sim/CMS_MachineSim.cs index 6e0fad2..7c71cef 100644 --- a/MTC_Sim/MTC_Sim/CMS_MachineSim.cs +++ b/MTC_Sim/MTC_Sim/CMS_MachineSim.cs @@ -851,7 +851,7 @@ namespace MTC_Sim else if (stopped.Checked) answ.ExeMode = "STOPPED"; else if (ready.Checked) answ.ExeMode = "READY"; - + answ.ActiveAxes = "1 2 3 4 5 6"; // lascio sempre tutti attivi... answ.PathSel = cbPathSel.SelectedIndex; // FEED/SPEED diff --git a/MTC_Sim/MTC_Sim/utils.cs b/MTC_Sim/MTC_Sim/utils.cs index 537051b..c5beea9 100644 --- a/MTC_Sim/MTC_Sim/utils.cs +++ b/MTC_Sim/MTC_Sim/utils.cs @@ -189,6 +189,7 @@ namespace MTC_Sim public string ProgramName; public string ProgrRow; public string PartId; + public string ActiveAxes; public int PathFeedrate; public int PathFeedrateOver;