- Beiträge
- 5.577
- Reaktionspunkte
- 1.499
-> Hier kostenlos registrieren
Naja ich muss doch die Get Befehle Aufrufen und ob ich die der Übersichtshalber im FC mache oder im OB1 ist doch egal
Jap aber jeder GET und PUT braucht seine eigene Instanz. Das heisst wenn du die im OB1 oder in einem FC aufrufst musst du jedem seinen eigenen globalen Instanzdb zuweisen. deklarierst du die aber im STAT eines FBs dann landen die alle im selben instanzdb (dem des aufrufenden FB) was die zu händelnde Bausteinmenge doch arg reduziert (je nach menge der anfallenden Kommunikation). Du hast jetzt nicht womöglich irgendwo die Instanz eines PUT oder GET zweimal aufgerufen?
Ich hab dir mal einen Baustein gemacht. Versuch den mal.
Einfach als Externe Quelle einfügen und übersetzen.
Code:
FUNCTION_BLOCK "PUTGETen"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
VerbindungsID : Word;
END_VAR
VAR_IN_OUT
PUT_Addr : Remote;
PUT_SD : Variant;
GET_Addr : Remote;
GET_SD : Variant;
END_VAR
VAR
PUT_Instance {OriginalPartName := 'PUT_SFB_PART'; LibVersion := '1.3'} : PUT;
put_done : Bool;
put_error : Bool;
put_status : Word;
put_err_status_sav : Word;
put_done_status_sav : Word;
request : Bool;
Requestreset {OriginalPartName := 'IEC_TIMER'; LibVersion := '1.0'} : TON_TIME;
GET_Instance {OriginalPartName := 'GET_SFB_PART'; LibVersion := '1.3'} : GET;
getrequest : Bool;
get_err_status_sav : Word;
get_done_status_sav : Word;
get_Requestreset {OriginalPartName := 'IEC_TIMER'; LibVersion := '1.0'} : TON_TIME;
END_VAR
BEGIN
#PUT_Instance(REQ:=#request,
ID:=#VerbindungsID,
ADDR_1:=#PUT_Addr,
SD_1:=#PUT_SD);
IF #PUT_Instance.ERROR THEN
#put_err_status_sav := #PUT_Instance.STATUS;
END_IF;
IF #PUT_Instance.DONE THEN
#put_done_status_sav := #PUT_Instance.STATUS;
END_IF;
#request := true;
IF #PUT_Instance.ERROR OR #PUT_Instance.DONE OR #Requestreset.Q THEN
#request := false;
END_IF;
#Requestreset(IN:=#request,
PT:=t#5s);
#GET_Instance(REQ:=#getrequest,
ID:=#VerbindungsID,
ADDR_1:=#GET_Addr,
RD_1:=#GET_SD);
IF #GET_Instance.ERROR THEN
#get_err_status_sav := #GET_Instance.STATUS;
END_IF;
IF #GET_Instance.NDR THEN
#get_done_status_sav := #GET_Instance.STATUS;
END_IF;
#getrequest := true;
IF #GET_Instance.ERROR OR #GET_Instance.NDR OR #get_Requestreset.Q THEN
#getrequest := false;
END_IF;
#get_Requestreset(IN := #getrequest,
PT := t#5s);
END_FUNCTION_BLOCK