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

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

Thema: FC statt FB verwenden um Ressourcen zu sparen ?

  1. #1
    Registriert seit
    14.07.2005
    Beiträge
    298
    Danke
    27
    Erhielt 18 Danke für 15 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen,

    leidiges Thema, ja ich weiß. - Aber da ich gerade dazu "gezwungen" bin bei meinem Programm etwas Speicheroptimierung zu betreiben habe ich mir einen meiner
    Funktionsbausteine mal vorgenommen und als FC erstellt. - Grundsätzlich meine ich den Unterschied zwischen FB und FC zu kennen und war deshalb auch der
    Meinung ich sollte meinen Code als FB erstellen.

    Folgenden Code habe ich nun als Funktion FC für eine S7-1214C erstellt und er funktioniert auch scheinbar korrekt wenn ich ihn mehrfach aufrufe:

    Code:
    FUNCTION "FC_1001 - Array_Char_Suche" : Void
    { S7_Optimized_Access := 'TRUE' }
    
    VERSION : 0.1
       VAR_INPUT 
          Daten_Array : Array [1 .. 1024] of Char;
          Start : Bool;
          Versatz : Int;
          Zeichen : Byte;
       END_VAR
    
       VAR_OUTPUT 
          Position : Int;
          Fertig : Bool;
       END_VAR
    
       VAR_TEMP 
          Zaehler_Max : Int;
          Array_Max : Int;
          Daten_Array_Index : Int;
       END_VAR
    
    BEGIN
          // ARRAY_DURCHSUCHEN
          // Die Funktion 'ARRAY_DURCHSUCHEN' durchsucht ein Array mit einer festen Länge von 1024 Byte
          // nach dem am Eingang 'Zeichen' definierten Zeichen.
          // Dabei kann über den Eingang 'Versatz' der Beginn der Suche im Array bestimmt werden.  Wird
          // als Versatz 0 eingestellt, beginnt die Suche mit dem ersten Zeichen des Array.
        
            #Array_Max := 1024;     
            IF #Start = TRUE THEN GOTO Sprungmarke_1;
               Sprungmarke_1:
                 #Position := -1;
                 #Fertig := FALSE;
                 #Zaehler_Max := #Array_Max - #Versatz;
                 GOTO Sprungmarke_2;
               Sprungmarke_2:  
                  FOR #Daten_Array_Index := #Versatz + 1 TO #Zaehler_Max DO
                      IF #Daten_Array[#Daten_Array_Index] = #Zeichen THEN
                        #Position := #Daten_Array_Index;            
                         EXIT;
                      END_IF;
                  END_FOR;
                    #Fertig := TRUE;
            ELSE;
            #Fertig := FALSE;
            END_IF;
          
    END_FUNCTION
    Die Frage die ich mir nun stelle ist: Funktioniert der Code sicher immer als Funktion, oder wäre es besser weiter einen FB zu verwenden?

    Prinzipiell hätte ich einen FB bevorzugt, da ich der Annahme bin das das sicherer ist, aber so langsam geht mir der Arbeitsspeicher aus,
    da ich die Funktion mehrmals aufrufen muss und jede Instanz 1040 Byte Speicher belegt.

    Gruß smartie
    Zitieren Zitieren FC statt FB verwenden um Ressourcen zu sparen ?  

  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

    Zitat Zitat von smartie Beitrag anzeigen
    Grundsätzlich meine ich den Unterschied zwischen FB und FC zu kennen und war deshalb auch der
    Meinung ich sollte meinen Code als FB erstellen.
    Ehrlich gesagt, sehe ich hier überhaupt keinen Grund für einen FB.
    Den FB benutzt man, um im Instanzdatenbaustein Daten von Zyklus zu Zyklus speichern zu können. Das muss man beim FC dann z.B. über InOuts und externe Speicherstellen lösen. Solche Daten sehe ich hier aber nicht.



    In Deinem Code selbst sind aber einige überflüssige Sachen vorhanden:
    Zitat Zitat von smartie Beitrag anzeigen
    Code:
            IF #Start = TRUE THEN GOTO Sprungmarke_1;
               Sprungmarke_1:
                 ...
                 #Fertig := FALSE;
                 ....
                 GOTO Sprungmarke_2;
               Sprungmarke_2: 
                 
               ....
            ELSE;
                 #Fertig := FALSE;
            END_IF;
    #Start selbst hat schon den Wert TRUE oder FALSE. Man muss also keinen Vergleich auf TRUE machen, der dann als Ergebnis auch nur TRUE oder FALSE liefert.
    Und wozu die GOTOs (die an sich schon in der Programmierwelt ziemlich geschasst sind), um dann nur in die nächste Zeile zu springen? Also mehr als überflüssig.
    Und die FALSE-Zuweisung an #Fertig machst Du so oder so. Warum also 2x programmieren, wenn's einmal am Anfang auch genügt.
    Code:
            #Array_Max := 1024;    
            #Fertig := FALSE;
           IF #Start THEN 
                 #Position := -1;
                 #Zaehler_Max := #Array_Max - #Versatz;
                  FOR #Daten_Array_Index := #Versatz + 1 TO #Zaehler_Max DO
                      IF #Daten_Array[#Daten_Array_Index] = #Zeichen THEN
                        #Position := #Daten_Array_Index;            
                         EXIT;
                      END_IF;
                  END_FOR;
                   #Fertig := TRUE;
            END_IF;
    Geändert von hucki (03.07.2014 um 19:43 Uhr)

  3. #3
    Registriert seit
    11.12.2009
    Beiträge
    2.113
    Danke
    388
    Erhielt 390 Danke für 271 Beiträge

    Standard

    Man könnte auch beim FB bleiben und das Array via InOut anbinden.

    Grüße

    Marcel
    Stell Dir vor es geht, und keiner kriegts hin!

  4. Folgender Benutzer sagt Danke zu Matze001 für den nützlichen Beitrag:

    smartie (04.07.2014)

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

    Standard

    Zitat Zitat von Matze001 Beitrag anzeigen
    Man könnte auch beim FB bleiben und das Array via InOut anbinden.
    Das geht auch beim FC, aber wozu?
    Er sucht nur 'ne Position im Array und will ja nichts hinein schreiben.

  6. #5
    Registriert seit
    15.01.2005
    Ort
    In der Mitte zwischen Bayreuth/Weiden
    Beiträge
    6.732
    Danke
    314
    Erhielt 1.520 Danke für 1.282 Beiträge

    Standard

    @Matze
    Egal wie du das Array an den FB bindest, es landet dann aber immer als Lokale Kopie in der Instanz.

    @TE
    Eine Sache ändert sich aber beim FB->FC:
    Position ist nur noch in Verbindung mit Fertig gültig,
    ansonsten steht Müll drin.

    So oder so, du bist in einem Zyklus fertig, und somit musst du auch nichts speichern.

    Mfg Manuel
    Warum denn einfach, wenn man auch Siemens einsetzen kann!

    Wer die grundlegenden Freiheiten aufgibt, um vorübergehend ein wenig Sicherheit zu bekommen, verdient weder Freiheit noch Sicherheit (B. Franklin).

  7. #6
    Registriert seit
    11.12.2009
    Beiträge
    2.113
    Danke
    388
    Erhielt 390 Danke für 271 Beiträge

    Standard

    @MSB nein:

    Es wird nur eine art Pointer auf den Speicherbereich gebildet, der via InOut an einen FB angebunden wird.
    Ich mache das bei sehr vielen meiner Bausteine, wenn ich auf Global-DBs zugreife. Warum sollte ich alles doppelt in
    der CPU haben...

    Schau dir mal eine InOutVariable an, wenn du z.B. einen Struct anbindest der 1024Byte groß ist, hat die InOut Variable maximal die größe von einem Pointer (Glaube 4 Byte).

    Grüße

    Marcel
    Stell Dir vor es geht, und keiner kriegts hin!

  8. Folgender Benutzer sagt Danke zu Matze001 für den nützlichen Beitrag:

    hucki (04.07.2014)

  9. #7
    Registriert seit
    15.01.2005
    Ort
    In der Mitte zwischen Bayreuth/Weiden
    Beiträge
    6.732
    Danke
    314
    Erhielt 1.520 Danke für 1.282 Beiträge

    Standard

    Das wäre dann aber ein very Special Feature ab 1200.

    Gesendet von meinem GT-I9505 mit Tapatalk
    Warum denn einfach, wenn man auch Siemens einsetzen kann!

    Wer die grundlegenden Freiheiten aufgibt, um vorübergehend ein wenig Sicherheit zu bekommen, verdient weder Freiheit noch Sicherheit (B. Franklin).

  10. #8
    smartie ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    14.07.2005
    Beiträge
    298
    Danke
    27
    Erhielt 18 Danke für 15 Beiträge

    Standard

    Vielen Dank erst mal für die Antworten, daraus ergeben sich ein paar Fragen/Erkentnisse:

    So oder so, du bist in einem Zyklus fertig, und somit musst du auch nichts speichern.
    - Genau das ist doch die Kern-Frage. Woher weiß ich das ich in einem Zyklus fertig bin?

    Man könnte auch beim FB bleiben und das Array via InOut anbinden.
    - Funktioniert wirklich. Habe ich noch nicht gewusst. Aber statt 1040 Byte belegt der Instanzdatenbaustein jetzt nur noch 40 Byte.
    Ich habe noch einen anderen Baustein mit ca. 12 Instanzen, der jeweils ein Array mit 1024 Byteam Input und Output hat. Die habe
    ich beide an INOUT gelegt und Schwupp hab ich schon wieder viel mehr Speicher frei.

    In Deinem Code selbst sind aber einige überflüssige Sachen vorhanden...
    - Vielen Dank für den Hinweis. Das war mein erster Gehversuch in SCL. Ich hatte in der Richtung vorher noch nichts gemacht und
    bin froh das ich es soweit hinbekommen habe.

    Gruß smartie

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

    Standard

    Zitat Zitat von smartie Beitrag anzeigen
    Zitat Zitat von MSB Beitrag anzeigen
    So oder so, du bist in einem Zyklus fertig, und somit musst du auch nichts speichern.
    - Genau das ist doch die Kern-Frage. Woher weiß ich das ich in einem Zyklus fertig bin?
    Weil zum Einen der Programmcode in einem einzigen Zyklus durchlaufen wird (keine Sprünge wegen Timer o.ä.) und zum Anderen vor allem auch keine Daten von Zyklus zu Zyklus gespeichert werden.


    Zitat Zitat von Matze001 Beitrag anzeigen
    Es wird nur eine art Pointer auf den Speicherbereich gebildet, der via InOut an einen FB angebunden wird.

    Schau dir mal eine InOutVariable an, wenn du z.B. einen Struct anbindest der 1024Byte groß ist, hat die InOut Variable maximal die größe von einem Pointer (Glaube 4 Byte).
    Gut zu wissen.
    Dann werd' ich mir sicher angewöhnen, bei größeren Datenmengen den InOut auch dann zu benutzen, wenn von Ihnen nur gelesen werden soll. So wie hier z.B. bei dem Code von smartie.

  12. #10
    smartie ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    14.07.2005
    Beiträge
    298
    Danke
    27
    Erhielt 18 Danke für 15 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Weil zum Einen der Programmcode in einem einzigen Zyklus durchlaufen wird (keine Sprünge wegen Timer o.ä.) und zum Anderen vor allem auch keine Daten von Zyklus zu Zyklus gespeichert werden.
    Das ich (in diesem Baustein) keine Daten habe, die von Zyklus zu Zyklus gespeichert werden müssen war ein Grund warum ich überhaupt auf die Idee gekommen bin es mit einem FC zu probieren.


    Was ich aber nicht verstehe ist was du mit
    ... keine Sprünge wegen Timer o.ä.
    meinst.


    Gruß smartie

Ähnliche Themen

  1. Antworten: 2
    Letzter Beitrag: 22.11.2012, 14:32
  2. cpu ressourcen ermitteln
    Von Gerri im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 16.10.2008, 18:05
  3. Ressourcen bei 412er
    Von alonely01 im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 22.09.2008, 17:49
  4. Ressourcen Engpass auf der S7-300
    Von sven im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 30.11.2007, 07:55
  5. IstandsDBs sparen
    Von mst im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 14.10.2007, 20:28

Lesezeichen

Berechtigungen

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