TIA Wie kann man eine Variable deklarieren, die zwischen 0-10V liegt?

Servus,

die 0..10V musst du an deinem analogen Eingang bzw. Ausgang in deiner Hardwarekonfiguration einstellen.
Das zugewiesene Eingangs- bzw. Ausgansworte haben dann eine lineare Skalierung zu 0..27648.

Sprich:
0V -> 0
5V -> 13.824
10V -> 27.648

An deiner Funktion wirst du wahrscheinlich das Eingangs- und Ausgangswort deiner Analogkarten angeben müssen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die 0-10V liegen z.B. an einer entsprechenden Eingangskarte an, diese liefert dann eine proportional zur Spannung passende Integer Zahl. In der Steuerung arbeitest Du dann mit dieser Zahl. Bei Siemens gibt es dann Skalierungsbausteine mit denen Du diese Zahl dann wieder in 0-10V zurückrechnen kannst.
Bei den Ausgängen ist es dann umgekehrt. Du errechnest eine Integerzahl die am Ausgang dann eine bestimmte Spannung erzeugt.
 
@R4m80 Und wie würde man diese Spannweite von 0-27648 deklarieren? Ich muss folgende Funktion programmieren

Anhang anzeigen 62337
Naja über die Funktion rechnest Du eine Spannung von 0-10V aus und diese rechnest Du dann mit einem Dreisatz in 0-27648 um.
Schau Dir mal diesen FAQ Beitrag an, vielleicht hilft der.
Die Umrechnung des Eingangswertes X_loc von 0-27648 in 0-10V läuft dann ähnlich, nur umgekehrt.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Dazai,
sind dies alle Informationen zu der Aufgabe? Denn es scheint als würde hier noch etwas fehlen, deine Funktion würde fast permanet 10V am Analogausgang ausgeben da der X_loc quadriert wird.

Hab es nur mal schnell gerechnet ca. 0.25V am Eingang = 10V am Ausgang?

Mit freundlichen Grüßen
 
sind dies alle Informationen zu der Aufgabe? Denn es scheint als würde hier noch etwas fehlen, ...
Die Formel sieht auch recht merkwürdig aus.
2,5 V mit der Einheit V und dann (0,075/ V) und dann X_log² dimensionslos, aber eigentlich in V².
V²/V = V. Das passt zwar insgesamt, aber irgendwie wurden in dieser Formel die Zusammenhänge versteckt/cachiert/verschleiert, so dass man nicht ohne weiteres nachvollziehen kann, wo was herkommt.

Hab es nur mal schnell gerechnet ca. 0.25V am Eingang = 10V am Ausgang?
Bei mir kommt bei ca. 0.25 am Eingang ca. (ein wenig mehr als) 2.5 am Ausgang heraus. Erwartungsgemäss.
 
Zuletzt bearbeitet:
Hab es nur mal schnell gerechnet ca. 0.25V am Eingang = 10V am Ausgang?

Vlt auch verrechnet.
Bei mir geht sich das auf beiden Seiten recht schön mit 0-10V aus. Es kommt halt eine nicht lineare Kurve raus

2,5V -> 6.912

x_loc wandeln wir noch kurz in Real um um einen überlauf zu vermeiden und ab geht die Lucy


Code:
tmp_real:= sqr(int_to_real(x_loc));   // quadrieren der eingangsgroesse
tmp_real:= tmp_real * 0.075;          // mal dem faktor
y_loc:= 6912 + real_to_int(tmp_real); // + 2,5V

Oder wenn du unbedingt vorher auf Volt umrechnen willst.

Code:
tmp_ValueInVolt := (int_to_real(x_loc)*10.0)/27648;        // saklieren auf 0..10V
tmp_real:= sqr(tmp_ValueInVolt);                           // quadrieren der eingangsgroesse
tmp_real:= tmp_real * 0.075;                              // mal dem faktor
tmp_real:= 2.5 + tmp_real;                                 // + 2,5V
y_loc:= real_to_int((tmp_real/10)*27648);                // rueckskalieren von 0..10V
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
tmp_real:= sqr(int_to_real(x_loc));   // quadrieren der eingangsgroesse
tmp_real:= tmp_real * 0.075;          // mal dem faktor
y_loc:= 6912 + real_to_int(tmp_real); // + 2,5V
Das geht gar nicht, den RohWert von der Karte (6912 ist ja "sinngemäss" 27648*0,25) mit in die Formel hineinzuschmuggeln!
"Ent oder weder", wie man so schön sagt.
Der Kommentar ist ja OK. Leider passt er nicht zur Berechnung.
Zum Glück hast Du noch Deine 2. Variante für "VoltLiebhaber" in #8 nachgetragen. ;)
 
