Step 7 Profibus Peripheriestruktur an UDT binden in AWL

vollmi

Level-3
Beiträge
5.436
Reaktionspunkte
1.410
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen

Da ich je länger je konsequenter die Bausteine sauber kapseln will stehe ich jetzt vor was neuem.

Ich habe immerwieder gleichbleibende Profibus/Profinet Knoten. welche ich gerne als Ganzes an einen Baustein übergeben will.

Will heissen ich habe einen Baustein mit der Schnittstelle z.B. wHW_IN. Dort will ich die erste Peripherieadresse anlegen des Knotens anhängen. Ob die nun als P#400 oder w#16#190 da angehängt wird ist erstmal egal. Aber im Baustein will ich dass dann sauber auf einer UDT Struktur auflegen. So das ich nachher im Baustein nur noch mit den Symbolen der Struktur arbeiten kann.

Die UDT Struktur ist z.B. wie der Eingangsbereich des Knotens 20 Byte lang. Wie mach ich das denn am Geschicktesten?

mfG René
 
Hallo René,

ich mache so etwas ähnliches für Frequenzumrichter, Servoachsen, Zählerkarten etc.
Für mich ist das in meiner Überlegungswelt auch praktisch - andere werden dich dafür ggf. auch "in der Luft zerreissen".

Du hast grundsätzlich 3 Möglichkeiten :
- Du übergibst die Adresse als INT und baust dir das intern für den SFC14/15 (o.ä.) um. Hierbei würde dann sowieso deine Struktur die Größe des zu übergebenden Speichers definieren.
- Du übergibst die Adresse als PEB, PEW oder PED in eine Pointer-Variable und arbeitest dann wie schon beschrieben. Der Vorteil hier ist, dass deine Adressierung so wenigstens in der Querverweisen auftaucht.
- Du übergibst das Ganze als ANY-Pointer, den du dann intern entsprechend verarbeitest.

(ich persönlich hatte mich für die erste Variante entschieden)

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke dir. Das mit SFC14 gefällt mir eigentlich am Besten. Querverweise auf diese Bereiche sind nicht nötig da jeweils nur einmal im Programm und ausreichend beschrieben.

Aber wenn ich das nun in PLCsim Lade krieg ich nur den Fehler 8090. Hardware habe ich aber in die Simulation geladen.
Kann es sein das SFC14 nicht korrekt simuliert wird?

mfg René
 
Danke dir. Das mit SFC14 gefällt mir eigentlich am Besten. Querverweise auf diese Bereiche sind nicht nötig da jeweils nur einmal im Programm und ausreichend beschrieben.

Aber wenn ich das nun in PLCsim Lade krieg ich nur den Fehler 8090. Hardware habe ich aber in die Simulation geladen.
Kann es sein das SFC14 nicht korrekt simuliert wird?

mfg René

8090 kann ja drei Gründe haben ... da ich Dir zutraue, die Adresse Hexadezimal angegeben zu haben bleibt die Konsistenz der Daten.
SFC14/15 ist für Byte-Konsistenz z.B. äußerst ungeeignet und zeigt obiges Verhalten ... ist in der GSD-Datei festgelegt...
 
... in dem Fall müßte man sich die Übertragungsroutine als "eigenen Baustein" passend bauen ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
8090 kann ja drei Gründe haben ... da ich Dir zutraue, die Adresse Hexadezimal angegeben zu haben bleibt die Konsistenz der Daten.
SFC14/15 ist für Byte-Konsistenz z.B. äußerst ungeeignet und zeigt obiges Verhalten ... ist in der GSD-Datei festgelegt...

Ja die Hexadresse ist richtig. Rein vom Aufbau des HMS Knotens (keine Konsistenten Inhalte eingefügt) dürfte da ja auch nix passieren.

komisch. Testweise mal auf eine Echte SPS laden.

mfG René
 
Ich habe die SFC 14/15 per SCL nachgebaut nur zum umkopieren.

Code:
FUNCTION PERIN : VOID


VAR_INPUT
  PER_IN : INT;
END_VAR


VAR_IN_OUT
  RECORD : ANY;
END_VAR


VAR_TEMP
laufvariable : INT;
  zwischenany : ANY;
    Recording AT zwischenany : STRUCT
        SyntaxID : BYTE;
        Datentyp : BYTE;
        Laenge : INT;
        db_Nummer : WORD;
        BytePointer : DWORD;
        END_STRUCT;
END_VAR
    
    zwischenany := RECORD;
    
    FOR laufvariable := 0 TO (Recording.Laenge - 1) BY 1 DO
      WORD_TO_BLOCK_DB(Recording.db_Nummer).DB[(DWORD_TO_INT(SHR(IN := SHL(IN := Recording.BytePointer, N := 8), N := 11)) + laufvariable)]
       := EB[(PER_IN + laufvariable)];
    END_FOR;


END_FUNCTION

Das sollte so funktionieren. Dann kann ich die Hardwareadresse auch gleich als Integer angeben.
Würdet ihr hier was anders machen?

mfG René
 
Zuletzt bearbeitet:
Zurück
Oben