ok test OSAI x nuova gestione allarmi (x ora legge blocchi, potrebbe leggere sempre tutti però dati i tempi rilevati...)
This commit is contained in:
@@ -2127,97 +2127,97 @@ namespace MTC_Adapter
|
||||
public virtual void refreshAlarmState(StFlag32 Alarm2Refresh, bool giveAck)
|
||||
{
|
||||
// log bitmap se verboso attivo + ho allarmi da refreshare
|
||||
if ((Alarm2Refresh != StFlag32.NONE) && utils.CRB("verbose"))
|
||||
{
|
||||
lg.Info("Richiesto refresh allarmi x bitmask: {0}", utils.binaryForm((int)Alarm2Refresh));
|
||||
}
|
||||
|
||||
bool ackReturned = false;
|
||||
// byte di acknowledge...
|
||||
byte[] retACK_DW0 = new byte[4];
|
||||
// inizio impostando una bitmap x ACK che abbia i bit abbassati se lo strobe è disattivo: AND logico tra STR e ACK
|
||||
retACK_DW0 = BitConverter.GetBytes(Convert.ToUInt32(STRB_DW0 & ACK_DW0));
|
||||
|
||||
inizio = DateTime.Now;
|
||||
uint[] MemBlock;
|
||||
// controllo, SE devo leggere tutto uso un unico accesso ai 128byte, altrimenti leggo a blocchi di 32bit...
|
||||
if (Alarm2Refresh == (StFlag32)unchecked((int)UInt32.MaxValue))
|
||||
{
|
||||
// blocco memoria x lettura dati COMPLETO (4Byte*32 = 128Byte)
|
||||
MemBlock = new uint[32];
|
||||
// recupero tutti i 32 bit del blocco
|
||||
if ((Alarm2Refresh != StFlag32.NONE) && utils.CRB("verbose"))
|
||||
{
|
||||
lg.Info("Richiesto refresh allarmi x bitmask: {0}", utils.binaryForm((int)Alarm2Refresh));
|
||||
}
|
||||
|
||||
bool ackReturned = false;
|
||||
// byte di acknowledge...
|
||||
byte[] retACK_DW0 = new byte[4];
|
||||
// inizio impostando una bitmap x ACK che abbia i bit abbassati se lo strobe è disattivo: AND logico tra STR e ACK
|
||||
retACK_DW0 = BitConverter.GetBytes(Convert.ToUInt32(STRB_DW0 & ACK_DW0));
|
||||
|
||||
inizio = DateTime.Now;
|
||||
uint[] MemBlock;
|
||||
// controllo, SE devo leggere tutto uso un unico accesso ai 128byte, altrimenti leggo a blocchi di 32bit...
|
||||
if (Alarm2Refresh == (StFlag32)unchecked((int)UInt32.MaxValue))
|
||||
{
|
||||
// blocco memoria x lettura dati COMPLETO (4Byte*32 = 128Byte)
|
||||
MemBlock = new uint[32];
|
||||
// recupero tutti i 32 bit del blocco
|
||||
inizio = DateTime.Now;
|
||||
readAllAlarms(ref MemBlock);
|
||||
if (utils.CRB("recTime")) TimingData.addResult(string.Format("R{0}-STRB_DW0", MemBlock.Length * 4), DateTime.Now.Subtract(inizio).Ticks);
|
||||
if (AlarmFlags != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
// aggiorno vettore allarmi x intero! size del vettore di destinazione (in byte!!!!)
|
||||
Buffer.BlockCopy(MemBlock, 0, AlarmFlags, 0, AlarmFlags.Length);
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
lg.Error(string.Format("Errore in BLOCKCOPY{0}{1}", Environment.NewLine, exc));
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (Alarm2Refresh != StFlag32.NONE)
|
||||
{
|
||||
// blocco memoria x lettura dati
|
||||
MemBlock = new uint[1];
|
||||
// verifico gli allarmi di tutti i bit alzati...
|
||||
for (int i = 0; i < 32; i++)
|
||||
{
|
||||
if (Alarm2Refresh.HasFlag((StFlag32)Math.Pow(2, i)))
|
||||
{
|
||||
// recupero tutti i 32 bit del blocco
|
||||
inizio = DateTime.Now;
|
||||
readAlarmBlock(ref MemBlock, i);
|
||||
if (utils.CRB("recTime")) TimingData.addResult(string.Format("R{0}-STRB_DW0", MemBlock.Length * 4), DateTime.Now.Subtract(inizio).Ticks);
|
||||
try
|
||||
{
|
||||
// aggiorno vettore allarmi x intero!
|
||||
Buffer.BlockCopy(MemBlock, 0, AlarmFlags, i * 4, 4);
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
lg.Error(string.Format("Errore in BLOCKCOPY per indice i = {2},{0}{1}", Environment.NewLine, exc, i));
|
||||
}
|
||||
if (utils.CRI("loglevel") > 5)
|
||||
{
|
||||
lg.Info("Bit {0}, MemBlock: {1}", i, MemBlock[0]);
|
||||
}
|
||||
// segnalo allarme letto! memorizzo allarme nel vettore ack....
|
||||
retACK_DW0 = utils.setBitOnStFlag(retACK_DW0, true, i);
|
||||
}
|
||||
}
|
||||
// scrivo ack se richiesto!!!
|
||||
if (giveAck)
|
||||
{
|
||||
// scrivo update ad ack!!!
|
||||
readAllAlarms(ref MemBlock);
|
||||
if (utils.CRB("recTime")) TimingData.addResult(string.Format("R{0}-STRB_DW0", MemBlock.Length * 4), DateTime.Now.Subtract(inizio).Ticks);
|
||||
if (AlarmFlags != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
// aggiorno vettore allarmi x intero! size del vettore di destinazione (in byte!!!!)
|
||||
Buffer.BlockCopy(MemBlock, 0, AlarmFlags, 0, AlarmFlags.Length);
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
lg.Error(string.Format("Errore in BLOCKCOPY{0}{1}", Environment.NewLine, exc));
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (Alarm2Refresh != StFlag32.NONE)
|
||||
{
|
||||
// blocco memoria x lettura dati
|
||||
MemBlock = new uint[1];
|
||||
// verifico gli allarmi di tutti i bit alzati...
|
||||
for (int i = 0; i < 32; i++)
|
||||
{
|
||||
if (Alarm2Refresh.HasFlag((StFlag32)Math.Pow(2, i)))
|
||||
{
|
||||
// recupero tutti i 32 bit del blocco
|
||||
inizio = DateTime.Now;
|
||||
readAlarmBlock(ref MemBlock, i);
|
||||
if (utils.CRB("recTime")) TimingData.addResult(string.Format("R{0}-STRB_DW0", MemBlock.Length * 4), DateTime.Now.Subtract(inizio).Ticks);
|
||||
try
|
||||
{
|
||||
// aggiorno vettore allarmi x intero!
|
||||
Buffer.BlockCopy(MemBlock, 0, AlarmFlags, i * 4, 4);
|
||||
}
|
||||
catch (Exception exc)
|
||||
{
|
||||
lg.Error(string.Format("Errore in BLOCKCOPY per indice i = {2},{0}{1}", Environment.NewLine, exc, i));
|
||||
}
|
||||
if (utils.CRI("loglevel") > 5)
|
||||
{
|
||||
lg.Info("Bit {0}, MemBlock: {1}", i, MemBlock[0]);
|
||||
}
|
||||
// segnalo allarme letto! memorizzo allarme nel vettore ack....
|
||||
retACK_DW0 = utils.setBitOnStFlag(retACK_DW0, true, i);
|
||||
}
|
||||
}
|
||||
// scrivo ack se richiesto!!!
|
||||
if (giveAck)
|
||||
{
|
||||
// scrivo update ad ack!!!
|
||||
inizio = DateTime.Now;
|
||||
writeAlarmAck(ref retACK_DW0);
|
||||
if (utils.CRB("recTime")) TimingData.addResult(string.Format("W{0}-ACK_DW0", retACK_DW0.Length), DateTime.Now.Subtract(inizio).Ticks);
|
||||
ackReturned = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// SE non ho già tornato un ACK...
|
||||
if (!ackReturned)
|
||||
{
|
||||
// se è diverso il vettori degli ACK in memoria da quello PLC...
|
||||
if (ACK_DW0 != (StFlag32)BitConverter.ToUInt32(retACK_DW0, 0))
|
||||
{
|
||||
// invio INTERO set ACK_DW0 con bit abbassati...
|
||||
retACK_DW0 = BitConverter.GetBytes(Convert.ToUInt32(STRB_DW0 & ACK_DW0));
|
||||
writeAlarmAck(ref retACK_DW0);
|
||||
if (utils.CRB("recTime")) TimingData.addResult(string.Format("W{0}-ACK_DW0", retACK_DW0.Length), DateTime.Now.Subtract(inizio).Ticks);
|
||||
ackReturned = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// SE non ho già tornato un ACK...
|
||||
if (!ackReturned)
|
||||
{
|
||||
// se è diverso il vettori degli ACK in memoria da quello PLC...
|
||||
if (ACK_DW0 != (StFlag32)BitConverter.ToUInt32(retACK_DW0, 0))
|
||||
{
|
||||
// invio INTERO set ACK_DW0 con bit abbassati...
|
||||
retACK_DW0 = BitConverter.GetBytes(Convert.ToUInt32(STRB_DW0 & ACK_DW0));
|
||||
inizio = DateTime.Now;
|
||||
writeAlarmAck(ref retACK_DW0);
|
||||
if (utils.CRB("recTime")) TimingData.addResult(string.Format("W{0}-ACK_DW0", retACK_DW0.Length), DateTime.Now.Subtract(inizio).Ticks);
|
||||
}
|
||||
writeAlarmAck(ref retACK_DW0);
|
||||
if (utils.CRB("recTime")) TimingData.addResult(string.Format("W{0}-ACK_DW0", retACK_DW0.Length), DateTime.Now.Subtract(inizio).Ticks);
|
||||
}
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
|
||||
@@ -978,6 +978,8 @@ namespace MTC_Adapter
|
||||
}
|
||||
string alarmText = string.Format("CNC Alarm - Cod: {0}", allNcData.lastncerror);
|
||||
|
||||
// tolgo eventuali allarmi CNC...
|
||||
allarmiCNC.Clear();
|
||||
allarmiCNC.Add(allNcData.lastncerror.ToString(), alarmText);
|
||||
// 2017.05.09 gestione allarmi commentata
|
||||
#if false
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<AdapterConf xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
|
||||
<Version>1</Version>
|
||||
<NomeAdapt>ADAPTER_SIEMENS</NomeAdapt>
|
||||
<TipoAdapt>SIEMENS</TipoAdapt>
|
||||
<NomeAdapt>ADAPTER_OSAI</NomeAdapt>
|
||||
<TipoAdapt>OSAI</TipoAdapt>
|
||||
<ContOreMaccOn>0</ContOreMaccOn>
|
||||
<ContOreMaccLav>0</ContOreMaccLav>
|
||||
<ContSlittaTast>0</ContSlittaTast>
|
||||
@@ -36,6 +36,16 @@
|
||||
<dataRefList />
|
||||
</element>
|
||||
</Lubro>
|
||||
<ProtMag>
|
||||
<element>
|
||||
<ident>ProtMagazzino_01</ident>
|
||||
<dataRefList />
|
||||
</element>
|
||||
<element>
|
||||
<ident>ProtMagazzino_02</ident>
|
||||
<dataRefList />
|
||||
</element>
|
||||
</ProtMag>
|
||||
<Cooler>
|
||||
<element>
|
||||
<ident>Cooler_01</ident>
|
||||
@@ -71,6 +81,10 @@
|
||||
<ident>Path_01</ident>
|
||||
<dataRefList />
|
||||
</element>
|
||||
<element>
|
||||
<ident>Path_02</ident>
|
||||
<dataRefList />
|
||||
</element>
|
||||
</Path>
|
||||
<UnOp>
|
||||
<element>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1 +1,7 @@
|
||||
# Commenti con cancelletto, struttura un variabile per riga, tipo chiave|valore (occhio che il separatore è configurato da .cofig come "testCharSep"); spazi e tabulazioni dovrei trimmarli in acquisizione (qui inseriti per comodità di lettura)
|
||||
# Commenti con cancelletto, struttura un variabile per riga, tipo chiave|valore (occhio che il separatore è configurato da .cofig come "testCharSep"); spazi e tabulazioni dovrei trimmarli in acquisizione (qui inseriti per comodità di lettura)
|
||||
001|Axis_01_Load |NUM
|
||||
002|Axis_02_Load |NUM
|
||||
003|Axis_03_Load |NUM
|
||||
004|Axis_04_Load |NUM
|
||||
005|Axis_05_Load |NUM
|
||||
006|Axis_06_Load |NUM
|
||||
@@ -21,8 +21,8 @@
|
||||
020|VacAct_02_Count |COUNT
|
||||
021|Lubro_01_Num |COUNT
|
||||
022|SlittaTastatore_Count |COUNT
|
||||
023|SlittaMagazzino_01_Count |COUNT
|
||||
024|ProtMagazzino_01_Count |COUNT
|
||||
023|ProtMagazzino_01_Count |COUNT
|
||||
024|ProtMagazzino_02_Count |COUNT
|
||||
025|UnOp_01_NumCambiUT |COUNT
|
||||
026|Axis_01_AccTime |COUNT
|
||||
027|Axis_02_AccTime |COUNT
|
||||
|
||||
Reference in New Issue
Block a user