# AGlink PLCStop funktion



## mert1611 (13 September 2022)

Hallo Zusammen,

Ich soll für meine Bachelorarbeit aus einer Steuerung SINUMERIK 840d sl auf einige Werkzeug- und Achsdaten zugreifen. Trotz meiner geringen Programmierkenntnisse habe ich (dank AGlink) geschafft, die Daten zuzugreifen. Jetzt versuche ich zum Automatischen Steuern der CNC-Maschine "PLCStop" funktion benutzen und die Machine in Stop versetzen. Leider bekomme ich die Fehler Meldung "AGL40_WRONG_KONTEXT". Unten ist ein Teil meines Codeschnipsels. Ich wäre sehr dankbar, falls mir jemand helfen könnte.

Viele Grüße
Mert


```
using System;
using System.IO;
using System.Reflection;
using Accon.AGLink;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Globalization;


namespace NCK1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Consolen Test");
            AGL4.Activate("----");
            IAGLink4 agl;
            Int32 devnr = 0;
            Int32 plcnr = 1;
            Int32 timeout = 1000;
            Int32 result = 0;
            Int32 cycletime = 1;
            bool onlyonchange = false;
            Int32 handle = 0;
            string errormsg = "";
            List<string> werte = new List<string>();

            //Initialisierung des rwfields
            AGL4.NckDataRW[] rwfield = new AGL4.NckDataRW[3];

            string FullPath = Assembly.GetExecutingAssembly().Location;
            string path = Path.GetDirectoryName(FullPath);
            Console.WriteLine(path);
            AGL4.SetParaPath(path);

          
            agl = AGL4ConnectionFactory.CreateInstance(devnr, plcnr, timeout);



            bool res = agl.Connect();
            if (res == true)
            {
                Console.WriteLine("Connection succesfull");


                //Rwfield konfigurieren und in Funktion anpassen

                SetupRwfield(ref rwfield);
                
                

                


                result = AGL4.NCK_ReadMixEx(agl.ConnNr, ref rwfield, timeout);



                //Testdaten zu Beginn auskommentieren
                while (true)
                {
                    Cycle(agl.ConnNr, cycletime, onlyonchange, ref rwfield, handle, timeout);
                  
                    double Xachswert = System.BitConverter.ToDouble(rwfield[0].Buff, 0);
                    double Yachswert = System.BitConverter.ToDouble(rwfield[1].Buff, 0);
                    double Zachswert = System.BitConverter.ToDouble(rwfield[2].Buff, 0);
                   
                  
                    Console.SetCursorPosition(2, 4);
                    Console.WriteLine("Achsdaten");
                    Console.SetCursorPosition(2, 5);
                    Console.WriteLine("X Achse: "+ Xachswert);                   
                    Console.SetCursorPosition(2, 6);
                    Console.WriteLine("Y Achse: "+ Yachswert);                   
                    Console.SetCursorPosition(2, 7);
                    Console.WriteLine("Z Achse: " + Zachswert);             
                  
              
                    
                    if((Xachswert>=145 && Xachswert<=180) && (Yachswert>=420 && Yachswert<=460) &&(Zachswert>=(425) && Zachswert<=600))
                    {
                        
                        doPLCStop(agl.ConnNr, timeout);

                    }
                }

            }
            else
            {
                Console.WriteLine("Connection failed");
                Console.ReadLine();
            }
        }
        static void SetupRwfield(ref AGL4.NckDataRW[] rwfield)
        {

            //X Achsenwerte
            rwfield[0] = new AGL4.NckDataRW();
            rwfield[0].Area = AGL4.NCK_Area.eNCK_AreaNCK;
            rwfield[0].Block = AGL4.NCK_Block.eNCK_BlockSMA;
            rwfield[0].Column = 2;
            rwfield[0].Row = 1;
            rwfield[0].RowCount = 1;
            rwfield[0].Unit = 1;
            rwfield[0].DDEVarType = AGL4.NCK_DDEVarFormat.eNCK_LE_Float64;
            rwfield[0].BuffLen = 8;
            rwfield[0].Buff = new Byte[rwfield[0].BuffLen];
            rwfield[0].Result = 0;

            //Y Achsenwerte
            rwfield[1] = new AGL4.NckDataRW();
            rwfield[1].Area = AGL4.NCK_Area.eNCK_AreaNCK;
            rwfield[1].Block = AGL4.NCK_Block.eNCK_BlockSMA;
            rwfield[1].Column = 2;
            rwfield[1].Row = 2;
            rwfield[1].RowCount = 1;
            rwfield[1].Unit = 1;
            rwfield[1].DDEVarType = AGL4.NCK_DDEVarFormat.eNCK_LE_Float64;
            rwfield[1].BuffLen = 8;
            rwfield[1].Buff = new Byte[rwfield[0].BuffLen];
            rwfield[1].Result = 0;

            //Z Achsenwerte
            rwfield[2] = new AGL4.NckDataRW();
            rwfield[2].Area = AGL4.NCK_Area.eNCK_AreaNCK;
            rwfield[2].Block = AGL4.NCK_Block.eNCK_BlockSMA;
            rwfield[2].Column = 2;
            rwfield[2].Row = 3;
            rwfield[2].RowCount = 1;
            rwfield[2].Unit = 1;
            rwfield[2].DDEVarType = AGL4.NCK_DDEVarFormat.eNCK_LE_Float64;
            rwfield[2].BuffLen = 8;
            rwfield[2].Buff = new Byte[rwfield[0].BuffLen];
            rwfield[2].Result = 0;

           

          
        }

        static void Cycle(Int32 ConnNr, Int32 cycletime, bool onlyonchange, ref AGL4.NckDataRW[] rwfield, Int32 handle, Int32 timeout)
        {
            Int32 result;
            string errormsg = "";
            // Inititalisierung der zyklischen NCK abfrage
            result = AGL4.NCK_InitCyclicReadEx(ConnNr, cycletime, onlyonchange, ref rwfield, out handle, timeout);

            if (result == AGL4.AGL40_SUCCESS)
            {
                //Start des Lesens
                result = AGL4.NCK_StartCyclicRead(ConnNr, handle, timeout);
                if (result == AGL4.AGL40_SUCCESS)
                {
                    //Empfangen der Daten
                    result = AGL4.NCK_GetCyclicReadEx(ConnNr, ref rwfield, handle, timeout);
                    if (result == AGL4.AGL40_SUCCESS)
                    {
                        //Console.WriteLine("Cycle Start erfolgreich");
                    }
                    else
                    {
                        // Error happened
                        AGL4.GetErrorMsg(result, out errormsg);
                    }
                    // If you don't require any other data, log off
                    AGL4.NCK_StopCyclicRead(ConnNr, handle, timeout);
                    AGL4.NCK_ExitCyclicRead(ConnNr, handle, timeout);
                }
                else
                {
                    result = AGL4.NCK_ExitCyclicRead(ConnNr, handle, timeout);
                    // Error happened
                    AGL4.GetErrorMsg(result, out errormsg);
                }
            }
            else
            {
                // Error happened
                AGL4.GetErrorMsg(result, out errormsg);
            }


        }



        static void doPLCStop(Int32 ConnNr, Int32 timeout)
        {
            Int32 result = AGL4.AGL40_PARAMETER_ERROR;
            // Run only if the timeout was positive
            if (timeout > 0)
            {
                // For a successful call, a connection must be built up to the AG.
                result = AGL4.PLCStop(ConnNr, timeout);
                if (result != AGL4.AGL40_SUCCESS)
                {
                    // Error happened.
                    
                    

                    String errormsg = "";
                    AGL4.GetErrorMsg(result, out errormsg);
                    Console.SetCursorPosition(1, 24);
                    Console.WriteLine(errormsg);
                }
            }
            
        }

    }
}
```


