Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: Ergebnis CDT von SFC1 in DB ablegen

  1. #1
    Registriert seit
    03.02.2009
    Beiträge
    48
    Danke
    1
    Erhielt 6 Danke für 2 Beiträge

    Standard


    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    :=P#64.0
          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.
    MfG
    rapser
    Zitieren Zitieren Ergebnis CDT von SFC1 in DB ablegen  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.401 Danke für 2.001 Beiträge

    Standard

    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

  3. #3
    rapser ist offline Benutzer
    Themenstarter
    Registriert seit
    03.02.2009
    Beiträge
    48
    Danke
    1
    Erhielt 6 Danke für 2 Beiträge

    Standard

    vielen dank für deine antwort, doch wie geht das mit dem any-pointer?

    kannst du mir das kurz schreiben?
    MfG
    rapser

  4. #4
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.401 Danke für 2.001 Beiträge

    Standard

    na klar ... dafür haben wir etwas Schönes in der FAQ : siehe hier

  5. #5
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    @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
    Geändert von vierlagig (16.02.2010 um 11:55 Uhr)
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  6. #6
    Registriert seit
    18.10.2007
    Beiträge
    127
    Danke
    1
    Erhielt 15 Danke für 13 Beiträge

    Standard

    Zitat Zitat von rapser Beitrag anzeigen
    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.

  7. #7
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    Zitat Zitat von R.Blum Beitrag anzeigen
    Ein ANY Pointer für den SFC1 sieht so aus:

    P#DB100.DBX64.0 Byte 10
    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.
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  8. #8
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.401 Danke für 2.001 Beiträge

    Standard

    Zitat Zitat von vierlagig Beitrag anzeigen
    @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
    ... auch nicht, wenn du dem ANY den RICHTIGEN Datentyp mitgibst ? Es gibt da auch einen für DT ...

  9. #9
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    ... 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
           CDT    :=#myZeiger
    
          CALL  "READ_CLK"
           RET_VAL:=MW2
           CDT    :=P#DB100.DBX64.0 Byte 10
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  10. #10
    Registriert seit
    28.01.2009
    Ort
    Hamburg
    Beiträge
    199
    Danke
    52
    Erhielt 54 Danke für 34 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Der SFC 1 erwartet als Ausgang eine Variable von Typ Date and Time.Und für RET_VAL ,INT.

    Viele Grüße Bernard
    Zitieren Zitieren Sfc 1  

Ähnliche Themen

  1. Ergebnis aus 2 PT1-Gliedern?
    Von Poldi007 im Forum Simatic
    Antworten: 0
    Letzter Beitrag: 01.08.2011, 09:01
  2. Antworten: 3
    Letzter Beitrag: 13.02.2011, 22:33
  3. Antworten: 14
    Letzter Beitrag: 08.02.2011, 14:39
  4. Richtiges Ergebnis? (libnodave & C#)
    Von rebbi im Forum Hochsprachen - OPC
    Antworten: 5
    Letzter Beitrag: 27.12.2009, 22:36
  5. Antworten: 6
    Letzter Beitrag: 07.03.2007, 14:28

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •