Frage zu ADS Fehlermeldung 0x701

Rodewijn

Level-1
Beiträge
90
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,

ich möchte eine ShortINT-Variable aus der Beckhoff SPS(TwinCat3) in C#-Projekt auslesen.

Erst Handle angelegt, hat (irgendwann) problemlos geklappt:
Code:
private void Form1_Load(object sender, System.EventArgs e)
        {
            tcClient = new TcAdsClient();
            
            tcClient.Connect("192.168.2.1.1.1", 851);
            try
            {
                hVar = tcClient.CreateVariableHandle("GVL.VMStatus");
            }
            catch (Exception err)
            {
                MessageBox.Show(err.Message);
            }
        }

Soweit klappt alles fehlerfrei, also nahe am Ziel, denke ich. Dann über Button Variable auslesen:
Code:
private void btnRead_Click(object sender, System.EventArgs e)
        {
            try
            {
                
                 // creates a stream with a length of 2 byte 
                AdsStream ds = new AdsStream(2);
                BinaryReader br = new BinaryReader(ds);

                // reads a Short INT from PLC
                tcClient.Read(hVar, 0, ds);

                ds.Position = 0;
                lbArray.Text = br.ReadInt16().ToString(); 
            }
            catch(Exception err)
            {
                MessageBox.Show(err.Message);
            }
        }

Bei "tcClient.Read(hVar, 0, ds);" kommt die ADS-Fehlermeldung 0x701 "Service is not supported by Server"

Ich habe den Code aus einem Beispiel von Beckhoff, nur leicht angepasst für meinen Zweck. Vielleicht etwas mit dem hVAr-Handle, oder ADS-Stream... Es liegt bestimmt daran, dass ich als Anfänger bezüglich ADS-Clients unter .NET etwas einfaches falsch gemacht habe, aber was? Wäre für jede Hilfe Dankbar... :)
 
Jetzt habe ich tcClient.Read(hVar, 0, ds) durch tcClient.Read(hVar, ds) ersetzt. Jetzt kommt kein Fehlermeldung mehr, aber ich lese immer nur "0"....

Ich habe mittlerweile viel Beispiele bei Beckhoff TwinCat3 und ADS angeschaut, für Array, Structs, Erreignisorientiertes Lesen, usw. Gibt es eigentlich irghendwo auch ein Beispiel wo einfach nur ein Integer auf einfachster Weise ausgelesen wird?

Ich habe wohl dieses Beispiel gefunden:
Beckhoff Information System - German

Aber hier vestehe ich zum Beispiel nicht wo das "0x4020" herkommt in
Code:
[COLOR=#008000]// creates a stream with a length of 4 byte  [/COLOR]
AdsStream ds = new AdsStream(4);  
BinaryReader br = new BinaryReader(ds);  [COLOR=#008000]// reads a DINT from PLC 
[/COLOR]tcAds.Read(0x4020,0,ds);  
ds.Position = 0; 
textBox1.Text = br.ReadInt32().ToString();

Und warum es hier kein "Handle" gibt wie in den anderen Beispielen...

Wenn jemand mich nochmal mit einem einfachen Beispiel auf die Sprünge helfen könnte, wäre ich sehr dankbar :)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Read Methode hat mehrere Überladungen, wie du evtl. schon im Infosys gelesen hast.

Wenn du auf eine Variable über deren Handle zugreifen willst geht das so: TcAdsClient.Read(hvar,stream)
Die 0 die bei dir noch drin steht ist da falsch, denn die Überladung Read(int,int,stream) ist für die direkte Adressierung vorgesehen.
Das ist dann auch der Code aus deinem 2ten Post.
Read(0x4020,0,stream) ließt direkt den lokierten Merkerbereich (Indexgruppe 0x4020, Offset 0).
D.h. in diesem Fall ein DWORD Blah AT%MB0 : DWORD;
Wenn du keine Variable in diesen Adressbereich deklariert hast steht da nat. nur 0 drin.

Also, versuch nochmal
Code:
tcClient.Read(hVar, ds);
 
Ja, das war es tatsächlich. Hatte es eher zufällig gefunden, habe vieles nur halb verstanden. Bin jetzt noch am überlegen, wie ich meine weiter HMI aufbaue.. Werte die sich nur gelegenlich ändern erreignisgesteuert aktualisieren, Analogmesswerte die sich immer ändern "pollen" oder vielleicht doch alles erreichnisgesteuert?....ich schaue die ganze Beispiele heute Abend nochmal an...

Auf jeden Fall vielen Dank :)
 
Zurück
Oben