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

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

Thema: S7 1200 SCL Array of TON

  1. #1
    Registriert seit
    14.08.2014
    Beiträge
    15
    Danke
    2
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    Ich möchte in meinem SPS-Programm Timer in einer Schleife abarbeiten, jedoch funktioniert keiner der Folgenden Aufrufe
    Code:
    // TimeArr ist ein Array of TON_TIME
    
    #TimeArr[#_I](IN := ..., PT := ...);
    #TimeArr[#_I].TON(IN = ..., PT := ...);
    Ist das Vorhaben in SCL überhaupt möglich? Ich würde gerne vermeiden alle Timer per Hand einzutragen.

    Gruß
    Mathias
    Zitieren Zitieren S7 1200 SCL Array of TON  

  2. #2
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.717
    Danke
    443
    Erhielt 919 Danke für 740 Beiträge

    Standard

    Das Vorhaben ist nicht möglich, da diese Timer auch nur FBs sind.
    Und mit FB's kann man bei Siemens generell bis dato weder als Einzel- noch als Multiinstanz Arrays erstellen.

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

    mathiak (14.08.2014)

  4. #3
    mathiak ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    14.08.2014
    Beiträge
    15
    Danke
    2
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Super, also was heißt super.. Auf jeden Fall Danke für die schnelle Antwort! Dann muss ich mir etwas anderes überlegen.

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

    Hallo,
    du könntest dir die TON-Funktion in deinem Script "nach-programmieren". Dann würde das mit dem Array (mit etwas mehr Aufwand) wieder realisierbar sein ...

    Gruß
    Larry

  6. #5
    mathiak ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    14.08.2014
    Beiträge
    15
    Danke
    2
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Hallo Larry,

    das klingt gut und würde sicher einiges erleichtern. Bisher habe ich noch nie einen TON selber programmiert. Wie würde sowas aussehen von der Struktur her? Auch bezüglich des Arrays, bleibt der Typ TON_TIME?

    Gruß
    Mathias

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

    Ja ... so ähnlich ...
    Ich würde es so machen :
    Eine Variable erschaffen, die die aktuelle Systemzeit (TimeOfDay) beinhaltet.
    Ein Array_of_Struct erschaffen in dem du einen Flanken-Bool für die Auslösung deines Timers hast, ein Status-Bool des Timers, die Zeit-Vorgabe als Time für den Timer und die gespeicherte Start-Uhrzeit für den Timer.
    Nun kannst du bei "Start_Timer and not FM_Timer" die aktuelle Uhrzeit als Startzeit abspeichern, durch Vergleich "akt_Zeit > gespeicherte + Zeit_Vorgabe" kannst du dann den Status (= Abgelaufen) bilden - und zwar für jedes Array-Element.

    ich hoffe, ich habe jetzt nichts vergessen ...

    Gruß
    Larry

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

    Nachtrag (doch etwas vergessen) :
    Du mußt den 0:00 Uhr-Überlauf mit berücksichtigen. Also wenn du den Timer z.B. 23:59:55 Uhr startest mit einer Vorgabe von 10 s (z.B.) dann wird es schwierig das Ziel zu erreichen es sei denn du rechnest das mit ein ...
    wenn akt_Zeit < Start_Zeit dann Start_Zeit = Start_Zeit - 86400000 (Anzahl der Millisekunden am Tag)

    Gruß
    Larry

  9. #8
    mathiak ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    14.08.2014
    Beiträge
    15
    Danke
    2
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Super jetzt hab ichs vertsanden! Bei TOD gefällt mir nur der Tageswechsel nicht, was hälst du davon RD_LOC_T zu nehmen und zu vergleichen?

    Gruß
    Mathias

    // Edit: Zu spät gelesen

  10. #9
    mathiak ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    14.08.2014
    Beiträge
    15
    Danke
    2
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Ich stelle mal meine jetzige Lösung hier ein:

    Der TON FC-Kopf:
    Code:
    Input        
      IN    Bool    
      PT    UDInt    
    Output        
            
    InOut        
      Time    "UDT_TON"    
    Temp        
      _CurrentTime    Time_Of_Day    
    Return        
      TON    Void
    Datentyp UDT_TON:
    Code:
    ST    UDInt
    PT    UDInt
    ET    UDInt
    RU    Bool
    Q     Bool
    Der TON FC:
    Code:
    If #IN Then
      // Get the current TOD
      #_CurrentTime := "MemoryDB".System.TimeOfDay;
      If #Time.RU = False Then
        // Set PT and ST on first start
        #Time.PT := #PT;
        #Time.ST := #_CurrentTime;
        #Time.RU := True;
      Else
        // If ET < PT, then calculate new ET
        If #Time.ET < #Time.PT Then
          // On change of day, CurrentTime is smaller then ST
          If TOD_TO_UDINT(#_CurrentTime) < #Time.ST Then
            #Time.ET := 86400000 + TOD_TO_UDINT(#_CurrentTime) - #Time.ST;
          Else
            #Time.ET := TOD_TO_UDINT(#_CurrentTime) - #Time.ST;
          End_If;
        Else  // If ET >= PT
          #Time.ET := #Time.PT;
          #Time.Q := True;
        End_If;
      End_If;
    Else  // #IN = False
      // Reset Timer
      #Time.ET := 0;
      #Time.RU := False;
      #Time.Q := False;
    End_If;
    Und TimeOfDay wird so generiert:
    Code:
    ....
    // Read Local Time
    #_I := RD_LOC_T(OUT => "MemoryDB".System.LocalTime);
    "MemoryDB".System.TimeOfDay := UDINT_TO_TOD((USINT_TO_UDINT("MemoryDB".System.LocalTime.HOUR) * 3600 +
                                                 USINT_TO_UDINT("MemoryDB".System.LocalTime.MINUTE) * 60 +
                                                 USINT_TO_UDINT("MemoryDB".System.LocalTime.SECOND)) * 1000 +
                                                 ("MemoryDB".System.LocalTime.NANOSECOND / 1000000));
    ....
    Gruß
    Mathias

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


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ich habe es mir jetzt nicht im Detail angesehen.
    Eins habe ich jedoch noch :
    Kannst du dir ein Array_of_FC erstellen ? Wo "merkst" du dir die einzelnen Zustände ? Eigentlich bräuchtest du einen FB, der das Array der benötigten Struktur beinhaltet, in dem du das Alles entsprechend des Array-Index machst.

    Gruß
    Larry

Ähnliche Themen

  1. Antworten: 20
    Letzter Beitrag: 25.07.2016, 11:38
  2. TIA V11 SCL TON Multiinstanz
    Von MrEASY im Forum Simatic
    Antworten: 14
    Letzter Beitrag: 04.03.2013, 15:17
  3. Scl ton
    Von bluebird277 im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 19.11.2010, 11:24
  4. SFB4 (TON) in SCL
    Von Gerri im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 06.10.2009, 21:11
  5. TON als Multiinstanz unter SCL
    Von derwestermann im Forum Simatic
    Antworten: 0
    Letzter Beitrag: 09.10.2007, 13:30

Lesezeichen

Berechtigungen

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