Step 7 Analogeingangssignal in einen Zeitwert umwandeln

Eduard Schleich

Level-2
Beiträge
60
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich hab ein Problem bei dem ich Hilfe benötige.

Ich muss eine Verzögerung programmieren bei der die Länge der Verzögerung über ein Poti eingestellt wird. Dazu folgender Aufbau.

An einer S7-313C habe ich an den ersten Analogeingang mein Poti angeschlossen. Dieses ist mit 10V belegt und der Eingang an der CPU ist auch richtig eingestellt.
Wenn ich meinen Analogeingang (EW10) überwache bekomm ich je nach Potistellung Werte zwischen 0 und 27648. Soweit denk ich ist das richtig.
Der Eingang ist in der Symboltabelle als INT deklariert.

Ich möchte diese Werte nun an einen TON als Zeitwert übergeben, also T#xxxms!
Wie muss ich denn nun vorgehen damit ich diese Werte umwandeln kann? Idealerweise wäre eine Skalierung 0/0ms und 27648/2000ms.

Google sagt mir ich soll den FC105 nutzen. Allerdings versteh ich nicht so recht wie ich diesen nutzen muss da der Wert an OUT immens groß ist. Der OUT ist mit einem MD belegt.

Ich programmier noch nicht so lange drum würde ich mich freuen wenn mir das ganze jemand Idiotensicher erklären kann.


Freundliche Grüße

Edi
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der FC105 liefert einen REAL-Wert, den Du für T#... erst wieder in eine Ganzzahl wandeln müsstest.
Bei Deiner sehr einfachen Umrechnung brauchst Du aber keinen FC105. Multipliziere einfach Dein EW10 mit 1000 und dividiere danach durch 13824, dann erhältst Du die gewünschten 0...2000

Harald
 
Allerdings versteh ich nicht so recht wie ich diesen nutzen muss da der Wert an OUT immens groß ist. Der OUT ist mit einem MD belegt.
Der Grund warum dein Wert so groß aussieht ist wahrscheinlich dass du den Wert als Ganzzahl beobachtest. Der FC105 gibt am OUT einen REAL (Gleitpunktzahl ) aus.

Wenn du beim beobachten deines MDs in Programmeditor oder in der Variablentabelle die Darstellungsweise auf Gleitpunkt stellst, dann solltest du eigentlich was vernünftiges sehen. Wobei anzumerken ist das Real im Programmeditor im Exponentialformat angeziegt wird.
Also 2000.0 = 2.000000e+003. In der Variablentabelle mit Darstellung Gleitpunkt siehst du es als 2000.0

Den Gleitpunkt vom FC105 musst du dann z.B. mit ROUND in eine Ganzzahl wandeln und dann in eine TIME-Variable schreiben die du dann dem TON fütterst.
 
Multipliziere einfach Dein EW10 mit 1000 und dividiere danach durch 13824, dann erhältst Du die gewünschten 0...2000
Das reicht natürlich auch, hier aber aufpassen dass der Eingangswert nicht <0 wird, was zb. bei 4..20mA durchaus möglich ist wenn vom Sensor z.B. nur 3.9mA daherkommen. Also am besten dafür sorgen dass das Eingangssignal nicht <0 oder >27648 wird.
Dann würden bei deiner Rechnung nämlich negative Millisekunden rauskommen... ;)
 
Naja, fast.

..Multipliziere einfach Dein EW10 mit 1000 und dividiere danach durch 13824, dann erhältst Du die gewünschten 0...2000..
Beachte dabei dass das Ergebnis den Integer-Wertebereich überschreitet, also mit den DINT-Operationen arbeiten. Wenn negative Werte zu erwarten wären, müssten die INT mit ITD nach DINT gewandelt werden.
Weiterhin sollte man noch beachten dass ein S7-Timer mit dem Wert T#0ms nicht ausgeführt wird. Also besser auf 1..2000ms normieren, oder einfach auf den Bereich 0..2000ms ein Millisekündchen draufrechnen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Analogeingang auf 1..2000 skalieren

Is es wirklich so einfach??? :confused:
Ja. Simple Ganzzahl-Mathematik. Inklusive Begrenzung auf Ergebnis T#1ms ... T#2000ms sind nur wenige Zeilen AWL nötig (kann man für mehrfach-Verwendung auch in einen parametrierbaren FC umformen):
Code:
      L     EW    10    //Analogwert -32768..0..27648..32767
      L     14          //nach Skalierung *1000/13824 soll min. 1 rauskommen
      <I
      SPB   ckmx        //Analogwert durch Min-Wert ersetzen
      POP               //(oder TAK) Analogwert zurück in AKKU1
ckmx: L     27648
      >I
      SPB   conv        //Analogwert durch Max-Wert ersetzen
      POP               //(oder TAK) Analogwert zurück in AKKU1
conv: L     1000
      *D                //(oder *I) ergibt max 27648000 = DINT!
      L     13824
      /D                //muß zwingend /D sein, weil die Multiplikation einen DINT ergeben haben kann
      T     #tmp_Time   // T#1..2000ms

In KOP/FUP wird das ganze etwas aufwendiger wegen der Typprüfung der Operanden und weil man da die Akkus nicht als Zwischenspeicher benutzen kann. Die Verschaltung der Boxen und ENO-Steuerung benötigt auch noch zusätzlichen Code.
1-2000_KOP.jpg

Hier der AWL-Code der KOP-Lösung (in AWL-Ansicht in ein leeres Netzwerk einfügen, dann Ansicht auf KOP oder FUP umstellen):
Code:
      O(
      L     EW    10
      T     #tmp_INT
      SET
      SAVE
      CLR
      U     BIE
      )
      O(
      U(
      L     #tmp_INT
      L     14
      <I
      )
      SPBNB _001
      L     14
      T     #tmp_INT
      SET
      SAVE
      CLR
_001: U     BIE
      )
      O(
      U(
      L     #tmp_INT
      L     27648
      >I
      )
      SPBNB _002
      L     27648
      T     #tmp_INT
      SET
      SAVE
      CLR
_002: U     BIE
      )
      =     L     38.0
      U     L     38.0
      SPBNB _003
      L     #tmp_INT
      ITD
      T     #tmp_DINT
_003: NOP   0
      U     L     38.0
      SPBNB _004
      L     #tmp_DINT
      L     L#1000
      *D
      T     #tmp_DINT
_004: NOP   0
      U     L     38.0
      SPBNB _005
      L     #tmp_DINT
      L     L#13824
      /D
      T     #tmp_DINT
_005: NOP   0
      U     L     38.0
      SPBNB _006
      L     #tmp_DINT
      T     #tmp_Time
_006: NOP   0

Harald
 
Hi zusammen.

Also ich hab es jetzt mit Hilfe des FC105 Bausteins gemacht wie Ronin oben beschrieben hatte. Ich war schon auf dem richtigen Weg nur hab ich irgendwie nicht gepeilt das das Ergebnis keine Dez-Zahl ist. Wenn man sich alles richtig anschaut und dann auch dementsprechend umwandelt gehts auf einmal. Ganz so wie´s PN/DP in der Signatur stehen hat ;).

Danke an alle

Edi
 
Zurück
Oben