----------



## PN/DP (13 September 2022)

Bist Du sicher daß Du eine PLC in STOP versetzen willst? Warum?

Harald


----------



## DeltaMikeAir (13 September 2022)

mert1611 schrieb:


> Jetzt versuche ich zum Automatischen Steuern der CNC-Maschine "PLCStop" funktion benutzen und die Machine in Stop versetzen.


Kann es sein, dass du da etwas verwechselt? Maschine Stop und PLC Stop sind zwei verschiedene Funktionen. Die PLC bleibt (üblicherweise) immer in RUN.


----------



## mert1611 (14 September 2022)

Hallo,



PN/DP schrieb:


> Bist Du sicher daß Du eine PLC in STOP versetzen willst? Warum?
> 
> Harald





DeltaMikeAir schrieb:


> Kann es sein, dass du da etwas verwechselt? Maschine Stop und PLC Stop sind zwei verschiedene Funktionen. Die PLC bleibt (üblicherweise) immer in RUN.


Ja das ist gut möglich😅 Es tut mir leid, ich kenne mich mit Automatisierung nicht aus und versuche gerade in das Thema einzusteigen. In meiner Bachelorarbeit geht es im Wesentlichen um die Erforschung einer Methode zur Kollisionserkennung in CNC-Maschinen. Einer der wichtigsten Schritte dabei ist natürlich, die CNC-Maschine automatisch (z.B wenn sie bestimmte Koordinaten erreicht) stoppen zu können. Ich dachte, die PLCStop funktion sei dafür gedacht aber anscheind ist es wohl nicht der Fall. Weißt ihr ob man das mit AGlink machen kann und welche funktion man dafür braucht? Wenn nicht welche Themen/Lösungen würdet ihr mir zur Recherche vorschlagen?

