Step 7 Analogwert umrechnen

doemy

Level-1
Beiträge
58
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebe SPS-Gemeinde,

ich bin am verzweifeln...

Ich habe einen Druckschalter, der mit ein Analogsignal ausgibt. Dieses möchte ich nun umrechnen, um mir am Panel den aktuellen Druck anzeigen zu lassen. kann mir jemand helfen, ich bekomme die komschsten Werte, aber nichts vernünftiges.
Druckschalter kann 0-10 Bar.

Habe es folgendermaßen versucht:

L #Eingangswert // z.B. 16376
L #Divisor // 3276 (Auflösung AI durch 10)
/I
T MD 10 // Ergebnis ist hier 1048581

Weiß leider nicht, was ich falsch machen...


Danke.
 
Ich empfehle dir den Scale Baustein zu verwenden.
Außerdem hast du ein Wort also wäre MW 10 richtig.
Wird das MW nicht anderweitig verwendet ? Divisor kein temp oder wenn temp dann vorher zugewiesen ?


Gesendet von meinem iPhone mit Tapatalk
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Mitchih,

Habe es im FC105 versucht, MD auch zu MW geändert, und die Temp sind auch zugewiesen.

Habe zur Sicherheit nochmal direkte Werte versucht. Kommt trotzdem Müll raus. MW wird nirgends anders verwendet.

Gruß doemyumrechnen.jpg
 
Was meinst du mit in Real machen?

Wenn ich das ganze mit 1000/100 mache, funktioniert es wunderbar...
Unbenannt.jpg
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

Im AWL-Editor stelle den Cursor in die Zeile mit dem /I und drücke F1. Dann lies konzentriert was die Anweisung tut und was sie als Ergebnis liefert.

Dein Fehler: Du speicherst das Ergebnis der Division UND den Divisionsrest (AKKU1-H) in MD10. Das macht irgendwie überhaupt keinen Sinn. (außerdem ist Dein Divisor falsch, falls Du einen Siemens-Analogeingang benutzt)

Zweitens: willst Du als Ergebnis wirklich nur Ganzzahl-Werte 0 bis 10? Keine Nachkommastellen? Warum dann ein DINT als Ergebnis-Variable? Ein INT reicht da dicke. Wenn Du das Ergebnis einer 16-Bit-Division in einen 32-Bit-Wert speichern willst, dann mußt Du vorher den Divisionsrest aus AKKU1-H entfernen, z.B. durch "UD DW#16#FFFF" oder durch "SLD 16" + "SRD 16". Normalerweise speichert man das Ergebnis einer 16-Bit-Operation in eine 16-Bit-Variable - da braucht man nicht beachten, daß /I zusätzlich den Divisionsrest in AKKU1-H liefert.

Besser: skaliere in eine REAL-Variable, dann erhältst Du auch Nachkommastellen.
Code:
L #Eingangswert
ITD
DTR
L 2764.8
/R
T MD 10

Falls Du es etwas flexibler brauchst dann schaue Dir mal den FC105 SCALE aus der "Standard Library / TI-S7 Converting Blocks" an.

Harald
 
MD auch zu MW geändert, und die Temp sind auch zugewiesen.

Habe zur Sicherheit nochmal direkte Werte versucht. Kommt trotzdem Müll raus.
Wenn Du das AWL-Programm beobachtest, dann siehst Du bei "T MW10" nicht, welcher Wert dem MW10 zugewiesen wird, sondern welchen Wert der komplette AKKU1 bei der Operation hat. Du mußt das MW10 in einer Variablentabelle beobachten oder im AWL-Programm wieder einlesen "L MW10", dann siehst Du welcher Wert tatsächlich in MW10 landet.

Harald
 
Ich bin noch ganz am Anfang der Analogwertverarbeitung bei Siemens. Deshalb vielleicht meine Fehler und etwas unbeholfenheit. Habe bisher nur mit CoDeSys Analogwerte gerechnet. Da macht es alles, wie man es hinschreibt.
Bei Siemens scheint das ganze viel komplizierter zu sein...

Habe es mit deinem Code versucht, aber auch da kommen sehr seltsame Ergebnisse raus
Unbenannt.jpg
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn Du meinen Code nimmst, dann bitte richtig. Ich speichere nicht in MW10 sondern in MD10 - eine REAL-Variable.

Damit Du beim AWL-beobachten REAL-Ergebnisse sehen kannst, mußt Du die Anzeige auf Gleitpunkt umstellen: Rechtsmausklick in die Spalte "Standard" > Darstellung > Gleitpunkt
Auch hier nochmal der Hinweis: besser das MD10 in einer Variablentabelle beobachten: Zielsystem > Variable beobachten/steuern

Wenn Du mit AWL noch nicht genug Erfahrung hast dann wäre es vielleicht sinnvoll, zunächst in FUP oder KOP zu programmieren, da passieren nicht so viele Fehler wie in AWL möglich sind.

