Kurvenberechnug

A

Anonymous

Guest
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo , gibt es einen Baustein , der einen Kurve etrapoliert, die durch eine bestimmte Anzahl von Stützstellen definiert wird.
Ich möcht vermeiden dass ich einen Treppenfunktion bekomme, der Baustein soll die Treppe " glätten "

Danke für die anregenden Antworten
 

Ralf

Well-known member
Beiträge
194
Punkte Reaktionen
50
Sowas ist verhältnismäßig einfach zu schreiben /sofern nicht mathematische wiederlichkeizen wie Splines gefragt sind.
Wo hast Du denn Deine Stützpunkte abgelegt?

Gruß

Ralf
 

Ralf

Well-known member
Beiträge
194
Punkte Reaktionen
50
Nunja, hab mich gerade zuhause am Notepad versucht, so müßte es aber gehen
Code:
ABSZISSE 	ARRAY[0..9] of REAL // Die X-ACHSE Muß (!) aufsteigend eingegeben werden
ORDINATE 	ARRAY[0..9] of REAL // Die Y-ACHSE

* EINGANG *
WERT_X 		REAL

* AUSGANG *
WERT_Y 		REAL

* Temp *
Rette1 		DWORD
Step		WORD

Programm:

// Rette das Adressreg
	TAR1 #Rette1

	L	0		
	T	#Step
	L	9	// keine 10 Sonst gibts ja keine 2 Stützpunkte
SLZ:	L	#step 	// Adresse 'Ordinate'
	SLD 	3	// Mach Pointer 
	LAR1
	L 	D[AR1,P#0]
	L	#WERT_X
	<=R
	SPB	RECH	// Ist der Wert-X kleiner od gleich Rechnen
	L	#Step
	L	1
	LOOP	SLZ	// Sonst setze die Schleife fort
RECH:	L	Step
	T	#Wert_Y	// Erstmal Differenz Zwischenspeichern
	L 	D[AR1,P#4] // Den Größeren X-Wert laden
	L	D[AR1,P#0] // Den kleineren 
	-R	
	T	#Wert_Y	// Erstmal Differenz Zwischenspeichern
	L 	D[AR1,P#44] // Den Größeren Y-Wert laden
	L	D[AR1,P#40] // Den kleineren 
	-R
 	L	#Wert_Y	
	/R		    // Jetzt hat man die Steigung 
	T	#Wert_Y		 		
	L	#Wert_X
	L	D[AR1,P#0] 	
	-R		// Und den Abstand zum Ersten Stützpunkt
	L	#Wert_Y
	*R		// Das ist dann jetzt der Abstand auf der Y-Achse
	L	D[AR1,P#40]	
	+R
	T	#Wert_Y	// Rückschreiben Adressreg
	L	#Rette1
	LAR1
	BE
sollten Fehler drinsein, bitte melden

Gruß

Ralf
 
OP
A

Anonymous

Guest
Ich bin noch neu im AWL-Geschäft. ;)

Hat jemand zu diesem Thema einen funktionierenden Baustein, den man sich mal ansehen kann?

@Ralf
Nichts gegen Deinen Code, aber irgendwie ist das Ganze ja noch ziemlich unvollständig.
Sollte der Baustein nicht in einer definierten Taktung aufgerufen/abgearbeitet werden?
Wie kommen die Werte von Ordinate und Abszizze in den Baustein?
Wie gesagt, ich bin noch Neuling. Deshalb Entschuldigung, falls meine Fragen zu "primi" sind.

---------------
Eigentlich brauche ich eine Funktion, die folgendes macht:

Es gibt eine Tabelle mit folgenden Werten:
Zeit1, Sollwert1
Zeit2, Sollwert2
Zeit3, Sollwert3

Innerhalb einer Zeit x soll ein Wert ausgegeben werden, der schrittweise von Sollwert y-1 auf Sollwert y angeglichen wird. Nach Ablauf von Zeit x hat der Ausgabewert den Wert Sollwert x. (Falls ich mich nicht zu umständlich ausgedrückt habe. )
Beispiel:
Zeit2 = 10s, Sollwert1 = 100, Sollwert2 = 200
Innerhalb von 10 s soll der Ausgabewert vom 100 auf 200 angeglichen werden.

Vielleicht kann mir jemand mit einem Lösungsansatz (oder gar einem ganzen FB :)) helfen.

Vielen Dank
Sabine
 

volker

Supermoderator
Teammitglied
Beiträge
5.471
Punkte Reaktionen
935
Zuviel Werbung?
->Hier kostenlos registrieren
Einsteiger schrieb:
Beispiel:
Zeit2 = 10s, Sollwert1 = 100, Sollwert2 = 200
Innerhalb von 10 s soll der Ausgabewert vom 100 auf 200 angeglichen werden.

wie soll der wert denn angefahren werden? als gerade oder als kurve?

als gerade
soll2 - soll1 = diff
diff / zeit2 = solländerung je sekunde
 
OP
A

Anonymous

Guest
Als Gerade.
Also z.B. wenn der Baustein jede Sekunde aufgerufen würde:
0. Sekunde -> Sollwert1 = 100
1. Sekunde -> Sollwert1 = 110
2. Sekunde -> Sollwert1 = 120
...
10. Sekunde -> Sollwert1 = 200

Nach Ablauf der Zeit1, kommt dann Zeit2 dran usw. Damit kann man den Sollwert prima stetig verändern und nicht als Sprung.
 

volker

Supermoderator
Teammitglied
Beiträge
5.471
Punkte Reaktionen
935
gewünschtes habe ich dir doch aufgezeigt.

Code:
un impuls
spb m001

u erster_durchlauf
spb init
s  erster_durchlauf
l sollwert1
t sollwertaktuell
spa m001

l sollwert2
l sollwert1
-i
t differenz
l 10 //sekunden
/i
t diff_je_sekunde
init: nop 0

l sollwertaktuell
l diff_je_sekunde
+i
t sollwertaktuell
m001: nop 0
 
Oben