Vielen Dank, dass ihr euch trotz meiner einfachen Fragen für mich Zeit genommen haben!

Viele Grüße
Mert


----------



## DeltaMikeAir (14 September 2022)

mert1611 schrieb:


> Ich dachte, die PLCStop funktion sei dafür gedacht aber anscheind ist es wohl nicht der Fall.


Nein, dafür ist die Funktion nicht gedacht.



mert1611 schrieb:


> Weißt ihr ob man das mit AGlink machen kann und welche funktion man dafür braucht?


wie schnell bekommst du denn überhaupt die Positionswerte geliefert? Die Zeit zwischen => Wert kommt => Kollision wird ausgewertet => Bewegung-Stop => senden, reicht diese Zeit überhaupt im eine schnelle Bewegung zu stoppen ( vor der Kollision )?




mert1611 schrieb:


> Ja das ist gut möglich😅 Es tut mir leid, ich kenne mich mit Automatisierung nicht aus





mert1611 schrieb:


> In meiner Bachelorarbeit geht es im Wesentlichen um die Erforschung einer Methode zur Kollisionserkennung in CNC-Maschinen.


Das liest man hier leider immer öfter => Meine Bachlerarbeit => Ich kenne mich nicht aus.....


----------



## Heinileini (15 September 2022)

mert1611 schrieb:


> Einer der wichtigsten Schritte dabei ist natürlich, die CNC-Maschine automatisch (z.B wenn sie bestimmte Koordinaten erreicht) stoppen zu können. Ich dachte, die PLCStop funktion sei dafür gedacht aber anscheind ist es wohl nicht der Fall.


Finger weg von PLCStop! 
NCStop könnte eher etwas sein für Deine Zwecke, aber VSHalt (VorschubHalt) kommt dem auch nahe.
Bei NCStop bin ich mir nicht sicher (ist zu lange her  ) , ob es mit NCStart danach nahtlos weitergeht (halte ich für höchst wahrscheinlich) oder ob das Programm neu gestartet wird (eigentlich nur nach einem Reset oder nach dem Laden des Programms oder nach M02 oder M30 im Programm).
VSHalt stoppt die Bewegungen der Achsen, aber Du möchtest, dass der Ablauf nur an bestimmten Stellen im NC-Programm angehalten wird.
An diesen Stellen müsstest Du im NC-Programm jeweils ein M00 einfügen oder besser noch @714 M00.

Wie Du Dein Ziel erreichen könntest, ohne im NC-Programm herumzubasteln, wüsste ich nicht. 
Ob Du in einem Programm herumbasteln darfst, das Du nicht ausschliesslich für Deine TestZwecke zur Verfügung hast und missbrauchst - das musst Du klären! Es sollte aber unbedingt jemand kompetentes dabei sein, der Dich beaufsichtigt und mit dem Du eigentlich über Dein Anliegen in diesem Thread sprechen kannst. Vielleicht gibt eine bessere Lösung für Dein Problem?


----------



## Rainer Hönle (15 September 2022)

PLCStop geht, wie der Name schon sagt, auf die PLC. Über eine Verbindung zur NCK kann die PLC nicht gestoppt werden, deshalb auch WRONG_KONTEXT. Für PLCStop wird eine extra Verbindung zur PLC benötigt.
Aber Achtung: Bevor Du hier mit Dingen rumexperimentierst, bei denen Su dich nicht wirklich gut auskennst, LASS DIE FINGER von solchen Funktionen. Speziell die Sinumerik benötigt eine grpoße Menge an WIssen und Verständnis.


----------



## mert1611 (16 September 2022)

Vielen Dank für die Warnungen und Empfehlungen! ich werde sorgfältiger arbeiten.


----------

