TIA Portal V18: Beispielprogramm zum Auslesen von Diagnosedaten mit SFB52 auf CPU 315-2 PN/DP?

Antwort vom

**Ja: Mit SFB52 `RDREC` kannst du auf der CPU315-2 PN/DP Diagnosedatensätze lesen – entscheidend ist aber, dass `RDREC` asynchron arbeitet. Du musst den Baustein also als kleinen Zustandsautomaten aufrufen; ein einmaliger Call mit `REQ:=TRUE` reicht nicht.** ([support.industry.siemens.com](https://support.industry.siemens.com/cs/attachments/19289930/Von_PROFIBUS_DP_nach_PROFINET_IO_en-US.pdf)) ## Das Wichtigste vorab Für `SFB52` brauchst du immer diese 4 Dinge: - **`ID`** = logische Adresse des Geräts/Moduls, von dem du lesen willst - **`INDEX`** = Datensatznummer des Diagnose-Records - **`MLEN`** = maximale Leselänge - **`RECORD`** = Zielpuffer im DB Bei PROFINET-/DP-Diagnose ist der häufigste Denkfehler: **Nicht die Slotnummer wird direkt übergeben, sondern die adressierte Komponente über `ID`.** Welche Datensätze gültig sind, hängt vom jeweiligen Gerät ab. Siemens nennt für PROFINET-Diagnose z. B. Datensätze wie **`800x`**, **`C00x`**, **`E00x`** oder **`F00x`**; in einem Siemens-Beispiel wird auch **`W#16#800A`** verwendet. ([support.industry.siemens.com](https://support.industry.siemens.com/cs/attachments/24000238/24000238_PROFINET_IO_Diag_V10_e.pdf)) ## Praxisnahes Minimalbeispiel Das hier ist ein einfaches AWL-/SCL-nahes Muster für **zyklisches Lesen in OB1**. Genau so beschreibt Siemens den typischen Einsatz auch für eine CPU315-2 PN/DP: `SFB52` wird zyklisch in OB1 aufgerufen und über `BUSY/VALID/ERROR` ausgewertet. ([support.industry.siemens.com](https://support.industry.siemens.com/cs/attachments/38566021/38566021_NET_topology_SFB52_e.pdf)) ### Beispiel-Datenbaustein ```pascal STRUCT StartRead : BOOL; BusyOld : BOOL; Done : BOOL; Error : BOOL; Status : WORD; Len : INT; Req : BOOL; State : INT; DiagData : ARRAY[0..255] OF BYTE; END_STRUCT ``` ### Beispielaufruf in SCL ```scl CASE DB100.State OF 0: // Warten auf Start DB100.Done := FALSE; DB100.Error := FALSE; IF DB100.StartRead THEN DB100.Req := TRUE; DB100.State := 10; END_IF; 10: // Auftrag starten SFB52( REQ := DB100.Req, ID := W#16#0100, // Beispiel: logische Adresse des Geräts/Moduls INDEX := W#16#800A, // Beispiel-Diagnosedatensatz MLEN := 256, VALID => DB100.Done, BUSY => DB100.BusyOld, ERROR => DB100.Error, STATUS => DB100.Status, LEN => DB100.Len, RECORD := DB100.DiagData ); DB100.Req := FALSE; IF DB100.BusyOld THEN DB100.State := 20; ELSIF DB100.Error THEN DB100.State := 100; ELSIF DB100.Done THEN DB100.State := 100; END_IF; 20: // Warten bis Auftrag fertig SFB52( REQ := FALSE, ID := W#16#0100, INDEX := W#16#800A, MLEN := 256, VALID => DB100.Done, BUSY => DB100.BusyOld, ERROR => DB100.Error, STATUS => DB100.Status, LEN => DB100.Len, RECORD := DB100.DiagData ); IF NOT DB100.BusyOld THEN DB100.State := 100; END_IF; 100: // Ende DB100.StartRead := FALSE; DB100.State := 0; END_CASE; ``` ## Was du anpassen musst ### 1. `ID` richtig wählen Das ist der entscheidende Punkt. `ID` ist **nicht frei erfunden** und auch **nicht einfach die Slotnummer**. Du brauchst die **logische Adresse (LADDR)** der angesprochenen Baugruppe bzw. des IO-Devices. Genau daran scheitern viele RDREC-Beispiele in der Praxis. ([support.industry.siemens.com](https://support.industry.siemens.com/tf/ww/en/post/626175/)) ### 2. `INDEX` passend zum Gerät wählen `W#16#800A` ist nur ein **Beispiel**, kein universeller Diagnose-Index. Siemens weist ausdrücklich darauf hin, dass die nutzbaren Diagnosedatensätze **im Handbuch des jeweiligen Geräts** stehen. Für ET200, SCALANCE oder Fremdgeräte sind die gültigen Records unterschiedlich. ([support.industry.siemens.com](https://support.industry.siemens.com/cs/attachments/19289930/Von_PROFIBUS_DP_nach_PROFINET_IO_en-US.pdf)) ### 3. Puffer groß genug machen Wenn `MLEN := 256`, dann muss `RECORD` auch mindestens 256 Byte aufnehmen können. Sonst liest du formal korrekt, bekommst aber unbrauchbare Ergebnisse oder Fehler. Das nennt Siemens im RDREC-Beispiel ausdrücklich. ([support.industry.siemens.com](https://support.industry.siemens.com/cs/attachments/19289930/Von_PROFIBUS_DP_nach_PROFINET_IO_en-US.pdf)) ## Wichtiger Unterschied: CPU-/Baugruppendiagnose vs. PROFINET-Record Wenn du einfach nur „Diagnosedaten“ willst, gibt es zwei völlig verschiedene Fälle: - **klassische Baugruppendiagnose / Diagnosealarm** eher über OB82, SFC51, SFB54 oder Systemdiagnose - **azyklische Datensätze eines Geräts lesen** genau dafür ist `SFB52 RDREC` gedacht Der praktische Unterschied: **`RDREC` liefert dir Rohdaten eines bestimmten Datensatzes**, nicht automatisch eine schön aufbereitete Fehlermeldung. Du musst die Bytes danach selbst gemäß Gerätehandbuch auswerten. Siemens beschreibt `RDREC` deshalb eher als Werkzeug für detaillierte Diagnose, nicht als fertige Diagnoseanzeige. ([support.industry.siemens.com](https://support.industry.siemens.com/cs/attachments/24000238/24000238_PROFINET_IO_Diag_V10_e.pdf)) ## Eigene Empfehlung für TIA V18 mit CPU315-2 PN/DP Für eine **CPU315-2 PN/DP in TIA V18** würde ich so vorgehen: 1. `SFB52` in **OB1 zyklisch** aufrufen 2. Erst mit einem **bekannten Siemens-Gerät** testen, nicht sofort mit Fremdgerät 3. Zuerst einen **sicher dokumentierten Record** lesen 4. `STATUS`, `LEN` und Rohbytes in einem DB puffern 5. Danach erst die Byte-Struktur dekodieren Der Grund ist simpel: **Wenn `ID` oder `INDEX` falsch sind, sieht es schnell so aus, als ob `SFB52` nicht funktioniert – tatsächlich ist meist nur die Adressierung oder der Datensatz falsch.** Das ist in der Praxis deutlich häufiger als ein echter Programmfehler. ## Konkreter Siemens-Hinweis Siemens zeigt ein sehr ähnliches Muster für die **CPU315-2 PN/DP** in einem Anwendungsbeispiel, bei dem `SFB52` zyklisch in OB1 verwendet wird. Außerdem beschreibt Siemens im PROFINET-Programmierhandbuch die asynchrone Arbeitsweise von `RDREC` und nennt `W#16#800A` als Beispiel für einen Diagnosedatensatz. ([support.industry.siemens.com](https://support.industry.siemens.com/cs/attachments/38566021/38566021_NET_topology_SFB52_e.pdf)) Wenn du es ganz sauber aufbauen willst, ist der beste Primärhinweis die Siemens-Doku zu `RDREC` im PROFINET-Umfeld und das CPU315-2-PN/DP-Beispiel aus dem Siemens-Support. ([support.industry.siemens.com](https://support.industry.siemens.com/cs/attachments/19289930/Von_PROFIBUS_DP_nach_PROFINET_IO_en-US.pdf))