using MTC; using MTConnect; using System; namespace SCMA.AdapterCom { public class GatewayMTC : Gateway { /// /// adapter globale MTC /// /// public Adapter mAdapter = new Adapter(); #region gestione globale oggetto /// /// wrapper init /// public GatewayMTC() { protocollo = gwProtocol.MTC; } /// /// Wrapper metodo Begin /// public override void beginDataCollect() { mAdapter.Begin(); } /// /// Wrapper metodo SendChanged /// public override void sendChanged() { mAdapter.SendChanged(); } /// /// Wrapper metodo imposta tutto a UNAVAILABLE /// public override void setAllUnavailable() { mAdapter.Unavailable(); } /// /// Wrapper metodo START /// public override void start() { mAdapter.Port = port; mAdapter.Start(); } /// /// Wrapper metodo STOP /// public override void stop() { mAdapter.Stop(); } #endregion #region gestione controllo stato catena applicativi e messaggi da piattaforma /// /// Data-Ora ultima risposta AGENT x testing PROBE /// protected DateTime lastCurrProbe; /// /// Valore testuale ultima risposta agent (currentProbe) /// protected string currProbe; /// /// Valore testuale ultima risposta agent (StatusCurrent) /// protected string currStatus; /// /// Verifica lo stato di un servizio indicato per via numerica: /// 1: verifica che l'AGENT sia attivo (risponde a porta 5000 con qualcosa) /// 2: verifica risposta AGENT: deve essere XML e deve contenere stringa "MTConnectDevices" /// 3: verifica che lo status (localhost:5000/current) contenga qualcosa /// /// /// public override bool checkStatus(int numServ) { // in primis verifico se ho una risposta recente (< 2 sec) dall'agent... if (lastCurrProbe == null || lastCurrProbe.AddSeconds(2) < DateTime.Now) { // altrimenti carico la risposta refreshAgentResp(); } // ora so x certo che ho caricato dati recenti... bool answ = false; switch (numServ) { case 1: answ = (currProbe != ""); break; case 2: answ = (currProbe.IndexOf("MTConnectDevices") >= 0 && currProbe.IndexOf("xml") >= 0); break; case 3: answ = (currStatus != ""); break; default: break; } return answ; } /// /// Effettua una chiamata all'agent e salva valore e data chiamata... /// private void refreshAgentResp() { // controllo catena AGENT: cerco di scaricare il PROBE alla porta 5000 try { currProbe = callUrl("http://localhost:5000"); } catch { currProbe = ""; } // controllo catena AGENT x CURRENT STATUS: cerco di scaricare /current alla porta 5000 try { currStatus = callUrl("http://localhost:5000/current"); } catch { currStatus = ""; } lastCurrProbe = DateTime.Now; } #endregion #region gestione nodi (dataItems, conditions) public override void addItemNodeByType(string key, itemType tipo) { if (!itemNodes.ContainsKey(key)) { // in base al TIPO genero l'oggetto corretto... DataItem currObj; switch (tipo) { case itemType.Condition: currObj = new Condition(key); break; case itemType.Event: currObj = new Event(key); break; case itemType.Message: currObj = new Message(key); break; case itemType.Sample: currObj = new Sample(key); break; default: currObj = new DataItem(key); break; } mAdapter.AddDataItem(currObj); if (tipo == itemType.Condition) { addConditionNode(key, currObj); addItemNode(key, currObj); } else { addItemNode(key, currObj); } } } /// Effettua chiamata VERA su adapter MTConnect... /// /// public override void addItemNode(string key, object value) { if (!itemNodes.ContainsKey(key)) { base.addItemNode(key, value); // aggiungo ad adapter mAdapter.RemoveDataItem((DataItem)value); mAdapter.AddDataItem((DataItem)value); } } /// /// Effettua chiamata VERA su adapter MTConnect... /// /// public override void addItemNode(object value) { DataItem currObj = (DataItem)value; string key = value.ToString().Replace("|", ""); try { key = key.Replace(currObj.Value.ToString(), ""); } catch { } if (!itemNodes.ContainsKey(key)) { base.addItemNode(key, value); // aggiungo ad adapter mAdapter.AddDataItem((DataItem)value); } } /// /// Wrapper metodo rimozione di TUTTI gli ITEMS /// public override void removeAllItemNodes() { foreach (var item in itemNodes) { // rimuovo da MTC mAdapter.RemoveDataItem((DataItem)item.Value.cObject); } base.removeAllItemNodes(); } /// /// Wrapper metodo rimozione ITEMS /// /// public override void removeItemNode(string key) { // rimuovo da MTC mAdapter.RemoveDataItem((DataItem)itemNodes[key].cObject); // rimuovo da vett interno base.removeItemNode(key); } public override void updateItemNodeValue(string key, object value) { ((DataItem)getItemNode(key)).Value = value; } public override void updateItemNodeCodeValue(string key, string code, object value) { ((Message)getItemNode(key)).Code = code; ((Message)getItemNode(key)).Value = value; } /// /// wrapper aggiunta condizione /// /// /// public override void addConditionNode(string key, object value) { base.addConditionNode(key, value); // aggiungo ad adapter mAdapter.RemoveDataItem((Condition)value); mAdapter.AddDataItem((Condition)value); } public override void removeAllConditionNodes() { foreach (var item in conditionNodes) { // rimuovo da MTC mAdapter.RemoveDataItem((Condition)item.Value.cObject); } base.removeAllConditionNodes(); } public override void removeConditionNode(string key) { // rimuovo da MTC mAdapter.RemoveDataItem((Condition)conditionNodes[key].cObject); // rimuovo da vett interno base.removeConditionNode(key); } #endregion #region gestione allarmi /// /// Specifica implementazione x formattazione ALLARMI /// /// public override void addAlarm(allarme currAllarm) { // implemento chiamata specifica... if (conditionNodes.ContainsKey(currAllarm.gruppo)) { itemNode nodo = conditionNodes[currAllarm.gruppo]; addAlarm(nodo, currAllarm); } } /// /// Specifica implementazione x formattazione ALLARMI /// /// /// Generico nodo di tipo condition public override void addAlarm(itemNode alarmNode, allarme currAllarm) { // in base al tipo di allarme decodifico condizione... Condition.Level livello = Condition.Level.NORMAL; switch (currAllarm.livello) { case "WARNING": livello = Condition.Level.WARNING; break; case "FAULT": default: livello = Condition.Level.FAULT; break; } Condition mAlarm = (Condition)alarmNode.cObject; mAlarm.Add(livello, currAllarm.descrizione, currAllarm.codNum, "", ""); } /// /// Wrapper setup obj allarmi /// public override void addAlarmNodes() { // registro Condition newCondNode; newCondNode = new Condition(nCncConditions); addConditionNode(nCncConditions, newCondNode); newCondNode = new Condition(nPlcConditions); addConditionNode(nPlcConditions, newCondNode); } /// /// Wrapper inizializzazione allarmi /// public override void initAlarms() { // trasformo i nodi in elenchi conditions e li aggiungo... foreach (var item in conditionNodes) { ((Condition)item.Value.cObject).Normal(); } } /// /// inizializazione allarme a normal /// /// public override void initAlarm(itemNode alarmNode) { Condition mAlarm = (Condition)alarmNode.cObject; mAlarm.Normal(); } #endregion } }