From d183d1f3368c80b1e8bc4e7b2ca51c93b5cd8b44 Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Tue, 19 Dec 2023 17:28:52 +0100 Subject: [PATCH] Update conf x gestione ADIGE --- IOB-UT-NEXT/Enums.cs | 7 +- IOB-WIN-NEXT/AdapterForm.cs | 5 + IOB-WIN-NEXT/DATA/CONF/MAIN.ini | 2 +- IOB-WIN-NEXT/DATA/CONF/STEL_210.ini | 5 +- IOB-WIN-NEXT/DATA/CONF/STEL_210.json | 294 +++++++++++++++++--------- IOB-WIN-NEXT/IOB-WIN-NEXT.csproj | 1 + IOB-WIN-NEXT/IobOpc/OpcUaEwonAdige.cs | 103 +++++++++ 7 files changed, 311 insertions(+), 106 deletions(-) create mode 100644 IOB-WIN-NEXT/IobOpc/OpcUaEwonAdige.cs diff --git a/IOB-UT-NEXT/Enums.cs b/IOB-UT-NEXT/Enums.cs index ddfd221e..d589e101 100644 --- a/IOB-UT-NEXT/Enums.cs +++ b/IOB-UT-NEXT/Enums.cs @@ -412,6 +412,11 @@ namespace IOB_UT_NEXT /// OpcUaEwon, + /// + /// Adapter OPC-UA per Ewon x Adige (BLM) / STIL + /// + OpcUaEwonAdige, + /// /// Adapter OPC-UA per Ewon x BLM / Mecart /// @@ -423,7 +428,7 @@ namespace IOB_UT_NEXT OpcUaEwonMonti, /// - /// Adapter OPC-UA per Ewon x Mecolpress / Stil + /// Adapter OPC-UA per Ewon x Mecolpress (BLM) / STIL /// OpcUaEwonMecolpress, diff --git a/IOB-WIN-NEXT/AdapterForm.cs b/IOB-WIN-NEXT/AdapterForm.cs index 290aed30..1e53ec1c 100644 --- a/IOB-WIN-NEXT/AdapterForm.cs +++ b/IOB-WIN-NEXT/AdapterForm.cs @@ -1752,6 +1752,11 @@ namespace IOB_WIN_NEXT start.Enabled = true; break; + case tipoAdapter.OpcUaEwonAdige: + iobObj = new IobOpc.OpcUaEwonAdige(this, IOBConf); + start.Enabled = true; + break; + case tipoAdapter.OpcUaEwonBLM: iobObj = new IobOpc.OpcUaEwonBLM(this, IOBConf); start.Enabled = true; diff --git a/IOB-WIN-NEXT/DATA/CONF/MAIN.ini b/IOB-WIN-NEXT/DATA/CONF/MAIN.ini index 2d10bc82..ba1b2299 100644 --- a/IOB-WIN-NEXT/DATA/CONF/MAIN.ini +++ b/IOB-WIN-NEXT/DATA/CONF/MAIN.ini @@ -29,7 +29,6 @@ CLI_INST=SteamWareSim ;STARTLIST=FINASSI_HELPI_01 ;STARTLIST=FINASSI_OMP_01 ;STARTLIST=BAGLIETTO_CIMOLAI_01 -;STARTLIST=SIMUL_01 ;STARTLIST=GIACO_SAIM_003 ;STARTLIST=PIZ09 ;STARTLIST=IMI_RIMOR_SAB_01 @@ -43,6 +42,7 @@ CLI_INST=SteamWareSim ;STARTLIST=IMI_GOMBA ;STARTLIST=PING ;STARTLIST=SIMUL_02 +;STARTLIST=SIM_DP_01 ;NB: mettere copy always ai file di conf x fare test... STARTLIST=SIMUL_01 diff --git a/IOB-WIN-NEXT/DATA/CONF/STEL_210.ini b/IOB-WIN-NEXT/DATA/CONF/STEL_210.ini index 76a331f1..445c4994 100644 --- a/IOB-WIN-NEXT/DATA/CONF/STEL_210.ini +++ b/IOB-WIN-NEXT/DATA/CONF/STEL_210.ini @@ -1,7 +1,7 @@ ;Configurazione IOB-WIN [IOB] ;Centro di lavoro OpcUa -CNCTYPE=OpcUaEwon +CNCTYPE=OpcUaEwonAdige PING_MS_TIMEOUT=500 [MACHINE] @@ -63,6 +63,9 @@ ENABLE_DYN_DATA=FALSE FORCE_DYN_DATA=TRUE ENABLE_DATA_FILTER=TRUE ENABLE_CLI_RESTART=TRUE +MAX_TRY_PING=3 +NO_PING=TRUE +DISABLE_SEND_WDST=TRUE ; conf parametri memoria READ/WRITE OPC_PARAM_CONF=STEL_210.json diff --git a/IOB-WIN-NEXT/DATA/CONF/STEL_210.json b/IOB-WIN-NEXT/DATA/CONF/STEL_210.json index e87e4016..1b288dc5 100644 --- a/IOB-WIN-NEXT/DATA/CONF/STEL_210.json +++ b/IOB-WIN-NEXT/DATA/CONF/STEL_210.json @@ -2,54 +2,86 @@ "BrowseFullVal": "ns=4;i=5001", "BrowseNSIndex": 4, "BrowseValue": 5001, - "keyPartCount": "tomes_17_partial_prod", - "keyPartReq": "tomach_6_quantity", + "keyPartCount": "PartDone(0)", + "keyPartReq": "PartToDo(0)", "keyPartId": "", - "keyProgName": "", + "keyProgName": "PartName(0)", "keyRunMode": "", - "pingAsPowerOn": false, + "pingAsPowerOn": true, "Identity": { "UserName": "opcread", "Passwd": "opcread" }, "condWork": [ { - "keyName": "tomes_5_autom", - "targetValue": "True" + "keyName": "MachineStatus(0)", + "targetValue": "4" } ], - "condPowerOn": { + "condWorkOpc": { "checkMode": "AND", "checkList": [ { - "keyName": "tomes_2_mach_on", - "targetValue": "True" + "keyName": "MachineStatus(0)", + "targetValue": "4" + } + ] + }, + "condPowerOn": { + "checkMode": "OR", + "negateValue": true, + "checkList": [ + { + "keyName": "MachineStatus(0)", + "targetValue": "0" + }, + { + "keyName": "MachineStatus(0)", + "targetValue": "1" + }, + { + "keyName": "MachineStatus(0)", + "targetValue": "2" } ] }, "condReady": { - "checkMode": "AND", - "checkList": [] + "checkMode": "OR", + "checkList": [ + { + "keyName": "MachineStatus(0)", + "targetValue": "3" + }, + { + "keyName": "MachineStatus(0)", + "targetValue": "5" + } + ] }, "condManual": { "checkMode": "AND", "checkList": [ { - "keyName": "tomes_6_manual", - "targetValue": "True" + "keyName": "MachineStatus(0)", + "targetValue": "8" } ] }, "condEStop": { "checkMode": "AND", - "checkList": [] + "checkList": [ + { + "keyName": "EmergencyState", + "targetValue": "0" + } + ] }, "condError": { "checkMode": "AND", "checkList": [ { - "keyName": "tomes_7_alarm", - "targetValue": "True" + "keyName": "MachineStatus(0)", + "targetValue": "6" } ] }, @@ -59,15 +91,20 @@ }, "condWarmUpCoolDown": { "checkMode": "OR", - "checkList": [], - "negateValue": true + "negateValue": true, + "checkList": [ + { + "keyName": "MachineStatus(0)", + "targetValue": "7" + } + ] }, "condWarning": { "checkMode": "AND", "checkList": [ { - "keyName": "tomes_8_warning", - "targetValue": "True" + "keyName": "MachineStatus(0)", + "targetValue": "9" } ] }, @@ -75,98 +112,149 @@ "checkMode": "AND", "checkList": [ { - "keyName": "tomes_3_setup", - "targetValue": "True" + "keyName": "MachineStatus(0)", + "targetValue": "7" } ] }, - "fluxLogVeto": [ - "tomes_1_Watchdog" - ], + "fluxLogVeto": [], "itemTranslation": { "avail": "Machine Available", "rstat": "Execution Mode", "mode": "Controller Mode", - "ncprog": "Program Name", - "tomes_13_good_prod": "Pezzi Prodotta", - "tomach_6_quantity": "Qta Richiesta", + "PartName(0)": "Program Name", + "PartDone(0)": "Pezzi Prodotti", + "PartToDo(0)": "Qta Richiesta", + "MachineStatus(0)": "Stato Macchina principale", + "MachineStatus(1)": "Stato Macchina secondario", + "EmergencyState": "Emergenza", "fdovrd": "PATH FEED OVERRIDE", "rovrd": "PATH RAPID OVERRIDE" }, - "paramsEndThresh": { - "InvDDone": 50 - }, - "mMapWrite": { - "setPzComm": { - "name": "setPzComm", - "description": "Qty", - "tipoMem": "Int", - "memAddr": "ns=4;s=tomach_6_quantity", - "index": 0, - "size": 4 - }, - "setComm": { - "name": "setComm", - "description": "Commessa", - "tipoMem": "String", - "memAddr": "ns=4;s=tomach_4_prod_order", - "index": 0, - "size": 24 - }, - "setArt": { - "name": "setArt", - "description": "Articolo", - "tipoMem": "String", - "memAddr": "ns=4;s=tomach_3_code_die", - "index": 0, - "size": 24 - } - }, "subscribedItems": [ - "ns=4;s=tomes_1_Watchdog", - "ns=4;s=tomes_2_mach_on", - "ns=4;s=tomes_3_setup", - "ns=4;s=tomes_4_impulse", - "ns=4;s=tomes_5_autom", - "ns=4;s=tomes_6_manual", - "ns=4;s=tomes_7_alarm", - "ns=4;s=tomes_8_warning", - "ns=4;s=tomes_10_cycle_life", - "ns=4;s=tomes_11_ack_new_order", - "ns=4;s=tomes_13_good_prod", - "ns=4;s=tomes_14_bad_prod_calipso", - "ns=4;s=tomes_15_bad_prod_startup", - "ns=4;s=tomes_16_bad_prod_stop", - "ns=4;s=tomes_17_partial_prod", - "ns=4;s=tomes_18_total_prod", - "ns=4;s=tomes_20_code_die", - "ns=4;s=tomes_21_order", - "ns=4;s=tomach_1_watchdog", - "ns=4;s=tomach_2_new_prod", - "ns=4;s=tomach_3_code_die", - "ns=4;s=tomach_4_prod_order", - "ns=4;s=tomach_6_quantity" - ], - "WatchDog": { - "IsEnabled": true, - "MemConfRead": "ns=4;s=tomes_1_Watchdog", - "MemConfWrite": "ns=4;s=tomach_1_watchdog", - "MaxVal": 9999 - }, - "SetupConf": { - "SetupMode": "MECOLPRESS", - "EnableAdvSetup": false, - "checkParList": { - "tomach_3_code_die": "tomes_20_code_die", - "tomach_4_prod_order": "tomes_21_order" - }, - "writeParAction": [ - { - "TargetParam": "ns=4;s=tomach_2_new_prod", - "TargetValEqual": 0, - "TargetValNotEqual": 1, - "DisablePzCountNotEqual": true - } - ] - } + "ns=4;s=MachineCode", + "ns=4;s=MachineType", + "ns=4;s=MachineStatus(0)", + "ns=4;s=MachineStatus(1)", + "ns=4;s=NumOfAlarms", + "ns=4;s=NumOfMessages", + "ns=4;s=AlarmCode(0)", + "ns=4;s=AlarmCode(1)", + "ns=4;s=AlarmCode(2)", + "ns=4;s=AlarmCode(3)", + "ns=4;s=AlarmCode(4)", + "ns=4;s=AlarmCode(5)", + "ns=4;s=AlarmCode(6)", + "ns=4;s=AlarmCode(7)", + "ns=4;s=AlarmCode(8)", + "ns=4;s=AlarmCode(9)", + "ns=4;s=AlarmText(0)", + "ns=4;s=AlarmText(1)", + "ns=4;s=AlarmText(2)", + "ns=4;s=AlarmText(3)", + "ns=4;s=AlarmText(4)", + "ns=4;s=AlarmText(5)", + "ns=4;s=AlarmText(6)", + "ns=4;s=AlarmText(7)", + "ns=4;s=AlarmText(8)", + "ns=4;s=AlarmText(9)", + "ns=4;s=MessageCode(0)", + "ns=4;s=MessageCode(1)", + "ns=4;s=MessageCode(2)", + "ns=4;s=MessageCode(3)", + "ns=4;s=MessageCode(4)", + "ns=4;s=MessageCode(5)", + "ns=4;s=MessageCode(6)", + "ns=4;s=MessageCode(7)", + "ns=4;s=MessageCode(8)", + "ns=4;s=MessageCode(9)", + "ns=4;s=MessageText(0)", + "ns=4;s=MessageText(1)", + "ns=4;s=MessageText(2)", + "ns=4;s=MessageText(3)", + "ns=4;s=MessageText(4)", + "ns=4;s=MessageText(5)", + "ns=4;s=MessageText(6)", + "ns=4;s=MessageText(7)", + "ns=4;s=MessageText(8)", + "ns=4;s=MessageText(9)", + "ns=4;s=SwitchOnDuration", + "ns=4;s=BladeName", + "ns=4;s=BladeCutSpeed", + "ns=4;s=BladeRotSpeed", + "ns=4;s=BladeRotTorquePercent", + "ns=4;s=BladeType", + "ns=4;s=BladeDiameter", + "ns=4;s=BladeThickness", + "ns=4;s=BladeTeethNum", + "ns=4;s=BladePartCut", + "ns=4;s=BladeAreaCut", + "ns=4;s=BladeRotSpeedSuggested", + "ns=4;s=BladeCutSpeedSuggested", + "ns=4;s=JobName(0)", + "ns=4;s=JobCode", + "ns=4;s=JobStatus(0)", + "ns=4;s=BarNum", + "ns=4;s=BarFinalScrapLength", + "ns=4;s=BarSectionType", + "ns=4;s=BarSectionDimMax", + "ns=4;s=BarSectionDimMin", + "ns=4;s=BarSectionThickness", + "ns=4;s=BarMaterialType", + "ns=4;s=PartName(0)", + "ns=4;s=PartName(1)", + "ns=4;s=PartName(2)", + "ns=4;s=PartName(3)", + "ns=4;s=PartName(4)", + "ns=4;s=PartOrderERP(0)", + "ns=4;s=PartOrderERP(1)", + "ns=4;s=PartOrderERP(2)", + "ns=4;s=PartOrderERP(3)", + "ns=4;s=PartOrderERP(4)", + "ns=4;s=PartWorkOrderERP(0)", + "ns=4;s=PartWorkOrderERP(1)", + "ns=4;s=PartWorkOrderERP(2)", + "ns=4;s=PartWorkOrderERP(3)", + "ns=4;s=PartWorkOrderERP(4)", + "ns=4;s=PartLength(0)", + "ns=4;s=PartLength(1)", + "ns=4;s=PartLength(2)", + "ns=4;s=PartLength(3)", + "ns=4;s=PartLength(4)", + "ns=4;s=PartToDo(0)", + "ns=4;s=PartToDo(1)", + "ns=4;s=PartToDo(2)", + "ns=4;s=PartToDo(3)", + "ns=4;s=PartToDo(4)", + "ns=4;s=PartDone(0)", + "ns=4;s=PartDone(1)", + "ns=4;s=PartDone(2)", + "ns=4;s=PartDone(3)", + "ns=4;s=PartDone(4)", + "ns=4;s=PartLastDuration(0)", + "ns=4;s=PartLastDuration(1)", + "ns=4;s=PartLastDuration(2)", + "ns=4;s=PartLastDuration(3)", + "ns=4;s=PartLastDuration(4)" + //"ns=4;s=EmergencyState", + //"ns=4;s=FeedRateOverride", + //"ns=4;s=OperativeModeCN", + //"ns=4;s=SoftwareVersions(0)", + //"ns=4;s=SoftwareVersions(1)", + //"ns=4;s=SoftwareVersions(2)", + //"ns=4;s=SoftwareVersions(3)", + //"ns=4;s=UserLevel", + //"ns=4;s=MachineModel", + //"ns=4;s=UseHourCount", + //"ns=4;s=DriveEnabledHourCount", + //"ns=4;s=JobTimeToFinish(0)", + //"ns=4;s=TotalPiecesCounter", + //"ns=4;s=PartIndex", + //"ns=4;s=CurrentDeviceSelected", + //"ns=4;s=PartDiscarded(0)", + //"ns=4;s=WireAvailableLength", + //"ns=4;s=eWonOn", + //"ns=4;s=ShutdownDeltaTime", + //"ns=4;s=CurrentCycle" + ] } \ No newline at end of file diff --git a/IOB-WIN-NEXT/IOB-WIN-NEXT.csproj b/IOB-WIN-NEXT/IOB-WIN-NEXT.csproj index 23387524..c4ae2328 100644 --- a/IOB-WIN-NEXT/IOB-WIN-NEXT.csproj +++ b/IOB-WIN-NEXT/IOB-WIN-NEXT.csproj @@ -399,6 +399,7 @@ VersGen.cs + diff --git a/IOB-WIN-NEXT/IobOpc/OpcUaEwonAdige.cs b/IOB-WIN-NEXT/IobOpc/OpcUaEwonAdige.cs new file mode 100644 index 00000000..0eb10eda --- /dev/null +++ b/IOB-WIN-NEXT/IobOpc/OpcUaEwonAdige.cs @@ -0,0 +1,103 @@ +using MapoSDK; +using Opc.Ua; +using System.Collections.Generic; +using System.Linq; + +namespace IOB_WIN_NEXT.IobOpc +{ + public class OpcUaEwonAdige : OpcUaEwon + { + #region Public Constructors + + /// + /// Estende l'init della classe base, impiegando il pacchetto Nuget OPC-UA foundation con la + /// gestione specifica per EWON (es Adige/BLM, Stel) + /// https://github.com/OPCFoundation/UA-.NETStandard + /// + /// + /// + public OpcUaEwonAdige(AdapterForm caller, IobConfiguration IOBConf) : base(caller, IOBConf) + { + lgInfo("Init Ewon versione Adige/BLM"); + + // inizializzo classe base... + if (!string.IsNullOrEmpty(getOptPar("CHANGE_ODL_MODE"))) + { + CHANGE_ODL_MODE = getOptPar("CHANGE_ODL_MODE"); + } + sendKeyRichiesta = true; + } + + #endregion Public Constructors + + #region Protected Methods + + /// + /// Effettua vera scrittura parametri + /// + /// + protected override void plcWriteParams(ref List updatedPar) + { + base.plcWriteParams(ref updatedPar); + + // se DEVO gestire setup Mecolpress... + if (opcUaParams.SetupConf.SetupMode == IOB_UT_NEXT.MachineSetupMode.MECOLPRESS) + { + List nodes2Write = new List(); + // faccio un check tra i valori in memoria che devono corrispondere e se NON + // corrispondono --> metto valore in scrittura... + int numDiff = 0; + foreach (var item in opcUaParams.SetupConf.checkParList) + { + // cerco la memoria corrispondente... + var memorieMes = dataItemMem.Where(x => x.Key.Contains(item.Key)).ToList(); + var memorieMac = dataItemMem.Where(x => x.Key.Contains(item.Value)).ToList(); + // se ho trovato qualcosa verifico se corrispondono... + if (memorieMes.Count > 0 && memorieMes.Count > 0) + { + // controllo primo record con primo record + if (memorieMes.FirstOrDefault().Value.value != memorieMac.FirstOrDefault().Value.value) + { + numDiff++; + } + } + } + + // ciclo le condizioni di uscita + foreach (var item in opcUaParams.SetupConf.writeParAction) + { + WriteValue commWriteVal = new WriteValue(); + commWriteVal.NodeId = new NodeId(item.TargetParam); + commWriteVal.AttributeId = Attributes.Value; + commWriteVal.Value = new DataValue(); + // se ho differenze --> scrivo richiesta attrezzaggio... + if (numDiff > 0) + { + commWriteVal.Value.Value = item.TargetValNotEqual; + } + else + { + commWriteVal.Value.Value = item.TargetValEqual; + } + + // accodo x scrittura + nodes2Write.Add(commWriteVal); + lgInfo($"richiesta scrittura valore | nodeId: {commWriteVal.NodeId} | targetPar: {item.TargetParam} | val {commWriteVal.Value.Value}"); + + } + + // x ora NON eseguo + if (opcUaParams.SetupConf.EnableAdvSetup) + { + // ora scrivo! + if (nodes2Write.Count > 0) + { + UA_ref.WriteNodes(nodes2Write); + } + } + } + } + + #endregion Protected Methods + } +} \ No newline at end of file