TIA FB Lokaldaten über Pointer beschreiben

JanB1

Level-2
Beiträge
384
Reaktionspunkte
56
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen

Ich bin irgendwie mit meinem Latein am Ende. Ich habe bereits das Internet durchforstet, aber leider nichts spezifisch zu meiner Frage gefunden.

Ich habe in einem FB 2 Temp-Datenbereiche von je 42 Byte die ich mit einem AT überlagere. DIe ersten 42 Bytes sind im Temp auf Offset 0.0, die zweiten auf 42.0. Ich versuche nun mit einem Pointer auf diese 42 Bytes auf Offset 0 Daten zu schreiben und über die AT-Überlagerung auf die strukturierten Daten zuzugreifen. Aber aus irgend einem Grund kriege ich es nicht hin, dass das schreiben auf die Temp Variable funktioniert.

Ich arbeite mit SCL und schreibe mittels POKE in der Area 16#86 (also Lokaldaten) auf das byteOffset 0 den Wert BYTE#16#01. Das müsste doch so funktionieren, oder hab ich da was falsch intepretiert?
 
Moin,
warum schreibst du die Daten denn nicht symbolisch direkt in deine strukturierte Temp? Warum der Kopfstand mittels Poke und AT-Sichten? Wenn du jetzt x Stunden Zeit in die Fehlersuche investierst, dann lohnt es sich ja vielleicht sein Programm grundsätzlich ein wenig eleganter aufzubauen?
Grundsätzlich als Tipp: Wenn du Bereiche Poken willst, dann brauchst du auch den Poke_BLK.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Howard

Ziel ist es ein GET-Multiplexing aufzubauen damit nicht zu grosse Daten jeweils rübergeschoben werden. Deshalb wird auf dem entfernten DB immer wieder an eine andere Position gezeigt, geschaut ob ein Bit auf TRUE ist und wenn ja ein ganzer Datenbereich gezogen. Deshalb muss ich von dem entfernten DB auf die lokaldaten schreiben, beide Male über einen Pointer.
Ja, die AT Überlagerung brauche ich in diesem Fall wahrscheinlich nicht, das ist mir vorher auch aufgefallen.
Damit ändert sich aber leider nichts an der Ausgangslage dass ich die Daten über einen Pointer in die Temp Variable des Bausteins schreiben will um dann zu prüfen ob das Triggfer-Bit TRUE ist.
 
So ganz habe ich das ehrlich gesagt noch nicht verstanden - vielleicht könntest du mal ein paar Screenshots von den DBs und deinem Code zeigen?
Grundsätzlich kann ich dir für Kommunikation die Bausteine Serialize und Deserialize ans Herz legen. Der Deserialize bspw. kann ein empfangenes Byte oder Char-Array in eine hübsch strukturierte UDT "moven". Wenn es unterschiedliche Ziel-UDTs gibt, kann man sich ggf. ein Case für die unterschiedlichen Deserialize-Aufrufe aufbauen.
 
Also ich verstehe (noch) nicht, warum auf die Strukturen im TEMP per Pointer zugegriffen werden muß. Die lassen sich doch prima symbolisch ansprechen. Kannst Du die Strukturen in TEMP nicht mit dem selben User-Datentyp (UDT) anlegen wie in dem DB? Dann geht auch das Kopieren ganz easy: #MyTempStruct_1 := "MyDB".Struct_x;

Hat Dein FB2 "Standard"-Zugriff? Bei "optimiert" geht POKE nicht, weil der Speicher keine Adressen hat.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also. Ich habe in dem FB einen Aufruf der Funktion "GET". Die Funktion GET muss an den Eingängen für die remote und die lokale Adresse mit einem Pointer versorgt werden.
Meine Funktion GET liest in einem ersten Schritt 1 Word aus einem entfernten Datenbaustein aus und muss dieses Word in einer lokalen Variable ablegen. Dafür ist eine Temp-Variable angedacht.
Nachdem die Daten in die Temp Variable geschrieben wurden lese ich den Zustand der Variable aus und entscheide, ob ich noch mehr Daten holen muss oder ob ich zum nächsten Bereich gehen kann.
Nun möchte ich bei GET über den Pointer "L0.0 WORD 1" auf die lokale Variable verweisen, aber aus irgend einem Grund werden die Daten nicht in die lokale Variable geschrieben.

Baustein ist auf "Standard" Zugriff umgestellt.
 
Du meinst S7-Kommunikation GET? (die liest Daten aus einer anderen SPS)
Bei GET kann an RD_x die lokale Adresse symbolisch angeschaltet werden.
Das sollte aber besser kein Speicherbereich in TEMP sein sondern in STAT, weil der GET länger dauert.
PS: Die empfangenen Daten dürfen nur dann ausgewertet werden, wenn GET mit NDR=1 (New Data Received) den Abschluß des Auftrags signalisiert.

Welche SPS-CPU programmierst Du mit welcher TIA-Version?

Harald
 
Zuletzt bearbeitet:
als eigene Adresse musst du keinen Pointer verwenden - sondern einfach symbolisch einen Speicherbereich und der kann auch eine strukturierte Variable sein.

* da war Harald schneller
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe das jetzt mal so getestet.
Ich habe ein array[0..20] of Word im Static Bereich erstellt und lese mit dem GET 1 Word aus und schreibe es symbolisch in das array[0]. Das funktioniert so und die Funktion beendet die Aktion erfolgreich. Vielen Dank an dieser Stelle! :sm24:


Frage: warum hat das den mit dem Pointer und den Lokalvariablen nicht funktioniert? Ich hab die Variablen sowohl im Temp als auch im Static Bereich definiert und versucht darauf zu schreiben und mit POKE wollte er mir einfach nicht in diese Daten schreiben. Irgend ne Idee?
CPU ist 1511F als Remote und 1513F als Local. TIA ist V16.
Daten werden bei Err übersprungen, nur bei NDR=TRUE ausgewertet.
 
Also ich kann Area = 16#86 in meiner Hilfe (TIA V15.1) nicht finden. Ist das neu in V16? Braucht man dafür ggf. auch die entsprechende Firmware in der CPU?
 
Zurück
Oben