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 d3fd767..8bc4f4a 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 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