From d2459eaebc613fc9dd1f672f545a49d813e06bcf Mon Sep 17 00:00:00 2001 From: "Samuele E. Locatelli" Date: Fri, 13 May 2016 18:11:31 +0200 Subject: [PATCH] Completata review del simulatore/demo dell'adapter... --- AgentBin/simulator/CMS_DEMO.xml | 2 +- MTC_Sim/.vs/MTC_Sim/v14/.suo | Bin 137728 -> 222208 bytes MTC_Sim/MTC_Sim/AdapterConf/CMS_FANUC.xml | 4 - MTC_Sim/MTC_Sim/AdapterConf/Demo.xml | 77 ++++++-- MTC_Sim/MTC_Sim/AdapterDemo.cs | 60 ++---- MTC_Sim/MTC_Sim/AdapterFanuc.cs | 60 ++---- MTC_Sim/MTC_Sim/AdapterGeneric.cs | 91 +++++---- MTC_Sim/MTC_Sim/Appunti.txt | 43 ++--- MTC_Sim/MTC_Sim/CMS_MachineSim.Designer.cs | 167 +++++++++------- MTC_Sim/MTC_Sim/CMS_MachineSim.cs | 211 +++++++++++++-------- MTC_Sim/MTC_Sim/MTC_Sim.csproj | 2 +- MTC_Sim/MTC_Sim/SetupAdapter.cs | 1 - MTC_Sim/MTC_Sim/utils.cs | 39 +++- 13 files changed, 415 insertions(+), 342 deletions(-) diff --git a/AgentBin/simulator/CMS_DEMO.xml b/AgentBin/simulator/CMS_DEMO.xml index d441180..c42dde0 100644 --- a/AgentBin/simulator/CMS_DEMO.xml +++ b/AgentBin/simulator/CMS_DEMO.xml @@ -12,6 +12,7 @@ + @@ -152,7 +153,6 @@ - diff --git a/MTC_Sim/.vs/MTC_Sim/v14/.suo b/MTC_Sim/.vs/MTC_Sim/v14/.suo index d3fd76733f61c8d00d4370f94bac84ac5d088e28..8bc4f4a07b39c7d2b56c7f8b8835be23b2ed6355 100644 GIT binary patch literal 222208 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 Xg6D>AGTHf&7Zoe3|MUGUqyPU05GlnH delta 12236 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 diff --git a/MTC_Sim/MTC_Sim/AdapterConf/CMS_FANUC.xml b/MTC_Sim/MTC_Sim/AdapterConf/CMS_FANUC.xml index 833f715..e8a1c26 100644 --- a/MTC_Sim/MTC_Sim/AdapterConf/CMS_FANUC.xml +++ b/MTC_Sim/MTC_Sim/AdapterConf/CMS_FANUC.xml @@ -241,10 +241,6 @@ Path_01_SubMode FLAG#R10528.0:R10531.7 - - Path_01_UserAction - STROBE#R10520.4:R10520.6 - diff --git a/MTC_Sim/MTC_Sim/AdapterConf/Demo.xml b/MTC_Sim/MTC_Sim/AdapterConf/Demo.xml index 5b1babd..1e6f3e3 100644 --- a/MTC_Sim/MTC_Sim/AdapterConf/Demo.xml +++ b/MTC_Sim/MTC_Sim/AdapterConf/Demo.xml @@ -1,9 +1,8 @@ - Demo 1 CMS_ADAPTER_00 - Demo + DEMO VacPump_01 @@ -33,7 +32,7 @@ VacAct_01 Attuatore vuoto 1 Random - + ù VacAct_01_Count 0#15 @@ -156,39 +155,91 @@ Path_01_FeedRate - 0#15 + INT#D8888.0 Path_01_FeedOverr - 16#31 + INT#D8888.0 - Path_01_SpeedOverr - 32#47 + Path_01_RapidOverr + INT#D8888.0 Path_01_PosActX - 48#63 + FLOAT#D7777.0 Path_01_PosActY - 64#79 + FLOAT#D7777.1 Path_01_PosActZ - 80#95 + FLOAT#D7777.2 Path_01_PosActI - 96#111 + FLOAT#D7777.3 Path_01_PosActJ - 112#127 + FLOAT#D7777.4 Path_01_PosActK - 128#143 + 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 + CLASS + + + Path_01_CodG_Act + CLASS + + + Path_01_SubMode + FLAG#R10528.0:R10531.7 diff --git a/MTC_Sim/MTC_Sim/AdapterDemo.cs b/MTC_Sim/MTC_Sim/AdapterDemo.cs index 4ce555b..fcbfd8c 100644 --- a/MTC_Sim/MTC_Sim/AdapterDemo.cs +++ b/MTC_Sim/MTC_Sim/AdapterDemo.cs @@ -19,6 +19,7 @@ namespace MTC_Sim /// public AdapterDemo(CMS_MachineSim caller, AdapterConf adpConf) : base(caller, adpConf) { + if (utils.CRB("verbose")) lg.Info("Start init Adapter DEMO"); // IMPLICITO: carica da metodo base tutte le specifiche del conf... @@ -83,55 +84,22 @@ namespace MTC_Sim } - protected void addSystemAlarm(int numAllarme) - { - mAlarmSystem.Add(Condition.Level.FAULT, string.Format("ERR_{0:###}: Errore", numAllarme), string.Format("ERR_{0:###}", numAllarme)); - } - protected void addPlcAlarm(int numAllarme) - { - mAlarmPLC.Add(Condition.Level.FAULT, string.Format("ERR_{0:###}: Errore", numAllarme), string.Format("ERR_{0:###}", numAllarme)); - } - protected void addCncAlarm(int numAllarme) - { - mAlarmCNC.Add(Condition.Level.FAULT, string.Format("ERR_{0:###}: Errore", numAllarme), string.Format("ERR_{0:###}", numAllarme)); - } - protected void addGenericAlarm(DataRefItem allarme) - { - 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 processStrobe() { base.processStrobe(); - - if (parentForm.systemAlarm.Count > 0) - { - foreach (Int32 alarm in parentForm.systemAlarm) - { - addSystemAlarm(alarm); - } - } - if (parentForm.plcAlarm.Count > 0) - { - foreach (Int32 alarm in parentForm.plcAlarm) - { - addPlcAlarm(alarm); - } - } - if (parentForm.cncAlarm.Count > 0) - { - foreach (Int32 alarm in parentForm.cncAlarm) - { - addCncAlarm(alarm); - } - } - if (parentForm.genericAlarm.Count > 0) - { - foreach (DataRefItem alarm in parentForm.genericAlarm) - { - addGenericAlarm(alarm); - } - } + // qui forzo la gestione di update dei path & co... + getPath(); + getUnOp(); + getAxis(); + } + /// + /// non fa nulla perché recupera allarmi in vettore al singolo cambio... + /// + /// + /// + public override void refreshAlarmState(StFlag32 Alarm2Refresh, bool giveAck) + { + base.refreshAlarmState(Alarm2Refresh, giveAck); } public override void getPath() diff --git a/MTC_Sim/MTC_Sim/AdapterFanuc.cs b/MTC_Sim/MTC_Sim/AdapterFanuc.cs index ca34d9b..2f94a4e 100644 --- a/MTC_Sim/MTC_Sim/AdapterFanuc.cs +++ b/MTC_Sim/MTC_Sim/AdapterFanuc.cs @@ -23,7 +23,7 @@ namespace MTC_Sim FANUC_ref = (FANUC)Runtime.NC; if (utils.CRB("verbose")) lg.Info("FANUC_ref da CMSCncLib"); - + // disconnetto e connetto... if (utils.CRB("verbose")) lg.Info("FANUC: tryDisconnect"); tryDisconnect(); @@ -177,7 +177,7 @@ namespace MTC_Sim reloadDataFromFile(); // memorizzo allarme nel vettore ack.... - retACK_DW1 = utils.setBitOnStFlag(retACK_DW1, 1, bitNum); + retACK_DW1 = utils.setBitOnStFlag(retACK_DW1, true, bitNum); } // AREA strobe USER ACTION @@ -193,7 +193,7 @@ namespace MTC_Sim gestStrobeUserAction(bitNum, ref retACK_DW1, ref UserAction, "# RESET # "); // se ci sono state azioni (1 o +) le invio... - if (UserAction != "") vettPath[idxPath].mPathUserAction.Value = UserAction.Trim(); + if (UserAction != "") mUserAction.Value = UserAction.Trim(); } else { @@ -241,7 +241,7 @@ namespace MTC_Sim } } // memorizzo allarme nel vettore ack.... - retACK_DW1 = utils.setBitOnStFlag(retACK_DW1, 1, bitNum); + retACK_DW1 = utils.setBitOnStFlag(retACK_DW1, true, bitNum); } } /// @@ -266,7 +266,7 @@ namespace MTC_Sim // salvo evento UserAction in variabile... UserAction += azione; // memorizzo allarme nel vettore ack.... - retACK_DW1 = utils.setBitOnStFlag(retACK_DW1, 1, bitNum); + retACK_DW1 = utils.setBitOnStFlag(retACK_DW1, true, bitNum); } } /// @@ -338,7 +338,7 @@ namespace MTC_Sim } // segnalo allarme letto! memorizzo allarme nel vettore ack.... - retACK_DW0 = utils.setBitOnStFlag(retACK_DW0, 1, i); + retACK_DW0 = utils.setBitOnStFlag(retACK_DW0, true, i); } } // scrivo ack se richiesto!!! @@ -380,47 +380,13 @@ namespace MTC_Sim } } } - /// - /// processing strobe degli allarmi - /// - public override void processAlarm() - { - base.processAlarm(); - - if (AlarmFlags != null) - { - // 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++) - { - // leggo 32bit alla volta... - AlarmBlock = (StFlag32)BitConverter.ToUInt32(AlarmFlags, i * 4); - - for (int j = 0; j < 32; j++) - { - // converto! e aggiungo allarmi sollevati al corretto controller allarmi... - if (AlarmBlock.HasFlag((StFlag32)Math.Pow(2, 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; - } - } - } - } - } - } + ///// + ///// processing strobe degli allarmi + ///// + //public override void processAlarm() + //{ + // base.processAlarm(); + //} /// /// processing! /// diff --git a/MTC_Sim/MTC_Sim/AdapterGeneric.cs b/MTC_Sim/MTC_Sim/AdapterGeneric.cs index 0a73453..4c77533 100644 --- a/MTC_Sim/MTC_Sim/AdapterGeneric.cs +++ b/MTC_Sim/MTC_Sim/AdapterGeneric.cs @@ -293,10 +293,6 @@ namespace MTC_Sim /// public Event mPathSubMode; /// - /// Azione utente START/STOP/RESET - /// - public Event mPathUserAction; - /// /// Allarmi CNC del PATH /// public Condition mPathAlarmCNC; @@ -341,7 +337,6 @@ namespace MTC_Sim mPathActiveAxes = new Event(dataRefList[19].Key); mPathCodG_Act = new Event(dataRefList[20].Key); mPathSubMode = new Event(dataRefList[21].Key); - mPathUserAction = new Event(dataRefList[22].Key); mPathAlarmCNC = new Condition(string.Format("{0}_AlarmCNC", ident)); mPathAlarmPLC = new Condition(string.Format("{0}_AlarmPLC", ident)); } @@ -689,6 +684,10 @@ namespace MTC_Sim /// modalità funzionale /// public Event mFunctionalMode = new Event("FUNCT_MODE"); + /// + /// Azioni operatore (Start/Stop/reset) + /// + public Event mUserAction = new Event("UserAction"); @@ -758,6 +757,7 @@ namespace MTC_Sim // modalità esecutiva e funzionale mAdapter.AddDataItem(mFunctionalMode); + mAdapter.AddDataItem(mUserAction); // Pompe vuoto vettVacPump = new VacuumPomp[adpConf.nVacuumPump]; @@ -812,6 +812,7 @@ 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); @@ -833,7 +834,12 @@ namespace MTC_Sim mAdapter.AddDataItem(vettPath[i].mPathCurrProg); mAdapter.AddDataItem(vettPath[i].mPathCurrProgRowNum); mAdapter.AddDataItem(vettPath[i].mPathActiveAxes); + mAdapter.AddDataItem(vettPath[i].mPathCodG_Act); + mAdapter.AddDataItem(vettPath[i].mPathSubMode); // aggiungo condizioni allarme... + mAdapter.AddDataItem(vettPath[i].mPathAlarmCNC); + mAdapter.AddDataItem(vettPath[i].mPathAlarmPLC); + // altre aggiunte } // UnOp @@ -932,7 +938,7 @@ namespace MTC_Sim string linea; totRighe = File.ReadLines(fileName).Count(); // inizializzo - elencoSubMode.Clear(); + elencoSubMode = new Dictionary(); // carica da file... System.IO.StreamReader file = new System.IO.StreamReader(fileName); // leggo 1 linea alla volta... @@ -1219,7 +1225,39 @@ namespace MTC_Sim /// public virtual void processAlarm() { - // da gestire su ogni adapter... + if (AlarmFlags != null) + { + // 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++) + { + // leggo 32bit alla volta... + AlarmBlock = (StFlag32)BitConverter.ToUInt32(AlarmFlags, i * 4); + + for (int j = 0; j < 32; j++) + { + // converto! e aggiungo allarmi sollevati al corretto controller allarmi... + if (AlarmBlock.HasFlag((StFlag32)Math.Pow(2, 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; + } + } + } + } + } } /// @@ -1250,45 +1288,6 @@ namespace MTC_Sim public void checkPath() { -#if false - // controllo feed e velocità - if (utils.IsSetAny(STROBE_PLC, Strobe.FEED_SPEED)) - { - // leggo i valori feed/speed - mPathFeed.Value = FeedRate; - mPathFeedOver.Value = FeedRateOver; - mPathSpeedOver.Value = SpeedRateOver; - - // alzo flag lettura... - if (utils.IsSetAll(STROBE_PLC, Strobe.FEED_SPEED)) STROBE_ADP = STROBE_ADP | Strobe.FEED_SPEED; - - } - else - { - // resetto eventuali flag di lettura... - if (utils.IsSetAll(STROBE_ADP, Strobe.FEED_SPEED)) STROBE_ADP -= Strobe.FEED_SPEED; - } - - // controllo posizione... - if (utils.IsSetAny(STROBE_PLC, Strobe.POS_ACT)) - { - // leggo i valori posizione attuale - mPathPosActX.Value = PosAct.x; - mPathPosActY.Value = PosAct.y; - mPathPosActZ.Value = PosAct.z; - mPathPosActI.Value = PosAct.i; - mPathPosActJ.Value = PosAct.j; - mPathPosActK.Value = PosAct.k; - - // alzo flag lettura... - if (utils.IsSetAll(STROBE_PLC, Strobe.POS_ACT)) STROBE_ADP = STROBE_ADP | Strobe.POS_ACT; - } - else - { - // resetto eventuali flag di lettura... - if (utils.IsSetAll(STROBE_ADP, Strobe.POS_ACT)) STROBE_ADP -= Strobe.POS_ACT; - } -#endif } /// diff --git a/MTC_Sim/MTC_Sim/Appunti.txt b/MTC_Sim/MTC_Sim/Appunti.txt index fb2dd75..a6cbe3c 100644 --- a/MTC_Sim/MTC_Sim/Appunti.txt +++ b/MTC_Sim/MTC_Sim/Appunti.txt @@ -1,33 +1,18 @@ -#fix simulation: -- meno frequente modifiche produzione... -- posizione attuale/sim meno "ballerina" - - - -ATTENZIONE: aggiungere pos memoria x status e strobe x path - - 0) chiusura app --> FANUC_ref.disconnect -OK 1) rivedere GetBit (cambiare!!!) -OK 2) strobe allarmi --> su cambio fronte --> serve vettore stato COMPLETO allarmi -OK 3) lo strobe allarmi va inizializzato all'avvio (carica TUTTI i bit...) -OK 4) da strobe allarmi --> vettore allarmi -OK 5) CodS 5 cifre -OK 6) CodM/CodT 3 cifre - 7) lettura assi: vedere in progetto CMSConnect in OpPanel di FANUC la RefreshAxisNames() - 8) lettura strobe e registrazione NUOVO flusso EVENT x START/STOP/RESET (1 solo con 3 strobe separati) -->gestire!!! - - -Classi x lettura assi - -feedrate C:\Users\samuele.STEAMWAREWIN\Documents\VisualStudioProjects\CMS_orig\A02B-0207-K737_04.20\Document\SpecE\Position\cnc_actf.htm -pos abs C:\Users\samuele.STEAMWAREWIN\Documents\VisualStudioProjects\CMS_orig\A02B-0207-K737_04.20\Document\SpecE\Position\cnc_absolute2.htm - -ALL? C:\Users\samuele.STEAMWAREWIN\Documents\VisualStudioProjects\CMS_orig\A02B-0207-K737_04.20\Document\SpecE\Position\cnc_rdaxisdata.htm +OK 00) chiusura app --> FANUC_ref.disconnect +OK 01) rivedere GetBit (cambiare!!!) +OK 02) strobe allarmi --> su cambio fronte --> serve vettore stato COMPLETO allarmi +OK 03) lo strobe allarmi va inizializzato all'avvio (carica TUTTI i bit...) +OK 04) da strobe allarmi --> vettore allarmi +OK 05) CodS 5 cifre +OK 06) CodM/CodT 3 cifre + 07) lettura assi: vedere in progetto CMSConnect in OpPanel di FANUC la RefreshAxisNames() + - feedrate C:\Users\samuele.STEAMWAREWIN\Documents\VisualStudioProjects\CMS_orig\A02B-0207-K737_04.20\Document\SpecE\Position\cnc_actf.htm + - pos abs C:\Users\samuele.STEAMWAREWIN\Documents\VisualStudioProjects\CMS_orig\A02B-0207-K737_04.20\Document\SpecE\Position\cnc_absolute2.htm + - ALL? C:\Users\samuele.STEAMWAREWIN\Documents\VisualStudioProjects\CMS_orig\A02B-0207-K737_04.20\Document\SpecE\Position\cnc_rdaxisdata.htm +OK 08) lettura strobe e registrazione NUOVO flusso EVENT x START/STOP/RESET (1 solo con 3 strobe separati) --> gestire!!! +OK 09) update gestione SUB MODE +OK 10) riallineamento simulatore generico - -- update gestione SUB MODE -- update gestione 4 nuovi strobe -- riallineamento simulatore generico \ No newline at end of file diff --git a/MTC_Sim/MTC_Sim/CMS_MachineSim.Designer.cs b/MTC_Sim/MTC_Sim/CMS_MachineSim.Designer.cs index 40d270b..9f6969f 100644 --- a/MTC_Sim/MTC_Sim/CMS_MachineSim.Designer.cs +++ b/MTC_Sim/MTC_Sim/CMS_MachineSim.Designer.cs @@ -137,6 +137,12 @@ this.tabCtrlMain = new System.Windows.Forms.TabControl(); this.tpStatus = new System.Windows.Forms.TabPage(); this.groupBox6 = new System.Windows.Forms.GroupBox(); + this.STATUS_ACK_DW3 = new System.Windows.Forms.TextBox(); + this.label52 = new System.Windows.Forms.Label(); + this.STATUS_ACK_DW2 = new System.Windows.Forms.TextBox(); + this.label51 = new System.Windows.Forms.Label(); + this.STATUS_ACK_DW1 = new System.Windows.Forms.TextBox(); + this.label50 = new System.Windows.Forms.Label(); this.STATUS_ACK_DW0 = new System.Windows.Forms.TextBox(); this.label48 = new System.Windows.Forms.Label(); this.groupBox1 = new System.Windows.Forms.GroupBox(); @@ -202,12 +208,7 @@ this.lblCodaM = new System.Windows.Forms.Label(); this.addCodM = new System.Windows.Forms.TextBox(); this.label20 = new System.Windows.Forms.Label(); - this.STATUS_ACK_DW1 = new System.Windows.Forms.TextBox(); - this.label50 = new System.Windows.Forms.Label(); - this.STATUS_ACK_DW2 = new System.Windows.Forms.TextBox(); - this.label51 = new System.Windows.Forms.Label(); - this.STATUS_ACK_DW3 = new System.Windows.Forms.TextBox(); - this.label52 = new System.Windows.Forms.Label(); + this.ErrRT_03 = new System.Windows.Forms.CheckBox(); this.groupBox4.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.PosAct)).BeginInit(); this.groupBox3.SuspendLayout(); @@ -239,8 +240,9 @@ this.PlcErr_02.Name = "PlcErr_02"; this.PlcErr_02.Size = new System.Drawing.Size(72, 17); this.PlcErr_02.TabIndex = 6; - this.PlcErr_02.Text = "PlcErr_02"; + this.PlcErr_02.Text = "PlcErr_05"; this.PlcErr_02.UseVisualStyleBackColor = true; + this.PlcErr_02.CheckedChanged += new System.EventHandler(this.SysErr_01_CheckedChanged); // // gather // @@ -451,8 +453,9 @@ this.PlcErr_03.Name = "PlcErr_03"; this.PlcErr_03.Size = new System.Drawing.Size(72, 17); this.PlcErr_03.TabIndex = 5; - this.PlcErr_03.Text = "PlcErr_03"; + this.PlcErr_03.Text = "PlcErr_06"; this.PlcErr_03.UseVisualStyleBackColor = true; + this.PlcErr_03.CheckedChanged += new System.EventHandler(this.SysErr_01_CheckedChanged); // // PlcErr_01 // @@ -461,11 +464,13 @@ this.PlcErr_01.Name = "PlcErr_01"; this.PlcErr_01.Size = new System.Drawing.Size(72, 17); this.PlcErr_01.TabIndex = 4; - this.PlcErr_01.Text = "PlcErr_01"; + this.PlcErr_01.Text = "PlcErr_04"; this.PlcErr_01.UseVisualStyleBackColor = true; + this.PlcErr_01.CheckedChanged += new System.EventHandler(this.SysErr_01_CheckedChanged); // // groupBox3 // + this.groupBox3.Controls.Add(this.ErrRT_03); this.groupBox3.Controls.Add(this.ErrRT_02); this.groupBox3.Controls.Add(this.CncErr_02); this.groupBox3.Controls.Add(this.CncErr_03); @@ -489,10 +494,11 @@ this.ErrRT_02.AutoSize = true; this.ErrRT_02.Location = new System.Drawing.Point(268, 43); this.ErrRT_02.Name = "ErrRT_02"; - this.ErrRT_02.Size = new System.Drawing.Size(64, 17); + this.ErrRT_02.Size = new System.Drawing.Size(67, 17); this.ErrRT_02.TabIndex = 10; - this.ErrRT_02.Text = "ERR_fill"; + this.ErrRT_02.Text = "ERR_11"; this.ErrRT_02.UseVisualStyleBackColor = true; + this.ErrRT_02.CheckedChanged += new System.EventHandler(this.SysErr_01_CheckedChanged); // // CncErr_02 // @@ -501,8 +507,9 @@ this.CncErr_02.Name = "CncErr_02"; this.CncErr_02.Size = new System.Drawing.Size(76, 17); this.CncErr_02.TabIndex = 9; - this.CncErr_02.Text = "CncErr_02"; + this.CncErr_02.Text = "CncErr_08"; this.CncErr_02.UseVisualStyleBackColor = true; + this.CncErr_02.CheckedChanged += new System.EventHandler(this.SysErr_01_CheckedChanged); // // CncErr_03 // @@ -511,8 +518,9 @@ this.CncErr_03.Name = "CncErr_03"; this.CncErr_03.Size = new System.Drawing.Size(76, 17); this.CncErr_03.TabIndex = 8; - this.CncErr_03.Text = "CncErr_03"; + this.CncErr_03.Text = "CncErr_09"; this.CncErr_03.UseVisualStyleBackColor = true; + this.CncErr_03.CheckedChanged += new System.EventHandler(this.SysErr_01_CheckedChanged); // // CncErr_01 // @@ -521,8 +529,9 @@ this.CncErr_01.Name = "CncErr_01"; this.CncErr_01.Size = new System.Drawing.Size(76, 17); this.CncErr_01.TabIndex = 7; - this.CncErr_01.Text = "CncErr_01"; + this.CncErr_01.Text = "CncErr_07"; this.CncErr_01.UseVisualStyleBackColor = true; + this.CncErr_01.CheckedChanged += new System.EventHandler(this.SysErr_01_CheckedChanged); // // SysErr_03 // @@ -533,16 +542,18 @@ this.SysErr_03.TabIndex = 3; this.SysErr_03.Text = "SysErr_03"; this.SysErr_03.UseVisualStyleBackColor = true; + this.SysErr_03.CheckedChanged += new System.EventHandler(this.SysErr_01_CheckedChanged); // // ErrRT_01 // this.ErrRT_01.AutoSize = true; this.ErrRT_01.Location = new System.Drawing.Point(268, 20); this.ErrRT_01.Name = "ErrRT_01"; - this.ErrRT_01.Size = new System.Drawing.Size(78, 17); + this.ErrRT_01.Size = new System.Drawing.Size(67, 17); this.ErrRT_01.TabIndex = 2; - this.ErrRT_01.Text = "ERR_temp"; + this.ErrRT_01.Text = "ERR_10"; this.ErrRT_01.UseVisualStyleBackColor = true; + this.ErrRT_01.CheckedChanged += new System.EventHandler(this.SysErr_01_CheckedChanged); // // SysErr_02 // @@ -553,6 +564,7 @@ this.SysErr_02.TabIndex = 1; this.SysErr_02.Text = "SysErr_02"; this.SysErr_02.UseVisualStyleBackColor = true; + this.SysErr_02.CheckedChanged += new System.EventHandler(this.SysErr_01_CheckedChanged); // // SysErr_01 // @@ -563,6 +575,7 @@ this.SysErr_01.TabIndex = 0; this.SysErr_01.Text = "SysErr_01"; this.SysErr_01.UseVisualStyleBackColor = true; + this.SysErr_01.CheckedChanged += new System.EventHandler(this.SysErr_01_CheckedChanged); // // groupBox2 // @@ -1102,9 +1115,9 @@ this.label28.AutoSize = true; this.label28.Location = new System.Drawing.Point(10, 91); this.label28.Name = "label28"; - this.label28.Size = new System.Drawing.Size(67, 13); + this.label28.Size = new System.Drawing.Size(64, 13); this.label28.TabIndex = 31; - this.label28.Text = "Speed Over."; + this.label28.Text = "Rapid Over."; // // hsPathSpeedOver // @@ -1263,10 +1276,61 @@ this.groupBox6.TabStop = false; this.groupBox6.Text = "ACK ADP --> PLC"; // + // STATUS_ACK_DW3 + // + this.STATUS_ACK_DW3.Font = new System.Drawing.Font("Microsoft Sans Serif", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.STATUS_ACK_DW3.Location = new System.Drawing.Point(85, 118); + this.STATUS_ACK_DW3.Name = "STATUS_ACK_DW3"; + this.STATUS_ACK_DW3.Size = new System.Drawing.Size(293, 24); + this.STATUS_ACK_DW3.TabIndex = 59; + // + // label52 + // + this.label52.AutoSize = true; + this.label52.Location = new System.Drawing.Point(15, 126); + this.label52.Name = "label52"; + this.label52.Size = new System.Drawing.Size(59, 13); + this.label52.TabIndex = 58; + this.label52.Text = "ACK_DW3"; + // + // STATUS_ACK_DW2 + // + this.STATUS_ACK_DW2.Font = new System.Drawing.Font("Microsoft Sans Serif", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.STATUS_ACK_DW2.Location = new System.Drawing.Point(85, 83); + this.STATUS_ACK_DW2.Name = "STATUS_ACK_DW2"; + this.STATUS_ACK_DW2.Size = new System.Drawing.Size(293, 24); + this.STATUS_ACK_DW2.TabIndex = 57; + // + // label51 + // + this.label51.AutoSize = true; + this.label51.Location = new System.Drawing.Point(15, 91); + this.label51.Name = "label51"; + this.label51.Size = new System.Drawing.Size(59, 13); + this.label51.TabIndex = 56; + this.label51.Text = "ACK_DW2"; + // + // STATUS_ACK_DW1 + // + this.STATUS_ACK_DW1.Font = new System.Drawing.Font("Microsoft Sans Serif", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.STATUS_ACK_DW1.Location = new System.Drawing.Point(85, 48); + this.STATUS_ACK_DW1.Name = "STATUS_ACK_DW1"; + this.STATUS_ACK_DW1.Size = new System.Drawing.Size(293, 24); + this.STATUS_ACK_DW1.TabIndex = 55; + // + // label50 + // + this.label50.AutoSize = true; + this.label50.Location = new System.Drawing.Point(15, 56); + this.label50.Name = "label50"; + this.label50.Size = new System.Drawing.Size(59, 13); + this.label50.TabIndex = 54; + this.label50.Text = "ACK_DW1"; + // // STATUS_ACK_DW0 // this.STATUS_ACK_DW0.Font = new System.Drawing.Font("Microsoft Sans Serif", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.STATUS_ACK_DW0.Location = new System.Drawing.Point(85, 11); + this.STATUS_ACK_DW0.Location = new System.Drawing.Point(85, 15); this.STATUS_ACK_DW0.Name = "STATUS_ACK_DW0"; this.STATUS_ACK_DW0.Size = new System.Drawing.Size(293, 24); this.STATUS_ACK_DW0.TabIndex = 53; @@ -1349,7 +1413,7 @@ this.tbConf.Location = new System.Drawing.Point(4, 22); this.tbConf.Name = "tbConf"; this.tbConf.Padding = new System.Windows.Forms.Padding(3); - this.tbConf.Size = new System.Drawing.Size(772, 643); + this.tbConf.Size = new System.Drawing.Size(777, 643); this.tbConf.TabIndex = 1; this.tbConf.Text = "XML CONFIG"; // @@ -1359,7 +1423,7 @@ this.wbXmlConf.Location = new System.Drawing.Point(3, 3); this.wbXmlConf.MinimumSize = new System.Drawing.Size(20, 20); this.wbXmlConf.Name = "wbXmlConf"; - this.wbXmlConf.Size = new System.Drawing.Size(766, 637); + this.wbXmlConf.Size = new System.Drawing.Size(771, 637); this.wbXmlConf.TabIndex = 0; // // tpSIM @@ -1379,7 +1443,7 @@ this.tpSIM.Controls.Add(this.groupBox12); this.tpSIM.Location = new System.Drawing.Point(4, 22); this.tpSIM.Name = "tpSIM"; - this.tpSIM.Size = new System.Drawing.Size(772, 643); + this.tpSIM.Size = new System.Drawing.Size(777, 643); this.tpSIM.TabIndex = 2; this.tpSIM.Text = "SIMULATION"; // @@ -1917,56 +1981,16 @@ this.label20.TabIndex = 52; this.label20.Text = "AddM"; // - // STATUS_ACK_DW1 + // ErrRT_03 // - this.STATUS_ACK_DW1.Font = new System.Drawing.Font("Microsoft Sans Serif", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.STATUS_ACK_DW1.Location = new System.Drawing.Point(85, 48); - this.STATUS_ACK_DW1.Name = "STATUS_ACK_DW1"; - this.STATUS_ACK_DW1.Size = new System.Drawing.Size(293, 24); - this.STATUS_ACK_DW1.TabIndex = 55; - // - // label50 - // - this.label50.AutoSize = true; - this.label50.Location = new System.Drawing.Point(15, 56); - this.label50.Name = "label50"; - this.label50.Size = new System.Drawing.Size(59, 13); - this.label50.TabIndex = 54; - this.label50.Text = "ACK_DW1"; - // - // STATUS_ACK_DW2 - // - this.STATUS_ACK_DW2.Font = new System.Drawing.Font("Microsoft Sans Serif", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.STATUS_ACK_DW2.Location = new System.Drawing.Point(85, 83); - this.STATUS_ACK_DW2.Name = "STATUS_ACK_DW2"; - this.STATUS_ACK_DW2.Size = new System.Drawing.Size(293, 24); - this.STATUS_ACK_DW2.TabIndex = 57; - // - // label51 - // - this.label51.AutoSize = true; - this.label51.Location = new System.Drawing.Point(15, 91); - this.label51.Name = "label51"; - this.label51.Size = new System.Drawing.Size(59, 13); - this.label51.TabIndex = 56; - this.label51.Text = "ACK_DW2"; - // - // STATUS_ACK_DW3 - // - this.STATUS_ACK_DW3.Font = new System.Drawing.Font("Microsoft Sans Serif", 11F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.STATUS_ACK_DW3.Location = new System.Drawing.Point(85, 118); - this.STATUS_ACK_DW3.Name = "STATUS_ACK_DW3"; - this.STATUS_ACK_DW3.Size = new System.Drawing.Size(293, 24); - this.STATUS_ACK_DW3.TabIndex = 59; - // - // label52 - // - this.label52.AutoSize = true; - this.label52.Location = new System.Drawing.Point(15, 126); - this.label52.Name = "label52"; - this.label52.Size = new System.Drawing.Size(59, 13); - this.label52.TabIndex = 58; - this.label52.Text = "ACK_DW3"; + this.ErrRT_03.AutoSize = true; + this.ErrRT_03.Location = new System.Drawing.Point(268, 66); + this.ErrRT_03.Name = "ErrRT_03"; + this.ErrRT_03.Size = new System.Drawing.Size(67, 17); + this.ErrRT_03.TabIndex = 11; + this.ErrRT_03.Text = "ERR_12"; + this.ErrRT_03.UseVisualStyleBackColor = true; + this.ErrRT_03.CheckedChanged += new System.EventHandler(this.SysErr_01_CheckedChanged); // // CMS_MachineSim // @@ -2207,6 +2231,7 @@ private System.Windows.Forms.Label label51; private System.Windows.Forms.TextBox STATUS_ACK_DW1; private System.Windows.Forms.Label label50; + private System.Windows.Forms.CheckBox ErrRT_03; } } diff --git a/MTC_Sim/MTC_Sim/CMS_MachineSim.cs b/MTC_Sim/MTC_Sim/CMS_MachineSim.cs index 6d8d0cb..ddd2686 100644 --- a/MTC_Sim/MTC_Sim/CMS_MachineSim.cs +++ b/MTC_Sim/MTC_Sim/CMS_MachineSim.cs @@ -19,6 +19,7 @@ using NLog; namespace MTC_Sim { using MTConnect; + using System.Collections; using System.Configuration; using System.Diagnostics; using System.IO; @@ -145,7 +146,7 @@ namespace MTC_Sim Power = 1000; AccTime = 1440 * 365; - OPERATOR_ID.Text = "M9999"; + OPERATOR_ID.Text = "OP9999"; STATUS_STRB_DW0.Text = utils.binaryForm(0); STATUS_STRB_DW1.Text = utils.binaryForm(0); @@ -249,7 +250,7 @@ namespace MTC_Sim // inizio a riportare che sto eseguendo.. MainProgrBar.PerformStep(); - // eseguo eventuali simulazioni x dati/flags + // eseguo eventuali simulazioni x dati/flags SE RICHIESTO simulateData(); // check esecuzione FastTask @@ -287,7 +288,7 @@ namespace MTC_Sim private void checkSlowTask() { slowCount--; - if(slowCount<=0) + if (slowCount <= 0) { slowCount = utils.CRI("slowCount"); //lg.Info("Reset slowCount"); @@ -342,7 +343,7 @@ namespace MTC_Sim agObj.mMessage.ForceChanged(); agObj.mAdapter.SendChanged(); } - + // apro eseguibile dump private void dump_Click(object sender, EventArgs e) { @@ -356,7 +357,7 @@ namespace MTC_Sim Process.Start(string.Format(@"{0}\dump\dump.exe", path)); } } - + #region classi x simulazione valori vari /// @@ -373,10 +374,25 @@ namespace MTC_Sim { PROG_ROW_NUM.Text = rnd.Next(1, 10000).ToString(); } - // ora controllo se ci siano eventi M/S/T x alzare flag... - if (agObj.codaM.Count > 0) agObj.STROBE_PLC = agObj.STROBE_PLC | Strobe.M_CODE; - if (agObj.codaS.Count > 0) agObj.STROBE_PLC = agObj.STROBE_PLC | Strobe.S_CODE; - if (agObj.codaT.Count > 0) agObj.STROBE_PLC = agObj.STROBE_PLC | Strobe.T_CODE; + + + // cambio posizioni 6% casi: aggiungo codici M + if (rnd.Next(0, 100) > 95) + { + agObj.appendCodeMST("M", rnd.Next(1, 30).ToString()); + } + + // cambio posizioni 3% casi: aggiungo codici S + if (rnd.Next(0, 100) > 97) + { + agObj.appendCodeMST("S", rnd.Next(100, 10000).ToString()); + } + // cambio posizioni 3% casi: aggiungo codici T + if (rnd.Next(0, 100) > 97) + { + agObj.appendCodeMST("T", rnd.Next(1, 100).ToString()); + } + // aggiungo 1 pz al totale nel 0.3% dei casi (-->TC circa 333 x tick)... if (rnd.Next(0, 1000) > 997) @@ -468,6 +484,59 @@ namespace MTC_Sim agObj.STATUS_FLAG = agObj.STATUS_FLAG | StatusBitMap.AL03; } + // nel 2% dei casi imposto un RUN MODE diverso da RUN + if (rnd.Next(0, 100) > 98) + { + int codSel = rnd.Next(1, 3); + switch (codSel) + { + case 1: + manual.Checked = true; + break; + case 2: + mdi.Checked = true; + break; + default: + edit.Checked = true; + break; + } + } + // nel 3% degli altri casi riporto RUN MODE a RUN + else + { + if (rnd.Next(0, 100) > 97) + { + automatic.Checked = true; + } + } + + + // nel 2% dei casi imposto un EXE MODE diverso da AUTO + if (rnd.Next(0, 100) > 98) + { + int codSel = rnd.Next(1, 3); + switch (codSel) + { + case 1: + ready.Checked = true; + break; + case 2: + stopped.Checked = true; + break; + default: + feedhold.Checked = true; + break; + } + } + // nel 3% degli altri casi riporto EXE MODE a AUTO + else + { + if (rnd.Next(0, 100) > 97) + { + running.Checked = true; + } + } + // controllo se ci sia il flag di lettura di un evento M/S/T nel qual caso lo abbasso... @@ -506,7 +575,25 @@ namespace MTC_Sim if (utils.IsSetAll(agObj.STROBE_PLC, Strobe.POS_ACT)) agObj.STROBE_PLC -= Strobe.POS_ACT; } + +#if false + // ora controllo se ci siano da alzare flag... + utils.setBitOnStFlag(agObj.Strobes, (agObj.codaM.Count > 0), 32); + utils.setBitOnStFlag(agObj.Strobes, (agObj.codaS.Count > 0), 33); + utils.setBitOnStFlag(agObj.Strobes, (agObj.codaT.Count > 0), 34); + utils.setBitOnStFlag(agObj.Strobes, (agObj.AlarmFlags[0] != 0), 0); + utils.setBitOnStFlag(agObj.Strobes, (agObj.AlarmFlags[1] != 0), 1); + utils.setBitOnStFlag(agObj.Strobes, (agObj.AlarmFlags[2] != 0), 2); + utils.setBitOnStFlag(agObj.Strobes, (agObj.AlarmFlags[3] != 0), 3); + utils.setBitOnStFlag(agObj.Strobes, (agObj.AlarmFlags[4] != 0), 4); + utils.setBitOnStFlag(agObj.Strobes, (agObj.AlarmFlags[5] != 0), 5); + utils.setBitOnStFlag(agObj.Strobes, (agObj.AlarmFlags[6] != 0), 6); + utils.setBitOnStFlag(agObj.Strobes, (agObj.AlarmFlags[7] != 0), 7); +#endif + + refreshVisualStrobes(); + refreshCodeMST(); } } @@ -540,7 +627,7 @@ namespace MTC_Sim { if (addCodM.Text.Trim() != "") { - agObj.appendCodeMST("M",addCodM.Text.Trim()); + agObj.appendCodeMST("M", addCodM.Text.Trim()); addCodM.Text = ""; } refreshCodeMST(); @@ -731,7 +818,7 @@ namespace MTC_Sim answ.Status = stop.Enabled; answ.Power = Power; answ.AccTime = AccTime; - answ.EmrStop = estop.Checked; + answ.EmrStop = estop.Checked; answ.FuncMode = ((KeyValuePair)functionalMode.SelectedItem).Key; @@ -751,7 +838,7 @@ namespace MTC_Sim else if (feedhold.Checked) agObj.STATUS_FLAG = agObj.STATUS_FLAG | StatusBitMap.EM_FEEDHOLD; else if (stopped.Checked) agObj.STATUS_FLAG = agObj.STATUS_FLAG | StatusBitMap.EM_STOP; else if (ready.Checked) agObj.STATUS_FLAG = agObj.STATUS_FLAG | StatusBitMap.EM_READY; - if(answ.FuncMode!= "1") agObj.STATUS_FLAG = agObj.STATUS_FLAG | StatusBitMap.HM; + if (answ.FuncMode != "1") agObj.STATUS_FLAG = agObj.STATUS_FLAG | StatusBitMap.HM; // ritorno oggetto! return answ; @@ -910,6 +997,10 @@ namespace MTC_Sim float.TryParse(cells[5].Value.ToString(), out posAct.k); answ.PathPosAct = posAct; + // aggiungo altri oggetti... + answ.CodG_Act = "G01 G10 G34 G60"; + answ.SubMode = string.Format("# Asse selezionato {0} #", cbAxNum.SelectedIndex); + // ritorno oggetto! return answ; } @@ -946,10 +1037,10 @@ namespace MTC_Sim int.TryParse(uoNumCU.Text, out answ.UnOpNumCU); answ.UnOpStatus = uoStatus.Text; int.TryParse(uoVitaRes.Text, out answ.UnOpVitaRes); - answ.UnOpSpeed=uoSpeed.Value; - answ.UnOpLoad=uoLoad.Value; + answ.UnOpSpeed = uoSpeed.Value; + answ.UnOpLoad = uoLoad.Value; int.TryParse(uoAccTime.Text, out answ.UnOpAccTime); - + // ritorno oggetto! return answ; } @@ -1061,74 +1152,36 @@ namespace MTC_Sim #endregion - #region gestione allarmi - - /// - /// Vettore errori system - /// - public List systemAlarm - { - get - { - List answ = new List(); - // controllo se ho valori errori checked... - if (SysErr_01.Checked) answ.Add(1); - if (SysErr_02.Checked) answ.Add(2); - if (SysErr_03.Checked) answ.Add(3); - - return answ; - } - } - /// - /// Vettore errori PLC - /// - public List plcAlarm - { - get - { - List answ = new List(); - // controllo se ho valori errori checked... - if (PlcErr_01.Checked) answ.Add(1); - if (PlcErr_02.Checked) answ.Add(2); - if (PlcErr_03.Checked) answ.Add(3); - - return answ; - } - } - /// - /// Vettore errori CNC - /// - public List cncAlarm - { - get - { - List answ = new List(); - // controllo se ho valori errori checked... - if (CncErr_01.Checked) answ.Add(1); - if (CncErr_02.Checked) answ.Add(2); - if (CncErr_03.Checked) answ.Add(3); - - return answ; - } - } - - public List> genericAlarm - { - get - { - List> answ = new List>(); - if (ErrRT_01.Checked) answ.Add(new DataRefItem(1, "TEMP")); - if (ErrRT_02.Checked) answ.Add(new DataRefItem(1, "FILL")); - - return answ; - } - } - - #endregion private void CMS_MachineSim_FormClosing(object sender, FormClosingEventArgs e) { agObj.tryDisconnect(); } + + private void SysErr_01_CheckedChanged(object sender, EventArgs e) + { + // aggiorno il vettore allarmi (da 128 byte) sulla base della selezione dei checkbox (per i primi 9...) - ultimi 3 selezionano 8 allarmi ciascuno... + BitArray bitArray = new BitArray(1024); + + bitArray[7] = SysErr_01.Checked; + bitArray[6] = SysErr_02.Checked; + bitArray[5] = SysErr_03.Checked; + bitArray[4] = PlcErr_01.Checked; + bitArray[3] = PlcErr_02.Checked; + bitArray[2] = PlcErr_03.Checked; + bitArray[1] = CncErr_01.Checked; + bitArray[0] = CncErr_02.Checked; + bitArray[15] = CncErr_03.Checked; + + // ne assegno 8 alla volta... + for (int i = 0; i < 8; i++) + { + bitArray[16 + i] = ErrRT_01.Checked; + bitArray[24 + i] = ErrRT_02.Checked; + bitArray[32 + i] = ErrRT_03.Checked; + } + byte[] newAlarm = utils.ToByteArray(bitArray); + Buffer.BlockCopy(newAlarm, 0, agObj.AlarmFlags, 0, 32); + } } } diff --git a/MTC_Sim/MTC_Sim/MTC_Sim.csproj b/MTC_Sim/MTC_Sim/MTC_Sim.csproj index cb10d0c..a0578aa 100644 --- a/MTC_Sim/MTC_Sim/MTC_Sim.csproj +++ b/MTC_Sim/MTC_Sim/MTC_Sim.csproj @@ -127,7 +127,7 @@ PreserveNewest - + PreserveNewest diff --git a/MTC_Sim/MTC_Sim/SetupAdapter.cs b/MTC_Sim/MTC_Sim/SetupAdapter.cs index 0a032b3..f9a1ee1 100644 --- a/MTC_Sim/MTC_Sim/SetupAdapter.cs +++ b/MTC_Sim/MTC_Sim/SetupAdapter.cs @@ -360,7 +360,6 @@ namespace MTC_Sim // aggiunto 2016.05.10 listaDR.Add(new DataRefItem(string.Format("Path_{0:00}_CodG_Act", i + 1), "CLASS")); listaDR.Add(new DataRefItem(string.Format("Path_{0:00}_SubMode", i + 1), "FLAG#R10528.0:R10531.7")); - listaDR.Add(new DataRefItem(string.Format("Path_{0:00}_UserAction", i + 1), "STROBE#R10520.4:R10520.6")); 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 bb29ba4..18d278a 100644 --- a/MTC_Sim/MTC_Sim/utils.cs +++ b/MTC_Sim/MTC_Sim/utils.cs @@ -1,4 +1,5 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Configuration; using System.Data; @@ -116,17 +117,19 @@ namespace MTC_Sim return answ; } /// - /// imposta un bita al valore richiesto duplicando il valore IN come OUT + /// imposta un bit al valore richiesto duplicando il valore IN come OUT /// /// valore originale da aggiornare - /// valore richiesto x il bit (0/1) + /// valore richiesto x il bit (0/1) /// indice bit, 0 based (es: 0..31 per 32bit) /// - public static byte[] setBitOnStFlag(byte[] original, int bitVal, int bitIndex) + public static byte[] setBitOnStFlag(byte[] original, bool bitBool, int bitIndex) { + int bitVal = 0; + if (bitBool) bitVal = 1; // risposta è identica ad originale... byte[] answ = original; - // verifico se il bit è 0/1 + // verifico se il bit è 0/1b if (bitVal <= 1 && bitVal >= 0) { // verifico se si possa aggiornare il bit richiesto (<= al totale dei bit...) @@ -155,6 +158,34 @@ namespace MTC_Sim } return answ; } + /// + /// Converte un bitarray a byte[] + /// + /// + /// + public static byte[] ToByteArray(BitArray bits) + { + int numBytes = bits.Count / 8; + if (bits.Count % 8 != 0) numBytes++; + + byte[] bytes = new byte[numBytes]; + int byteIndex = 0, bitIndex = 0; + + for (int i = 0; i < bits.Count; i++) + { + if (bits[i]) + bytes[byteIndex] |= (byte)(1 << (7 - bitIndex)); + + bitIndex++; + if (bitIndex == 8) + { + bitIndex = 0; + byteIndex++; + } + } + + return bytes; + } } /// /// Oggetto timing x archiviazione dati perfomances