Twincat 3: Variable von HMI und AI beschreiben

gout

Level-1
Beiträge
28
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,
auch auf die Gefahr mich lächerlich zu machen, ich komme auf keine vernünfitge Lösung :confused:

Zur Situation ich möchte eine Rolladensteuerung bauen.

Ich kriege von einen Schalter einen Prozentwert in Byte, und von der HMI einen INT Wert 0-100 %.
Jetzt will natürlich auf dem Schalter und der HMI auch den Prozent wert anzeigen.


Ich hab nur das Problem, dass ich mir Kostant meinen Wert überschreibe, weil aus der HMI kommt eine Null
und vom Schalter z.B. eine 128 (50%). Dann Fährt der 50 % auf und dann durch die HMI 50 % zu.
Ich krieg es leider gerade gedanklick nich hin.
Code schreib ich hier mal rein (Variablenbenahmung ist noch nicht so richtig schön)

Code:
FUNCTION_BLOCK Rolladen_Prozent
VAR_INPUT
	
	bProzent :BYTE;
	Laufzeit : TIME; 
END_VAR
VAR_OUTPUT
	bPWM_Rolladen_Auf :BOOL;
	bPWM_Rolladen_Ab  :BOOL;
	HMI_Output:BYTE;		//Entfernen
END_VAR
VAR_IN_OUT
	HMI :INT;
END_VAR
VAR
	
	Vergleicher : BYTE;
	
	i : INT;
	nTime: INT;




	nProzent: INT;
	nProzent_HMI: INT;


	tLaufzeit1: TIME;
	tLaufzeit2: TIME;


	ET1: TIME;
	ET2: TIME;


	ImpulsAuf: TP;
	ImpulsAb: TP;


	bStartAuf :BOOL;
	bStartAb: BOOL;
	bProzent_HMI: REAL;
	
	bProzent_Neu1 :REAL;
	bProzent_Neu2: REAL;
	
	//FÜR HMI 
	HMI_byte :BYTE;
	HMI_Real :REAL;


	nHMI: INT;
	bHmi_Neu1 :REAL;
	bHmi_Neu2 :REAL;
	HMI_Vergleicher: INT;


	
	
	
END_VAR










nTime := TIME_TO_INT(Laufzeit)/100;


IF HMI <> HMI_Vergleicher THEN
	HMI_Real := INT_TO_REAL(HMI)*2.55; 
	HMI_byte := REAL_TO_BYTE(HMI_Real); 
END_IF




IF bProzent<Vergleicher THEN
	i:=10; //Auffahren
	ELSIF  bProzent>Vergleicher THEN 
	i:=20;	//Abfahren
	ELSIF HMI_byte<Vergleicher THEN 
	i:=30; //Auffahren
	ELSIF HMI_byte>Vergleicher THEN 
	i:=40;	//Abfahren	
END_IF


CASE i OF 
10:	bProzent_Neu1:=BYTE_TO_REAL(Vergleicher)-BYTE_TO_REAL(bProzent);
 	nProzent := REAL_TO_INT(bProzent_Neu1/2.55);
 	nProzent_HMI:= REAL_TO_INT(BYTE_TO_REAL(bProzent)/2.55);
 	tLaufzeit1 := INT_TO_TIME(nProzent*nTime);
 	bStartAuf :=TRUE;
	 IF ET1=tLaufzeit1 THEN
		 ImpulsAuf.IN :=FALSE;
		
		 bStartAuf:=FALSE;
		 bStartAb:=FALSE;
		 tLaufzeit1 :=T#0S;
		 ET1 :=T#0S;
		 Vergleicher := bProzent;
		 HMI_byte :=bProzent;
		 HMI:= nProzent_HMI;
		 i:=0;
		 HMI_Vergleicher := bProzent;
		
	END_IF;




20:	bProzent_Neu2:=BYTE_TO_REAL(bProzent)-BYTE_TO_REAL(Vergleicher);
	nProzent := REAL_TO_INT(bProzent_Neu2/2.55);
	nProzent_HMI:= REAL_TO_INT(BYTE_TO_REAL(bProzent)/2.55);
	tLaufzeit2 := INT_TO_TIME(nProzent*nTime);
	bStartAb :=TRUE;
 	  IF ET2=tLaufzeit2 THEN
		ImpulsAb.IN :=FALSE;
		
		bStartAb:=FALSE;
		bStartAuf:=FALSE;
		tLaufzeit2 :=T#0S;
		ET2 :=T#0S;
		HMI_byte :=bProzent;
		Vergleicher := bProzent;
		HMI:= nProzent_HMI;
		i:=0;
		HMI_Vergleicher := bProzent;
		
	END_IF			






