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

Ergebnis 1 bis 7 von 7

Thema: Hilfe zum verstehen einer SCL Quelle

  1. #1
    Registriert seit
    10.04.2005
    Beiträge
    45
    Danke
    2
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Kann mir jemand diese SCL Quelle erklären, habe Probleme sie zu verstehen.

    FUNCTION "SSI" : void //Position und Status vom SSI-Geber einlesen
    VAR_INPUT
    PEW_Adr:INT;//Baugruppen-Startadresse
    Faktor:REAL;//Faktor für Positionswert
    OffsetINT;//Offset für Positionsistwert
    END_VAR

    VAR_OUTPUT
    StatusINT;
    PositionINT;
    End_Var

    BEGIN
    PAD[PEW_Adr]:=0; // 0 an Peripherieadresse (Vergleichswert)
    PAD[PEW_Adr+4]:=0; // 0 an Peripherieadresse+4 (Steuerwert)
    Position:=REAL_TO_DINT (DINT_TO_REAL (DWORD_TO_DINT (PED[PEW_Adr]))*Faktor)+Offset; // Zähler*Faktor+Offset
    Status:=DWORD_TO_DINT (PED[PEW_Adr+4]); // Statuswort laden
    END_FUNCTION

    Danke im vorraus.
    Zitieren Zitieren Hilfe zum verstehen einer SCL Quelle  

  2. #2
    Registriert seit
    30.01.2004
    Ort
    Erfurt
    Beiträge
    961
    Danke
    42
    Erhielt 109 Danke für 87 Beiträge

    Standard

    Hallo,

    Die Funktion eines SSI-Gebers ist bekannt? Mal schaun:

    Zitat Zitat von Lobo
    Kann mir jemand diese SCL Quelle erklären, habe Probleme sie zu verstehen.

    FUNCTION "SSI" : void //Position und Status vom SSI-Geber einlesen
    VAR_INPUT
    PEW_Adr:INT;//Baugruppen-Startadresse
    Faktor:REAL;//Faktor für Positionswert
    OffsetINT;//Offset für Positionsistwert
    END_VAR
    Die Funktion SSI hat drei Eingänge: die Adresse eines Prozeßeingangswortes als Integer, einen Faktor als Realwert und einen Offset als DInt.

    VAR_OUTPUT
    StatusINT;
    PositionINT;
    End_Var
    Die Funktion SSI hat zwei Ausgänge: Position und Status, jeweils als DInt
    BEGIN
    PAD[PEW_Adr]:=0; // 0 an Peripherieadresse (Vergleichswert)
    PAD[PEW_Adr+4]:=0; // 0 an Peripherieadresse+4 (Steuerwert)
    Die Eingänge werden indirekt adressiert: der Eingangsparameter PEW_Adr beschreibt die Adresse mit dem Istwert der Position, vier Bytes weiter folgt ein Statuswort, beide werden erstmal mit Null überschrieben (durch Zuweisung von 0 an das Prozeßausgangsdoppelwort, dies zu erklären müßte man ein Handbuch des SSI-Gebers bzw. der Eingangskarte haben - evt. wird der Geber dadurch zur Ausgabe der aktuellen Position angeregt?
    Position:=REAL_TO_DINT (DINT_TO_REAL (DWORD_TO_DINT (PED[PEW_Adr]))*Faktor)+Offset; // Zähler*Faktor+Offset
    Status:=DWORD_TO_DINT (PED[PEW_Adr+4]); // Statuswort laden
    Die Eingänge werden wieder indirekt adressiert - zuerst erfolgt das Einlesen der Position und deren Umrechnung: Wandlung DWORD zu DINT, weil es DWORD zu REAL nicht gibt (?). Danach Umwandlung in REAL, wegen der Rechengenauigkeit bei der Multiplikation. Multiplikation mit Umrechnungsfaktor: z.B. wieviel Impulse entsprechen einem mm - dazu wieder ins Handbuch schauen. Danach Wandlung nach DINT und Addition eines Offsets, z.B. weil der Startpunkt nicht bei Null liegt. Und schon ist die Position fertig.

    Danach erfolgt das Einlesen des Statuswortes vom SSI-Geber- dessen Bedeutung vermittelt wieder das Handbuch.
    END_FUNCTION

    Danke im vorraus.
    Hilft das? Auf welcher Hardware läuft denn das Programm?

    Peter

  3. #3
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard

    @Peter

    Position:=REAL_TO_DINT (DINT_TO_REAL (DWORD_TO_DINT (PED[PEW_Adr]))*Faktor)+Offset; // Zähler*Faktor+Offset

    Ob das wirklich genauer wird? Real stellt ja nur maximal 7 Ziffern dar, der Rest ist der Exponent. Wenn man weiß, daß die Position nicht größer als der Zahlenbereich von DINT wird, sollte man das gar nicht erst wandeln, oder. Dann lieber den Faktor als Bruch übergeben, oder mit 100 multipliziert o.ä.
    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

  4. #4
    Registriert seit
    30.01.2004
    Ort
    Erfurt
    Beiträge
    961
    Danke
    42
    Erhielt 109 Danke für 87 Beiträge

    Standard

    Hallo,

    Zitat Zitat von Ralle
    @Peter

    Position:=REAL_TO_DINT (DINT_TO_REAL (DWORD_TO_DINT (PED[PEW_Adr]))*Faktor)+Offset; // Zähler*Faktor+Offset

    Ob das wirklich genauer wird? Real stellt ja nur maximal 7 Ziffern dar, der Rest ist der Exponent. Wenn man weiß, daß die Position nicht größer als der Zahlenbereich von DINT wird, sollte man das gar nicht erst wandeln, oder. Dann lieber den Faktor als Bruch übergeben, oder mit 100 multipliziert o.ä.
    Das kommt immer auf den Zahlenbereich an - obwohl man bei DINT auch nicht sooo schnell einen Überlauf kriegen dürfte. Einen Vorteil hat die Verwendung von DINT aber: auf den meisten Hardwaren dürfte das schneller laufen, oder?

    Peter

  5. #5
    Registriert seit
    18.12.2005
    Beiträge
    71
    Danke
    0
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Zitat Zitat von Ralle
    @Peter

    Position:=REAL_TO_DINT (DINT_TO_REAL (DWORD_TO_DINT (PED[PEW_Adr]))*Faktor)+Offset; // Zähler*Faktor+Offset

    Ob das wirklich genauer wird? Real stellt ja nur maximal 7 Ziffern dar, der Rest ist der Exponent. Wenn man weiß, daß die Position nicht größer als der Zahlenbereich von DINT wird, sollte man das gar nicht erst wandeln, oder. Dann lieber den Faktor als Bruch übergeben, oder mit 100 multipliziert o.ä.
    Ach ja?
    normal auf einer SPS wird eine Gleitpunktzahl/Gleitkommazahl mit 4 Byte = 32 Bit dargestellt! 23 Bit (LSB) stellen die Mantisse dar, gefolgt von dem Bit für das Vorzeichen der Mantisse, gefolgt von 7 Bits für den Exponenten und ganz zum Schluß (MSB) das Vorzeichen für den Exponenten.
    +/- 11,755E-39 bis 340,282E36 ist der auf dieser Basis darstellbare Umfang!!!!! 7 Ziffern wären halt a bisserl wenig

    Gruß Barnee

  6. #6
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.222
    Danke
    533
    Erhielt 2.698 Danke für 1.950 Beiträge

    Standard

    Ich meinte die maximale Genauigkeit. Du kannst maximal 7 Zahlen darstellen, egal wie groß dein Bereich ist, danach kommen nur noch Nullen.

    1.234567E10 macht 1234567000
    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

  7. #7
    Registriert seit
    18.12.2005
    Beiträge
    71
    Danke
    0
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Ralle
    Ich meinte die maximale Genauigkeit. Du kannst maximal 7 Zahlen darstellen, egal wie groß dein Bereich ist, danach kommen nur noch Nullen.

    1.234567E10 macht 1234567000
    ...was bezogen auf das obige Beispiel im Zitat auch so stimmen würde. Aber der Blickwinkel ist falsch. Es kommt dabei nicht auf die HMI-Dastellung an, sondern auf das, was intern tatsächlich an Wert durch ein REAL dargestellt wird. In früheren Zeiten gabs bei Siemens CPUs, die zwar formal eine 23 Bit breite Mantisse angewendet haben, aber intern nur mit einer 15 Bit breiten Mantisse operiert haben, dabei wurden die oberen 15 Bit ausgewertet und die unteren 8 Bit einfach unterdrückt - dieses konnte schonmal zu Problemen führen, wenn man 2 unterschiedlich große Werte miteinander verreichnet hat Bei der S7-300/400 dürfte aber die volle Breite der Mantisse zur Anwendung kommen. Das schon deshalb, weil sonst eine S7-300/400 völlig ungeeignet wäre, um eine Prozessautomatisierung zu realisieren, wenn mit umfangreichen technischen Größen gearbeitet werden soll. Ein Wert von 1.2345678901234E10 hat dann auch intern tatsächlich den Wert von 1234567890.1234 auch wenn es visuell nicht den Anschein haben sollte, man kann es aber leicht nachweisen.

    Gruß Barnee

Ähnliche Themen

  1. OB100 verstehen
    Von snowpanter im Forum Simatic
    Antworten: 12
    Letzter Beitrag: 01.10.2010, 17:19
  2. S5 Code richtig verstehen
    Von Werner81 im Forum Simatic
    Antworten: 15
    Letzter Beitrag: 03.03.2009, 13:37
  3. SFB35 in einer SCL-Quelle aufrufen
    Von Shino im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 30.01.2009, 12:42
  4. hilfe zur Fernwartung einer S7-300
    Von marc core im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 28.02.2006, 20:19
  5. AWL-Anweisung verstehen
    Von kiestumpe im Forum Simatic
    Antworten: 11
    Letzter Beitrag: 26.01.2006, 08:51

Lesezeichen

Berechtigungen

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