TwinCAT 3: Kommunikation via ADS zwischen CX9020 und lokaler Runtime (Win7, C6650)

PH062

Level-1
Beiträge
3
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebes Forum,
ich bin neue hier und verzweifle gerade bei einem scheinbar trivialen Problem.

Ich möchte den Wert einer Variable von einer Anlagensteuerung (läuft auf CX9020) via ADS auslesen und den ausgelesenen Wert an eine Variable in meinem lokalen System übergeben. Eigentlich funktioniert das doch über den FB_ReadAdsSymByName, oder?

Folgendes Verhalten habe ich beobachtet: Die CX9020 befindet sich permanent im RUN-Modus, anschließend starte ich mein lokales System im RUN-Modus, logge mich ein und starte mein Programm. Im Programm, habe ich eine Variable, die bRead des besagten Funktionsblocks auf true setzt. Anschließend wird der korrekte Wert der Variable wie gewünscht aus der CX9020 ausgelesen und eine Variable des lokalen Systems übergeben. Nun das Problem: Wenn ich jetzt die Variable auf der CX9020 ändern und bRead erneut von false auf true setze, wird kein Wert mehr übertragen. Erst wenn ich mein lokales System neustarte, kann ich den Wert der Variable wieder übertragen. Allerdings wieder nur genau einmal. In keinem Funktionsblock erscheint ein Fehler.

Kann jemand mein Problem nachvollziehen und hat ggf. eine Lösung parat?

Vielen Dank!!!
 
Ohne dass ich jetzt den Code gesehen habe: Der Funktionsblock wird mit bRead:=False mindestens einmal aufgerufen und danach wieder mit bRead:=True? Sonst könnte es sein das der FB keine Änderung am Eingang feststellt. Nur mal so ins Blaue geschossen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für die schnelle Antwort. Ja, das habe ich auch schon probiert. Habe bRead auf False gesetzt und anschließend versucht den FB neu aufzurufen, liefert kein Ergebnis und zeigt auch keine Fehlermeldung an. Muss man die ADS Kommunikation irgendwie prinzipiell erstmal stoppen, damit man den Funktionsblock wieder aufrufen kann?
 
Die ADS-Kommunikation ist ein Frage-Antwortspiel. Es muss ein Wert zurückkommen, alternativ wird immer ein Fehler gemeldet. Zwischen Frage und Antwort geht das Busy auf true.

Einzige mögliche Ursache/Fehlerquelle ansonsten wäre dass du den/die ADS-Bausteine persistent deklariert hast (das ist ein No-go).

Also... Wie sieht die Sequenz deiner Ein/Ausgangsdaten aus. Und hier meine ich speziell als Eingang den Execute und dann die Ausgänge Busy/Error (mit ErrorID falls Error = TRUE).

Guga
 
Also ich habe gerade mal nachgeschaut. In einem Projekt verwende ich auch diesen Baustein, um Daten zwischen zwei PLC-RT Daten auszutauschen. Das funktioniert tadellos.

Hier mein Code als Beispiel, zyklischer Aufruf, keine Bedingungen:

Code:
fbAdsReadSpeedFA(
    bRead        := NOT fbAdsReadSpeedFA.bBusy, 
    sNetId        := '', 
    nPort        := 852, 
    sVarName    := 'MAIN.AO02', 
    nDestAddr    := ADR(nFaSpeed),
    nLen        := SIZEOF(nFaSpeed), 
    tTimeout    := , 
    eComMode    := E_AdsComMode.eAdsComModeFastCom, 
    bBusy=> , 
    bError=> , 
    nErrorId=> );

Ich vermute, dass Dir möglicherweise der Unterschied zwischen synchroner und asychroner Kommunikation noch nicht klar ist.
Der SPS-Zyklus hält nicht an und wartet auf die Antwort. Du muss den Baustein zyklisch aufrufen, bis Du die Antwort bekommst.
 
Zuletzt bearbeitet:
Zurück
Oben