FC mit Date_And_Time

Heinz2011

Level-1
Beiträge
23
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
ich habe mir 2 FC erstellt wie auf dieser Seite beschrieben:
https://support.automation.siemens....lib.csinfo&lang=de&objid=21222026&caller=view

Also bei mir FC2 zum Lesen und FC3 zum Schreiben der Uhrzeit in db100

allerding Funktioniert nur der FC2

FC3 schreibt irgend wie nicht die Uhrzeit in die CPU

Die Daten schreibe ich in DB100, lesen aktiviere ich mit e124.6
schreiben mit e124.7

hier die 2 Quellen der FC2 und FC3, DB100 und OB1 Aufruf (AWL-Quelle):
CPU ist denk ich net so wichtig - ist eine 313C V2.0
Woran liegt das ?


****************************FC2************
FUNCTION "DT_VAR" : VOID
TITLE =
VERSION : 0.1

VAR_OUTPUT
Jahre : BYTE ;
Monate : BYTE ;
Tage : BYTE ;
Stunden : BYTE ;
Minuten : BYTE ;
Sekunden : BYTE ;
Millisekunden : WORD ;
Wochentag : BYTE ;
END_VAR
VAR_TEMP
DT_IN : DATE_AND_TIME ;
SFC1error : INT ;
END_VAR
BEGIN
NETWORK
TITLE =
CALL "READ_CLK" (
RET_VAL := #SFC1error,
CDT := #DT_IN);

NETWORK
TITLE =
LAR1 P##DT_IN;
L B [AR1,P#0.0];
T #Jahre;
L B [AR1,P#1.0];
T #Monate;
L B [AR1,P#2.0];
T #Tage;
L B [AR1,P#3.0];
T #Stunden;
L B [AR1,P#4.0];
T #Minuten;
L B [AR1,P#5.0];
T #Sekunden;
L W#16#FFF0;
L W [AR1,P#6.0];
UW ;
T #Millisekunden;
L B#16#F;
L B [AR1,P#7.0];
UW ;
T #Wochentag;
CLR ;
END_FUNCTION

****************************FC3************
FUNCTION "VAR_DT" : VOID
TITLE =
VERSION : 0.1

VAR_INPUT
S_Jahre : BYTE ;
S_Monate : BYTE ;
S_Tage : BYTE ;
S_Stunden : BYTE ;
S_Minuten : BYTE ;
S_Sekunden : BYTE ;
S_Millisekunden : WORD ;
S_Wochentag : BYTE ;
END_VAR
VAR_TEMP
dt_out : DATE_AND_TIME ;
SFC0error : INT ;
END_VAR
BEGIN
NETWORK
TITLE =
LAR1 P##dt_out;
L #S_Jahre;
T B [AR1,P#0.0];
L #S_Monate;
T B [AR1,P#1.0];
L #S_Tage;
T B [AR1,P#2.0];
L #S_Stunden;
T B [AR1,P#3.0];
L #S_Minuten;
T B [AR1,P#4.0];
L #S_Sekunden;
T B [AR1,P#5.0];
L #S_Wochentag;
T B [AR1,P#7.0];
CALL "SET_CLK" (
PDT := #dt_out,
RET_VAL := #SFC0error);

END_FUNCTION

****************************DB100************
DATA_BLOCK "DatumUhrzeit"
TITLE =
VERSION : 0.1

STRUCT
Jahre : BYTE ; //Jahre
Monate : BYTE ; //Monate
Tage : BYTE ; //Tage
Stunden : BYTE ; //Stunden
Minuten : BYTE ; //Minuten
Sekunden : BYTE ; //Sekunden
Millisekunden : WORD ; //Millisekunden
Wochentag : BYTE ; //Wochentag
Stellen : BYTE ; //Reserve Byte
S_Jahre : BYTE ; //Stellen Jahre
S_Monate : BYTE ; //Stellen Monate
S_Tage : BYTE ; //Stellen Tage
S_Stunden : BYTE ; //Stellen Stunden
S_Minuten : BYTE ; //Stellen Minuten
S_Sekunden : BYTE ; //Stellen Sekunde
S_Millisekunden : WORD ; //Stellen Millisekunden
S_Wochentag : BYTE ; //Stellen Wochentag
END_STRUCT ;
BEGIN
Jahre := B#16#0;
Monate := B#16#0;
Tage := B#16#0;
Stunden := B#16#0;
Minuten := B#16#0;
Sekunden := B#16#0;
Millisekunden := W#16#0;
Wochentag := B#16#0;
Stellen := B#16#0;
S_Jahre := B#16#0;
S_Monate := B#16#0;
S_Tage := B#16#0;
S_Stunden := B#16#0;
S_Minuten := B#16#0;
S_Sekunden := B#16#0;
S_Millisekunden := W#16#0;
S_Wochentag := B#16#0;
END_DATA_BLOCK


****************************OB1 AUfruf************
NETWORK
TITLE =
U E 124.6;
SPBNB _001;
CALL "DT_VAR" (
Jahre := "DatumUhrzeit".Jahre,
Monate := "DatumUhrzeit".Monate,
Tage := "DatumUhrzeit".Tage,
Stunden := "DatumUhrzeit".Stunden,
Minuten := "DatumUhrzeit".Minuten,
Sekunden := "DatumUhrzeit".Sekunden,
Millisekunden := "DatumUhrzeit".Millisekunden,
Wochentag := "DatumUhrzeit".Wochentag);

_001: NOP 0;
NETWORK
TITLE =
U E 124.7;
SPBNB _002;
CALL "VAR_DT" (
S_Jahre := "DatumUhrzeit".S_Jahre,
S_Monate := "DatumUhrzeit".S_Monate,
S_Tage := "DatumUhrzeit".S_Tage,
S_Stunden := "DatumUhrzeit".S_Stunden,
S_Minuten := "DatumUhrzeit".S_Minuten,
S_Sekunden := "DatumUhrzeit".S_Sekunden,
S_Millisekunden := "DatumUhrzeit".S_Millisekunden,
S_Wochentag := "DatumUhrzeit".S_Wochentag);
_002: NOP 0;
 
Hi,

wie werden die Zahlen vorgegeben? BCD oder Dezimal?

So wie es ist muss es in BCD angegeben werden also z.B. B#16#12 für eine 12.

Gruss Daniel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
vorgegeben sind die zahlen als byte , so wie die felder dafür in db100 angelegt sind,
also fc2 lesen der uhrzeit und in db100 ablegen funktioniert
nur eben fc3 schreiben, also daten aus db100 holen und mit fc3 in die cpu uhr schreiben funktioniert eben nicht

ist eigentlich im awl-code siehe oben ersichtlich...
 
nochmal kürzer:
fc2:
CALL "READ_CLK"
RET_VAL:=#SFC1error
CDT :=#DT_IN
LAR1 P##DT_IN
L B [AR1,P#0.0]
T #Jahre
L B [AR1,P#1.0]
T #Monate
L B [AR1,P#2.0]
T #Tage
L B [AR1,P#3.0]
T #Stunden
L B [AR1,P#4.0]
T #Minuten
L B [AR1,P#5.0]
T #Sekunden
L W#16#FFF0
L W [AR1,P#6.0]
UW
T #Millisekunden
L B#16#F
L B [AR1,P#7.0]
UW
T #Wochentag
CLR
------------------------------------------
und dann noch fc3:
------------------------------------------
LAR1 P##dt_out
L #S_Jahre
T B [AR1,P#0.0]
L #S_Monate
T B [AR1,P#1.0]
L #S_Tage
T B [AR1,P#2.0]
L #S_Stunden
T B [AR1,P#3.0]
L #S_Minuten
T B [AR1,P#4.0]
L #S_Sekunden
T B [AR1,P#5.0]
L #S_Wochentag
T B [AR1,P#7.0]
CALL "SET_CLK"
PDT :=#dt_out
RET_VAL:=#SFC0error
 
Was gibt SET_CLK als RET_VAL (was steht in #SFC0error)?

2 Kleinigkeiten würde ich noch hinzufügen und dann mal schauen:
Code:
//OB1
U E 124.7; 
[COLOR="Blue"][B]FP M 10.0 ;[/B][/COLOR]
SPBNB _002; 
CALL "VAR_DT" (
//...
Code:
//FC3

L #S_Sekunden; 
T B [AR1,P#5.0]; 
[COLOR="blue"][B]L 0 ;
T B [AR1,P#6.0];[/B][/COLOR] 
L #S_Wochentag; 
T B [AR1,P#7.0];

Harald
 
ok das mit code hab ich nun verstanden.

also nochmal siehe siemens seite..
zu fc3 glaub ich hab den fehler
ar1 wird ja nicht mehr dt_out zugewiesen also ändert sich dt_out nichtmehr

aber wie mache ich das dann ?
kann ich ar1 das nun als Date_And_Time formatiert ist irgendwie in eine variable schreiben oder direkt in den sfc0 ?

(OB1 Aufruf hab ich auch geändert mit P-Flanke)

Code:
  LAR1  P##dt_out
      L     #S_Jahre
      T     B [AR1,P#0.0]
      L     #S_Monate
      T     B [AR1,P#1.0]
      L     #S_Tage
      T     B [AR1,P#2.0]
      L     #S_Stunden
      T     B [AR1,P#3.0]
      L     #S_Minuten
      T     B [AR1,P#4.0]
      L     #S_Sekunden
      T     B [AR1,P#5.0]
      L     0
      T     B [AR1,P#6.0]
      L     #S_Wochentag
      T     B [AR1,P#7.0]
          CALL  "SET_CLK"
       PDT    :=#dt_out
       RET_VAL:=#SFC0error
 
Zuletzt bearbeitet:
AR1 ist ein Adressregister und enthält z.B. die Adresse, an welcher eine Variable beginnt. Welchen Variablentyp diese Variable hat ist dem AR1 herzlich egal. Mit "LAR1 P##dt_out" weist Du dem AR1 die Anfangsadresse von #dt_out zu. Wenn #dt_out eine Date_and_Time-Variable in TEMP ist, dann müßte Dein FC3 funktionieren.
Wo oder Was ist Dein Problem?
Wenn die Uhrzeit nicht gestellt wird nochmal meine Frage: Was gibt SET_CLK als RET_VAL aus (was steht in #SFC0error)? Tip: zum Testen den RET_VAL auf ein Merkerwort legen.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich kann jetzt so ad-hoc auch keinen Fehler erkennen.
Ich würde also gerne die Frage von Daniel noch einmal aufgreifen :
wie werden die Zahlen vorgegeben? BCD oder Dezimal?

So wie es ist muss es in BCD angegeben werden also z.B. B#16#12 für eine 12.
... das wurde für mich nämlich nicht brauchbar beantwortet - würde aber ggf. das Verhalten erklären ...

Gruß
Larry
 
Also die Zahlen werden in bytes vorgegeben dezimal
und der retval den ich bekomme ist wenn ich mir das mw in einer vat ansehe w#16#8080

ups ich habs wohl überlesen das bcd gefordert wurde
das probier ich dann nochmal..aber ich hatte im db alles 0 drinstehen und dies wurde nicht an die uhr übertragen

ups x2 ich vermute mal das 0 an alle variablen die uhr/datum nicht annimmt..das sollte ich wohl mit zahlen füllen

ich probier das gleich mal...ich danke Euch
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

ja BCD.

also für ein INT muss es 4 Stellen nach rechts geschoben und zum Schluss mit BTI gewandelt werden.
Vorraussetzung ist natürlich ein INT also ein WORD da eine Ziffer BCD 4 Bits benötigt und in ms bis 999 gehen.

Gruss Daniel
 
also sind die Millisekunden

zb
9990 (BCD)
4 stellen nach rechts
srw 4 oder geht auch /10 ? kann man mit bcd direkt rechen ?
= 999
dann bti
der Typ INT ist ja ein WORD
wenn ich das richtig verstanden habe

Code:
      L     W [AR1,P#6.0]
      L     W#16#FFF0
      UW    
      BTD   (oder BTI ?)
      L     10
      /D    
      T     #INT_Millisekunden

dann doch lieber ohne die UW
Code:
L     W [AR1,P#6.0]
      SRW   4
      BTI   
      T     #Millisekunden
 
Zuletzt bearbeitet:
Zurück
Oben