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

Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 21

Thema: Date_and_Time an FC übergeben.

  1. #11
    Registriert seit
    19.06.2008
    Ort
    Ostalbkreis
    Beiträge
    3.140
    Danke
    201
    Erhielt 553 Danke für 498 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    Date_and_time ist ein zusammengesetzter Datentyp.

    Im Simatic-Manager F1 drücken. "zusammengesetzter Datentypen" eingeben.

    ist recht gut beschrieben
    Angehängte Grafiken Angehängte Grafiken
    • Dateityp: jpg dt.jpg (564,0 KB, 20x aufgerufen)

  2. #12
    Aksels ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    19.02.2005
    Beiträge
    199
    Danke
    12
    Erhielt 8 Danke für 6 Beiträge

    Standard

    @Verpolt: Nach dieser Tabelle könnte ich ja Date_And_Time ganz normal übergeben. Geht aber nicht.
    Larry Laffer meinte das wird als Pointer übergeben.
    Irgendwas stimmt doch dann mit der Tabelle nicht.

    Also muss ich das Ding "abbilden" wie Larry Laffer schreibt.

    Habe deswegen folgendes gemacht:

    Eine Eingangsvariable I_Any vom Typ Any.
    Dort liegt im übergeordneten Baustein die Adresse der Uhrzeit an: DB_Daten.D_UhrzeitDatum im Format date_and_time
    Ohne Symbole: DB100.DBX8.0


    Eine Temporärvariable T_Any vom Typ Any der an Adresse 0 startet.

    Speichere die Eingangs-any in die Temp-any (abbilden):
    Code:
    L     P##I_Any
          LAR1  
    
    
          L     B [AR1,P#0.0]
          T     LB     0
          L     B [AR1,P#1.0]
          T     LB     1
          L     B [AR1,P#2.0]
          T     LB     2
          L     B [AR1,P#3.0]
          T     LB     3
          L     B [AR1,P#4.0]
          T     LB     4
          L     B [AR1,P#5.0]
          T     LB     5
          L     B [AR1,P#6.0]
          T     LB     6
          L     B [AR1,P#7.0]
          T     LB     7
          L     B [AR1,P#8.0]
          T     LB     8
          L     B [AR1,P#9.0]
          T     LB     9
    Klappt prima. Da kommen folgende Bytes vorbei:
    10,2,0,8,0,64,84,0,0,40
    Das ist laut Handbuch
    Db100.DBX8.0 Byte 8

    Prima. Habe ich hiermit in T_Any geschaufelt.
    Jetzt will ich auf die Daten zugreifen die sich dort befinden wo der Pointer hinzeigt.
    Also flugs in AR1 geladen und....


    Code:
    L     P##T_Any
          LAR1  
    
    
          L     B [AR1,P#0.0]
    In der letzten Zeile knallts schon. Beireichsfehler. Aber warum? Wenn ich den ersten Teil beobachte kommt doch meine Adresse der Uhrzeit Byteweise vorbei.


    Gruß,
    Aksels
    Linux is like a Wigwam: no Windows, no Gates and Apache inside.
    Zitieren Zitieren Weia.  

  3. #13
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.745
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    Zitat Zitat von Aksels Beitrag anzeigen
    Guten Tag.

    Nachdem ich das Put/Get-Problem gelöst habe war ich ganz glücklich und dachte mit dem Pointer-Wissen geh ich jetzt an meinen Zeitschaltuhr-PC-Baustein. Und Pustekuchen. Ich komm mir so doof vor! Seid gädig mit mir.

    Ich habe einen IN I_Uhrzeit vom Typ Day_And_Time deklariert.
    Zusätzlich einen Temp T_Uhrzeit Typ Day_And_Time der bei 0 losgeht.
    Nun versuche ich, da die Uhrzeit ja als Pointer übergeben wird diese in den Temp-Bereich zu kopieren.

    Code:
          L     P##I_Uhrzeit
          LAR1  
    
    
          L     B [AR1,P#0.0]
          T     LB     0
          L     B [AR1,P#1.0]
          T     LB     1
          L     B [AR1,P#2.0]
          T     LB     2
          L     B [AR1,P#3.0]
          T     LB     3
          L     B [AR1,P#4.0]
          T     LB     4
          L     B [AR1,P#5.0]
          T     LB     5
    //      L     B [AR1,P#6.0]
    //      T     LB     6
    Bei Byte 6 knallt es mit einem Bereichslängenfehler und zwar schon beim Lesen.
    Eine Date_And_Time hat doch aber 8 Byte?

    Gruß,
    Aksels
    So sollts gehen, mit In-Variable vom Typ DATEANDTIME:

    Code:
      L     P##dtm
          LAR1  
          L     D [AR1,P#0.0]
          T     LD     0
          L     W [AR1,P#4.0]
          T     LW     4
    
          L     LW     0
          U     ==0
          SPB   kDB
          AUF   DB [LW 0]
    kDB:  L     LD     2
          LAR1  
    
    //Sekunden:
          L     B [AR1,P#5.0]
    Du bekommst ja einen Pointer, keinen Any! Ein Pointer hat nur 6 Byte. (Step7 Hilfe, Format des Parametertypes POINTER)
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

  4. #14
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.745
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    Noch als kleine Verbesserung, das es auch mit DI geht:

    Code:
          L     P##dtm
          LAR1  
          L     D [AR1,P#0.0]
          T     LD     0
          L     W [AR1,P#4.0]
          T     LW     4
    
          L     LW     0
          U     ==0
          SPB   kDB
          L     84
          T     LB     2                    //Speicherbereich immer DB, auch bei DI
          AUF   DB [LW 0]
    kDB:  L     LD     2
          LAR1  
    
    //Sekunden:
          L     B [AR1,P#5.0]
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

  5. #15
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.718
    Danke
    398
    Erhielt 2.399 Danke für 1.999 Beiträge

    Standard

    Hallo Axel,
    Sorry ... mein Beitrag war nicht so ganz sauber ...

    Bei Verwendung eines FC bekommst du einen Pointer übergeben, der auf die Adresse zeigt, wo der DT herkommt. Du hast also mit deinen 6 Byte vollkomen Recht. Die korrekte Lösung ist dann so :

    Code:
    L p##myDateTime
    LAR1
    L W [AR1,p#0.0]  // Falls die Quell aus einem DB kommt ...
    T #DB_Nr            // DB_Nr wäre hier eine TEMP-Variable vom Typ WORD
    AUF DB [DB_Nr]    // den ggf. übergebenen DB aufschlagen
    L D [AR1,p#2.0]   // AR1 auf neuen Pointer
    LAR1
     
    // nun hast du im AR1 die Adresse der Quelldaten und kannst hier mit deinem Code weitermachen ...
    Das kommt davon, wenn man (wie in meinem Fall) solche Dinge immer mit FB's macht. Ich bitte nochmals um Entschuldigung und wünsche (nun aber) Viel Erfolg ...

    Gruß
    Larry

    Nachsatz :
    Nach näherem Hinsehen habe ich dann auch noch erkannt, das Jochen so etwas in der Art auch schon gespostet hat.
    Naja ... aber mein Code-Schnipsel ist ja etwas kompakter - von daher hat dann vielleicht trotzdem noch eine Berechtigung ...
    Geändert von Larry Laffer (17.12.2010 um 08:50 Uhr)

  6. #16
    Aksels ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    19.02.2005
    Beiträge
    199
    Danke
    12
    Erhielt 8 Danke für 6 Beiträge

    Standard

    Ich danke Euch allen vielmals. Jetzt habe ich es (hoffentlich endgültig) gefressen. Es funktioniert.
    Aber sagt mal, ich komme mir zwischen Euch immer so unwissend vor. Habt Ihr das alles selber rausgefunden, oder gibt es dafür einen Spezialkurs?

    Andererseits: wie soll jemand, der nur das normale Handbuch zu Step7 gelesen hat darauf kommen, daß Date_and_Time nicht in FCs weitergegeben werden kann?

    Vor allem, da Verpolt ja sogar eine Siemens-Tabelle hervorgezaubert hat, in der drinsteht, daß Date_and_Time mit FCs gehen sollte...

    Naja, ich sehe schon, ich muss noch viel lernen....

    Gruß,
    Aksels
    Linux is like a Wigwam: no Windows, no Gates and Apache inside.
    Zitieren Zitieren Oh Mann!  

  7. #17
    Aksels ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    19.02.2005
    Beiträge
    199
    Danke
    12
    Erhielt 8 Danke für 6 Beiträge

    Standard

    Ich habe nun meine Zeitschaltuhr fertig.
    Wenn ich in die AWL ansicht Umschalte sehe ich immer wieder Zwischenspeicherungen im Code. Warum die nötig sind sei mal dahingestellt (zur FUP-Darstellung vermutlich).
    Aber wo gehen die hin? Beispiel:

    Netzwerk 7
    .....
    = L 24.0

    Meine Temp Variablen hören bei L 23 auf.
    Das bedeutet, die Bausteine benutzen nach Lust und Laune (also je nach Kompliziertheit der FUP-Darstellung) mehr temporären Speicher als auf den ersten Blick ersichtlich?
    Und das kann ich nur mit AWL vermeiden?

    Gruß,
    Aksels

    Hier der Zeitschaltuhr Code zu freien Weiterverwendung (fast alles in FUP).
    Sollte dsd zweite Zeitpaar nicht gebraucht werden einfach mit dem ersten belegen.


    Code:
    FUNCTION "FC_Zeitschaltuhr" : VOID
    TITLE =
    AUTHOR : Aksels
    VERSION : 0.1
    
    
    VAR_INPUT
      E_Mo : BOOL ;    
      E_Di : BOOL ;    
      E_Mi : BOOL ;    
      E_Do : BOOL ;    
      E_Fr : BOOL ;    
      E_Sa : BOOL ;    
      E_So : BOOL ;    
      E_UZ_Von_1 : TIME_OF_DAY ;    
      E_UZ_Bis_1 : TIME_OF_DAY ;    
      E_UZ_Von_2 : TIME_OF_DAY ;    
      E_UZ_Bis_2 : TIME_OF_DAY ;    
      E_ZeitUndDatum : DATE_AND_TIME ;    
    END_VAR
    VAR_OUTPUT
      A_Ein : BOOL ;    
    END_VAR
    VAR_TEMP
      T_I_UZeit : DATE_AND_TIME ;    
      TMPZeit : TIME_OF_DAY ;    
      TMPTag : INT ;    
      T_UZ_Bis_Anpass_1 : TIME_OF_DAY ;    
      T_UZ_Bis_Anpass_2 : TIME_OF_DAY ;    
      T_DBNr : WORD ;    
    END_VAR
    BEGIN
    NETWORK
    TITLE =Date_And_Time kann nicht an FCs direkt übergeben werden.
    //Hier wird die übergebene Zeit in eine temporäre Variable umgespeichert.
    
          L     P##E_ZeitUndDatum; 
          LAR1  ; 
          L     W [AR1,P#0.0]; 
          T     #T_DBNr; 
          AUF   DB [#T_DBNr]; 
          L     D [AR1,P#2.0]; 
          LAR1  ; 
          L     D [AR1,P#0.0]; 
          T     LD     0; 
          L     D [AR1,P#4.0]; 
          T     LD     4; 
    
    
    NETWORK
    TITLE =Zeit Extrahieren
    
          CALL "DT_TOD" (
               IN                       := #T_I_UZeit,
               RET_VAL                  := #TMPZeit);
          NOP   0; 
    NETWORK
    TITLE =Millisekunden Abschneiden
    
          L     #TMPZeit; 
          L     1000; 
          /D    ; 
          T     #TMPZeit; 
          NOP   0; 
    NETWORK
    TITLE =Millisekunden Abschneiden
    
          L     #TMPZeit; 
          L     1000; 
          *D    ; 
          T     #TMPZeit; 
          NOP   0; 
    NETWORK
    TITLE =Tag Extrahieren
    //1 = So 
    //7 = Sa
          CALL "DT_DAY" (
               IN                       := #T_I_UZeit,
               RET_VAL                  := #TMPTag);
          NOP   0; 
    NETWORK
    TITLE =
    //Wenn Aus kleiner Ein und akt Zeit < Ein dann 24 h zu Zeit hinzu
          U(    ; 
          L     #TMPZeit; 
          L     #E_UZ_Von_1; 
          <D    ; 
          )     ; 
          U(    ; 
          L     #E_UZ_Bis_1; 
          L     #E_UZ_Von_1; 
          <D    ; 
          )     ; 
          SPBNB _001; 
          L     #TMPZeit; 
          L     T#1D; 
          +D    ; 
          T     #TMPZeit; 
    _001: NOP   0; 
    NETWORK
    TITLE =
    //Wenn Aus kleiner Ein 24 h zu Aus hinzu
          L     #E_UZ_Bis_1; 
          L     #E_UZ_Von_1; 
          <D    ; 
          =     L     24.0; 
          U     L     24.0; 
          SPBNB _002; 
          L     #E_UZ_Bis_1; 
          L     T#1D; 
          +D    ; 
          T     #T_UZ_Bis_Anpass_1; 
    _002: NOP   0; 
          UN    L     24.0; 
          SPBNB _003; 
          L     #E_UZ_Bis_1; 
          T     #T_UZ_Bis_Anpass_1; 
    _003: NOP   0; 
    NETWORK
    TITLE =
    //Wenn Aus kleiner Ein 24 h zu Aus hinzu
          L     #E_UZ_Bis_2; 
          L     #E_UZ_Von_2; 
          <D    ; 
          =     L     24.0; 
          U     L     24.0; 
          SPBNB _004; 
          L     #E_UZ_Bis_2; 
          L     T#1D; 
          +D    ; 
          T     #T_UZ_Bis_Anpass_2; 
    _004: NOP   0; 
          UN    L     24.0; 
          SPBNB _005; 
          L     #E_UZ_Bis_2; 
          T     #T_UZ_Bis_Anpass_2; 
    _005: NOP   0; 
    NETWORK
    TITLE =Auswertung
    
          U(    ; 
          U     #E_Mo; 
          U(    ; 
          L     #TMPTag; 
          L     2; 
          ==I   ; 
          )     ; 
          O     ; 
          U     #E_Di; 
          U(    ; 
          L     #TMPTag; 
          L     3; 
          ==I   ; 
          )     ; 
          O     ; 
          U     #E_Mi; 
          U(    ; 
          L     #TMPTag; 
          L     4; 
          ==I   ; 
          )     ; 
          O     ; 
          U     #E_Do; 
          U(    ; 
          L     #TMPTag; 
          L     5; 
          ==I   ; 
          )     ; 
          O     ; 
          U     #E_Fr; 
          U(    ; 
          L     #TMPTag; 
          L     6; 
          ==I   ; 
          )     ; 
          O     ; 
          U     #E_Sa; 
          U(    ; 
          L     #TMPTag; 
          L     7; 
          ==I   ; 
          )     ; 
          O     ; 
          U     #E_So; 
          U(    ; 
          L     #TMPTag; 
          L     1; 
          ==I   ; 
          )     ; 
          )     ; 
          U(    ; 
          U(    ; 
          L     #TMPZeit; 
          L     #E_UZ_Von_1; 
          >=D   ; 
          )     ; 
          U(    ; 
          L     #TMPZeit; 
          L     #T_UZ_Bis_Anpass_1; 
          <=D   ; 
          )     ; 
          O     ; 
          U(    ; 
          L     #TMPZeit; 
          L     #E_UZ_Von_2; 
          >=D   ; 
          )     ; 
          U(    ; 
          L     #TMPZeit; 
          L     #T_UZ_Bis_Anpass_2; 
          <=D   ; 
          )     ; 
          )     ; 
          =     #A_Ein; 
    END_FUNCTION
    Linux is like a Wigwam: no Windows, no Gates and Apache inside.
    Zitieren Zitieren Eine Kleine Frage zur AWL Ansicht.  

  8. #18
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.718
    Danke
    398
    Erhielt 2.399 Danke für 1.999 Beiträge

    Standard

    Zitat Zitat von Aksels Beitrag anzeigen
    Aber sagt mal, ich komme mir zwischen Euch immer so unwissend vor. Habt Ihr das alles selber rausgefunden, oder gibt es dafür einen Spezialkurs?
    Also dazu würde ich sagen :
    - ca. 75 % gesunder Auto-Didaktimus
    - ca. 25 % fleissiges Mitlesen (und mitmachen) hier im Forum

  9. #19
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.718
    Danke
    398
    Erhielt 2.399 Danke für 1.999 Beiträge

    Standard

    Zitat Zitat von Aksels Beitrag anzeigen
    Wenn ich in die AWL ansicht Umschalte sehe ich immer wieder Zwischenspeicherungen im Code. Warum die nötig sind sei mal dahingestellt (zur FUP-Darstellung vermutlich).
    ja ... das macht der FUP-Editor. Der bildet sich da Zwischen-Variablen, die dann natürlich nicht korrekt dokumentiert werden.

    Zitat Zitat von Aksels Beitrag anzeigen
    Das bedeutet, die Bausteine benutzen nach Lust und Laune (also je nach Kompliziertheit der FUP-Darstellung) mehr temporären Speicher als auf den ersten Blick ersichtlich?
    Und das kann ich nur mit AWL vermeiden?
    Ja zum "nach Lust und Laune" und Jein zum "nur in AWL vermeiden".
    In AWL kannst du das genauso machen - ist aber eigentlich ein bißchen Selbstmord. Der "gute Programmierer" würde immer eine Variable, die er im Programm verwendet, auch benennen - auch eine Temporäre ...

    Gruß
    Larry

  10. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    Corosop15 (17.12.2010)

  11. #20
    Registriert seit
    19.06.2008
    Ort
    Ostalbkreis
    Beiträge
    3.140
    Danke
    201
    Erhielt 553 Danke für 498 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    @Aksels

    Vor allem, da Verpolt ja sogar eine Siemens-Tabelle hervorgezaubert hat, in der drinsteht, daß Date_and_Time mit FCs gehen sollte...
    Zaubern = F1 im S-Manager.

    "elementare datentypen" eingeben

    "Zulässige Datentypen beim Übergeben von Parametern" auswählen

    voila....

Ähnliche Themen

  1. FC mit Date_And_Time
    Von Heinz2011 im Forum Simatic
    Antworten: 14
    Letzter Beitrag: 07.02.2011, 22:28
  2. WinCC flex Date_and_Time übergeben
    Von Beidendorfer im Forum Simatic
    Antworten: 14
    Letzter Beitrag: 01.09.2008, 15:17
  3. Date_and_time
    Von uz71 im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 31.03.2006, 15:05
  4. Date_And_Time
    Von pm im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 17.01.2005, 12:18
  5. Date_and_time
    Von Anonymous im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 06.10.2003, 16:05

Lesezeichen

Berechtigungen

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