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

Seite 6 von 8 ErsteErste ... 45678 LetzteLetzte
Ergebnis 51 bis 60 von 77

Thema: Auswahlkriterium Betriebsstunden

  1. #51
    Avatar von rs-plc-aa
    rs-plc-aa ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    07.11.2004
    Beiträge
    697
    Danke
    69
    Erhielt 64 Danke für 48 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    wieso Pointer ?

    ... vielleicht ist es das was ich daran nicht verstehe.

    Ich dachte die Variable #Nummer gibt an welches DBB im IndexDB ausgewählt werden soll.

    Und genau hierbei verstehe ich dann nicht wie die IndexDB Adresse (DBB) mit dem momentanen Wert des DBB´s (BM) verknüpft werden soll.


    Das muß mir bitte jemand noch ein wenig genauer erklären.
    RS (rs-plc-aa)
    ______________________________________________
    Morgen ist Heute Gestern...
    ______________________________________________
    Installierst du noch - oder Arbeitest du schon ?
    ______________________________________________

  2. #52
    Registriert seit
    16.12.2004
    Ort
    Schleswig-Holstein
    Beiträge
    400
    Danke
    21
    Erhielt 24 Danke für 21 Beiträge

    Standard

    Ich dachte die Variable #Nummer gibt an welches DBB im IndexDB ausgewählt werden soll.
    Ja und deswegen ist dieser Variable ein "Pointer" - Englisch für Zeiger, weil der Variable "zeigt" wo Deine Daten zu finden sind. Dies nennt man indirekte Adressierung.

    Du findest einiges darüber hier.

  3. #53
    Avatar von rs-plc-aa
    rs-plc-aa ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    07.11.2004
    Beiträge
    697
    Danke
    69
    Erhielt 64 Danke für 48 Beiträge

    Standard

    Hallo,

    danke.

    Ich habe mal eine Weile geschmökert bei Siemens.

    Aber meine eigentliche Frage:

    Zitat Zitat von rs-plc-aa

    Und genau hierbei verstehe ich dann nicht wie die IndexDB Adresse (DBB) mit dem momentanen Wert des DBB´s (BM) verknüpft werden soll.
    kann ich nun immer noch nicht beantworten.


    Ich denke wenn ich das verstanden habe, verstehe ich den Rest auch viel besser (vielleicht hänge ich mich auch deswegen zu sehr daran auf...) .


    Also noch mal ganz präzise gefragt:

    Beispiel --> Es soll nur ein BM eingeschaltet werden.


    Dann wären die Variablen #Nummer = 0 und #Anzahl = 1 ... vor dem Aufruf der FC17.


    In der FC 17 wird dann bei der Sprungleiste festgestellt daß das BM das im IndexDB an der Adresse DBB0 liegt eingeschaltet werden soll (wir gehen mal davon aus es ist betriebsbereit...)

    Wenn jetzt aber #Nummer = 0 ist wird ja an der Sprungleiste der SPA nach BM0 ausgeführt - richtig ?

    Und genau dann komme ich doch beim BM0 und nirgends wo anders heraus - oder ?

    Und da bin ich der meinung daß das falsch ist --> denn nach der Sortierung kann ja beispielsweise auch das BM4 als DBB0 da stehen - oder habe ich schon weiter vorne was nicht verstanden ?

    Somit sollte ja auch das BM4 (weil es in dem Fall dann die wenigsten Stunden auf dem Buckel hat) als einzigstes eingeschaltet werden.


    Und eben diese Erkennung welche "echte" BM - Nummer sich hinter der IndexDB Adresse verbirgt fehlt doch oder ?



    So zumindest habe ich das bis jetzt verstanden.
    RS (rs-plc-aa)
    ______________________________________________
    Morgen ist Heute Gestern...
    ______________________________________________
    Installierst du noch - oder Arbeitest du schon ?
    ______________________________________________

  4. #54
    Registriert seit
    19.06.2003
    Beiträge
    2.200
    Danke
    85
    Erhielt 259 Danke für 175 Beiträge

    Standard

    Wenn Du im Daten DB folgende Zeiten hast:

    45 Stunden
    20 Stunden
    46 Stunden
    34Stunden

    heißt das, daß dein 1.Betriebsmittel 45 Stunden, dein 2. BM 20, dein 3.BM 46 und das 4.BM 34 Stunden auf dem Buckel hat. Eine Zeile im Daten DB gehört unabänderlich zu einem BM.

    Nicht so im Index-DB. Der wird initialisiert mit:
    0
    1
    2
    3

    Nach Sortieren steht aber drin:
    1
    3
    0
    2

    Es wird die 1 aus dem 1.Wort des Index-DB geladen. Der Sprungverteiler springt zur 2.Marke. Dort wird das 2. BM eingeschaltet (weil du dessen Ausgang hinter dieser Marke ansteuerst). Das 2. BM ist das mit den wenigsten Stunden.

    Soll nun noch ein BM eingeschaltet werden, so wird die 3 aus dem 2.Wort des Index-DB geladen. Der Sprungverteiler springt zur 3.Marke. Dort wird das 3. BM eingeschaltet (weil du dessen Ausgang hinter dieser Marke ansteuerst). Das 3. BM ist das mit den zweitwenigsten Stunden.

  5. #55
    Avatar von rs-plc-aa
    rs-plc-aa ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    07.11.2004
    Beiträge
    697
    Danke
    69
    Erhielt 64 Danke für 48 Beiträge

    Standard

    Zitat Zitat von Zottel
    Es wird die 1 aus dem 1.Wort des Index-DB geladen. Der Sprungverteiler springt zur 2.Marke. Dort wird das 2. BM eingeschaltet (weil du dessen Ausgang hinter dieser Marke ansteuerst). Das 2. BM ist das mit den wenigsten Stunden.

    Soll nun noch ein BM eingeschaltet werden, so wird die 3 aus dem 2.Wort des Index-DB geladen. Der Sprungverteiler springt zur 3.Marke. Dort wird das 3. BM eingeschaltet (weil du dessen Ausgang hinter dieser Marke ansteuerst). Das 3. BM ist das mit den zweitwenigsten Stunden.
    Hallo,

    darüber muß ich mir morgen intensiv Gedanken machen - denn das worauf die Sprungleiste zurückgreift ist für mich (noch) ein böhmisches Dorf... - obwohl ich volles Vertrauen habe in das was du sagst.

    Aber gerade im Moment ist das für micht nicht greifbar da ich erst verstehen muß wie "die 1 aus dem ersten Wort des IndexDB´s geladen wird" - da hier für mich zunächst nur 7 einzelne Bytes drin sind
    RS (rs-plc-aa)
    ______________________________________________
    Morgen ist Heute Gestern...
    ______________________________________________
    Installierst du noch - oder Arbeitest du schon ?
    ______________________________________________

  6. #56
    Registriert seit
    19.06.2003
    Beiträge
    2.200
    Danke
    85
    Erhielt 259 Danke für 175 Beiträge

    Standard

    Zitat Zitat von rs-plc-aa
    Aber gerade im Moment ist das für micht nicht greifbar da ich erst verstehen muß wie "die 1 aus dem ersten Wort des IndexDB´s geladen wird" - da hier für mich zunächst nur 7 einzelne Bytes drin sind
    Sorry, ersetze "Wort" durch "Byte", habe mir das Programm nicht nochmal angesehen.

  7. #57
    Avatar von rs-plc-aa
    rs-plc-aa ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    07.11.2004
    Beiträge
    697
    Danke
    69
    Erhielt 64 Danke für 48 Beiträge

    Standard

    Hallo,

    gut ok - das nehme ich dir keinesfalls übel...


    Dann komme ich schon eher hin.

    Ich hab das Programm jetzt zwar auch nicht vor mir aber ich versuch´s mal so:

    Die Sprungleiste ist ja so aufgebaut:

    Code:
    L "Zahl" // Bitte beschriften...
    SPL over // Die Zahl ist größer als die Anzahl der Elemente
    SPA BM0 // Zahl = 0
    SPA BM1 // = 1
    SPA BM2 // = 2
    SPA BM3 // = 3
    SPA BM4 // ...
    SPA BM5
    SPA BM6
    
    over: nop 0
    S Störung // Zum Beispiel
    SPA ENDE
    
    BM0: // hier gleich prüfen ob das BM Bereit ist UND ob es schon läuft...
    // Wenn Bereit=1 UND Läuft=0 dann
    Einschalten_BM0
    SPA EN1
    
    BM1: ....
    
    ....
    Ist das soweit korrekt ?
    RS (rs-plc-aa)
    ______________________________________________
    Morgen ist Heute Gestern...
    ______________________________________________
    Installierst du noch - oder Arbeitest du schon ?
    ______________________________________________

  8. #58
    Registriert seit
    19.06.2003
    Beiträge
    2.200
    Danke
    85
    Erhielt 259 Danke für 175 Beiträge

    Standard

    Im Prinzip ist das korrekt.
    Nach Einschalten eines BMs musste dann noch die Zahl der benötigen BMs verringert werden und die Position der Nummer des nächsten BMs im IndexDB hochgezählt, so daß als nächstes BM das mit den nächstwenigstens Stunden genommen wird.

    Es sind doch schon alle Teillösungen hier aufgetaucht (außer vielleicht die Betriebsstunden im DatenDB genau dann hochzuzählen, wenn das BM eingeschaltet ist. Dabei muß natürlich die gleiche Zuordnung zwischen BM-Nummern und Ausgängen verwendet werden. Soll heißen, wenn im Sprungverteiler BM-Nummer 0 zum Einschalten des A12.0 führt, so muß, wann immer A12.0 ein ist, die Zeit im Eintrag 0 des DatenDB hochgezählt werden.).


    Warum packst du es nicht auf eine CPU oder einen Simulator und probierst den ganzen Ablauf, bis du es verstehst?

  9. #59
    Avatar von rs-plc-aa
    rs-plc-aa ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    07.11.2004
    Beiträge
    697
    Danke
    69
    Erhielt 64 Danke für 48 Beiträge

    Standard

    Zitat Zitat von Zottel
    Warum packst du es nicht auf eine CPU oder einen Simulator und probierst den ganzen Ablauf, bis du es verstehst?
    Hallo,

    da bin ich gerade dabei...

    Jetzt war´s aber so daß im Auswertungsbaustein der die FC 17 aufruft nichts passiert ist --> kein Aufruf der FC.

    Der Fehler lag an der SPZ anweisung die eigentlich nur ausgeführt werden sollte wenn keine weitere Anforderung ansteht.

    Sie wurde aber komischerweise immer ausgeführt, und verhinderte das Starten der FC.


    Ich hab dann mal

    Code:
    //... Das erste Modul holen...
    
          L     0
          L     "Module_soll"
          SPZ   nene                        // ... oder auch nicht ...
    
          CALL  "Index_Ausw"
           Nummer :="Index_Pos"
           indexDB:=10
           Anzahl :="Module_soll"

    gegen

    Code:
    //... Das erste Modul holen...
    
          L     0
          L     "Module_soll"
          ==I   
          SPB   nene                        // ... oder auch nicht ...
    
          CALL  "Index_Ausw"
           Nummer :="Index_Pos"
           indexDB:=10
           Anzahl :="Module_soll"
    getauscht - und siehe da es geht...

    Was ich jetzt zwar sehe aber nicht verstehe ist das:


    Code:
          AUF   DB [#idbn]
          L     #Nummer
          L     8                           // 8-bit-Einträge 
          *I    
          T     LD    12                    // Temp index    
          L     DBB [LD 12]
    
          SPL   tbig                        // wenn Nummer größer als Anzahl Sprungziele ist
          SPA   BM00
          SPA   BM01
          SPA   BM02
          SPA   BM03
          SPA   BM04
          SPA   BM05
          SPA   BM06
    
    tbig: NOP   0
    // hier kann eine Störmeldung o.Ä. erzeugt werden...
          SPA   ende
    
    BM00: NOP   0
          UN    "M1_Bereit"                 // betriebsbereit BM0 
    ....
    Wenn jetzt z.B. #Nummer = 6 ist, dann wird ja mit 8 multipliziert und in LD 12 kopiert (habe es von LD0 auf LD12 geändert...).

    Hier steht dann 48 drin...

    Nach der Anweisung

    L DBB [LD 12]

    steht 4 im Akku 1... warum ???

    mir ist klar daß in meinem Beispiel das BM 4 (Sprungziel ist allerdings BM3 weil von 0 an gezählt) in der Indexliste an sechster stelle steht --> also eigentlich richtig gedeutet.

    Laut Programmstatus wird aber an der Marke BM 5 (=Modul 6) weitergemacht...

    In wirklichkeit wird aber das reale Modul 4 (Marke BM3) eingeschaltet.


    Das verwirrt mich wieder komplett

    Vielleicht liegt´s aber auch am Simulator --> und wenn es so ist dann kann der einen manchmal gewaltig nerven
    RS (rs-plc-aa)
    ______________________________________________
    Morgen ist Heute Gestern...
    ______________________________________________
    Installierst du noch - oder Arbeitest du schon ?
    ______________________________________________

  10. #60
    Registriert seit
    19.06.2003
    Beiträge
    2.200
    Danke
    85
    Erhielt 259 Danke für 175 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von rs-plc-aa

    Hallo,

    da bin ich gerade dabei...

    Ich hab dann mal



    gegen

    Code:
          L     0
          L     "Module_soll"
          ==I   
          SPB   nene                        // ... oder auch nicht ...
    ...
    So ist es richtiger. War das andere von mir?

    Was ich jetzt zwar sehe aber nicht verstehe ist das:
    Code:
          AUF   DB [#idbn]
          L     #Nummer
          L     8                           // 8-bit-Einträge 
          *I    
          T     LD    12                    // Temp index    
          L     DBB [LD 12]
    
          SPL   tbig                        // wenn Nummer größer als Anzahl Sprungziele ist
          SPA   BM00
          SPA   BM01
          SPA   BM02
          SPA   BM03
          SPA   BM04
          SPA   BM05
          SPA   BM06
    
    tbig: NOP   0
    // hier kann eine Störmeldung o.Ä. erzeugt werden...
          SPA   ende
    
    BM00: NOP   0
          UN    "M1_Bereit"                 // betriebsbereit BM0 
    ....
    Wenn jetzt z.B. #Nummer = 6 ist, dann wird ja mit 8 multipliziert und in LD 12 kopiert (habe es von LD0 auf LD12 geändert...).

    Hier steht dann 48 drin...

    Nach der Anweisung

    L DBB [LD 12]

    steht 4 im Akku 1... warum ???
    Wohl deshalb weil im 7 Byte des IndexDB die Nummer 4 stand. Das kann ich aber nur aus dem Ergebnis schließen.
    Nummer =6 bedeutet: 7.Eintrag im IndexDB = DBB6
    Nummer =0 bedeutet: 1.Eintrag im IndexDB = DBB0
    Die Byte-Nummer (hier 6) ist mit 8 zu multiplizieren. Das ist einfach eine Vorraussetzung damit der Befehl
    Code:
         L     DBB [LD 12]
    funktioniert.
    Es haben ja schon Leute versucht, "pointer" zu erklären. Eigentlich finde ich das keine gute Erklärung, weil:
    1. Step7 auch noch "typisierte" Pointer kennt, z.B. P#DB20.DBX0.0, P#E60.0, die eine Information über den Speicherbereich beinhalten.
    2. Die hier verwendeten Adressen im Gegensatz zu pointern anderer Programmiersprachen stehen: Im Gegenstatz zu Pascal ist Rechnen mit "pointern" erlaubt. Im Gegenstatz zu C wird bei den Berechnungen aber eben nicht die Größe des Zielobjekts automatisch berücksichtigt.

    Man könnte meinen, der Befehl
    Code:
         L     DBB [LD 12]
    behandele den Speicher als ein "array of bits". Nur: dann sollte es möglich sein, mittels eines Ausdrucks wie L DBB [5] ein byte zu lesen des erste 3 bits aus DBB0 und die anderen 5 aus DBB1 stammen. Geht aber nicht.

    Fazit: der Befehl
    Code:
         L     DBB [LD 12]
    braucht immer die 8-fache Bytenummer, was zufällig auch die Bit-Nummer ist. Das ist weder vernünftig, noch dem Wesen nach durch den Begriff "Pointer" zu erklären, sondern schlicht eine "Schrulle" der Siemens-Entwickler, mit der man jetzt leben muß.

    mir ist klar daß in meinem Beispiel das BM 4 (Sprungziel ist allerdings BM3 weil von 0 an gezählt) in der Indexliste an sechster stelle steht --> also eigentlich richtig gedeutet.
    Ja, genau.
    Laut Programmstatus wird aber an der Marke BM 5 (=Modul 6) weitergemacht...
    Kann ich nicht nachvollziehen, eventuell siehst du einen Durchlauf in einem anderen Zyklus?
    Kan der Simulator Einzelschritt?
    In wirklichkeit wird aber das reale Modul 4 (Marke BM3) eingeschaltet.
    Das soll es ja auch.

Ähnliche Themen

  1. Display für S7-300 (Betriebsstunden etc.)
    Von superkato im Forum HMI
    Antworten: 8
    Letzter Beitrag: 25.11.2010, 17:18
  2. Betriebsstunden Umschaltung zweier Pumpen
    Von rene im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 06.09.2007, 14:52
  3. betriebsstunden speichern
    Von Merlin115 im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 18.11.2006, 10:42
  4. Maschienenstart nach Betriebsstunden
    Von mst im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 07.11.2005, 20:37
  5. Betriebsstunden erfassen und auswerten
    Von Anonymous im Forum Programmierstrategien
    Antworten: 14
    Letzter Beitrag: 11.08.2005, 08:35

Lesezeichen

Berechtigungen

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