fix lettura e decodifica status data x ESA/FANUC/OSAI e gestioen OSAI dei bit di status da memoria...

This commit is contained in:
Samuele E. Locatelli
2017-04-24 12:21:53 +02:00
parent 2a825c7385
commit 0ac8bf1c7f
4 changed files with 142 additions and 105 deletions
+2 -2
View File
@@ -160,7 +160,7 @@ namespace MTC_Adapter
// creo un vettore della dimensione corretta... conta anche commenti tanto poi riduco...
vettoreConf = new otherData[File.ReadLines(nomeFile).Count()];
// carica da file...
System.IO.StreamReader file = new System.IO.StreamReader(nomeFile);
StreamReader file = new StreamReader(nomeFile);
// leggo 1 linea alla volta...
int numRiga = 0;
int bitNum = 0;
@@ -192,7 +192,7 @@ namespace MTC_Adapter
byteNum = 0;
bitNum = 0;
}
lastData = decodeBitData(linea, utils.CRC("testCharSep"), "", byteNum, 1, bitNum);
lastData = decodeBitData(linea, utils.CRC("testCharSep"), byteNum, 1, bitNum);
vettoreConf[numRiga] = lastData;
}
else
+12 -5
View File
@@ -1084,14 +1084,20 @@ namespace MTC_Adapter
{
// recupero i dati di manutenzione dall'area di memoria IN BLOCCO
int memIndex = 14512;
int bitNum = 0;
int byteNum = 0;
byte byteVal;
int numByte = 1 + (statusData.Length / 8);
byte[] tabDatiStatus = new byte[numByte];
inizio = DateTime.Now;
FanucMemRW(R, FANUC.MemType.R, memIndex, ref tabDatiStatus);
if (utils.CRB("recTime")) TimingData.addResult(string.Format("R{0}-DatiStatus", tabDatiStatus.Length), DateTime.Now.Subtract(inizio).Ticks);
// decodifico aree memoria secondo tab configurazione
processStatusData(tabDatiStatus, statusData);
// vecchia gestione, ora gestito come OSAI con metodo da AdapterGeneric...
#if false
int bitNum = 0;
int byteNum = 0;
byte byteVal;
// uno ad uno vado a inserirli nella mappa dei dati dell'adapter...
int numero = 0;
string status = "";
@@ -1168,7 +1174,8 @@ namespace MTC_Adapter
}
}
}
}
}
#endif
}
/// <summary>
/// Leggo dati globali comuni (x path, assi...)
@@ -1284,7 +1291,7 @@ namespace MTC_Adapter
// creo un vettore della dimensione corretta... conta anche commenti tanto poi riduco...
statusData = new otherData[File.ReadLines(fileName).Count()];
// carica da file...
System.IO.StreamReader file = new System.IO.StreamReader(fileName);
StreamReader file = new StreamReader(fileName);
// leggo 1 linea alla volta...
int numRiga = 0;
while ((linea = file.ReadLine()) != null)
+121 -8
View File
@@ -1417,16 +1417,15 @@ namespace MTC_Adapter
return new otherData(valori[0], memAddr, valori[1].Trim(), valori[2].Trim());
}
/// <summary>
/// Decodifica file MAP
/// Decodifica file MAP (caso ESA/IOT)
/// </summary>
/// <param name="linea"></param>
/// <param name="separator"></param>
/// <param name="memPre">tipo memoria (R/D/...)</param>
/// <param name="baseAddr">indirizzo di partenza memoria</param>
/// <param name="ByteNum">indirizzo Byte: indirizzo di partenza memoria</param>
/// <param name="memSize">dimensione singolo slot in byte</param>
/// <param name="numRiga">numero riga x calcolo indice bit</param>
/// <param name="BitNum">indirizzo bit: numero riga x calcolo indice bit</param>
/// <returns></returns>
protected otherData decodeBitData(string linea, char separator, string memPre, int baseAddr, int memSize, int numRiga)
protected otherData decodeBitData(string linea, char separator, int ByteNum, int memSize, int BitNum)
{
string[] valori = linea.Split(separator);
int shift = 0;
@@ -1437,8 +1436,33 @@ namespace MTC_Adapter
catch
{ }
int resto = 0;
Math.DivRem(numRiga, 8, out resto);
string memAddr = string.Format("{0}{1}.{2}", memPre, baseAddr + shift * memSize, resto);
Math.DivRem(BitNum, 8, out resto);
string memAddr = string.Format("{0}.{1}", ByteNum + shift * memSize, resto);
return new otherData(valori[0], memAddr, valori[1].Trim(), valori[2].Trim());
}
/// <summary>
/// Decodifica file MAP (caso FANUC/OSAI/...)
/// </summary>
/// <param name="linea"></param>
/// <param name="separator"></param>
/// <param name="memPre">tipo memoria (R/D/...)</param>
/// <param name="baseAddr">indirizzo Byte: indirizzo di partenza memoria</param>
/// <param name="memSize">dimensione singolo slot in byte</param>
/// <param name="numRiga">indirizzo bit: numero riga x calcolo indice bit</param>
/// <returns></returns>
protected otherData decodeBitData(string linea, char separator, string memPre, int baseAddr, int memSize, int numRiga)
{
string[] valori = linea.Split(separator);
int shift = 0;
try
{
shift = (Convert.ToInt32(valori[0]) - 1) / (8 * memSize);
}
catch
{ }
int resto = 0;
Math.DivRem(numRiga, 8 * memSize, out resto);
string memAddr = string.Format("{0}{1}.{2}", memPre, baseAddr + shift, resto);
return new otherData(valori[0], memAddr, valori[1].Trim(), valori[2].Trim());
}
@@ -1634,7 +1658,7 @@ namespace MTC_Adapter
// leggo tutti i dati...
List<DataRefItem<string, string>> listaDR = currAdpConf.ProtMag[i].dataRefList;
// punto all'item
DataRefItem<string, string> riProtMag= listaDR.Find(x => x.Key == string.Format("ProtMagazzino_{0:00}_Count", i + 1));
DataRefItem<string, string> riProtMag = listaDR.Find(x => x.Key == string.Format("ProtMagazzino_{0:00}_Count", i + 1));
// recupero valori...
currProtMag[i] = Convert.ToUInt32(riProtMag.Value);
}
@@ -2077,6 +2101,7 @@ namespace MTC_Adapter
/// Processa la tabella di memoria dei dati di manutenzione
/// </summary>
/// <param name="tabDatiMtz"></param>
/// <param name="maintData"></param>
public void processMaintData(uint[] tabDatiMtz, otherData[] maintData)
{
// uno ad uno vado a inserirli nella mappa dei dati dell'adapter...
@@ -2319,6 +2344,94 @@ namespace MTC_Adapter
// -------------------------------------------
}
}
/// <summary>
/// Processa la tabella di memoria degli status di manutenzione
/// </summary>
/// <param name="tabDatiStatus"></param>
/// <param name="statusData"></param>
public void processStatusData(byte[] tabDatiStatus, otherData[] statusData)
{
int bitNum = 0;
int byteNum = 0;
byte byteVal;
// uno ad uno vado a inserirli nella mappa dei dati dell'adapter...
int numero = 0;
string status = "";
for (int i = 0; i < statusData.Length; i++)
{
numero = 0;
status = "";
// calcolo quale byte e quale bit devo leggere..
byteNum = i / 8;
bitNum = i - (8 * byteNum); // indice zero dei bit nel byte ( da cui -1 )
// faccio vera lettura
byteVal = tabDatiStatus[byteNum];
// leggo bit come ACTIVE/INACTIVE
if (((StFlag8)byteVal).HasFlag((StFlag8)Math.Pow(2, bitNum)))
{
status = "ACTIVE";
}
else
{
status = "INACTIVE";
}
if (statusData[i].varName == "PROTECTION_STATUS")
{
mProtectionStatus.Value = status;
}
else if (statusData[i].varName.StartsWith("VacPump_"))
{
if (statusData[i].varName.EndsWith("_Status"))
{
try
{
numero = Convert.ToInt32(statusData[i].varName.Replace("VacPump_", "").Replace("_Status", ""));
}
catch
{
}
if (numero > 0)
{
vettVacPump[numero - 1].mVacPumpStatus.Value = status;
}
}
}
else if (statusData[i].varName.StartsWith("Cooler_"))
{
if (statusData[i].varName.EndsWith("_Status"))
{
try
{
numero = Convert.ToInt32(statusData[i].varName.Replace("Cooler_", "").Replace("_Status", ""));
}
catch
{ }
if (numero > 0)
{
vettCooler[numero - 1].mCoolStatus.Value = status;
}
}
}
else if (statusData[i].varName.StartsWith("UnOp_"))
{
if (statusData[i].varName.EndsWith("_Status"))
{
try
{
numero = Convert.ToInt32(statusData[i].varName.Replace("UnOp_", "").Replace("_Status", ""));
}
catch
{ }
if (numero > 0)
{
vettUnOp[numero - 1].mUnOpStatus.Value = status;
}
}
}
}
}
#endregion
+7 -90
View File
@@ -1126,94 +1126,15 @@ namespace MTC_Adapter
private void getStatusDataFromPlc()
{
// recupero i dati di manutenzione dall'area di memoria IN BLOCCO
#if false
int memIndex = 14512;
int bitNum = 0;
int byteNum = 0;
byte byteVal;
int memIndex = 19426;
int numByte = 1 + (statusData.Length / 8);
byte[] tabDatiStatus = new byte[numByte];
inizio = DateTime.Now;
OsaiMemRW(R, FANUC.MemType.R, memIndex, ref tabDatiStatus);
OsaiMemRW_Byte(R, OSAI.MemTypeWord.MW_CODE, memIndex, 0, ref tabDatiStatus);
if (utils.CRB("recTime")) TimingData.addResult(string.Format("R{0}-DatiStatus", tabDatiStatus.Length), DateTime.Now.Subtract(inizio).Ticks);
// uno ad uno vado a inserirli nella mappa dei dati dell'adapter...
int numero = 0;
string status = "";
for (int i = 0; i < statusData.Length; i++)
{
numero = 0;
status = "";
// calcolo quale byte e quale bit devo leggere..
byteNum = i / 8;
bitNum = i - (8 * byteNum); // indice zero dei bit nel byte ( da cui -1 )
// faccio vera lettura
byteVal = tabDatiStatus[byteNum];
// leggo bit come ACTIVE/INACTIVE
if (((StFlag8)byteVal).HasFlag((StFlag8)Math.Pow(2, bitNum)))
{
status = "ACTIVE";
}
else
{
status = "INACTIVE";
}
if (statusData[i].varName == "PROTECTION_STATUS")
{
mProtectionStatus.Value = status;
}
else if (statusData[i].varName.StartsWith("VacPump_"))
{
if (statusData[i].varName.EndsWith("_Status"))
{
try
{
numero = Convert.ToInt32(statusData[i].varName.Replace("VacPump_", "").Replace("_Status", ""));
}
catch
{
}
if (numero > 0)
{
vettVacPump[numero - 1].mVacPumpStatus.Value = status;
}
}
}
else if (statusData[i].varName.StartsWith("Cooler_"))
{
if (statusData[i].varName.EndsWith("_Status"))
{
try
{
numero = Convert.ToInt32(statusData[i].varName.Replace("Cooler_", "").Replace("_Status", ""));
}
catch
{ }
if (numero > 0)
{
vettCooler[numero - 1].mCoolStatus.Value = status;
}
}
}
else if (statusData[i].varName.StartsWith("UnOp_"))
{
if (statusData[i].varName.EndsWith("_Status"))
{
try
{
numero = Convert.ToInt32(statusData[i].varName.Replace("UnOp_", "").Replace("_Status", ""));
}
catch
{ }
if (numero > 0)
{
vettUnOp[numero - 1].mUnOpStatus.Value = status;
}
}
}
}
#endif
// decodifico aree memoria secondo tab configurazione
processStatusData(tabDatiStatus, statusData);
}
/// <summary>
/// Leggo dati globali comuni (x path, assi...)
@@ -1361,8 +1282,6 @@ namespace MTC_Adapter
/// </summary>
private void loadStatusData()
{
// problema blocco file dati persistenti che diventa binario/illeggibile: cambiare metodo accesso file? using{}?!?
#if false
// carico dati x Maintenance
if (utils.CRB("verbose")) lg.Info("Inizio caricamento vettore variabili status gestite");
int totRighe = 0;
@@ -1372,7 +1291,7 @@ namespace MTC_Adapter
// creo un vettore della dimensione corretta... conta anche commenti tanto poi riduco...
statusData = new otherData[File.ReadLines(fileName).Count()];
// carica da file...
System.IO.StreamReader file = new System.IO.StreamReader(fileName);
StreamReader file = new StreamReader(fileName);
// leggo 1 linea alla volta...
int numRiga = 0;
while ((linea = file.ReadLine()) != null)
@@ -1380,8 +1299,7 @@ namespace MTC_Adapter
// SE non è un commento...
if (linea.Substring(0, 1) != "#")
{
//elencoAllarmi[rumRiga] = decodeAlarmLine(linea, ':');
statusData[numRiga] = decodeBitData(linea, utils.CRC("testCharSep"), "R", 14512, 1, numRiga);
statusData[numRiga] = decodeBitData(linea, utils.CRC("testCharSep"), "ML", 19426, 2, numRiga);
numRiga++;
}
}
@@ -1390,8 +1308,7 @@ namespace MTC_Adapter
// ora trimmo vettore al solo numero VERO dei valori caricati...
Array.Resize<otherData>(ref statusData, numRiga);
if (utils.CRB("verbose")) lg.Info(string.Format("Fine caricamento vettore di {0} variabili status gestite", numRiga));
#endif
if (utils.CRB("verbose")) lg.Info(string.Format("Fine caricamento vettore di {0} variabili status gestite", numRiga));
}
public override void processAlarm()