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

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 21

Thema: Date_and_Time an FC übergeben.

  1. #1
    Registriert seit
    19.02.2005
    Beiträge
    199
    Danke
    12
    Erhielt 8 Danke für 6 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Leute,
    ich habe eine Wochenschaltuhr als FB programmiert.
    Funktioniert super.
    Nun habe ich festgestellt, daß ich gar keine Stat Variablen benutze.
    Um keinen InstanzDB deklarieren zu müssen, habe ich den ganzen Code und alle Variablen in einen FC kopiert.
    Ich kann aber die IN-Variable E_ZeitUndDatum vom Typ Date_and_Time nun nicht mehr an den IN vom DT_TOD legen.
    Code:
    CALL  "DT_TOD"
           IN     :=#E_ZeitUndDatum
           RET_VAL:=#TMPZeit
          NOP   0
    Ich bekomme eine "Unzulässige Parameterversorgung für IN".
    Ist das irgendeine FC Einschränkung?
    Im FB lief das....

    Gruß,
    Aksels
    Linux is like a Wigwam: no Windows, no Gates and Apache inside.
    Zitieren Zitieren Date_and_Time an FC übergeben.  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.794
    Danke
    398
    Erhielt 2.417 Danke für 2.013 Beiträge

    Standard

    Hallo,
    es handelt sich hier (ebenfalls wie in deiner anderen Anfrage) um eine Variable, die als Pointer übergeben wird. Auch hier gilt das gleiche - du kannst den Pointer nicht durchreichen sondern mußt in abbilden ...

    Gruß
    Larry

  3. #3
    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

    Ok, verstanden. Danke.
    Hat aber jemand eine Erklärung, warum das in einem FB lief?

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

  4. #4
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.794
    Danke
    398
    Erhielt 2.417 Danke für 2.013 Beiträge

    Standard

    In dem anderen Thread habe ich dir einen Link gepostet zu dem Thema.
    Nach meiner Meinung hätte es genauso in dem FB nicht funktioniert haben dürfen (keine sinnvolle Rückmeldung des versorgten FC's).

  5. #5
    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

    Sehr interessant.
    In dem Fb geht es aber.
    Im Netzwerk Zeit extrahieren und Tag extrahieren.
    Das setze ich so schon in mehreren SPSen ein.
    Wenn ich alles in einen FC kopiere, dann gehen diese beiden Netzwerke nicht mehr.

    Hier der Code:

    Code:
    FUNCTION_BLOCK 100
    TITLE = Wochenschaltuhr
    AUTHOR : ASpallek
    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 : TIME_OF_DAY ; 
      E_UZ_Bis : TIME_OF_DAY ; 
      E_ZeitUndDatum : DATE_AND_TIME ; 
    END_VAR
    VAR_OUTPUT
      A_Ein : BOOL ; 
    END_VAR
    VAR_TEMP
      TMPZeit : TIME_OF_DAY ; 
      TMPTag : INT ; 
      TMPAus : TIME_OF_DAY ; 
    END_VAR
    BEGIN
    NETWORK
    TITLE =Zeit Extrahieren
          CALL "DT_TOD" (
               IN                       := #E_ZeitUndDatum,
               RET_VAL                  := #TMPZeit);
          NOP   0; 
    NETWORK
    TITLE =
          L     #TMPZeit; 
          L     1000; 
          /D    ; 
          T     #TMPZeit; 
          NOP   0; 
    NETWORK
    TITLE =
          L     #TMPZeit; 
          L     1000; 
          *D    ; 
          T     #TMPZeit; 
          NOP   0; 
    NETWORK
    TITLE =Tag Extrahieren
    //1 = So 
    //7 = Sa
          CALL "DT_DAY" (
               IN                       := #E_ZeitUndDatum,
               RET_VAL                  := #TMPTag);
          NOP   0; 
    NETWORK
    TITLE =
    //Wenn Aus kleiner Ein und akt Zeit < Ein 24 h zu Zeit hinzu
          U(    ; 
          L     #TMPZeit; 
          L     #E_UZ_Von; 
          <D    ; 
          )     ; 
          U(    ; 
          L     #E_UZ_Bis; 
          L     #E_UZ_Von; 
          <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; 
          L     #E_UZ_Von; 
          <D    ; 
          =     L     10.0; 
          U     L     10.0; 
          SPBNB _002; 
          L     #E_UZ_Bis; 
          L     T#1D; 
          +D    ; 
          T     #TMPAus; 
    _002: NOP   0; 
          UN    L     10.0; 
          SPBNB _003; 
          L     #E_UZ_Bis; 
          T     #TMPAus; 
    _003: NOP   0; 
    NETWORK
    TITLE =
          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(    ; 
          L     #TMPZeit; 
          L     #E_UZ_Von; 
          >=D   ; 
          )     ; 
          U(    ; 
          L     #TMPZeit; 
          L     #TMPAus; 
          <=D   ; 
          )     ; 
          =     #A_Ein; 
    END_FUNCTION_BLOCK
    Linux is like a Wigwam: no Windows, no Gates and Apache inside.
    Zitieren Zitieren Alter Baustein.  

  6. #6
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.794
    Danke
    398
    Erhielt 2.417 Danke für 2.013 Beiträge

    Standard

    Naja ... bei einem FB wird der Pointer als Wert (also mit Inhalt) in der Instanz mit abgelegt - bei einem FC nicht. Mag also schon sein, dass du deshalb des Pointer so weiterreichen kannst - hatte ich bslang so noch nicht ausprobiert ...

  7. #7
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.758
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    Naja ... bei einem FB wird der Pointer als Wert (also mit Inhalt) in der Instanz mit abgelegt - bei einem FC nicht. Mag also schon sein, dass du deshalb des Pointer so weiterreichen kannst - hatte ich bslang so noch nicht ausprobiert ...
    Jo, bei einem FB wird ein Poiter auf den Di uebergeben...
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

  8. #8
    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

    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
    Linux is like a Wigwam: no Windows, no Gates and Apache inside.
    Zitieren Zitieren Umschreiben in Temp Bereich geht nicht.  

  9. #9
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.794
    Danke
    398
    Erhielt 2.417 Danke für 2.013 Beiträge

    Standard

    Zitat Zitat von Aksels Beitrag anzeigen
    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.
    Day_and_Time ?
    Was hast du deklariert ? Eine IN-Variable mit dem Namen Datum (z.B.) und dem Typ DATE_AND_TIME ... oder eine IN-Variable mit dem Name Day_And_Time vom Typ Pointer ?
    Ich glaube eher letzteres denn :
    Zitat Zitat von Aksels Beitrag anzeigen
    Eine Date_And_Time hat doch aber 8 Byte?
    Richtig ...

    Gruß
    Larry

  10. #10
    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


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Klar, Larry, vertippt. Typ Date_and_Time.

    Ich bin auch gerade durch rumprobieren darauf gekommen, daß ich einen ANY-Pointer nehmen könnte. Bedeutet das, daß ich Date_And_Time gar nicht an FCs übergeben kann? Egal, was ich damit im FC machen will? Ich dachte das Problem besteht nur bei weitergabe an einen Baustein, den man im FC aufruft. Wenn das für alle Variablen mit Länge > 4 Byte gilt .... oh, ihr Götter, das erklärt viele vergeudete Stunden und Bausteine, die nie liefen.

    Kann man das so sagen: Wenn Variable kompliziert oder > 4 Byte, dann immer mit Any-Pointer übergeben?

    Ok, ich habe das in einen ANY-Pointer geändert.
    Was ich mit meinem Obigen Code jetzt aber byteweise auslese ist 10,2,0,8,0,64,8400,0.... das ist die übergebene Adresse P#Db100.DBX8.0 Byte 8. Dort steht meine Uhrzeit drin.
    Hätte da jetzt nicht direkt die Uhrzeit rauskommen sollen?

    Das bedeutet, ich habe hier den Zeiger auf einen Zeiger bekommen. Mann, ich werd noch verrückt. Muss ich den jetzt in einen Temp Any-Pointer laden und dann nochmal Umlesen in eine Variable mit Date_And_Time?

    Ich geh am Stock.

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

Ä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
  •