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