From 0ccecfbaa38ecfc3ef3c5131fc39845849db4a97 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Tue, 19 Nov 2024 19:18:28 +0100 Subject: [PATCH] Mitsubishi - lerttura VAR da verificare (NON tiene Art/Comm) --- IOB-WIN-NEXT/DATA/CONF/VL28.ini | 5 +- IOB-WIN-NEXT/DATA/CONF/VL28.json | 40 +++- IOB-WIN-NEXT/Iob/Mitsubishi.cs | 319 ++++++++++++++++------------ TestPrelimCli/Mitsubishi/Program.cs | 6 +- 4 files changed, 217 insertions(+), 153 deletions(-) diff --git a/IOB-WIN-NEXT/DATA/CONF/VL28.ini b/IOB-WIN-NEXT/DATA/CONF/VL28.ini index 9ad444c1..90469029 100644 --- a/IOB-WIN-NEXT/DATA/CONF/VL28.ini +++ b/IOB-WIN-NEXT/DATA/CONF/VL28.ini @@ -55,10 +55,7 @@ BLINK_FILT=0 [OPTPAR] EZNC_SYS=EZNC_SYS_MELDAS700L ENABLE_PZCOUNT=TRUE -;PZCOUNT_MODE=STD|BIT -;PZCOUNT_MODE=STD.PAR.6711 -;PZGTOT_MODE=STD.PAR.6712 -;;PZREQ_MODE=STD.PAR.6713 +ENABLE_DYN_DATA=TRUE PZCOUNT_MODE=STD.PAR.8002 PZGTOT_MODE=STD.PAR.8001 PZREQ_MODE=STD.PAR.8003 diff --git a/IOB-WIN-NEXT/DATA/CONF/VL28.json b/IOB-WIN-NEXT/DATA/CONF/VL28.json index 3991bb77..c0593268 100644 --- a/IOB-WIN-NEXT/DATA/CONF/VL28.json +++ b/IOB-WIN-NEXT/DATA/CONF/VL28.json @@ -3,7 +3,7 @@ "setArt": { "name": "setArt", "description": "Articolo", - "memAddr": "NONE.01", + "memAddr": "", "tipoMem": "String", "index": 0, "size": 20, @@ -12,29 +12,29 @@ "setArtNum": { "name": "setArtNum", "description": "# Num Articolo", - "memAddr": "MACRO.966", + "memAddr": "VAR.501", "tipoMem": "Int", "index": 966, "size": 4, - "displOrdinal": 1 + "displOrdinal": 2 }, "setComm": { "name": "setComm", "description": "Commessa", - "memAddr": "NONE.02", + "memAddr": "", "tipoMem": "String", "index": 0, "size": 20, - "displOrdinal": 2 + "displOrdinal": 3 }, "setCommNum": { "name": "setCommNum", "description": "# NumCommessa", - "memAddr": "MACRO.965", + "memAddr": "VAR.500", "tipoMem": "Int", "index": 965, "size": 4, - "displOrdinal": 2 + "displOrdinal": 4 }, "setPzComm": { "name": "setPzComm", @@ -43,7 +43,16 @@ "tipoMem": "Int", "index": 8003, "size": 4, - "displOrdinal": 3 + "displOrdinal": 5 + }, + "setPzCommOdl": { + "name": "setPzCommOdl", + "description": "Qta ODL", + "memAddr": "VAR.502", + "tipoMem": "Int", + "index": 502, + "size": 4, + "displOrdinal": 6 } }, "mMapRead": { @@ -82,10 +91,23 @@ "period": 60, "factor": 1, "displOrdinal": 9 + }, + "DYNDATA": { + "name": "DYNDATA", + "description": "DynData check", + "memAddr": "", + "tipoMem": "String", + "index": 0, + "size": 4, + "func": "POINT", + "period": 60, + "factor": 1, + "displOrdinal": 20 } }, "mMapWriteLink": { "setArt": "setArtNum", - "setComm": "setCommNum" + "setComm": "setCommNum", + "setPzComm": "setPzCommOdl" } } \ No newline at end of file diff --git a/IOB-WIN-NEXT/Iob/Mitsubishi.cs b/IOB-WIN-NEXT/Iob/Mitsubishi.cs index 9b4e339d..29c9ce26 100644 --- a/IOB-WIN-NEXT/Iob/Mitsubishi.cs +++ b/IOB-WIN-NEXT/Iob/Mitsubishi.cs @@ -400,50 +400,75 @@ namespace IOB_WIN_NEXT.Iob // processo SOLO SE connected... if (connectionOk) { -#if false - if (MITSUBISHI_ref.Connected) - { - stopwatch.Restart(); - EgwProxy.MultiCncLib.Focas1.ODBDY2_1 answ = MITSUBISHI_ref.getAllDynData(); - if (utils.CRB("recTime")) - { - TimingData.addResult(cIobConf.codIOB, string.Format("PROC-DYN-DATA"), stopwatch.ElapsedTicks); - } + // leggo i valori Var + ReadMitsubVars(); - try + // cerco tra tutte le aree write le VARS... + foreach (var item in memMap.mMapWrite) + { + if(item.Value.memAddr.StartsWith("VAR")) { - string actf = answ.actf.ToString(); - string acts = answ.acts.ToString(); - //string numAlarm = memName.alarm.ToString(); - // preparo i singoli valori dell'array... - //outVal.Add("DYNDATA", string.Format("{0}#{1}#{2}", actf, acts, numAlarm)); - outVal.Add("DYNDATA", string.Format("FEED {0}#SPEED_RPM {1}", actf, acts)); - if (utils.CRB("SendFeedSpeed")) + // certo in dict ed accodo... + int iVar = 0; + string sVar = item.Value.memAddr.Replace("VAR.", ""); + int.TryParse(sVar, out iVar); + if(iVar>0) { - outVal.Add("FEED", actf); - outVal.Add("SPEED_RPM", acts); - //outVal.Add("NUM_ALARM", numAlarm); - } - if (utils.CRB("SendAxPos")) - { - // salvo le posizioni... - EgwProxy.MultiCncLib.Focas1.FAXIS posAx = answ.pos; - int[] currPosAbs = posAx.absolute; - int i = 0; - foreach (var item in currPosAbs) + // cerco in dizionario... + if(DictVar.ContainsKey(iVar)) { - i++; - outVal.Add(string.Format("POS_{0:00}", i), item.ToString()); + outVal.Add(item.Key, $"{DictVar[iVar]}"); + upsertKey(item.Key, $"{DictVar[iVar]}"); } } } - catch (Exception exc) - { - lgError(exc, "Errore in getDynData"); - } - stopwatch.Stop(); } -#endif + // cerco tra tutte le aree read le VARS... + foreach (var item in memMap.mMapRead) + { + if (item.Value.memAddr.StartsWith("VAR")) + { + // certo in dict ed accodo... + int iVar = 0; + string sVar = item.Value.memAddr.Replace("VAR.", ""); + int.TryParse(sVar, out iVar); + if (iVar > 0) + { + // cerco in dizionario... + if (DictVar.ContainsKey(iVar)) + { + outVal.Add(item.Key, $"{DictVar[iVar]}"); + upsertKey(item.Key, $"{DictVar[iVar]}"); + } + } + } + } + // aggiungo DynData... calcolato come variazione pezzi e lampade... + if (outVal.ContainsKey("DYNDATA")) + { + outVal.Remove("DYNDATA"); + } + StringBuilder sb = new StringBuilder(); + // inserisco i segnali + sb.Append("SIGN_["); + foreach (var item in DictSign) + { + sb.Append($"{item.Key}:{item.Value}|"); + } + // inserisco parametri + sb.Append("]_PAR_["); + foreach (var item in DictParam) + { + sb.Append($"{item.Key}:{item.Value}|"); + } + // inserisco le variabili + sb.Append("]_VAR_["); + foreach (var item in outVal) + { + sb.Append($"{item.Value},"); + } + sb.Append("]"); + outVal.Add("DYNDATA", sb.ToString()); } return outVal; } @@ -687,26 +712,7 @@ namespace IOB_WIN_NEXT.Iob } currDispData.semIn = Semaforo.SV; - // in primis: leggo i valor in sequenza e salvo in dizionario... - object pvRead = "bbb"; - // sezione segnali: cablata 53... - int sec = 53; - // Start da Y60 (Hex) --> 10000+96 - for (int i = SignStart; i < SignStart + SignSize; i++) - { - oEZNcAutCom.Generic_ReadData(0, sec, i, ref pvRead); - UpsertSign(i, $"{pvRead}"); - if (verboseLog) - { - lgTrace($"Sign | {i} : {pvRead}"); - } - } - // recording tempi - if (utils.CRB("recTime")) - { - TimingData.addResult(cIobConf.codIOB, $"Sign{SignSize}-R", stopwatch.ElapsedTicks); - } - stopwatch.Stop(); + ReadMitsubGenData(); // salvo il solo BYTE dell'input decifrando il semaforo... decodeToBitmap(); reportRawInput(ref currDispData); @@ -843,41 +849,6 @@ namespace IOB_WIN_NEXT.Iob return answ; } - /// - /// Override salvataggio valori in memoria... - /// - /// tipo di DUMP - public override void saveMemDump(dumpType tipo) - { -#if false - // se l'area ha una size > 0... - if (areaD.arraySize > 0) - { - dump_MemArea(tipo, MITSUBISHI.MemType.D, areaD.startIdx, areaD.arraySize); - } - // se l'area ha una size > 0... - if (areaR.arraySize > 0) - { - dump_MemArea(tipo, MITSUBISHI.MemType.R, areaR.startIdx, areaR.arraySize); - } - // se l'area ha una size > 0... - if (areaX.arraySize > 0) - { - dump_MemArea(tipo, MITSUBISHI.MemType.X, areaX.startIdx, areaX.arraySize); - } - // se l'area ha una size > 0... - if (areaY.arraySize > 0) - { - dump_MemArea(tipo, MITSUBISHI.MemType.Y, areaY.startIdx, areaY.arraySize); - } - // se l'area ha una size > 0... - if (areaPAR.arraySize > 0) - { - dump_ParArea(tipo, areaPAR.startIdx, areaPAR.arraySize); - } -#endif - } - /// /// Effettua impostazione del valore numerico ARTICOLO (specifico MITSUBISHI) /// @@ -1163,6 +1134,7 @@ namespace IOB_WIN_NEXT.Iob // Open communication int iRet = 0; + oEZNcAutCom = new EZNCAUTLib.DispEZNcCommunication(); iRet = oEZNcAutCom.SetTCPIPProtocol(ipAddr, ezPort); iRet = oEZNcAutCom.Open3((int)sysType, 1, 10, hostName); parentForm.commPlcActive = false; @@ -1244,53 +1216,8 @@ namespace IOB_WIN_NEXT.Iob #endregion Public Methods - #region Internal Fields - - /// - /// LookUpTable di decodifica da CNC a segnali tipo bitmap MAPO - /// - internal Dictionary signLUT = new Dictionary(); - - #endregion Internal Fields - #region Internal Enums - internal enum MemType - { - /// - /// Valori generico (es Y60 )x60, hex) --> 10'000 + 96 = 10'096 - /// - GenData, - - /// - /// Parametri # - /// - Param, - - /// - /// Var100 - /// - Var100, - - /// - /// Var500 - /// - Var500 - } - - internal enum PROGRAMTYPE - { - /// - /// Main Program メインプログラム - /// - EZNC_MAINPRG = 0, - - /// - /// Sub Program サブプログラム - /// - EZNC_SUBPRG = 1, - } - /// /// Controllo specifico da gestire /// @@ -1381,7 +1308,9 @@ namespace IOB_WIN_NEXT.Iob #region Private Fields private DateTime lastParRefr = DateTime.Now; + private DateTime lastSigRefr = DateTime.Now; + private DateTime lastVarRefr = DateTime.Now; /// @@ -1409,6 +1338,11 @@ namespace IOB_WIN_NEXT.Iob /// private int ParamStart = 8000; + /// + /// LookUpTable di decodifica da CNC a segnali tipo bitmap MAPO + /// + private Dictionary signLUT = new Dictionary(); + /// /// Num celle Signal da leggere /// @@ -1426,6 +1360,26 @@ namespace IOB_WIN_NEXT.Iob #endregion Private Fields + #region Private Enums + + /// + /// Tipo program + /// + private enum PROGRAMTYPE + { + /// + /// Main Program メインプログラム + /// + EZNC_MAINPRG = 0, + + /// + /// Sub Program サブプログラム + /// + EZNC_SUBPRG = 1, + } + + #endregion Private Enums + #region Private Properties /// @@ -1441,7 +1395,7 @@ namespace IOB_WIN_NEXT.Iob /// /// Dictionary contenuto memorie Var /// - private Dictionary DictVar { get; set; } = new Dictionary(); + private Dictionary DictVar { get; set; } = new Dictionary(); private string memAddrArt { @@ -2022,6 +1976,45 @@ namespace IOB_WIN_NEXT.Iob return answ; } + /// + /// Lettura dati generici (es var Y) + /// + private void ReadMitsubGenData() + { + DateTime adesso = DateTime.Now; + int parSPeriod = samplePeriod; + // controllo se sia passato il samplePeriod minimo... + if (adesso.Subtract(lastSigRefr.AddMilliseconds(parSPeriod)).TotalSeconds > 0) + { + lastSigRefr = adesso; + stopwatch.Restart(); + // in primis: leggo i valor in sequenza e salvo in dizionario... + object pvRead = "bbb"; + // sezione segnali: cablata 53... + int sec = 53; + // Start da Y60 (Hex) --> 10000+96 + for (int i = SignStart; i < SignStart + SignSize; i++) + { + oEZNcAutCom.Generic_ReadData(0, sec, i, ref pvRead); + UpsertSign(i, $"{pvRead}"); + if (verboseLog) + { + lgTrace($"Sign | {i} : {pvRead}"); + } + } + // recording tempi + if (utils.CRB("recTime")) + { + TimingData.addResult(cIobConf.codIOB, $"Sign{SignSize}-R", stopwatch.ElapsedTicks); + } + stopwatch.Stop(); + } + else + { + lgTrace($"Saltata ReadMitsubGenData x periodo minimo {parSPeriod} ms"); + } + } + /// /// Lettura area parametri mitsubishi come configurato /// @@ -2056,6 +2049,41 @@ namespace IOB_WIN_NEXT.Iob } } + /// + /// Lettura area Var100/Var500 mitsubishi come configurato + /// + private void ReadMitsubVars() + { + DateTime adesso = DateTime.Now; + int parSPeriod = samplePeriod * 5; + // controllo se sia passato il samplePeriod minimo... + if (adesso.Subtract(lastVarRefr.AddMilliseconds(parSPeriod)).TotalSeconds > 0) + { + lastVarRefr = adesso; + // per prima cosa processo la lettura Variabili e li salvo in DICT + double pData = 0; + int pType = 0; + stopwatch.Restart(); + for (int i = MemVarStart; i < MemVarStart + MemVarSize; i++) + { + oEZNcAutCom.CommonVariable_Read2(i, out pData, out pType); + UpsertVar(i, pData); + if (verboseLog) + { + lgTrace($"Var | {i} : {pData}"); + } + } + if (utils.CRB("recTime")) + { + TimingData.addResult(cIobConf.codIOB, $"R{MemVarSize}-VAR", stopwatch.ElapsedTicks); + } + } + else + { + lgTrace($"Saltata ReadMitsubVars x periodo minimo {parSPeriod} ms"); + } + } + /// /// Upsert info in DICT dei Params (es 8001..8003 contatori pezzi) /// @@ -2090,6 +2118,23 @@ namespace IOB_WIN_NEXT.Iob } } + /// + /// Upsert info in DICT dei VAR (es Var100, Var500) + /// + /// + /// + private void UpsertVar(int key, double value) + { + if (DictVar.ContainsKey(key)) + { + DictVar[key] = value; + } + else + { + DictVar.Add(key, value); + } + } + #endregion Private Methods } } \ No newline at end of file diff --git a/TestPrelimCli/Mitsubishi/Program.cs b/TestPrelimCli/Mitsubishi/Program.cs index e449eae5..f3d1bcf6 100644 --- a/TestPrelimCli/Mitsubishi/Program.cs +++ b/TestPrelimCli/Mitsubishi/Program.cs @@ -146,9 +146,9 @@ namespace Mitsubishi oEZNcAutCom.CommonVariable_SetName(502, "NumPz"); oEZNcAutCom.CommonVariable_SetName(503, ""); - oEZNcAutCom.CommonVariable_Write2(500, 104, 1); - oEZNcAutCom.CommonVariable_Write2(501, 204, 1); - oEZNcAutCom.CommonVariable_Write2(502, 304, 1); + oEZNcAutCom.CommonVariable_Write2(500, 105, 1); + oEZNcAutCom.CommonVariable_Write2(501, 205, 1); + oEZNcAutCom.CommonVariable_Write2(502, 305, 1); oEZNcAutCom.CommonVariable_Write2(503, 0, 1); DoLog("CommonVariable 500..503 Write Done!"); DoLog(sep);