Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 9 von 9

Thema: Codesys mehrere Schalter

  1. #1
    Registriert seit
    11.01.2013
    Beiträge
    6
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    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
    Geändert von Pantii (17.05.2013 um 20:50 Uhr)
    Zitieren Zitieren Codesys mehrere Schalter  

  2. #2
    Pantii ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    11.01.2013
    Beiträge
    6
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ich nochmal,

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

    2013-05-17_191014.png

  3. #3
    Registriert seit
    21.02.2011
    Ort
    Deutschland, Baden-Würtemberg
    Beiträge
    989
    Danke
    114
    Erhielt 125 Danke für 100 Beiträge

    Standard

    Wie hast du deine Variablen deklariert und was ist der ausgespuckte Fehler?
    PS: Habs noch nich angeschaut!

  4. #4
    Pantii ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    11.01.2013
    Beiträge
    6
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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ß

  5. #5
    Pantii ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    11.01.2013
    Beiträge
    6
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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

  6. #6
    Registriert seit
    13.01.2005
    Ort
    Allgäu
    Beiträge
    146
    Danke
    4
    Erhielt 23 Danke für 18 Beiträge

    Standard

    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

  7. #7
    Pantii ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    11.01.2013
    Beiträge
    6
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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ß

  8. #8
    Pantii ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    11.01.2013
    Beiträge
    6
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Habe es jetzt so gelöst:
    Code:
    IF H5 THEN 
    			GO:=n+0.004; 
    			GU:=n; 
    			Toleranz:=0.004;
                            H5:=FALSE;

  9. #9
    Registriert seit
    24.02.2009
    Beiträge
    1.242
    Danke
    23
    Erhielt 276 Danke für 235 Beiträge

    Standard


    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 ....
    Geändert von MasterOhh (18.05.2013 um 12:09 Uhr)

Ähnliche Themen

  1. CoDeSys: Mehrere Programme in einem Projekt verwalten
    Von Klimamensch im Forum CODESYS und IEC61131
    Antworten: 7
    Letzter Beitrag: 14.11.2012, 09:39
  2. Codesys mehrere Visualisierungs-Oberflächen benutzen
    Von ARobert im Forum CODESYS und IEC61131
    Antworten: 8
    Letzter Beitrag: 01.12.2011, 18:54
  3. Schalter
    Von redscorpion im Forum Simatic
    Antworten: 11
    Letzter Beitrag: 15.05.2011, 15:22
  4. schalter
    Von stan_keiler im Forum Simatic
    Antworten: 16
    Letzter Beitrag: 21.04.2010, 11:57
  5. Schalter A durch Schalter B schließen und umgekerhrt?
    Von TechnikFreak10 im Forum Simatic
    Antworten: 23
    Letzter Beitrag: 11.03.2010, 23:23

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •