Step 7 wie bekomm ich daten in die return variable eines fc?

erzteufele

Level-2
Beiträge
738
Reaktionspunkte
167
Zuviel Werbung?
-> Hier kostenlos registrieren
der titel erzählt schon die ganze geschicht... ich finde nichts in der forum´s suche und in der siemens hilfe auch nicht... grml
habe ich bisher auch nie genutzt wenn ich so darüber nachdenke :D

fakt ist ja der FC hat eine return variable aber wie bestück ich diese ?

danke und grüße erzi
 
In der Variablenliste im Funktionskopf den Typ von Ret_Val festlegen und dann in der Funktion der Variablen einen Wert zuweisen wie sonst auch.

Gruß
Erich
l
 
Zuletzt bearbeitet:
Ausser bei SCL, da wird der Datentyp des Return-Value beim Funktionsnamen definiert. Die Zuweisung erfolgt dann auf den Funktionsnamen.

Siehst du wenn du im SCL-Editor eine Vorlage für eine Funktions einfügst.
 
Siemens selbst macht es doch auch im fc1 aus der iec ad_dt_tm, ich werde nur aus dem code nicht so schlau in diesem baustein wird das adressregister auf die eingelesene variable gelegt und später wieder beschrieben...
 
Bei DATE_AND_TIME ist es manchmal etwas problematisch. Versuch es mal am OUT des Bausteins über rechte Maustaste "Symbol einfügen".
 
Zuviel Werbung?
-> Hier kostenlos registrieren
schon versucht ... das ich den zusammenhängenden datentyp nur per blkmov schieben kann und auch die out adresse in einem fc keine feste adressen hat funktioniert das nicht ...
 
Ich kann es reproduzieren, mit dem SCF20 und dem SFC1. Der RET_VAL wird über "Symbol einfügen" noch nicht einmal angezeigt, interessanterweise kann eine OUT vom Typ DATE_AND_TIME zwar angezeigt und ist auswählbar, bleibt allerdings rot.
 
Du könntest indirek auf die aussen anparametrierte Variable zugreifen.

