Hallo zusammen,
auf Arbeit möchte ich Ein/Ausgangskarten vom Prozessleitsystem testen,
bevor sie in die laufende Anlage eingebaut werden. Es geht um zwei Typen
von E/A-Karten, einmal 4 Analogeingänge und 4 Analogaugänge und einmal 8
Analogeingänge. Zum Testen habe ich jeweils die 4 Ausgänge auf die
Eingänge zurückgeführt und für die andere Karte die auch die 4 Ausgänge
auf die Eingänge 1&5, 2&6, 3&7 und 4&8 zurückgeführt. Das klappt auch
prima.
Nun möchte ich aus den Ausgängen ein Sinus Signal raus geben. Welches
man dann an den Eingängen wieder sehen kann. Im Leitsystem wollte ich
folgendes programmieren:
z.B. Ausgang 1 = 100 * sin(2π*(0bis100%=Eingang1/100)
Ausgang wir ausgegeben und gleich wieder als Eingang 1 eingelesen.
Wenn ich die Gleichung in Excel berechnne kommt auch ein Sinus raus aber
wenn ich mir den Trend vom Aus- oder Eingang ansehe ist das nicht
wirklich ein Sinus obwohl der Messwert nur Werte zwischen 0 und 100%
annimmt.
Die allgemeine Form der Funktion ist ja folgende:
f(x)=a*sin(b*(x-c)+d) (a und b dürfen nicht 0 werden)
wobei man mit:
a die Funktion senkrecht streckt (x-Achse)
b die Funktion waagerecht streckt (y-Achse)
c die Funktion waagerecht verschieben (y-Achse)
d die Funktion senkrecht verschieben (x-Achse)
Was mache ich verkehrt? Normalerweise wird die Berchnung, die Ausgabe
und Eingabe jeweils mit 1 Sekunde ausgeführt. Wenn ich auf den Eingang
einen Filter lege wird das Signal gedämpft, wenn er groß (mehrere
Sekunden größer 10) genug ist bekomme ich eine Linie bei 50% im Trend.
Es scheint also so als ob die Ausgabe ein Signal ist und es nur nicht
richtig im Trend angezeigt werden kann. Ein Oszi hatte ich noch nicht
dran. Der Sinus sollte zwischen 0 und 100% pendeln wenn eine Periode 10
Sekunden dauert reicht das ja, das müsste im Trend problemlos angezeigt
werden können.
> f(x)=a*sin(b*(x-c)+d)
Hier ist "d" eine Phasenverschiebung.
Entweder:
f(x)=a*(sin(b*(x-c))+d)
oder:
f(x)=a*sin(b*x-c)+d
Bei d=0 wird f natürlich auch negativ - können das deine DACs/ADCs?
Falls f auch Werte zwischen 0 und 100 liefern soll, muß a=50 und d=1
resp d=a sein.
L(S)inus schrieb:> f(x)=a*sin(b*(x-c)+d) (a und b dürfen nicht 0 werden)> d die Funktion senkrecht verschieben (x-Achse)
Sicher? Also zum einen war zu meiner Schulzeit die senkrechte Achse im
Koordinatensystem die Y-Achse. Und wenn Du mit der Addition von d den
Funktionswert in der Vertikalen verschieben willst, dann sollte d nicht
im Argument der Sinus-Funktion stehen...
Grüßle
Volker
L(S)inus schrieb:> f(x)=asin(b(x-c)+d)
Früher (tm) stand "asin" für Arkus Sinus, also die Umkehrfunktion von
Sinus. Wenn du in deinem Code genauso schludrig schreibst, ist fast
jeder Unsinn möglich.
Wolfgang schrieb:> L(S)inus schrieb:>> f(x)=asin(b(x-c)+d)>> Früher (tm) stand "asin" für Arkus Sinus, also die Umkehrfunktion von> Sinus. Wenn du in deinem Code genauso schludrig schreibst, ist fast> jeder Unsinn möglich.
Schau mal, ob bei dir das „sin(b“ kursiv (oder fett) ist.
Dann liegt es am Formatsyntax des Forums.
Dirk B. schrieb:> Schau mal, ob bei dir das „sin(b“ kursiv (oder fett) ist
Alles normale Schrift.
Um die Formatierungsfunktion des Forums zu umgehen, empfiehlt es sie,
die pre-Tags zu verwenden.
foobar schrieb:>> f(x)=a*sin(b*(x-c)+d)>> Hier ist "d" eine Phasenverschiebung.>> Entweder:> f(x)=a*(sin(b*(x-c))+d)> oder:> f(x)=a*sin(b*x-c)+d>> Bei d=0 wird f natürlich auch negativ - können das deine DACs/ADCs?> Falls f auch Werte zwischen 0 und 100 liefern soll, muß a=50 und d=1> resp d=a sein.
Danke, die Gleichung f(x)=a*(sin(b*(x-c))+d) ist für meinen Fall die
Richtige mit a=50 und a=b=c=1.
also effektiv rechne ich:
Ausgang = sin(π*1,9*Merker/100-1)+1*50
Dann den Merker + Faktor(z.B.4,5 irgendwas zwische 0,2 und 1,9*π)=Merker
Dann prüfen ob (1.9*π-Merker)*(-1) positv ist, falls Ja dann den Merker
löschen sonst wieder von voen beginnen.
Bei genau 2π hatte ich immer einen aussetzer alle 2 Perioden, deshalb
habe ich 1,9*π genommen dann ging es. Das muss ich mir aber am Montag
nochmal ansehen es kann auch daran liegen das ich für die Prüfung nicht
2(1.9) sondern 100 genommen hatte, ich hatte den falschen Merker
genommen.
Zumindest habe ich jetzt das Ergebnis was ich wollte. Das rückführen der
Ausgänge ist gar nicht notwendig, da reicht ja die Anzeige der
eingelesenen Werte. Das hochzählen mit dem Faktor hat dann die Lösung
gebracht.
Schönes Wochenende.
> Volker schrieb> Sicher?
Nein ich hatte eine Klammer vergessen.
> Wolfgang schrieb:> L(S)inus schrieb:>> f(x)=asin(b(x-c)+d)>> Früher (tm) stand "asin" für Arkus Sinus, also die Umkehrfunktion von> Sinus. Wenn du in deinem Code genauso schludrig schreibst, ist fast> jeder Unsinn möglich.
Ich meinte sin also die Sinusfunktion nicht Arkus Sinus a mal sin...
Ich hatte aber die Klammern falsch gesetzt.
StefG schrieb:> Kann der Ausgang negative Werte?> Sonst fehlt ein Offset damit das Signal positiv bleibt...
Ja den Ausgang könnte ich auch auf jeden gewünschten Messbereich
skalieren, aber ich möchte, dass ein Bereich von 0 bis 100% ausgegeben
wird.
Dann kann man schön sehen ob alle Kanäle den gleichen Wert rausgeben
bzw. einlesen.
> Danke, die Gleichung f(x)=a*(sin(b*(x-c))+d) ist für meinen Fall die> Richtige mit a=50 und a=b=c=1.
Was denn nun? a=50 oder a=1?
> also effektiv rechne ich:> Ausgang = sin(π*1,9*Merker/100-1)+1*50
Da fehlen wieder die Klammern. Du solltest beim Programmieren etwas
sorgfältiger vorgehen, sonst wird das nix.
Und das mit der 1.9 solltest du dir etwas genauer anschauen und nach der
Ursache suchen - sonst mogelst du dir deine Daten nur zurecht.
foobar schrieb:>> Danke, die Gleichung f(x)=a*(sin(b*(x-c))+d) ist für meinen Fall die>> Richtige mit a=50 und a=b=c=1.>> Was denn nun? a=50 oder a=1?
a=50 es war kurz vor Feierabend tut mir leid.
>>> also effektiv rechne ich:>> Ausgang = sin(π*1,9*Merker/100-1)+1*50>> Da fehlen wieder die Klammern. Du solltest beim Programmieren etwas> sorgfältiger vorgehen, sonst wird das nix.
Ich musste die Gleichung wieder für das Forum "übersetzten", da in einer
Anweisungsliste programmiert wird, so eine Art Assembler. Dabei habe ich
die Klammer wieder übersehen.
Bei Minute 3:16 und 6:25 im folgenden Video kannst Du vielleicht das
Prinzip wie programmiert wird sehen. In dem Video wird erklärt wie ein
einfacher Regelkreis aufgebaut wird. Weil er kein realen Prozess hat
bildet er ihn mit einer Gleichung ab.
https://www.youtube.com/watch?v=0vUrL_7VA6o>> Und das mit der 1.9 solltest du dir etwas genauer anschauen und nach der> Ursache suchen - sonst mogelst du dir deine Daten nur zurecht.
Ja das schaue ich mir am Montag nochmal an.
L(S)inus schrieb:> Ja das schaue ich mir am Montag nochmal an.
Also ich habe es mir nochmal angesehen und vereinfacht ich hatte von
0-100% in 0-2π umgerechnet und wieder zurück. Das war unnötig. Ich habe
mal das Ergebnis im Foto festgehalten und hier angehangen. Links ist die
Umsetzung der Funktionsgleichung und rechts das Ergebnis im Trend.
Danke an foobar, StefG, Volker B., Dirk B. und Wolfgang.