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();