Zuviel Werbung?
-> Hier kostenlos registrieren
-> Hier kostenlos registrieren
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,
Stehe hier etwas auf dem Schlauch
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