Files
Mapo-IOB-WIN/IOB-UT-NEXT/ToMapo.cs
T
2021-09-25 10:22:25 +02:00

456 lines
14 KiB
C#

using MapoSDK;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace IOB_UT_NEXT
{
/// <summary>
/// Classe gestione configurazione parametri di base x allarmi
/// </summary>
public class BaseAlarmConf
{
#region Public Fields
/// <summary>
/// valore di aprtenza x un segnale di blink in caso di inizio variazione
/// </summary>
public int blinkVal = 30;
#endregion Public Fields
#region Public Properties
/// <summary>
/// Elenco dei contatori blink (x gestione caso frponte salita/discesa segnale hce blinka)
/// </summary>
public int[] alarmsBlinkCounter { get; set; }
/// <summary>
/// BitMask 16bit (1 = valido, 0 = filtro) degli allarmi silenziati/disabilitati (se iniziano per ##) come valore da sottrarre x check
/// </summary>
public uint[] alarmsMask { get; set; }
/// <summary>
/// Array dei valori allarme correnti
/// </summary>
public uint[] alarmsState { get; set; }
/// <summary>
/// Descrizione area allarmi
/// </summary>
public string description { get; set; } = "";
/// <summary>
/// Indice nell'area di memoria (da valore iniziale = 0)
/// </summary>
public int index { get; set; } = 0;
/// <summary>
/// Nome "assoluto" della posizione nell'area di memoria (anche diverso da indice)
/// </summary>
public string memAddr { get; set; } = "";
/// <summary>
/// Elenco allarmi configurati x la bitmap
/// </summary>
public List<string> messages { get; set; } = new List<string>();
/// <summary>
/// Size in byte
/// </summary>
public int size { get; set; } = 0;
/// <summary>
/// Tipo di dato
/// </summary>
[JsonConverter(typeof(StringEnumConverter))]
public plcDataType tipoMem { get; set; } = plcDataType.Boolean;
#endregion Public Properties
#region Public Methods
/// <summary>
/// Calcola il filtro da condizioen blink (ovvero maschera per valori indicati blinking)
/// </summary>
/// <param name="num"></param>
/// <returns></returns>
public uint blinkFilter(int num)
{
uint answ = 0;
int idx = 16 * num;
for (int i = 0; i < 16; i++)
{
if (alarmsBlinkCounter[idx + i] > 0)
{
answ += (uint)1 << i;
}
}
return answ;
}
/// <summary>
/// Effettua il decremento dei contatori blink (se >0) per gestire i segnali alternati sul fronte di discesa
/// </summary>
public void decreaseBlinkCounter()
{
int idx = 0;
foreach (var item in alarmsBlinkCounter)
{
alarmsBlinkCounter[idx] = item > 0 ? item - 1 : item;
idx++;
}
}
/// <summary>
/// Confronta un valore di stato allarme con lo stato precedentemente salvato considerando blink/veto
/// </summary>
/// <param name="num">Numero/indice del banco di allarme (uint16)</param>
/// <param name="newValue">Valore (bitmap) allarmi come uint16</param>
/// <returns></returns>
public bool isChanged(int num, uint newValue)
{
// per prima cosa controllo valori RAW
bool answ = !alarmsState[num].Equals(newValue);
if (answ)
{
// controllo valori filtrati (sottraendo BITMASK i valori di filtro)
answ = ((alarmsState[num] & alarmsMask[num]) != (newValue & alarmsMask[num]));
// se fossero ancora differenti controllo ulteriore mask dato il counter dei blink:
if (answ)
{
var blinkFilt = blinkFilter(num);
answ = ((alarmsState[num] & (alarmsMask[num] | blinkFilt)) != (newValue & (alarmsMask[num] | blinkFilt)));
}
}
return answ;
}
/// <summary>
/// Inizializzazione classe con valori calcolati
/// </summary>
public void setupData()
{
// inizializzo vettore valore allarmi x banco int16
alarmsState = new uint[size / 2];
alarmsMask = new uint[size / 2];
// una volta inizializzata la classe di base sistemo vettori allarmi disabilitati ed il contatore blink dei fronti di discesa
alarmsBlinkCounter = new int[messages.Count];
int idx = 0;
int bank = 0;
foreach (var item in messages)
{
if (item.StartsWith("##"))
{
alarmsBlinkCounter[idx] = -999;
}
else
{
alarmsMask[bank] += (uint)1 << idx;
}
idx++;
// sistemo bank/indice
if (idx > 15)
{
bank++;
idx = 0;
}
}
}
/// <summary>
/// Imposta il valore dello status attuale allarme impostando eventuale valore blink x le variazioni
/// </summary>
/// <param name="num"></param>
/// <param name="newStatus"></param>
public void updStatusVal(int num, uint newStatus)
{
// calcola la maschera di variazione da valore precedente
var variations = newStatus ^ alarmsState[num];
// ciclo sui 16 bit...
for (int i = 0; i < 16; i++)
{
if ((variations & (1 << i)) == (1 << i))
{
alarmsBlinkCounter[num * 16 + i] = blinkVal;
}
}
// salvo nuovo valore
alarmsState[num] = newStatus;
}
#endregion Public Methods
}
#if false
/// <summary>
/// Struttura della conf memoria ModBus
/// </summary>
public class BaseModbusConf
{
public enum DataType
{
ND = 0,
BIT,
INT,
REAL
}
public enum MemType
{
ND = 0,
DiscreteInput = 1,
Coil = 2,
InputRegister = 3,
HoldingRegister = 4
}
/// <summary>
/// Elenco aree memoria ModBus in lettura
/// </summary>
public List<ModbusMemArea> mMapRead { get; set; } = new List<ModbusMemArea>();
/// <summary>
/// Elenco aree memoria ModBus in scrittura
/// </summary>
public List<ModbusMemArea> mMapWrite { get; set; } = new List<ModbusMemArea>();
/// <summary>
/// struttura di base memoria ModBus
/// </summary>
public class ModbusMemArea
{
public ushort BaseAddr { get; set; } = 0;
public string RawAddr { get; set; } = "";
public ushort Size { get; set; } = 0;
[JsonConverter(typeof(StringEnumConverter))]
public MemType Type { get; set; } = MemType.ND;
public List<VarConf> VarList { get; set; } = new List<VarConf>();
}
public class VarConf
{
public string description { get; set; } = "";
public int factor { get; set; } = 1;
public bool hasRange
{
get
{
return !this.minVal.Equals(this.maxVal);
}
}
public ushort index { get; set; } = 0;
public int maxVal { get; set; } = 0;
public string memAddr { get; set; } = "";
public int minVal { get; set; } = 0;
public string name { get; set; } = "none";
public ushort size { get; set; } = 0;
[JsonConverter(typeof(StringEnumConverter))]
public DataType tipoMem { get; set; } = DataType.ND;
public string value { get; set; } = "";
}
}
#endif
/// <summary>
/// Classe gestione configurazione parametri di base x configuraizone estesa (es MTConnect, OPC-UA, ...)
/// </summary>
public class BaseParamConf
{
#region Public Properties
/// <summary>
/// Struttura dati x check condizione LAVORA / Green
/// </summary>
public List<diCheckCondition> condWork { get; set; } = new List<diCheckCondition>();
/// <summary>
/// Elenco items FILTRATI da invio come dynData --> FluxLog (events o samples)
/// </summary>
public List<string> fluxLogVeto { get; set; } = new List<string>();
/// <summary>
/// Array degli elementi di traduzione item
/// </summary>
public Dictionary<string, string> itemTranslation { get; set; } = new Dictionary<string, string>();
/// <summary>
/// Nome variabile x EmergencyStop
/// </summary>
public string keyEStop { get; set; } = "";
/// <summary>
/// Nome variabile x pezzi FATTI
/// </summary>
public string keyPartCount { get; set; } = "";
/// <summary>
/// Nome variabile x Codice Articolo
/// </summary>
public string keyPartId { get; set; } = "";
/// <summary>
/// Nome variabile x pezzi RICHIESTI
/// </summary>
public string keyPartReq { get; set; } = "";
/// <summary>
/// Nome variabile x NOME PROGRAMMA
/// </summary>
public string keyProgName { get; set; } = "";
/// <summary>
/// Nome variabile x RunMode
/// </summary>
public string keyRunMode { get; set; } = "";
/// <summary>
/// Dictionary dei nomi da cercare come "endsWith" a cui applicare la soglia indicata
/// </summary>
public Dictionary<string, int> paramsEndThresh { get; set; } = new Dictionary<string, int>();
/// <summary>
/// Indica se il ping sia un criterio valido x determinare powerON impianto
/// </summary>
public bool pingAsPowerOn { get; set; } = true;
#endregion Public Properties
}
/// <summary>
/// Classe per rappresentare oggetti chaive/valore target x controlo condizioni multiple
/// </summary>
public class diCheckCondition
{
#region Public Properties
/// <summary>
/// nome variabile
/// </summary>
public string keyName { get; set; } = "";
/// <summary>
/// valore target per esito richeisto
/// </summary>
public string targetValue { get; set; } = "";
#endregion Public Properties
}
/// <summary>
/// Classe per rappresentare una lista di oggetti chaive/valore target x controlo condizioni multiple + indicazione modalità di controllo (AND/OR/...)
/// </summary>
public class diCheckCondSetup
{
#region Public Properties
/// <summary>
/// Elenco condizioni
/// </summary>
public List<diCheckCondition> checkList { get; set; } = new List<diCheckCondition>();
/// <summary>
/// Modalità verifica condizioni
/// </summary>
public boolCheckMode checkMode { get; set; } = boolCheckMode.AND;
#endregion Public Properties
}
/// <summary>
/// Classe gestione configurazione parametri specifici MTC da BaseParamConf
/// </summary>
public class MtcParamConf : BaseParamConf
{
#region Public Properties
/// <summary>
/// Struttura dati x check condizione PowerOn
/// </summary>
public diCheckCondition condPowerOn { get; set; } = new diCheckCondition();
#endregion Public Properties
}
/// <summary>
/// Classe gestione configurazione parametri specifici OPC-UA da BaseParamConf
/// </summary>
public class OpcUaParamConf : BaseParamConf
{
#region Public Properties
/// <summary>
/// Identificativo nodo iniziale
/// </summary>
public string BrowseFullVal { get; set; } = "ns=2;s=Scalar_Static";
/// <summary>
/// Indice NS da cui fare il browse dei file
/// </summary>
public ushort BrowseNSIndex { get; set; } = 4;
/// <summary>
/// ID del nodo da cui partire x il browse di identificazione nodi iniziale
/// </summary>
public uint BrowseValue { get; set; } = 5001;
/// <summary>
/// Struttura dati x check condizione Contapezzi Abilitato (se vuoto = sempre abilitato)
/// </summary>
public diCheckCondSetup condCountEnabled { get; set; } = new diCheckCondSetup();
/// <summary>
/// Struttura dati x check condizione Errore
/// </summary>
public diCheckCondSetup condError { get; set; } = new diCheckCondSetup();
/// <summary>
/// Struttura dati x check condizione Emergenza
/// </summary>
public diCheckCondSetup condEStop { get; set; } = new diCheckCondSetup();
/// <summary>
/// Struttura dati x check condizione Manual
/// </summary>
public diCheckCondSetup condManual { get; set; } = new diCheckCondSetup();
/// <summary>
/// Struttura dati x check condizione PowerOn
/// </summary>
public diCheckCondSetup condPowerOn { get; set; } = new diCheckCondSetup();
/// <summary>
/// Struttura dati x check condizione READY
/// </summary>
public diCheckCondSetup condReady { get; set; } = new diCheckCondSetup();
/// <summary>
/// Struttura dati x check condizione WarmUp - CoolDown
/// </summary>
public diCheckCondSetup condWarmUpCoolDown { get; set; } = new diCheckCondSetup();
/// <summary>
/// Aree di memoria lettura
/// </summary>
public Dictionary<string, dataConfTSVC> mMapRead { get; set; } = new Dictionary<string, dataConfTSVC>();
/// <summary>
/// Aree di memoria scrittura
/// </summary>
public Dictionary<string, dataConf> mMapWrite { get; set; } = new Dictionary<string, dataConf>();
#endregion Public Properties
}
}