Step 7 SCL - Verschachtelung von UDT

DiGo1969

Level-2
Beiträge
139
Reaktionspunkte
10
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin an Alle,
ich habe ein Problem bei Programmieren und verschachteln von UDT.

Bevor ich mein Problem erkläre möchte ich erst mal erklären, warum ich das mit UDT programmiere und nicht einen FB mit Instanz-DB schreibe: Wenn ich zum Beispiel eine Drehwächterbaustein nehme hätte ich jedes mal einen Instanz-DB und bei 50 Drehwächter gefällt mir das nicht mehr. Deswegen habe ich angefangen mein Gedächtnis (die Instanz-Daten) als UDT über IN_OUT zu übergeben und habe alles ordentlich Strukturiert in einem Datenbaustein.
Das soll aber bitte nicht Bestandteil meiner Forum-Frage werden.

Nun zu meinem Problem:
UDT Timer:
Code:
TYPE UDT_TimerSE
    STRUCT
        Zykluszeit_HM:  DINT;
        Puls:  BOOL;
        Puls_HM:  BOOL;
    END_STRUCT
END_TYPE

Auszug aus dem FC TimerSE
Code:
FUNCTION TimerSE_DG: VOID

VAR_IN_OUT
    UDT_Timer: UDT_TimerSE;
END_VAR

UDT 2 (Lagertemperatur)
Code:
TYPE UDT_Lagertemperatur
    STRUCT
        Temperatur:  REAL;
        Timer_1:  UDT_TimerSE;
    END_STRUCT
END_TYPE



Und hier ist mein Problem: Parameterzuweisung nicht korrekt
Code:
FUNCTION Lagertemperatur: VOID

VAR_IN_OUT
    UDT_Lagertemperatur:  UDT_Lagertemperatur;
END_VAR
.
.
.
TimerSE_DG(iStart:= Start
  ,iZykluszeit:= SPS_Zykluszeit_intern
  ,iVerzoegerung:= Zeit_1
  ,OUT:= HM_Bool
  ,Restlaufzeit:= HM_DINT
  ,UDT_Timer:= UDT_Lagertemperatur.Timer_1);  //hier springt der Compiler hin

Was mache ich hier bei dem UDT-Aufruf falsch? Oder geht das vielleicht nicht so wie ich das hier vor habe?

Vielen Dank schon mal im Voraus!
MfG Dirk
 
Hallo,
also erstmal weiß ich nicht so recht, ob das hinterger wirklich noch "ordentlich strukturiert" und/oder übersichtlich ist. Von nachvollziehbar mal ganz abgesehen ... aber das ist hier ja nicht unser Thema (eher deins - irgendwann mal).

Ist denn vor Aufrufruf deines FC "Lagertemperatur" sichergestellt, dass dem UDT_Lagertemperatur in dessen Unterbereich UDT_TimerSE überhaupt sinnvolle Daten übergeben worden sind ?
Das wird aber nicht dein Problem sein.
Das Problem aus meiner Sicht ist, dass der FC "TimerSE_DG" in diesem Fall auf Daten zugreifen muss, die Siemens so nicht mehr adressieren kann (es gibt nur Lokaldaten und Vorgänger-Lokaldaten - für den FC wären das aber Vor-Vorgänger-Lokaldaten).
Du müßtest also vor dem Aufruf des FC "TimerSE_DG" den Auszug aus dem Datenbereich UDT_Lagertemperatur in einen lokalen Bereich des Typs UDT_TimerSE umkopieren und diesen dann dem FC übergeben.
Dann wird es wohl funktionieren ... 8)

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
warum ich das mit UDT programmiere und nicht einen FB mit Instanz-DB schreibe: Wenn ich zum Beispiel eine Drehwächterbaustein nehme hätte ich jedes mal einen Instanz-DB und bei 50 Drehwächter gefällt mir das nicht mehr.
Du könntest den FB als Multiinstanz instanziieren, dann brauchst Du im besten Fall nur 1 Instanz-DB.


Komplexe IN/OUT/IN_OUT-Parameter können nicht direkt an weitere Bausteinaufrufe durchgereicht werden, sondern müssen vorher nach TEMP umkopiert werden und die lokale Kopie kann weitergereicht werden.

Harald
 
Hallo,

Du könntest den FB als Multiinstanz instanziieren, dann brauchst Du im besten Fall nur 1 Instanz-DB.
Multiinstanz ist auch nicht so toll, denn dann habe ich keine direkte Zuordnung mehr und das passt auch nicht in die komplette Struktur meiner Programme




Komplexe IN/OUT/IN_OUT-Parameter können nicht direkt an weitere Bausteinaufrufe durchgereicht werden, sondern müssen vorher nach TEMP umkopiert werden und die lokale Kopie kann weitergereicht werden.
Danke!! Das habe ich mir leider schon gedacht. Naja dann muss ich mal ein bissel rumprobieren, wie ich das jetzt mache.


Vielen Dank!
Dirk
 
Zurück
Oben