Zugriff mit ADS auf BC9000

jomolungma

Level-1
Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich habe ein Problem mit dem Zugriff über die ADS-Bibliothek im C# auf den BC9000.
Vielleicht kann mir jemand sagen was ich falsch mache.

Ich habe eine Standard WPF Anwendung neu erstellt( Als Vorlage dient die Beispielanwendung von beckhoff aus dem infosys). In dem Fenster habe ich zwei Buttons(button1,button2) und ein Label(label1).
In der cs. Datei von dem Fenster Window 1 sind die unten stehenden C# Funktionen definiert.
folgender C# Funktion erstellt die Verbindung zum BC

Code:
private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            try
            {
                // Verbinden mit lokaler SPS - Laufzeit 1
                tcClient = new TcAdsClient();
                tcClient.Connect("192.168.178.200.1.1", 800); 
                

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }
Diese Funktion liesst auf Knopfdruck eine Bytevariable im BC
Code:
private void button1_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            try
            {
                AdsStream dataStream;
                BinaryReader binReader;

                dataStream = new AdsStream(1);
                binReader = new BinaryReader(dataStream);
                         
                tcClient.Read(16416,0,dataStream);
                dataStream.Position = 0;
                label1.Content = binReader.ReadInt16().ToString();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
Und diese Funktion soll ein 10 an eine Variable im BC schicken:

Code:
private void button2_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            try
            {
                AdsStream dataStream;
                dataStream = new AdsStream(1);

                dataStream.Position = 0;
                dataStream.WriteByte(20);
                tcClient.Write(61488, 0, dataStream);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
IM BC9000 sind zwei Variablen deklariert:
var1 AT %MB0:Byte;
var2 AT %QB0:Byte;

Ich bin zeimlich vor dem verzweifeln, da eine Beispielanwendung von Beckhoff, zwar in VB, funktioniert.
Ich weis einfach nicht wo der Fehler steckt.
kann mir dann mal noch jemand erklären wie statt einer byte Variable eine String und eine Real variable lesen bzw. schreiben kann?

Ich bin Euch zum Dank verpflichtet.

Grüße Christian
 
Hallo Christian,

wo liegt denn das Problem?

Ich habe hier nur zwei kleine Ungereimtheiten entdeckt:
- binReader.ReadInt16().ToString();
sollte vielleicht heissen
binReader.ReadByte().ToString();
- dataStream.WriteByte(20);
sollte vielleicht heissen:
dataStream.WriteByte(10);
wenn eine 10 geschrieben werden soll.

Aber das ist doch nicht das Problem, oder?

Gruß,
witkatz
 
Zuviel Werbung?
-> Hier kostenlos registrieren
selbst mit diesen kleinen schönheitsfehlern funktioniert es einfach nicht.
Ich bekomme keine Reaktion am BC sowie auch keine Fehlermeldung aus meinem C# Programm.

Vielleicht hat ja jemand selber ein Beispielprogramm in C# für den Variablenaustausch mit einem BC9000.

Gruß Christian
 
Das Beispiel ist schon ok, zumindest was die ADS.net Aufrufe angeht, weitere C# Beipiele auch über das Handling verschiedener Detntypen wie REAL und STRING findest du in der Ads.net Doku.

Die Aussage "Programm läuft nicht" ist nach meiner Meinung zu pauschal. Versuche bitte deine WPF-Anwendung zu debuggen um einzukreisen was läuft und was nicht, um der Fehlerursache ein Stück näher zu kommen:
- mit ein paar Breakpoints kannst du herausfinden, ob die Methoden überhaupt aufgerufen werden. Insbesondere die Methode Window_Loaded, wird sie vom System überhaupt aufgerufen? Ist das die richtige Load-Methode bzw. das richtige Ereignis für die Initialisierungs-Sequenz in einer WPF-Anwendung? Ich habe nur das Page_Loaded Ereignis verwendet, damit funktioniert die Initialisierung bei mir.
- In meinem Test werden die MouseLeftButtonDown-Ereignismethoden gar nicht aufgerufen. Versuch mal mit einem Click Ereignis
Code:
       private void button2_Click(object sender, RoutedEventArgs e)
       {
           // hier dein Code aus button2_MouseLeftButtonDown
       }
Gruß,
witkatz
 
Zuletzt bearbeitet:
Hallo,

bist du die sicher, dass man mit einem BC mittels ADS kommunizieren kann ?

Ich glaub, das geht gar nicht.

MfG CAS
 
Zuviel Werbung?
-> Hier kostenlos registrieren
bist du die sicher, dass man mit einem BC mittels ADS kommunizieren kann ?
Das geht. Wenn man am PC die AmsNetId und die IP-Adresse angleicht, dann ist muss nur der BC in der Routing Tabelle auf dem PC eingetragen sein. Wenn die AmsNetId des PC von seiner IP Adresse abweicht, dann muss auch im BC9000 eine Route in die AMS Routing Tabelle eingetragen werden. Es gibt ein Beispiel im Information System:
http://infosys.beckhoff.com/content/1031/bc9000/html/bt_bc9000 example ads to pc.htm?id=1976

Gruß,
witkatz
 
Ist schon richtig....

aber: Hier wird scheinbar die Kommunikation manuell ausprogrammiert.
Dazu muß man dann diese ADSread und ADSwrite Bausteine im Programm nutzen.
Die normale Kommuikation läuft, denke ich, nicht!

MfG CAS
 
OK,
hab mich mit den Breakpoint durch gewühlt.
Es funktioniert jetzt. Danke für den Hinweis Window_Loaded evtl. nicht durchlaufen!!!

Nur habe ich noch Probleme mit den REAL Variablen.

Ich habe eine Real Variable var1 so im BC deklariert:
var1 AT %MD0: REAL;

dann lese ich mit
tcClient.Read(16416, 0, dataStream);

und überweise so:
dTempTarget = binReader.ReadDouble();

aber da wird eine ewig lange zahl *10 ^- irgendwas angezeigt obwohl in var1 nur 10.5 steht.

Vielleicht könnt ihr mir doch noch eine Info geben.

Gruß Christian
 
Zuviel Werbung?
-> Hier kostenlos registrieren
REAL ist eine 4 Byte Fließkommazahl, was in C# single entspricht, also wäre die ReadSingle Methode richtig.
Natürlich muss auch der Stream entspr. größer deklariert werden und die Read-Methode muss 4 Byte lesen.

Gruß,
witkatz
 
Zurück
Oben