Ergebnis CDT von SFC1 in DB ablegen

rapser

Level-1
Beiträge
48
Reaktionspunkte
6
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Gemeinschaft,

ich habe mir einen FC geschrieben, der hat eine Eingangsvariable open_DB vom Typ BLOCK_DB. In diesem FC soll der SFC 1 aufgerufen werden und mir das Ergbnis (CDT) in den geöffneten DB ab einer bestimmten stelle abspeichern.

in Netzwerk 1 meines FCs steht folgendes:
Code:
AUF #open_DB
Netzwerk 2 sieht wie folgt aus
Code:
CALL  "READ_CLK" //SFC1
       RET_VAL:=DBW6
       CDT    :=[COLOR=Red]P#64.0[/COLOR]
      NOP   0
Leider funktioniert dies nicht. Wie kann ich es machen, dass mir das Date_and_Time ab dem Pointer P#64.0 in meinen geöffneten DB geschrieben wird.

Über eine Hilfe würde ich mich sehr freuen.
 
Hallo,
der Baustein SFC1 erwartet als Eingang einen ANY-Pointer. Den müßtest du erst erstellen und dann daran antragen - oder du nimmst die symbolische Adresse des CDT in deinem DB ... dann wird der ANY-Pointer vom system selbst gebildet ...

Gruß
LL
 
@larry, das mit dem selber gebastelten any geht offs nicht, zumindest bei meinen tests, deswegen schlag auch ich symbolische programmierung vor oder eine SFC1 unabhängige lösung

Code:
*
FUNCTION FC 1710 : VOID
TITLE =READ_CLK
//Funktion zum Lesen und Speichern der Systemzeit im Merker- oder 
//Datenbausteinbereich
//Die Uhrzeit wird fortlaufend ab dem ersten Word am Eingang aDateTime gespeichert
//Jahr,Monat,Tag,Stunde,Minute,Sekunde,Millisekunde,Wochentag
//
//Aufrufbeispiel:
//      CALL  FC     1710
//       anyDateTime   :=#OB1_DATE_TIME
//       anyDestination:=DB1.DBW16
//
//DATE:     09.12.2008
//AUTHOR:   4lagig
//VERSION:  V0.1 BasicVer
AUTHOR : '4lagig'
FAMILY : ClockGF
VERSION : 0.1


VAR_INPUT
  anyDateTime : ANY ;	
  anyDestination : ANY ;	
END_VAR
VAR_TEMP
  dwTempAR1 : DWORD ;	
  dwTempAR2 : DWORD ;	
  xDB : BOOL ;	
  wDB : WORD ;	
  tTimeDateTemp : DATE_AND_TIME ;	
  iLoop : INT ;	
