diff --git a/AgentBin/simulator/CMS_DEMO.xml b/AgentBin/simulator/CMS_DEMO.xml
index e220017..0fb9166 100644
--- a/AgentBin/simulator/CMS_DEMO.xml
+++ b/AgentBin/simulator/CMS_DEMO.xml
@@ -114,31 +114,6 @@
-->
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -191,15 +166,6 @@
-->
-
diff --git a/MTC_Sim/.vs/MTC_Sim/v14/.suo b/MTC_Sim/.vs/MTC_Sim/v14/.suo
index acdb068..7f81c4d 100644
Binary files a/MTC_Sim/.vs/MTC_Sim/v14/.suo and b/MTC_Sim/.vs/MTC_Sim/v14/.suo differ
diff --git a/MTC_Sim/MTC_Sim/AdapterDemo.cs b/MTC_Sim/MTC_Sim/AdapterDemo.cs
index 577db86..141350c 100644
--- a/MTC_Sim/MTC_Sim/AdapterDemo.cs
+++ b/MTC_Sim/MTC_Sim/AdapterDemo.cs
@@ -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;
}
}
-
- ///
- /// Recupero dati da form...
- ///
- public override int getNumPzKo
- {
- get
- {
- return parentForm.datiProd.pzKo;
- }
- }
- ///
- /// Recupero dati da form...
- ///
- public override int getNumPzOk
- {
- get
- {
- return parentForm.datiProd.pzOk;
- }
- }
+
}
}
diff --git a/MTC_Sim/MTC_Sim/AdapterFanuc.cs b/MTC_Sim/MTC_Sim/AdapterFanuc.cs
index a3be696..a72df5d 100644
--- a/MTC_Sim/MTC_Sim/AdapterFanuc.cs
+++ b/MTC_Sim/MTC_Sim/AdapterFanuc.cs
@@ -28,11 +28,130 @@ namespace MTC_Sim
string szStatusConnection = "";
FANUC_ref.Connect(ref szStatusConnection);
+
+ }
+ ///
+ /// Effettuo lettura dei 16 byte di strobe/status
+ ///
+ 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);
+ }
+ ///
+ /// processing strobe!
+ ///
+ public override void processStrobe()
+ {
+ }
+ ///
+ /// processing strobe degli allarmi
+ ///
+ public override void processAlarm()
+ {
+ base.processAlarm();
+ // controllo TUTTI i flag: se ce ne sono di alzati DEVO processare...
+ }
+ ///
+ /// processing!
+ ///
+ 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()
diff --git a/MTC_Sim/MTC_Sim/AdapterGeneric.cs b/MTC_Sim/MTC_Sim/AdapterGeneric.cs
index d891cb3..c6a7e6e 100644
--- a/MTC_Sim/MTC_Sim/AdapterGeneric.cs
+++ b/MTC_Sim/MTC_Sim/AdapterGeneric.cs
@@ -479,6 +479,7 @@ namespace MTC_Sim
public bool R = false;
public bool W = true;
+ protected bool adpRunning;
///
/// 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];
+
+ ///
+ /// Prima word di strobe da array flag completo
+ ///
+ public StFlag32 STRB_DW0
+ {
+ get
+ {
+ //byte[] answ = new byte[4];
+ //answ = (byte[])Strobes.Skip(0).Take(4);
+ return (StFlag32)BitConverter.ToUInt32(Strobes, 0);
+ }
+ }
+ ///
+ /// Seconda word di strobe da array flag completo
+ ///
+ public StFlag32 STRB_DW1
+ {
+ get
+ {
+ return (StFlag32)BitConverter.ToUInt32(Strobes, 4);
+ }
+ }
+ ///
+ /// Terza word di strobe da array flag completo
+ ///
+ public StFlag32 STRB_DW2
+ {
+ get
+ {
+ return (StFlag32)BitConverter.ToUInt32(Strobes, 8);
+ }
+ }
+ ///
+ /// Quarta word di strobe da array flag completo
+ ///
+ public StFlag32 STRB_DW3
+ {
+ get
+ {
+ return (StFlag32)BitConverter.ToUInt32(Strobes, 12);
+ }
+ }
+ ///
+ /// Prima word di ACKnowledgment da array flag completo
+ ///
+ public StFlag32 ACK_DW0
+ {
+ get
+ {
+ return (StFlag32)BitConverter.ToUInt32(Acknowl, 0);
+ }
+ }
+ ///
+ /// Seconda word di ACKnowledgment da array flag completo
+ ///
+ public StFlag32 ACK_DW1
+ {
+ get
+ {
+ return (StFlag32)BitConverter.ToUInt32(Acknowl, 4);
+ }
+ }
+ ///
+ /// Terza word di ACKnowledgment da array flag completo
+ ///
+ public StFlag32 ACK_DW2
+ {
+ get
+ {
+ return (StFlag32)BitConverter.ToUInt32(Acknowl, 8);
+ }
+ }
+ ///
+ /// Quarta word di ACKnowledgment da array flag completo
+ ///
+ public StFlag32 ACK_DW3
+ {
+ get
+ {
+ return (StFlag32)BitConverter.ToUInt32(Acknowl, 12);
+ }
+ }
+
+#if true
///
/// Strobe mask PLC
///
@@ -504,7 +594,8 @@ namespace MTC_Sim
///
/// Variabili stato macchina principali
///
- public StFlag8 ST_MACCH = 0;
+ public StFlag8 ST_MACCH = 0;
+#endif
public List codaM = new List();
@@ -544,58 +635,6 @@ namespace MTC_Sim
///
public Event mOperator = new Event("OperatorId");
-#if true
-
- ///
- /// CURR_PROG - programma in esecuzione
- ///
- public Event mProgram = new Event("CurrProg");
- ///
- /// CURR_PROG_ROWNUM - programma in esecuzione
- ///
- public Event mProgRowNum = new Event("CurrProg_RowNum");
- ///
- /// PartId - particolare prodotto
- ///
- public Event mPartId = new Event("PartID");
-
- ///
- /// D.D1.P1.RUN_MODE - modalità esecuzione
- ///
- public Event mMode = new Event("RUN_MODE");
- ///
- /// D.D1.P1.PATH_STATUS - status macchina
- ///
- public Event mExec = new Event("EXECUTION");
-
- ///
- /// M_CODE
- ///
- public Event mCod_M = new Event("Cod_M");
- ///
- /// S_CODE
- ///
- public Event mCod_S = new Event("Cod_S");
- ///
- /// T_CODE
- ///
- public Event mCod_T = new Event("Cod_T");
-
-
- ///
- /// Pezzi totali
- ///
- public Event mPz_Tot = new Event("PZ_TOT");
- ///
- /// Pezzi OK
- ///
- public Event mPz_Ok = new Event("PZ_OK");
- ///
- /// Pezzi KO
- ///
- public Event mPz_Ko = new Event("PZ_KO");
-#endif
-
///
/// modalità funzionale
///
@@ -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
///
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();
}
///
@@ -899,9 +946,23 @@ namespace MTC_Sim
}
///
- /// recupero allarmi
+ /// verifica gli status attivi
///
- public virtual void getAlarms()
+ public virtual void processStatus()
+ {
+ // da gestire su ogni adapter...
+ }
+ ///
+ /// processo tutti gli strobe attivi
+ ///
+ public virtual void processStrobe()
+ {
+ // da gestire su ogni adapter...
+ }
+ ///
+ /// processo gli strobe degli allarmi
+ ///
+ public virtual void processAlarm()
{
// da gestire su ogni adapter...
}
@@ -932,11 +993,11 @@ namespace MTC_Sim
// da gestire su ogni adapter...
}
///
- /// dati relativi al RUN mode
+ /// recupero iniziale di TUTTI gli strobes/status attivi
///
- 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
}
///
/// recupera pezzi OK (fare override!)
diff --git a/MTC_Sim/MTC_Sim/CMS_MachineSim.cs b/MTC_Sim/MTC_Sim/CMS_MachineSim.cs
index 6e0fad2..7c71cef 100644
--- a/MTC_Sim/MTC_Sim/CMS_MachineSim.cs
+++ b/MTC_Sim/MTC_Sim/CMS_MachineSim.cs
@@ -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
diff --git a/MTC_Sim/MTC_Sim/utils.cs b/MTC_Sim/MTC_Sim/utils.cs
index 537051b..c5beea9 100644
--- a/MTC_Sim/MTC_Sim/utils.cs
+++ b/MTC_Sim/MTC_Sim/utils.cs
@@ -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;