S7 DP Slave Daten über SFC 14 bzw. 15 an Any Pointer übergeben

TheBadFrog

Level-1
Beiträge
12
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi arbeite gerade an einem FB in dem von einem DP Slave über SFC 14 bzw. 15 jeweils 10 Byte Daten gelesen und geschrieben werden sollen!

Bin mir mit der Byteoffset nicht sicher.

Ist der Rest so OK?:confused:

//konsistent vom PAE einlesen(SFC 14)

CALL "DPRD_DAT" // Aufruf zur konsistenten Datenübertragung
LADDR :=#InputAdr // Eingangs-Byteaddresse

RET_VAL:=#Error
RECORD :=#InputData // Zeiger auf Ziel



LAR1 P##InputData // Adr. des Any-Pointer in AR1
T W [AR1,P#2.0] // Wiederholungsfaktor (10 Byte)


L W#16#1002 // Kennung Typ Any / Datentyp Byte
T W [AR1,P#0.0] // in Zielpointer eintragen

L DINO // Instanzdatenbausteinnummer (DIB) laden
T W [AR1,P#4.0] // und in Zielpointer eintragen

TAR2 // Basisadresse im Instanz-DB in den Akku holen
L DW#16#???? // Byteoffset ausmaskieren
UD
L P##Ablage // Adresse Zieldatenbereich laden
+D // Byteoffset addieren

T D [AR1,P#6.0] // Pointer auf Zieldatenbereich im Any-P eintragen

Ich will vom SFC 14 die Daten (10Byte 2 Byte Status und 8 Byte Nutzdaten) in die Ablage kopieren,
wobei ich Input Data im FB als Any Pointer angelegt habe.Ablage ist ein Array
Leider scheint im oberen Programmteil etwas nicht OK zu sein, die Datenbytes erscheinen leider nicht in meinem Programm !
Die 2 Bytes Status bzw. Control muss ich dann noch auflösen!
Byte 1, da benoötige ich die einzelnen Bits
Byte 2 sind die Sende bzw. Empfangsdatenlänge
 
Zuletzt bearbeitet:
hi,

ich glaub du machst das viel zu kompliziert.
Wofür soll der ANY-Pointer denn genau sein. Überflüssig.

Normalerweise kannst du dein Array direkt an die SFC ranhängen.

Micha
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi ja du hast schon Recht, aber Vorgabe ist folgendes..........

Der FB wickelt die Kommunikation zu einer seriellen Schnittstelle ab.
Sende DB, Empfangs DB (wo der Anwender die Daten später zum versenden ablegt, bzw abholt sollen von außen anparametrierbar sein.
Genauso die Bytelänge und Hardwareadresse des SFC´s (geht schon)!
Beim Empfang werden alle Datenbytes in einen Ringpuffer gepackt, beim Senden werden diese vom Anwender/Programm in einen DB(Array) gepackt und von dort werden sie von der Scheibe "Häppchen" für "Häppchen" verschickt!
Du würdest also im FB die Daten gleich in ein Array packen?
Beim Senden wie beim Empfangen muss ich aus dem (Byte 1) Control bzw. status Bytes die nötigen "Handshake bits auswerten und und aus dem Byte 2 die Empfangslänge bzw. Sendelänge des Moduls)
Da die E/A Breite nur 8 Byte sind muss ich auf beiden Wegen (über eine Schleife die Empfangen Daten/bzw. zu Senden Daten zusammenbauen. bzw. häppchenweise verschicken........

Bei mir wären die Daten nun vom SFC über den Any Pointer ins AR1 von dort in die Ablage(Array) und dann von da je nach Datenlänge (eines einzelnen Telegrammes ab Byte 2 (Nutzdaten fangen da an) in den Empfangs DB als Ringpuffer..........mit Schreibzeiger.......

Habe mir auch schon überlegt vom SFC die Daten in ein UDT zu speichern, könnte dann symbolisch drauf zugreifen.
 
je mehr ich drüber nachdenke, um so unklarer wird mir das Ganze.

Ich habe noch nie einen Profibusslave gehabt, der seinen Datenbereich ändert.
Das geht doch gar nicht.
Oder soll die Parametrierung von Projekt zu Projekt geändert werden können?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja, es wird wohl noch weitere HW entwickelt...........

Aber momentan arbeite ich an deiner Idee.........
Habe am SFC 14 nun eine Temp variable angelegt...........
die besteht aus den Bits des 1. Statusbytes und einem Array das die Längenangabe der empfangenBytes angibt und dem Nutzdatenarray......

Überlege mir gerade einen Ablauf der die Anzahl der empfangenen Bytes aus dem Byte 2 entnimmt, die Daten über eine Schleife in einen DB ukopiert und dann ein Handshakebit ausgibt.......(Daten übernommen, Modul kann neue Daten senden..........)
 
das Problem ist doch, das du deine Ablage (Array oder UDT oder was auch immer) nicht dynamisch erweitern kannst.

Ansonsten ist im Anhang mal ein Beispiel wie ich das mache.
Es ist aber fix auf einen FU PPO5 zugeschnitten.
Da ist nix variabel.

In der Quelle habe ich Code gelöscht, aber es sollte klar sein, wie ich Daten auslese und danach darauf zugreife bzw. das Sende-Array beschreibe und dann abschicke.

Micha
 

Anhänge

  • Aufruf.JPG
    Aufruf.JPG
    137,7 KB · Aufrufe: 56
  • Hardware.JPG
    Hardware.JPG
    183,8 KB · Aufrufe: 37
  • Beispiel.AWL.txt
    8,7 KB · Aufrufe: 75
Zurück
Oben