diff --git a/MTC_Adapter/MTC/baseUtils.cs b/MTC_Adapter/MTC/baseUtils.cs index 2a6960b..24d5085 100644 --- a/MTC_Adapter/MTC/baseUtils.cs +++ b/MTC_Adapter/MTC/baseUtils.cs @@ -9,821 +9,824 @@ using NLog; namespace MTC { - public class baseUtils + public class baseUtils + { + /// + /// classe logger + /// + public static Logger lg; + + /// + /// legge conf in formato char + /// + /// + /// + public static char CRC(string key) { - /// - /// classe logger - /// - public static Logger lg; - - /// - /// legge conf in formato char - /// - /// - /// - public static char CRC(string key) - { - char answ = '-'; - try - { - answ = ConfigurationManager.AppSettings[key].ToCharArray()[0]; - } - catch - { } - return answ; - } - /// - /// legge conf in formato stringa - /// - /// - /// - public static string CRS(string key) - { - string answ = ""; - try - { - answ = ConfigurationManager.AppSettings[key].ToString(); - } - catch - { } - return answ; - } - /// - /// legge conf in formato INT - /// - /// - /// - public static Int32 CRI(string key) - { - int answ = 0; - try - { - answ = Convert.ToInt32(CRS(key)); - } - catch - { } - return answ; - } - /// - /// legge conf in formato BOOLean - /// - /// - /// - public static bool CRB(string key) - { - bool answ = false; - try - { - answ = Convert.ToBoolean(CRS(key)); - } - catch - { } - return answ; - } - /// - /// verifica se un dato bit sia alzato (come flag di strobe) - /// - /// valore da testare - /// valore cercato, può essere un singolo valore o un insieme in modalità AND - /// - public static bool IsSetAll(Strobe value, Strobe flag) - { - return ((value & flag) == flag); - } - /// - /// verifica se un dato bit sia alzato (come flag di strobe) - /// - /// valore da testare - /// valore cercato, può essere un singolo valore o un insieme in modalità OR - /// - public static bool IsSetAny(Strobe value, Strobe flag) - { - return ((value & flag) != 0); - } - /// - /// verifica se un dato bit sia alzato (come flag di strobe) - /// - /// valore da testare - /// valore cercato, può essere un singolo valore o un insieme in modalità AND - /// - public static bool IsSetAll(StatusBitMap value, StatusBitMap flag) - { - return ((value & flag) == flag); - } - /// - /// verifica se un dato bit sia alzato (come flag di strobe) - /// - /// valore da testare - /// valore cercato, può essere un singolo valore o un insieme in modalità OR - /// - public static bool IsSetAny(StatusBitMap value, StatusBitMap flag) - { - return ((value & flag) != 0); - } - /// - /// formatta un numero in forma binaria 0/1 - /// - /// - /// - public static string binaryForm(int valore) - { - string answ = ""; - try - { - answ = string.Format(new BinaryFormatter(), "{0:B}", valore); - } - catch - { } - return answ; - } - /// - /// imposta un bit al valore richiesto duplicando il valore IN come OUT - /// - /// valore originale da aggiornare - /// valore richiesto x il bit (0/1) - /// indice bit, 0 based (es: 0..31 per 32bit) - /// - 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/1b - if (bitVal <= 1 && bitVal >= 0) - { - // verifico se si possa aggiornare il bit richiesto (<= al totale dei bit...) - if (bitIndex <= original.Length * 8 - 1) - { - // calcolo byte - int byteIndex = bitIndex / 8; - // bit nel byte - int bitInByteIndex = bitIndex % 8; - // bit richiesto - byte mask = (byte)(bitVal << bitInByteIndex); - // imposto! - answ[byteIndex] |= mask; - } - } - 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; - } - - /// - /// Scrittura dictionary su file - /// - /// - /// - public static void WriteBin(Dictionary dictionary, string file) - { - using (FileStream fs = File.OpenWrite(file)) - using (BinaryWriter writer = new BinaryWriter(fs)) - { - // Put count. - writer.Write(dictionary.Count); - // Write pairs. - foreach (var pair in dictionary) - { - writer.Write(pair.Key); - writer.Write(pair.Value); - } - } - } - /// - /// Lettura dictionary da file - /// - /// - /// - public static Dictionary ReadBin(string file) - { - var result = new Dictionary(); - // verifico file esista... - if (!File.Exists(file)) - { - FileStream fs = File.Create(file); - fs.Close(); - } - using (FileStream fs = File.OpenRead(file)) - using (BinaryReader reader = new BinaryReader(fs)) - { - // Get count. - int count = 0; - try - { - count = reader.ReadInt32(); - } - catch - { } - // Read in all pairs. - for (int i = 0; i < count; i++) - { - string key = reader.ReadString(); - string value = reader.ReadString(); - result[key] = value; - } - } - return result; - } - - /// - /// Scrittura dictionary su file - /// - /// - /// - public static void WritePlain(Dictionary dictionary, string file) - { - string dirPath = file.Substring(0, file.LastIndexOf('\\')); - // verifico directory - if (!Directory.Exists(dirPath)) - { - Directory.CreateDirectory(dirPath); - } - string[] lines = dictionary.OrderBy(i => i.Key).Select(kvp => kvp.Key + ":" + kvp.Value).ToArray(); - try - { - File.WriteAllLines(file, lines); - } - catch (Exception exc) - { - lg.Info(exc, string.Format("Errore in scrittura file {0}", file)); - } - } - /// - /// Lettura dictionary da file - /// - /// - /// - public static Dictionary ReadPlain(string file) - { - // inizializzo num righe lette... - int numRow = 0; - var result = new Dictionary(); - // verifico file esista... - if (!File.Exists(file)) - { - FileStream fs = File.Create(file); - fs.Close(); - } - try - { - string[] lines = File.ReadAllLines(file); - result = lines.Select(l => l.Split(':')).ToDictionary(a => a[0], a => a[1]); - numRow = result.Count; - } - catch - { } - // se leggesse un valore NON coerente (senza righe) restituisce un file vuoto... - if (numRow == 0) - { - result = new Dictionary(); - } - return result; - } - + char answ = '-'; + try + { + answ = ConfigurationManager.AppSettings[key].ToCharArray()[0]; + } + catch + { } + return answ; } /// - /// Oggetto timing x archiviazione dati perfomances + /// legge conf in formato stringa /// - public class TimeRec + /// + /// + public static string CRS(string key) { - /// - /// Codice univoco chiamata: tipo R4 (read 4 byte), W2 (write 2 Byte) - /// - public string codCall; - /// - /// Num chiamate totale - /// - public int numCall; - /// - /// Tempo medio chiamata - /// - public double avgMsec - { - get - { - return totMsec.TotalMilliseconds / numCall; - } - } - /// - /// Totale Msec accumulati - /// - public TimeSpan totMsec; - /// - /// Classe record timing - /// - public TimeRec() - { - codCall = ""; - numCall = 0; - totMsec = new TimeSpan(0); - } - /// - /// Classe record timing - /// - /// - /// - public TimeRec(string codice, long nTicks) - { - codCall = codice; - numCall = 1; - totMsec = new TimeSpan(nTicks); - } - } - public static class TimingData - { - public static List results = new List(); - - /// - /// aggiorno vettore aggiungendo risultato - /// - /// - /// - public static void addResult(string codice, long ticks) - { - if (results.Count == 0) - { - results.Add(new TimeRec(codice, ticks)); - } - int indice = -1; - for (int i = 0; i < results.Count; i++) - { - // se il codice è quello cercato... - if (results[i].codCall == codice) indice = i; - } - // se c'è aggiorno... - if (indice >= 0) - { - results[indice].numCall++; - results[indice].totMsec = results[indice].totMsec.Add(new TimeSpan(ticks)); - } - // altrimenti aggiungo... - else - { - results.Add(new TimeRec(codice, ticks)); - } - } - /// - /// Resetta i dati registrati (ad avvio adapter...) - /// - public static void resetData() - { - results = new List(); - } + string answ = ""; + try + { + answ = ConfigurationManager.AppSettings[key].ToString(); + } + catch + { } + return answ; } /// - /// Gestione Endianness + /// legge conf in formato INT /// - public static class Endian + /// + /// + public static Int32 CRI(string key) { - /// - /// Scambia MSB/LSB per 16bit - /// - /// - /// - public static UInt16 SwapUInt16(UInt16 inValue) - { - return (UInt16)(((inValue & 0xff00) >> 8) | - ((inValue & 0x00ff) << 8)); - } - - /// - /// Scambia MSB/LSB per 32bit - /// - /// - /// - public static UInt32 SwapUInt32(UInt32 inValue) - { - return (UInt32)(((inValue & 0xff000000) >> 24) | - ((inValue & 0x00ff0000) >> 8) | - ((inValue & 0x0000ff00) << 8) | - ((inValue & 0x000000ff) << 24)); - } + int answ = 0; + try + { + answ = Convert.ToInt32(CRS(key)); + } + catch + { } + return answ; } - - - public enum tipoAdapter + /// + /// legge conf in formato BOOLean + /// + /// + /// + public static bool CRB(string key) { - /// - /// Adapter DB - /// - DB, - /// - /// Adapter generico/demo - /// - DEMO, - /// - /// Adapter ESAGV (SCM) - /// - ESAGV, - /// - /// adapter FANUC (CMS) - /// - FANUC, - /// - /// Adapter non specificato - /// - ND, - /// - /// Adapter OSAI - /// - OSAI, - /// - /// Adapter SIEMENS (CMS) - /// - SIEMENS + bool answ = false; + try + { + answ = Convert.ToBoolean(CRS(key)); + } + catch + { } + return answ; } - - public enum gatherCycle + /// + /// verifica se un dato bit sia alzato (come flag di strobe) + /// + /// valore da testare + /// valore cercato, può essere un singolo valore o un insieme in modalità AND + /// + public static bool IsSetAll(Strobe value, Strobe flag) { - /// - /// Very High Frequency (solo x invii...) - /// - VHF, - /// - /// lettura dati ad alta frequenza - /// - HF, - /// - /// lettura dati standard - /// - MF, - /// - /// lettura dati bassa freq - /// - LF, - /// - /// lettura dati bassissima priorità (re-sync stato allarmi) - /// - VLF + return ((value & flag) == flag); + } + /// + /// verifica se un dato bit sia alzato (come flag di strobe) + /// + /// valore da testare + /// valore cercato, può essere un singolo valore o un insieme in modalità OR + /// + public static bool IsSetAny(Strobe value, Strobe flag) + { + return ((value & flag) != 0); + } + /// + /// verifica se un dato bit sia alzato (come flag di strobe) + /// + /// valore da testare + /// valore cercato, può essere un singolo valore o un insieme in modalità AND + /// + public static bool IsSetAll(StatusBitMap value, StatusBitMap flag) + { + return ((value & flag) == flag); + } + /// + /// verifica se un dato bit sia alzato (come flag di strobe) + /// + /// valore da testare + /// valore cercato, può essere un singolo valore o un insieme in modalità OR + /// + public static bool IsSetAny(StatusBitMap value, StatusBitMap flag) + { + return ((value & flag) != 0); + } + /// + /// formatta un numero in forma binaria 0/1 + /// + /// + /// + public static string binaryForm(int valore) + { + string answ = ""; + try + { + answ = string.Format(new BinaryFormatter(), "{0:B}", valore); + } + catch + { } + return answ; + } + /// + /// imposta un bit al valore richiesto duplicando il valore IN come OUT + /// + /// valore originale da aggiornare + /// valore richiesto x il bit (0/1) + /// indice bit, 0 based (es: 0..31 per 32bit) + /// + 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/1b + if (bitVal <= 1 && bitVal >= 0) + { + // verifico se si possa aggiornare il bit richiesto (<= al totale dei bit...) + if (bitIndex <= original.Length * 8 - 1) + { + // calcolo byte + int byteIndex = bitIndex / 8; + // bit nel byte + int bitInByteIndex = bitIndex % 8; + // bit richiesto + byte mask = (byte)(bitVal << bitInByteIndex); + // imposto! + answ[byteIndex] |= mask; + } + } + 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; } /// - /// informazioni di produzione + /// Scrittura dictionary su file /// - public struct prodData + /// + /// + public static void WriteBin(Dictionary dictionary, string file) { - public string Operator; - - public bool Status; - public int AccTime; - public int Power; - public string FuncMode; - public bool EmrStop; - public string MessageCode; - public string MessageText; - - } - - public struct PathData - { - public int PathSel; - public string PathType; // LAVOR/ASSERV - public string RunMode; - public string ExeMode; - public int pzTot; - public string ProgramName; - public string ProgrRow; - public string PartId; - public string ActiveAxes; - public string CodG_Act; - public string SubMode; - - public int PathFeedrate; - public int PathFeedrateOver; - public int PathRapidOver; - public int PathJogOver; - public int PathSpindleOver_01; - public int PathSpindleOver_02; - public int PathSpindleOver_03; - public int PathSpindleOver_04; - public position PathPosAct; - } - - - public struct UnOpData - { - public int UnOpSel; - public int UnOpToolId; - public int UnOpNumCU; - public string UnOpStatus; - public int UnOpVitaRes; - public int UnOpSpeed; - public int UnOpLoad; - public int UnOpAccTime; - } - - public struct AxisData - { - public int AxisSel; - public string AxisMainProc; - public bool AxisIsMaster; - public string AxisMastId; - public string AxisType; - public string AxisDir; - public int AxisLoad; - public int AxisPosAct; - public int AxisPosTgt; - public int AxisFeedAct; - public int AxisFeedOver; - public string AxisAccel; - public string AxisAccTime; - public string AxisBattery; - public string DistDone; - public string InvDDone; - } - - /// - /// Vettore completo posizione (X-Y-Z con versori i-j-k) - /// - public class position - { - public float x; - public float y; - public float z; - public float i; - public float j; - public float k; - public position() + using (FileStream fs = File.OpenWrite(file)) + using (BinaryWriter writer = new BinaryWriter(fs)) + { + // Put count. + writer.Write(dictionary.Count); + // Write pairs. + foreach (var pair in dictionary) { - x = 0; - y = 0; - z = 0; - i = 0; - j = 0; - k = 0; + writer.Write(pair.Key); + writer.Write(pair.Value); } + } } - /// - /// Dati Prod SCM (per decodifica) + /// Lettura dictionary da file /// - public class datiProdSCM + /// + /// + public static Dictionary ReadBin(string file) { - public string area; - public string fileName; - public string dimensioni; - public DateTime start; - public DateTime stop; - public TimeSpan tEff; - public TimeSpan tTot; - public int qta; - public TimeSpan tMed; - public datiProdSCM() + var result = new Dictionary(); + // verifico file esista... + if (!File.Exists(file)) + { + FileStream fs = File.Create(file); + fs.Close(); + } + using (FileStream fs = File.OpenRead(file)) + using (BinaryReader reader = new BinaryReader(fs)) + { + // Get count. + int count = 0; + try { - area = ""; - fileName = ""; - dimensioni = ""; - start = DateTime.Now; - stop = DateTime.Now; - tEff = new TimeSpan(0); - tTot = new TimeSpan(0); - qta = 0; - tMed = new TimeSpan(0); + count = reader.ReadInt32(); } - /// - /// crea un nuovo oggetto a partire da un array di stringhe - /// - /// - public datiProdSCM(string[] valori) + catch + { } + // Read in all pairs. + for (int i = 0; i < count; i++) { - try - { - area = valori[0]; - fileName = valori[1]; - dimensioni = string.Format("{0}x{1}x{2}", valori[3], valori[4], valori[5]); - start = DateTime.Today.AddHours(Convert.ToInt16(valori[6])).AddMinutes(Convert.ToInt16(valori[7])).AddSeconds(Convert.ToInt16(valori[8])); - - stop = DateTime.Today.AddHours(Convert.ToInt16(valori[9])).AddMinutes(Convert.ToInt16(valori[10])).AddSeconds(Convert.ToInt16(valori[11])); - // se ore == 0 --> aggiungo 1 gg!!! - if (Convert.ToInt16(valori[9]) == 0) stop.AddDays(1); - - tEff = new TimeSpan(Convert.ToInt16(valori[12]), Convert.ToInt16(valori[13]), Convert.ToInt16(valori[14])); - - tTot = new TimeSpan(Convert.ToInt16(valori[15]), Convert.ToInt16(valori[16]), Convert.ToInt16(valori[17])); - - qta = Convert.ToInt16(valori[18]); - - tMed = new TimeSpan(Convert.ToInt16(valori[19]), Convert.ToInt16(valori[20]), Convert.ToInt16(valori[22]), Convert.ToInt16(valori[23])); - } - catch - { } - } - } - /// - /// Allarme (per decodifica) - /// - public class allarme - { - public string codNum; - public string gruppo; - public string livello; - public string descrizione; - public allarme() - { - codNum = ""; - gruppo = ""; - livello = ""; - descrizione = ""; - } - public allarme(string _codNum, string _gruppo, string _livello, string _descrizione) - { - codNum = _codNum; - gruppo = _gruppo; - livello = _livello; - descrizione = _descrizione; + string key = reader.ReadString(); + string value = reader.ReadString(); + result[key] = value; } + } + return result; } - /// - /// Dato generico (per decodifica) + /// Scrittura dictionary su file /// - public class otherData + /// + /// + public static void WritePlain(Dictionary dictionary, string file) { - public string codNum; - public string memAddr; - public string varName; - public string dataType; - public otherData() - { - codNum = ""; - memAddr = ""; - varName = ""; - dataType = ""; - } - public otherData(string _codNum, string _memAddr, string _varName, string _dataType) - { - codNum = _codNum; - memAddr = _memAddr; - varName = _varName; - dataType = _dataType; - } + string dirPath = file.Substring(0, file.LastIndexOf('\\')); + // verifico directory + if (!Directory.Exists(dirPath)) + { + Directory.CreateDirectory(dirPath); + } + string[] lines = dictionary.OrderBy(i => i.Key).Select(kvp => kvp.Key + ":" + kvp.Value).ToArray(); + try + { + File.WriteAllLines(file, lines); + } + catch (Exception exc) + { + lg.Info(exc, string.Format("Errore in scrittura file {0}", file)); + } + } + /// + /// Lettura dictionary da file + /// + /// + /// + public static Dictionary ReadPlain(string file) + { + // inizializzo num righe lette... + int numRow = 0; + var result = new Dictionary(); + // verifico file esista... + if (!File.Exists(file)) + { + FileStream fs = File.Create(file); + fs.Close(); + } + try + { + string[] lines = File.ReadAllLines(file); + result = lines.Select(l => l.Split(':')).ToDictionary(a => a[0], a => a[1]); + numRow = result.Count; + } + catch + { } + // se leggesse un valore NON coerente (senza righe) restituisce un file vuoto... + if (numRow == 0) + { + result = new Dictionary(); + } + return result; } + } + /// + /// Oggetto timing x archiviazione dati perfomances + /// + public class TimeRec + { + /// + /// Codice univoco chiamata: tipo R4 (read 4 byte), W2 (write 2 Byte) + /// + public string codCall; + /// + /// Num chiamate totale + /// + public int numCall; + /// + /// Tempo medio chiamata + /// + public double avgMsec + { + get + { + return totMsec.TotalMilliseconds / numCall; + } + } + /// + /// Totale Msec accumulati + /// + public TimeSpan totMsec; + /// + /// Classe record timing + /// + public TimeRec() + { + codCall = ""; + numCall = 0; + totMsec = new TimeSpan(0); + } + /// + /// Classe record timing + /// + /// + /// + public TimeRec(string codice, long nTicks) + { + codCall = codice; + numCall = 1; + totMsec = new TimeSpan(nTicks); + } + } + + + + public static class TimingData + { + public static List results = new List(); /// - /// Strobe: contiene il set di strobe di comunicazione - /// - /// rif: http://stackoverflow.com/questions/17209054/parse-bits-in-a-byte-to-enum + /// aggiorno vettore aggiungendo risultato /// - [Flags] - public enum Strobe : int + /// + /// + public static void addResult(string codice, long ticks) { - NONE = 0, - M_CODE = 1 << 0, - S_CODE = 1 << 1, - T_CODE = 1 << 2, - PZ_OK = 1 << 3, - PZ_KO = 1 << 4, - FEED_SPEED = 1 << 5, - POS_ACT = 1 << 6, - SP07 = 1 << 7, - SP08 = 1 << 8, - SP09 = 1 << 9, - SP10 = 1 << 10, - SP11 = 1 << 11, - SP12 = 1 << 12, - SP13 = 1 << 13, - SP14 = 1 << 14, - SP15 = 1 << 15, - SP16 = 1 << 16, - SP17 = 1 << 17, - SP18 = 1 << 18, - SP19 = 1 << 19, - SP20 = 1 << 20, - SP21 = 1 << 21, - SP22 = 1 << 22, - SP23 = 1 << 23, - SP24 = 1 << 24, - SP25 = 1 << 25, - SP26 = 1 << 26, - SP27 = 1 << 27, - SP28 = 1 << 28, - SP29 = 1 << 29, - SP30 = 1 << 30, - SP31 = 1 << 31 + if (results.Count == 0) + { + results.Add(new TimeRec(codice, ticks)); + } + int indice = -1; + for (int i = 0; i < results.Count; i++) + { + // se il codice è quello cercato... + if (results[i].codCall == codice) indice = i; + } + // se c'è aggiorno... + if (indice >= 0) + { + results[indice].numCall++; + results[indice].totMsec = results[indice].totMsec.Add(new TimeSpan(ticks)); + } + // altrimenti aggiungo... + else + { + results.Add(new TimeRec(codice, ticks)); + } } /// - /// StFlag8: set di 8 bit (1 word) contente semaforo di variabili + /// Resetta i dati registrati (ad avvio adapter...) /// - [Flags] - public enum StFlag8 : int + public static void resetData() { - NONE = 0, - B0 = 1 << 0, - B1 = 1 << 1, - B2 = 1 << 2, - B3 = 1 << 3, - B4 = 1 << 4, - B5 = 1 << 5, - B6 = 1 << 6, - B7 = 1 << 7 + results = new List(); + } + } + /// + /// Gestione Endianness + /// + public static class Endian + { + /// + /// Scambia MSB/LSB per 16bit + /// + /// + /// + public static UInt16 SwapUInt16(UInt16 inValue) + { + return (UInt16)(((inValue & 0xff00) >> 8) | + ((inValue & 0x00ff) << 8)); + } + + /// + /// Scambia MSB/LSB per 32bit + /// + /// + /// + public static UInt32 SwapUInt32(UInt32 inValue) + { + return (UInt32)(((inValue & 0xff000000) >> 24) | + ((inValue & 0x00ff0000) >> 8) | + ((inValue & 0x0000ff00) << 8) | + ((inValue & 0x000000ff) << 24)); + } + } + + + public enum tipoAdapter + { + /// + /// Adapter DB + /// + DB, + /// + /// Adapter generico/demo + /// + DEMO, + /// + /// Adapter ESAGV (SCM) + /// + ESAGV, + /// + /// adapter FANUC (CMS) + /// + FANUC, + /// + /// Adapter non specificato + /// + ND, + /// + /// Adapter OSAI + /// + OSAI, + /// + /// Adapter SIEMENS (CMS) + /// + SIEMENS + } + + public enum gatherCycle + { + /// + /// Very High Frequency (solo x invii...) + /// + VHF, + /// + /// lettura dati ad alta frequenza + /// + HF, + /// + /// lettura dati standard + /// + MF, + /// + /// lettura dati bassa freq + /// + LF, + /// + /// lettura dati bassissima priorità (re-sync stato allarmi) + /// + VLF + } + + /// + /// informazioni di produzione + /// + public struct prodData + { + public string Operator; + + public bool Status; + public int AccTime; + public int Power; + public string FuncMode; + public bool EmrStop; + public string MessageCode; + public string MessageText; + + } + + public struct PathData + { + public int PathSel; + public string PathType; // LAVOR/ASSERV + public string RunMode; + public string ExeMode; + public int pzTot; + public string ProgramName; + public string ProgrRow; + public string PartId; + public string ActiveAxes; + public string CodG_Act; + public string SubMode; + + public int PathFeedrate; + public int PathFeedrateOver; + public int PathRapidOver; + public int PathJogOver; + public int PathSpindleOver_01; + public int PathSpindleOver_02; + public int PathSpindleOver_03; + public int PathSpindleOver_04; + public position PathPosAct; + } + + + public struct UnOpData + { + public int UnOpSel; + public int UnOpToolId; + public int UnOpNumCU; + public string UnOpStatus; + public int UnOpVitaRes; + public int UnOpSpeed; + public int UnOpLoad; + public int UnOpAccTime; + } + + public struct AxisData + { + public int AxisSel; + public string AxisMainProc; + public bool AxisIsMaster; + public string AxisMastId; + public string AxisType; + public string AxisDir; + public int AxisLoad; + public int AxisPosAct; + public int AxisPosTgt; + public int AxisFeedAct; + public int AxisFeedOver; + public string AxisAccel; + public string AxisAccTime; + public string AxisBattery; + public string DistDone; + public string InvDDone; + } + + /// + /// Vettore completo posizione (X-Y-Z con versori i-j-k) + /// + public class position + { + public float x; + public float y; + public float z; + public float i; + public float j; + public float k; + public position() + { + x = 0; + y = 0; + z = 0; + i = 0; + j = 0; + k = 0; + } + } + + /// + /// Dati Prod SCM (per decodifica) + /// + public class datiProdSCM + { + public string area; + public string fileName; + public string dimensioni; + public DateTime start; + public DateTime stop; + public TimeSpan tEff; + public TimeSpan tTot; + public int qta; + public TimeSpan tMed; + public datiProdSCM() + { + area = ""; + fileName = ""; + dimensioni = ""; + start = DateTime.Now; + stop = DateTime.Now; + tEff = new TimeSpan(0); + tTot = new TimeSpan(0); + qta = 0; + tMed = new TimeSpan(0); } /// - /// StFlag32: set di 32 bit (4 word) contente semaforo di variabili + /// crea un nuovo oggetto a partire da un array di stringhe /// - [Flags] - public enum StFlag32 : int + /// + public datiProdSCM(string[] valori) { - NONE = 0, - B00 = 1 << 0, - B01 = 1 << 1, - B02 = 1 << 2, - B03 = 1 << 3, - B04 = 1 << 4, - B05 = 1 << 5, - B06 = 1 << 6, - B07 = 1 << 7, - B08 = 1 << 8, - B09 = 1 << 9, - B10 = 1 << 10, - B11 = 1 << 11, - B12 = 1 << 12, - B13 = 1 << 13, - B14 = 1 << 14, - B15 = 1 << 15, - B16 = 1 << 16, - B17 = 1 << 17, - B18 = 1 << 18, - B19 = 1 << 19, - B20 = 1 << 20, - B21 = 1 << 21, - B22 = 1 << 22, - B23 = 1 << 23, - B24 = 1 << 24, - B25 = 1 << 25, - B26 = 1 << 26, - B27 = 1 << 27, - B28 = 1 << 28, - B29 = 1 << 29, - B30 = 1 << 30, - B31 = 1 << 31 + try + { + area = valori[0]; + fileName = valori[1]; + dimensioni = string.Format("{0}x{1}x{2}", valori[3], valori[4], valori[5]); + start = DateTime.Today.AddHours(Convert.ToInt16(valori[6])).AddMinutes(Convert.ToInt16(valori[7])).AddSeconds(Convert.ToInt16(valori[8])); + + stop = DateTime.Today.AddHours(Convert.ToInt16(valori[9])).AddMinutes(Convert.ToInt16(valori[10])).AddSeconds(Convert.ToInt16(valori[11])); + // se ore == 0 --> aggiungo 1 gg!!! + if (Convert.ToInt16(valori[9]) == 0) stop.AddDays(1); + + tEff = new TimeSpan(Convert.ToInt16(valori[12]), Convert.ToInt16(valori[13]), Convert.ToInt16(valori[14])); + + tTot = new TimeSpan(Convert.ToInt16(valori[15]), Convert.ToInt16(valori[16]), Convert.ToInt16(valori[17])); + + qta = Convert.ToInt16(valori[18]); + + tMed = new TimeSpan(Convert.ToInt16(valori[19]), Convert.ToInt16(valori[20]), Convert.ToInt16(valori[22]), Convert.ToInt16(valori[23])); + } + catch + { } } - /// - /// StatusBitMap: contiene il set di semafori/flag x status + allarmi (x classi) - /// - [Flags] - public enum StatusBitMap : int + } + /// + /// Allarme (per decodifica) + /// + public class allarme + { + public string codNum; + public string gruppo; + public string livello; + public string descrizione; + public allarme() { - NONE = 0, - ESTOP = 1 << 0, - RM_AUTO = 1 << 1, - RM_MANUAL = 1 << 2, - RM_MDI = 1 << 3, - RM_EDIT = 1 << 4, - EM_RUN = 1 << 5, - EM_READY = 1 << 6, - EM_STOP = 1 << 7, - EM_FEEDHOLD = 1 << 8, - HM = 1 << 9, - ST11 = 1 << 10, - ST12 = 1 << 11, - ST13 = 1 << 12, - ST14 = 1 << 13, - ST15 = 1 << 14, - ST16 = 1 << 15, - AL01 = 1 << 16, - AL02 = 1 << 17, - AL03 = 1 << 18, - AL04 = 1 << 19, - AL05 = 1 << 20, - AL06 = 1 << 21, - AL07 = 1 << 22, - AL08 = 1 << 23, - AL09 = 1 << 24, - AL10 = 1 << 25, - AL11 = 1 << 26, - AL12 = 1 << 27, - AL13 = 1 << 28, - AL14 = 1 << 29, - AL15 = 1 << 30, - AL16 = 1 << 31 + codNum = ""; + gruppo = ""; + livello = ""; + descrizione = ""; } + public allarme(string _codNum, string _gruppo, string _livello, string _descrizione) + { + codNum = _codNum; + gruppo = _gruppo; + livello = _livello; + descrizione = _descrizione; + } + } + + + /// + /// Dato generico (per decodifica) + /// + public class otherData + { + public string codNum; + public string memAddr; + public string varName; + public string dataType; + public otherData() + { + codNum = ""; + memAddr = ""; + varName = ""; + dataType = ""; + } + public otherData(string _codNum, string _memAddr, string _varName, string _dataType) + { + codNum = _codNum; + memAddr = _memAddr; + varName = _varName; + dataType = _dataType; + } + } + + + /// + /// Strobe: contiene il set di strobe di comunicazione + /// + /// rif: http://stackoverflow.com/questions/17209054/parse-bits-in-a-byte-to-enum + /// + [Flags] + public enum Strobe : int + { + NONE = 0, + M_CODE = 1 << 0, + S_CODE = 1 << 1, + T_CODE = 1 << 2, + PZ_OK = 1 << 3, + PZ_KO = 1 << 4, + FEED_SPEED = 1 << 5, + POS_ACT = 1 << 6, + SP07 = 1 << 7, + SP08 = 1 << 8, + SP09 = 1 << 9, + SP10 = 1 << 10, + SP11 = 1 << 11, + SP12 = 1 << 12, + SP13 = 1 << 13, + SP14 = 1 << 14, + SP15 = 1 << 15, + SP16 = 1 << 16, + SP17 = 1 << 17, + SP18 = 1 << 18, + SP19 = 1 << 19, + SP20 = 1 << 20, + SP21 = 1 << 21, + SP22 = 1 << 22, + SP23 = 1 << 23, + SP24 = 1 << 24, + SP25 = 1 << 25, + SP26 = 1 << 26, + SP27 = 1 << 27, + SP28 = 1 << 28, + SP29 = 1 << 29, + SP30 = 1 << 30, + SP31 = 1 << 31 + } + /// + /// StFlag8: set di 8 bit (1 word) contente semaforo di variabili + /// + [Flags] + public enum StFlag8 : int + { + NONE = 0, + B0 = 1 << 0, + B1 = 1 << 1, + B2 = 1 << 2, + B3 = 1 << 3, + B4 = 1 << 4, + B5 = 1 << 5, + B6 = 1 << 6, + B7 = 1 << 7 + } + /// + /// StFlag32: set di 32 bit (4 word) contente semaforo di variabili + /// + [Flags] + public enum StFlag32 : int + { + NONE = 0, + B00 = 1 << 0, + B01 = 1 << 1, + B02 = 1 << 2, + B03 = 1 << 3, + B04 = 1 << 4, + B05 = 1 << 5, + B06 = 1 << 6, + B07 = 1 << 7, + B08 = 1 << 8, + B09 = 1 << 9, + B10 = 1 << 10, + B11 = 1 << 11, + B12 = 1 << 12, + B13 = 1 << 13, + B14 = 1 << 14, + B15 = 1 << 15, + B16 = 1 << 16, + B17 = 1 << 17, + B18 = 1 << 18, + B19 = 1 << 19, + B20 = 1 << 20, + B21 = 1 << 21, + B22 = 1 << 22, + B23 = 1 << 23, + B24 = 1 << 24, + B25 = 1 << 25, + B26 = 1 << 26, + B27 = 1 << 27, + B28 = 1 << 28, + B29 = 1 << 29, + B30 = 1 << 30, + B31 = 1 << 31 + } + /// + /// StatusBitMap: contiene il set di semafori/flag x status + allarmi (x classi) + /// + [Flags] + public enum StatusBitMap : int + { + NONE = 0, + ESTOP = 1 << 0, + RM_AUTO = 1 << 1, + RM_MANUAL = 1 << 2, + RM_MDI = 1 << 3, + RM_EDIT = 1 << 4, + EM_RUN = 1 << 5, + EM_READY = 1 << 6, + EM_STOP = 1 << 7, + EM_FEEDHOLD = 1 << 8, + HM = 1 << 9, + ST11 = 1 << 10, + ST12 = 1 << 11, + ST13 = 1 << 12, + ST14 = 1 << 13, + ST15 = 1 << 14, + ST16 = 1 << 15, + AL01 = 1 << 16, + AL02 = 1 << 17, + AL03 = 1 << 18, + AL04 = 1 << 19, + AL05 = 1 << 20, + AL06 = 1 << 21, + AL07 = 1 << 22, + AL08 = 1 << 23, + AL09 = 1 << 24, + AL10 = 1 << 25, + AL11 = 1 << 26, + AL12 = 1 << 27, + AL13 = 1 << 28, + AL14 = 1 << 29, + AL15 = 1 << 30, + AL16 = 1 << 31 + } } \ No newline at end of file