F_IOPortWrite

F_IOPortWrite 1:

Mit der Funktion F_IOPortWrite kann eine eSize-breite I/O Position beschrieben werden. Siehe auch die Beschreibung der F_IOPortRead Funktion.

F_IOPortWrite 2:

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