Bekomme FB_IOLRead nicht zum laufen.

Robi123

Level-2
Beiträge
38
Reaktionspunkte
6
Hallo zusammen,
habe mir aktuell einen Baustein um den FB_IOLRead gebaut um diesen einfacher verwenden zu können. Das Selbe habe ich bereits für den FB_IOLWrite gemacht, da klappt soweit alles. Leider funktioniert es mit dem Read gar nicht. Egal was ich mache, es kommt immer "ADSERR_DEVICE_INVALIDPARM" als Fehler. Die Parameter sind dabei fast 100% identisch zum schreiben. Ich will zum testen erstmal nur lesen, was ich gerade geschrieben habe. Hat jemand ne idee was ich falsch mache?
Hey guys,

Code:
METHOD FB_Init: BOOL
VAR_INPUT
    bInitRetains: BOOL; // TRUE: the retain variables are initialized (reset warm / reset cold)
    bInCopyCode: BOOL;  // TRUE: the instance will be copied to the copy code afterward (online change)
    // IO-Link specific inputs
    _amsnetid_EL6224 : I_AMSNETID_Input;
    _connected_IOLink_port : E_IOLPort;
END_VAR

amsnetid_EL6224 := _amsnetid_EL6224;
connected_IOLink_port := _connected_IOLink_port;

FUNCTION_BLOCK ABSTRACT FB_IOLink_Base
VAR
    // IO-Link Terminal specific values
    amsnetid_EL6224 : I_AMSNETID_Input;
    connected_IOLink_port : E_IOLPort;

    // Reading
    IOLink_read : FB_IOLRead;
    eading_state : (IDLE, READ, WAIT_FOR_SUCCESSFUL_READ);
    execute_read : R_TRIG;
END_VAR

METHOD Read_IOLink_BYTE_Parameters : BYTE
VAR_INPUT
    execute : BOOL := FALSE; // Must be set TRUE to write parameters
    IOLink_index : WORD; // Provide the processed data as dec
    IOLink_subindex : BYTE; // Provide subindex fitting to index
END_VAR
VAR
    IOLink_value : BYTE; // Provide the actual value that should be written
END_VAR

Read_IOLink_BYTE_Parameters := 0;

execute_read(CLK:=execute);
IF execute_read.Q THEN
    reading_state := READ;
END_IF

CASE reading_state OF
    IDLE:
        // Do nothing as long there is no edge on execute

    READ:
        // Do the actual reading with the provided input parameters
        //IOLink_read(bExecute:=FALSE);
        IOLink_read.bExecute:=FALSE;
        IOLink_read.sNetId := F_CreateAmsNetId(amsnetid_EL6224.State);
        IOLink_read.nIolPort := connected_IOLink_port;
        IOLink_read.pDSTBuf := ADR(IOLink_value);
        IOLink_read.cbBufLen := SIZEOF(IOLink_value);
        IOLink_read.nIndex := 16#128;
        //IOLink_read.nIndex := IOLink_index;
        IOLink_read.nSubindex := 0;
        //IOLink_read.nSubindex := IOLink_subindex;
        IOLink_read.bExecute := TRUE;

        reading_state := WAIT_FOR_SUCCESSFUL_READ;

    WAIT_FOR_SUCCESSFUL_READ:
        IF IOLink_read.bDone THEN
            IOLink_read.bExecute := FALSE;
            reading_state := IDLE;
            Read_IOLink_BYTE_Parameters := IOLink_value;// Signal success by returning TRUE
        END_IF
END_CASE

IOLink_read();

Stehe hier etwas auf dem Schlauch
 
Der Iolink_read Baustein wird nur für einen Zyklus aufgerufen.ich würde diesen Baustein außerhalb der case schleife aufrufen
 
Zurück
Oben