diff --git a/MTC_Sim/MTC_Sim/AdapterConf/EsaKvara.ini b/MTC_Sim/MTC_Sim/AdapterConf/EsaKvara.ini
index 8a43795..af80ca5 100644
--- a/MTC_Sim/MTC_Sim/AdapterConf/EsaKvara.ini
+++ b/MTC_Sim/MTC_Sim/AdapterConf/EsaKvara.ini
@@ -53,6 +53,9 @@ StatusNumber=401
; indirizzo di memoria del primo byte di scrittura dati
CommandsAddress=SIMREAD[0]
CommandsNumber=10
+; indirizzo di memoria AreaV DA CAPIRE/VERIFICARE!!!!
+VAreaAddress=V
+VAreaNumber=10
; offset del registro per l'indice di collisione
CollisionIndex=6.L
; ritardo nella lettura dal plc
diff --git a/MTC_Sim/MTC_Sim/AdapterESA.cs b/MTC_Sim/MTC_Sim/AdapterESA.cs
index 0413320..7822425 100644
--- a/MTC_Sim/MTC_Sim/AdapterESA.cs
+++ b/MTC_Sim/MTC_Sim/AdapterESA.cs
@@ -100,20 +100,214 @@ namespace MTC_Adapter
public override void getStrobeAndAckStatus()
{
base.getStrobeAndAckStatus();
+#if false
if (connectionOk)
{
// leggo TUTTO il blocco di memoria
inizio = DateTime.Now;
ncDevice.ReadBuffer();
if (utils.CRB("recTime")) TimingData.addResult(string.Format("R-PLC_MemoryRead", ncDevice.PLC_MemoryRead.Length), DateTime.Now.Subtract(inizio).Ticks);
+ // tengo tutto nella memoria dell'oggetto ESA...
+ //Buffer.BlockCopy(ncDevice.PLC_MemoryRead, 0, Strobes, 0, Strobes.Length);
+ }
+ else
+ {
+ lg.Error("Errore connessione mancante in getStrobeAndAckStatus");
+ }
+#endif
+ }
- Buffer.BlockCopy(ncDevice.PLC_MemoryRead, 0, Strobes, 0, Strobes.Length);
+ public override void getGlobalData()
+ {
+ base.getGlobalData();
+
+ // accodo dati path in DataMonitor......
+ StringBuilder sb = new StringBuilder();
+
+ if (connectionOk)
+ {
+ // leggo TUTTO il blocco di memoria
+ inizio = DateTime.Now;
+ ncDevice.ReadBuffer();
+ if (utils.CRB("recTime")) TimingData.addResult(string.Format("R-PLC_MemoryRead", ncDevice.PLC_MemoryRead.Length), DateTime.Now.Subtract(inizio).Ticks);
}
else
{
lg.Error("Errore connessione mancante in getStrobeAndAckStatus");
}
-
+
+
+ parentForm.dataMonitor = sb.ToString();
+ }
+
+ ///
+ /// Processo stti macchina...
+ ///
+ public override void processStatus()
+ {
+ base.processStatus();
+
+ // HARD CODE: forzo path 1 (indice 0...)
+ int idxPath = 0;
+
+ // switch su run mode...
+ /*
+ * MODO_X V[74].W
+ * 0 = Modo NESSUNO
+ * 1 = Modo MANUALE
+ * 2 = Modo AUTOMATICO
+ * 3 = Modo POM
+ * 4 = Modo MDI
+ * 5 = Modo SEMIAUTOMATICO
+ * 6 = Modo RAP
+ * 7 = Modo TES
+ * */
+
+ uint Modo_X = ncDevice.PLC_MemoryAreaV[6];
+ switch (Modo_X)
+ {
+ default:
+ break;
+ }
+#if false
+ if (STRB_DW2.HasFlag(StFlag32.B01))
+ {
+ vettPath[idxPath].mPathRunMode.Value = "AUTO";
+ }
+ else if (STRB_DW2.HasFlag(StFlag32.B02))
+ {
+ vettPath[idxPath].mPathRunMode.Value = "EDIT";
+ }
+ else if (STRB_DW2.HasFlag(StFlag32.B03))
+ {
+ vettPath[idxPath].mPathRunMode.Value = "MDI";
+ }
+ else if (STRB_DW2.HasFlag(StFlag32.B04))
+ {
+ vettPath[idxPath].mPathRunMode.Value = "REF";
+ }
+ else if (STRB_DW2.HasFlag(StFlag32.B05))
+ {
+ vettPath[idxPath].mPathRunMode.Value = "JOG";
+ }
+ else if (STRB_DW2.HasFlag(StFlag32.B07))
+ {
+ vettPath[idxPath].mPathRunMode.Value = "JOGINC";
+ }
+ else if (STRB_DW2.HasFlag(StFlag32.B07))
+ {
+ vettPath[idxPath].mPathRunMode.Value = "HANDLE";
+ }
+#endif
+ }
+
+ public override void getUnOp()
+ {
+ base.getUnOp();
+ }
+
+ public override void getPath()
+ {
+ base.getPath();
+ }
+
+ public override void getAxis()
+ {
+ base.getAxis();
+
+ // mostro assi in DataMonitor......
+ StringBuilder sb = new StringBuilder();
+
+ // nuova posizione (per calcoli)
+ double newPos = 0;
+ double distPerc = 0;
+ int newDir = 0;
+
+ // leggo in modo "cablato" i dati dei vari assi...
+ for (int i = 0; i < currAdpConf.nAxis; i++)
+ {
+
+ // in base a indice scelgo valore posizione e load
+ switch (i)
+ {
+ case 0:
+ newPos = (double)BitConverter.ToInt32(BitConverter.GetBytes(ncDevice.PLC_MemoryRead[240]), 0);
+ //BitConverter.ToUInt16(ncDevice.PLC_MemoryRead, 240);
+ break;
+ case 1:
+ newPos = (double)BitConverter.ToInt32(BitConverter.GetBytes(ncDevice.PLC_MemoryRead[241]), 0);
+ break;
+ case 2:
+ newPos = (double)BitConverter.ToInt32(BitConverter.GetBytes(ncDevice.PLC_MemoryRead[242]), 0);
+ break;
+ case 3:
+ newPos = (double)BitConverter.ToInt32(BitConverter.GetBytes(ncDevice.PLC_MemoryRead[243]), 0);
+ break;
+ case 4:
+ newPos = (double)BitConverter.ToInt32(BitConverter.GetBytes(ncDevice.PLC_MemoryRead[244]), 0);
+ break;
+ case 5:
+ newPos = (double)BitConverter.ToInt32(BitConverter.GetBytes(ncDevice.PLC_MemoryRead[245]), 0);
+ break;
+ default:
+ // valPos = posAssi.p1;
+ // valLoad = loadAssi.svload1;
+ break;
+ }
+
+ // popolo valori...
+ //vettAxis[i].mAxLoad.Value = (double)(valLoad.data) / Math.Pow(10, valLoad.dec);
+ vettAxis[i].mAxPosAct.Value = newPos;
+ //vettAxis[i].mAxPosTgt.Value = newPos + (double)(valPos.dist.data) / Math.Pow(10, valPos.dist.dec);
+
+ if (utils.CRB("verbose"))
+ {
+ sb.AppendLine(string.Format("Asse {0}: PosAct:{1:N3}, ToGo:{2:N3}{3}", i, (double)(newPos) / utils.CRI("fattdecimale"), i, 0));
+ }
+
+ vettAxis[i].mAxFeedAct.Value = FeedRate;
+
+ // calcolo distanza e salvo valore...
+ distPerc = newPos - prevPosAxis[i];
+ vettAxis[i].mAxDistDone.Value = Math.Abs(distPerc);
+
+ // sistemo direzione +/- (POS/NEG se lineari, CCW/CW se rotativi)
+ if (distPerc != 0)
+ {
+ newDir = Convert.ToInt32(distPerc / Math.Abs(distPerc));
+ }
+ else
+ {
+ newDir = prevDirAxis[i];
+ }
+ vettAxis[i].mAxDir.Value = newDir;
+
+ // se la direzione è variata salvo il cambio direzione...
+ if (newDir != prevDirAxis[i])
+ {
+ // salvo "+1" come cambi direzione
+ vettAxis[i].mAxInvDDone.Value = 1;
+ }
+ else
+ {
+ // salvo "0"...
+ vettAxis[i].mAxInvDDone.Value = 0;
+ }
+
+ // salvo valori vettore prec...
+ prevPosAxis[i] = newPos;
+ prevDirAxis[i] = newDir;
+
+ //vettAxis[i].mAxMainProc.Value = AxData.AxisMainProc;
+ //vettAxis[i].mAxIsMaster.Value = AxData.AxisIsMaster;
+ //vettAxis[i].mAxMastId.Value = AxData.AxisMastId;
+ //vettAxis[i].mAxFeedOver.Value = AxData.AxisFeedOver;
+ //vettAxis[i].mAxAccelAct.Value = AxData.AxisAccel;
+ //vettAxis[i].mAxAccTime.Value = AxData.AxisAccTime;
+ //vettAxis[i].mAxBattery.Value = AxData.AxisBattery;
+ }
+
+ parentForm.dataMonitor += sb.ToString();
}
}
}
diff --git a/MTC_Sim/MTC_Sim/Appunti.txt b/MTC_Sim/MTC_Sim/Appunti.txt
deleted file mode 100644
index 43b3382..0000000
--- a/MTC_Sim/MTC_Sim/Appunti.txt
+++ /dev/null
@@ -1,40 +0,0 @@
-OK 00) chiusura app --> FANUC_ref.disconnect
-OK 01) rivedere GetBit (cambiare!!!)
-OK 02) strobe allarmi --> su cambio fronte --> serve vettore stato COMPLETO allarmi
-OK 03) lo strobe allarmi va inizializzato all'avvio (carica TUTTI i bit...)
-OK 04) da strobe allarmi --> vettore allarmi
-OK 05) CodS 5 cifre
-OK 06) CodM/CodT 3 cifre
- 07) lettura assi: posizioni, velocità, ...
- - feedrate C:\Users\samuele.STEAMWAREWIN\Documents\VisualStudioProjects\CMS_orig\A02B-0207-K737_04.20\Document\SpecE\Position\cnc_actf.htm
- - ALL? C:\Users\samuele.STEAMWAREWIN\Documents\VisualStudioProjects\CMS_orig\A02B-0207-K737_04.20\Document\SpecE\Position\cnc_rdaxisdata.htm
-OK 08) lettura strobe e registrazione NUOVO flusso EVENT x START/STOP/RESET (1 solo con 3 strobe separati) --> gestire!!!
-OK 09) update gestione SUB MODE
-OK 10) riallineamento simulatore generico
- 11) spostare lettura spindle in mandrino/UnOp
- 12) completare letture assi
-OK 13) completare gestione BIT di semaforo
-OK 14) completare gestione strobe (x i bit "non qualificati")
-OK 15) decodifica corretta livello allarme (WARNING/FAULT)
- 16) lettura codici G del path con cnc_rdgcode
- 17) lettura dati "globali" in un unico ciglo (rdyndata2)
- 18) lettura speed dei mandrini (UnOp) da memorie (D3140 --> D3178, 2 byte 16bit UINT16, sono RPM interi, max 20 teste...)
- 19) calcolo distanze percorse assi
- 20) calcolo numero inversioni assi
- 21) revisione file conf ADAPTER
-
-
- 99) completamento funzioni con librerie fanuc native
- C:\Users\samuele.STEAMWAREWIN\Documents\VisualStudioProjects\CMS_orig\A02B-0207-K737_04.20\Document\SpecE\flist_com.htm
-
-
-
-
-
-
-
- SIM IP statico
- 192.168.139.100
-
- Mio IP statico
- 192.168.139.101
\ No newline at end of file
diff --git a/MTC_Sim/MTC_Sim/MTC-Adapter.csproj b/MTC_Sim/MTC_Sim/MTC-Adapter.csproj
index 68b0145..c46cafe 100644
--- a/MTC_Sim/MTC_Sim/MTC-Adapter.csproj
+++ b/MTC_Sim/MTC_Sim/MTC-Adapter.csproj
@@ -104,6 +104,13 @@
Always
+
+
+
+
+
+
+
Always
@@ -119,6 +126,8 @@
Always
+
+
@@ -169,7 +178,7 @@
Always
-
+
Always
diff --git a/MTC_Sim/SCMCncLib/SCMCncLib.csproj b/MTC_Sim/SCMCncLib/SCMCncLib.csproj
index 78f2a72..e9b0df9 100644
--- a/MTC_Sim/SCMCncLib/SCMCncLib.csproj
+++ b/MTC_Sim/SCMCncLib/SCMCncLib.csproj
@@ -38,9 +38,6 @@
-
- ..\..\..\..\..\..\..\Kvara\Exe\XSimGph.dll
-
..\..\..\..\..\..\..\Kvara\Exe\XSimMem.dll
diff --git a/MTC_Sim/SCMCncLib/thdNcBase.cs b/MTC_Sim/SCMCncLib/thdNcBase.cs
index 5ff2997..b93f575 100644
--- a/MTC_Sim/SCMCncLib/thdNcBase.cs
+++ b/MTC_Sim/SCMCncLib/thdNcBase.cs
@@ -2,7 +2,6 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
-using XSimGph;
using IniFiles;
namespace SCMCncLib
@@ -18,8 +17,8 @@ namespace SCMCncLib
// !!! 2016.05.25 commentato e riscritto perchè NON C'E' la parte form, è DLL comunicazione...
#if false
protected XSimMainWindow m_form; // link to main window
-#endif // false
protected MWEngine mwEngine; // link to graphic engine
+#endif // false
public bool Connected = false;
protected bool requestStop = false;
protected int PlcDelay;
@@ -58,27 +57,16 @@ namespace SCMCncLib
// set delay for execution cycle
PlcDelay = fIni.ReadInteger("NC", "PlcDelay", 10);
}
-
- ///
- /// Initialization: common operations for all devices.
- ///
- /// The e.
- /// The f ini.
- public thdNcBase(MWEngine e, IniFile fIni)
- {
- // store link to graphic manager
- mwEngine = e;
- // set delay for execution cycle
- PlcDelay = fIni.ReadInteger("NC", "PlcDelay", 10);
- }
-
+
///
/// Initialize read and write buffers of memory manager
///
public void CreateBuffers()
{
- mwEngine.MemoryManager.InitializeMemories();
- }
+#if false
+ mwEngine.MemoryManager.InitializeMemories();
+#endif
+ }
///
/// Request to stop the thread
diff --git a/MTC_Sim/SCMCncLib/thdNcEsaGvKvara.cs b/MTC_Sim/SCMCncLib/thdNcEsaGvKvara.cs
index 4a0158d..9a93dcb 100644
--- a/MTC_Sim/SCMCncLib/thdNcEsaGvKvara.cs
+++ b/MTC_Sim/SCMCncLib/thdNcEsaGvKvara.cs
@@ -5,7 +5,6 @@ using System.Threading;
using System.Runtime.InteropServices;
using System.Linq;
using System.Text;
-using XSimGph;
using IniFiles;
namespace SCMCncLib
@@ -34,6 +33,9 @@ namespace SCMCncLib
{
private UInt16 ReadNumber;
private UInt16 WriteNumber;
+ private UInt16 VAreaNumber;
+ private UInt16 ETKAreaNumber;
+
private string SysLink = "";
private string DefCn = "";
@@ -46,9 +48,15 @@ namespace SCMCncLib
private string CommandsAddressName;
private TS_REG CommandsAddress;
+ private string VAreaAddressName;
+ private TS_REG VAreaAddress;
+
public UInt32[] PLC_MemoryRead;
public UInt32[] PLC_MemoryWrite;
+ public UInt32[] PLC_MemoryAreaV;
+ public UInt32[] PLC_MemoryAreaETK;
+
// esa constants
#region ESA_PLC_CONSTANTS
private const UInt32 MAX_PATH = 256;
@@ -137,9 +145,10 @@ namespace SCMCncLib
// !!! 2016.05.25 inutile forse? riguarda l'engine 3d...
- //hack: metto 16...
- int ReadNumber = 16;
- int WriteNumber = 16;
+ //hack: metto fisso...
+ ReadNumber = 265;
+ WriteNumber = 265;
+ WriteNumber = 265;
#if false
// store read and write number of bytes
ReadNumber = Convert.ToUInt16(mwEngine.MemoryManager.NrByteToRead / 4);
@@ -151,72 +160,22 @@ namespace SCMCncLib
StatusAddressName = fIni.ReadString("NC", "StatusAddress", "SIMWRITE[0]");
CommandsAddressName = fIni.ReadString("NC", "CommandsAddress", "SIMREAD[0]");
+ VAreaAddressName= fIni.ReadString("NC", "VAreaAddress", "SIMREAD[0]");
// create read buffer
PLC_MemoryRead = new UInt32[ReadNumber];
// create write buffer
PLC_MemoryWrite = new UInt32[WriteNumber];
- if (!Connect())
- Disconnect();
- }
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The e.
- /// The f ini.
- public thdNcEsaGvKvara(MWEngine e, IniFile fIni) : base(e, fIni)
- {
- DeviceType = NC_DEVICE_TYPE.ESAGV_KVARA;
-
- StringBuilder tempS = new StringBuilder(Convert.ToInt32(MAX_PATH));
-
- //string buffer = " ";
- //byte[] byteS = new UTF8Encoding().GetBytes(buffer);
- //GCHandle bufferH = GCHandle.Alloc(byteS, GCHandleType.Pinned);
- //IntPtr tempS = Marshal.UnsafeAddrOfPinnedArrayElement(byteS, 0);
- //byte[] tempS = new byte[MAX_PATH];
-
- // set executable path
- SetDllDirectory(fIni.ReadString("NC", "SysExe", "C:\\KVARA\\EXE"));
-
- // communication type
- string defValue = fIni.ReadString("NC", "SysLink", "SIMULATO");
- ENVGetProfileString("SYS", "LINK", defValue, tempS, MAX_PATH);
- //bufferH.Free();
- SysLink = tempS.ToString();
-
- // communication channel
- iChannel = ConvComunicationChannel(SysLink);
- // definition path
- defValue = fIni.ReadString("NC", "SysDefCn", "C:\\KVARA\\DISCOI");
- ENVGetProfileString("SYS", "DEFCN", defValue, tempS, MAX_PATH);
- DefCn = tempS.ToString() + "\\defcn";
- //StrCat(DefCn, "\\defcn");
-
-
- // !!! 2016.05.25 inutile forse? riguarda l'engine 3d...
-
- // store read and write number of bytes
- ReadNumber = Convert.ToUInt16(mwEngine.MemoryManager.NrByteToRead / 4);
- if (mwEngine.MemoryManager.NrByteToRead != ReadNumber * 4) ReadNumber++;
- WriteNumber = Convert.ToUInt16(mwEngine.MemoryManager.NrByteToWrite / 4);
- if (mwEngine.MemoryManager.NrByteToWrite != WriteNumber * 4) WriteNumber++;
-
-
- StatusAddressName = fIni.ReadString("NC", "StatusAddress", "SIMWRITE[0]");
- CommandsAddressName = fIni.ReadString("NC", "CommandsAddress", "SIMREAD[0]");
-
- // create read buffer
- PLC_MemoryRead = new UInt32[ReadNumber];
- // create write buffer
- PLC_MemoryWrite = new UInt32[WriteNumber];
+ // create VArea buffer
+ PLC_MemoryAreaV = new UInt32[32];
+ // create ETKArea buffer
+ PLC_MemoryAreaETK = new UInt32[32];
if (!Connect())
Disconnect();
}
-
+
#if false
///
/// Initializes a new instance of the class.
@@ -274,6 +233,36 @@ namespace SCMCncLib
#endif // false
+ ///
+ /// Thread main execution
+ ///
+ public override void Execute()
+ {
+ while (!requestStop)
+ {
+ if (Connected)
+ {
+ // load data from NC
+ ReadBuffer();
+ // if requested make a pause
+ if (PlcDelay > 0)
+ Thread.Sleep(PlcDelay);
+ }
+ else if (!Connected)
+ {
+ // wait 5 sec and retry connection
+ Thread.Sleep(5000);
+ Connect();
+ }
+ else
+ Thread.Sleep(500);
+ }
+
+ if (Connected) Disconnect();
+ Finished = true;
+ }
+
+#if false
///
/// Thread main execution
///
@@ -309,7 +298,8 @@ namespace SCMCncLib
if (Connected) Disconnect();
Finished = true;
- }
+ }
+#endif
///
/// Reads the buffer.
@@ -318,6 +308,17 @@ namespace SCMCncLib
{
// lettura buffer dal CN
iError = read_regbuffer(ref StatusAddress, 0, ReadNumber, PLC_MemoryRead);
+
+ // devo definire posizione memorie Vcome TS_REG
+ iError = read_regbuffer(ref VAreaAddress, 68, 32, PLC_MemoryAreaV);
+#if false
+ // se tutto ok leggo anche buffer V
+ if (iError == 0)
+ {
+ iError = read_regbuffer(ref StatusAddress, 0, ReadNumber, PLC_MemoryAreaV);
+ }
+#endif
+
//System.Buffer.BlockCopy(PLC_MemoryRead, 0, mwEngine.MemoryManager.ReadMemory, 0, mwEngine.MemoryManager.NrByteToRead);
// set flag to inform graphic engine that data have been read from device
//mwEngine.BufferRead = true;
@@ -328,8 +329,10 @@ namespace SCMCncLib
///
private void WriteBuffer()
{
+#if false
System.Buffer.BlockCopy(mwEngine.MemoryManager.WriteMemory, 0, PLC_MemoryWrite, 0, mwEngine.MemoryManager.NrByteToWrite);
- iError = write_regbuffer(ref CommandsAddress, 0, WriteNumber, PLC_MemoryWrite);
+ iError = write_regbuffer(ref CommandsAddress, 0, WriteNumber, PLC_MemoryWrite);
+#endif
}
///
@@ -346,6 +349,9 @@ namespace SCMCncLib
iError = get_reg_by_name(StatusAddressName, ref StatusAddress);
if (iError == 0)
iError = get_reg_by_name(CommandsAddressName, ref CommandsAddress);
+
+ if (iError == 0)
+ iError = get_reg_by_name(VAreaAddressName, ref VAreaAddress);
Connected = (iError == 0);
WriteConnectionStatus();