diff --git a/MTC_Adapter/MTC_Adapter/AdapterESA.cs b/MTC_Adapter/MTC_Adapter/AdapterESA.cs index 247b176..5408c08 100644 --- a/MTC_Adapter/MTC_Adapter/AdapterESA.cs +++ b/MTC_Adapter/MTC_Adapter/AdapterESA.cs @@ -231,6 +231,204 @@ namespace MTC_Adapter } } + /// + /// Carica ed acquisisce dati del buffer WORD (16 bit) di memoria + /// + protected void getIotMem_Word() + { + if (connectionOk) + { + // leggo TUTTO il blocco di memoria + inizio = DateTime.Now; + ncDevice.ReadBufferWord(); + if (utils.CRB("recTime")) TimingData.addResult(string.Format("R{0}-PLC_IOT-Word", ncDevice.PLC_MemoryAreaIOT_Word.Length), DateTime.Now.Subtract(inizio).Ticks); + } + else + { + lg.Error("Errore connessione mancante in getIotMem_Word"); + } + + int numero = 0; + int byteNum = 0; + // Processing area WORD + for (int i = 0; i < mapIOT_Word.Length; i++) + { + int.TryParse(mapIOT_Word[i].memAddr, out byteNum); + if (mapIOT_Word[i].varName.StartsWith("IOT_S_MD_")) + { + // recupero NUMERO + try + { + numero = Convert.ToInt32(mapIOT_Word[i].varName.Replace("IOT_S_MD_", "")); + vettUnOp[numero - 1].mUnOpSpeed.Value = ncDevice.PLC_MemoryAreaIOT_Word[byteNum]; + } + catch + { + // se non trovo --> 1! + numero = 1; + } + } + else if (mapIOT_Word[i].varName.StartsWith("IOT_T_MD_")) + { + // recupero NUMERO + try + { + numero = Convert.ToInt32(mapIOT_Word[i].varName.Replace("IOT_T_MD_", "")); + vettUnOp[numero - 1].mUnOpToolId.Value = ncDevice.PLC_MemoryAreaIOT_Word[byteNum]; + } + catch + { + // se non trovo --> 1! + numero = 1; + } + } + else if (mapIOT_Word[i].varName.StartsWith("IOT_C_H_VAC_")) + { + // recupero NUMERO + try + { + numero = Convert.ToInt32(mapIOT_Word[i].varName.Replace("IOT_C_H_VAC_", "")); + vettVacAct[numero - 1].mVacActCount.Value = ncDevice.PLC_MemoryAreaIOT_Word[byteNum]; + } + catch + { + // se non trovo --> 1! + numero = 1; + } + } + else if (mapIOT_Word[i].varName.StartsWith("IOT_C_TC_")) + { + // recupero NUMERO + try + { + numero = Convert.ToInt32(mapIOT_Word[i].varName.Replace("IOT_C_TC_", "")); + vettUnOp[numero - 1].mUnOpNumCU.Value = ncDevice.PLC_MemoryAreaIOT_Word[byteNum]; + } + catch + { + // se non trovo --> 1! + numero = 1; + } + } + else if (mapIOT_Word[i].varName.StartsWith("IOT_C_H_MD_")) + { + // recupero NUMERO + try + { + numero = Convert.ToInt32(mapIOT_Word[i].varName.Replace("IOT_C_H_MD_", "")); + vettUnOp[numero - 1].mUnOpAccTime.Value = ncDevice.PLC_MemoryAreaIOT_Word[byteNum]; + } + catch + { + // se non trovo --> 1! + numero = 1; + } + } + } + } + /// + /// Carica ed acquisisce dati del buffer DWORD (32 bit) di memoria + /// + protected void getIotMem_DWord() + { + if (connectionOk) + { + // leggo TUTTO il blocco di memoria + inizio = DateTime.Now; + ncDevice.ReadBufferDWord(); + if (utils.CRB("recTime")) TimingData.addResult(string.Format("R{0}-PLC_IOT-DWord", ncDevice.PLC_MemoryAreaIOT_DWord.Length), DateTime.Now.Subtract(inizio).Ticks); + } + else + { + lg.Error("Errore connessione mancante in getIotMem_DWord"); + } + + int numero = 0; + int byteNum = 0; + double valDouble = 0; + // Processing area WORD + for (int i = 0; i < mapIOT_DWord.Length; i++) + { + int.TryParse(mapIOT_DWord[i].memAddr, out byteNum); + if (mapIOT_DWord[i].varName.StartsWith("IOT_C_KU_AX_")) + { + // recupero NUMERO + try + { + numero = Convert.ToInt32(mapIOT_DWord[i].varName.Replace("IOT_C_KU_AX_", "")); + vettAxis[numero - 1].mAxDistDone.Value = ncDevice.PLC_MemoryAreaIOT_DWord[byteNum]; + } + catch + { + // se non trovo --> 1! + numero = 1; + } + } + else if (mapIOT_DWord[i].varName.StartsWith("IOT_C_KINV_AX_")) + { + // recupero NUMERO + try + { + numero = Convert.ToInt32(mapIOT_DWord[i].varName.Replace("IOT_C_KINV_AX_", "")); + vettAxis[numero - 1].mAxInvDDone.Value = ncDevice.PLC_MemoryAreaIOT_DWord[byteNum]; + } + catch + { + // se non trovo --> 1! + numero = 1; + } + } + else if (mapIOT_DWord[i].varName.StartsWith("IOT_POS_AX_")) + { + // recupero NUMERO + try + { + numero = Convert.ToInt32(mapIOT_DWord[i].varName.Replace("IOT_POS_AX_", "")); + // recupero valore pos assi (in micron) + valDouble = (double)BitConverter.ToInt32(BitConverter.GetBytes(ncDevice.PLC_MemoryAreaIOT_DWord[byteNum]), 0); + // riporto il dato in mm (divido x 1000) + vettAxis[numero - 1].mAxPosAct.Value = valDouble / 1000; + } + catch + { + // se non trovo --> 1! + numero = 1; + } + } + else if (mapIOT_DWord[i].varName.StartsWith("IOT_C_KREV_MD_")) + { + // recupero NUMERO + try + { + numero = Convert.ToInt32(mapIOT_DWord[i].varName.Replace("IOT_C_KREV_MD_", "")); + vettUnOp[numero - 1].mUnOpKRev.Value = ncDevice.PLC_MemoryAreaIOT_DWord[byteNum]; + } + catch + { + // se non trovo --> 1! + numero = 1; + } + } + else if (mapIOT_DWord[i].varName.StartsWith("IOT_C_EXEC_A_")) + { + // recupero NUMERO + try + { + numero = Convert.ToInt32(mapIOT_DWord[i].varName.Replace("IOT_C_EXEC_A_", "")); + //vettAxis[numero - 1].mAxInvDDone.Value = ncDevice.PLC_MemoryAreaIOT_DWord[byteNum]; + // FARE!!!! nuovo oggetto ed area x programmi caricati in area... + //mMessage.Code = mapIOT_DWord[i].varName; + //mMessage.Value = ncDevice.PLC_MemoryAreaIOT_DWord[byteNum]; + } + catch + { + // se non trovo --> 1! + numero = 1; + } + } + } + } + public override void getGlobalData() { base.getGlobalData(); @@ -238,196 +436,11 @@ namespace MTC_Adapter // accodo dati path in DataMonitor...... StringBuilder sb = new StringBuilder(); - //2017.03.07 RIVEDERE DA QUI x lettura globale // 2017.03.07 IN BLOCCO processo TUTTI i valori della memoria WORD/DWORD... if (useIotMem) { - if (connectionOk) - { - // leggo TUTTO il blocco di memoria - inizio = DateTime.Now; - ncDevice.ReadBufferWord(); - if (utils.CRB("recTime")) TimingData.addResult(string.Format("R{0}-PLC_IOT-Word", ncDevice.PLC_MemoryAreaIOT_Word.Length), DateTime.Now.Subtract(inizio).Ticks); - inizio = DateTime.Now; - ncDevice.ReadBufferDWord(); - if (utils.CRB("recTime")) TimingData.addResult(string.Format("R{0}-PLC_IOT-DWord", ncDevice.PLC_MemoryAreaIOT_DWord.Length), DateTime.Now.Subtract(inizio).Ticks); - } - else - { - lg.Error("Errore connessione mancante in getGlobalData"); - } - - int numero = 0; - int byteNum = 0; - // Processing area WORD - for (int i = 0; i < mapIOT_Word.Length; i++) - { - int.TryParse(mapIOT_Word[i].memAddr, out byteNum); - if (mapIOT_Word[i].varName.StartsWith("IOT_S_MD_")) - { - // recupero NUMERO - try - { - numero = Convert.ToInt32(mapIOT_Word[i].varName.Replace("IOT_S_MD_", "")); - vettUnOp[numero - 1].mUnOpSpeed.Value = ncDevice.PLC_MemoryAreaIOT_Word[i]; - } - catch - { - // se non trovo --> 1! - numero = 1; - } - } - else if (mapIOT_Word[i].varName.StartsWith("IOT_T_MD_")) - { - // recupero NUMERO - try - { - numero = Convert.ToInt32(mapIOT_Word[i].varName.Replace("IOT_T_MD_", "")); - vettUnOp[numero - 1].mUnOpToolId.Value = ncDevice.PLC_MemoryAreaIOT_Word[i]; - } - catch - { - // se non trovo --> 1! - numero = 1; - } - } - else if (mapIOT_Word[i].varName.StartsWith("IOT_C_H_VAC_")) - { - // recupero NUMERO - try - { - numero = Convert.ToInt32(mapIOT_Word[i].varName.Replace("IOT_C_H_VAC_", "")); - vettVacAct[numero - 1].mVacActCount.Value = ncDevice.PLC_MemoryAreaIOT_Word[i]; - } - catch - { - // se non trovo --> 1! - numero = 1; - } - } - else if (mapIOT_Word[i].varName.StartsWith("IOT_C_TC_")) - { - // recupero NUMERO - try - { - numero = Convert.ToInt32(mapIOT_Word[i].varName.Replace("IOT_C_TC_", "")); - vettUnOp[numero - 1].mUnOpNumCU.Value = ncDevice.PLC_MemoryAreaIOT_Word[i]; - } - catch - { - // se non trovo --> 1! - numero = 1; - } - } - else if (mapIOT_Word[i].varName.StartsWith("IOT_C_H_MD_")) - { - // recupero NUMERO - try - { - numero = Convert.ToInt32(mapIOT_Word[i].varName.Replace("IOT_C_H_MD_", "")); - vettUnOp[numero - 1].mUnOpAccTime.Value = ncDevice.PLC_MemoryAreaIOT_Word[i]; - } - catch - { - // se non trovo --> 1! - numero = 1; - } - } - } -#if false - // dati override feed/speed... - Byte v82 = ncDevice.PLC_MemoryAreaV[14]; - Byte v83 = ncDevice.PLC_MemoryAreaV[15]; - // 2 byte x speed da copiare... - byte[] tmpByte = new byte[2]; - Buffer.BlockCopy(ncDevice.PLC_MemoryAreaV, 16, tmpByte, 0, 2); - short v84 = BitConverter.ToInt16(tmpByte, 0); - // lista allarmi PLC/CNC - Byte v87 = ncDevice.PLC_MemoryAreaV[19]; // Allarme CN (almeno 1?!?) - - // ------------------------------------------- - // recupero dati Feed/Speed/override - // FeedOver: 100% = 213 (il pannello è 0-120 --> 0-255, quindi 100% è 100/120*255=213) - FeedRateOver = Convert.ToInt16((decimal)(v82 * 100) / 213); - sb.AppendLine(string.Format("FeedRateOver: {0} %", FeedRateOver)); - // SpeedOver: 50% = 128 - SpeedRateOver = Convert.ToInt16((decimal)(v83 * 100) / 255); - sb.AppendLine(string.Format("SpeedRateOver: {0} %", SpeedRateOver)); - // Speed S5000 OK!!! - SpeedRate = v84; - sb.AppendLine(string.Format("SpeedRate: {0} rpm", SpeedRate)); - // ------------------------------------------- - - // da recuperare da qualche parte?!? - UnOpLoad = 0; - sb.AppendLine(string.Format("Load: {0}", UnOpLoad)); - - // ------------------------------------------- - // recupero dati dai contatori EOK - bool needSave = false; - - // ore totali accensione - int MinMaccOn = (int)ncDevice.PLC_MemoryAreaEOK[0]; - int OreMaccOn = (int)ncDevice.PLC_MemoryAreaEOK[1]; - istOreMaccOn = OreMaccOn + (double)MinMaccOn / 60; - needSave = procOreMaccOn(needSave); - - // ore totali lavoro - int MinMaccLav = (int)ncDevice.PLC_MemoryAreaEOK[2]; - int OreMaccLav = (int)ncDevice.PLC_MemoryAreaEOK[3]; - istOreMaccLav = OreMaccLav + (double)MinMaccLav / 60; - needSave = procOreMaccLav(needSave); - - // giri totali degli elettromandrini! - for (int i = 0; i < currAdpConf.nUnOp; i++) - { - istGiriElettrom[i] = (uint)ncDevice.PLC_MemoryAreaEOK[4 + i]; - } - needSave = procGiriTotUnOp(needSave); - needSave = procNumCU(needSave); - - // per ESA calcolo a mano se ci sia stato impiego assi... salvo le istantanee mov precedenti... - double precVal = 0; - DateTime adesso = DateTime.Now; - TimeSpan accumTime = adesso.Subtract(lastChekAccumTimeAxis); - - // spostamento totale assi! - for (int i = 0; i < 3; i++) - { - precVal = istDistMovAssi[i]; - // primo è metri, secondo km (moltiplico x 1000) - istDistMovAssi[i] = ncDevice.PLC_MemoryAreaEOK[8 + 2 * i] + ncDevice.PLC_MemoryAreaEOK[9 + 2 * i] * 1000; - // verifico SE devo aggiungere tempo lavoro sui singoli assi (se si sono spostati...) -- è a maglie LARGHE poiché leggiamo lo "scatto ogni metro" x cui se campiono velocemente ma assi muovono lenti prendo MENO tempo di movimento del reale... - if (precVal != istDistMovAssi[i]) - { - istAccTimeAssi[i] += accumTime.TotalHours; - } - } - // salvo valore lastChekAccumTimeAxis - lastChekAccumTimeAxis = adesso; - - needSave = procMovTotAssi(needSave); - needSave = procAccTimeAssi(needSave); - needSave = procProgrName(needSave); - needSave = procPartId(needSave); - needSave = procPzProd(needSave); - needSave = procNumInvAssi(needSave); - needSave = procVacPump(needSave); - needSave = procVacAct(needSave); - needSave = procLubro(needSave); - - // salvo se necessario! - if (needSave) parentForm.persistData(); - // ------------------------------------------- - - - // copio allarmi in vettore generale AlarFlags (dove lo gestisce)... - Buffer.BlockCopy(ncDevice.PLC_MemoryAreaAllarmi, 0, AlarmFlags, 0, ncDevice.PLC_MemoryAreaAllarmi.Length); - //Buffer.BlockCopy(ncDevice.PLC_MemAreaAlarm_tmp, 0, AlarmFlags, 0, ncDevice.PLC_MemAreaAlarm_tmp.Length); - - parentForm.dataMonitor = sb.ToString(); -#endif - + getIotMem_Word(); + getIotMem_DWord(); } else { @@ -975,7 +988,7 @@ namespace MTC_Adapter // leggo in modo "cablato" i dati dei vari assi... for (int i = 0; i < currAdpConf.nAxis; i++) { - +#if false // in base a indice scelgo valore posizione e load switch (i) { @@ -1008,6 +1021,7 @@ namespace MTC_Adapter vettAxis[i].mAxPosAct.Value = newPos; //vettAxis[i].mAxPosTgt.Value = newPos + (double)(valPos.dist.data) / Math.Pow(10, valPos.dist.dec); +#endif vettAxis[i].mAxFeedAct.Value = FeedRate; // calcolo distanza e salvo valore... diff --git a/MTC_Adapter/MTC_Adapter/AdapterGeneric.cs b/MTC_Adapter/MTC_Adapter/AdapterGeneric.cs index 1926188..38a97b8 100644 --- a/MTC_Adapter/MTC_Adapter/AdapterGeneric.cs +++ b/MTC_Adapter/MTC_Adapter/AdapterGeneric.cs @@ -402,6 +402,10 @@ namespace MTC_Adapter /// public Sample mUnOpAccTime; /// + /// contatore cumulato di giri mandrino (migliaia) + /// + public Sample mUnOpKRev; + /// /// Classe Unita Operatrice (Mandrino) con Idx e descrizione /// /// element base contenente parametri (da XML) @@ -423,6 +427,7 @@ namespace MTC_Adapter mUnOpLoad = new Sample(dataRefList[6].Key); mUnOpAccTime = new Sample(dataRefList[7].Key); mUnOpVitaResType = new MTConnect.Message(dataRefList[8].Key); + mUnOpKRev = new Sample(string.Format("{0}_KREV", ident)); } } /// @@ -1104,6 +1109,7 @@ namespace MTC_Adapter mAdapter.AddDataItem(vettUnOp[i].mUnOpSpeedOverr); mAdapter.AddDataItem(vettUnOp[i].mUnOpLoad); mAdapter.AddDataItem(vettUnOp[i].mUnOpAccTime); + mAdapter.AddDataItem(vettUnOp[i].mUnOpKRev); } // Assi vettAxis = new Axis[adpConf.nAxis]; diff --git a/MTC_Adapter/MTC_Adapter/DATA/CONF/IOT_DWordList.map b/MTC_Adapter/MTC_Adapter/DATA/CONF/IOT_DWordList.map index 3389643..455bf13 100644 --- a/MTC_Adapter/MTC_Adapter/DATA/CONF/IOT_DWordList.map +++ b/MTC_Adapter/MTC_Adapter/DATA/CONF/IOT_DWordList.map @@ -1,71 +1,71 @@ # Commenti con cancelletto, struttura un variabile per riga, tipo chiave|valore (occhio che il separatore è configurato da .cofig come "testCharSep"); spazi e tabulazioni dovrei trimmarli in acquisizione (qui inseriti per comodità di lettura) -1 001|IOT_C_KU_AX1 |DWORD -2 002|IOT_C_KU_AX2 |DWORD -3 003|IOT_C_KU_AX3 |DWORD -4 004|IOT_C_KU_AX4 |DWORD -5 005|IOT_C_KU_AX5 |DWORD -6 006|IOT_C_KU_AX6 |DWORD -7 007|IOT_C_KU_AX7 |DWORD -8 008|IOT_C_KU_AX8 |DWORD -9 009|IOT_C_KU_AX9 |DWORD -10 010|IOT_C_KU_AX10 |DWORD -11 011|IOT_C_KU_AX11 |DWORD -12 012|IOT_C_KU_AX12 |DWORD -13 013|IOT_C_KU_AX13 |DWORD -14 014|IOT_C_KU_AX14 |DWORD -15 015|IOT_C_KU_AX15 |DWORD -16 016|IOT_C_KINV_AX1 |DWORD -17 017|IOT_C_KINV_AX2 |DWORD -18 018|IOT_C_KINV_AX3 |DWORD -19 019|IOT_C_KINV_AX4 |DWORD -20 020|IOT_C_KINV_AX5 |DWORD -21 021|IOT_C_KINV_AX6 |DWORD -22 022|IOT_C_KINV_AX7 |DWORD -23 023|IOT_C_KINV_AX8 |DWORD -24 024|IOT_C_KINV_AX9 |DWORD -25 025|IOT_C_KINV_AX10 |DWORD -26 026|IOT_C_KINV_AX11 |DWORD -27 027|IOT_C_KINV_AX12 |DWORD -28 028|IOT_C_KINV_AX13 |DWORD -29 029|IOT_C_KINV_AX14 |DWORD -30 030|IOT_C_KINV_AX15 |DWORD -31 031|IOT_POS_AX1 |DWORD -32 032|IOT_POS_AX2 |DWORD -33 033|IOT_POS_AX3 |DWORD -34 034|IOT_POS_AX4 |DWORD -35 035|IOT_POS_AX5 |DWORD -36 036|IOT_POS_AX6 |DWORD -37 037|IOT_POS_AX7 |DWORD -38 038|IOT_POS_AX8 |DWORD -39 039|IOT_POS_AX9 |DWORD -40 040|IOT_POS_AX10 |DWORD -41 041|IOT_POS_AX11 |DWORD -42 042|IOT_POS_AX12 |DWORD -43 043|IOT_POS_AX13 |DWORD -44 044|IOT_POS_AX14 |DWORD -45 045|IOT_POS_AX15 |DWORD -46 046|IOT_C_KREV_MD1 |DWORD -47 047|IOT_C_KREV_MD2 |DWORD -48 048|IOT_C_KREV_MD3 |DWORD -49 049|IOT_C_KREV_MD4 |DWORD -50 050|IOT_C_KREV_MD5 |DWORD -51 051|IOT_C_KREV_MD6 |DWORD -52 052|IOT_C_KREV_MD7 |DWORD -53 053|IOT_C_KREV_MD8 |DWORD -54 054|IOT_PLC_MSG_00 |DWORD -55 055|IOT_PLC_MSG_01 |DWORD -56 056|IOT_PLC_MSG_02 |DWORD -57 057|IOT_PLC_MSG_03 |DWORD -58 058|IOT_PLC_MSG_04 |DWORD -59 059|IOT_PLC_MSG_05 |DWORD -60 060|IOT_PLC_MSG_06 |DWORD -61 061|IOT_PLC_MSG_07 |DWORD -62 062|IOT_PLC_MSG_08 |DWORD -63 063|IOT_PLC_MSG_09 |DWORD -64 064|IOT_PLC_MSG_10 |DWORD -65 065|IOT_PLC_MSG_11 |DWORD -66 066|IOT_PLC_MSG_12 |DWORD -67 067|IOT_C_EXEC_A1 |DWORD -68 068|IOT_C_EXEC_A2 |DWORD -69 069|IOT_C_EXEC_A3 |DWORD -70 070|IOT_C_EXEC_A4 |DWORD \ No newline at end of file +000|IOT_C_KU_AX_01 |DWORD +001|IOT_C_KU_AX_02 |DWORD +002|IOT_C_KU_AX_03 |DWORD +003|IOT_C_KU_AX_04 |DWORD +004|IOT_C_KU_AX_05 |DWORD +005|IOT_C_KU_AX_06 |DWORD +006|IOT_C_KU_AX_07 |DWORD +007|IOT_C_KU_AX_08 |DWORD +008|IOT_C_KU_AX_09 |DWORD +009|IOT_C_KU_AX_10 |DWORD +010|IOT_C_KU_AX_11 |DWORD +011|IOT_C_KU_AX_12 |DWORD +012|IOT_C_KU_AX_13 |DWORD +013|IOT_C_KU_AX_14 |DWORD +014|IOT_C_KU_AX_15 |DWORD +015|IOT_C_KINV_AX_01 |DWORD +016|IOT_C_KINV_AX_02 |DWORD +017|IOT_C_KINV_AX_03 |DWORD +018|IOT_C_KINV_AX_04 |DWORD +019|IOT_C_KINV_AX_05 |DWORD +020|IOT_C_KINV_AX_06 |DWORD +021|IOT_C_KINV_AX_07 |DWORD +022|IOT_C_KINV_AX_08 |DWORD +023|IOT_C_KINV_AX_09 |DWORD +024|IOT_C_KINV_AX_10 |DWORD +025|IOT_C_KINV_AX_11 |DWORD +026|IOT_C_KINV_AX_12 |DWORD +027|IOT_C_KINV_AX_13 |DWORD +028|IOT_C_KINV_AX_14 |DWORD +029|IOT_C_KINV_AX_15 |DWORD +030|IOT_POS_AX_01 |DWORD +031|IOT_POS_AX_02 |DWORD +032|IOT_POS_AX_03 |DWORD +033|IOT_POS_AX_04 |DWORD +034|IOT_POS_AX_05 |DWORD +035|IOT_POS_AX_06 |DWORD +036|IOT_POS_AX_07 |DWORD +037|IOT_POS_AX_08 |DWORD +038|IOT_POS_AX_09 |DWORD +039|IOT_POS_AX_10 |DWORD +040|IOT_POS_AX_11 |DWORD +041|IOT_POS_AX_12 |DWORD +042|IOT_POS_AX_13 |DWORD +043|IOT_POS_AX_14 |DWORD +044|IOT_POS_AX_15 |DWORD +045|IOT_C_KREV_MD_01 |DWORD +046|IOT_C_KREV_MD_02 |DWORD +047|IOT_C_KREV_MD_03 |DWORD +048|IOT_C_KREV_MD_04 |DWORD +049|IOT_C_KREV_MD_05 |DWORD +050|IOT_C_KREV_MD_06 |DWORD +051|IOT_C_KREV_MD_07 |DWORD +052|IOT_C_KREV_MD_08 |DWORD +053|IOT_PLC_MSG_00 |DWORD +054|IOT_PLC_MSG_01 |DWORD +055|IOT_PLC_MSG_02 |DWORD +056|IOT_PLC_MSG_03 |DWORD +057|IOT_PLC_MSG_04 |DWORD +058|IOT_PLC_MSG_05 |DWORD +059|IOT_PLC_MSG_06 |DWORD +060|IOT_PLC_MSG_07 |DWORD +061|IOT_PLC_MSG_08 |DWORD +062|IOT_PLC_MSG_09 |DWORD +063|IOT_PLC_MSG_10 |DWORD +064|IOT_PLC_MSG_11 |DWORD +065|IOT_PLC_MSG_12 |DWORD +066|IOT_C_EXEC_A_01 |DWORD +067|IOT_C_EXEC_A_02 |DWORD +068|IOT_C_EXEC_A_03 |DWORD +069|IOT_C_EXEC_A_04 |DWORD \ No newline at end of file