-> Hier kostenlos registrieren
Hallo alle zusammen,
ich habe mal wieder ein kleines Anliegen und hoffe ich bekomme Hilfestellung von euch:
Funktion FC: dient der Steuerung der Profibus/Profinet Antriebe und wurde auf das Standarttelegramm 1 PZD2/2 angepasst. Die Antriebe haben dabei separate DBs.
Über den nutzen von FCs und FBs mit IDBs lässt sich natürlich streiten, nur hier bleibt es beim FC.
Nun soll an einer bestehenden Anlage, die Funktion auf das Telegramm 20 angepasst werden und entsprechend PZD2/6 übergeben/ausgelesen werden.
Daher habe ich in der Funktion unter TEMP folgende Variablen/Strukturen:
[TABLE="width: 500, align: left"]
[TR]
[TD]Name
[/TD]
[TD]Datentyp
[/TD]
[TD]Adresse
[/TD]
[/TR]
[TR]
[TD]E_A_Adresse[/TD]
[TD]DWord[/TD]
[TD]0.0[/TD]
[/TR]
[TR]
[TD]SEND[/TD]
[TD]Struct[/TD]
[TD]4.0[/TD]
[/TR]
[TR]
[TD]REC[/TD]
[TD]Struct[/TD]
[TD]8.0[/TD]
[/TR]
[TR]
[TD]HM_scale_value_setpoint[/TD]
[TD]Real[/TD]
[TD]20.0[/TD]
[/TR]
[TR]
[TD]...[/TD]
[TD]...[/TD]
[TD]...[/TD]
[/TR]
[TR]
[TD]Ziel[/TD]
[TD]Any[/TD]
[TD]48.0[/TD]
[/TR]
[TR]
[TD]Quelle[/TD]
[TD]Any[/TD]
[TD]58.0[/TD]
[/TR]
[/TABLE]
Ursprünglicher COde zum auslesen der Daten der Peripherie:
Hier stellt sich die Frage wie ich mehrere Wörter (6 PZD) empfangen soll,wenn PED nur ein Doppelwort (zwei Wörter) überträgt?!
Ich dachte mir durch die Verwendung von ANY-Pointern könnte ich das etwas besser und variable gestalten, da ich ja somit nur die Länge der Daten ändern muss um den Baustein für weitere Telegramme zu ändern. Anschließend werden mit einem Blockmove die Daten vom Antrieb in den Tempbereich des FC kopiert.
Die Vorlage der Anypointer habe ich hier aus dem Forum und hoffe das ich diese richtig umgeändert habe:
Würde dies funktionieren oder hättet ihr eine bessere Idee zum Auslesen der Daten?
ich habe mal wieder ein kleines Anliegen und hoffe ich bekomme Hilfestellung von euch:
Funktion FC: dient der Steuerung der Profibus/Profinet Antriebe und wurde auf das Standarttelegramm 1 PZD2/2 angepasst. Die Antriebe haben dabei separate DBs.
Über den nutzen von FCs und FBs mit IDBs lässt sich natürlich streiten, nur hier bleibt es beim FC.
Nun soll an einer bestehenden Anlage, die Funktion auf das Telegramm 20 angepasst werden und entsprechend PZD2/6 übergeben/ausgelesen werden.
Daher habe ich in der Funktion unter TEMP folgende Variablen/Strukturen:
[TABLE="width: 500, align: left"]
[TR]
[TD]Name
[/TD]
[TD]Datentyp
[/TD]
[TD]Adresse
[/TD]
[/TR]
[TR]
[TD]E_A_Adresse[/TD]
[TD]DWord[/TD]
[TD]0.0[/TD]
[/TR]
[TR]
[TD]SEND[/TD]
[TD]Struct[/TD]
[TD]4.0[/TD]
[/TR]
[TR]
[TD]REC[/TD]
[TD]Struct[/TD]
[TD]8.0[/TD]
[/TR]
[TR]
[TD]HM_scale_value_setpoint[/TD]
[TD]Real[/TD]
[TD]20.0[/TD]
[/TR]
[TR]
[TD]...[/TD]
[TD]...[/TD]
[TD]...[/TD]
[/TR]
[TR]
[TD]Ziel[/TD]
[TD]Any[/TD]
[TD]48.0[/TD]
[/TR]
[TR]
[TD]Quelle[/TD]
[TD]Any[/TD]
[TD]58.0[/TD]
[/TR]
[/TABLE]
Ursprünglicher COde zum auslesen der Daten der Peripherie:
Code:
L #HW_Konfig_E_A_Adresse // Adresse laut HW-Konfig im Integer-Format
SLD 3 // Konvertierung ins Pointerformat: 3 Stellen nach links schieben
T #Adresse_E_A // Adresse in Doppelwort
Code:
L PED [#Adresse_E_A] // Prozessdaten vom Antrieb empfangen
T LD 8 // Transferiere in das Lokaldaten-Doppelwort LD
Ich dachte mir durch die Verwendung von ANY-Pointern könnte ich das etwas besser und variable gestalten, da ich ja somit nur die Länge der Daten ändern muss um den Baustein für weitere Telegramme zu ändern. Anschließend werden mit einem Blockmove die Daten vom Antrieb in den Tempbereich des FC kopiert.
Die Vorlage der Anypointer habe ich hier aus dem Forum und hoffe das ich diese richtig umgeändert habe:
Code:
L 6 //Anzahl bzw. Länge der Wörter
T #Laenge
// Erstellung des Quell Pointers
L P##Quelle
LAR1 //Lade die Anfangsadresse des ANY-Pointers in AR1
L B#16#10 //S7-code immer b#16#10 = 10hex
T LB [AR1,P#0.0]
L B#16#4 //Datentyp: 04 = WORD
T LB [AR1,P#1.0]
L #Laenge //Länge der Daten bzw. Anzahl/Wiederholfaktor
T LW [AR1,P#2.0]
L 0 //Nummer des DB's, wenn nicht benötigt: 0
T LW [AR1,P#4.0]
L B#16#80 //Auswahl Speicherbereich: 80 = P (Peripherie)
T LB [AR1,P#6.0]
L B#16#0 //Adressbelegung: 0 = 000
T LB [AR1,P#7.0] //Adressformat: Byte.Bit wobei Byte aufgeteilt in Bit0-2 von 7. Byte
L #Adresse_E_A //Adressanfang (Zeiger), hier im Peripherieeingang
SLD 3 //dreimal Shift nach links (in Akku 1) damit Adressformat: .Bit = .0
T LW [AR1,P#8.0] //Adressformat: Byte.Bit wobei Byte in Bit0-7 von 8.Byte
// Erstellung des Ziel Pointers
L P##Ziel
LAR1 //Lade die Anfangsadresse des ANY-Pointers in AR1
L B#16#10 //S7-code immer b#16#10 = 10hex
T LB [AR1,P#0.0]
L B#16#4 //Datentyp: 04 = WORD
T LB [AR1,P#1.0]
L #Laenge //Länge der Daten bzw. Anzahl/Wiederholfaktor
T LW [AR1,P#2.0]
L 0 //DINO liest DBNR aus, wenn nicht benötigt: 0
T LW [AR1,P#4.0]
L B#16#86 //Auswahl Speicherbereich: 86 = Lokaldaten L-Stack
T LB [AR1,P#6.0]
L B#16#0 //Adressbelegung: 0 = 000
T LB [AR1,P#7.0] //Adressformat:Byte.Bit wobei Byte aufgeteilt in Bit0-2 von 7. Byte
L P##REC //relative Adresse/Adressanfang der Struktur (Zeiger)
SLD 8 //8mal Shift DWORD nach links (in Akku 1) damit Bereichskennung ausblenden
SRD 8 //8mal Shift DWORD nach rechts (in Akku 1) damit Bereichskennung ausblenden
SLD 3 //dreimal Shift nach links (in Akku 1) damit Adressformat: .Bit = .0
T LW [AR1,P#8.0] //Adressformat: Byte.Bit wobei Byte in Bit0-7 von 8.Byte
// Wiederherstellen der Adressregister
LAR1 #SaveAR1 //Wiederherstellen des AR1
LAR2 #SaveAR2 //Wiederherstellen des AR2 für Zugriff auf Instanzvariable
CALL "BLKMOV"
SRCBLK :=#Quelle
RET_VAL:=#RET_VAL_BLKMOV
DSTBLK :=#Ziel
NOP 0
Würde dies funktionieren oder hättet ihr eine bessere Idee zum Auslesen der Daten?
Zuletzt bearbeitet: