F_IOPortWrite
The function F_IOPortWrite writes a one eSize wide I/O position. See also description F_IOPortRead Function.
![]() | Direct hardware access is no problem if you only read data. |
Note | |
Risk of data loss using write access HOWEVER, BY WRITING DATA, YOU MAY CRASH OR EVEN PERMANENTLY DAMAGE YOUR HARDWARE AND/OR DESTROY DATA ON YOUR DISKS. THIS FUNCTION MAY SEVERELY DAMAGE YOUR HARDWARE AND CAN EVEN MAKE YOUR COMPUTER UNBOOTABLE. PLEASE DO ONLY USE IT, IF YOU EXACTLY KNOW WHAT YOU ARE DOING! |
FUNCTION F_IOPortWrite : BOOL
VAR_INPUT
nAddr : UDINT;
eSize : E_IOAccessSize;
nValue: DWORD;
END_VAR
nAddr: I/O port address.
eSize: Number of data bytes to write.
nValue: Value, that shall be written.
Return paramters | Description |
---|---|
TRUE | Kein Fehler |
FALSE | Fehler |
ST sample:
In the following example, a PLC module for direct control of the PC speaker was implemented using the I/O port functions.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 );
Requirements
Development environment | Target system type | PLC libraries to include |
---|---|---|
TwinCAT v2.10.0 Build > 1257 | PC or CX (x86) | TcSystem.Lib |