Codesys mehrere Schalter

Pantii

Level-1
Beiträge
6
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen !

Ich habe da mal eine Frage (komme einfach nicht mehr drauf)
Beim erstellen einer Passmaßtabelle würde ich gerne die Möglichkeit haben, jeden der angegebenen Passungen H7 oder H10 auführen zu können.
Also in der Visu dann den entsprechenden Schalter drücken und er generiert daraus dann das entsprechende Passmaß.
Also z.B. beim eingegebenen Nennmaß von 2 auf H6 dann auf H10 und so weiter, quasi hin und herschalten können.

Könnte mir bitte wer auf die Sprünge helfen was mir im unten aufgeführten Code fehlt?

Vielen Dank vorab

Code:
(*Nennmaß 0-3*)
IF  n >0 AND n <3 THEN
		IF H5 THEN 
			GO:=n+0.004; 
			GU:=n; 
			Toleranz:=0.004;

				ELSIF H6 THEN
					GO:=n+0.006; 
					GU:=n; 
					Toleranz:=0.006;
					
						ELSIF H7 THEN
							GO:=n+0.010; 
			  				GU:=n; 
			   				Toleranz:=0.010;
				
								ELSIF H8 THEN
									GO:=n+0.014;
									GU:=n;
									Toleranz:=0.014;
						
										ELSIF H9 THEN
											GO:=n+0.025;
											GU:=n;
											Toleranz:=0.025;
						
												ELSIF H10 THEN
													GO:=n+0.040;
													GU:=n;
													Toleranz:=0.040;
							
														ELSIF H11 THEN
															GO:=n+0.060;
															GU:=n;
															Toleranz:=0.060;
									
																ELSIF H12 THEN
																	GO:=n+0.100;
																	GU:=n;
																	Toleranz:=0.100;
									
																		ELSIF H13 THEN
																			GO:=n+0.140;
																			GU:=n;
																			Toleranz:=0.140;
		END_IF
END_IF
 
Zuletzt bearbeitet:
Ich nochmal,

habe nochmal eine Visu dazu angehangen (schnell gemacht) damit ihr vielleicht noch einen besseren Überblick habt :)

2013-05-17_191014.png
 
Hallo KingHelmer,

"Fehler" habe ich keine, ich kann lediglich in der Visu nicht zwischen den Passmaßen hin und her schalten. Ein "Schalter" also Passmaß geht dann war es das.

Die Deklaration schaut so aus:
Code:
VAR
	n: REAL;      							// Nennmaß
	GO: REAL;	  							// Oberes Grenzmaß
	GU: REAL;	  							// Unteres Grenzmaß
	Toleranz:REAL;							//Toleranz
	H5,H6,H7,H8,H9,H10,H11,H12,H13:BOOL;	// Toleranzklasse
END_VAR

Gruß
 
Und da bin ich noch mal :)

Wie man im Bild sieht, kann ich mehrere "Schalter" betätigen.
Ich möchte aber nur einmal auf H5 drücken, dann soll er die Rechnung ausspucken. Wenn ich dann auf H10 drücke eben diese Rechnung :)

Ich hoffe das nun ein bissel deutlicher ausgedrückt als im obrigen Beitrag.
Danke wie immer vorab für jede Hilfe
2013-05-17_200926.png
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

das einfachste wäre das ganze nicht über If zu machen sonder mit case of. Dann in der Visu mit den Schaltern eben die Nummer für den Case setzen und schon funktionierts.
Oder aber in der Visu muß die vorherige Auswahl zurückgesetzt werden. Dann funktioniert das Programm auch so.

Gruß
M_o_t
 
Danke für deine Antwort,

es gibt aber eine Möglichkeit die Schalter beim Betätigen eines Anderen zurückzusetzen auch mit IF also im Code :)
Ich weiß nur ncht mehr wie :(

Gruß
 
Habe es jetzt so gelöst:
Code:
IF H5 THEN 
			GO:=n+0.004; 
			GU:=n; 
			Toleranz:=0.004;
                        [B]H5:=FALSE;[/B]
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Oi, das ist doch mal eine schöne Fingerübung für Zwischendurch ;)

Ich bin ja ein Fetischist in Sachen Probleme mit möglichst wenig Code zu lösen, der aber trotzdem noch lesbar ist......

Also das habe ich mir ebend ausgedacht:
(Getestet in TwinCAT, also keine Garantie das es 1:1 in Codesys funktioniert... sollte aber weil ich nur Standardbefehle nutze)