Code:
tmp_real:= sqr(tmp_ValueInVolt);                           // quadrieren
Übrigens kann man anstatt der spezial Siemens Quadrier-Funktion sqr(Value) auch einfach schreiben Value * Value, dann ist der Code kompatibel mit Codesys und der IEC61131, und man versteht den Code vermutlich auch besser und ohne Verwechslungsgefahr mit sqrt() (Quadratwurzel)

Harald
 
Übrigens kann man anstatt der spezial Siemens Quadrier-Funktion sqr(Value) auch einfach schreiben Value * Value,
Also:
Code:
tmp_real := int_to_real(x_loc) * int_to_real(x_loc);
Denn ...
Code:
tmp_real := int_to_real(x_loc * x_loc) ;
... war ja nicht beabsichtigt wegen der drohenden Überläufe bei INT.

Hattest Du nicht erst kürzlich auch den Operator ** erwähnt?
Code:
tmp_real := int_to_real(x_loc) ** 2.0 ;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Öhm, kann man Analogwerte nicht leichter per Normierung und Skalierung umrechnen und dann genau die oben genannte Formel damit füttern?
Das macht das ganze doch wesentlich übersichtlicher und verständlicher, oder nicht?
Code:
#x_loc := SCALE_X(MIN:= 0, VALUE:=NORM_X(MIN := 0, VALUE := #X, MAX := 27648), MAX:=10); // Eingangsgröße der Karte (0-27648) erst normieren(0..1) und dann skalieren(0..10)
#y_loc := 2.5 + 0.075 * #x_loc * #x_loc; // Formel, was auch immer
#Y := SCALE_X(MIN := 0, VALUE := NORM_X(MIN := 0, VALUE := #y_loc, MAX := 10), MAX := 27648); // Ergebnis (2.5..10) erst normieren (0.25..1) und dann skalieren (xxx..26748)
 
Zuletzt bearbeitet:
Öhm, kann man Analogwerte nicht leichter per Normierung und Skalierung umrechnen und dann genau die oben genannte Formel damit füttern?
Das macht das ganze doch wesentlich übersichtlicher und verständlicher, oder nicht?
Ich hatte mir gerade die Frage gestellt, warum Normierung und Skalierung? Beim Versuch, meine BildungsLücke zu schliessen, habe ich die Antwort in diesem Forum gefunden:
Wie heißt es so schön, automatisieren Sie jetzt mit 2 Bausteinen, wo Sie früher nur einen benötigt haben. ;)

PS:
Schön an Deiner Lösung, Salli1991, finde ich die übersichtliche, zeilenweise Trennung/Gliederung in
- Vorbereitung
- wieder erkennbare Formel und
- Nachbereitung

Ein wenig irritiert mich allenfalls die identische Reihenfolge von "erst normieren ... und dann skalieren" bei der Vor- und Nachbereitung.
Ich muss wohl doch noch etwas mehr gegen meine BildungsLücke tun ... ;)
 
Zuletzt bearbeitet:
@Heinileini Vielen Dank für die Antworten :) Eine Frage noch: Im Zusammenhang mit Analogen und digitalen Werten wird immer viel konvertiert (in deinem Fall int_to_real). Was ist der Grund dafür? Warum kann man x_loc nicht vorher als Real deklarieren statt int? Dann wäre die Konvertierung nicht nötig.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
@Heinileini Vielen Dank für die Antworten :) Eine Frage noch: Im Zusammenhang mit Analogen und digitalen Werten wird immer viel konvertiert (in deinem Fall int_to_real). Was ist der Grund dafür? Warum kann man x_loc nicht vorher als Real deklarieren statt int? Dann wäre die Konvertierung nicht nötig.
Du hast vermutlich immer noch nicht begriffen, was bei einer SPS bei der Bearbeitung von Analogwerten passiert, oder ich habe Dich nicht begriffen.
Die Variable x_loc ist doch was von der analogen Eingangskarte kommt und diese liefert bei 0-10V Karten einen Integerwert, der aber nicht, wie oftmals bei einer analogen Eingangskarte für Temperatursensoren, direkt ablesbar dem Messwert, z.B. in 1/10V Schritten entspricht, sondern einer Zahl, die erst in eine Spannung umgerechnet werden muss.
Da dann Nachkommastellen auftreten können, wandelt man den Integerwert in ein Real um und rechnet dann.
 
