diff --git a/IOB-WIN-NEXT/IobRest/Base.cs b/IOB-WIN-NEXT/IobRest/Base.cs index a2db08b6..3ac2a2e6 100644 --- a/IOB-WIN-NEXT/IobRest/Base.cs +++ b/IOB-WIN-NEXT/IobRest/Base.cs @@ -39,41 +39,6 @@ namespace IOB_WIN_NEXT.IobRest } } - protected void setupRestConf(string restConfFile) - { - - // se ho file specifico - if (!string.IsNullOrEmpty(getOptJsonKVP("REST_CONF"))) - { - string rawData = ""; - // leggo file e decodifico... - string confPath = $"{Application.StartupPath}/DATA/CONF/{restConfFile}"; - lgInfo($"Apertura file {confPath}"); - using (StreamReader sr = new StreamReader(confPath)) - { - rawData = sr.ReadToEnd().Replace("\n", "").Replace("\r", ""); - } - // continuo decodifica - if (!string.IsNullOrEmpty(rawData)) - { - restParams = JsonConvert.DeserializeObject(rawData); - if (restParams != null) - { - // inizializzo dal file di conf le variabili necessarie... - tOutSec = restParams.timeOutSec; - apiUrl = restParams.apiUrl ?? "http://localhost:8733"; - } - } - } - - // sistemo conf standard x call REST - restOptStd = new RestClientOptions - { - Timeout = TimeSpan.FromSeconds(tOutSec), - BaseUrl = new Uri(apiUrl) - }; - } - #endregion Public Constructors #region Public Methods @@ -233,7 +198,7 @@ namespace IOB_WIN_NEXT.IobRest } /// - /// Effettua lettura semafori principale + /// Effettua lettura semafori principale /// Parametri da aggiornare x display in form /// public override void readSemafori(ref newDisplayData currDispData) @@ -251,8 +216,10 @@ namespace IOB_WIN_NEXT.IobRest } currDispData.semIn = Semaforo.SV; + // effettua refresh dati da leggere SPECIFICi x citizen... + refreshData(); // decodifica e gestione - decodeToBaseBitmap(); + decodeToBaseBitmap(ref currDispData); // display reportRawInput(ref currDispData); } @@ -267,22 +234,363 @@ namespace IOB_WIN_NEXT.IobRest lgDebug($"[VETO readSemafori] | veto attivo alle {adesso:yyyy.MM.dd HH:mm:ss}"); checkVetoQueueIn(); } - } + /// + /// Override connessione + /// + public override void tryConnect() + { + if (!connectionOk) + { + // controllo che il ping sia stato tentato almeno pingTestSec fa... + if (DateTime.Now.Subtract(lastPING).TotalSeconds > utils.CRI("pingTestSec")) + { + if (verboseLog || periodicLog) + { + lgInfo("Rest: ConnKO - tryConnect"); + } + // in primis salvo data ping... + lastPING = DateTime.Now; + // se passa il ping faccio il resto... + if (testPingMachine == IPStatus.Success) + { + string szStatusConnection = ""; + try + { + // ora provo connessione... + parentForm.commPlcActive = true; + // chiamo metodo connect + var checkResp = ExecuteCallGet(GetUrlResource("GetConnection")); + // forse va eliminato... + lgInfo($"GetConnection | {checkResp}"); + if (checkResp != null && checkResp.ToLower().Contains("true")) + { + connectionOk = true; + } + else + { + lgError($"Errore check connessione | checkResp: {checkResp}"); + } + // refresh stato connessione!!! + if (connectionOk) + { + queueInEnabCurr = true; + if (adpRunning) + { + lgInfo("Connessione OK"); + } + } + else + { + lgError("Impossibile procedere, connessione mancante..."); + } + } + catch (Exception exc) + { + lgFatal($"Errore nella connessione all'Adapter IobRest.Base: {szStatusConnection}{Environment.NewLine}{exc}"); + connectionOk = false; + lgInfo($"Eccezione in TryConnect, Adapter IobRest.Base NON running, pausa di {utils.CRI("waitRecMSec")} msec prima di ulteriori tentativi di riconnessione"); + } + } + else + { + // loggo no risposta ping ... + connectionOk = false; + if (verboseLog || periodicLog) + { + lgInfo($"Attenzione: Rest controllo PING fallito per IP {cIobConf.cncPingAddr}"); + } + } + } + } + else + { + needRefresh = true; + } + } + + public override void tryDisconnect() + { + // registro solo che è disconnesso + connectionOk = false; + queueInEnabCurr = false; + } + + #endregion Public Methods + + #region Protected Fields + + /// + /// Api Url di base x chiamate REST + /// + protected string apiUrl = "http://localhost:8733"; + + /// + /// Timeout chiamate REST + /// + protected int tOutSec = 60; + + #endregion Protected Fields + + #region Protected Properties + + /// + /// Parametri specifici Client Rest + /// + protected RestParamConf restParams { get; set; } = new RestParamConf(); + + #endregion Protected Properties + + #region Protected Methods + + /// + /// verifica stato ok ovvero connected oppure open + /// + /// + /// + protected bool checkStateOk(System.ServiceModel.CommunicationState currState) + { + bool answ = false; +#if false + answ == System.ServiceModel.CommunicationState.Opened || currState == System.ServiceModel.CommunicationState.Created; +#endif + return answ; + } + + /// + /// Esecuzione chiamata Rest tipo GET + /// + /// + /// + protected string ExecuteCallGet(string resource) + { + string answ = ""; + if (!string.IsNullOrEmpty(resource)) + { + // client chiamate rest + using (var client = new RestClient(restOptStd)) + { + var currReq = new RestRequest(resource, Method.Get); + currReq.AddHeader("Content-type", "application/json"); + // effettuo vera chiamata + var currResp = client.Get(currReq); + if (currResp.StatusCode == System.Net.HttpStatusCode.OK && currResp.Content != null) + { + answ = currResp.Content ?? ""; + } + } + } + return answ; + } + + /// + /// restituisce URL della risorsa eventualmente completato con token o altro + /// + /// + /// + protected string GetUrlResource(string resName) + { + string answ = ""; + if (restParams != null && restParams.CallList != null && restParams.CallList.Count > 0) + { + if (restParams.CallList.ContainsKey(resName)) + { + answ = restParams.CallList[resName].Url; + // eseguo eventuale sostituzione (se trovo "[[") + if (answ.Contains("[[")) + { + string pattern = @"\[\[.*\]\]"; + Regex regex = new Regex(pattern); + Match match = regex.Match(resName); + if (match.Success) + { + string key = match.Value.Replace("[[", "").Replace("]]", ""); + // cerco nella LUT... + if (RestDataLUT.ContainsKey(key)) + { + // sostituisco! + answ = answ.Replace($"[[{key}]]", RestDataLUT[key]); + } + } + } + } + } + return answ; + } + /// + /// Upsert in cache LUT del parametro + /// + /// + /// + protected void RestLutUpsert(string key, string value) + { + if (RestDataLUT.ContainsKey(key)) + { + RestDataLUT[key] = value; + } + else + { + RestDataLUT.Add(key, value); + } + } + + /// + /// Recupero valore da cache LUT + /// + /// + /// + protected string RestLutGet(string key) + { + string value = ""; + if (RestDataLUT.ContainsKey(key)) + { + value = RestDataLUT[key]; + } + return value; + } + /// + /// Metodo da overridare x scrivere DAVVERO i parametri sul PLC + /// + /// + protected override void plcWriteParams(ref List updatedPar) + { + lgTrace($"plcWriteParams: richiesta per {updatedPar.Count} params"); + foreach (var item in updatedPar) + { + lgInfo($"ITEM | {item.uid} | {item.value}"); + // salvo i valori di setup x prox pesata... + upsertKey(item.uid, item.value); +#if false + bool fatto = false; + bool isPesata = false; + bool isIN = false; + gestWeightOut answ = new gestWeightOut(); + // se è richiesta pesata IN/OUT --> mando chiamata + if (item.uid == "reqPesata") + { + isPesata = true; + isIN = item.reqValue.ToUpper() == "IN"; + //isIN = item.value.ToUpper() == "IN"; + try + { + answ = reqWeight(isIN); + } + catch (Exception exc) + { + lgError($"Eccezione in plcWriteParams.reqWeight | isIn: {isIN}{Environment.NewLine}{exc}"); + } + } + else if (item.uid == "RM" || item.uid.StartsWith("Cod")) + { + // comunque segno fatto x altri casi + fatto = true; + } + + // se è pesata... + if (isPesata) + { + // se è OK + if (answ.feedback == "C") + { + lgInfo($"reqWeight | Effettuato richiesta | {answ.feedback} | {answ.notes}"); + // resetto pesata + upsertKey(item.uid, ""); + } + else + { + lgError($"reqWeight | Errore in richiesta peso Rest | {answ.feedback} | {answ.notes}"); + } + item.value = ""; + item.reqValue = ""; + item.lastRead = DateTime.Now; + item.UM = ""; + // salvo esito richiesta comunque + upsertKey("logReq", $"{answ.feedback} | {answ.notes}"); + // faccio in modo di eseguire subito getDynData + demFactDynData = 1; + processDynData(); + } + else + { + // se fatto --> aggiorno! + if (fatto) + { + //item.value = item.reqValue; + item.reqValue = ""; + item.lastRead = DateTime.Now; + item.UM = ""; + } + } +#endif + } + } + + protected void setupRestConf(string restConfFile) + { + // se ho file specifico + if (!string.IsNullOrEmpty(getOptJsonKVP("REST_CONF"))) + { + string rawData = ""; + // leggo file e decodifico... + string confPath = $"{Application.StartupPath}/DATA/CONF/{restConfFile}"; + lgInfo($"Apertura file {confPath}"); + using (StreamReader sr = new StreamReader(confPath)) + { + rawData = sr.ReadToEnd().Replace("\n", "").Replace("\r", ""); + } + // continuo decodifica + if (!string.IsNullOrEmpty(rawData)) + { + restParams = JsonConvert.DeserializeObject(rawData); + if (restParams != null) + { + // inizializzo dal file di conf le variabili necessarie... + tOutSec = restParams.timeOutSec; + apiUrl = restParams.apiUrl ?? "http://localhost:8733"; + } + } + } + + // sistemo conf standard x call REST + restOptStd = new RestClientOptions + { + Timeout = TimeSpan.FromSeconds(tOutSec), + BaseUrl = new Uri(apiUrl) + }; + } + + #endregion Protected Methods + + #region Private Fields + + /// + /// LookUpTable informazioni raccolte + /// + protected Dictionary RestDataLUT = new Dictionary(); + + /// + /// Conf client RestSharp standard: + /// - timeout 1 min + /// + private RestClientOptions restOptStd = new RestClientOptions { Timeout = TimeSpan.FromSeconds(60) }; + + #endregion Private Fields + + #region Private Methods /// /// Effettua decodifica aree memoria alla bitmap usata x MAPO /// - private void decodeToBaseBitmap() + protected virtual void decodeToBaseBitmap(ref newDisplayData currDispData) { // init a zero... B_input = 0; if (queueInEnabCurr) { /* ----------------------------------------------------- - * bitmap MAPO STD 60 + * bitmap MAPO STD 60 * B0: POWER_ON * B1: RUN * B2: pzCount @@ -295,8 +603,6 @@ namespace IOB_WIN_NEXT.IobRest // per prima cosa controllo ping e se sia connesso... - - #if false if (connectionOk) { @@ -432,7 +738,7 @@ namespace IOB_WIN_NEXT.IobRest if (verboseLog) { lgInfo($"Trasformazione B_input: {B_input} | currRun = {currRun}"); - } + } #endif } else @@ -442,333 +748,11 @@ namespace IOB_WIN_NEXT.IobRest } /// - /// Esecuzione chiamata Rest tipo GET + /// Esegue lettura dati + salvataggio in LUT /// - /// - /// - protected string ExecuteCallGet(string resource) - { - string answ = ""; - if (!string.IsNullOrEmpty(resource)) - { - // client chiamate rest - using (var client = new RestClient(restOptStd)) - { - var currReq = new RestRequest(resource, Method.Get); - currReq.AddHeader("Content-type", "application/json"); - // effettuo vera chiamata - var currResp = client.Get(currReq); - if (currResp.StatusCode == System.Net.HttpStatusCode.OK && currResp.Content != null) - { - answ = $"{currResp.Content}"; - } - } - } - return answ; - } - - /// - /// LookUpTable informazioni raccolte - /// - protected Dictionary dataLUT = new Dictionary(); - - /// - /// restituisce URL della risorsa eventualmente completato con token o altro - /// - /// - /// - protected string GetUrlResource(string resName) - { - string answ = ""; - if (restParams != null && restParams.CallList != null && restParams.CallList.Count > 0) - { - if (restParams.CallList.ContainsKey(resName)) - { - answ = restParams.CallList[resName].Url; - // eseguo eventuale sostituzione (se trovo "[[") - if (answ.Contains("[[")) - { - string pattern = @"\[\[.*\]\]"; - Regex regex = new Regex(pattern); - Match match = regex.Match(resName); - if (match.Success) - { - string key = match.Value.Replace("[[", "").Replace("]]", ""); - // cerco nella LUT... - if (dataLUT.ContainsKey(key)) - { - // sostituisco! - answ = answ.Replace($"[[{key}]]", dataLUT[key]); - } - } - } - } - } - return answ; - } - - /// - /// Override connessione - /// - public override void tryConnect() - { - if (!connectionOk) - { - // controllo che il ping sia stato tentato almeno pingTestSec fa... - if (DateTime.Now.Subtract(lastPING).TotalSeconds > utils.CRI("pingTestSec")) - { - if (verboseLog || periodicLog) - { - lgInfo("Rest: ConnKO - tryConnect"); - } - // in primis salvo data ping... - lastPING = DateTime.Now; - // se passa il ping faccio il resto... - if (testPingMachine == IPStatus.Success) - { - string szStatusConnection = ""; - try - { - // ora provo connessione... - parentForm.commPlcActive = true; - - // chiamo metodo connect - var checkResp = ExecuteCallGet(GetUrlResource("GetConnection")); - // forse va eliminato... - lgInfo($"GetConnection | {checkResp}"); - if (checkResp != null && checkResp.ToLower().Contains("true")) - { - connectionOk = true; - } - else - { - lgError($"Errore check connessione | checkResp: {checkResp}"); - } - // refresh stato connessione!!! - if (connectionOk) - { - queueInEnabCurr = true; - if (adpRunning) - { - lgInfo("Connessione OK"); - } - } - else - { - lgError("Impossibile procedere, connessione mancante..."); - } - } - catch (Exception exc) - { - lgFatal($"Errore nella connessione all'Adapter IobRest.Base: {szStatusConnection}{Environment.NewLine}{exc}"); - connectionOk = false; - lgInfo($"Eccezione in TryConnect, Adapter IobRest.Base NON running, pausa di {utils.CRI("waitRecMSec")} msec prima di ulteriori tentativi di riconnessione"); - } - } - else - { - // loggo no risposta ping ... - connectionOk = false; - if (verboseLog || periodicLog) - { - lgInfo($"Attenzione: Rest controllo PING fallito per IP {cIobConf.cncPingAddr}"); - } - } - } - } - else - { - needRefresh = true; - } - } - - public override void tryDisconnect() - { - // registro solo che è disconnesso - connectionOk = false; - queueInEnabCurr = false; - } - - #endregion Public Methods - - #region Protected Fields - - /// - /// Api Url di base x chiamate REST - /// - protected string apiUrl = "http://localhost:8733"; - - /// - /// Timeout chiamate REST - /// - protected int tOutSec = 60; - - #endregion Protected Fields - - #region Protected Methods - - /// - /// verifica stato ok ovvero connected oppure open - /// - /// - /// - protected bool checkStateOk(System.ServiceModel.CommunicationState currState) - { - bool answ = false; -#if false - answ == System.ServiceModel.CommunicationState.Opened || currState == System.ServiceModel.CommunicationState.Created; -#endif - return answ; - } - - /// - /// Metodo da overridare x scrivere DAVVERO i parametri sul PLC - /// - /// - protected override void plcWriteParams(ref List updatedPar) - { - lgTrace($"plcWriteParams: richiesta per {updatedPar.Count} params"); - foreach (var item in updatedPar) - { - lgInfo($"ITEM | {item.uid} | {item.value}"); - // salvo i valori di setup x prox pesata... - upsertKey(item.uid, item.value); -#if false - bool fatto = false; - bool isPesata = false; - bool isIN = false; - gestWeightOut answ = new gestWeightOut(); - // se è richiesta pesata IN/OUT --> mando chiamata - if (item.uid == "reqPesata") - { - isPesata = true; - isIN = item.reqValue.ToUpper() == "IN"; - //isIN = item.value.ToUpper() == "IN"; - try - { - answ = reqWeight(isIN); - } - catch (Exception exc) - { - lgError($"Eccezione in plcWriteParams.reqWeight | isIn: {isIN}{Environment.NewLine}{exc}"); - } - } - else if (item.uid == "RM" || item.uid.StartsWith("Cod")) - { - // comunque segno fatto x altri casi - fatto = true; - } - - // se è pesata... - if (isPesata) - { - // se è OK - if (answ.feedback == "C") - { - lgInfo($"reqWeight | Effettuato richiesta | {answ.feedback} | {answ.notes}"); - // resetto pesata - upsertKey(item.uid, ""); - } - else - { - lgError($"reqWeight | Errore in richiesta peso Rest | {answ.feedback} | {answ.notes}"); - } - item.value = ""; - item.reqValue = ""; - item.lastRead = DateTime.Now; - item.UM = ""; - // salvo esito richiesta comunque - upsertKey("logReq", $"{answ.feedback} | {answ.notes}"); - // faccio in modo di eseguire subito getDynData - demFactDynData = 1; - processDynData(); - } - else - { - // se fatto --> aggiorno! - if (fatto) - { - //item.value = item.reqValue; - item.reqValue = ""; - item.lastRead = DateTime.Now; - item.UM = ""; - } - } -#endif - } - } - - #endregion Protected Methods - - #region Private Fields - - /// - /// Conf client RestSharp standard: - /// - timeout 1 min - /// - private RestClientOptions restOptStd = new RestClientOptions { Timeout = TimeSpan.FromSeconds(60) }; - - #endregion Private Fields - -#if false - /// - /// Esegue richiesta PESO - /// - /// Tipo richiesta: IN (true) / OUT (false) - /// - protected gestWeightOut reqWeight(bool reqIN) - { - lgInfo($"reqWeight | IN: {reqIN}"); - gestWeightOut answ = null; - try - { - Stopwatch sw = new Stopwatch(); - sw.Start(); - // preparo parametri - string tipoRic = reqIN ? "IN" : "OUT"; - string rm = getCurrProdData("RM", $"{DateTime.Now:yyyyMMdd-HHmmss}");// string.IsNullOrEmpty(currProdData["RM"]) ? $"{DateTime.Now:yyyyMMdd-HHmmss}" : currProdData["RM"]; - string Cod1 = getCurrProdData("Cod1", ""); //string.IsNullOrEmpty(currProdData["Cod1"]) ? "" : currProdData["Cod1"]; - string Cod2 = getCurrProdData("Cod2", ""); //string.IsNullOrEmpty(currProdData["Cod2"]) ? "" : currProdData["Cod2"]; - string Cod3 = getCurrProdData("Cod3", ""); //string.IsNullOrEmpty(currProdData["Cod3"]) ? "" : currProdData["Cod3"]; - string Cod4 = getCurrProdData("Cod4", ""); //string.IsNullOrEmpty(currProdData["Cod4"]) ? "" : currProdData["Cod4"]; - string Cod5 = getCurrProdData("Cod5", ""); //string.IsNullOrEmpty(currProdData["Cod5"]) ? "" : currProdData["Cod5"]; - string Cod6 = getCurrProdData("Cod6", ""); //string.IsNullOrEmpty(currProdData["Cod6"]) ? "" : currProdData["Cod6"]; - // faccio chiamata - answ = RestConn.memWeight(tipoRic, rm, Cod1, Cod2, Cod3, Cod4, Cod5, Cod6); - sw.Stop(); - lgInfo($"reqWeight: effettuata chiamata SOAP in {sw.Elapsed.TotalMilliseconds}ms | {dataFrom} --> {dataTo}"); - } - catch (Exception exc) - { - lgError($"reqWeight | errore richiesta pesatura{Environment.NewLine}{exc}"); - } - return answ; - } - - protected void SavePesata(ref Dictionary currDict, WeightRec newRec) - { - DictUpsert(ref currDict, "RM", newRec.RM ?? ""); - string tag = newRec.isIn ? "In" : "Out"; - DictUpsert(ref currDict, $"lastWeight{tag}", $"{newRec.weight:N2}"); - // registro record completo ultima pesata - DictUpsert(ref currDict, $"lastRec{tag}", formatPesata(newRec)); - // la aggiungo alle pesate archiviate... - AppendPesata(newRec); - } -#endif - - #region Private Properties - - - - - - /// - /// Parametri specifici Client Rest - /// - protected RestParamConf restParams { get; set; } = new RestParamConf(); - - #endregion Private Properties + protected virtual void refreshData() + { } + #endregion Private Methods } } \ No newline at end of file diff --git a/IOB-WIN-NEXT/IobRest/Citizen.cs b/IOB-WIN-NEXT/IobRest/Citizen.cs index 8e102ffd..4d0aa2de 100644 --- a/IOB-WIN-NEXT/IobRest/Citizen.cs +++ b/IOB-WIN-NEXT/IobRest/Citizen.cs @@ -1,13 +1,15 @@ - -using IOB_UT_NEXT; +using IOB_UT_NEXT; using MapoSDK; using Newtonsoft.Json; +using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; +using System.IO; using System.Linq; using System.Net.NetworkInformation; +using static IOB_WIN_NEXT.IobRest.Citizen.Responses; namespace IOB_WIN_NEXT.IobRest { @@ -34,25 +36,225 @@ namespace IOB_WIN_NEXT.IobRest { setupRestConf(getOptJsonKVP("REST_CONF")); } + // fixme todo levare forzatura test iniziale... + if (EnableTest || true) + { + // test folder salvataggio log + var appPath = System.Reflection.Assembly.GetExecutingAssembly().Location; + var fPath = Directory.GetParent(appPath).FullName; + basePath = Path.Combine(fPath, "Test"); + if (!Directory.Exists(basePath)) + { + Directory.CreateDirectory(basePath); + } + + string token = TestCitizenCall("gettoken/mecmaticames/mecmatica@mes"); + string gLamp = TestCitizenCall($"getsingleladderio/{token}/Y/8E"); + string yLamp = TestCitizenCall($"getsingleladderio/{token}/Y/21"); + string rLamp = TestCitizenCall($"getsingleladderio/{token}/Y/22"); + string qtyTot = TestCitizenCall($"gettotalquantity/{token}"); + string qtyReq = TestCitizenCall($"getneededquantity/{token}"); + string qtyWrk = TestCitizenCall($"getworkedquantity/{token}"); + string cTime = TestCitizenCall($"getcycletime/{token}"); + string pName = TestCitizenCall($"getmainprogram/{token}"); + + string cAlarm = ExecuteCallGet($"getalarm/{token}"); + var sAlarm = JsonConvert.DeserializeObject(cAlarm); + cAlarm = JsonConvert.SerializeObject(sAlarm, Formatting.Indented); + lgInfo($"Call: getalarm/{token} | resp: {cAlarm}"); + + string allAlarm = ExecuteCallGet($"getallalarmlog/{token}"); + var alarmList = JsonConvert.DeserializeObject>(allAlarm); + allAlarm = JsonConvert.SerializeObject(alarmList, Formatting.Indented); + lgInfo($"Call: getallalarmlog/{token} | resp: {allAlarm}"); + + string err = TestCitizenCall($"getsingleladderio/ABC/Y/22"); + + // salvo i valori + File.WriteAllText(Path.Combine(basePath, "token.txt"), token); + File.WriteAllText(Path.Combine(basePath, "gLamp.txt"), gLamp); + File.WriteAllText(Path.Combine(basePath, "yLamp.txt"), yLamp); + File.WriteAllText(Path.Combine(basePath, "rLamp.txt"), rLamp); + File.WriteAllText(Path.Combine(basePath, "qtyTot.txt"), qtyTot); + File.WriteAllText(Path.Combine(basePath, "qtyReq.txt"), qtyReq); + File.WriteAllText(Path.Combine(basePath, "qtyWrk.txt"), qtyWrk); + File.WriteAllText(Path.Combine(basePath, "cTime.txt"), cTime); + File.WriteAllText(Path.Combine(basePath, "pName.txt"), pName); + File.WriteAllText(Path.Combine(basePath, "cAlarm.txt"), cAlarm); + File.WriteAllText(Path.Combine(basePath, "allAlarm.txt"), allAlarm); + File.WriteAllText(Path.Combine(basePath, "err.txt"), err); + } } + #endregion Public Constructors + + #region Public Methods + + /// + /// Override connessione + /// + public override void tryConnect() + { + if (!connectionOk) + { + // controllo che il ping sia stato tentato almeno pingTestSec fa... + if (DateTime.Now.Subtract(lastPING).TotalSeconds > utils.CRI("pingTestSec")) + { + if (verboseLog || periodicLog) + { + lgInfo("Rest: ConnKO - tryConnect"); + } + // in primis salvo data ping... + lastPING = DateTime.Now; + bool checkMachine = false; + // se passa il ping faccio il resto... + if (testPingMachine == IPStatus.Success) + { + string szStatusConnection = ""; + try + { + // ora provo connessione... + parentForm.commPlcActive = true; + + // chiamo metodo connect + var checkResp = ExecuteCallGet(GetUrlResource("GetConnection")); + lgInfo($"GetConnection | {checkResp}"); + bool.TryParse(checkResp, out checkMachine); + // forse va eliminato... + if (checkMachine) + { + connectionOk = true; + queueInEnabCurr = true; + if (adpRunning) + { + lgInfo("Connessione OK"); + } + } + else + { + lgError($"Errore check connessione | checkResp: {checkResp}"); + } + } + catch (Exception exc) + { + lgFatal($"Errore nella connessione all'Adapter IobRest.Base: {szStatusConnection}{Environment.NewLine}{exc}"); + connectionOk = false; + lgInfo($"Eccezione in TryConnect, Adapter IobRest.Base NON running, pausa di {utils.CRI("waitRecMSec")} msec prima di ulteriori tentativi di riconnessione"); + } + } + else + { + // loggo no risposta ping ... + connectionOk = false; + if (verboseLog || periodicLog) + { + lgInfo($"Attenzione: Rest controllo PING fallito per IP {cIobConf.cncPingAddr}"); + } + } + } + } + else + { + needRefresh = true; + } + } + + #endregion Public Methods + + #region Internal Classes + + /// + /// Struttura delle risposte alle chiamare REST specifiche + /// + internal class Responses + { + #region Internal Classes + + /// + /// Struttura info restituiti da AlarmList + /// + internal class AlarmInfo + { + #region Public Properties + + public DateTime date { get; set; } = DateTime.Today.AddYears(-10); + public string ErrorMessage { get; set; } = ""; + public int id { get; set; } = 0; + public string message { get; set; } = ""; + public string type { get; set; } = ""; + + #endregion Public Properties + } + + /// + /// Struttura info restituiti x lettura Ladder + /// + internal class LadderIO + { + #region Public Properties + + public string Address { get; set; } = ""; + public string Description { get; set; } = ""; + public string ErrorMessage { get; set; } = ""; + public string IOType { get; set; } = ""; + public string VarValue { get; set; } = ""; + + #endregion Public Properties + } + + /// + /// Struttura dato AlarmState (singolo, corrente) + /// + internal class WarnInfo + { + #region Public Properties + + public string ErrorMessage { get; set; } = ""; + public bool IsAlarm { get; set; } = false; + public bool IsCaution { get; set; } = false; + public string message { get; set; } = ""; + + #endregion Public Properties + } + + #endregion Internal Classes + } + + #endregion Internal Classes + + #region Private Fields + + private string basePath = ""; + + #endregion Private Fields + + #region Private Properties + + /// + /// Elenco pesate attuali + /// + private List listAllarmiCurr { get; set; } = new List(); /// /// CHiave redis di salvataggio ultimo set di allarmi scaricato /// private string redKeyAlarm { get; set; } = ""; + #endregion Private Properties + + #region Private Methods + /// /// Effettua decodifica aree memoria alla bitmap usata x MAPO /// - private void decodeToBaseBitmap() + protected override void decodeToBaseBitmap(ref newDisplayData currDispData) { // init a zero... B_input = 0; if (queueInEnabCurr) { /* ----------------------------------------------------- - * bitmap MAPO STD 60 + * bitmap MAPO STD 60 * B0: POWER_ON * B1: RUN * B2: pzCount @@ -65,34 +267,34 @@ namespace IOB_WIN_NEXT.IobRest // per prima cosa controllo ping e se sia connesso... - - -#if false - if (connectionOk) - { - B_input = 1; - currDispData.semIn = Semaforo.SV; - - // se ho pesate in memoria nel periodo richiesto --> RUN - if (listPesateCurr != null && listPesateCurr.Count > 0) + if (connectionOk) { - B_input += (1 << 1); + B_input = 1; + currDispData.semIn = Semaforo.SV; + + // controllo lampade... da rosso a verde... + if(RestLutGet("rLamp")=="1") + { + B_input += (1 << 3); + } + else if (RestLutGet("yLamp") == "1") + { + B_input += (1 << 4); + } + else if (RestLutGet("gLamp") == "1") + { + B_input += (1 << 1); + } + + // accodo NON emergenza ... poi da cercare meglio... + B_input += (1 << 7); } - // metto manuale else { - B_input += (1 << 4); + B_input = 0; + currDispData.semIn = Semaforo.SR; } - // accodo NON emergenza - B_input += (1 << 7); - } - else - { - B_input = 0; - currDispData.semIn = Semaforo.SR; - } -#endif #if false // Controllo booleano PING e POWERON... @@ -202,30 +404,152 @@ namespace IOB_WIN_NEXT.IobRest if (verboseLog) { lgInfo($"Trasformazione B_input: {B_input} | currRun = {currRun}"); - } + } #endif } else { - lgDebug($"[VETO getDataItemValue] | veto attivo alle {DateTime.Now:yyyy.MM.dd HH:mm:ss}"); + lgDebug($"[VETO queueInEnabCurr] | veto attivo alle {DateTime.Now:yyyy.MM.dd HH:mm:ss}"); } } - #endregion Public Constructors - - - protected class AlarmRec + /// + /// Esegue lettura dati + salvataggio in LUT + /// + protected override void refreshData() { - public int id { get; set; } = 0; - public DateTime date { get; set; } = DateTime.Now; - public string message { get; set; } = ""; - public string type { get; set; } = ""; + bool checkMachine = false; + LadderIO ladderResp = new LadderIO(); + // in primis testo che sia connessa... + var checkResp = ExecuteCallGet(GetUrlResource("GetConnection")); + lgInfo($"GetConnection | {checkResp}"); + bool.TryParse(checkResp, out checkMachine); + + // proseguo SOLO SE macchina OK, altrimenti disconnetto... + if (checkMachine) + { + // faccio refresh token comunque... + string token = ExecuteCallGet(GetUrlResource("GetToken")); + RestLutUpsert("token", token); + + // ora controllo valori lampada SE scaduti + // FixMe ToDo !!! gestione con scadenza info x evitare troppe letture... + if (true) + { + // resetto 3 valori lamp + RestLutUpsert("gLamp", "0"); + RestLutUpsert("yLamp", "0"); + RestLutUpsert("rLamp", "0"); + + int signVal = 0; + string gLamp = ExecuteCallGet(GetUrlResource("GetLampGreen")); + ladderResp = JsonConvert.DeserializeObject(gLamp); + if (string.IsNullOrEmpty(ladderResp.ErrorMessage)) + { + int.TryParse(gLamp, out signVal); + RestLutUpsert("gLamp", gLamp); + } + + // se il valore è zero --> proseguo con yellow! + if (signVal == 0) + { + string yLamp = ExecuteCallGet(GetUrlResource("GetLampYellow")); + ladderResp = JsonConvert.DeserializeObject(yLamp); + if (string.IsNullOrEmpty(ladderResp.ErrorMessage)) + { + int.TryParse(yLamp, out signVal); + RestLutUpsert("yLamp", yLamp); + } + } + + // se il valore è zero --> proseguo con red! + if (signVal == 0) + { + string rLamp = ExecuteCallGet(GetUrlResource("GetLampRed")); + ladderResp = JsonConvert.DeserializeObject(rLamp); + if (string.IsNullOrEmpty(ladderResp.ErrorMessage)) + { + int.TryParse(rLamp, out signVal); + RestLutUpsert("rLamp", rLamp); + } + } + } + } + else + { + tryDisconnect(); + } } /// - /// Elenco pesate attuali + /// Esegue gestioen contapezzi... /// - private List listAllarmiCurr { get; set; } = new List(); + public override void processContapezzi() + { + bool checkMachine = false; + LadderIO ladderResp = new LadderIO(); + // in primis testo che sia connessa... + var checkResp = ExecuteCallGet(GetUrlResource("GetConnection")); + lgInfo($"GetConnection | {checkResp}"); + bool.TryParse(checkResp, out checkMachine); + // proseguo SOLO SE macchina OK, altrimenti disconnetto... + if (checkMachine) + { + // faccio refresh token comunque... + string token = ExecuteCallGet(GetUrlResource("GetToken")); + RestLutUpsert("token", token); + + // contapezzi corrente + int intVal = 0; + string qtyWrk = ExecuteCallGet(GetUrlResource("GetQtyProd")); + int.TryParse(qtyWrk, out intVal); + contapezziPLC = intVal; + RestLutUpsert("qtyWrk", qtyWrk); + + // gestione altri contapezzi x + string qtyTot = ExecuteCallGet(GetUrlResource("GetQtyTot")); + string qtyReq = ExecuteCallGet(GetUrlResource("GetQtyReq")); + RestLutUpsert("qtyTot", qtyTot); + RestLutUpsert("qtyReq", qtyReq); + // gestione tempociclo e nome programma... + string cTime = ExecuteCallGet(GetUrlResource("GetCycleTime")); + string pName = ExecuteCallGet(GetUrlResource("GetProgName")); + RestLutUpsert("cTime", cTime); + RestLutUpsert("pName", pName); + } + } + + /// + /// Recupero dati DYN, impiegando i valori della LUT... + /// + /// + public override Dictionary getDynData() + { + return RestDataLUT; + } + + /// + /// Recupera il progName in modalità custom... + /// + /// + public override string getPrgName() + { + return RestLutGet("pName"); + } + + /// + /// Test Chiamata Citizen + /// + /// + /// + private string TestCitizenCall(string urlReq) + { + string answ = ExecuteCallGet(urlReq); + lgInfo($"Call: {urlReq} | resp: {answ}"); + return answ; + } + + #endregion Private Methods } } \ No newline at end of file