SCL: Lokaldaten des Vorgängerbausteins (87h)

vierlagig

Level-1
Beiträge
9.882
Reaktionspunkte
2.021
Zuviel Werbung?
-> Hier kostenlos registrieren
bezugnehmend auf: http://sps-forum.de/showpost.php?p=262452&postcount=86

wiederhole ich meine Bitte:

jetzt brauch ich nur noch nen SCL-guru, der mir erklärt, wie ich in SCL auf die lokaldaten des vorgängerbausteins zugreifen kann, damit aus der quelle wieder ein any werden kann...

konkret: der IN-ANY verweist auf die Lokaldaten des aufrufenden Bausteins. Wie kann ich auf diese Daten zugreifen?
 
Hallo 4L,
um dir helfen zu können (vielleicht) müsste ich doch erstmal verstehen, was du machen willst - ich habe es nämlich (auch) nicht verstanden ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo 4L,
um dir helfen zu können (vielleicht) müsste ich doch erstmal verstehen, was du machen willst - ich habe es nämlich (auch) nicht verstanden ...

Gruß
LL

irgendwie geht mir das bei all meinen fragen so... und irgendwann verlaufen sie im sand... so richtig aktiv geholfen wurde mir hier zumindest (fast) noch nie...

anyway. ich probier es noch mal.

funktionalität des bausteines ist klar? date_and_time in 8 word zerlegen und beginnend bei dem word, welches an anyDestination übergeben wird ablegen.
nun habe ich im AWL-baustein ( http://sps-forum.de/showpost.php?p=262292&postcount=74 ) die quelle auch als any übergeben. bei SCL mußte ich die quelle als DATE_AND_TIME übergeben.

a) wie kann ich anyInput so verarbeiten, dass ich auf die verwiesenen daten zugreifen kann, wenn es sich um lokaldaten der aufrufenden bausteins (z.b. OB1) handelt? (den rest kann ich mir ja ähnlich, wie ich es bei anyDestination gemacht habe, zusammen zerlegen...)
b) kann es sein, dass mein AWL-baustein nur mit lokaldaten funktioniert? (rhethorische frage, das find ich noch selber raus ;) )
 
Hallo 4L,
ich versuche mich mal daran ...

Vielleicht ganz grundsätzlich : viele der vielleicht liebgewonnenen Dinge, die in AWL gehen sind in SCL nicht oder nur mit Umweg umsetztbar. Dazu gehört auch der Zugriff auf Lokaldaten. Eine absolute Adressierung ist nur im Bereich der "echten" Speicherbereiche möglich. Willst du an irgendwelche anderen Sachen ran, so hilft dir oft nur der Umweg über die Sicht (AT). Hier werden dadurch natürlich auch viele Dinge vereinfacht. Das zerlegen eines (ANY-)Pointers, eines Strings oder einer zusammengesetzten Variable (wie DATE_TIME) ist hier gar kein Problem. Du müßtest es dir nicht einmal zwischenpuffern.

Das Beispiel für DATE_TIME ginge z.B. sinnvoll so :
Code:
FUNCTION FC430 : TOD                  // UP DT nach TOD umwandeln
Title   = 'UP DT nach TOD umwandeln'  // UP DT nach TOD umwandeln
AUTHOR  : 'Larry'
VERSION : '1.0'     //    18.01.2008

//     Bausteinparameter

VAR_INPUT 
   IN_Date_Time : DT ;                 // Date_and_Time für Umwandlung 
      b_Date_Time AT IN_Date_Time : ARRAY [0..7] OF BYTE ;
END_VAR
VAR_IN_OUT 
END_VAR
VAR_OUTPUT
END_VAR
VAR_TEMP
   Stunde            : INT ;
   Minute            : INT ;
   Sekunde           : INT ;
   MilliSekunden     : INT ;
   MilliSekunden_E   : INT ;
   tByte             : BYTE ;
END_VAR
 
BEGIN
  Stunde  := BCD_TO_INT (b_Date_Time [3]) ;
  Minute  := BCD_TO_INT (b_Date_Time [4]) ;
  Sekunde := BCD_TO_INT (b_Date_Time [5]) ;
  
  MilliSekunden_E := WORD_TO_INT (SHR (IN:=INT_TO_WORD (BCD_TO_INT (b_Date_Time [7])) , n:=4)) ;
  MilliSekunden   := (BCD_TO_INT (b_Date_Time [6]) *10) + MilliSekunden_E ;
  FC430  := DINT_TO_TOD(INT_TO_DINT(MilliSekunden) + (INT_TO_DINT(Sekunde) + INT_TO_DINT(Minute)*60 + INT_TO_DINT(Stunde)*3600) * 1000) ;
    
