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

Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 15 von 15

Thema: 300 Minuten ablaufen lassen und über einen Analogausgang an das Leitsystem übertragen

  1. #11
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.263
    Danke
    537
    Erhielt 2.708 Danke für 1.957 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Das ist schon etwas tricky, denke mal es stammt noch aus alten Zeiten.
    Da hat einer halt entweder nicht mit Real rechnen wollen oder können (Code stammte evtl. mal aus einer S5) und wollte wenig Zykluszeit verbrauchen. Bei den alten S5 kosteten normale Rechenoperationen wirklich viel Zykluszeit. Die schnellste Rechenoperation war *2 und /2 weil das ein einfacher Schiebebefehl ist. Nun hat er überlegt, wie man das am Besten machen kann und am Genausten. Also möglichst nur einmal Multiplizieren, da kommt man nicht drumherum und ansonsten Schiebeoperationen.

    Los gehts.

    die normale Formel:

    18000000 * y = 27648

    Formel um Faktor x erweitert:

    18000000 / x * y = 27648 / x

    Nun hat er erstmal 18000000 solange durch 2 geteilt, das ein hinreichend kleiner Wert zum Rechnen herauskam, dieser aber noch nicht zu ungenau war.

    18000000 / 2 / 2 / 2 / 2 / 2 / 2 / 2 / 2 / 2 / 2 = 17578,125 in Int also 17578
    18000000 / 2^10 = 17578

    Formel nun:

    18000000 / x * y = 27648 / x mit x=2^10

    berechnen

    17578 * y = 27648 / 2^10

    umstellen nach y:

    y = 27648 / 17578 / 2^10

    y = 1,57287518..... / 2^10

    aber 1,57287518..... ist keine gute Zahl, schon gar keine Int

    Formel wieder erweitern:

    y * z = 1,57287518..... * z / 2^10

    für z nun soviele 2-er-Potenzen, bis statt 1,57287518..... ein ordentlicher Int-Wert entsteht

    nehmen wir doch mal 2^14 für z

    v = 1,57287518..... * z
    v = 1,57287518..... * 2^14 = 25769,987029241096825577426328365
    = 25770

    so nun noch einsetzen:

    y * z = 1,57287518..... * z / 2^10

    y * 2^14 = 25770 / 2^10

    y = 25770 / 2^10 / 2^14

    Jetzt wieder die Startformel hernehmen:

    18000000 * y = 27648

    einsetzen und prüfen.
    Geändert von Ralle (18.04.2008 um 15:39 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

  2. Folgende 3 Benutzer sagen Danke zu Ralle für den nützlichen Beitrag:

    kermit (18.04.2008),LukeSkywalker (18.04.2008),vierlagig (18.04.2008)

  3. #12
    LukeSkywalker ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    12.04.2008
    Beiträge
    9
    Danke
    11
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Danke, aber das ist mir wohl alles sehr bewusst, nur
    woher weiß ich, dass ich durch 10 und 14 teilen muss?
    wie komme ich auf die werte 10 und 14?

    Gruß LukeSkywalker




    Zitat Zitat von marlob Beitrag anzeigen
    Ein aufmerksamer Leser hat mir gerade mitgeteilt, das du vielleicht wissen wieso das 2^10 und 2^14 ist.

    SSD 10 heisst: schiebe vorzeichenrichtig 10 Stellen nach rechts.
    Eine Stelle nach rechts schieben, heisst teilen durch 2 (2^1)
    zwei Stellen nach rechts schieben, heisst teilen durch 4 (2^2)
    drei Stellen nach rechts schieben, heisst teilen durch 8 (2^3)

    -> SSD 10 heisst teilen durch 2^10

    nach links schieben ist dann mutliplizieren
    Zitieren Zitieren 2 hoch 10 + 2 hoch 14  

  4. #13
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.263
    Danke
    537
    Erhielt 2.708 Danke für 1.957 Beiträge

    Standard

    @luke

    Siehe Rechnung oben, welchen Wert du genau nimmst, bleibt deiner Intuition überlassen. Es soll halt immer hinreichend genau, aber rechentechnisch möglichst schnell und einfach gehen.
    Geändert von Ralle (18.04.2008 um 15:45 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:

    LukeSkywalker (18.04.2008)

  6. #14
    Registriert seit
    29.01.2008
    Ort
    ´s Stauferstädtle
    Beiträge
    314
    Danke
    54
    Erhielt 53 Danke für 44 Beiträge

    Standard

    Huch, was habe ich getan?

    @Ralle: Danke! Sehr gut erklärt! (spart mir jetzt diese ellenlange Erklärung )

    Ja, ich gehöre tatsächlich zu denen, die aus kleinen Prozessoren gerne viel rauskitzeln. Diese Rechnerei hab ich übrigens bei der S5 CPU945 gelernt. Die konnte nämlich keine Doubleintegerdivision - aber dafür zwei Integer zu einem Doubleinteger zusammenmultiplizieren. Und Real-Arithmetik, da werden auch heutige CPUs noch zu lahmen Heizlüftern

    Hab anlässlich der Diskussion mal wieder die Operationslisten rausgekramt und nachgelesen. Dabei stellte ich fest: je nach CPU variiert die Programmformulierung mit der geringsten Abarbeitungszeit.

    Im vorliegenden Fall wäre folgende Formulierung recht brauchbar:
    Code:
    L     "Zeitzaehler"
    L 651                          // 18000000/27648=651,0417
    /D
    T     "Analogausgabe"
    Wenn man aber in Betracht zieht, dass 651 prinzipiell nur eine Genauigkeit von 9,3 Bits aufweist, wäre auch hier über eine Anpassung der Dimensionen für die Berechnung nachzudenken.
    Ein Frosch ohne Humor ist nur ein kleiner grüner Haufen!

  7. Folgender Benutzer sagt Danke zu kermit für den nützlichen Beitrag:

    LukeSkywalker (21.04.2008)

  8. #15
    Registriert seit
    29.01.2008
    Ort
    ´s Stauferstädtle
    Beiträge
    314
    Danke
    54
    Erhielt 53 Danke für 44 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von kermit Beitrag anzeigen
    ...
    Hab anlässlich der Diskussion mal wieder die Operationslisten rausgekramt und nachgelesen. Dabei stellte ich fest: je nach CPU variiert die Programmformulierung mit der geringsten Abarbeitungszeit.
    ...
    ... dabei stellte ich nun fest:
    SVD ist bei der CPU945 ein sehr billiger Befehl (was Laufzeit anbetrifft). Ebenso SSD bei CPU 318. Aber bei CPU 317 ist der Befehl vergleichsweise teuer (wie auch bei anderen 31x-CPUs). Besonders erstaunt hat mich, dass die Doubleintegerdivision bei den kleineren 31x teilweise (je nach Operationsliste aus den Jahren 1995 bis heute), also insbesondere in der jüngsten mir vorliegenden, billiger ist, als die DINT-Multiplikation. Aber *I ist immer noch schneller als /D

    Ich stelle mal die Codesequenzen
    Code:
    SSD n
    L k16
    *I
    SSD n
    und
    Code:
    SLD n
    L k16
    /D
    gegenüber (die Zeit für die Ladeoperation der Konstanten lass ich weg). Zeiten in µs:

    945: 0,55 / DINT-Division geht nicht
    312/13: 13,4 / 24,6
    314: 11,1 / 18,2
    315: 8,8 / 16,2
    314IFM: 7,9 / 9,4
    318: 1,0 / 1,4
    312C: 6,3 / 7,3
    31xC: 3,4 / 4,9
    312: 7,2 / 8,2 (neueste mir vorliegende OpLi)
    31x/147/151: 3,7 / 4,1
    317: 0,78 / 0,69

    Fazit: je moderner die CPUs, desto geringer wird der Vorteil der Integer-Multiplikation. Mutmaßliche Ursachen: RISC-CPUs mit nur 16Bit? Operationen werden mit langen Codesequenzen nachgestellt?

    EDIT: oder 32-Bit CPUs, die für 16Bit-Operationen nicht mehr gebaut sind und daher die 16-Bit-Operationen per Software nachgebildet werden?
    Geändert von kermit (18.04.2008 um 20:08 Uhr)
    Ein Frosch ohne Humor ist nur ein kleiner grüner Haufen!

  9. Folgender Benutzer sagt Danke zu kermit für den nützlichen Beitrag:

    LukeSkywalker (21.04.2008)

Ähnliche Themen

  1. Antworten: 39
    Letzter Beitrag: 17.05.2011, 20:32
  2. Antworten: 11
    Letzter Beitrag: 03.03.2010, 16:17
  3. Antworten: 8
    Letzter Beitrag: 27.10.2009, 13:38
  4. Winccflex script permanent ablaufen lassen
    Von spsbändiger im Forum HMI
    Antworten: 2
    Letzter Beitrag: 22.04.2008, 15:29
  5. Timer mit Minuten laden über OP
    Von Jens Pipka im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 18.12.2006, 08:14

Lesezeichen

Berechtigungen

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