30:
	bHmi_Neu1:=BYTE_TO_REAL(Vergleicher)-BYTE_TO_REAL(HMI_byte);
 	nHMI := REAL_TO_INT(bHmi_Neu1/2.55);
 	tLaufzeit1 := INT_TO_TIME(nHMI*nTime);
	bStartAuf :=TRUE;
	IF ET1=tLaufzeit1 THEN
		 ImpulsAuf.IN :=FALSE;
	
		 bStartAuf:=FALSE;
		 bStartAb:=FALSE;
		 tLaufzeit1 :=T#0S;
		 ET1 :=T#0S;
		 Vergleicher := HMI_byte;
		 bProzent:=HMI_byte;
		//HMI:= nHMI;
		 i:=0;
		 HMI_Vergleicher:=HMI;
		 
	END_IF 






40:


 	bHmi_Neu2:=BYTE_TO_REAL(HMI_byte)-BYTE_TO_REAL(Vergleicher);
 	nHMI := REAL_TO_INT(bHmi_Neu2/2.55);
 	tLaufzeit2 := INT_TO_TIME(nHMI*nTime);
	bStartAb :=TRUE;
 	IF ET2=tLaufzeit2 THEN
		ImpulsAb.IN :=FALSE;
		
		bStartAb:=FALSE;
		bStartAuf:=FALSE;
		tLaufzeit2 :=T#0S;
		ET2 :=T#0S;
		Vergleicher := HMI_byte;
		bProzent:=HMI_byte;
		i:=0;
		HMI_Vergleicher:=HMI;
		
	
 END_IF	




50:






END_CASE






ImpulsAb(IN:= bStartAb, PT:=tLaufzeit2 , Q=> bPWM_Rolladen_Ab, ET=> ET2);
ImpulsAuf(IN:= bStartAuf, PT:=tLaufzeit1 , Q=> bPWM_Rolladen_Auf, ET=> ET1);


Ich bin drauf und dran das Thema neu zu machen aber mir fehlt ein rihtiger ansatz um das Problem zu umgehen.
 
Können nicht der Schalter und die HMI die selbe Sollwert-Variable benutzen?
Wenn beide immer nur bei Tastenbetätigungen/Eingaben den Wert des Sollwertes ändern, dann sollte das funktionieren.

Was ist das für ein Schalter, wie wird der Sollwert (AI?) gebildet?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Harald,
es ist ein KNX Taster den ich über die KL6301 auslese.
Funktioniert auch einwandfrei.

Ich hab ehrlich gesahgt gerade das Problem, dass ich nicht weiß wie ich den Eingang doppel Belegen kann. Bei Bool operatoren kein Problem oder bei Ausgängen, aber bei eingängen soweit ich weiß nicht möglich.
 
Hallo Harald,
es ist ein KNX Taster den ich über die KL6301 auslese.
Funktioniert auch einwandfrei.

Ich hab ehrlich gesahgt gerade das Problem, dass ich nicht weiß wie ich den Eingang doppel Belegen kann. Bei Bool operatoren kein Problem oder bei Ausgängen, aber bei eingängen soweit ich weiß nicht möglich.

Du musst erkennt ob die Sollwertänderung vom Schalter oder der Visu kommt.
So in der Art

Code:
If SollwertSchalter <> SollwertschalterAlt then 
 SollwertRollo := SollwertSchalter;
 SollwertSchalterAlt := SollwertSchalterAlt;
End_If

If SollwertVisu <> SollwertschalterVisu then 
 SollwertRollo := SollwertVisu;
 SollwertVisuAlt := SollwertVisuAlt;
End_If

Das setzt erstmal voraus, dass du bei Schalter und Visu getrennte Variablen für Soll- und Istwert hast.
Wenn nicht, dann musst mit Sperrbits arbeiten.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... nur ganz anders.
Sorry, Dieter, meintest Du so etwas:
Code:
If SollwertSchalter <> SollwertschalterAlt then 
 SollwertRollo := SollwertSchalter;
 SollwertSchalterAlt := SollwertSchalter;
End_If;
If SollwertVisu <> SollwertVisuAlt then 
 SollwertRollo := SollwertVisu;
 SollwertVisuAlt := SollwertVisu;
End_If;
?

Ja sowas meinte ich.
Ich seh schon: Du denkst mit :)
 
Zurück
Oben