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

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

Thema: Indirekte Versorgung FC1 Add DT Time

  1. #1
    Registriert seit
    02.12.2008
    Beiträge
    58
    Danke
    35
    Erhielt 4 Danke für 3 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    wie wird der Ret_Val Parameter hier (Date_and_Time) von aussen versorgt?

    Code:
          CALL  "AD_DT_TM"
           T      :=#CDT
           D      :=#Zeitversch
           RET_VAL:=#CPU_Zeit
    Muss man hier mit einem Hilfszeiger arbeiten ?
    Zitieren Zitieren Indirekte Versorgung FC1 Add DT Time  

  2. #2
    Registriert seit
    20.06.2003
    Ort
    Sauerland.NRW.Deutschland
    Beiträge
    4.849
    Danke
    78
    Erhielt 800 Danke für 543 Beiträge

    Standard

    du musst in einem db ein var vom typ date_and_time anlegen

    am retval sieht das dann so aus
    "DB_DT".dt_add
    .
    mfg Volker .......... .. alles wird gut ..

    =>Meine Homepage .. direkt zum Download

    Meine Definition von TIA: Total Inakzeptable Applikation

  3. Folgender Benutzer sagt Danke zu volker für den nützlichen Beitrag:

    roadrunner (30.05.2011)

  4. #3
    Registriert seit
    17.05.2010
    Ort
    Paderborn
    Beiträge
    824
    Danke
    84
    Erhielt 125 Danke für 94 Beiträge

    Standard

    Das "Date_and_Time"-Format besteht aus 8 Byte, Du jedoch nur max. 4 Byte (= 1 Doppelwort) direkt adressieren. Alle längeren Formate müssen über Hilfszeiger indirekt adressiert werden. In Deinem Fall bedeutet das einen Hilfszeiger vom Typ Date_and_Time anlegen. Wenn Du diesen bauteinübergreifend kopieren willst kannst Du, z. B. eine Variable vom Typ "Date_and_Time" in einem DB anlegen.
    Grüße
    Michael

    1001101110110100... Das ist meine Welt

  5. #4
    Registriert seit
    02.12.2008
    Beiträge
    58
    Danke
    35
    Erhielt 4 Danke für 3 Beiträge

    Standard

    @ volker

    Hallo,

    so hab ich es im Moment.

    Der Aufruf von diesem FC1 befindet sich in einem FC.

    Wegen der Wiederverwendbarkeit möchte ich dem FC einen Parameter übergeben für den RET_VAL Parameter vom Typ DT.

    Da der Parameter aber ein "zusammengesetzer Typ" ist geht das nicht direkt, oder?

    Gruß
    roadrunner

  6. #5
    Registriert seit
    17.05.2010
    Ort
    Paderborn
    Beiträge
    824
    Danke
    84
    Erhielt 125 Danke für 94 Beiträge

    Standard

    Beim Aufruf im FC, wird das nicht akzeptiert, nimm einen FB und es funktioniert.
    Grüße
    Michael

    1001101110110100... Das ist meine Welt

  7. Folgender Benutzer sagt Danke zu MCerv für den nützlichen Beitrag:

    roadrunner (30.05.2011)

  8. #6
    Registriert seit
    02.12.2008
    Beiträge
    58
    Danke
    35
    Erhielt 4 Danke für 3 Beiträge

    Standard

    Vielen Dank,

    FB funktioniert.

    Habe aber auch den FC mit Hilfszeigern probiert.

    Code:
         CALL  "AD_DT_TM"
           T      :=#CDT(DT)
           D      :=#Zeitversch(Time)
           RET_VAL:=#CPU_Zeit(DT)
     
          TAR1  #tmp_AR1
          TAR2  #tmp_AR2
     
          L     P##systemzeit (Var_Input Typ any)
          LAR1
      
          L     P##tmp(Temp Variable Typ any)
          LAR2  
          L     D [AR1,P#0.0]
          T     LD [AR2,P#0.0]
          L     D [AR1,P#4.0]
          T     LD [AR2,P#4.0]
          L     W [AR1,P#8.0]
          T     LW [AR2,P#8.0]
     
          LAR1  #tmp_AR1
          LAR2  #tmp_AR2
     
          CALL  "BLKMOV"
           SRCBLK :=#CPU_Zeit(DT)
           RET_VAL:=#rv
           DSTBLK :=#tmp(Temp any)
    Es funktioniert aber nur mit any als Input Variable, nicht mit DT.

    Kann mir jemand erklären woran das liegt?

    gruß
    roadrunner

  9. #7
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.163
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Zitat Zitat von roadrunner Beitrag anzeigen
    Es funktioniert aber nur mit any als Input Variable, nicht mit DT.

    Kann mir jemand erklären woran das liegt?
    DATE_AND_TIME (DT) wird bei FC als 6-Byte-POINTER übergeben.

    Hier mal ein Beispiel, wie man in einem FC DATE_AND_TIME-Parameter von IN nach TEMP und von TEMP nach OUT kopiert (blaue Schrift).
    Außerdem der Aufruf des "AD_DT_TM" mit TEMP-DATE_AND_TIME.
    (hier FC50)
    Code:
    FUNCTION "BT_LT_3" : VOID
    TITLE =BT_LT_3: Convert base time to local time (Summertime/Wintertime)
    //Ersatz für FC61 BT_LT aus der S7-Standard-Library auf S7-300, die keinen 
    //Uhrzeitstatus besitzen (Im Uhrzeitstatus der CPU sind die Basiszeit sowie 
    //die für den jeweiligen Ort geltende Zeitzone, eine Sommerzeit-Kennung sowie 
    //eine Kennung für die Ankündigungsstunde hinterlegt und werden von der CPU 
    //aktualisiert.) BT_LT_3 benutzt keinen Regel-DB.
    //
    //Typisches Szenario:
    //Eine S7-300-CPU besitzt keinen Uhrzeitstatus, die CPU-Uhr ist nach der lokalen 
    //Normalzeit (Winterzeit) gestellt und ggf. nach NTP-Verfahren synchronisiert.
    //BT_LT_3 ermittelt, ob der am Eingang BT angegebene Zeitpunkt in der Sommerzeit 
    //liegt und gibt am Ausgang LT die ggf. als Sommerzeit korrigierte lokale Uhrzeit 
    //aus. BT muß ein gültiges DATE_AND_TIME inkl. Wochentag sein.
    //
    //BT_LT_3 berücksichtigt keine Zeitzone, sondern nur den Uhrzeit-Versatz in 
    //der Sommerzeit. Die Sommerzeit gilt vom letzten Sonntag im März 02:00 BT 
    //bis zum letzten Sonntag im Oktober 02:00 BT (03:00 ST).
    //BT_LT_3 benutzt intern die folgende Funktion der S7-Standard-Library – 
    //IEC Function Blocks: FC(1) AD_DT_TM
    AUTHOR : PN_DP
    FAMILY : TIMEFUNC
    NAME : BT_LT_3
    VERSION : 1.0
    
    VAR_INPUT
      BT : DATE_AND_TIME ;       //Basiszeit (z.B. CPU-Clock)
    END_VAR
    VAR_OUTPUT
      LT : DATE_AND_TIME ;       //Lokalzeit
      SUMMER : BOOL ;            //Sommerzeitkennung (0: Winter / 1: Sommer)
    END_VAR
    VAR_TEMP
      AR1_Save : DWORD ;
      AR2_Save : DWORD ;
      tmpBT : DATE_AND_TIME ;
      tmpLT : DATE_AND_TIME ;
      DB_No : INT ;
      LT_Offset : TIME ;
      March : BOOL ;
    END_VAR
    BEGIN
    NETWORK
    TITLE =Basiszeit von IN-Aktualparameter BT in TEMP kopieren
    //DATE_AND_TIME (DT) wird bei FC als 6-Byte-POINTER übergeben und kann nicht 
    //direkt weitergereicht werden. Deshalb IN.BT nach TEMP umkopieren.
    
    //Adressregister sichern
          TAR1  #AR1_Save;
          TAR2  #AR2_Save;
    
    //Pointer auf IN-Aktualparameter BT erstellen
          L     P##BT;             // Adresse IN.BT
          LAR1  ;
          L     W [AR1,P#0.0];     // POINTER.DB_Nr
          T     #DB_No;
          L     D [AR1,P#2.0];     // POINTER.Bereichsadresse
          LAR1  ;                  // AR1: Adresse des IN-DT
          LAR2  P##tmpBT;          // AR2: Adresse des TEMP-DT
    
    //DATE_AND_TIME (8 Byte) BT von IN nach TEMP kopieren
          AUF   DB [#DB_No];
          L     D [AR1,P#0.0];
          T     LD [AR2,P#0.0];
          L     D [AR1,P#4.0];
          T     LD [AR2,P#4.0];
    
    NETWORK
    TITLE =Ermitteln ob Sommerzeit ist und Lokalzeit berechnen
    //Die Sommerzeit gilt vom letzten Sonntag im März 02:00 BT 
    //bis zum letzten Sonntag im Oktober 02:00 BT (03:00 ST)
    
    //AR2: Pointer auf tmpBT
    
    //Der letzte Sonntag im März bzw. Oktober kann auf 25. bis 31. fallen
    //vor 25.03. ist Winterzeit
          L     LW [AR2,P#1.0];    // tmpBT.Monat (BCD) + Tag (BCD)
          L     DW#16#325;         // vor 25.03. ist WZ
          <I    ;
          SPB   WINZ;
    
    //nach 31.10. ist Winterzeit
          POP   ;                  // tmpBT.Monat (BCD) + Tag (BCD)
          L     W#16#1031;         // nach 31.10. ist WZ
          >I    ;
          SPB   WINZ;
    
    //nach 31.03. (= 01.04.) bis vor 25.10. (= 24.10.) ist Sommerzeit
          POP   ;                  // tmpBT.Monat (BCD) + Tag (BCD)
          L     W#16#331;          // bis 31.03. Umschaltwoche zu SZ
          <=I   ;
          =     #March;            // Umschaltwoche WZ zu SZ
          SPB   SPEZ;
    
          POP   ;                  // tmpBT.Monat (BCD) + Tag (BCD)
          L     W#16#1025;         // bis vor 25.10. ist SZ
          <I    ;
          SPB   SOMZ;
    
    //hier nur noch 25.03.-31.03. und 25.10.-31.10.
    //letzter Sonntag ?
    SPEZ: L     LB [AR2,P#7.0];    // tmpBT.Wochentag 1=So ... 7=Sa
          UW    W#16#F;            // nur Bits .0-.3 (4 LSB)
          L     B#16#1;
          -I    ;                  // WoT: 0=So, 1=Mo, ... 6=Sa
          SPZ   SONN;              // jetzt ist der Umschalt-Sonntag
    //Akku1: Wochentag 0=So ... 6=Sa
          L     LB [AR2,P#2.0];    // tmpBT.Tag (BCD)
          BTI   ;                  // Tag (INT)
          TAK   ;                  // Akku1: WoT, Akku2: Tag
          -I    ;
    //Ergebnis 19..24 sind Tage vor Umschalt-Sonntag
          L     25;
          <I    ;
          SPBN  NACH;
    
    //Vor Umschalt-Tag bzw. -Uhrzeit
    VOR:  U     #March;
          SPB   WINZ;              // März: noch ist Winterzeit
          SPA   SOMZ;              // Okt.: noch ist Sommerzeit
    
    //Nach Umschalt-Tag bzw. -Uhrzeit
    NACH: U     #March;
          SPB   SOMZ;              // März: nun ist Sommerzeit
          SPA   WINZ;              // Okt.: nun ist Winterzeit
    
    //es ist jetzt der Umschalt-Sonntag
    SONN: L     LB [AR2,P#3.0];    // tmpBT.Stunde (BCD)
          L     B#16#2;            // vor 02:00 Uhr?
          <I    ;
          SPB   VOR;
          SPA   NACH;
    
    //Signalisierung Sommerzeit oder Winterzeit
    SOMZ: S     #SUMMER;
          L     T#1H;              // 1 Stunde Zeitdifferenz SZ-WZ
          SPA   TLTO;
    
    WINZ: R     #SUMMER;
          L     T#0MS;             // Winterzeit ist Basiszeit
    
    TLTO: T     #LT_Offset;
    
    //Lokalzeit berechnen
          CALL "AD_DT_TM" (
               T       := #tmpBT,
               D       := #LT_Offset,
               RET_VAL := #tmpLT);
    
    NETWORK
    TITLE =Lokalzeit von TEMP in OUT-Aktualparameter LT kopieren
    //DATE_AND_TIME (DT) wird bei FC als 6-Byte-POINTER übergeben, OUT kann nicht 
    //direkt von anderen FC beschrieben werden. Deshalb mit TEMP-Kopie arbeiten.
    
    //Pointer auf OUT-Aktualparameter LT erstellen
          L     P##LT;             // Adresse OUT.LT
          LAR1  ;
          L     W [AR1,P#0.0];     // POINTER.DB_Nr
          T     #DB_No;
          L     D [AR1,P#2.0];     // POINTER.Bereichsadresse
          LAR1  ;                  // AR1: Adresse des OUT-DT
          LAR2  P##tmpLT;          // AR2: Adresse des TEMP-DT
    
    //DATE_AND_TIME (8 Byte) LT von TEMP nach OUT kopieren
          AUF   DB [#DB_No];
          L     LD [AR2,P#0.0];
          T     D [AR1,P#0.0];
          L     LD [AR2,P#4.0];
          T     D [AR1,P#4.0];
    
    //Adressregister wiederherstellen + BIE/ENO auf TRUE setzen
          LAR1  #AR1_Save;
          LAR2  #AR2_Save;
          SET   ;
          SAVE  ;
    
    END_FUNCTION
    Hier ein typischer Aufruf des Bausteins im OB1:
    Code:
    //copy current local date and time to OP-areapointer
          CALL  "BT_LT_3"                                 //FC50
           BT    :=#OB1_DATE_TIME
           LT    :="PLC->OP".AreaPointerDtPLC.DateTimePLC //P#DB102.DBX0.0 BYTE 8
           SUMMER:="Summertime"                           //M1.7
    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet
    Zitieren Zitieren In FC DATE_AND_TIME-Parameter von IN nach TEMP und von TEMP nach OUT kopieren  

  10. Folgende 4 Benutzer sagen Danke zu PN/DP für den nützlichen Beitrag:

    roadrunner (31.05.2011),ron (13.08.2012),RONIN (19.02.2016),vita-2002 (15.07.2011)

  11. #8
    Registriert seit
    02.12.2008
    Beiträge
    58
    Danke
    35
    Erhielt 4 Danke für 3 Beiträge

    Standard

    Vielen Dank,

    das funktioniert natürlich

    Ist meine Version weiter oben mit SFC20 BLKMOV und any so weit auch richtig?

    Gruß
    roadrunner

  12. #9
    Registriert seit
    17.05.2010
    Ort
    Paderborn
    Beiträge
    824
    Danke
    84
    Erhielt 125 Danke für 94 Beiträge

    Standard

    ich habs nicht im Detail geprüft, aber grundsätzlich funktioniert es mit dem BlockMove, der verschiebt ja nur und es ist ihm egal was darin steht!

    Warum nimmst Du keinen FB und machst daraus eine Multiinstanz? Das wäre doch viel einfacher und übersichtlicher.
    Grüße
    Michael

    1001101110110100... Das ist meine Welt

  13. #10
    Registriert seit
    02.12.2008
    Beiträge
    58
    Danke
    35
    Erhielt 4 Danke für 3 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von MCerv Beitrag anzeigen
    ich habs nicht im Detail geprüft, aber grundsätzlich funktioniert es mit dem BlockMove, der verschiebt ja nur und es ist ihm egal was darin steht!

    Warum nimmst Du keinen FB und machst daraus eine Multiinstanz? Das wäre doch viel einfacher und übersichtlicher.
    Das mit dem FB hab ich wie von dir oben vorgeschlagen schon getestet, funktioniert einwandfrei.
    Es ging mir nur um die Verständnisfrage wie das auch mit einem FC klappen könnte.

    Wie PN/DP geschrieben hat, funktionierte diese Version auch.

    Vielen Dank an alle für die Informationen.

    Gruß
    roadrunner

Ähnliche Themen

  1. Antworten: 0
    Letzter Beitrag: 22.10.2010, 13:55
  2. Versorgung vor und nach Steuerspanung EIN
    Von hafed im Forum Schaltschrankbau
    Antworten: 1
    Letzter Beitrag: 17.07.2009, 17:27
  3. Analogeingang 10V Versorgung
    Von Placidjam im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 25.06.2009, 09:55
  4. 230V Versorgung - Trenntrafo - Frankreich
    Von knorpe im Forum Schaltschrankbau
    Antworten: 13
    Letzter Beitrag: 08.06.2009, 20:52
  5. Antworten: 15
    Letzter Beitrag: 06.06.2007, 08:54

Lesezeichen

Berechtigungen

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