Code:
      L     P##DatumUhrzeit
      LAR1  

      L     P##RET_VAL
      LAR2  

      L     D [AR1,P#0.0]
      T     D [AR2,P#0.0]

      L     D [AR1,P#4.0]
      T     D [AR2,P#4.0]

EDIT: Sorry, funktioniert so nicht. Habs grad doch noch getestet.
 
Zuletzt bearbeitet:
jetzt aber:

Code:
      L     P##DatumUhrzeit
      LAR1  

      L     P##RET_VAL
      LAR2  
// Bei Speicherbereich DB entsprechenden DB aufschlagen
      L     B [AR2,P#2.0]
      L     B#16#84
      ==I   
      SPBN  aufs
      L     W [AR2,P#0.0]
      T     #tmp_int
      AUF   DB [#tmp_int]

// Adresse laden
aufs: L     D [AR2,P#2.0]
      LAR2  

      L     D [AR1,P#0.0]
      T     D [AR2,P#0.0]

      L     D [AR1,P#4.0]
      T     D [AR2,P#4.0]
 
Funktioniert das auch, wenn an RET_VAL eine TEMP hängt? Eventuell muss dann noch aus B#16#86 (Lokaldaten) B#16#87 (vorherige Lokaldaten) gemacht werden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Aventinus grins das ist der code von siemens ;)
mein fc wird nicht gefüttert mit einem date_time es soll nur eins raus
DatumUhrzeit ist eine temp

2013-11-04_094553.jpg


FUNCTION "DatumUhrzeit" : DATE_AND_TIME
TITLE =
VERSION : 0.1


VAR_INPUT
AutoSommerWinter : BOOL ;
StdPlusZurMEZ : BYTE ;
END_VAR
VAR_TEMP
retval : INT ;
DatumUhrzeit : DATE_AND_TIME ;
Schaltjahr : BYTE ;
Wochentag : BYTE ;
LetzterSonntag : BOOL ;
END_VAR
BEGIN
NETWORK
TITLE =Datum Uhrzeit Auslesen


CALL "READ_CLK" (
RET_VAL := #retval,
CDT := #DatumUhrzeit);

NETWORK
TITLE =Zum Anschauen

U L 9.0;
= L 11.0;
U L 9.1;
= L 11.1;
U L 9.2;
= L 11.2;
U L 9.3;
= L 11.3;

L #Wochentag; //Wochentag 1=Sonntag
NETWORK
TITLE =Plus Stunden Addieren Für MEZ

L LB 5;
L #StdPlusZurMEZ;
+I ;
T LB 5;
NETWORK
TITLE =

U( ;
L LB 4;
L B#16#25;
==I ;
) ;
U( ;
L #Wochentag;
L B#16#1;
<=I ;
) ;
O ;
U( ;
L LB 4;
L B#16#26;
==I ;
) ;
U( ;
L #Wochentag;
L B#16#2;
<=I ;
) ;
O ;
U( ;
L LB 4;
L B#16#27;
==I ;
) ;
U( ;
L #Wochentag;
L B#16#3;
<=I ;
) ;
O ;
U( ;
L LB 4;
L B#16#28;
==I ;
) ;
U( ;
L #Wochentag;
L B#16#4;
<=I ;
) ;
O ;
U( ;
L LB 4;
L B#16#29;
==I ;
) ;
U( ;
L #Wochentag;
L B#16#5;
<=I ;
) ;
O ;
U( ;
L LB 4;
L B#16#30;
==I ;
) ;
U( ;
L #Wochentag;
L B#16#6;
<=I ;
) ;
O ;
U( ;
L LB 4;
L B#16#31;
==I ;
) ;
U( ;
L #Wochentag;
L B#16#1;
>=I ;
) ;
= #LetzterSonntag;
NETWORK
TITLE =Sommerzeit? Letzten So. im März bis zum Letzten So. im Oktober

U #AutoSommerWinter;
U( ;
U #LetzterSonntag;
U( ;
L LB 5;
L B#16#2;
>=I ;
) ;
O( ;
L LB 3;
L B#16#4;
>=I ;
) ;
) ;
U( ;
L LB 3;
L B#16#3;
>=I ;
) ;
U( ;
U( ;
U #LetzterSonntag;
U( ;
L LB 5;
L B#16#3;
>=I ;
) ;
O( ;
L LB 3;
L B#16#11;
>=I ;
) ;
) ;
U( ;
L LB 3;
L B#16#10;
>=I ;
) ;
NOT ;
) ;
SPBNB _001;
L LB 5;
L B#16#1;
+I ;
T LB 5;
_001: NOP 0;
NETWORK
TITLE =Addierte Stunden ins komische Hex



U( ;
U( ;
L LB 5;
L B#16#A;
>=I ;
) ;
U( ;
L LB 5;
L B#16#F;
<=I ;
) ;
O ;
U( ;
L LB 5;
L B#16#1A;
>=I ;


) ;
U( ;
L LB 5;
L B#16#1F;
<=I ;
) ;
) ;
SPBNB _002;
L LB 5;
L 6;
+I ;
T LB 5;
_002: NOP 0;
NETWORK
TITLE =Wenn Stunden Überlauf Stunden von 24 -> 0 und Tag +1

L LB 5;
L B#16#24;
>=I ;
= L 22.0;
U L 22.0;
SPBNB _003;
L LB 5;
L B#16#24;
-I ;
T LB 5;
_003: NOP 0;
U L 22.0;
SPBNB _004;
L LB 4;
L 1;
+I ;
T LB 4;
_004: NOP 0;
NETWORK
TITLE =Addierte Tage ins komische Hex

U( ;
U( ;
L LB 4;
L B#16#A;
>=I ;
) ;
U( ;
L LB 4;
L B#16#F;
<=I ;
) ;
O ;
U( ;
L LB 4;
L B#16#1A;
>=I ;
) ;
U( ;
L LB 4;
L B#16#1F;
<=I ;
) ;
O ;
U( ;
L LB 4;
L B#16#2A;
>=I ;
) ;
U( ;
L LB 4;
L B#16#2F;
<=I ;
) ;
O ;
U( ;
L LB 4;
L B#16#3A;
>=I ;
) ;
U( ;
L LB 4;
L B#16#3F;
<=I ;
) ;
) ;
SPBNB _005;
L LB 4;
L B#16#6;
+I ;
T LB 4;
_005: NOP 0;
NETWORK
TITLE =Monate mit 30 Tagen Überlauf 31 Tag -> Tag auf 1 und Monat +1

U( ;
L LB 4;
L B#16#32;
>=I ;
) ;
U( ;
O( ;
L LB 3;
L B#16#1;
==I ;
) ;
O( ;
L LB 3;
L B#16#3;
==I ;
) ;
O( ;
L LB 3;
L B#16#5;
==I ;
) ;
O( ;
L LB 3;
L B#16#7;
==I ;
) ;
O( ;
L LB 3;
L B#16#8;
==I ;
) ;
O( ;
L LB 3;
L B#16#10;
==I ;
) ;
O( ;
L LB 3;
L B#16#12;
==I ;
) ;
) ;
= L 22.0;
U L 22.0;
SPBNB _006;
L LB 4;
L B#16#31;
-I ;
T LB 4;
_006: NOP 0;
U L 22.0;
SPBNB _007;
L LB 3;
L B#16#1;
+I ;
T LB 3;
_007: NOP 0;
NETWORK
TITLE =Monate mit 31 Tagen Überlauf 32 Tag -> Tag auf 1 und Monat +1

U( ;
L LB 4;
L B#16#31;
>=I ;
) ;
U( ;
O( ;
L LB 3;
L B#16#4;
==I ;
) ;
O( ;
L LB 3;
L B#16#6;
==I ;
) ;
O( ;
L LB 3;
L B#16#9;
==I ;
) ;
O( ;
L LB 3;
L B#16#11;
==I ;
) ;
) ;
= L 22.0;
U L 22.0;
SPBNB _008;
L LB 4;
L B#16#30;
-I ;
T LB 4;
_008: NOP 0;
U L 22.0;
SPBNB _009;
L LB 3;
L B#16#1;
+I ;
T LB 3;
_009: NOP 0;
NETWORK
TITLE =Schaltjahr? Jahreszahl Durch 4 Teilbar=Schaltjahr

L LB 2;
BTI ;
L B#16#4;
MOD ;
T #Schaltjahr;
NOP 0;
NETWORK
TITLE =Monat Februar kein Schaltjahr Überlauf 29 Tag -> Tag auf 1 und M

U( ;
L LB 4;
L B#16#29;
>=I ;
) ;
U( ;
L LB 3;
L B#16#2;
==I ;
) ;
U( ;
L #Schaltjahr;
L B#16#0;
<>I ;
) ;
= L 22.0;
U L 22.0;
SPBNB _00a;
L LB 4;
L B#16#28;
-I ;
T LB 4;
_00a: NOP 0;
U L 22.0;
SPBNB _00b;
L LB 3;
L B#16#1;
+I ;
T LB 3;
_00b: NOP 0;
NETWORK
TITLE =Monat Februar Schaltjahr Überlauf 30 Tag -> Tag auf 1 und Monat

U( ;
L LB 4;
L B#16#30;
>=I ;
) ;
U( ;
L LB 3;
L B#16#2;
==I ;
) ;
U( ;
L #Schaltjahr;
L B#16#0;
==I ;
) ;
= L 22.0;
U L 22.0;
SPBNB _00c;
L LB 4;
L B#16#2F;
-I ;
T LB 4;
_00c: NOP 0;
U L 22.0;
SPBNB _00d;
L LB 3;
L B#16#1;
+I ;
T LB 3;
_00d: NOP 0;
NETWORK
TITLE =Addierter Monat ins komische Hex

U( ;
L LB 3;
L B#16#A;
>=I ;
) ;
U( ;
L LB 3;
L B#16#F;
<=I ;
) ;
SPBNB _00e;
L LB 3;
L B#16#6;
+I ;
T LB 3;
_00e: NOP 0;
NETWORK
TITLE =Überlauf Monat 13 auf 1 und Jahr +1

L LB 3;
L B#16#13;
>=I ;
= L 22.0;
U L 22.0;
SPBNB _00f;
L LB 3;
L B#16#12;
-I ;
T LB 3;
_00f: NOP 0;
U L 22.0;
SPBNB _010;
L LB 2;
L B#16#1;
+I ;
T LB 2;
_010: NOP 0;

NETWORK
TITLE =

L P##RET_VAL;
LAR1 ;

L LD 2;
T D [AR1,P#0.0];

L LD 6;
T D [AR1,P#4.0];


END_FUNCTION
 
Funktioniert das auch, wenn an RET_VAL eine TEMP hängt? Eventuell muss dann noch aus B#16#86 (Lokaldaten) B#16#87 (vorherige Lokaldaten) gemacht werden.
Das sollte auch mit Temp funtktionieren, denn der Speicherberech wird ja an der markierten Stelle mit berücksichtigt:

jetzt aber:

Code:
      L     P##DatumUhrzeit
      LAR1  

      L     P##RET_VAL
      LAR2  
// Bei Speicherbereich DB entsprechenden DB aufschlagen
      L     B [AR2,P#2.0]
      L     B#16#84
      ==I   
      SPBN  aufs
      L     W [AR2,P#0.0]
      T     #tmp_int
      AUF   DB [#tmp_int]

// Adresse laden
aufs: [COLOR=#ff0000]L     D [AR2,P#2.0]
      LAR2  [/COLOR]

      L     D [AR1,P#0.0]
      T     D [AR2,P#0.0]

      L     D [AR1,P#4.0]
      T     D [AR2,P#4.0]

Und innerhalb des aufgerufenen FC´s bezieht sich das ja auf die vorigen Lokaldaten
 
Zuletzt bearbeitet:
Wenn du den Pointer auf die Variable RET_VAL lädst, bekommst du (bei zusammengesetzten Datentypen) einen Pointer auf einen Pointer der der Adresse auf die eigentliche Variable enthält.
Der Aufbau des Pointers entspricht einem Any ab Byte 4, also Datenbausteinnummer im ersten Wort und dann Speicherberich und Adresse.

Das hab ich mir rausgedröselt, den entsprechenden DB geöffnet und die Adresse in AR2 geschrieben.
 
Zurück
Oben