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

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

Thema: S7-1200 Tagesproduktionszähler

  1. #1
    Registriert seit
    15.06.2011
    Beiträge
    29
    Danke
    1
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen,

    ich programmier eine kleine Prüfstation. Das Prüfprogramm ist fast fertig.

    Nun kamen die Sonderwünsche, da häng ich gerade.
    Es sind Zähler gefordert, welche die geprüften Werkstücke zählen und die Werkstücke die OK waren.
    Es soll insgesammt 10 Speicherplätze geben, die täglich automatisch wechseln. Es soll 10 Arbeitstage gespeichert werden können.

    Wenn alle Speicherplätze belegt sind muss der Meister kommen, sich die Werte abschreiben und mindestens einen, nicht unbedingt den ersten, Speicherplatz löschen.
    Das Programm soll automatisch den ersten freien Speicherplatz beschreiben. Natürlich mit Datum.

    Ich habe ein kleines Farbpanel mit Profinetschnittstelle (genauen Typ hab ich gerade vergessen.)

    Könnt ihr mir bei den Zähler helfen?
    Zitieren Zitieren S7-1200 Tagesproduktionszähler  

  2. #2
    Registriert seit
    13.10.2007
    Beiträge
    12.033
    Danke
    2.788
    Erhielt 3.269 Danke für 2.157 Beiträge

    Standard

    Code:
    If fpEreignis Then
       zaehler[index] := zaehler[index] + 1;
    End_if;
    - - -
    Wer als Werkzeug nur einen Hammer hat, sieht in jedem Problem einen Nagel.

  3. #3
    Horschd ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    15.06.2011
    Beiträge
    29
    Danke
    1
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Code:
        #counter_Platz_belegt := 0;
        
        FOR #count_01 := 0 TO 18 BY 2 DO
             
            IF DB8.DBw[#count_01] <> 0 THEN
                #counter_Platz_belegt := 1;
                
            END_IF;
        END_FOR;
    Ich sitze immer noch an der Problematik und brauch eure Hilfe. Wieso lässt sich das Codestück nicht in SCL kompilieren?

  4. #4
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.618
    Danke
    776
    Erhielt 646 Danke für 492 Beiträge

    Standard

    Code:
            IF %DB8.DW(#count_01) <> 0 THEN
    So muss das aussehen, wenn du auf ein Wort zugreifen willst.

    mfG René

    Edit: ich würde aber auf absolute Zugriffe verzichten. Und gerade in TIA Das Zeug mit Strukturen und Arrays lösen. Einfacher und TIA kümmert sich um die Zugriffe.
    Geändert von vollmi (01.04.2016 um 12:44 Uhr)

  5. Folgender Benutzer sagt Danke zu vollmi für den nützlichen Beitrag:

    Horschd (01.04.2016)

  6. #5
    Horschd ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    15.06.2011
    Beiträge
    29
    Danke
    1
    Erhielt 1 Danke für 1 Beitrag

    Standard

    danke für die Antwort. das %DB8.DW ist rot unterstrichen.

    Beim %DB8 steht "ungültiger Funktionsname"
    Beim Punkt steht "ungültiger Aufruf eines Funktionsbaustein '%DB8.DW' "
    Beim DW steht "ungültige Adresse 'DW' "

    An was dachtest du, wie ich viele Elemente gut Überprüfen kann?
    Array wäre ne möglichkeit. Aber dann muss ich die ganzen variablen in der Visu neu machen, oder?

  7. #6
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.618
    Danke
    776
    Erhielt 646 Danke für 492 Beiträge

    Standard

    Hast du gesehen das da Runde und keine Eckigen klammern verwendet werden? Unterschied Step7/TIA.

    Für Arrays deklariert man in der Visu ja auch ein Array. Also eigentlich nur eine Variable. Das meinte ich mit Strukturiert programmieren. Wenn man da Strukturen und Arrays und kombinationen davon aufs HMI bringt, kann man die Variablendeklaration enorm zusammenstreichen.

    mfG René

  8. #7
    Horschd ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    15.06.2011
    Beiträge
    29
    Danke
    1
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Code:
    IF %DB8.Dw(#count_01) <> 0 THEN
    Ja die runden Klammern hatte ich geändert.

    Mal ne dumme Frage, oben wollte ich mit nem Pointer auf den Speichererech zeigen, welchen ich vergleichen wollte.
    Da ich eine große Zahl von Variablen habe, wollte ich in der Schleife, einfach die Zugriffadresse inkementieren.
    Habe ich jetzt den sinn von Pointer falsch verstanden?

  9. #8
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.618
    Danke
    776
    Erhielt 646 Danke für 492 Beiträge

    Standard

    Nein das funktioniert grundsätzlich schon so. Allerdings Pointern geht nur in nicht optimierten Bausteinen. Man muss wissen was man zählt. etc.

    So als kleines Beispiel wie du anfangen könntest.
    Code:
    FUNCTION_BLOCK "FehlerSpeicher"
    { S7_Optimized_Access := 'TRUE' }
    VERSION : 0.1
       VAR_INPUT 
          Fehler : Bool;
       END_VAR
    
    
       VAR_IN_OUT 
          Speicher : Array[0..10] of Struct
             Fehlerzahl : DInt;
             Datum {OriginalPartName := 'DTL'; LibVersion := '1.0'} : DTL;
          END_STRUCT;
       END_VAR
    
    
       VAR 
          AktSpeicher : Int;
          keinSpeicher : Bool;
          R_TRIG_Instance {OriginalPartName := 'R_TRIG_1500'; LibVersion := '1.0'} : R_TRIG;
       END_VAR
    
    
       VAR_TEMP 
          Datum {OriginalPartName := 'DTL'; LibVersion := '1.0'} : DTL;
          status : Int;
          index : Int;
       END_VAR
    
    
    
    
    BEGIN
        
        #status := RD_LOC_T(#Datum);
        #R_TRIG_Instance(CLK:=#Fehler);
        
        
        
        // Aktueller Tag vorhanden?
        FOR #index := 0 TO 10 DO
            #keinSpeicher := false; // kein Speicher zurücksetzen 
            IF #Speicher[#index].Datum.DAY = #Datum.DAY THEN // Schauen ob akueller Wochentag schon vorhanden
                #AktSpeicher := #index;
            ELSIF #Speicher[#index].Datum.DAY = 0 THEN // Wenn Wochentag nicht vorhanden, erste Stelle mit 0 Suchen
                #AktSpeicher := #index;
                #Speicher[#index].Datum := #Datum;
            ELSE // Wenn kein leerer Speicherplatz dann Fehler werfen.
                #keinSpeicher := true;
            END_IF;
        END_FOR;
        
        // Wenn fehler Zähler des aktuellen speichers hochzählen
        IF #R_TRIG_Instance.Q AND NOT #keinSpeicher THEN
            #Speicher[#AktSpeicher].Fehlerzahl := #Speicher[#AktSpeicher].Fehlerzahl + 1;
        END_IF;
        
    END_FUNCTION_BLOCK
    Natürlich ungetestet und sehr einfach.

  10. #9
    Horschd ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    15.06.2011
    Beiträge
    29
    Danke
    1
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Danke für das Beispiel.

    Ich habe ein paar Fragen dazu:
    -Was ist R_Trig_Instance ?
    -Wie schaffst du es ( #status := RD_LOC_T(#Datum) die DTL Variable (#Datum) in eine Integer zu speichern? DTL ist doch 12 Byte groß.Oder was möchtest du damit bewzecken?

    und ein paarallgemeine Fragen.
    Wie spricht man eine DB Speicherstelle Symbolisch an?
    Sind die # für Symbolische Adressierung oder noch für mehr?
    was ist ein opimierter Baustein?

  11. #10
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.618
    Danke
    776
    Erhielt 646 Danke für 492 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    R_Trig ist in der Bibliothek unter Bitverknüpfungen. Da ich das grad unter ner 1500er zusammengestückelt hab. Verweist er auf deren Bibliothek. Einfach schnell rausnehmen und neu deklarieren.

    Datum ist vom Typ DTL. DTL wird von TIA gleich als Struktur mit Unterelementen wie Datum.DAY (für Tag im Monat) angelegt. Und den kann man in einem Integer speichern.

    Die # werden in TIA als Symbolische Adressierung verwendet. "Datum" ist vielleicht ein schlechter Variablenname Versuch das zu ersetzen gegen was das nicht als Keyword in TIA erkannt wird.

    mfG René

Ähnliche Themen

  1. TIA S7 1200 mit S7 1200 über weite Strecke vernetzen
    Von buffi4711 im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 06.06.2015, 12:19
  2. Antworten: 21
    Letzter Beitrag: 25.01.2013, 09:10
  3. Datenaustausch zwischen S7-1200 und S7-1200
    Von baschan im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 09.12.2011, 00:27
  4. S7 1200
    Von Joey im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 14.05.2010, 13:44
  5. S7-1200
    Von Rici im Forum HMI
    Antworten: 9
    Letzter Beitrag: 27.03.2010, 00:31

Lesezeichen

Berechtigungen

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