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

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

Thema: Frage zu meinem Baustein

  1. #1
    Registriert seit
    06.04.2009
    Beiträge
    32
    Danke
    6
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Leute,

    ich hätte da mal gerne eine Frage zu meinem Baustein gestellt.

    Folgende Sache: Ein Kunde von mir möchte gerne auf der Visu (flex 200 sehen, wieviel "KW" laut Typenschild momentan aktiv sind.
    Ich habe mir jetzt einen Baustein gebastelt der auch wunderbar funktioniert. Über eine Schleife wird jeder einzelne Ausgang auf "True" abgefragt und gegebenenfalls der entsprechende Wert addiert.

    Ich habe also in meinem Fall die Ausgänge 0.0 - 19.7. Dementsprechend habe ich mir einen DB mit den Werten angelegt. Heisst, ich habe pro Ausgang einen Realwert hinterlegt. (Bei reversierantrieben natürlich dann den Wert für beide Ausgänge eingegeben).

    Ausgänge die keinerlei Bänder oder andere Verbraucher schalten habe ich auf Real 0.0 im DB gesetzt.

    Meine Frage bezieht sich jetzt eigentlich nur darauf, ob diese Programmierung so in Ordnung wäre oder man noch etwas einkürzen könnte.

    Wäre lieb wenn sich das mal jemand anschauen könnte. Ich rufe den FC übrigens im OB35 (100ms) auf.


    MfG, Iris

    Code:
          CALL  "KW-Berechnung"
           KW_DB         :="KW-Werte"
           Adresse_Anfang:=L#0
           Adresse_Ende  :=L#19
           KW_OUT        :=MD10
    Code:
          AUF   #KW_DB
          L     #Adresse_Anfang
          T     #Byte_Adresse
          L     0
          T     #Bit_Adresse
          L     0.000000e+000
          T     #KW
    m002: L     #Byte_Adresse
          SLD   3
          LAR1  
          L     #Bit_Adresse
          +AR1  
          U     A [AR1,P#0.0]
          SPBN  m001
          L     #Byte_Adresse
          L     32
          *D    
          T     #Temp1
          L     #Bit_Adresse
          L     4
          *D    
          T     #Temp2
          L     #Temp1
          L     #Temp2
          +D    
          T     #Temp3
          SLD   3
          LAR1  
          L     DBD [AR1,P#0.0]
          L     #KW
          +R    
          T     #KW
    m001: L     #Bit_Adresse
          L     1
          +D    
          T     #Bit_Adresse
          L     7
          >D    
          SPBN  m002
          L     0
          T     #Bit_Adresse
          L     #Byte_Adresse
          L     1
          +D    
          T     #Byte_Adresse
          L     #Adresse_Ende
          >D    
          SPBN  m002
          L     #KW
          T     #KW_OUT
          SET   
          SAVE  
          CLR
    Zitieren Zitieren Frage zu meinem Baustein  

  2. #2
    Registriert seit
    13.04.2008
    Ort
    Großraum KA
    Beiträge
    963
    Danke
    52
    Erhielt 128 Danke für 112 Beiträge

    Standard

    Mal gaaanz prinzipiell. Wenn ein Motor zB. 7,5 kW laut Typenschild hat dann bedeutet das doch nicht, daß auch 7,5 kW abgerufen werden. Motoren im Maschinenbau laufen praktisch nie unter Volllast. Damit ist das was Du machst eigentlich bestenfalls ein Schätzeisen.
    Ich hätte in die Zuleitung eine Stromwandler eingebaut, auf einen Analogeingang gegeben und dan in der S7 die Leistung berechnet. Das wäre zwar immer noch nicht genau aber bviel besser als das was du da machst.
    Allermindestens würde ich im Betrieb mal die real existierenden Ströme der Antriebe ( oder sonstigen Verbraucher ) messen und diese in den DB schreiben.

    peter(R)

  3. #3
    Gini ist offline Gesperrt
    Themenstarter
    Registriert seit
    06.04.2009
    Beiträge
    32
    Danke
    6
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Hi Peter,

    das ist mir und dem Kunden auch bewusst. Er ist halt ein neugieriger Mensch . Hat hier immer seine Aufstellung mit den KW-Angaben. Nun würde er es halt gerne angezeigt bekommen. (Nur der Neugier wegen). Soll mein Problem nicht sein solange er meine Zeit bezahlt.
    Das mit dem tatsächlichen Messen der Leistung aller Antriebe lasse ich mal lieber bleiben. Das wird mir etwas zuviel .
    Mit dem Stromwandler in der Zuleitung habe ich Ihm auch vorgeschlagen. Wird wahrscheinlich demnächst auch dazwischengebaut.

    Es ging mir in erster Linie auch nur darum, ob man meinen Code (ich habe relativ lange daran getüftelt) vielleicht noch etwas verbessern kann. Funktionieren tut er einwandfrei. Aber vielleicht habe ich es mir ja auch etwas zu umständlich gemacht.

    Durch seinen Wunsch konnte ich endlich mal etwas mit Pointern probieren. Habe ich vorher noch nie so richtig gemacht.
    Daher bin ich eigentlich froh dass ich wieder etwas dazugelernt habe.
    Geändert von Gini (29.08.2009 um 10:41 Uhr)
    Zitieren Zitieren Code  

  4. #4
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.218
    Danke
    533
    Erhielt 2.696 Danke für 1.948 Beiträge

    Standard

    Was noch am Programm zu vereinfachen wäre (ich würds aber so lassen, wenn es denn nun geht )ist, daß du eigentlich keine Trennung zwischen Bit und Byte benötigst. Mit dem Befehl SLD 3 erzeugst du ja einen Zeiger. Die rechten 3 Bit repräsentieren dabei im Zeiger die Bitadresse. Durch SLD 3 ist die erstmal 0, da ja die rechten Bits erstmal einfach mit Null aufgefüllt wurden.

    Wenn man sich nun mal die Zeiger für einige Byte ansieht:
    0 SLD 3 --> 0*2*2*2 = 0
    1 SLD 3 --> 1*2*2*2 = 8
    2 SLD 3 --> 2*2*2*2 = 16
    3 SLD 3 --> 3*2*2*2 = 24
    .
    .
    .
    19 SLD 3 --> 19*2*2*2 = 152

    Du kannst also einfach den Zeiger einmal am Anfang mit SLD 3 erzeugen und dann je Bit immer einfach nur 1 aufaddieren auf den Zeiger! Die Abbruchbedingung wäre dann, wenn der Zeiger > Adresse_Ende SLD 3 also größer 152 + 7 (152 entspricht 19.0, 159 entspricht 19.7) ist.
    Geändert von Ralle (29.08.2009 um 15:16 Uhr)
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

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

    Gini (05.09.2009)

  6. #5
    Registriert seit
    19.10.2007
    Ort
    far far away
    Beiträge
    478
    Danke
    114
    Erhielt 136 Danke für 95 Beiträge

    Standard

    @peter(R):


    @ Gini: Hallo Iris, Deine Kommentare im Code sind "spitze"

    Code:
          T     #Temp2
          L     #Temp1
          L     #Temp2    //<<< z. B. könnte man das hier weglassen
          +D
    es läßt sich immer etwas wegkürzen, aber da kann dann auch die Übersichtlichkeit leiden. Die Funktion ist doch wichtiger solange Speicherplatz und Zykluszeit nicht leiden. Ich finde einige erklärende Kommentare viel nützlicher.

    Gruß Soli

  7. #6
    Registriert seit
    29.01.2007
    Ort
    Sandkrug
    Beiträge
    147
    Danke
    7
    Erhielt 36 Danke für 25 Beiträge

    Standard

    Hi Gini,
    Wie schon gesagt, wären ein paar kommentierende Bemerkungen gut.
    Grundsätzlich lässt sich eine Aufgabe auf verschiedenen Wegen lösen. Du hast einen (DEINEN) Weg gewählt und dabei viel gelernt. Das ist Spitze.
    Hier mal eine etwas andere Lösung (sie ist aber nicht ausprobiert, ich glaube aber, dass sie funktioniert)
    Zur Erklärung:
    Deine Bit laufen von 0.0 bis 19.7. Betrachtet man den Speicher als fortlaufende Nummernfolge, werden die Bit 0 bis 159 belegt.
    Nimm mal z.B. die Nummer 159 und stelle sie binär dar (159 = 10011 111). Dann entspricht das genau der "richtigen" SPS-Adresse, nämlich 19.7.
    Wenn man also programmiert
    L 159
    LAR1, dann zeigt AR1 genau auf das Bit 19.7 und man kann sofort weiter programmieren
    U A[AR1,P#0.0]. Ergebnis: Es ist keinerlei Schieberei erforderlich!
    Wie ist das bei der indirekten Wortadressierung?
    Dein "Leistungswert" für Bit 19.7 steht z.B. im DBD100 in den Datenbyte 636...639, also DBD636
    Wenn man also programmiert
    L 159 damit steht im Akku1(ohne Vornullen) 10011111
    SLD 32 jetzt steht im Akku1 (ohne Vornullen) 1001111100000
    LAR1 damit steht im AR1 (ohne Vornullen) 1001111100 000, AR1 zeigt deshalb sofort auf die richtige Wortadresse!
    L DBD[AR1,P#0.0], damit wird das DW geladen auf das die linken bit des AR1 zeigen. Und das ist genau die Nummer 636.
    Da man nun den richtigen Inhalt geladen hat, kann man entsprechend weiter verarbeiten (siehe Beispielprogramm)
    Ich wurde oft gefragt, warum Siemens das mit den Adressregistern "so kompliziert" gemacht hat. Das Beispiel zeigt genau den Grund.
    Leider wird dieser Zusammenhang bei der Vermittlung der Wortverarbeitung und der indirekten Adressierung zu wenig bekannt gemacht.
    Aber schön, dass du dein Problem hier eingestellt hast. Vielleicht hilft es ja dem Einen oder Anderen.
    Code:
           AUF  DB      100
           L    0.000000e+00
           T    #KW
           L    #Max_Bitnummer               // Maximale Bitnummer laden
    m001  :T    #Zeiger                      // Zeiger initialisieren
           LAR1
           U    A [AR1,P#0.0]                // adressierter Ausgang = 1 ?
           SPBN m002                         // <-- nein, dann springe
           L    #Zeiger                      // ansonsten Zeiger auf DBD ausrichten
           SLD            5
           LAR1
           L    DBD [AR1,P#0.0]              // Leistungswert des Ausganges laden
           L    #KW                          // bisher kummulierten Leistungswert laden
           +R                                // addieren und zwischenspeichern
           T    #KW
    m002  :L    #Zeiger                      // Test auf Schleifenende
           LOOP m001
           L    #KW                          // Summenleistung laden
           T    #Leistung                    // und ausgeben
    Viel Erfolg weiterhin.
    eNDe
    Zitieren Zitieren Frage zu meinem Baustein  

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

    Gini (05.09.2009)

  9. #7
    Registriert seit
    19.10.2007
    Ort
    far far away
    Beiträge
    478
    Danke
    114
    Erhielt 136 Danke für 95 Beiträge

    Standard

    Zitat Zitat von eNDe Beitrag anzeigen
    ...
    L 159 damit steht im Akku1(ohne Vornullen) 10011111
    SLD 32 jetzt steht im Akku1 (ohne Vornullen) 1001111100000
    LAR1 damit steht im AR1 (ohne Vornullen) 1001111100 000, ...
    ich hoffe das der Wert bei SLD "5" heißen sollte, sonst habe ich nämlich doch nichts verstanden

  10. #8
    Registriert seit
    29.01.2007
    Ort
    Sandkrug
    Beiträge
    147
    Danke
    7
    Erhielt 36 Danke für 25 Beiträge

    Standard

    Hallo Solaris,
    ja natürlich!!!
    Gruß eNDe
    Zitieren Zitieren Bestätigung  

  11. #9
    Registriert seit
    17.07.2009
    Ort
    Am Rande der Ostalb
    Beiträge
    5.476
    Danke
    1.138
    Erhielt 1.238 Danke für 971 Beiträge

    Standard

    Zitat Zitat von Gini Beitrag anzeigen
    Code:
          SET   
          SAVE  
          CLR
    Ich mach jetzt zwar schon einige Jahre SPS, aber der Sinn dieser 3 Zeilen als Bausteinabschluß erschliesst sich mir jetzt nicht ganz.
    Steht das im Zusammenhang durch den Aufruf im OB35?

    Gruß
    Dieter

  12. #10
    Registriert seit
    29.01.2007
    Ort
    Sandkrug
    Beiträge
    147
    Danke
    7
    Erhielt 36 Danke für 25 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Blockmove,
    Bausteine haben in FUP einen Eingang EN und einen Ausgang ENO. Damit können FUP-Bausteine "in Reihe" geschaltet werden. Ein Baustein in dieser Kette wird nur bearbeitet, wenn der Eingang EN ein 1-Signal führt, bei 0-Signal wird er nicht bearbeitet.
    Der tiefere Sinn ist, dass man damit sehr einfach Bausteine aufrufen kann oder eben nicht, andererseits wird über diesen Mechanismus verhindert, dass ein FUP-Baustein bearbeitet wird, wenn der vorherige Baustein ein fehlerhaftes Ergebnis liefert.
    Zuständig dafür ist das sog. Bie-Bit. Dieses kann innerhalb des Bausteins beeinflusst werden. Es gibt seinen Inhalt an den ENO-Ausgang aus. Die 3 Zeilen bedeuten also:
    SET setze auf jeden Fall das VKE auf 1
    SAVE übertrage das VKE in das BIE-Bit (und erlaube damit die fehlerfreie Reihenschaltung)
    CLR lösche das VKE (oder besser, schreibe in das VKE eine 0)
    Wenn der betrachtete Baustein immer nur alleine verwendet wird, wären die 3 genannten Befehle nicht notwendig.
    MfG
    eNDe
    Zitieren Zitieren Letzte 3 Zeilen  

  13. Folgende 4 Benutzer sagen Danke zu eNDe für den nützlichen Beitrag:

    Blockmove (29.08.2009),borromeus (29.08.2009),IBFS (29.08.2009),Solaris (29.08.2009)

Ähnliche Themen

  1. Antworten: 54
    Letzter Beitrag: 12.06.2011, 11:04
  2. Frage zu Baustein vergleich
    Von Pockebrd im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 24.09.2010, 18:00
  3. Mega Problem bei meinem Programm
    Von COOLT im Forum CODESYS und IEC61131
    Antworten: 10
    Letzter Beitrag: 28.07.2009, 10:28
  4. FB Baustein . Frage?
    Von hank12 im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 07.05.2009, 16:45
  5. Auf meinem Schreibtisch herrscht Chaos
    Von pvbrowser im Forum Stammtisch
    Antworten: 11
    Letzter Beitrag: 12.07.2007, 12:50

Lesezeichen

Berechtigungen

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