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.

Hinweis

Beschädigung der Hardware

Ein direkter Hardwarezugriff stellt kein Problem dar, solange Daten nur gelesen werden. 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.

FUNCTION F_IOPortWrite : BOOL

F_IOPortWrite 2: Eingänge

VAR_INPUT
    nAddr  : UDINT;
    eSize  : E_IOAccessSize;
    nValue : DWORD;
END_VAR

Name

Typ

Beschreibung

nAddr

UDINT

I/O-Portadresse

eSize

E_IOAccessSize

Anzahl der Datenbytes die geschrieben werden sollen (Typ: E_IOAccessSize).

nValue

DWORD

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 (Kategoriegruppe)

TwinCAT v3.1.0

PC oder CX (x86, x64, ARM)

Tc2_System (System)