diff --git a/EgwProxy.Icoel.Test/Program.cs b/EgwProxy.Icoel.Test/Program.cs
index 9f6bd3b5..46b82397 100644
--- a/EgwProxy.Icoel.Test/Program.cs
+++ b/EgwProxy.Icoel.Test/Program.cs
@@ -9,6 +9,19 @@ namespace EgwProxy.Icoel.Test
{
#region Internal Methods
+ ///
+ /// Mostra tutte le metriche di performance ricevute
+ ///
+ ///
+ internal static void DisplayPerfMeter(Dictionary perfMeter)
+ {
+ // mostra tutti i parametri rilevati...
+ foreach (var item in perfMeter)
+ {
+ Console.WriteLine(item.Key, $"{item.Value:N2}");
+ }
+ }
+
///
/// Generazione di una list di info sui dati variety
///
@@ -203,6 +216,17 @@ namespace EgwProxy.Icoel.Test
Console.WriteLine("Premere un tasto x continuare...");
userInput = Console.ReadLine();
+
+ Console.WriteLine("------------ Parametri velocità rilevati ------------");
+ var perfMeter = IcoelSizer.GetPerfMeters();
+ if (perfMeter != null)
+ {
+ DisplayPerfMeter(perfMeter);
+ }
+ Console.WriteLine();
+ Console.WriteLine("Premere un tasto x continuare...");
+ userInput = Console.ReadLine();
+
// solo attive
Console.WriteLine("------------ solo attive ------------");
varList = IcoelSizer.GetVarietyList();
@@ -251,6 +275,7 @@ namespace EgwProxy.Icoel.Test
}
}
+
#endregion Private Methods
}
}
\ No newline at end of file
diff --git a/EgwProxy.Icoel/Appunti.md b/EgwProxy.Icoel/Appunti.md
new file mode 100644
index 00000000..ae375519
--- /dev/null
+++ b/EgwProxy.Icoel/Appunti.md
@@ -0,0 +1,107 @@
+# Appunti impiego connesisoni ICOEL
+
+## Icoel SOAP
+
+Oltre ai metodi legati al batch, ci sono questi metodi x recuperare informazioni specifiche di produttività
+
+| Metodo | Descrizione |
+| ---------- | ---------- |
+| GetMachineTonnesPH() | valore tonnellate/ora di velocità impianto |
+| GetMachineTotalFPM() | valore frutti per minuto |
+| GetMachineRodsPM() | velocità catena (carrellini / minuto) |
+| GetMachineCupfill() | percentuale riempimento carrellini (100% = 1 frutto x ogni carrellino) |
+
+
+## Icoel DB
+
+Appunti sulla gestione tabelle di frontiera
+
+### Products total
+
+/****** Script for SelectTopNRows command from SSMS ******/
+SELECT TOP (1000) [SizerBatchId]
+ ,[Index]
+ ,[Nome]
+ ,[Qualities]
+ ,[Grado]
+ ,[Calibro]
+ ,[NumeroFrutti]
+ ,[Decigrammi]
+ FROM [IcoelExport].[dbo].[ProductsTotals]
+
+
+### Entrata Ciliegie
+
+SELECT *
+FROM [frontiera].[dbo].[ENTRATACILIEGIE]
+
+
+ -- utilizzare codice e descrizione prodotto...
+
+### Fine lavorazione
+select top 100 *
+from ProductsTotals
+
+/*
+SizerBatch id = id del batch da WS SOAP
+Index = indice di prodotto FINITO, di cui ho il NOME
+- prodotti da matrice: colonne = gradi, righe = taglie(sizes)
+- grado a colore rosso
+- do il nome prodotto rosse 26- (che sono da 22 a 26 in grado A)
+- colonna qualities = è la "somma dei qualities" ovvero le colonne che passano nelcontrollo prodotto
+- codice in 3 parametri, che sono a,b,c
+ - a = qualità interna (SEMPRE NULL x le ciliegie)
+ - b grado = qualità esterna del frutto, es rosse, nere, con stelo... ricircolo = scarto per cattiva disposizione
+ - c : calibri che mi definiscono la dimensione, tipicamente 22..32
+
+
+ si scrive tutto quando è chiuso il lotto
+ inizialmente 1 solo lotto x entrambe le linee
+*/
+
+### Conferimento MES
+
+
+SELECT *
+FROM DettagliConferimentoMES
+where FillingId = 31729
+order by PackId
+
+
+/*
+Numero lotto = sigla giorno
+sigla lotto: incrementale giornaliero
+
+in particoalre x il prodotto grosso --> seleziono da + fornitori (es fornitori grossi)
+
+PackId = id univoco scatoletta
+FillingId / FillingRow NON USATI: li posso ignorare, si applicano al caso "travaso" da bins ingresso / bins uscita "tipizzati" --> serve x precalibrare
+scaricoId = operazione di scannerizzazione ( è il barcode letto)
+codice a barre è letto x ogni etichetta di conferimento
+codice e nome fornitore = grower
+codice e descrizione prodotto : sono il GREZZO specifico
+cdice prodotto grezzo è il "ceppo" / famiglia
+sigla e numero lotto: colonna di entrata ciliegie (frontiera)
+idem x data e qta entrata
+
+
+*/
+
+### Confezioni Mes
+
+
+SELECT *
+FROM DettagliConfezioniMES
+
+
+pack id = singola cassetta/scatoal/cartone
+ean = barcode in uscita
+batch id / batch name = dati tracciabilità, legato ai lotti in entrata sul sizer
+lane [1/2]sizerBatchId = lotti del sizer
+pesoDecigram = peso netto confezionato (tolleranza +/-10g...20gr)
+
+tabella scritta dal momento in cui arriva il cartone/cassetta per iniziare riempimento
+
+dati live li vediamo dal sizer
+
+*/
\ No newline at end of file
diff --git a/EgwProxy.Icoel/Compac/ComClient.cs b/EgwProxy.Icoel/Compac/ComClient.cs
index 646d41af..587f5dd6 100644
--- a/EgwProxy.Icoel/Compac/ComClient.cs
+++ b/EgwProxy.Icoel/Compac/ComClient.cs
@@ -1,5 +1,6 @@
using EgwProxy.Icoel.SizerService;
using System;
+using System.Collections.Generic;
using System.Runtime.Serialization;
using System.ServiceModel;
@@ -174,6 +175,29 @@ namespace EgwProxy.Icoel.Compac
SSClient.AddBatch(batch);
}
+ ///
+ /// Recupera elenco parametri performance impianto
+ ///
+ /// Dizionario delle variabili di performance dell'impianto in formato Dictionary
+ internal Dictionary GetPerfMeters()
+ {
+ Dictionary answ = new Dictionary();
+ // indicata in tonnOra
+ double velTonnOra = SSClient.GetMachineTonnesPH();
+ // velocità espressa in frutti/minuto
+ double velFruttiMinuto = SSClient.GetMachineTotalFPM();
+ // percentuale riempimento carrellini
+ double percRiemp = SSClient.GetMachineCupfill();
+ //// indicata in carrelli/minuto
+ //int[] velCarrMinuto = SSClient.GetMachineRodsPM();
+ // accodo i valori ricavati
+ answ.Add("VelTonnOra", velTonnOra);
+ answ.Add("VelFruttiMinuto", velFruttiMinuto);
+ answ.Add("PercRiemp", percRiemp);
+ return answ;
+ }
+
+
#endregion Internal Methods
#region Private Properties
diff --git a/EgwProxy.Icoel/Connector.cs b/EgwProxy.Icoel/Connector.cs
index 30bb284e..e6776ae2 100644
--- a/EgwProxy.Icoel/Connector.cs
+++ b/EgwProxy.Icoel/Connector.cs
@@ -38,6 +38,21 @@ namespace EgwProxy.Icoel
Client.CheckGrower(GrowerData.GrowerCode, GrowerData.GrowerName);
}
}
+ ///
+ /// Recupera array varie velocità rilevate
+ ///
+ /// Dictionary delle velocità rilevate sul sizer
+ public Dictionary GetPerfMeters()
+ {
+ Dictionary answ = new Dictionary();
+ using (var Client = new ComClient(ipAddress, tcpPort))
+ {
+ answ = Client.GetPerfMeters();
+ }
+ return answ;
+ }
+
+
///
/// Invia un lotto in coda produzione sul sizer
diff --git a/EgwProxy.MultiCncLib/CNC/CNC.FANUC/CNC.FANUC.vb b/EgwProxy.MultiCncLib/CNC/CNC.FANUC/CNC.FANUC.vb
index 81736c0e..c6e92a67 100644
--- a/EgwProxy.MultiCncLib/CNC/CNC.FANUC/CNC.FANUC.vb
+++ b/EgwProxy.MultiCncLib/CNC/CNC.FANUC/CNC.FANUC.vb
@@ -1078,14 +1078,80 @@ Namespace CNC
- '''
- ''' Legge o scrive le variabile Custom Macro
- '''
- ''' Se True SCRIVE, se False LEGGE
- ''' Indice di memoria
- ''' Matrice di valori da scrivere su scrittura o letti su lettura
- ''' True se andata a buon fine
- Public Overloads Function F_RW_Macro_Short(ByVal bWrite As Boolean, ByVal MacroIndex As Integer, ByRef Value() As Short) As Boolean
+ '''
+ ''' Legge una variabile macro (#)
+ '''
+ ''' Indirizzo da leggere
+ ''' Valore letto (restituito per riferimento)
+ ''' Boolean di eseguito/errore
+ Public Function F_Read_macro(ByVal nVar As Integer, ByRef dValue As Double) As Boolean
+
+ Const ONE_DATA_ONLY As Integer = 1
+
+ Const CUSTOM_MACRO_SIZE As Integer = 10
+
+ Dim ODBM As Focas1.ODBM
+ Dim MacroInfo3 As Focas1.IODBMRN3 = Nothing
+
+ Dim n_ret_code As Short
+
+ Dim sz_routine As String = "-", sz_temp As String = "", d As Double = 0.0
+
+ Try
+ If nVar >= &H8000 Then ' if var like 98xxx then use the other read routine .... ( :(( no comment )
+
+ n_ret_code = Focas1.cnc_rdmacror3(nLibHandle(1), nVar, ONE_DATA_ONLY, MacroInfo3)
+
+ If (n_ret_code = Focas1.EW_OK) Then ' no Fanuc error
+
+ dValue = MacroInfo3.mcr_val
+
+ Else
+ 'Error reading parameter :
+
+ dValue = 0.0
+ Return False
+
+ End If ' no Fanuc error
+
+ Else ' good ole boys
+
+ ' cnc_rdmacro : read custom macro variable
+
+ n_ret_code = Focas1.cnc_rdmacro(nLibHandle(1), nVar, CUSTOM_MACRO_SIZE, ODBM)
+
+ If (n_ret_code = Focas1.EW_OK) Then ' no Fanuc error
+
+ If ODBM.mcr_val = 0 And ODBM.dec_val = -1 Then ' variabile non definita
+ dValue = 0 '"Null"
+ Else
+ dValue = ODBM.mcr_val * (10 ^ -(ODBM.dec_val))
+ End If
+ Else
+ 'Error reading parameter :
+
+ dValue = 0.0
+ Return False
+ End If ' no Fanuc error
+
+ End If ' var > 8000h
+
+ Catch ex As Exception
+
+ dValue = 0.0
+ Return False
+ End Try
+
+ End Function
+
+ '''
+ ''' Legge o scrive le variabile Custom Macro
+ '''
+ ''' Se True SCRIVE, se False LEGGE
+ ''' Indice di memoria
+ ''' Matrice di valori da scrivere su scrittura o letti su lettura
+ ''' True se andata a buon fine
+ Public Overloads Function F_RW_Macro_Short(ByVal bWrite As Boolean, ByVal MacroIndex As Integer, ByRef Value() As Short) As Boolean
Dim iodbmr As Focas1.IODBMR
Dim nlength As Integer
Dim nReturn As Integer
diff --git a/EgwProxy.MultiCncLib/CNC/CNC.FANUC/_/fwlib32.vb b/EgwProxy.MultiCncLib/CNC/CNC.FANUC/_/fwlib32.vb
index 94e6d90a..5546971f 100644
--- a/EgwProxy.MultiCncLib/CNC/CNC.FANUC/_/fwlib32.vb
+++ b/EgwProxy.MultiCncLib/CNC/CNC.FANUC/_/fwlib32.vb
@@ -10949,4 +10949,21 @@ Public Class Focas1
Declare Function cnc_rdetherinfo Lib "FWLIB32.DLL" _
(ByVal FlibHndl As Integer, ByRef a As Short, ByRef b As Short) As Short
+ '
+ '-------------------------------------------------------- 28 - VI - 2019 cv ------------------------------
+ '
+
+ ' cnc_rdmacror3 :read Custom macro names(area specified)
+
+ Public Structure IODBMRN3
+ Public mcr_val As Double
+
+ Public name As String ' var name
+ End Structure
+
+
+ ' read custom macro variables:read Custom macro names(area specified)
+ Declare Function cnc_rdmacror3 Lib "FWLIB32.DLL" _
+ (ByVal FlibHndl As Integer, ByVal a As Integer, ByRef b As Integer, ByRef c As IODBMRN3) As Short
+
End Class 'Focas1
diff --git a/IOB-UT-NEXT/Enums.cs b/IOB-UT-NEXT/Enums.cs
index 5001f313..cd652f31 100644
--- a/IOB-UT-NEXT/Enums.cs
+++ b/IOB-UT-NEXT/Enums.cs
@@ -1,7 +1,6 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Converters;
+using System;
namespace IOB_UT_NEXT
{
@@ -11,7 +10,7 @@ namespace IOB_UT_NEXT
public enum boolCheckMode
{
///
- /// AND: tutte vere -> true
+ /// AND: tutte vere -> true
///
AND = 0,
@@ -21,17 +20,6 @@ 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
///
@@ -182,6 +170,17 @@ namespace IOB_UT_NEXT
VLF
}
+ ///
+ /// 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
+ }
+
///
/// StFlag32: set di 32 bit (4 word) contente semaforo di variabili
///
@@ -281,10 +280,20 @@ namespace IOB_UT_NEXT
//FILE_XYLOG,
///
- /// adapter KAWASAKI e-controller
+ /// Adapter KAWASAKI e-controller
///
KAWASAKI,
+ ///
+ /// Adapter Icoel per DB (barcode, tracciatura, produzione,...)
+ ///
+ IcoelDb,
+
+ ///
+ /// Adapter Icoel per WS SOAP (sizer)
+ ///
+ IcoelSoap,
+
///
/// Adapter non specificato
///
@@ -396,7 +405,7 @@ namespace IOB_UT_NEXT
SIEMENS_APROCHIM,
///
- /// Adapter SIEMENS, interfaccia versione VIPA @2001
+ /// Adapter SIEMENS, interfaccia versione VIPA @2001
///
SIEMENS_AT2001,
@@ -505,9 +514,35 @@ namespace IOB_UT_NEXT
///
SignIN,
+ ///
+ /// Salvataggio RawTransf (valori raw da decodificare a valle)
+ ///
+ RawTransf,
+
///
/// Salvataggio UserLog (valori log attività utente)
///
ULog
}
+
+ ///
+ /// Tipologia dato Raw Transfer (derivare da MapoSdk e togliere qui)
+ ///
+ /// serializzazione Native
+ /// [JsonConverter(typeof(JsonStringEnumConverter))]
+ /// serializzazione Newtonsoft json
+ /// [JsonConverter(typeof(StringEnumConverter))]
+ [JsonConverter(typeof(StringEnumConverter))]
+ public enum rawTransfType
+ {
+ ND = 0,
+ ///
+ /// Icoel: Batch info
+ ///
+ IcoelBatch,
+ ///
+ /// Icoel: Variety + layout info relative
+ ///
+ IcoelVarInfo
+ }
}
\ No newline at end of file
diff --git a/IOB-UT-NEXT/IOB-UT-NEXT.csproj b/IOB-UT-NEXT/IOB-UT-NEXT.csproj
index 0f5de88d..8dbe51fe 100644
--- a/IOB-UT-NEXT/IOB-UT-NEXT.csproj
+++ b/IOB-UT-NEXT/IOB-UT-NEXT.csproj
@@ -59,8 +59,8 @@
..\packages\SharpZipLib.1.3.1\lib\net45\ICSharpCode.SharpZipLib.dll
-
- ..\packages\MapoSDK.6.14.2204.2115\lib\net40\MapoSDK.dll
+
+ ..\packages\MapoSDK.6.14.2204.2616\lib\MapoSDK.dll
..\packages\Microsoft.Bcl.AsyncInterfaces.6.0.0\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll
diff --git a/IOB-UT-NEXT/Objects.cs b/IOB-UT-NEXT/Objects.cs
index 1685b504..e84e7529 100644
--- a/IOB-UT-NEXT/Objects.cs
+++ b/IOB-UT-NEXT/Objects.cs
@@ -2,7 +2,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
-using System.Text;
namespace IOB_UT_NEXT
{
@@ -118,6 +117,68 @@ namespace IOB_UT_NEXT
#endregion Public Methods
}
+ ///
+ /// Classe di base per trasferimento informazioni di tipo RawTransfer
+ /// FixMe Todo Fare !!!: elimnare usando SDK MAPO
+ ///
+ public class BaseRawTransf
+ {
+ #region Public Properties
+
+ ///
+ /// Data-Ora riferimento (x ordinamento fifo)
+ ///
+ public DateTime dataRif { get; set; } = DateTime.Now;
+
+ ///
+ /// Messaggio in modalità raw/stringa
+ ///
+ public object mesContent { get; set; } = null;
+
+ ///
+ /// Tipo di messaggio trasmesso
+ ///
+ public rawTransfType mesType { get; set; } = rawTransfType.ND;
+
+ ///
+ /// Costruttore senza parametri
+ ///
+ public BaseRawTransf()
+ {
+ this.dataRif = DateTime.Now;
+ this.mesContent = "";
+ this.mesType = rawTransfType.ND;
+ }
+
+ ///
+ /// Costruttore oggetto
+ ///
+ ///
+ ///
+ ///
+ public BaseRawTransf(DateTime dataRif, object mesContent, rawTransfType mesType)
+ {
+ this.dataRif = dataRif;
+ this.mesContent = mesContent;
+ this.mesType = mesType;
+ }
+
+ #endregion Public Properties
+ }
+
+ ///
+ /// Array valori tipo BaseRawTransf inviati come JSon
+ /// FixMe Todo Fare !!!: elimnare usando SDK MAPO
+ ///
+ public class rawTransfJsonPayload
+ {
+ #region Public Properties
+
+ public List rawTransfData { get; set; }
+
+ #endregion Public Properties
+ }
+
///
/// Cache a tempo valori INT
///
@@ -268,8 +329,56 @@ namespace IOB_UT_NEXT
///
public int queueMsLen { get; set; } = 0;
+ ///
+ /// Lungh coda UserLog in uscita
+ ///
+ public int queueRawTransfLen { get; set; } = 0;
+
+ ///
+ /// Lungh coda UserLog in uscita
+ ///
+ public int queueUlLen { get; set; } = 0;
+
#endregion Public Properties
+ ///
+ /// Override metodo di equality
+ ///
+ ///
+ ///
+ public override bool Equals(object obj)
+ {
+ if (!(obj is IobWinStatus item))
+ return false;
+
+ if (online != item.online)
+ return false;
+ if (lastDataIn != item.lastDataIn)
+ return false;
+ if (counterIOB != item.counterIOB)
+ return false;
+ if (counterMAC != item.counterMAC)
+ return false;
+ if (queueAlLen != item.queueAlLen)
+ return false;
+ if (queueEvLen != item.queueEvLen)
+ return false;
+ if (queueFlLen != item.queueFlLen)
+ return false;
+ if (queueMsLen != item.queueMsLen)
+ return false;
+ if (queueRawTransfLen != item.queueRawTransfLen)
+ return false;
+ if (queueUlLen!= item.queueUlLen)
+ return false;
+
+ return true;
+ }
+
+ public override int GetHashCode()
+ {
+ return base.GetHashCode();
+ }
}
///
@@ -398,6 +507,97 @@ namespace IOB_UT_NEXT
///
public class sampleVect
{
+ #region Public Constructors
+
+ ///
+ /// Inizializzo l'oggetto
+ ///
+ public sampleVect()
+ {
+ // init valori default...
+ windSize = baseUtils.CRI("countWindSize") > 0 ? baseUtils.CRI("countWindSize") : 60;
+ lTime = new List();
+ lVal = new List();
+ }
+
+ #endregion Public Constructors
+
+ #region Public Properties
+
+ ///
+ /// Calcola il valore mediano...
+ ///
+ public double vcMedian
+ {
+ get
+ {
+ double answ = 0;
+ // restituisce la mediana SE valida, altrimenti null...
+ if (numElem > 2 && flWindSize > windSize)
+ {
+ try
+ {
+ // calcolo mediana!
+ //answ = Statistics.Median(lVal.ToArray());
+
+ // rif: https://blogs.msmvps.com/deborahk/linq-mean-median-and-mode/
+ var sortedNumbers = lVal.OrderBy(n => n);
+ int numCount = lVal.Count;
+ int indice50 = lVal.Count / 2;
+ if ((numCount % 2) == 0)
+ {
+ answ = ((sortedNumbers.ElementAt(indice50) + sortedNumbers.ElementAt(indice50 - 1)) / 2);
+ }
+ else
+ {
+ answ = sortedNumbers.ElementAt(indice50);
+ }
+ }
+ catch
+ { }
+ }
+ return answ;
+ }
+ }
+
+ ///
+ /// Verifica se la vc sia valida (ovvero almeno 2 valori e intervallo > window richiesta)
+ ///
+ public bool vcValid
+ {
+ get
+ {
+ return (flWindSize > windSize && numElem > 1);
+ }
+ }
+
+ #endregion Public Properties
+
+ #region Public Methods
+
+ ///
+ /// Aggiunge un valore alla serie ed eventualmente elimina i valori superflui a garantirne
+ /// una finestra temporale valida
+ ///
+ ///
+ ///
+ public void addValue(DateTime tempo, int valore)
+ {
+ lTime.Add(tempo);
+ lVal.Add(valore);
+ // verifico se siano da accorciare le serie... ovvero i 2 intervalli ENTRAMBI sono
+ // superiori al periodo minimo (in tal caso riduco..
+ while (flWindSize > windSize && slWindSize > windSize)
+ {
+ // elimino i 2 valori + vecchi
+ lTime.RemoveAt(0);
+ lVal.RemoveAt(0);
+ // ora ricontrollo...
+ }
+ }
+
+ #endregion Public Methods
+
#region Protected Fields
///
@@ -417,21 +617,6 @@ namespace IOB_UT_NEXT
#endregion Protected Fields
- #region Public Constructors
-
- ///
- /// Inizializzo l'oggetto
- ///
- public sampleVect()
- {
- // init valori default...
- windSize = baseUtils.CRI("countWindSize") > 0 ? baseUtils.CRI("countWindSize") : 60;
- lTime = new List();
- lVal = new List();
- }
-
- #endregion Public Constructors
-
#region Protected Properties
///
@@ -485,80 +670,6 @@ namespace IOB_UT_NEXT
}
#endregion Protected Properties
-
- #region Public Properties
-
- ///
- /// Calcola il valore mediano...
- ///
- public double vcMedian
- {
- get
- {
- double answ = 0;
- // restituisce la mediana SE valida, altrimenti null...
- if (numElem > 2 && flWindSize > windSize)
- {
- try
- {
- // calcolo mediana!
- //answ = Statistics.Median(lVal.ToArray());
-
- // rif: https://blogs.msmvps.com/deborahk/linq-mean-median-and-mode/
- var sortedNumbers = lVal.OrderBy(n => n);
- int numCount = lVal.Count;
- int indice50 = lVal.Count / 2;
- if ((numCount % 2) == 0)
- {
- answ = ((sortedNumbers.ElementAt(indice50) + sortedNumbers.ElementAt(indice50 - 1)) / 2);
- }
- else
- {
- answ = sortedNumbers.ElementAt(indice50);
- }
- }
- catch
- { }
- }
- return answ;
- }
- }
-
- ///
- /// Verifica se la vc sia valida (ovvero almeno 2 valori e intervallo > window richiesta)
- ///
- public bool vcValid
- {
- get
- {
- return (flWindSize > windSize && numElem > 1);
- }
- }
-
- #endregion Public Properties
-
- #region Public Methods
-
- ///
- /// Aggiunge un valore alla serie ed eventualmente elimina i valori superflui a garantirne una finestra temporale valida
- ///
- ///
- ///
- public void addValue(DateTime tempo, int valore)
- {
- lTime.Add(tempo);
- lVal.Add(valore);
- // verifico se siano da accorciare le serie... ovvero i 2 intervalli ENTRAMBI sono superiori al periodo minimo (in tal caso riduco..
- while (flWindSize > windSize && slWindSize > windSize)
- {
- // elimino i 2 valori + vecchi
- lTime.RemoveAt(0);
- lVal.RemoveAt(0);
- // ora ricontrollo...
- }
- }
-
- #endregion Public Methods
}
///
@@ -625,7 +736,7 @@ namespace IOB_UT_NEXT
///
/// Codice univoco chiamata: tipo R4 (read 4 byte), W2 (write 2 Byte)
- ///
+ ///
public string codCall;
///
diff --git a/IOB-UT-NEXT/app.config b/IOB-UT-NEXT/app.config
index 2206d0a3..1b1d33ee 100644
--- a/IOB-UT-NEXT/app.config
+++ b/IOB-UT-NEXT/app.config
@@ -1,39 +1,39 @@
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
+
diff --git a/IOB-UT-NEXT/packages.config b/IOB-UT-NEXT/packages.config
index ebcbf207..70e045e6 100644
--- a/IOB-UT-NEXT/packages.config
+++ b/IOB-UT-NEXT/packages.config
@@ -1,6 +1,6 @@
-
+
diff --git a/IOB-WIN-NEXT/AdapterForm.Designer.cs b/IOB-WIN-NEXT/AdapterForm.Designer.cs
index d5a4057c..a541e906 100644
--- a/IOB-WIN-NEXT/AdapterForm.Designer.cs
+++ b/IOB-WIN-NEXT/AdapterForm.Designer.cs
@@ -51,6 +51,8 @@
this.tabMes = new System.Windows.Forms.TabPage();
this.btnForceAutoOdl = new System.Windows.Forms.Button();
this.panel1 = new System.Windows.Forms.Panel();
+ this.label24 = new System.Windows.Forms.Label();
+ this.lblQueueULog = new System.Windows.Forms.Label();
this.label19 = new System.Windows.Forms.Label();
this.lblQueueAlarmLen = new System.Windows.Forms.Label();
this.label13 = new System.Windows.Forms.Label();
@@ -107,8 +109,8 @@
this.lblOutMessage3 = new System.Windows.Forms.Label();
this.lblOutMessage2 = new System.Windows.Forms.Label();
this.tabData = new System.Windows.Forms.TabControl();
- this.label24 = new System.Windows.Forms.Label();
- this.lblQueueULog = new System.Windows.Forms.Label();
+ this.label25 = new System.Windows.Forms.Label();
+ this.lblQueueRwTrLog = new System.Windows.Forms.Label();
this.statusStrip1.SuspendLayout();
this.tableLayoutPanel1.SuspendLayout();
this.tabMes.SuspendLayout();
@@ -364,6 +366,8 @@
// panel1
//
this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
+ this.panel1.Controls.Add(this.label25);
+ this.panel1.Controls.Add(this.lblQueueRwTrLog);
this.panel1.Controls.Add(this.label24);
this.panel1.Controls.Add(this.lblQueueULog);
this.panel1.Controls.Add(this.label19);
@@ -384,9 +388,28 @@
this.panel1.Location = new System.Drawing.Point(4, 6);
this.panel1.Margin = new System.Windows.Forms.Padding(2);
this.panel1.Name = "panel1";
- this.panel1.Size = new System.Drawing.Size(343, 248);
+ this.panel1.Size = new System.Drawing.Size(343, 306);
this.panel1.TabIndex = 88;
//
+ // label24
+ //
+ this.label24.AutoSize = true;
+ this.label24.Location = new System.Drawing.Point(10, 236);
+ this.label24.Name = "label24";
+ this.label24.Size = new System.Drawing.Size(85, 13);
+ this.label24.TabIndex = 94;
+ this.label24.Text = "ULog Queue len";
+ //
+ // lblQueueULog
+ //
+ this.lblQueueULog.AutoSize = true;
+ this.lblQueueULog.Font = new System.Drawing.Font("Microsoft Sans Serif", 8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lblQueueULog.Location = new System.Drawing.Point(104, 236);
+ this.lblQueueULog.Name = "lblQueueULog";
+ this.lblQueueULog.Size = new System.Drawing.Size(31, 13);
+ this.lblQueueULog.TabIndex = 95;
+ this.lblQueueULog.Text = "###";
+ //
// label19
//
this.label19.AutoSize = true;
@@ -1024,24 +1047,24 @@
this.tabData.TabIndex = 71;
this.tabData.Selected += new System.Windows.Forms.TabControlEventHandler(this.TabData_Selected);
//
- // label24
+ // label25
//
- this.label24.AutoSize = true;
- this.label24.Location = new System.Drawing.Point(15, 214);
- this.label24.Name = "label24";
- this.label24.Size = new System.Drawing.Size(85, 13);
- this.label24.TabIndex = 94;
- this.label24.Text = "ULog Queue len";
+ this.label25.AutoSize = true;
+ this.label25.Location = new System.Drawing.Point(10, 213);
+ this.label25.Name = "label25";
+ this.label25.Size = new System.Drawing.Size(85, 13);
+ this.label25.TabIndex = 96;
+ this.label25.Text = "RwTr Queue len";
//
- // lblQueueULog
+ // lblQueueRwTrLog
//
- this.lblQueueULog.AutoSize = true;
- this.lblQueueULog.Font = new System.Drawing.Font("Microsoft Sans Serif", 8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
- this.lblQueueULog.Location = new System.Drawing.Point(105, 214);
- this.lblQueueULog.Name = "lblQueueULog";
- this.lblQueueULog.Size = new System.Drawing.Size(31, 13);
- this.lblQueueULog.TabIndex = 95;
- this.lblQueueULog.Text = "###";
+ this.lblQueueRwTrLog.AutoSize = true;
+ this.lblQueueRwTrLog.Font = new System.Drawing.Font("Microsoft Sans Serif", 8F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+ this.lblQueueRwTrLog.Location = new System.Drawing.Point(104, 213);
+ this.lblQueueRwTrLog.Name = "lblQueueRwTrLog";
+ this.lblQueueRwTrLog.Size = new System.Drawing.Size(31, 13);
+ this.lblQueueRwTrLog.TabIndex = 97;
+ this.lblQueueRwTrLog.Text = "###";
//
// AdapterForm
//
@@ -1168,5 +1191,7 @@
private System.Windows.Forms.TabControl tabData;
private System.Windows.Forms.Label label24;
private System.Windows.Forms.Label lblQueueULog;
+ private System.Windows.Forms.Label label25;
+ private System.Windows.Forms.Label lblQueueRwTrLog;
}
}
\ No newline at end of file
diff --git a/IOB-WIN-NEXT/AdapterForm.cs b/IOB-WIN-NEXT/AdapterForm.cs
index 8a643b7a..b165d947 100644
--- a/IOB-WIN-NEXT/AdapterForm.cs
+++ b/IOB-WIN-NEXT/AdapterForm.cs
@@ -274,6 +274,8 @@ namespace IOB_WIN_NEXT
protected int maxFlQueue { get; set; }
protected int maxMsQueue { get; set; }
+
+ protected int maxRwTrQueue { get; set; }
protected int maxUlQueue { get; set; }
@@ -284,6 +286,8 @@ namespace IOB_WIN_NEXT
protected int qFlLen { get; set; }
protected int qMsLen { get; set; }
+
+ protected int qRTrLen { get; set; }
protected int qUlLen { get; set; }
@@ -643,6 +647,31 @@ namespace IOB_WIN_NEXT
}
}
+ public int rtrQueueLen
+ {
+ set
+ {
+ qRTrLen = value;
+ lblQueueRwTrLog.Text = qRTrLen.ToString();
+ showQueueData();
+ // se supero max precedente, ed è > 10... loggo!
+ if (qRTrLen > maxRwTrQueue && qRTrLen > 10)
+ {
+ maxRwTrQueue = qRTrLen;
+ lgInfo($"[WARN] Coda RawTransf di {value} record");
+ }
+ else
+ {
+ maxRwTrQueue--;
+ maxRwTrQueue = maxRwTrQueue < qRTrLen ? qRTrLen : maxRwTrQueue;
+ }
+ }
+ get
+ {
+ return qRTrLen;
+ }
+ }
+
public int ulQueueLen
{
set
@@ -1132,14 +1161,14 @@ namespace IOB_WIN_NEXT
tipoIob = tipoScelto,
optPar = optParRead,
versIOB = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString(),
- codIOB = CurrIOB,
+ codIOB = fIni.ReadString("IOB", "IOB_NAME", CurrIOB),
cncIpAddr = fIni.ReadString("CNC", "IP", "::1"),
cncPort = fIni.ReadString("CNC", "PORT", "0"),
iniFileName = iniConfFile,
cpuType = fIni.ReadString("CNC", "CPUTYPE", ""),
rack = (short)fIni.ReadInteger("CNC", "RACK", 0),
slot = (short)fIni.ReadInteger("CNC", "SLOT", 0),
- serverData = new serverMapo(fIni.ReadString("SERVER", "MPIP", "::1"), fIni.ReadString("SERVER", "MPURL", "/MP/IO"), fIni.ReadString("SERVER", "CMDBASE", "/IOB/input/"), fIni.ReadString("SERVER", "CMDFLOG", "/IOB/flog/"), fIni.ReadString("SERVER", "CMDULOG", "/IOB/ulog/"), fIni.ReadString("SERVER", "CMDALIVE", "/"), fIni.ReadString("SERVER", "CMDENABLED", "/"), fIni.ReadString("SERVER", "CMDREBO", "/"), fIni.ReadString("SERVER", "CMD_ODL_STARTED", "/IOB/getCurrOdlStart/"), fIni.ReadString("SERVER", "CLI_INST", "SW_CLI"), fIni.ReadString("SERVER", "CMD_FORCLE_SPLIT_ODL", "/IOB/forceSplitOdlFull/")),
+ serverData = new serverMapo(fIni.ReadString("SERVER", "MPIP", "::1"), fIni.ReadString("SERVER", "MPURL", "/MP/IO"), fIni.ReadString("SERVER", "CMDBASE", "/IOB/input/"), fIni.ReadString("SERVER", "CMDFLOG", "/IOB/flog/"), fIni.ReadString("SERVER", "CMDULOG", "/IOB/ulog/"), fIni.ReadString("SERVER", "CMDALIVE", "/"), fIni.ReadString("SERVER", "CMDENABLED", "/"), fIni.ReadString("SERVER", "CMDREBO", "/"), fIni.ReadString("SERVER", "CMD_ODL_STARTED", "/IOB/getCurrOdlStart/"), fIni.ReadString("SERVER", "CLI_INST", "SW_CLI"), fIni.ReadString("SERVER", "CMD_FORCLE_SPLIT_ODL", "/IOB/forceSplitOdlFull/"), fIni.ReadString("SERVER", "CMDRAWTRANSF", "/IOB/rawTransfJson/")),
MAX_COUNTER_BLINK = Convert.ToInt32(fIni.ReadString("BLINK", "MAX_COUNTER_BLINK", "1")),
BLINK_FILT = Convert.ToInt32(fIni.ReadString("BLINK", "BLINK_FILT", "0")),
TCMaxDelayFactor = Convert.ToDouble(fIni.ReadString("OPTPAR", "TC_MAX_TC_FACTOR", "1.2").Replace(".", ",")),
@@ -1210,6 +1239,15 @@ namespace IOB_WIN_NEXT
start.Enabled = true;
break;
+ case tipoAdapter.IcoelDb:
+ iobObj = new IobIcoelDb(this, IOBConf);
+ start.Enabled = true;
+ break;
+ case tipoAdapter.IcoelSoap:
+ iobObj = new IobIcoelSoap(this, IOBConf);
+ start.Enabled = true;
+ break;
+
case tipoAdapter.MODBUS_TCP:
iobObj = new IobModbusTCP(this, IOBConf);
start.Enabled = true;
@@ -1280,7 +1318,7 @@ namespace IOB_WIN_NEXT
iobObj = new IobOpcUaOmronIcoel(this, IOBConf);
start.Enabled = true;
break;
-
+
case tipoAdapter.PingWatchdog:
iobObj = new IobPing(this, IOBConf);
start.Enabled = true;
@@ -1445,11 +1483,12 @@ namespace IOB_WIN_NEXT
private void refreshFormData()
{
// aggiorno visualizzazioni varie in form...
+ alQueueLen = iobObj.QueueAlarm.Count;
evQueueLen = iobObj.QueueIN.Count;
flQueueLen = iobObj.QueueFLog.Count;
- alQueueLen = iobObj.QueueAlarm.Count;
msQueueLen = iobObj.QueueMessages.Count;
- ulQueueLen = iobObj.QueueMessages.Count;
+ rtrQueueLen = iobObj.QueueRawTransf.Count;
+ ulQueueLen = iobObj.QueueULog.Count;
// aggiorno labels counters...
counterIob = $"pz IOB {iobObj.contapezziIOB}";
counterMac = $"pz PLC {iobObj.contapezziPLC}";
@@ -1458,10 +1497,12 @@ namespace IOB_WIN_NEXT
{
CodIob = iobObj.cIobConf.codIOB,
IobType = iobObj.cIobConf.tipoIob.ToString(),
+ queueAlLen = alQueueLen,
queueEvLen = evQueueLen,
queueFlLen = flQueueLen,
- queueAlLen = alQueueLen,
queueMsLen = msQueueLen,
+ queueRawTransfLen = rtrQueueLen,
+ queueUlLen = ulQueueLen,
counterIOB = iobObj.contapezziIOB,
counterMAC = iobObj.contapezziPLC,
lastUpdate = lastIobStatus.lastUpdate,
@@ -1469,7 +1510,7 @@ namespace IOB_WIN_NEXT
lastDataIn = iobObj.lastReadPLC
};
// se diverso SALVO!
- if (lastIobStatus.online != currIobStatus.online || lastIobStatus.lastDataIn != currIobStatus.lastDataIn || lastIobStatus.counterIOB != currIobStatus.counterIOB || lastIobStatus.counterMAC != currIobStatus.counterMAC || lastIobStatus.queueEvLen != currIobStatus.queueEvLen || lastIobStatus.queueFlLen != currIobStatus.queueFlLen || lastIobStatus.queueAlLen != currIobStatus.queueAlLen || lastIobStatus.queueMsLen != currIobStatus.queueMsLen)
+ if (!lastIobStatus.Equals(currIobStatus))
{
// aggiorno data
currIobStatus.lastUpdate = DateTime.Now;
@@ -1531,8 +1572,11 @@ namespace IOB_WIN_NEXT
{
stop.Enabled = false;
- evQueueLen = 0;
+ alQueueLen = 0;
flQueueLen = 0;
+ msQueueLen = 0;
+ rtrQueueLen = 0;
+ ulQueueLen = 0;
nLine2show = utils.CRI("numRowConsole");
}
diff --git a/IOB-WIN-NEXT/App.config b/IOB-WIN-NEXT/App.config
index caccef85..a3743cb8 100644
--- a/IOB-WIN-NEXT/App.config
+++ b/IOB-WIN-NEXT/App.config
@@ -39,6 +39,7 @@
+
@@ -144,9 +145,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/IOB-WIN-NEXT/DATA/CONF/3025.ini b/IOB-WIN-NEXT/DATA/CONF/3025.ini
index 008d6846..59840aed 100644
--- a/IOB-WIN-NEXT/DATA/CONF/3025.ini
+++ b/IOB-WIN-NEXT/DATA/CONF/3025.ini
@@ -26,7 +26,7 @@ CMDREBO=/sendReboot.aspx?idxMacchina=
; Red: Y31.4 | Yellow: Y31.5 | Green Y31.6 | riscaldamento Y7.4 ???
;BIT0=CONN
BIT1=Y31.6
-BIT2=PZCOUNT.PAR.6711
+BIT2=STD.MACRO.10100
BIT3=Y31.4
BIT4=Y31.5
BIT5=Y7.4
@@ -59,7 +59,10 @@ BLINK_FILT=0
[OPTPAR]
;PZCOUNT_MODE=STD|BIT
-PZCOUNT_MODE=STD.PAR.6711
+;PZCOUNT_MODE=STD.PAR.6711
+;PZREQ_MODE=STD.PAR.6713
+PZCOUNT_MODE=STD.MACRO.10100
+PZREQ_MODE=STD.MACRO.10000
PZGTOT_MODE=STD.PAR.6712
PZREQ_MODE=STD.PAR.6713
;PZCAD_MODE=STD.D.6408.DW
diff --git a/IOB-WIN-NEXT/DATA/CONF/GIACO_ICOEL_001.ini b/IOB-WIN-NEXT/DATA/CONF/GIACO_ICOEL_001.ini
index 1e80902f..7eee9efe 100644
--- a/IOB-WIN-NEXT/DATA/CONF/GIACO_ICOEL_001.ini
+++ b/IOB-WIN-NEXT/DATA/CONF/GIACO_ICOEL_001.ini
@@ -3,6 +3,7 @@
;Centro di lavoro OpcUa
CNCTYPE=OpcUaOmronIcoel
PING_MS_TIMEOUT=500
+IOB_NAME=GIACO_ICOEL
[MACHINE]
VENDOR=ICOEL
diff --git a/IOB-WIN-NEXT/DATA/CONF/GIACO_ICOEL_002.ini b/IOB-WIN-NEXT/DATA/CONF/GIACO_ICOEL_002.ini
new file mode 100644
index 00000000..6bf152f1
--- /dev/null
+++ b/IOB-WIN-NEXT/DATA/CONF/GIACO_ICOEL_002.ini
@@ -0,0 +1,74 @@
+;Configurazione IOB-WIN
+[IOB]
+;WebService SOAP x sizer
+CNCTYPE=IcoelSoap
+PING_MS_TIMEOUT=500
+IOB_NAME=GIACO_ICOEL
+
+[MACHINE]
+VENDOR=ICOEL
+MODEL=Impianto Ciliegie Turi
+
+[CNC]
+IP=192.168.137.50
+PORT=8001
+GETPRGNAME=false
+
+[SERVER]
+MPIP=http://192.168.1.14
+MPURL=/MP/IO
+CMDBASE=/IOB/input/
+CMDFLOG=/IOB/flog/
+CMDRAWTRANSF=/IOB/rawTransfJson/
+CMDALIVE=/IOB
+CMDENABLED=/IOB/enabled/
+CMDADV1=?valore=
+CMDREBO=/sendReboot.aspx?idxMacchina=
+
+[MEMORY]
+ADDR_READ=DB9999.DBB0
+ADDR_WRITE=DB9999.DBB0
+SIZE_READ=0
+SIZE_WRITE=0
+;BIT0=CONN
+;BIT1=DB60.DBB1
+;BIT2=PZCOUNT.STD.DB700.DBW22
+;BIT3=DB60.DBB3
+;BIT4=DB60.DBB4
+
+
+[BLINK]
+;MAX_COUNTER_BLINK = 30
+MAX_COUNTER_BLINK = 15
+;bit0 = 0
+;bit1 = 0
+;bit2 = 1
+;bit3 = 1
+;bit4 = 1
+;bit5 = 0
+;bit6 = 0
+;bit7 = 0
+BLINK_FILT=0
+;BLINK_FILT=28
+
+[OPTPAR]
+AUTO_CHANGE_ODL=false
+CHANGE_ODL_MODE=TIME
+CHANGE_ODL_HOURS=24
+CHANGE_ODL_IDLE_MIN=5
+PZCOUNT_MODE=Icoel
+DISABLE_PZCOUNT=FALSE
+ENABLE_SEND_PZC_BLOCK=TRUE
+MIN_SEND_PZC_BLOCK=0
+MAX_SEND_PZC_BLOCK=100
+ENABLE_DYN_DATA=FALSE
+FORCE_DYN_DATA=TRUE
+ENABLE_DATA_FILTER=TRUE
+ENABLE_CLI_RESTART=TRUE
+VETO_SIG_IN=TRUE
+
+; conf parametri memoria READ/WRITE
+OPC_PARAM_CONF=GIACO_ICOEL_001.json
+
+[BRANCH]
+NAME=master
\ No newline at end of file
diff --git a/IOB-WIN-NEXT/DATA/CONF/MAIN.ini b/IOB-WIN-NEXT/DATA/CONF/MAIN.ini
index 67e800b7..cb0aa7c3 100644
--- a/IOB-WIN-NEXT/DATA/CONF/MAIN.ini
+++ b/IOB-WIN-NEXT/DATA/CONF/MAIN.ini
@@ -79,6 +79,6 @@ CLI_INST=SteamWareSim
;STARTLIST=VL25
;STARTLIST=SIMUL_03
;STARTLIST=GIACO_CEDAX_01
-STARTLIST=GIACO_ICOEL_001
+STARTLIST=GIACO_ICOEL_002
MAXCNC=10
\ 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 de03bf72..d3e66756 100644
--- a/IOB-WIN-NEXT/IOB-WIN-NEXT.csproj
+++ b/IOB-WIN-NEXT/IOB-WIN-NEXT.csproj
@@ -87,16 +87,16 @@
..\packages\EasyModbusTCP.5.6.0\lib\net40\EasyModbus.dll
- ..\packages\EgwProxy.Icoel.3.6.2205.2012\lib\EgwProxy.Icoel.dll
+ ..\packages\EgwProxy.Icoel.3.6.2205.2018\lib\EgwProxy.Icoel.dll
- ..\packages\EgwProxy.MultiCncLib.3.6.2205.2012\lib\EgwProxy.MultiCncLib.dll
+ ..\packages\EgwProxy.MultiCncLib.3.6.2205.2319\lib\EgwProxy.MultiCncLib.dll
- ..\packages\EgwProxy.OsaiCncLib.3.6.2205.2012\lib\EgwProxy.OsaiCncLib.dll
+ ..\packages\EgwProxy.OsaiCncLib.3.6.2205.2015\lib\EgwProxy.OsaiCncLib.dll
- ..\packages\EgwProxy.OsaiCncLib.3.6.2205.2012\lib\EgwProxy.OsaiCncLib.XmlSerializers.dll
+ ..\packages\EgwProxy.OsaiCncLib.3.6.2205.2015\lib\EgwProxy.OsaiCncLib.XmlSerializers.dll
False
@@ -194,6 +194,8 @@
VersGen.cs
+
+
@@ -305,6 +307,9 @@
Always
+
+ PreserveNewest
+
Always
diff --git a/IOB-WIN-NEXT/IobConfiguration.cs b/IOB-WIN-NEXT/IobConfiguration.cs
index 98af38be..b29b8739 100644
--- a/IOB-WIN-NEXT/IobConfiguration.cs
+++ b/IOB-WIN-NEXT/IobConfiguration.cs
@@ -147,7 +147,7 @@ namespace IOB_WIN_NEXT
/// Comando x reboot
/// Comando x check data avvio ODL
/// Comando x forzare split ODL
- public serverMapo(string MPIP_, string MPURL_ = "/MP/IO", string CMDBASE_ = "/IOB/input/", string CMDFLOG_ = "/IOB/flog/", string CMDULOG_ = "/IOB/ulog/", string CMDALIVE_ = "IOB", string CMDENABLED_ = "/IOB/enabled/", string CMDREBO_ = "/sendReboot.aspx?idxMacchina=", string CMD_ODL_STARTED_ = "/IOB/getCurrOdlStart/", string CLI_INST_ = "SteamWare", string CMD_FORCLE_SPLIT_ODL_ = "/IOB/forceSplitOdlFull/", string CMD_IDLE_TIME_ = "/IOB/getIdlePeriod/")
+ public serverMapo(string MPIP_, string MPURL_ = "/MP/IO", string CMDBASE_ = "/IOB/input/", string CMDFLOG_ = "/IOB/flog/", string CMDULOG_ = "/IOB/ulog/", string CMDALIVE_ = "IOB", string CMDENABLED_ = "/IOB/enabled/", string CMDREBO_ = "/sendReboot.aspx?idxMacchina=", string CMD_ODL_STARTED_ = "/IOB/getCurrOdlStart/", string CLI_INST_ = "SteamWare", string CMD_FORCLE_SPLIT_ODL_ = "/IOB/forceSplitOdlFull/", string CMD_IDLE_TIME_ = "/IOB/getIdlePeriod/", string CMDRAWTRANSFJSON_ = "/IOB/rawTransfJson/")
{
if (!string.IsNullOrEmpty(MPIP_))
{
@@ -160,6 +160,7 @@ namespace IOB_WIN_NEXT
MPURL = MPURL_;
CMDBASE = CMDBASE_;
CMDFLOG = CMDFLOG_;
+ CMDRAWTRANSF_JSON = CMDRAWTRANSFJSON_;
CMDULOG = CMDULOG_;
if (!string.IsNullOrEmpty(CMDBASE_))
{
@@ -241,6 +242,11 @@ namespace IOB_WIN_NEXT
///
public string CMDULOG { get; set; } = "";
+ ///
+ /// comando base x Raw Transf LOG - salvataggio valori generici in modalità JSON payload come lista
+ ///
+ public string CMDRAWTRANSF_JSON { get; set; } = "";
+
///
/// comando base x USER LOG - salvataggio parametri extra sistema MAPO in modalità JSON payload come lista
///
diff --git a/IOB-WIN-NEXT/IobFanuc.cs b/IOB-WIN-NEXT/IobFanuc.cs
index 8a171a92..d3657864 100644
--- a/IOB-WIN-NEXT/IobFanuc.cs
+++ b/IOB-WIN-NEXT/IobFanuc.cs
@@ -212,7 +212,7 @@ namespace IOB_WIN_NEXT
}
catch (Exception exc)
{
- lgError(exc, "Errore in contapezzi FANUC");
+ lgError(exc, "Errore in contapezzi FANUC 01");
}
}
// finisco INIT ADAPTER
@@ -587,6 +587,23 @@ namespace IOB_WIN_NEXT
// salvo valore
answ = outputVal.ToString();
}
+ // 2022.05.23 gestione MACRO da testare (Jetco)
+ else if (memAddr.StartsWith("MACRO."))
+ {
+ lgTrace($"Decodifica memoria MACRO | memAddr: {memAddr}");
+ // recupero parametro...
+ int.TryParse(memAddr.Replace("MACRO.", ""), out cntAddr);
+ // processo parametro
+ stopwatch.Restart();
+ double macroVal = 0;
+ FANUC_ref.F_Read_macro(cntAddr, ref macroVal);
+ if (utils.CRB("recTime"))
+ {
+ TimingData.addResult(cIobConf.codIOB, string.Format("R{0}-MACRO", 5), stopwatch.ElapsedTicks);
+ }
+ // salvo valore
+ answ = macroVal.ToString();
+ }
// altrimenti se legge da area memoria specifica leggo da li... formto tipo STD.D.1604.DW
else
{
@@ -1012,7 +1029,6 @@ namespace IOB_WIN_NEXT
{
cntAddr = 6711;
}
-
// processo parametro contapezzi (lavorati)
stopwatch.Restart();
FANUC_ref.F_RW_Param_Integer(false, cntAddr, 3, ref outputVal);
@@ -1020,22 +1036,38 @@ namespace IOB_WIN_NEXT
{
TimingData.addResult(cIobConf.codIOB, string.Format("R{0}-PAR", 4), stopwatch.ElapsedTicks);
}
-
// salvo ultimo conteggio rilevato
int newVal = -1;
Int32.TryParse(outputVal.ToString(), out newVal);
contapezziPLC = newVal > -1 ? newVal : contapezziPLC;
}
+ // 2022.05.23 gestione MACRO da testare (Jetco)
+ else if (memAddr.StartsWith("MACRO."))
+ {
+ lgTrace($"Decodifica memoria MACRO | memAddr: {memAddr}");
+ // recupero parametro...
+ int.TryParse(memAddr.Replace("MACRO.", ""), out cntAddr);
+ // processo parametro
+ stopwatch.Restart();
+ double macroVal = 0;
+ FANUC_ref.F_Read_macro(cntAddr, ref macroVal);
+ if (utils.CRB("recTime"))
+ {
+ TimingData.addResult(cIobConf.codIOB, string.Format("R{0}-MACRO", 5), stopwatch.ElapsedTicks);
+ }
+ // salvo ultimo conteggio rilevato
+ int newVal = -1;
+ Int32.TryParse($"{macroVal}", out newVal);
+ contapezziPLC = newVal > -1 ? newVal : contapezziPLC;
+ }
// altrimenti se legge da area memoria specifica leggo da li... formto tipo STD.D.1604.DW
else
{
memAddressFanuc areaCounter = new memAddressFanuc(memAddr);
-
if (isVerboseLog)
{
lgInfo("[0] area memoria: {0}.{1}.{2}", areaCounter.mType, areaCounter.mPos, areaCounter.vType);
}
-
// leggo!
stopwatch.Restart();
// switch x tipo dati --> tipo lettura... e salvo ultimo conteggio rilevato
@@ -1076,7 +1108,6 @@ namespace IOB_WIN_NEXT
{
TimingData.addResult(cIobConf.codIOB, string.Format("R-{0}.{1}.{2}", areaCounter.mType, areaCounter.mPos, areaCounter.vType), stopwatch.ElapsedTicks);
}
-
// salvo...
int newVal = -1;
Int32.TryParse(outputVal.ToString(), out newVal);
@@ -1093,7 +1124,7 @@ namespace IOB_WIN_NEXT
}
catch (Exception exc)
{
- lgError(exc, "Errore in contapezzi FANUC");
+ lgError(exc, "Errore in contapezzi FANUC 02");
connectionOk = false;
}
}
diff --git a/IOB-WIN-NEXT/IobGeneric.cs b/IOB-WIN-NEXT/IobGeneric.cs
index 74a0030e..8a69fcf9 100644
--- a/IOB-WIN-NEXT/IobGeneric.cs
+++ b/IOB-WIN-NEXT/IobGeneric.cs
@@ -386,6 +386,12 @@ namespace IOB_WIN_NEXT
///
public ConcurrentQueue QueueMessages = new ConcurrentQueue();
+ ///
+ /// Oggetto della coda degli elementi di tipo RawTransf (e non ancora trasmessi)
+ /// NB: sono salvati serializzati come stringhe
+ ///
+ public ConcurrentQueue QueueRawTransf = new ConcurrentQueue();
+
///
/// Coda valori LOG UTENTE (da non sottocampionare come samples)...
///
@@ -753,6 +759,10 @@ namespace IOB_WIN_NEXT
/// Coda massima ammessa per FLog (se <=0 disattivata...)
///
protected int maxQueueFLog { get; set; } = utils.CRI("maxQueueFLog");
+ ///
+ /// Coda massima ammessa per FLog (se <=0 disattivata...)
+ ///
+ protected int maxQueueRawTransf { get; set; } = utils.CRI("maxQueueRawTransf");
///
/// Valore MINIMO limite x decidere invio di dati come array Json
@@ -1107,6 +1117,11 @@ namespace IOB_WIN_NEXT
///
public int counterSigIN { get; set; }
+ ///
+ /// Contatore x invio dati RawTransf
+ ///
+ public int counterRawTransf { get; set; }
+
///
/// Contatore x invio dati UserLog
///
@@ -2083,10 +2098,11 @@ namespace IOB_WIN_NEXT
// svuoto code se richiesto
if (resetQueue)
{
+ QueueAlarm = new ConcurrentQueue();
QueueIN = new ConcurrentQueue();
QueueFLog = new ConcurrentQueue();
- QueueAlarm = new ConcurrentQueue();
QueueMessages = new ConcurrentQueue();
+ QueueRawTransf = new ConcurrentQueue();
QueueULog = new ConcurrentQueue();
}
// imposto contatori blink a zero...
@@ -2212,7 +2228,66 @@ namespace IOB_WIN_NEXT
}
}
- //
+ ///
+ /// Processo la coda RawTransf...
+ ///
+ private void svuotaCodaRawTransf()
+ {
+ // verifico SE la coda abbia dei valori...
+ if (QueueRawTransf.Count > 0)
+ {
+ // invio pacchetto di dati (max da conf)
+ for (int i = 0; i < nMaxSend; i++)
+ {
+ // SE ho qualcosa in coda...
+ if (QueueRawTransf.Count > 0)
+ {
+ string currVal = "";
+ if (MPOnline)
+ {
+ if (IobOnline)
+ {
+ List listaValori = new List();
+ // se ho + di maxJsonData elementi --> invio un set di dati alla volta
+ if (QueueRawTransf.Count > maxJsonData)
+ {
+ // prendoi primi maxJsonDataValori
+ for (int j = 0; j < maxJsonData; j++)
+ {
+ QueueRawTransf.TryDequeue(out currVal);
+ listaValori.Add(currVal);
+ }
+ sendDataBlock(urlType.RawTransf, listaValori);
+ }
+ else
+ {
+ // invio in blocco
+ listaValori = QueueRawTransf.ToList();
+ // invio
+ sendDataBlock(urlType.RawTransf, listaValori);
+ // svuoto!
+ QueueRawTransf = new ConcurrentQueue();
+ }
+ }
+ else
+ {
+ break;
+ }
+ }
+ else
+ {
+ break;
+ }
+ }
+ else
+ {
+ break;
+ }
+ }
+ }
+ }
+
+ ///
/// Processo la coda UserLog...
///
private void svuotaCodaULog()
@@ -2302,6 +2377,7 @@ namespace IOB_WIN_NEXT
// invio con thread separato...
Task taskSigIN = Task.Run(() => svuotaCodaSignIN());
Task taskFLog = Task.Run(() => svuotaCodaFLog());
+ Task taskRawTransf = Task.Run(() => svuotaCodaRawTransf());
Task taskULog = Task.Run(() => svuotaCodaULog());
}
else
@@ -2316,6 +2392,8 @@ namespace IOB_WIN_NEXT
raiseRefresh(currDispData);
// gestione queue FluxLog (invio, display)
svuotaCodaFLog();
+ // coda RawTransf
+ svuotaCodaRawTransf();
// coda UserLog
svuotaCodaULog();
// refresh
@@ -3426,6 +3504,56 @@ namespace IOB_WIN_NEXT
}
}
+ ///
+ /// Accumula in coda i valori RawData + log
+ ///
+ ///
+ ///
+ public void accodaRawData(IOB_UT_NEXT.rawTransfType mesType, object mesContent)
+ {
+ /*--------------------------------
+ * nuova gestione coda dictionary
+ * fixme todo da fare !!!
+ *
+ * - conterrà una lista di oggetti baseRawTransf
+ * - i dati vanno poi "scodati" dal + vecchio ed inviati a MP/IO
+ * - mostra un sunto delle info da inviare
+ * - accodamento vero e proprio
+ * - verifica (opzionale) coda massima x gestire roundRobin ultimi eventi
+ * - trace della coda
+ * - counter invio??? valutare se c'è dataora e poi sono da salvare su MongoDb / Redis
+ *
+ * */
+
+ // serializzo il valore...
+ BaseRawTransf newVal = new BaseRawTransf(DateTime.Now, mesContent, mesType);
+ string encodedVal = JsonConvert.SerializeObject(newVal);
+ // --> accodo (valore già formattato)!
+ QueueRawTransf.Enqueue(encodedVal);
+ // se abilitato controllo coda Max (superiore a 0...)
+ if (maxQueueRawTransf > 0)
+ {
+ // se ho una coda superiore a max ammesso
+ if (QueueRawTransf.Count > maxQueueRawTransf)
+ {
+ // elimino valori iniziali fino a tornare al max ammesso...
+ while (QueueRawTransf.Count > maxQueueRawTransf)
+ {
+ string currVal = "";
+ QueueRawTransf.TryDequeue(out currVal);
+ lgInfo($"Eliminazione da coda RawTransf per superamento maxLengh: {currVal}");
+ }
+ }
+ }
+ // loggo!
+ lgTrace(string.Format("[QUEUE-RTRANSF] {0}", encodedVal));
+ counterRawTransf++;
+ if (counterRawTransf > 9999)
+ {
+ counterRawTransf = 0;
+ }
+ }
+
///
/// Accoda (visualizzando in cima allo stack) la nuova stringa di output per area OTHER DATA
///
@@ -3446,10 +3574,19 @@ namespace IOB_WIN_NEXT
{
// mostro dati variati letti...
displayInData(ref currDispData);
- // --> accodo (valore già formattato)!
- QueueIN.Enqueue(qEncodeIN);
- // loggo!
- lgTrace(string.Format("[QUEUE-IN] {0}", qEncodeIN));
+ // verifico veto a invio status macchina
+ string keyName = "VETO_SIG_IN";
+ if (getOptPar(keyName).ToUpper() == "TRUE")
+ {
+ lgTrace($"Filtrato accodamento valore da conf IOB | {keyName} | [QUEUE-IN] {qEncodeIN}");
+ }
+ else
+ {
+ // --> accodo (valore già formattato)!
+ QueueIN.Enqueue(qEncodeIN);
+ // loggo!
+ lgTrace(string.Format("[QUEUE-IN] {0}", qEncodeIN));
+ }
// aggiorno counters ed eventuale reset
nReadFilt++;
if (nReadFilt > int.MaxValue - 1)
@@ -3833,6 +3970,7 @@ namespace IOB_WIN_NEXT
}
else if (ciclo == gatherCycle.LF)
{
+ processCustomTaskLF();
processOtherCounters();
processProgram();
// verifico se devo gestire cambio ODL in modo automatico
@@ -3920,6 +4058,13 @@ namespace IOB_WIN_NEXT
raiseRefresh(currDispData);
}
+ ///
+ /// Effettua processing CUSTOM x l'IOB corrente (ed invia ad IO)
+ /// (task svolto tipicamente ogni 5 sec se base timer 10ms, vedere app.config)
+ ///
+ public virtual void processCustomTaskLF()
+ { }
+
///
/// Recupera eventuali allarmi CNC...
///
@@ -4143,6 +4288,27 @@ namespace IOB_WIN_NEXT
}
break;
+ case urlType.RawTransf:
+ BaseRawTransf currRTData = new BaseRawTransf();
+ rawTransfJsonPayload fullRTObj = new rawTransfJsonPayload();
+ fullRTObj.rawTransfData = new List();
+ // inizio processando ogni valore
+ foreach (var item in elencoValori)
+ {
+ currRTData = JsonConvert.DeserializeObject(item);
+ fullRTObj.rawTransfData.Add(currRTData);
+ }
+ // conversione finale
+ try
+ {
+ answ = JsonConvert.SerializeObject(fullRTObj);
+ }
+ catch (Exception exc)
+ {
+ lgError($"RawTransf Errore in costruzione jsonPayload:{Environment.NewLine}{exc}");
+ }
+ break;
+
case urlType.ULog:
int numVal = 0;
int matrOp = 0;
@@ -5524,6 +5690,10 @@ namespace IOB_WIN_NEXT
tipoComando = cIobConf.serverData.CMDBASE_JSON;
break;
+ case urlType.RawTransf:
+ tipoComando = cIobConf.serverData.CMDRAWTRANSF_JSON;
+ break;
+
case urlType.ULog:
tipoComando = cIobConf.serverData.CMDULOG_JSON;
break;
diff --git a/IOB-WIN-NEXT/IobIcoelDb.cs b/IOB-WIN-NEXT/IobIcoelDb.cs
new file mode 100644
index 00000000..f7c969b2
--- /dev/null
+++ b/IOB-WIN-NEXT/IobIcoelDb.cs
@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace IOB_WIN_NEXT
+{ ///
+ /// Adapter specializzato per ICOEL e le chiamate tramite DB per i dati
+ /// - accettazione lotti prodotto (frontiera / entrata ciliegie)
+ /// - export (totale per prodotti)
+ /// - tracciabilità (confezioni
+ ///
+
+ public class IobIcoelDb : IobGeneric
+ {
+ ///
+ /// Costruttore dell'IOB Icoel DB
+ ///
+ /// AdapterForm chiamante
+ /// Configurazione IOB per avvio
+ public IobIcoelDb(AdapterForm caller, IobConfiguration IOBConf) : base(caller, IOBConf)
+ {
+ }
+
+ public override Dictionary executeTasks(Dictionary task2exe)
+ {
+ return base.executeTasks(task2exe);
+ }
+ }
+}
diff --git a/IOB-WIN-NEXT/IobIcoelSoap.cs b/IOB-WIN-NEXT/IobIcoelSoap.cs
new file mode 100644
index 00000000..68832884
--- /dev/null
+++ b/IOB-WIN-NEXT/IobIcoelSoap.cs
@@ -0,0 +1,236 @@
+using EgwProxy.Icoel;
+using EgwProxy.Icoel.SizerService;
+using IOB_UT_NEXT;
+using MapoSDK;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Net.NetworkInformation;
+
+namespace IOB_WIN_NEXT
+{
+ ///
+ /// Adapter specializzato per ICOEL e le chiamate tramite WS Soap al Sizer, con libreria EgwProxy.Icoel
+ ///
+ public class IobIcoelSoap : IobGeneric
+ {
+ #region Public Constructors
+
+ ///
+ /// Costruttore dell'IOB Icoel SOAP
+ ///
+ /// AdapterForm chiamante
+ /// Configurazione IOB per avvio
+ public IobIcoelSoap(AdapterForm caller, IobConfiguration IOBConf) : base(caller, IOBConf)
+ {
+ /* --------------------------------------
+ * todo's
+ * --------------------------------------
+ * - init obj comunicazione da conf e nuget
+ * - test comunicazione
+ * - estensione IOB come OPT_PAR di OVERRIDE (x inviare dati di un unico iOB da più IOB programs)
+ * - gestione processCustomTaskLF
+ * - x lettura dei 2 batch correnti (sx/dx)
+ * - calcolo batch in corso/chiusi da date inizio/fine
+ * - trasmettere a MP/IO risultato valutazioni
+ * - gestione executeTasks
+ * - task di invio batch configurato in coda
+ * - task di recupero info anagrafiche (grower, variety, layout,...)
+ * - contapezzi (SE ha senso con sizer oppure saltare)
+ */
+
+ IcoelSizer = new Connector(IOBConf.cncIpAddr, IOBConf.cncPort);
+ }
+
+ ///
+ /// Effettua lettura semafori principale
+ /// Parametri da aggiornare x display in form
+ ///
+ public override void readSemafori(ref newDisplayData currDispData)
+ {
+ if (connectionOk)
+ {
+ B_input = 1;
+ currDispData.semIn = Semaforo.SV;
+ if (currBatchList != null)
+ {
+ // se ho batch NON chiusi (data = minValue) allora lavora
+ if (currBatchList[1].EndTime == DateTime.MinValue || currBatchList[1].EndTime == DateTime.MinValue)
+ {
+ B_input = 3;
+ }
+ }
+ }
+ else
+ {
+ B_input = 0;
+ currDispData.semIn = Semaforo.SR;
+ }
+ }
+
+ #endregion Public Constructors
+
+ #region Public Methods
+
+ ///
+ /// Implementazione custom esecuzione task specifici
+ ///
+ ///
+ ///
+ public override Dictionary executeTasks(Dictionary task2exe)
+ {
+ /*---------------------------------------
+ * fixme todo fare !!!
+ * gestione execute task SPECIFICI x il sizer:
+ * - recupero anagrafice variety/layout (attivi)
+ * - recupero grower
+ * - invio batch da accodare
+ * - recupero dati da sizer (OVE disponibili)
+ * - recupero batch corrente (modalità force/resync?)
+ *
+ *---------------------------------------*/
+
+ return base.executeTasks(task2exe);
+ }
+
+ ///
+ /// Effettua processing CUSTOM x Icoel:
+ /// - recupera elenco batch delle 2 linee
+ /// - invia al sistema
+ ///
+ public override void processCustomTaskLF()
+ {
+ lgInfo($"Richiesto processCustomTaskLF");
+ var currBatch = IcoelSizer.GetCurrentBatch();
+ if (currBatch != null)
+ {
+ // verifico se i batch siano variati... e quindi da inviare...
+ bool doSend = (currBatchList == null || currBatchList.Count == 0);
+ if (currBatch.Count > 0 && !doSend)
+ {
+ foreach (var item in currBatch)
+ {
+ // se variato ID è cambiato
+ doSend = (currBatchList[item.Key].Id != item.Value.Id);
+ }
+ }
+ // se devo inviare impacchetto dati
+ if (doSend)
+ {
+ // accodo per invio...
+ accodaRawData(IOB_UT_NEXT.rawTransfType.IcoelBatch, currBatch);
+ currBatchList = currBatch;
+ }
+ }
+ }
+
+ ///
+ /// 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("IcoelSoap: 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;
+ // recupero elenco batch... se != vuoto -_> connesso!
+ var batchList = IcoelSizer.GetCurrentBatch();
+ if (batchList != null && batchList.Count > 0)
+ {
+ lgInfo($"szStatusConnection IcoelSoap, recuperato elenco di {batchList.Count} batch");
+ parentForm.commPlcActive = false;
+ connectionOk = true;
+ }
+ // refresh stato connessione!!!
+ if (connectionOk)
+ {
+ if (adpRunning)
+ {
+ lgInfo("Connessione OK");
+ }
+ }
+ else
+ {
+ lgError("Impossibile procedere, connessione mancante...");
+ }
+ }
+ catch (Exception exc)
+ {
+ lgFatal($"Errore nella connessione all'adapter IcoelSoap: {szStatusConnection}{Environment.NewLine}{exc}");
+ connectionOk = false;
+ lgInfo($"Eccezione in TryConnect, Adapter IcoelSoap 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: IcoelSoap controllo PING fallito per IP {cIobConf.cncIpAddr}");
+ }
+ }
+ }
+ }
+ else
+ {
+ needRefresh = true;
+ }
+ }
+
+ public override void tryDisconnect()
+ {
+ // registro solo che è disconnesso
+ connectionOk = false;
+ }
+
+ #endregion Public Methods
+
+ #region Protected Properties
+
+ ///
+ /// elenco dei BAtch correntemente caricati x testing variazione
+ ///
+ protected Dictionary currBatchList { get; set; }
+
+ protected Connector IcoelSizer { get; set; }
+
+ #endregion Protected Properties
+
+ #region Protected Methods
+
+ ///
+ /// recupera le variety ed i rispettivi layout e li invia al sistema MP/IO
+ ///
+ protected void refreshVarietyData()
+ {
+ ///determina se recuperare SOLO varietà attive o tutte
+ bool soloAttive = false;
+ var varList = IcoelSizer.GetVarietyList(soloAttive);
+ if (varList != null && varList.Length > 0)
+ {
+ var varietyData = IcoelSizer.GetLayoutForVarietyList(varList);
+ // invio dai al server IO
+
+ }
+
+ }
+
+ #endregion Protected Methods
+ }
+}
\ No newline at end of file
diff --git a/IOB-WIN-NEXT/IobOpcUa.cs b/IOB-WIN-NEXT/IobOpcUa.cs
index bb08b5f8..e3049e89 100644
--- a/IOB-WIN-NEXT/IobOpcUa.cs
+++ b/IOB-WIN-NEXT/IobOpcUa.cs
@@ -164,8 +164,8 @@ namespace IOB_WIN_NEXT
}
///
- /// Effettua lettura semafori principale Parametri da
- /// aggiornare x display in form
+ /// Effettua lettura semafori principale
+ /// Parametri da aggiornare x display in form
///
public override void readSemafori(ref newDisplayData currDispData)
{
diff --git a/IOB-WIN-NEXT/IobOpcUaOmronIcoel.cs b/IOB-WIN-NEXT/IobOpcUaOmronIcoel.cs
index b5ef7978..91803e95 100644
--- a/IOB-WIN-NEXT/IobOpcUaOmronIcoel.cs
+++ b/IOB-WIN-NEXT/IobOpcUaOmronIcoel.cs
@@ -460,7 +460,7 @@ namespace IOB_WIN_NEXT
}
///
- /// effettua verifica del datablock icoel invianod eventualmente i dati variati
+ /// effettua verifica del datablock icoel inviando eventualmente i dati variati
///
///
///
diff --git a/IOB-WIN-NEXT/packages.config b/IOB-WIN-NEXT/packages.config
index 7f91f314..37b775c1 100644
--- a/IOB-WIN-NEXT/packages.config
+++ b/IOB-WIN-NEXT/packages.config
@@ -2,9 +2,9 @@
-
-
-
+
+
+