END_FUNCTION
... das ist einer der Bausteine, den ich so im Einsatz habe ...

irgendwie geht mir das bei all meinen fragen so... und irgendwann verlaufen sie im sand... so richtig aktiv geholfen wurde mir hier zumindest (fast) noch nie...
Das Schicksal teile ich auch sehr oft ... trotzdem ergeben sich auch aus nicht in meinem Sinne beantworteten Threads im Nachhinein immer noch irgendwelche Inspirationen.

Ich hoffe nicht, dass es dir jetzt mit diesem Thread genauso ergeht.
Bewegen wir uns in die richtige Richtung ? Sonst bitte eine Kurskorrektur eingeben ...

Gruß
LL
 
Also ich glaube fast dass es in SCL nicht geht.
Und zwar weil es in SCL keinen Dereferenzierungsoperator für einen ANY gibt. Die einzige Möglichkeit in SCL an die Daten zu gelangen auf die ein Any-Pointer zeigt, ist das Aufrufen einer anderen Funktion wie z.B. BLKMOV. Wenn ich diesem aber als Bereichskennung "Vorgänger Lokaldaten" mitteile, sind das für den Baustein dann letztendlich die Lokaldaten meines Bausteins.

Um sowas umzusetzen fehlt dann etwas wie "Inline-AWL" (gibt in C ja auch Inline-Assembler).
 
Warum verwendest du keine Durchgangsvariable VAR_IN_OUT?
Dann kannst du dir die Pointergeschichte sparen, arbeitest mit normalen Datentypen (auch UDT) und der Compiler soll sich um die ganze Pointerei kümmern.
 
Also ich glaube fast dass es in SCL nicht geht.
Und zwar weil es in SCL keinen Dereferenzierungsoperator für einen ANY gibt. Die einzige Möglichkeit in SCL an die Daten zu gelangen auf die ein Any-Pointer zeigt, ist das Aufrufen einer anderen Funktion wie z.B. BLKMOV. Wenn ich diesem aber als Bereichskennung "Vorgänger Lokaldaten" mitteile, sind das für den Baustein dann letztendlich die Lokaldaten meines Bausteins.

Um sowas umzusetzen fehlt dann etwas wie "Inline-AWL" (gibt in C ja auch Inline-Assembler).

funktioniert, nach meinen bisherigen erkenntnissen in diesem fall, auch nicht mit BLKMOV ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
funktioniert, nach meinen bisherigen erkenntnissen in diesem fall, auch nicht mit BLKMOV ...

Hatte ich auch so gemeint dass es mit BLKMOV nicht funktioniert, und letztendlich auch mit allen anderen unterlagerten FCs.

Code:
OB1 <-Vorgänger Lokaldaten-< FC1500 <-Vorgänger Lokaldaten-< BLKMOV
Um von BLKMOV auf die Lokaldaten von OB1 zuzugreifen bräuchte man die hypothetische Bereichskennung "Vor-Vorgänger Lokaldaten".
 
Ich steh da noch etwas auf dem Schlauch, wozu brauchst du Zugriff auf die Lokaldaten des Vor-Vorgänger bausteins?

Was versteht ihr unter Lokaldaten, Tempvariablen?


Ich frage nur so blöde sachen, weil ich bisher auch in Umfangreichen Programmen (alles in SCL) noch nie das Bedürfniss hatte, über irgendwelche Pointer auf Lokaldaten des Vorgängers zuzugreiffen. Wenn ich auf die Daten vom Aufrufenden Baustein schreiben will, mach ich das über OUT oder IN_OUT Variablen...
Dabei ist nur etwas vorsicht geboten, weil Temp-Variablen nicht über mehrere Bausteinaufrufe gültigkeit haben, ich glaub als IN_OUT kann ich einen Temp nur einem Baustein weiterleiten, danach verliert die Variable an Gültigkeit und ich muss ev. umkopieren!!
 
