Step 7 S7 400 Analogwerte; Word und Integer Problem

Noxx_71

Level-2
Beiträge
23
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leidensgenossen,
ich brauche Eure Hilfe, ich bin zu dämlich......
Ich möchte mit einem S7-400 Rack einige Analogkarten testen. Ich habe dafür im Programm einen Sollwertgenerator geschrieben, der einen Sägezahnsollwert zwischen -32000 und +32000 generiert. Damit steuere ich Analogausgänge an, diese wiederum lese ich mit einer Analogeingangskarte ein.
Das funktioniert alles.
Ich habe jedoch Schwierigkeiten bei der Prüfung der Analogwerte. Ich würde die Analogwerte der Eingange gerne weiterverarbeiten, u.a. mit einem Toleranzfenster prüfen, jedoch bekomme ich dies im Programm nicht hin. S7 zeigt mir die Variablen der Analogwerte nicht +/- 32000 an, sondern den Dezimalwert des entsprechenden hex-Wertes, also zwischen 0 und 65535. Alle Variablen sind als INTEGER deklariert, im DB werden mir diese auch entsprechend angezeigt, im Status des entsprechenden Bausteins nicht mehr, und das Programm verarbeitet den dann auch entsprechend. Eine Konvertierung von Word zu INT bringt auch nix.
Dieses Dezimalformat bei einem Analogwert fällt mir so schwer, z. B springt mein Analogwert von 0 auf 65535, wenn der Wert ins Negative wechselt
Mir fällt nix mehr ein, was ich tun könnte, um einen Eingangswert der Analogkarte beispielsweise auf < -32000 zu überprüfen.
Ich weiß, ich bin das Problem. Könnt ihr mir vielleicht auf die Sprünge helfen ?

Würde mich über eine Rückmeldung sehr freuen.
 
  • Physikalische Werte und die Normierung der AA und AE Karten gleich? (Hardwarekonfig)
  • Kennst du die Darstellung des Analogwertes bei S7 (-27648 bis 27648, sonst Unterlauf/Überlauf)?
 
  • Physikalische Werte und die Normierung der AA und AE Karten gleich? (Hardwarekonfig)
  • Kennst du die Darstellung des Analogwertes bei S7 (-27648 bis 27648, sonst Unterlauf/Überlauf)?
Normierung ist gleich. Ich schreibe die PEW Eingangsworte in INT, und diese sind im Online DB gleich wie der Sollwert aus der Ausgangskarte.
Die Darstellung des Analogwerts habe ich mittlerweile verinnerlicht, aber das ist nicht das Problem.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe jedoch Schwierigkeiten bei der Prüfung der Analogwerte. Ich würde die Analogwerte der Eingange gerne weiterverarbeiten, u.a. mit einem Toleranzfenster prüfen, jedoch bekomme ich dies im Programm nicht hin.
was hast Du bereits und wo konkret hängst Du?
 
Die Online Sicht in STEP7 Klassik zeigt für INT Werte diese Verhalten.
0..65535 anstatt -32768..+32767.
Warum auch immer. Ist halt so.

Wenn du denselben Wert in eine Beobachtungstabelle betrachtest, dann wird den korrekten Darstellung angezeigt.
Es ist mein Problem, dass in der Programmabarbeitung auch diese Werte verarbeitet werden. Mir kommt es zumindest so vor. Mein Programm sollte eigentlich mit den Werten der Beobachtungstabelle funktionieren, tut es aber nicht. Einfache Vergleiche auf kleiner oder größer bei negativen und positiven Zahlen. Step7 arbeitet mit den Werten 0-65535, dann funktionieren die Vergleiche nicht mehr.
 
Arbeite nicht mit den Zahlenwertes der Analogkarten, normiere am besten die Zahlenwerte zu deinen physikalischen Größen (real) (und umgekehrt).
 
was hast Du bereits und wo konkret hängst Du?
Ich hänge an Vergleichern, welche eine Überschreitung eines Grenzwerts im pos. und neg. Bereich erkennen sollen. Z.B <= -32000 und >=+32000.
Der neg. Vergleicher funktioniert nicht, da S7 mit dem Dezimalwert 0-65535 arbeitet, auch wenn ich in der Beobachtungstabelle den neg. Wert angezeigt bekomme.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Diese Datei habe ich vor 20 Jahren mal erstellt, vlt. hilft die ja weiter:
Vielen Dank. Ich habe solche Tabellen auch aus der Doku entnommen. Ich habe lange gebraucht, bis ich draufgekommen bin, dass S7 aus +/- 32767 dann 0-65353 macht. 0 bleibt aber weiterhin 0, der pos. Bereich ist dann 0-32767, der neg. Bereich 65636-32768. Wenn ich prüfen möchte, ob im negativen Bereich ein bestimmter Wert unterschritten wird z.B. kleiner 33000, dann ist dies im gesamten pos. Bereich der Fall.
 