END_VAR
BEGIN
NETWORK
TITLE =

      TAR1  #dwTempAR1; // adressregister
      TAR2  #dwTempAR2; // sichern

      L     P##anyDestination; // ziel prüfen
      LAR1  ; 

      L     W [AR1,P#4.0]; // ob DB
      L     0; 
      <>I   ; 
      SPBN  db2; 
      TAK   ; 
      T     #wDB; 
      SET   ; 
      =     #xDB; 
      SPA   ver; 
db2:  CLR   ; 
      =     #xDB; // oder nicht

ver:  L     D [AR1,P#6.0]; // speicherbereich aus ANY
      LAR1  ; // in AR1

      L     P##anyDateTime; // quelle
      LAR2  ; 
      L     D [AR2,P#6.0]; // adressieren
      LAR2  ; 

      U     #xDB; // wenn DB
      SPB   ver2; // die andere schleife nutzen

      L     6; 
nex1: T     #iLoop; // jahr, monat, tag,
      L     B [AR2,P#0.0]; // stunden, minuten, sekunden
      BTI   ; // in integer wandeln
      T     W [AR1,P#0.0]; // und speichern
      +AR1  P#2.0; 
      +AR2  P#1.0; 
      L     #iLoop; 
      LOOP  nex1; 

      L     W [AR2,P#0.0]; // millisekunden
      SRW   4; // filtern
      BTI   ; 
      T     W [AR1,P#0.0]; // und speichern

      L     W [AR2,P#0.0]; // wochentag
      L     W#16#F; // filtern
      UW    ; 
      BTI   ; 
      T     W [AR1,P#2.0]; // und speichern

      SPA   ver3; 

ver2: AUF   DB [#wDB]; 

      L     6; 
nex2: T     #iLoop; 
      L     B [AR2,P#0.0]; 
      BTI   ; 
      T     DBW [AR1,P#0.0]; 
      +AR1  P#2.0; 
      +AR2  P#1.0; 
      L     #iLoop; 
      LOOP  nex2; 

      L     W [AR2,P#0.0]; 
      SRW   4; 
      BTI   ; 
      T     DBW [AR1,P#0.0]; 

      L     W [AR2,P#0.0]; 
      L     W#16#F; 
      UW    ; 
      BTI   ; 
      T     DBW [AR1,P#2.0]; 

ver3: LAR1  #dwTempAR1; // adressregister zurückspeichern
      LAR2  #dwTempAR2; 

      SET   ; //EN0-handling
      SAVE  ; 
END_FUNCTION
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
vielen dank für deine antwort, doch wie geht das mit dem any-pointer?

kannst du mir das kurz schreiben?


Nach Möglichkeit sollte man immer mit vollqualifizierten Datenzugriff arbeiten also in etwa so:

L DB100.DBW46

Wenn wie in deinem Beispiel Du nur das DBW46 irgendwohin schreibst, dann kannst du dieses wie zu Urzeiten der S5 lange suchen, wenn das gleiche Datenwort in unterschliedlichen Datenbausteinen genutzt wird.

Ein ANY Pointer für den SFC1 sieht so aus:

P#DB100.DBX64.0 Byte 10

Wenn Du Deinen Datenbaustein ab Adresse 64 den Datentyp Date_And_Time verpasst und den DB als Symbol in der Symboltabelle drin hast, dann kannst Du das ganze sogar symbolisch schreiben.

Eine andere Variante wäre den Datentyp im FC zu deklarieren beispielsweise so VarName: Akt_DT Datentyp: DaTe_and_Time
dann schreibst du am SFC1 bei CDT nur #Akt_DT.

Gruß Rolf

EDIT, zu Spät ist schon alles geschrieben.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
:confused: ... auch nicht, wenn du dem ANY den RICHTIGEN Datentyp mitgibst ? Es gibt da auch einen für DT ...

na du bist ja lustig, das seppel sieben guckt doch nicht, wie du den zeiger zusammen gebaut hast.
grundsätzlich: weder ein ANY in form von P#DB100.DBX64 BYTE 10 noch in form von #anyMyZeiger (Typ: ANY) wird vom SFC1 am CDT akzeptiert.

Code:
*
      CALL  "READ_CLK"
       RET_VAL:=MW2
       [I][COLOR="Red"]CDT    :=#myZeiger[/COLOR][/I]

      CALL  "READ_CLK"
       RET_VAL:=MW2
       [I][COLOR="Red"]CDT    :=P#DB100.DBX64.0 Byte 10[/COLOR][/I]
 
Sfc 1

Der SFC 1 erwartet als Ausgang eine Variable von Typ Date and Time.Und für RET_VAL ,INT.

Viele Grüße Bernard
 
rolf, kannst du mir bitte einen screenshot machen, auf dem dieser pointer am sfc1 nicht rot und kursiv ist? würd ich mir gern ausdrucken und in mein büro hängen.


Sorry, war wohl etwas voreilig, Asche auf mein Haupt.
Das kommt davon wenn man einfach aus dem Kopf was runterschreibt ohne den KOP/FUP/AWL-Editor vor augen zu haben.

1. Fehler: Es sind nur 8 und nicht 10 Byte:
2. Fehler: eine direkte Angabe des Any-Pointers ist nicht möglich, es muss ein sauber deklarierter Datentyp sein, entweder als Varibble im FC/FB oder im DB mit dem Datentyp Date_and_Time

Zu meiner Ehrenrettung, mit dem SFC20 ist die direkte Angabe des Anypointers, wie von mir beschrieben möglich. Da ich immer symbolisch über saubere Deklarationen arbeite, fällt mir das jetzt erst auf, dass ich das Bullshit geschrieben habe. Nobody is Perfect

Und hier der Screenshot, dass es trotzdem geht, wie? Rate mal.

Gruß Rolf
 

Anhänge

  • SFC1.jpg
    SFC1.jpg
    50,2 KB · Aufrufe: 57
Zuviel Werbung?
-> Hier kostenlos registrieren
@4L:
OK ... hast Recht ... war nur so eine Annahme.
Dennoch scheint der SFC da ja einen Trick zu verwenden - wie auch immer.
Ich habe es dann mal in SCL reingetickert. Der macht sich das ganz einfach. Der SFC wird per UC aufgerufen und es wird natürlich ein ANY-Pointer übergeben. Wahrscheinlich wäre es so der einzige machbare Weg ...

Gruß
LL
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
ey typ, du erwartest nicht wirklich ein antwort auf diese überprüfung meines wissensstandes, oder?

[edit]
na hui ... diesmal nicht? interessant. dann schließ ich mich larry an.
[/edit]

@vierlagig
Fühlst Du dich auf den Schlips getreten?
Es kann nicht jeder alles wissen, ich nehme mich dabei nicht aus und wenn ich was angezettelt habe dann führe ich es auch zu Ende.

HowTo:
Im angegeben DB den Datentyp anlegen und speichern. anschließend im FC1 den aufruf des SFC1 parametrieren und speichern. Dann den DB1 frech wieder löschen. Thats it. Fies, aber geht.


Es ist mir auch schon aufgefallen dass es solche Konstellationen gibt, dass man was programmiert hat und es funzt. Durch irgendwelche Änderungen stimmen dann die Deklarationen nicht mehr, was nur dadaurch auffällt, dass die symolische Beziehung nicht mehr vorhanden ist sondern so wie im Screenshot aussieht. Sobald man das Teil dann anfasst fällt man auf die Schnauze weil dann der Editor mit roter Farbe und kursivschrift um sich schlägt.

Die Datentypprüfung wird M.E. durch den KOP/FUP/AWL Editor vorgenommen, denn der Any-Pointer ist und bleibt ein Any-Pointer, auch wenn die Deklaration des Adressbereiches nicht mehr da ist.
Siemens gängelt die Programmierer da ein wenig, warum weiß der Geier.

Gruß Rolf
 
achte auf die hervorhebungen in meiner antwort!
mir aufn schlips zu treten dürfte schwer werden ;)

aber warum sollte man das machen, was du da beschreibst? und was sagt eine konsistenzprüfung dazu?

Gut, Du bist kein Schlipsträger, wie es aussieht.

Warum man das machen sollte?

rolf, kannst du mir bitte einen screenshot machen, auf dem dieser pointer am sfc1 nicht rot und kursiv ist? würd ich mir gern ausdrucken und in mein büro hängen.

Damit Du Dir das ausdrucken und in dein Büro hängen kann, das wolltest Du doch:s12:

Bei der Konsistenzprüfung fällt man auf die Nase, das ist klar.

Damit sollte das Thema durch sein, oder?

Gruß Rolf
 
Zurück
Oben