F_IOPortWrite
Mit der Funktion F_IOPortWrite kann eine eSize-breite I/O Position beschrieben werden. Siehe auch die Beschreibung der F_IOPortRead Funktion.
![]() | Ein direkter Hardwarezugriff stellt keine Probleme dar, solange Daten nur gelesen werden. |
Hinweis | |
Absturz durch Schreibzugriff EIN SCHREIBENDER ZUGRIFF KANN ZU ABSTÜRZEN FÜHREN UND/ODER DIE HARDWARE/ DATEN AUF DEN SPEICHERMEDIEN ZERSTÖREN. MIT DIESER FUNKTION KANN DIE HARDWARE SO BESCHÄDIGT WERDEN, DASS SIE NICHT MEHR BOOTFÄHIG IST. BITTE BENUTZEN SIE DIESE FUNKTION NUR, WENN SIE GENAU WISSEN, WAS SIE TUN! |
FUNCTION F_IOPortWrite : BOOL
VAR_INPUT
nAddr : UDINT;
eSize : E_IOAccessSize;
nValue: DWORD;
END_VAR
nAddr: I/O Portadresse.
eSize: Anzahl der Datenbytes die geschrieben werden sollen.
nValue: Wert, der geschrieben werden soll.
Rückgabeparameter | Beschreibung |
---|---|
TRUE | Kein Fehler |
FALSE | Fehler |
Beispiel in ST:
Im folgenden Beispiel wurde mit Hilfe der I/O-Port Funktionen ein SPS-Baustein zur direkten Ansteuerung des PC-Lautsprechers implementiert.
Interface:
FUNCTION_BLOCK FB_Speaker
(* Sample code from: "PC INTERN 2.0", ISBN 3-89011-331-1, Data Becker *)
VAR_INPUT
freq : DWORD := 10000; (* Frequency [Hz] *)
tDuration : TIME := T#1s; (* Tone duration *)
bExecute : BOOL; (* Rising edge starts function block execution *)
END_VAR
VAR_OUTPUT
bBusy : BOOL;
bError : BOOL;
nErrID : UDINT;
END_VAR
VAR
fbTrig : R_TRIG;
nState : BYTE;
sts61H : DWORD;
cnt42H : DWORD;
cntLo : DWORD;
cntHi : DWORD;
timer : TON;
END_VAR
Implementation:
fbTrig( CLK := bExecute );
CASE nState OF
0:
IF fbTrig.Q THEN
bBusy := TRUE;
bError := FALSE;
nErrID := 0;
timer( IN := FALSE );
IF F_IOPortWrite( 16#43, NoOfByte_Byte, 182 ) THEN
cnt42H := 1193180 / freq;
cntLo := cnt42H AND 16#FF;
cntHi := SHR( cnt42H, 8 ) AND 16#FF;
F_IOPortWrite( 16#42, NoOfByte_Byte, cntLo ); (* LoByte *)
F_IOPortWrite( 16#42, NoOfByte_Byte, cntHi ); (* HiByte *)
timer( IN := TRUE, PT := tDuration );
sts61H := F_IOPortRead( 16#61, NoOfByte_Byte );
sts61H := sts61H OR 2#11;
F_IOPortWrite( 16#61, NoOfByte_Byte, sts61H ); (* speaker ON *)
nState := 1;
ELSE
nState := 100;
END_IF
END_IF
1:
timer( );
IF timer.Q THEN
sts61H := F_IOPortRead( 16#61, NoOfByte_Byte );
sts61H := sts61H AND 2#11111100;
F_IOPortWrite( 16#61, NoOfByte_Byte, sts61H ); (* speaker off *)
bBusy := FALSE;
nState := 0;
END_IF
100:
bBusy := FALSE;
bError := TRUE;
nErrID := 16#8000;
nState := 0;
END_CASE
Test application:
PROGRAM MAIN
VAR
fbSpeaker : FB_Speaker;
bStart : BOOL;
END_VAR
fbSpeaker( freq:= 5000,
tDuration:= t#1s,
bExecute:= bStart );
Voraussetzungen
Entwicklungsumgebung | Zielplattform | Einzubindende SPS Bibliotheken |
---|---|---|
TwinCAT v2.10.0 Build > 1257 | PC or CX (x86) | TcSystem.Lib |