diff --git a/IOB-UT-NEXT/Enums.cs b/IOB-UT-NEXT/Enums.cs
index 090da652..cf69d0fa 100644
--- a/IOB-UT-NEXT/Enums.cs
+++ b/IOB-UT-NEXT/Enums.cs
@@ -21,6 +21,17 @@ namespace IOB_UT_NEXT
OR
}
+ ///
+ /// Modalità gestione setup macchina
+ ///
+ public enum MachineSetupMode
+ {
+ ND=0,
+
+ // Modalità Mecolpress (3 parametri IN, se variati --> porto a 1 la variabile di controllo)
+ MECOLPRESS = 1
+ }
+
///
/// Elenco MODI CNC
///
@@ -324,6 +335,11 @@ namespace IOB_UT_NEXT
///
OpcUaEwonMonti,
+ ///
+ /// Adapter OPC-UA per Ewon x Mecolpress / Stil
+ ///
+ OpcUaEwonMecolpress,
+
///
/// Adapter OSAI CNDEX (Cndex)
///
diff --git a/IOB-UT-NEXT/ToMapo.cs b/IOB-UT-NEXT/ToMapo.cs
index 6ee75528..07881d41 100644
--- a/IOB-UT-NEXT/ToMapo.cs
+++ b/IOB-UT-NEXT/ToMapo.cs
@@ -351,6 +351,56 @@ namespace IOB_UT_NEXT
public int MaxVal { get; set; } = 9999;
}
+ ///
+ /// Definizione parametri di setup incrociato...
+ ///
+ public class MachineSetupConf
+ {
+ ///
+ /// Modalità gestione setup
+ ///
+ public MachineSetupMode SetupMode { get; set; } = MachineSetupMode.ND;
+
+ ///
+ /// Dizionario dei parametri di corrispondenza tra variabili MES e variabili Macchina
+ /// MES = scritte dal MES
+ /// Macchina = scritte da macchina
+ ///
+ public Dictionary checkParList { get; set; } = new Dictionary();
+
+ ///
+ /// Dizionario dei parametri da scrivere quando si rilevano differenze tra i parametri MES/Macchina
+ /// string (key) --> memoria da scrivere
+ /// tuple --> valori da scrivere quando uguali o diversi
+ ///
+ public List writeParAction { get; set; } = new List();
+ }
+
+ ///
+ /// Classe x definizione delle azioni in fase di setup macchina
+ ///
+ public class MachineSetupAction
+ {
+ ///
+ /// Parametro target dell'azione
+ ///
+ public string TargetParam { get; set; } = "";
+
+ ///
+ /// parametro da impostare SE il check da esito EQUAL
+ ///
+ public int TargetValEqual { get; set; } = 0;
+ ///
+ /// parametro da impostare SE il check da esito NOT EQUAL
+ ///
+ public int TargetValNotEqual { get; set; } = 1;
+
+ ///
+ /// Indica se vada disabilitato il contapezzi quando la condizione NotEqual sia soddisfatta
+ ///
+ public bool DisablePzCountNotEqual { get; set; } = false;
+ }
+
///
/// Classe gestione configurazione parametri specifici OPC-UA da BaseParamConf
///
@@ -440,7 +490,12 @@ namespace IOB_UT_NEXT
///
/// Conf Gestione WatchDog
///
- public WatchDogConf WatchDog{get;set;} = new WatchDogConf();
+ public WatchDogConf WatchDog {get;set;} = new WatchDogConf();
+
+ ///
+ /// Conf gestione setup macchina
+ ///
+ public MachineSetupConf SetupConf { get; set; } = new MachineSetupConf();
#endregion Public Properties
}
diff --git a/IOB-WIN-NEXT/AdapterForm.cs b/IOB-WIN-NEXT/AdapterForm.cs
index 090879df..fd9b98a1 100644
--- a/IOB-WIN-NEXT/AdapterForm.cs
+++ b/IOB-WIN-NEXT/AdapterForm.cs
@@ -1223,6 +1223,11 @@ namespace IOB_WIN_NEXT
start.Enabled = true;
break;
+ case tipoAdapter.OpcUaEwonMecolpress:
+ iobObj = new IobOpcUaEwonMecolpress(this, IOBConf);
+ start.Enabled = true;
+ break;
+
case tipoAdapter.PingWatchdog:
iobObj = new IobPing(this, IOBConf);
start.Enabled = true;
diff --git a/IOB-WIN-NEXT/DATA/CONF/STEL_200.ini b/IOB-WIN-NEXT/DATA/CONF/STEL_200.ini
index a79c8aa7..6f24dbcc 100644
--- a/IOB-WIN-NEXT/DATA/CONF/STEL_200.ini
+++ b/IOB-WIN-NEXT/DATA/CONF/STEL_200.ini
@@ -1,7 +1,7 @@
;Configurazione IOB-WIN
[IOB]
;Centro di lavoro OpcUa
-CNCTYPE=OpcUaEwon
+CNCTYPE=OpcUaEwonMecolpress
PING_MS_TIMEOUT=500
[MACHINE]
diff --git a/IOB-WIN-NEXT/DATA/CONF/STEL_200.json b/IOB-WIN-NEXT/DATA/CONF/STEL_200.json
index c126a403..378bd0b6 100644
--- a/IOB-WIN-NEXT/DATA/CONF/STEL_200.json
+++ b/IOB-WIN-NEXT/DATA/CONF/STEL_200.json
@@ -98,7 +98,7 @@
"tipoMem": "Int",
"memAddr": "ns=4;s=tomach_6_quantity",
"index": 0,
- "size": -1
+ "size": 4
},
"setComm": {
"name": "setComm",
@@ -144,8 +144,23 @@
],
"WatchDog": {
"IsEnabled": true,
- "MemConfRead": "tomes_ 1_Watchdog",
- "MemConfWrite": "tomach_1_watchdog",
+ "MemConfRead": "ns=4;s=tomes_1_Watchdog",
+ "MemConfWrite": "ns=4;s=tomach_1_watchdog",
"MaxVal": 9999
+ },
+ "SetupConf": {
+ "SetupMode": "MECOLPRESS",
+ "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
+ }
+ ]
}
}
\ 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 72f719e0..7dbd5c67 100644
--- a/IOB-WIN-NEXT/IOB-WIN-NEXT.csproj
+++ b/IOB-WIN-NEXT/IOB-WIN-NEXT.csproj
@@ -182,6 +182,7 @@
VersGen.cs
+
diff --git a/IOB-WIN-NEXT/IobOpcUa.cs b/IOB-WIN-NEXT/IobOpcUa.cs
index 803e77d2..0a7fd6b5 100644
--- a/IOB-WIN-NEXT/IobOpcUa.cs
+++ b/IOB-WIN-NEXT/IobOpcUa.cs
@@ -22,7 +22,7 @@ namespace IOB_WIN_NEXT
///
/// Struttura dove vengono memorizzati i dataitem ed i rispettivi valori x processing
///
- private Dictionary dataItemMem = new Dictionary();
+ protected Dictionary dataItemMem = new Dictionary();
///
/// Elenco degli items da monitorare come risultato del browse iniziale
@@ -325,7 +325,7 @@ namespace IOB_WIN_NEXT
await application.CheckApplicationInstanceCertificate(silent: false, minimumKeySize: 0).ConfigureAwait(false);
lgInfo($"Chiamata UAClient con configurazione standard: {application.ApplicationConfiguration.ApplicationName}");
- UA_ref = new UAClient(application.ApplicationConfiguration, cIobConf.codIOB, ClientBase.ValidateResponse);
+ UA_ref = new UAClient(application.ApplicationConfiguration, cIobConf.codIOB, isVerboseLog, ClientBase.ValidateResponse);
lgInfo($"Chiamata apertura OpcUa Client: {cIobConf.cncIpAddr}:{port}");
UA_ref.ServerUrl = $"opc.tcp://{cIobConf.cncIpAddr}:{port}";
diff --git a/IOB-WIN-NEXT/IobOpcUaEwon.cs b/IOB-WIN-NEXT/IobOpcUaEwon.cs
index 9fb677f4..ff91d289 100644
--- a/IOB-WIN-NEXT/IobOpcUaEwon.cs
+++ b/IOB-WIN-NEXT/IobOpcUaEwon.cs
@@ -53,7 +53,6 @@ namespace IOB_WIN_NEXT
DateTime adesso = DateTime.Now;
// init a zero...
B_input = 0;
- lgInfo("decodeToBaseBitmap 01");
/* -----------------------------------------------------
* STATE MACHINE 60 STD / SIMULA
@@ -121,7 +120,6 @@ namespace IOB_WIN_NEXT
// se abilitato watchdog...
if (opcUaParams.WatchDog.IsEnabled)
{
- lgInfo("WatchDog 01");
if (adesso.Subtract(lastWatchDogPLC).TotalSeconds > 2)
{
lastWatchDogPLC = adesso;
@@ -131,7 +129,6 @@ namespace IOB_WIN_NEXT
lgInfo($"WatchDog val: {WatchDog}");
try
{
-
WriteValue commWriteVal = new WriteValue();
commWriteVal.NodeId = new NodeId(opcUaParams.WatchDog.MemConfWrite);
commWriteVal.AttributeId = Attributes.Value;
@@ -140,8 +137,8 @@ namespace IOB_WIN_NEXT
List nodes2Write = new List();
nodes2Write.Add(commWriteVal);
+
UA_ref.WriteNodes(nodes2Write);
- lgInfo("Effettuata scrittura WatchDog");
}
catch (Exception exc)
{
diff --git a/IOB-WIN-NEXT/IobOpcUaEwonMecolpress.cs b/IOB-WIN-NEXT/IobOpcUaEwonMecolpress.cs
new file mode 100644
index 00000000..4262d63b
--- /dev/null
+++ b/IOB-WIN-NEXT/IobOpcUaEwonMecolpress.cs
@@ -0,0 +1,110 @@
+using MapoSDK;
+using Newtonsoft.Json;
+using Opc.Ua;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net.NetworkInformation;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace IOB_WIN_NEXT
+{
+ public class IobOpcUaEwonMecolpress : IobOpcUaEwon
+ {
+ #region Protected Fields
+
+
+ #endregion Protected Fields
+
+ #region Public Constructors
+
+ ///
+ /// Estende l'init della classe base, impiegando il pacchetto Nuget OPC-UA foundation con la gestione specifica per EWON (es Monti, Tenditalia)
+ /// https://github.com/OPCFoundation/UA-.NETStandard
+ ///
+ ///
+ ///
+ public IobOpcUaEwonMecolpress(AdapterForm caller, IobConfiguration IOBConf) : base(caller, IOBConf)
+ {
+ lgInfo("Init Ewon versione Mecolpress (STEL)");
+
+ // inizializzo classe base...
+ if (!string.IsNullOrEmpty(getOptPar("CHANGE_ODL_MODE")))
+ {
+ CHANGE_ODL_MODE = getOptPar("CHANGE_ODL_MODE");
+ }
+ sendKeyRichiesta = true;
+ }
+
+ ///
+ /// 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();
+ // ora controllo la specifica condizione Mecolpress x il setup SE i parametri FOSSERO quelli di setup...
+ dataConf currMem = null;
+ // faccio un check tra i valori in memoria che devono corrispondere e se NON corrispondono --> metto valore in scrittura...
+ bool needWrite = false;
+ 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 (false)
+ {
+ // ora scrivo!
+ if (nodes2Write.Count > 0)
+ {
+ UA_ref.WriteNodes(nodes2Write);
+ }
+ }
+ }
+ }
+
+ #endregion Public Constructors
+
+ }
+}
\ No newline at end of file
diff --git a/IOB-WIN-NEXT/IobOpcUaEwonMonti.cs b/IOB-WIN-NEXT/IobOpcUaEwonMonti.cs
index d59d53fb..75fd353b 100644
--- a/IOB-WIN-NEXT/IobOpcUaEwonMonti.cs
+++ b/IOB-WIN-NEXT/IobOpcUaEwonMonti.cs
@@ -18,7 +18,7 @@ namespace IOB_WIN_NEXT
///
public IobOpcUaEwonMonti(AdapterForm caller, IobConfiguration IOBConf) : base(caller, IOBConf)
{
- lgInfo("Init Ewon versione Monti (tenditalia)");
+ lgInfo("Init Ewon versione Monti (Tenditalia)");
// inizializzo classe base...
if (!string.IsNullOrEmpty(getOptPar("CHANGE_ODL_MODE")))
{
@@ -39,24 +39,6 @@ namespace IOB_WIN_NEXT
///
protected override void plcWriteParams(ref List updatedPar)
{
-#if false
- if (!testDone)
- {
- try
- {
- if (UA_ref != null)
- {
- UA_ref.WriteTestNodes();
- testDone = true;
- }
- }
- catch (Exception exc)
- {
- lgError($"Eccezione in WriteTestNodes{Environment.NewLine}{exc}");
- }
- }
-#endif
-
dataConf currMem = null;
int byteSize = 0;
string memAddrWrite = "";
diff --git a/IOB-WIN-NEXT/UAClient.cs b/IOB-WIN-NEXT/UAClient.cs
index 40dfce56..433b457c 100644
--- a/IOB-WIN-NEXT/UAClient.cs
+++ b/IOB-WIN-NEXT/UAClient.cs
@@ -81,6 +81,7 @@ namespace IOB_WIN_NEXT
#region Protected Fields
protected static Logger lg;
+ protected static bool isLogVerbose = false;
#endregion Protected Fields
@@ -89,11 +90,12 @@ namespace IOB_WIN_NEXT
///
/// Initializes a new instance of the UAClient class.
///
- public UAClient(ApplicationConfiguration configuration, string codIOB, Action validateResponse)
+ public UAClient(ApplicationConfiguration configuration, string codIOB, bool verboseLog, Action validateResponse)
{
m_validateResponse = validateResponse;
currIob = codIOB;
lg = LogManager.GetCurrentClassLogger();
+ isLogVerbose = verboseLog;
m_configuration = configuration;
m_configuration.CertificateValidator.CertificateValidation += CertificateValidation;
}
@@ -198,7 +200,10 @@ namespace IOB_WIN_NEXT
protected void lgInfo(string message)
{
lg.Factory.Configuration.Variables["codIOB"] = currIob;
- lg.Info(message);
+ if (isLogVerbose)
+ {
+ lg.Info(message);
+ }
}
#endregion Protected Methods