Mitsubishi

- lerttura VAR da verificare (NON tiene Art/Comm)
This commit is contained in:
Samuele Locatelli
2024-11-19 19:18:28 +01:00
parent e52c25f6aa
commit 0ccecfbaa3
4 changed files with 217 additions and 153 deletions
+1 -4
View File
@@ -55,10 +55,7 @@ BLINK_FILT=0
[OPTPAR]
EZNC_SYS=EZNC_SYS_MELDAS700L
ENABLE_PZCOUNT=TRUE
;PZCOUNT_MODE=STD|BIT
;PZCOUNT_MODE=STD.PAR.6711
;PZGTOT_MODE=STD.PAR.6712
;;PZREQ_MODE=STD.PAR.6713
ENABLE_DYN_DATA=TRUE
PZCOUNT_MODE=STD.PAR.8002
PZGTOT_MODE=STD.PAR.8001
PZREQ_MODE=STD.PAR.8003
+31 -9
View File
@@ -3,7 +3,7 @@
"setArt": {
"name": "setArt",
"description": "Articolo",
"memAddr": "NONE.01",
"memAddr": "",
"tipoMem": "String",
"index": 0,
"size": 20,
@@ -12,29 +12,29 @@
"setArtNum": {
"name": "setArtNum",
"description": "# Num Articolo",
"memAddr": "MACRO.966",
"memAddr": "VAR.501",
"tipoMem": "Int",
"index": 966,
"size": 4,
"displOrdinal": 1
"displOrdinal": 2
},
"setComm": {
"name": "setComm",
"description": "Commessa",
"memAddr": "NONE.02",
"memAddr": "",
"tipoMem": "String",
"index": 0,
"size": 20,
"displOrdinal": 2
"displOrdinal": 3
},
"setCommNum": {
"name": "setCommNum",
"description": "# NumCommessa",
"memAddr": "MACRO.965",
"memAddr": "VAR.500",
"tipoMem": "Int",
"index": 965,
"size": 4,
"displOrdinal": 2
"displOrdinal": 4
},
"setPzComm": {
"name": "setPzComm",
@@ -43,7 +43,16 @@
"tipoMem": "Int",
"index": 8003,
"size": 4,
"displOrdinal": 3
"displOrdinal": 5
},
"setPzCommOdl": {
"name": "setPzCommOdl",
"description": "Qta ODL",
"memAddr": "VAR.502",
"tipoMem": "Int",
"index": 502,
"size": 4,
"displOrdinal": 6
}
},
"mMapRead": {
@@ -82,10 +91,23 @@
"period": 60,
"factor": 1,
"displOrdinal": 9
},
"DYNDATA": {
"name": "DYNDATA",
"description": "DynData check",
"memAddr": "",
"tipoMem": "String",
"index": 0,
"size": 4,
"func": "POINT",
"period": 60,
"factor": 1,
"displOrdinal": 20
}
},
"mMapWriteLink": {
"setArt": "setArtNum",
"setComm": "setCommNum"
"setComm": "setCommNum",
"setPzComm": "setPzCommOdl"
}
}
+182 -137
View File
@@ -400,50 +400,75 @@ namespace IOB_WIN_NEXT.Iob
// processo SOLO SE connected...
if (connectionOk)
{
#if false
if (MITSUBISHI_ref.Connected)
{
stopwatch.Restart();
EgwProxy.MultiCncLib.Focas1.ODBDY2_1 answ = MITSUBISHI_ref.getAllDynData();
if (utils.CRB("recTime"))
{
TimingData.addResult(cIobConf.codIOB, string.Format("PROC-DYN-DATA"), stopwatch.ElapsedTicks);
}
// leggo i valori Var
ReadMitsubVars();
try
// cerco tra tutte le aree write le VARS...
foreach (var item in memMap.mMapWrite)
{
if(item.Value.memAddr.StartsWith("VAR"))
{
string actf = answ.actf.ToString();
string acts = answ.acts.ToString();
//string numAlarm = memName.alarm.ToString();
// preparo i singoli valori dell'array...
//outVal.Add("DYNDATA", string.Format("{0}#{1}#{2}", actf, acts, numAlarm));
outVal.Add("DYNDATA", string.Format("FEED {0}#SPEED_RPM {1}", actf, acts));
if (utils.CRB("SendFeedSpeed"))
// certo in dict ed accodo...
int iVar = 0;
string sVar = item.Value.memAddr.Replace("VAR.", "");
int.TryParse(sVar, out iVar);
if(iVar>0)
{
outVal.Add("FEED", actf);
outVal.Add("SPEED_RPM", acts);
//outVal.Add("NUM_ALARM", numAlarm);
}
if (utils.CRB("SendAxPos"))
{
// salvo le posizioni...
EgwProxy.MultiCncLib.Focas1.FAXIS posAx = answ.pos;
int[] currPosAbs = posAx.absolute;
int i = 0;
foreach (var item in currPosAbs)
// cerco in dizionario...
if(DictVar.ContainsKey(iVar))
{
i++;
outVal.Add(string.Format("POS_{0:00}", i), item.ToString());
outVal.Add(item.Key, $"{DictVar[iVar]}");
upsertKey(item.Key, $"{DictVar[iVar]}");
}
}
}
catch (Exception exc)
{
lgError(exc, "Errore in getDynData");
}
stopwatch.Stop();
}
#endif
// cerco tra tutte le aree read le VARS...
foreach (var item in memMap.mMapRead)
{
if (item.Value.memAddr.StartsWith("VAR"))
{
// certo in dict ed accodo...
int iVar = 0;
string sVar = item.Value.memAddr.Replace("VAR.", "");
int.TryParse(sVar, out iVar);
if (iVar > 0)
{
// cerco in dizionario...
if (DictVar.ContainsKey(iVar))
{
outVal.Add(item.Key, $"{DictVar[iVar]}");
upsertKey(item.Key, $"{DictVar[iVar]}");
}
}
}
}
// aggiungo DynData... calcolato come variazione pezzi e lampade...
if (outVal.ContainsKey("DYNDATA"))
{
outVal.Remove("DYNDATA");
}
StringBuilder sb = new StringBuilder();
// inserisco i segnali
sb.Append("SIGN_[");
foreach (var item in DictSign)
{
sb.Append($"{item.Key}:{item.Value}|");
}
// inserisco parametri
sb.Append("]_PAR_[");
foreach (var item in DictParam)
{
sb.Append($"{item.Key}:{item.Value}|");
}
// inserisco le variabili
sb.Append("]_VAR_[");
foreach (var item in outVal)
{
sb.Append($"{item.Value},");
}
sb.Append("]");
outVal.Add("DYNDATA", sb.ToString());
}
return outVal;
}
@@ -687,26 +712,7 @@ namespace IOB_WIN_NEXT.Iob
}
currDispData.semIn = Semaforo.SV;
// in primis: leggo i valor in sequenza e salvo in dizionario...
object pvRead = "bbb";
// sezione segnali: cablata 53...
int sec = 53;
// Start da Y60 (Hex) --> 10000+96
for (int i = SignStart; i < SignStart + SignSize; i++)
{
oEZNcAutCom.Generic_ReadData(0, sec, i, ref pvRead);
UpsertSign(i, $"{pvRead}");
if (verboseLog)
{
lgTrace($"Sign | {i} : {pvRead}");
}
}
// recording tempi
if (utils.CRB("recTime"))
{
TimingData.addResult(cIobConf.codIOB, $"Sign{SignSize}-R", stopwatch.ElapsedTicks);
}
stopwatch.Stop();
ReadMitsubGenData();
// salvo il solo BYTE dell'input decifrando il semaforo...
decodeToBitmap();
reportRawInput(ref currDispData);
@@ -843,41 +849,6 @@ namespace IOB_WIN_NEXT.Iob
return answ;
}
/// <summary>
/// Override salvataggio valori in memoria...
/// </summary>
/// <param name="tipo">tipo di DUMP</param>
public override void saveMemDump(dumpType tipo)
{
#if false
// se l'area ha una size > 0...
if (areaD.arraySize > 0)
{
dump_MemArea(tipo, MITSUBISHI.MemType.D, areaD.startIdx, areaD.arraySize);
}
// se l'area ha una size > 0...
if (areaR.arraySize > 0)
{
dump_MemArea(tipo, MITSUBISHI.MemType.R, areaR.startIdx, areaR.arraySize);
}
// se l'area ha una size > 0...
if (areaX.arraySize > 0)
{
dump_MemArea(tipo, MITSUBISHI.MemType.X, areaX.startIdx, areaX.arraySize);
}
// se l'area ha una size > 0...
if (areaY.arraySize > 0)
{
dump_MemArea(tipo, MITSUBISHI.MemType.Y, areaY.startIdx, areaY.arraySize);
}
// se l'area ha una size > 0...
if (areaPAR.arraySize > 0)
{
dump_ParArea(tipo, areaPAR.startIdx, areaPAR.arraySize);
}
#endif
}
/// <summary>
/// Effettua impostazione del valore numerico ARTICOLO (specifico MITSUBISHI)
/// </summary>
@@ -1163,6 +1134,7 @@ namespace IOB_WIN_NEXT.Iob
// Open communication
int iRet = 0;
oEZNcAutCom = new EZNCAUTLib.DispEZNcCommunication();
iRet = oEZNcAutCom.SetTCPIPProtocol(ipAddr, ezPort);
iRet = oEZNcAutCom.Open3((int)sysType, 1, 10, hostName);
parentForm.commPlcActive = false;
@@ -1244,53 +1216,8 @@ namespace IOB_WIN_NEXT.Iob
#endregion Public Methods
#region Internal Fields
/// <summary>
/// LookUpTable di decodifica da CNC a segnali tipo bitmap MAPO
/// </summary>
internal Dictionary<string, string> signLUT = new Dictionary<string, string>();
#endregion Internal Fields
#region Internal Enums
internal enum MemType
{
/// <summary>
/// Valori generico (es Y60 )x60, hex) --&gt; 10'000 + 96 = 10'096
/// </summary>
GenData,
/// <summary>
/// Parametri #
/// </summary>
Param,
/// <summary>
/// Var100
/// </summary>
Var100,
/// <summary>
/// Var500
/// </summary>
Var500
}
internal enum PROGRAMTYPE
{
/// <summary>
/// Main Program メインプログラム
/// </summary>
EZNC_MAINPRG = 0,
/// <summary>
/// Sub Program サブプログラム
/// </summary>
EZNC_SUBPRG = 1,
}
/// <summary>
/// Controllo specifico da gestire
/// </summary>
@@ -1381,7 +1308,9 @@ namespace IOB_WIN_NEXT.Iob
#region Private Fields
private DateTime lastParRefr = DateTime.Now;
private DateTime lastSigRefr = DateTime.Now;
private DateTime lastVarRefr = DateTime.Now;
/// <summary>
@@ -1409,6 +1338,11 @@ namespace IOB_WIN_NEXT.Iob
/// </summary>
private int ParamStart = 8000;
/// <summary>
/// LookUpTable di decodifica da CNC a segnali tipo bitmap MAPO
/// </summary>
private Dictionary<string, string> signLUT = new Dictionary<string, string>();
/// <summary>
/// Num celle Signal da leggere
/// </summary>
@@ -1426,6 +1360,26 @@ namespace IOB_WIN_NEXT.Iob
#endregion Private Fields
#region Private Enums
/// <summary>
/// Tipo program
/// </summary>
private enum PROGRAMTYPE
{
/// <summary>
/// Main Program メインプログラム
/// </summary>
EZNC_MAINPRG = 0,
/// <summary>
/// Sub Program サブプログラム
/// </summary>
EZNC_SUBPRG = 1,
}
#endregion Private Enums
#region Private Properties
/// <summary>
@@ -1441,7 +1395,7 @@ namespace IOB_WIN_NEXT.Iob
/// <summary>
/// Dictionary contenuto memorie Var
/// </summary>
private Dictionary<int, string> DictVar { get; set; } = new Dictionary<int, string>();
private Dictionary<int, double> DictVar { get; set; } = new Dictionary<int, double>();
private string memAddrArt
{
@@ -2022,6 +1976,45 @@ namespace IOB_WIN_NEXT.Iob
return answ;
}
/// <summary>
/// Lettura dati generici (es var Y)
/// </summary>
private void ReadMitsubGenData()
{
DateTime adesso = DateTime.Now;
int parSPeriod = samplePeriod;
// controllo se sia passato il samplePeriod minimo...
if (adesso.Subtract(lastSigRefr.AddMilliseconds(parSPeriod)).TotalSeconds > 0)
{
lastSigRefr = adesso;
stopwatch.Restart();
// in primis: leggo i valor in sequenza e salvo in dizionario...
object pvRead = "bbb";
// sezione segnali: cablata 53...
int sec = 53;
// Start da Y60 (Hex) --> 10000+96
for (int i = SignStart; i < SignStart + SignSize; i++)
{
oEZNcAutCom.Generic_ReadData(0, sec, i, ref pvRead);
UpsertSign(i, $"{pvRead}");
if (verboseLog)
{
lgTrace($"Sign | {i} : {pvRead}");
}
}
// recording tempi
if (utils.CRB("recTime"))
{
TimingData.addResult(cIobConf.codIOB, $"Sign{SignSize}-R", stopwatch.ElapsedTicks);
}
stopwatch.Stop();
}
else
{
lgTrace($"Saltata ReadMitsubGenData x periodo minimo {parSPeriod} ms");
}
}
/// <summary>
/// Lettura area parametri mitsubishi come configurato
/// </summary>
@@ -2056,6 +2049,41 @@ namespace IOB_WIN_NEXT.Iob
}
}
/// <summary>
/// Lettura area Var100/Var500 mitsubishi come configurato
/// </summary>
private void ReadMitsubVars()
{
DateTime adesso = DateTime.Now;
int parSPeriod = samplePeriod * 5;
// controllo se sia passato il samplePeriod minimo...
if (adesso.Subtract(lastVarRefr.AddMilliseconds(parSPeriod)).TotalSeconds > 0)
{
lastVarRefr = adesso;
// per prima cosa processo la lettura Variabili e li salvo in DICT
double pData = 0;
int pType = 0;
stopwatch.Restart();
for (int i = MemVarStart; i < MemVarStart + MemVarSize; i++)
{
oEZNcAutCom.CommonVariable_Read2(i, out pData, out pType);
UpsertVar(i, pData);
if (verboseLog)
{
lgTrace($"Var | {i} : {pData}");
}
}
if (utils.CRB("recTime"))
{
TimingData.addResult(cIobConf.codIOB, $"R{MemVarSize}-VAR", stopwatch.ElapsedTicks);
}
}
else
{
lgTrace($"Saltata ReadMitsubVars x periodo minimo {parSPeriod} ms");
}
}
/// <summary>
/// Upsert info in DICT dei Params (es 8001..8003 contatori pezzi)
/// </summary>
@@ -2090,6 +2118,23 @@ namespace IOB_WIN_NEXT.Iob
}
}
/// <summary>
/// Upsert info in DICT dei VAR (es Var100, Var500)
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
private void UpsertVar(int key, double value)
{
if (DictVar.ContainsKey(key))
{
DictVar[key] = value;
}
else
{
DictVar.Add(key, value);
}
}
#endregion Private Methods
}
}
+3 -3
View File
@@ -146,9 +146,9 @@ namespace Mitsubishi
oEZNcAutCom.CommonVariable_SetName(502, "NumPz");
oEZNcAutCom.CommonVariable_SetName(503, "");
oEZNcAutCom.CommonVariable_Write2(500, 104, 1);
oEZNcAutCom.CommonVariable_Write2(501, 204, 1);
oEZNcAutCom.CommonVariable_Write2(502, 304, 1);
oEZNcAutCom.CommonVariable_Write2(500, 105, 1);
oEZNcAutCom.CommonVariable_Write2(501, 205, 1);
oEZNcAutCom.CommonVariable_Write2(502, 305, 1);
oEZNcAutCom.CommonVariable_Write2(503, 0, 1);
DoLog("CommonVariable 500..503 Write Done!");
DoLog(sep);