Ich brauche eine neue Struktur (damit es übersichtlich bleibt)

Code:
TYPE struct_Params :
STRUCT
	GO	:REAL;
	GU	:REAL;
	Tol	:REAL;
END_STRUCT
END_TYPE

Variablendeklaration im Programm:

Code:
VAR
	H		:WORD; 	(*Zustand der Taster in der Visu als Bitfolge (verwende hier nur 5 Taster) ... mit DWORD bis 32 Taster*)
	H_alt	:WORD;	(*Speichert den letzten Zustand der Taster (für den Vergleich)*)
	Nenn	:REAL;	(*aktuelle Nenndurchmesser der in der Visu steht*)
	Nenn_alt	:REAL;	(*Speichert den letzten Nenndurchmesser (für Vergleich)*)

	(*Dieses Array enthält die Passmaße für die gewünschten Passungen (hier nur 5  zum testen)*)
	Params	:ARRAY[0..4] OF struct_Params := 	(GO := 0.1, GU := 0.00, Tol := 0.001),
											(GO := 0.2, GU := 0.02, Tol := 0.002),
											(GO := 0.3, GU := 0.03, Tol := 0.003),
											(GO := 0.4, GU := 0.04, Tol := 0.004),
											(GO := 0.5, GU := 0.05, Tol := 0.005);

	Index	:INT;	(*Arrayindex*)
	GO, GU, Tol 	:REAL;	(*Variablen zum Anzeigen der Passmaße in der Visu*)
END_VAR

Das Programm:

Code:
IF (H <> H_alt) OR (Nenn <> Nenn_alt) THEN	(*Prüft ob A) ein anderer Taster gedrückt wurde oder B) ein neuer Nennwert eingegeben wurde*)
	IF H <> H_alt THEN	(*Wenn neuer Taster gedrückt :*)
		H := H XOR H_alt;	(*XOR sorgt dafür das der Wert des alten Tasters zurückgesetzt wird ... Damit ist immer nur der letzte Taster aktiv*)
		H_alt := H;		(*Speichern des Bitmusters*)

		(*Logarithmus zur Basis 2  um den Feldindex anhand des gedrückten Tasters zu Berechnen*)
		Index := REAL_TO_INT(LOG(H) / LOG(2));
	END_IF

	(*Berechnung von GO, GU, Tol aus Nennwert und Passmaßen*)
	GO := Nenn + Params[Index].GO;
	GU := Nenn + Params[Index].GU;
	Tol := Params[Index].Tol;

	(*Speichern des Nennwertes*)
	Nenn_alt := Nenn;
END_IF

In der VISU:
Die Variable H stellt den Zustand der Taster H5 bis H13 als Bitmuster dar.
Taster H5 wird mit dem ersten Bit der Variable H verknüpft (H.0) .... usw. usf.... Taster H13 mit dem 8ten Bit (H.8 ).

Was passiert im Programm?
Zuerst wird geprüft ob entweder ein anderer Taster gedrückt wurde (H <> H_alt) oder ein neuer Nennwert eingegeben wurde (Nenn <> Nenn_alt).
Wurde ein neuer Taster gedrückt, muss der alte Taster zurück gesetzt werden. Das passiert mit dem XOR.
Jetzt wissen wir welcher Taster gedrückt ist und können damit den dazugehörigen Index der Passmaßtabelle berechnen.
Bsp. Taster H7 gedrückt => H hat den Wert 4 (H.3 = true).
Der duale Logarithmus von 4 ist 2. Da Codesys/TwinCAT aber nur den dekadischen Log berechnen kann machen wird das über den Umweg ld(H) = log(H)/log(2).
Es werden dann die Passmaße aus dem Array[2] auf den Nennwert addiert.

Zum Schluss wird noch Nenn in Nenn_alt zwischengespeichert, damit das Programm erkennt wenn ein neuer Nennwert eingegeben wurde und die Werte neu berechnen kann.


Ich hoffe das war halbwegs verständlich ;)

EDIT: Der Vorteil in meinem Code: Ich kann bis zu 32 Parametersätze darstellen (nur das Array muss entsprechend erweitert werden und die Buttons in der VISU müssen angelegt werden) ohne etwas am Programmcode ändern zu müssen ......

EDIT EDIT: Es geht noch kürzer wenn man die Prüfung auf einen neuen Nennwert weglässt und die Berechnung einfach in jedem Zyklus durchführt egal ob sich der Wert geändert hat oder nicht ....
 
Zuletzt bearbeitet:
Zurück
Oben