Zuletzt bearbeitet:
Dabei ist nur etwas vorsicht geboten, weil Temp-Variablen nicht über mehrere Bausteinaufrufe gültigkeit haben, ich glaub als IN_OUT kann ich einen Temp nur einem Baustein weiterleiten, danach verliert die Variable an Gültigkeit und ich muss ev. umkopieren!!

Und genau da liegt das Problem das 4l hat (glaub ich zumindest ;-) ).
Weil man als Funktionsparameter in SCL eben an einen Anypointer keine Lokaldaten eintragen darf (darf schon, aber damit kommt man nicht weiter), wenn man den Anypointer im eigenen Baustein dereferenzieren möchte, also auf die Daten auf die der Anypointer zeigt zugreifen möchte. In AWL geht das, in SCL jedoch nicht, da es in der Sprache zumindest zum jetzigen Wissensstand nur über einen weiteren Baustein wie BLKMOV möglich ist, auf die ANY-Daten zuzugreifen.

Das ist das Problem was du beim Durchreichen von Temp-Variablen kennst, nur dass es in SCL schon eine Verschachtelungsebene früher auftritt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
kann mal bitte einer ein Beispiel posten, wo ein Baustein seine Lokaldaten verliert????

Das glaub ich erst wenn ich es gesehen habe.

Ich kann eine Temporärvariable an 100 Bausteine als IN/OUT weitergeben und da steht immer der korrekte Wert drin.

Man muss nur die Verschachtelungstiefe beachten.
Aber da komm ich eh nicht hin.

Den Speicherbedarf deckt der OB. Das kann man sogar einstellen...
Zumindest bei 400ern.
 
Hab das jetzt nich ausprobiert, aber das sollte so nicht gehen:


Code:
//---------------------------------------------------------------
FUNCTION "fcMyFunction2" : void

VAR_IN_OUT
    D_nMyInt    :INT;
END_VAR

VAR_TEMP
    T_nIrgendwas :INT;
END_VAR

BEGIN
    
    //Nur so zum Spass
    T_nIrgendwas := 4;
    
    //Inc
    D_nMyInt := D_nMyInt + 1;

END_FUNCTION

//---------------------------------------------------------------
FUNCTION "fcMyFunction1" : void

VAR_IN_OUT
    D_nMyInt    :INT;
END_VAR

VAR_TEMP
    T_nIrgendwas :INT;
END_VAR

BEGIN
    
    //Nur so zum Spass
    T_nIrgendwas := 6;

    //Call Funtion 2
    "fcMyFunction2"(D_nMyInt := D_nMyInt);

END_FUNCTION

//---------------------------------------------------------------
ORGANISATION_BLOCK "obCycle" 

VAR_TEMP
    T_nMyInt    :INT;
END_VAR

BEGIN
    
    T_nMyInt := 1; //INIT

    "fcMyFunction1"(D_nMyInt := T_nMyInt);

    T_nMyInt := T_nMyInt; //Debug: Zum beobachten, sollte 2 sein...

END_FUNCTION

Eigentlich sollte als Ergebnis im OB1 die Variable T_nMyInt zum Schluss =2 sein, ist sie aber eben vielleicht nicht!

Hab das ganze jetzt nicht ausprobiert...
 
Ev. geht's mit den IN_OUT doch, nur nicht mit dem Datentyp Pointer. Wenn IN_OUT schlussendlich aber auch nur ein Pointer ist.

Das glaub ich erst wenn ich es gesehen habe.

Ich kann eine Temporärvariable an 100 Bausteine als IN/OUT weitergeben und da steht immer der korrekte Wert drin.

http://support.automation.siemens.com/WW/adsearch/resultset.aspx?region=WW&lang=de&netmode=internet&ui=NDAwMDAxNwAA&term=scl+handbuch&ID=5581793&ehbid=5581793&docid=5581928

--> Seite 7-17:

Einschränkungen
• Der Datentyp POINTER ist für formale Eingangsparameter,
Durchgangsparameter von FB und FC und für Ausgangsparameter von FC
erlaubt. Konstanten sind als Aktualparameter nicht zulässig (mit Ausnahme er
Konstanten NIL).
• Wenn Sie beim Aufruf eines FB oder FC einen Formalparameter vom Typ
POINTER mit einer temporären Variable versorgen, können Sie diesen
Parameter nicht an einen weiteren Baustein durchreichen. Die temporären
Variablen verlieren beim Durchreichen ihre Gültigkeit.
 
Zurück
Oben