imbastito check status completo (allo stato attuale)

This commit is contained in:
Samuele E. Locatelli
2016-05-09 13:47:44 +02:00
parent c5262c34dd
commit 374dc674b9
7 changed files with 320 additions and 184 deletions
-34
View File
@@ -114,31 +114,6 @@
<DataItem category="CONDITION" id="Xsystem" type="SYSTEM"/>-->
</DataItems>
</Linear>
<DataItems>
<DataItem category="SAMPLE" id="Axis_04_PosAct" name="Pos asse I (4) actual" nativeUnits="DEGREE" subType="ACTUAL" type="ANGLE" units="DEGREE"/>
<DataItem category="SAMPLE" id="Axis_04_PosTgt" name="Pos asse I (4) target" nativeUnits="DEGREE" subType="COMMANDED" type="ANGLE" units="DEGREE"/>
<DataItem category="SAMPLE" id="Axis_04_Load" name="Load asse I (4)" nativeUnits="PERCENT" type="LOAD" units="PERCENT"/>
<DataItem category="EVENT" id="Axis_04_MainProc" type="MESSAGE"/>
<DataItem category="EVENT" id="Axis_04_IsMast" type="MESSAGE"/>
<DataItem category="EVENT" id="Axis_04_MastId" type="MESSAGE"/>
<DataItem category="EVENT" id="Axis_04_Dir" type="DIRECTION"/>
<DataItem category="SAMPLE" id="Axis_04_FeedAct" name="ROT SPEED Asse I (4)" subType="ACTUAL" type="ROTARY_VELOCITY" units="REVOLUTION/MINUTE"/>
<DataItem category="SAMPLE" id="Axis_04_FeedOver" name="ROT SPEED OVERRIDE Asse I (4)" subType="OVERRIDE" type="ROTARY_VELOCITY" nativeUnits="PERCENT" units="PERCENT"/>
<DataItem category="SAMPLE" id="Axis_04_AccelAct" name="Accelerazione angolare asse I (4)" nativeUnits="DEGREE/SECOND^2" type="ANGULAR_ACCELERATION" units="DEGREE/SECOND^2"/>
<DataItem category="SAMPLE" id="Axis_04_AccTime" name="Tempo impiego cumulato asse I (4)" nativeUnits="SECOND" type="ACCUMULATED_TIME" units="SECOND"/>
<DataItem category="SAMPLE" id="Axis_04_Battery" name="Valore batteria asse I (4)" nativeUnits="VOLT" type="VOLTAGE" units="VOLT"/>
<!--<DataItem category="EVENT" id="cm" name="Cmode" type="ROTARY_MODE">
<Constraints>
<Value>SPINDLE</Value>
<Value>INDEX</Value>
</Constraints>
</DataItem>
<DataItem category="CONDITION" id="Cloadc" type="LOAD"/>
<DataItem category="CONDITION" id="Csystem" type="SYSTEM"/>
<DataItem category="SAMPLE" id="cl3" name="Cload" nativeUnits="PERCENT" type="LOAD" units="PERCENT"/>-->
</DataItems>
</Rotary>
<Rotary id="Axis_04" name="Asse B">
<DataItems>
<DataItem category="SAMPLE" id="Axis_04_PosAct" name="Pos asse J (4) actual" nativeUnits="DEGREE" subType="ACTUAL" type="ANGLE" units="DEGREE"/>
@@ -191,15 +166,6 @@
<DataItem category="SAMPLE" id="cl3" name="Cload" nativeUnits="PERCENT" type="LOAD" units="PERCENT"/>-->
</DataItems>
</Rotary>
<!--<Linear id="z1" name="Z">
<DataItems>
<DataItem category="SAMPLE" id="z2" name="Zact" nativeUnits="MILLIMETER" subType="ACTUAL" type="POSITION" units="MILLIMETER"/>
<DataItem category="SAMPLE" id="z3" name="Zcom" nativeUnits="MILLIMETER" subType="COMMANDED" type="POSITION" units="MILLIMETER"/>
<DataItem category="SAMPLE" id="z4" name="Zload" nativeUnits="PERCENT" type="LOAD" units="PERCENT"/>
<DataItem category="CONDITION" id="Zloadc" type="LOAD"/>
<DataItem category="CONDITION" id="Zsystem" type="SYSTEM"/>
</DataItems>
</Linear>-->
</Components>
</Axes>
<Controller id="cn1" name="controller">
Binary file not shown.
+23 -37
View File
@@ -43,11 +43,6 @@ namespace MTC_Sim
// serve?!?
base.getCurrProgramData();
// recupero programma da FORM!!!
mProgram.Value = parentForm.datiProd.ProgramName;
mProgRowNum.Value = parentForm.datiProd.ProgrRow;
mPartId.Value = parentForm.datiProd.PartId;
mOperator.Value = parentForm.datiProd.Operator;
// recupero SEMPRE dati ulteriori: status ON/OFF, clock, ...
@@ -57,9 +52,9 @@ namespace MTC_Sim
mPower.Value = parentForm.datiProd.Power;
}
public override void getCurrMode()
public override void getStrobeStatus()
{
base.getCurrMode();
base.getStrobeStatus();
// controllo bool allarmi...
if (parentForm.datiProd.EmrStop)
@@ -70,13 +65,7 @@ namespace MTC_Sim
{
mEStop.Value = "ARMED";
}
// imposto RUN mode
mMode.Value = parentForm.datiProd.RunMode;
// imposto EXE mode
mExec.Value = parentForm.datiProd.ExeMode;
// imposto func mode...
mFunctionalMode.Value = parentForm.datiProd.FuncMode;
@@ -106,9 +95,9 @@ namespace MTC_Sim
mAlarmGeneral.Add(Condition.Level.FAULT, string.Format("ERR_{0:###}: Errore {1}", allarme.Key, allarme.Value), string.Format("ERR_{0:###}_{1}", allarme.Key, allarme.Value));
}
public override void getAlarms()
public override void processStrobe()
{
base.getAlarms();
base.processStrobe();
if (parentForm.systemAlarm.Count > 0)
{
@@ -156,6 +145,23 @@ namespace MTC_Sim
vettPath[PtData.PathSel].mPathPosActI.Value = PtData.PathPosAct.i;
vettPath[PtData.PathSel].mPathPosActJ.Value = PtData.PathPosAct.j;
vettPath[PtData.PathSel].mPathPosActK.Value = PtData.PathPosAct.k;
// aggiunta x revisione 2016.05.05
vettPath[PtData.PathSel].mPathType.Value = PtData.PathType;
vettPath[PtData.PathSel].mPathPartId.Value = PtData.PartId;
vettPath[PtData.PathSel].mPathPartCount.Value = PtData.pzTot;
#if false
vettPath[PtData.PathSel].mPathCodM.Value = PtData.co;
vettPath[PtData.PathSel].mPathCodS.Value = PtData.PathType;
vettPath[PtData.PathSel].mPathCodT.Value = PtData.PathType;
#endif
vettPath[PtData.PathSel].mPathRunMode.Value = PtData.RunMode;
vettPath[PtData.PathSel].mPathExeMode.Value = PtData.ExeMode;
vettPath[PtData.PathSel].mPathCurrProg.Value = PtData.ProgramName;
vettPath[PtData.PathSel].mPathCurrProgRowNum.Value = PtData.ProgrRow;
vettPath[PtData.PathSel].mPathActiveAxes.Value = PtData.ActiveAxes;
}
}
@@ -198,26 +204,6 @@ namespace MTC_Sim
vettAxis[AxData.AxisSel].mAxBattery.Value = AxData.AxisBattery;
}
}
/// <summary>
/// Recupero dati da form...
/// </summary>
public override int getNumPzKo
{
get
{
return parentForm.datiProd.pzKo;
}
}
/// <summary>
/// Recupero dati da form...
/// </summary>
public override int getNumPzOk
{
get
{
return parentForm.datiProd.pzOk;
}
}
}
}
+122 -3
View File
@@ -28,11 +28,130 @@ namespace MTC_Sim
string szStatusConnection = "";
FANUC_ref.Connect(ref szStatusConnection);
}
/// <summary>
/// Effettuo lettura dei 16 byte di strobe/status
/// </summary>
public override void getStrobeStatus()
{
base.getStrobeStatus();
// se non sono connesso esco
if (!FANUC_ref.Connected) return;
//CMSCncLib.App.Runtime.CreateRuntime();
// hard coded: leggo 16 word R10516--> R10532
FANUC_ref.F_RW_Byte(R, FANUC.MemType.R, 10516, ref Strobes);
}
/// <summary>
/// processing strobe!
/// </summary>
public override void processStrobe()
{
}
/// <summary>
/// processing strobe degli allarmi
/// </summary>
public override void processAlarm()
{
base.processAlarm();
// controllo TUTTI i flag: se ce ne sono di alzati DEVO processare...
}
/// <summary>
/// processing!
/// </summary>
public override void processStatus()
{
base.processStrobe();
//Runtime.NC.Initialize();
//Config.Settings.Settings.TypeNC = CNC.NcType.FANUC;
// update status da DW3
// EMstop: verifico BIT e di conseguenza imposto
if(STRB_DW3.HasFlag(StFlag32.B00))
{
mEStop.Value = "TRIGGERED";
}
else
{
mEStop.Value = "ARMED";
}
// HARD CODE: forzo path 1 (indice 0...)
int idxPath = 0;
// switch su run mode...
switch (STRB_DW3)
{
case StFlag32.B01:
vettPath[idxPath].mPathRunMode.Value = "AUTO";
break;
case StFlag32.B02:
vettPath[idxPath].mPathRunMode.Value = "EDIT";
break;
case StFlag32.B03:
vettPath[idxPath].mPathRunMode.Value = "MDI";
break;
case StFlag32.B04:
vettPath[idxPath].mPathRunMode.Value = "REF";
break;
case StFlag32.B05:
vettPath[idxPath].mPathRunMode.Value = "JOG";
break;
case StFlag32.B06:
vettPath[idxPath].mPathRunMode.Value = "JOGINC";
break;
case StFlag32.B07:
vettPath[idxPath].mPathRunMode.Value = "HANDLE";
break;
}
// switch su EXE mode...
switch (STRB_DW3)
{
case StFlag32.B08:
vettPath[idxPath].mPathExeMode.Value = "RUN";
break;
case StFlag32.B09:
vettPath[idxPath].mPathExeMode.Value = "READY";
break;
case StFlag32.B10:
vettPath[idxPath].mPathExeMode.Value = "HOLD";
break;
case StFlag32.B11:
vettPath[idxPath].mPathExeMode.Value = "FEEDHOLD";
break;
}
// verifico tipo path...
if (STRB_DW3.HasFlag(StFlag32.B12))
{
vettPath[idxPath].mPathType.Value = "LAVORO";
}
else
{
vettPath[idxPath].mPathType.Value = "ASSERV";
}
#if false
// IPOTESI DA VERIFICARE!!!
// leggo primo byte, i cui bit indicano run mode (3450.0 --> 3450.7)
RunStatus = (StFlag8)status[0];
// leggo primo byte, i cui bit indicano run mode (3451.0 --> 3451.7)
ExeStatus = (StFlag8)status[1];
// se devo prendere sotto insiemi di byte --> BitConverter
//BitConverter.ToUInt32
// check bit 0... SE è presente
Status8.Has(StFlag8.B0);
// check bit 0... SE è SOLO QUELLO
Status8.Is(StFlag8.B0);
// check bit 18...
Status8.Has(StFlag32.B18);
#endif
}
public override void getCurrProgramData()
+173 -109
View File
@@ -479,6 +479,7 @@ namespace MTC_Sim
public bool R = false;
public bool W = true;
protected bool adpRunning;
/// <summary>
/// adapter globale
@@ -489,6 +490,95 @@ namespace MTC_Sim
#region altri oggetti
// 16 bit di strobe (4 word da 32 bit di flags...)
public byte[] Strobes = new byte[16];
// 16 bit di strobe in risposta (4 word da 32 bit di flags...)
public byte[] Acknowl = new byte[16];
/// <summary>
/// Prima word di strobe da array flag completo
/// </summary>
public StFlag32 STRB_DW0
{
get
{
//byte[] answ = new byte[4];
//answ = (byte[])Strobes.Skip(0).Take(4);
return (StFlag32)BitConverter.ToUInt32(Strobes, 0);
}
}
/// <summary>
/// Seconda word di strobe da array flag completo
/// </summary>
public StFlag32 STRB_DW1
{
get
{
return (StFlag32)BitConverter.ToUInt32(Strobes, 4);
}
}
/// <summary>
/// Terza word di strobe da array flag completo
/// </summary>
public StFlag32 STRB_DW2
{
get
{
return (StFlag32)BitConverter.ToUInt32(Strobes, 8);
}
}
/// <summary>
/// Quarta word di strobe da array flag completo
/// </summary>
public StFlag32 STRB_DW3
{
get
{
return (StFlag32)BitConverter.ToUInt32(Strobes, 12);
}
}
/// <summary>
/// Prima word di ACKnowledgment da array flag completo
/// </summary>
public StFlag32 ACK_DW0
{
get
{
return (StFlag32)BitConverter.ToUInt32(Acknowl, 0);
}
}
/// <summary>
/// Seconda word di ACKnowledgment da array flag completo
/// </summary>
public StFlag32 ACK_DW1
{
get
{
return (StFlag32)BitConverter.ToUInt32(Acknowl, 4);
}
}
/// <summary>
/// Terza word di ACKnowledgment da array flag completo
/// </summary>
public StFlag32 ACK_DW2
{
get
{
return (StFlag32)BitConverter.ToUInt32(Acknowl, 8);
}
}
/// <summary>
/// Quarta word di ACKnowledgment da array flag completo
/// </summary>
public StFlag32 ACK_DW3
{
get
{
return (StFlag32)BitConverter.ToUInt32(Acknowl, 12);
}
}
#if true
/// <summary>
/// Strobe mask PLC
/// </summary>
@@ -504,7 +594,8 @@ namespace MTC_Sim
/// <summary>
/// Variabili stato macchina principali
/// </summary>
public StFlag8 ST_MACCH = 0;
public StFlag8 ST_MACCH = 0;
#endif
public List<string> codaM = new List<string>();
@@ -544,58 +635,6 @@ namespace MTC_Sim
/// </summary>
public Event mOperator = new Event("OperatorId");
#if true
/// <summary>
/// CURR_PROG - programma in esecuzione
/// </summary>
public Event mProgram = new Event("CurrProg");
/// <summary>
/// CURR_PROG_ROWNUM - programma in esecuzione
/// </summary>
public Event mProgRowNum = new Event("CurrProg_RowNum");
/// <summary>
/// PartId - particolare prodotto
/// </summary>
public Event mPartId = new Event("PartID");
/// <summary>
/// D.D1.P1.RUN_MODE - modalità esecuzione
/// </summary>
public Event mMode = new Event("RUN_MODE");
/// <summary>
/// D.D1.P1.PATH_STATUS - status macchina
/// </summary>
public Event mExec = new Event("EXECUTION");
/// <summary>
/// M_CODE
/// </summary>
public Event mCod_M = new Event("Cod_M");
/// <summary>
/// S_CODE
/// </summary>
public Event mCod_S = new Event("Cod_S");
/// <summary>
/// T_CODE
/// </summary>
public Event mCod_T = new Event("Cod_T");
/// <summary>
/// Pezzi totali
/// </summary>
public Event mPz_Tot = new Event("PZ_TOT");
/// <summary>
/// Pezzi OK
/// </summary>
public Event mPz_Ok = new Event("PZ_OK");
/// <summary>
/// Pezzi KO
/// </summary>
public Event mPz_Ko = new Event("PZ_KO");
#endif
/// <summary>
/// modalità funzionale
/// </summary>
@@ -660,22 +699,9 @@ namespace MTC_Sim
mAdapter.AddDataItem(mEStop);
// programma e produzione
mAdapter.AddDataItem(mProgram);
mAdapter.AddDataItem(mProgRowNum);
mAdapter.AddDataItem(mPartId);
mAdapter.AddDataItem(mPz_Tot);
mAdapter.AddDataItem(mPz_Ok);
mAdapter.AddDataItem(mPz_Ko);
mAdapter.AddDataItem(mOperator);
// codici speciali M/S/T
mAdapter.AddDataItem(mCod_M);
mAdapter.AddDataItem(mCod_S);
mAdapter.AddDataItem(mCod_T);
// modalità esecutiva e funzionale
mAdapter.AddDataItem(mMode);
mAdapter.AddDataItem(mExec);
mAdapter.AddDataItem(mFunctionalMode);
// Pompe vuoto
@@ -731,7 +757,6 @@ namespace MTC_Sim
for (int i = 0; i < adpConf.nPath; i++)
{
vettPath[i] = new Path(adpConf.Path[i]);
//mAdapter.AddDataItem(vettPath[i].mPathAlias);
mAdapter.AddDataItem(vettPath[i].mPathFeed);
mAdapter.AddDataItem(vettPath[i].mPathFeedOver);
mAdapter.AddDataItem(vettPath[i].mPathRapidOver);
@@ -741,6 +766,18 @@ namespace MTC_Sim
mAdapter.AddDataItem(vettPath[i].mPathPosActI);
mAdapter.AddDataItem(vettPath[i].mPathPosActJ);
mAdapter.AddDataItem(vettPath[i].mPathPosActK);
// aggiunta x revisione 2016.05.05
mAdapter.AddDataItem(vettPath[i].mPathType);
mAdapter.AddDataItem(vettPath[i].mPathPartId);
mAdapter.AddDataItem(vettPath[i].mPathPartCount);
mAdapter.AddDataItem(vettPath[i].mPathCodM);
mAdapter.AddDataItem(vettPath[i].mPathCodS);
mAdapter.AddDataItem(vettPath[i].mPathCodT);
mAdapter.AddDataItem(vettPath[i].mPathRunMode);
mAdapter.AddDataItem(vettPath[i].mPathExeMode);
mAdapter.AddDataItem(vettPath[i].mPathCurrProg);
mAdapter.AddDataItem(vettPath[i].mPathCurrProgRowNum);
mAdapter.AddDataItem(vettPath[i].mPathActiveAxes);
}
// UnOp
vettUnOp = new UnOp[adpConf.nUnOp];
@@ -803,6 +840,8 @@ namespace MTC_Sim
mAdapter.Port = port;
mAdapter.Start();
// resetto running flag...
adpRunning = false;
mAlarmSystem.Normal();
mAlarmCNC.Normal();
@@ -826,47 +865,55 @@ namespace MTC_Sim
/// <param name="ciclo"></param>
public void gaterAndSend(gatherCycle ciclo)
{
// avvio fase raccolta dati
mAdapter.Begin();
// parte che eseguo SEMPRE: strobe/status
// dati stato macchina (allarmi, modalità RUN/EXEC, ...)
getCurrMode();
// gestione allarmi
getAlarms();
if (ciclo == gatherCycle.HF)
// controllo non sia già in esecuzione...
if (!adpRunning)
{
adpRunning = true;
// gestisco strobe...
// avvio fase raccolta dati
mAdapter.Begin();
// di conseguenza leggo valori variati
// parte che eseguo SEMPRE: RECUPERO stato di tutti gli strobe/status
getStrobeStatus();
// fix codici M/S/T
getCodMST();
// acquisizione degli status
processStatus();
// processing degli strobes di allarme
processAlarm();
// processing condizionale x parti non sempre valutate, 3 cicli a frequenza decrescente (HF/MF/LF)
if (ciclo == gatherCycle.HF)
{
// processo strobe restanti (non allarmi)
processStrobe();
// fix codici M/S/T
getCodMST();
}
else if (ciclo == gatherCycle.MF)
{
// leggo parametri a media freq (path, assi)
getPath();
getUnOp();
getAxis();
}
else
{
// leggo parametri da config file
getConfigParam();
// bassa freq leggo altri valori...
getProduzione();
///acquisisco dati su programma in esecuzione e dati generali (stato, orologio, power...)
getCurrProgramData();
}
// INVIO dati variati!
mAdapter.SendChanged();
// tolgo flag running
adpRunning = false;
}
else if (ciclo == gatherCycle.MF)
{
// leggo parametri a media freq (path, assi)
getPath();
getUnOp();
getAxis();
}
else
{
// leggo parametri da config file
getConfigParam();
// bassa freq leggo altri valori...
getProduzione();
///acquisisco dati su programma in esecuzione e dati generali (stato, orologio, power...)
getCurrProgramData();
}
// INVIO dati variati!
mAdapter.SendChanged();
}
/// <summary>
@@ -899,9 +946,23 @@ namespace MTC_Sim
}
/// <summary>
/// recupero allarmi
/// verifica gli status attivi
/// </summary>
public virtual void getAlarms()
public virtual void processStatus()
{
// da gestire su ogni adapter...
}
/// <summary>
/// processo tutti gli strobe attivi
/// </summary>
public virtual void processStrobe()
{
// da gestire su ogni adapter...
}
/// <summary>
/// processo gli strobe degli allarmi
/// </summary>
public virtual void processAlarm()
{
// da gestire su ogni adapter...
}
@@ -932,11 +993,11 @@ namespace MTC_Sim
// da gestire su ogni adapter...
}
/// <summary>
/// dati relativi al RUN mode
/// recupero iniziale di TUTTI gli strobes/status attivi
/// </summary>
public virtual void getCurrMode()
public virtual void getStrobeStatus()
{
// da gestire su ogni adapter...
// da gestire su ogni adapter... legge tutto array STROBE!!!
}
#endregion
@@ -1034,6 +1095,8 @@ namespace MTC_Sim
public void checkProd()
{
// non usiamo strobe x produzione...b
#if false
if (utils.IsSetAny(STROBE_PLC, Strobe.PZ_OK | Strobe.PZ_KO))
{
// leggo i valori pezzi OK / KO e li salvo (insieme a tot...)
@@ -1050,7 +1113,8 @@ namespace MTC_Sim
// resetto eventuali flag di lettura...
if (utils.IsSetAll(STROBE_ADP, Strobe.PZ_OK)) STROBE_ADP -= Strobe.PZ_OK;
if (utils.IsSetAll(STROBE_ADP, Strobe.PZ_KO)) STROBE_ADP -= Strobe.PZ_KO;
}
}
#endif
}
/// <summary>
/// recupera pezzi OK (fare override!)
+1 -1
View File
@@ -851,7 +851,7 @@ namespace MTC_Sim
else if (stopped.Checked) answ.ExeMode = "STOPPED";
else if (ready.Checked) answ.ExeMode = "READY";
answ.ActiveAxes = "1 2 3 4 5 6"; // lascio sempre tutti attivi...
answ.PathSel = cbPathSel.SelectedIndex;
// FEED/SPEED
+1
View File
@@ -189,6 +189,7 @@ namespace MTC_Sim
public string ProgramName;
public string ProgrRow;
public string PartId;
public string ActiveAxes;
public int PathFeedrate;
public int PathFeedrateOver;