Zuletzt bearbeitet:
Im Zusammenhang mit Analogen und digitalen Werten wird immer viel konvertiert (in deinem Fall int_to_real). Was ist der Grund dafür?
Dein Beitrag #1 liest sich so, dass x_loc von einer "AnalogZuDigitalUmwandelHardware" angeliefert wird und y_loc an eine "DigitalZuAnalogUmwandelHardware" weitergereicht wird. Manchmal werden diese Dinger als "Karte" bezeichet mal als "Klemme" oder wie auch immer. Und den Begriff "Hardware" bitte ich nicht so ganz streng wörtlich zu nehmen. Diese Umwandler kommen heutzutage i.A. auch nicht mehr ohne MicroProcessor/MicroController aus und enthalten somit auch Software.
Üblichlerweise sind aber die digitalen Werte, die man von einem AnalogEingang angeliefert bekommt bzw., die man an einen AnlogAusgang übergibt, vom DatenTyp INT, also eine "Vorzeichen-behaftete" 16 Bit GanzZahl.
Die 16 Bit werden oft nicht von den A/D- bzw. D/A-Wandlern voll und ganz ausgenutzt (z.B gibt es 10-Bit oder13-Bit Wandler). Aber dennoch sind diese Bits meistens linksbündig in den 16 Bit angeordnet. Rechts davon gibt es dann manchmal einfach nur 0-Bits oder "Status-Bits".
Die Interpretation als INT ist dadurch trotzdem gegeben und sinnvoll. Selbst dann, wenn die negativen Werte uninteressant sind, z.B. bei einem rein positiven MessBereich von 0..10 V. Es empfiehlt sich, die Beschreibungen der benutzten AI/AE- bzw. AO/AA-Karten zu lesen, um herauszufinden, ob und inwiefern evtl. von meiner verallgemeinerten Darstellung abgewichen wird.
Nun ja, wie gesagt, sind diese Werte i.A. als INT-Zahlen zu interpretieren und somit ist der DatenTyp INT dadurch vorgegeben.
Wenn die Aufgabe, diese Werte in der SPS zu verarbeiten, es erfordert oder als ratsam erscheinen lässt, lieber mit GleitKommaZahlen (REAL oder LREAL) oder auch mit anderen GanzZahl-DatenTypen (DINT oder LINT) zu arbeiten, dann muss man die DatenTypen eben entsprechend konvertieren.
Man muss die Konvertierung natürlich nicht ausgerechnet in die Formel packen, sondern kann sie vornehmen bevor die Werte in die Formel einfliessen bzw. nachdem sie dort berechnet werden, siehe #12.
Die DatenTypKonvertierungen verstecken sich dort evtl. in den Funktionen NORM und SCALE bzw. sind an unterschiedlichen DatenTypen der Eingangs- und AusgangsVariablen zu erkennen. Ggfs also auch die Beschreibungen dieser Funktionen lesen.

PS:
Vooorsicht, wenn Du irgendwo etwas von "VorzeichenBit" liest - damit ist (fast?) immer das höchstwertige Bit eines Ganzzahl-DatenTyps (INT, DINT, ...) gemeint. Gemeint ist dann aber trotzdem (fast?) immer die Darstellung negativer Zahlen als ZweierKomplement.
Die Beschreibungen der D/A- bzw. A/D-WandlerKarten sind leider in dieser Beziehung oft verführerisch irreführend formuliert.
 
Zuletzt bearbeitet:
"Ich hatte mir gerade die Frage gestellt, warum Normierung und Skalierung?"

"Ein wenig irritiert mich allenfalls die identische Reihenfolge von "erst normieren ... und dann skalieren" bei der Vor- und Nachbereitung.
Ich muss wohl doch noch etwas mehr gegen meine BildungsLücke tun ... ;)"
Bitte entschuldige, wenn ich was falsch gemacht habe^^ Ich komme aus der Automobilindustrie, und da hat man dank Standards leider nie wirklich mit Analogwertverarbeitung zu tun....

Magst du mir denn verraten, wie man es besser machen kann?=)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Magst du mir denn verraten, wie man es besser machen kann?=)
Nein, das kann ich nicht. Das war doch keine Kritik an Dir.
Als ehemaliger S5- und ein Bisschen auch S7-Programmierer bin ich nur ein (nicht immer ganz) stiller Beobachter der heutigen "Szene". ;)
 
Zurück
Oben