Harald
 
Habe bisher nur mit CoDeSys Analogwerte gerechnet. Da macht es alles, wie man es hinschreibt.
Bei Siemens scheint das ganze viel komplizierter zu sein...
Das hat nix mit Siemens oder CodeSys zu tun.
Du versucht nach deinem /R gerade einen 32-Bit IEE754-FloatingPoint in einen 16Bit-WORD-Datentyp (MW10) zu schreiben.
Du solltest eigentlich schon von CodeSys wissen dass das ohne vorangehende Konvertierung nicht gut gehen kann.
(Wobei CodySys-ST möglicherweise automatisch ne implizite Konvertierung macht. Als Programmierer muss man aber trotzdem wissen dass dies geschieht)

Wie jede SPS macht auch die Siemens genau dass was du ihr hinschreibst.

Nimm statt dem MW10 (Merker-Word) mal ein MD10. Deklariere diese in der Symboltabelle auch mit einem Symbol und Typ REAL.
Da du mit REAL rechnest, dann solltest du auch mit der Darstellung "Gleitpunkt" beobachten.
Wenn du beim Beobachten in der Spalte "Stardard" einen Rechtsklick machst, gibt es das Menü "Darstellung" in der du entweder auf
"Automatisch" oder eben "Gleitpunkt" einstellen kannst.

Nächte Frage: Warum nimmt du nicht einfach den FC105 -SCALE? Bevor du versuchst das Rad neu zu erfinden.
 
Zuletzt bearbeitet:
Habe bisher nur mit CoDeSys Analogwerte gerechnet. Da macht es alles, wie man es hinschreibt.
Auch bei Siemens tut es das genau wie man es hinschreibt ;)

Falls Du bei Codesys die Programmiersprache ST gewöhnt bist - bei Siemens heißt die SCL. Vermutlich kommst Du damit besser klar. Dazu im Quellen-Ordner einen Rechtsmausklick > Neues Objekt einfügen > SCL-Quelle

Kopf hoch. Aller Anfang ist schwer. Und man muß erstmal viel lernen und Hilfedateien lesen.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe es mit MD10 und MW10 versucht. In dem Fall den Screenshot aber mit MW10 gemacht...

OK, werde ich alles mal versuchen.

Ich bin kein Programmierer, das ist nur Hobby, bzw. mit Siemens mache ich Kleinere Sachen bei der Arbeit. Aber eben zum ersten mal was mit Analogwerten.
Werde ich wohl machen mir besser nochmal alles langsam von Anfang an durchlesen, was was macht. Dann komm ich vielleicht besser klar.

Danke für eure Antworten und Hilfen.

Gruß doemy
 
Zuletzt bearbeitet:
Hallo zusammen,

habe die Scalierung inzwischen auf die Reihe bekommen.
um den Wert gerundet anzuzeigen, multipliziere ich ihn mit 10, runde ihn und dividiere dann wieder mit 10.
Nach der Division kommt aber 0 raus.
Kann mir jemand sagen, wo mein Fehler liegt?

Danke.
1.jpg2.PNG
 
Am SCALE kommt ein REAL (32bit-GLEITPUNKTZAHL) raus.
ROUND macht dann aus dem REAL eine 32bit Ganzzahl (DINT)

Dann kopierst du mit MOVE (das Bitmuster) von "gerundet" auf "gerundet_r".
Jetzt hast du aber in "gerundet_r" welcher REAL ist einen Wert in Ganzzahlen-Darstellung drin.
MOVE macht keine Typenkonvertierung!

Dann dividierst du deinen REAL (mit Ganzzahl-Inhalt) durch einen "echten" Real -> Problem.
Deshalb siehst du bei der Betrachtung des Wertes "gerundet_r" in Gleitpunkt-Ansicht beim Dividieren auch irgendwas mit 10^-44

Nimm statt dem MOVE den Befehl "DI_R" (DINT_to_REAL) und gut ist. Der führt eine korrekter Konvertierung von DINT in das REAL-Format durch.


PS.: Die EN-Eingänge brauchst die nicht unbedingt beschalten. Wenn dort kein Parameter drangeschrieben ist wird die Funktion immer ausgeführt!
EN brauchst du nur beschalten wenn du die Funktion bedingt oder gar nicht ausführen willst. Der M80.2 in den Screenshots ist also eigentlich sinnlos.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
@TE
Um nochmal auf Deinen ersten Post zurück zu kommen:
Hier muss man mal wieder sagen: F1 hilft!
Es ergibt keine vernünftiges Ergebnis, wenn man /I in ein MD transferiert.
Wie in der Hilfe steht, wird der Quotient in AKKU1-L gespeichert, der Divisionsrest in AKKU1-H, AKKU1 setzt sich also aus Quotient und Divisionsrest zusammen. Wenn Du das vollständig übernimmst, so wie Du das durch T MD.. getan hast, kann nur Unsinn rauskommen.
 
Zurück
Oben