|
|||
| Aufgabe 8.1 | FC MUX_INT erstellen FUNCTION MUX_INT : INT VAR_INPUT iMW1, iMW2, iMW3, iMW4, iSEL:INT; END_VAR CASE iSEL OF 1: MUX_INT:=iMW1; 2: MUX_INT:=iMW2; 3: MUX_INT:=iMW3; 4: MUX_INT:=iMW4; ELSE MUX_INT:= 0; END_CASE Fügen Sie die FC der Bibliothek "ANALOG" hinzu. |
||
| Aufgabe 8.2 | FC MUX_INT benutzen Bibliothek "ANALOG" über den Bibliotheksverwalter hinzufügen oder die FC MUX_INT aud Aufgabe 8.1 im Projekt benutzen. VAR_GLOBAL iTemp1 AT %IW0:INT; iTemp2 AT %IW1:INT; iTemp3 AT %IW2:INT; iTemp4 AT %IW3:INT; iDruck1 AT %IW4:INT; iDruck2 AT %IW5:INT; iDruck3 AT %IW6:INT; iDruck4 AT %IW7:INT; END_VAR Beispiel einer Rezeptur .iTemp1:= -100 .iTemp2:= 200 .iTemp3:= 500 .iTemp4:= 1500 .iDruck1:= 10000 .iDruck2:= 15000 .iDruck3:= 20000 .iDruck4:= 32760 PROGRAM MESSWERTE (*Task 100ms*) (*Zeigt 4 Messwerte abhängig von einer Auswahlvariable an*) (*Autor: Schmitt, Version 1.0, Bibliothek: ANALOG.lib*) VAR iAuswahl_Temp, iAnzeige_Temp:INT; iAuswahl_Druck, iAnzeige_Druck:INT; END_VAR iAnzeige_Temp:= MUX_INT( iMW1:= iTemp1, iMW2:= iTemp2, iMW3:= iTemp3, iMW4:= iTemp4, iSEL:= iAuswahl_Temp); (*in der Visualisierung wird skaliert*) (*Werte skaliert übergeben*) iAnzeige_Druck:= MUX_INT( iMW1:= REAL_TO_INT(INT_TO_REAL(iDruck1) * 10.0/32760.0), iMW2:= REAL_TO_INT(INT_TO_REAL(iDruck2) * 10.0/32760.0), iMW3:= REAL_TO_INT(INT_TO_REAL(iDruck3) * 10.0/32760.0), iMW4:= REAL_TO_INT(INT_TO_REAL(iDruck4) * 10.0/32760.0), iSEL:= iAuswahl_Druck); |
||
| Aufgabe 8.3 | Analogwertverarbeitung 1, SCALE FUNCTION SCALE : REAL (*0...32760 umrechnen in rY_MIN...rY_MAX*) VAR_INPUT iX:INT; rY_MAX,rY_MIN:REAL; END_VAR SCALE:=(rY_MAX-rY_MIN)/32760.0*iX+rY_MIN;(*Implizierte Typenumwandlung*) oder FUNCTION SCALE : REAL VAR_INPUT iX:INT; rY_MAX,rY_MIN:REAL; END_VAR VAR r_m:REAL;(*Steigung*) END_VAR r_m:= (rY_MAX rY_MIN)/32760.0; SCALE:= r_m * iX + rY_MIN; PROGRAM PLC_PRG(*Testen der Funktion*) VAR iDruck_Per:INT;(*Speicher*) rDruck:REAL; END_VAR rDruck:=SCALE(iX:= iDruck_Per, rY_MAX:= 10.0, rY_MIN:= 6.0); Fügen
Sie die FC der Bibliothek "ANALOG" hinzu. |
||
| Übung 8.1 | Analogwertverarbeitung 2, SCALE Bibliothek "ANALOG" über den Bibliotheksverwalter hinzufügen oder die FC SCALE im Projekt benutzen. VAR_GLOBAL iTemp_Per AT %IW0 :INT;(*0...32760*) END_VAR PROGRAM PLC_PRG (*Skalieren 0...32760 -> -100...400*) (*Autor: xxx, Version: 1.0, Bibliothek: ANALOG.lib*) VAR r_Temp:REAL; END_VAR r_Temp:= SCALE(iX:=iTemp_Per, rY_MAX:=400.0, rY_MIN:=-100.0); |
||
| Übung 8.2 | a) FC-Radizieren_INT VAR_GLOBAL iMesswert1:INT:=25; iMesswert2:INT:=36; iOut1, iOut2:INT; END_VAR PROGRAM PLC_PRG (*messwert 1 und 2 radizieren und in iOut1 und 2 speichern*) VAR END_VAR iOut1:=RADIZIERER_INT(iMesswert1); iOut2:=RADIZIERER_INT(iMesswert2); FUNCTION RADIZIERER_INT : INT VAR_INPUT iIN:INT; END_VAR VAR rMw_in, rMw_out:REAL; END_VAR rMw_in:= INT_TO_REAL(iIN); rMw_out:= SQRT(rMw_in); RADIZIERER_INT:=REAL_TO_INT(rMw_out); b) SIN berechnen bei einem Winkel in Grad FUNCTION SIN_GRAD : REAL (*berechnet den SIN bei einem Winkel in Grad*) VAR_INPUT rIN:REAL; END_VAR VAR pi:REAL:= 3.14159; rBogenmass:REAL; END_VAR (*Grad in Bogenmaß*) rBogenmass:= 2*pi*(rIN/360.0); (*Rückgabewert berechnen*) SIN_GRAD:= SIN(rBogenmass); PROGRAM PLC_PRG (*Test der FC-SIN_GRAD()*) VAR a,b,c,d: REAL; END_VAR a:= SIN_GRAD(90.0); b:= SIN_GRAD(60.0); c:= SIN_GRAD(30.0); (*der Standard SIN-FC muss der Winkel im Bogenmaß übergeben werden*) d:= SIN(2 * 3.14159/4);(*90°*) c) Bahnkorrektur Lösung 1, umständlich FUNCTION ALARM : BOOL VAR_INPUT xSENSOR_L, xSENSOR_M, xSENSOR_R:BOOL; END_VAR ALARM:= (NOT xSENSOR_L AND NOT xSENSOR_M AND NOT xSENSOR_R) OR(xSENSOR_L AND xSENSOR_R); FUNCTION LINKS : BOOL VAR_INPUT xSENSOR_L, xSENSOR_M, xSENSOR_R:BOOL; END_VAR LINKS:= xSENSOR_L AND NOT xSENSOR_R; FUNCTION RECHTS : BOOL VAR_INPUT xSENSOR_L, xSENSOR_M, xSENSOR_R:BOOL; END_VAR RECHTS:= NOT xSENSOR_L AND xSENSOR_R; PROGRAM PLC_PRG (*Test*) VAR B1 AT %IX2.0:BOOL;(*Sensor links*) B2 AT %IX2.1:BOOL;(*Sensor mitte*) B3 AT %IX2.2:BOOL;(*Sensor rechts*) P1_Alarm AT %QX0.0:BOOL;(*Anzeige*) K1_Links AT %QX0.1:BOOL;(*Korrektur*) K2_Rechts AT %QX0.2:BOOL;(*Korrektur*) END_VAR P1_Alarm:= ALARM(xSENSOR_L:=B1, xSENSOR_M:=B2, xSENSOR_R:=B3); K1_Links:= LINKS(xSENSOR_L:=B1, xSENSOR_M:=B2, xSENSOR_R:=B3); K2_Rechts:= RECHTS(xSENSOR_L:=B1, xSENSOR_M:=B2, xSENSOR_R:=B3); Bahnkorrektur Lösung 2 mit DUT, der Rückgabewert ist vom Datentyp typKORREKTUR TYPE typKORREKTUR : STRUCT li, re, ok, alarm:BOOL; END_STRUCT END_TYPE FUNCTION FcBAHNKORREKTUR : typKORREKTUR VAR_INPUT SENSOR_li, SENSOR_mitte, SENSOR_re:BOOL; END_VAR FcBAHNKORREKTUR.li:=SENSOR_li AND NOT SENSOR_mitte AND NOT SENSOR_re OR SENSOR_li AND SENSOR_mitte AND NOT SENSOR_re; FcBAHNKORREKTUR.re:=NOT SENSOR_li AND NOT SENSOR_mitte AND SENSOR_re OR NOT SENSOR_li AND SENSOR_mitte AND SENSOR_re; FcBAHNKORREKTUR.ok:=NOT SENSOR_li AND SENSOR_mitte AND NOT SENSOR_re; FcBAHNKORREKTUR.alarm:=NOT SENSOR_li AND NOT SENSOR_mitte AND NOT SENSOR_re OR SENSOR_li AND NOT SENSOR_mitte AND SENSOR_re OR SENSOR_li AND SENSOR_mitte AND SENSOR_re; PROGRAM PLC_PRG (*************************************************** Bahnkorrektur aus Übung 3.3 als Funktion mit anwenderdefiniertem Datentyp. Verändern Sie den Wert von B1...B3 nach dem Einloggen und Start, beobachten Sie P1...K2. *************************************************************************) VAR B1 AT %IX0.0:BOOL;(*Sensor links*) B2 AT %IX0.1:BOOL;(*Sensor mitte*) B3 AT %IX0.2:BOOL;(*Sensor rechts*) P1_Alarm AT %QX0.0:BOOL;(*Anzeige*) K1_Links AT %QX0.1:BOOL;(*Korrektur*) K2_Rechts AT %QX0.2:BOOL;(*Korrektur*) ROBOTER_1:typKORREKTUR; END_VAR (**** Funktionsaufruf- Werte übergeben ****) ROBOTER_1:= FcBAHNKORREKTUR(SENSOR_li:=B1, SENSOR_mitte:=B2, SENSOR_re:=B3); (**** Ergebnis ins PAA schreiben ****) P1_Alarm:= ROBOTER_1.alarm; K1_Links:= ROBOTER_1.li; K2_Rechts:= ROBOTER_1.re; |
||
| Übungen 8. | Volumenberechnung mit
anwenderdefiniertem Datentyp als Parametertyp TYPE typKUGEL : STRUCT rFuellhoehe, rDurchmesser, rVolumen:REAL; END_STRUCT END_TYPE FUNCTION FcVOLUMEN : REAL VAR_INPUT ABMESSUNGEN:typKUGEL; END_VAR VAR Pi:REAL:=3.14; END_VAR FcVOLUMEN:=Pi*EXPT(ABMESSUNGEN.rFuellhoehe, 2) * (ABMESSUNGEN.rDurchmesser/2.0 - ABMESSUNGEN.rFuellhoehe/3.0); PROGRAM PLC_PRG (******************************************************************* Volumenberechnung mit anwenderdefiniertem Datentyp als Parametertyp des Füllvolumens von drei kugelförmigen Tanks. Geben Sie zum Test die Füllhohe und den Durchmesser ein, Überprüfen Sie das Füllvolumen. ********************************************************************) VAR Tank:ARRAY[1..3] OF typKUGEL; i: INT; END_VAR FOR i:=1 TO 3 DO Tank[i].rVolumen:=FcVOLUMEN(ABMESSUNGEN:=Tank[i]); END_FOR; |
||
| Bandanlage | Lösung | ||
© Vogel Buchverlag |
|||