bis ich draufgekommen bin, dass S7 aus +/- 32767 dann 0-65353 macht. 0 bleibt aber weiterhin 0, der pos. Bereich ist dann 0-32767, der neg. Bereich 65636-32768.
Das stimmt so nicht... am Ende ist das nur ne Interpretationsfrage. Wenn eine Variable als INT deklariert ist, kann die nicht 65000 groß sein...

Leg an nen Eingang mal fix -5V an.
Experimentiere mal etwas rum.
Den EW mal als WORD mal als INT deklarieren.
Die Variablen im Programm aufrufen und beobachten.
Die Variablen in ner Variablentabelle mal beobachten.
Mal mit ITD DTR zu REAL wandeln und beobachten...

Sind Deine Ein/Ausgänge auch als +/-10V eigestellt?
 
Zuletzt bearbeitet:
Es ist mein Problem, dass in der Programmabarbeitung auch diese Werte verarbeitet werden. Mir kommt es zumindest so vor. Mein Programm sollte eigentlich mit den Werten der Beobachtungstabelle funktionieren, tut es aber nicht. Einfache Vergleiche auf kleiner oder größer bei negativen und positiven Zahlen. Step7 arbeitet mit den Werten 0-65535, dann funktionieren die Vergleiche nicht mehr.
Das passt definitiv nicht.
Wenn du eine INT Vergleicher programmierst, dann funktioniert es wie man es erwartet,

Z.B, Variabel > 1234, dann ist den Ergebniss FALSE von Variabel -32768 bis +1234, und TRUE von Variabel +1235 bis +32767.
Alles per Variablentabelle beobachten.
Vertraue den Online Code-Sicht nicht.
 
so könnte dann Dein Code aussehen:

1734625574436.png


Code:
      L     L#-10000
      T     AW   512

      L     EW   512
      ITD  
      T     #Testeingang

      U(  
      L     #Testeingang
      L     L#-11000
      >D  
      )    
      U(  
      L     #Testeingang
      L     L#-9000
      <D  
      )    
      =     #Testeingang_OK
 
und da man ja kein AWL mehr machen darf, hier das ganze in SCL für Step7_5.x_prof und 5 Werte, die geprüft werden:

Code:
FUNCTION_BLOCK FB112

// Bausteinparameter
VAR_INPUT
    // Eingangsparameter
    Analoger_Eingang : INT;
END_VAR

VAR_OUTPUT
    // Ausgangsparameter
    Analoger_Ausgang : INT;
END_VAR

VAR
    // statische Variablen
    Zaehler            : INT;
    Flanke_Taktmerker  : BOOL;
    Impulsmerker_0_5Hz : BOOL;
    Bereich_OK         : ARRAY[0..5] OF BOOL;
END_VAR

    // Anweisungsteil
    Impulsmerker_0_5Hz := M0.7 AND NOT Flanke_Taktmerker;
    Flanke_Taktmerker := M0.7;

    IF Impulsmerker_0_5Hz THEN
       IF Zaehler < 0 OR Zaehler >= 5 THEN  Zaehler := 0;  END_IF; 
       Zaehler := Zaehler + 1;
    END_IF;
 
    Analoger_Ausgang := (Zaehler - 3) * 16000;
 
    Bereich_OK[Zaehler] := (Analoger_Eingang > (Analoger_Ausgang - 500)) AND (Analoger_Eingang < (Analoger_Ausgang + 500));
 
END_FUNCTION_BLOCK

Da funktioniert dann auch das Beobachten eines INT...

Frohe Weihnachten 🎁
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das ist definitiv nur ein Beobachtungs-Problem. INT-Anweisungen arbeiten korrekt mit -32768...+32767, weil sie nur die unteren 16 Bit der AKKUs verwenden.
Der AWL-Status zeigt den Wert des AKKU1 an (32 Bit !), und nicht den Wert der 16 Bit Variable. Wenn man einen 16 Bit Wert in einen 32 Bit AKKU lädt, dann werden immer die oberen 16 Bit auf 0 gesetzt. Aus 32-Bit-Sicht sind das Werte von 0 bis 65535. Will man, dass die 16-Bit-Werte auch als 32-Bit-Werte als -32768...+32767 angezeigt werden, dann muss man (natürlich) den 16-Bit-Wert im Akku (ursprünglich INT) korrekt nach 32 Bit DINT konvertieren: ITD
 
was mich hier Spasses halber mal interessieren würde : wie sieht denn der Code zu dem Sollwertgenerator aus ?
was bekommst du denn wenn du ein Voltmeter an deinen Analog-Ausgang hängst - verhalten sich die Werte da korrekt ?
 
was mich hier Spasses halber mal interessieren würde : wie sieht denn der Code zu dem Sollwertgenerator aus ?
was bekommst du denn wenn du ein Voltmeter an deinen Analog-Ausgang hängst - verhalten sich die Werte da korrekt ?
Ja, das passt, die Spannung an der Eingangskarte pendelt schön zwischen -10V und +10V.
Die Werte in den INT, in die ich die PEW schreibe, stimmen auch dazu.
 
Zurück
Oben