FUNCTION_BLOCK FB_Galil
VAR_INPUT
	i_xEnable			:BOOL;
	i_sSrvNetID			:STRING := '';
	i_sRemoteHost		:STRING;
	i_nRemotePort		:UDINT;
	i_tReconnect			:TIME := t#45s;
	i_tUpdateTime		:TIME := T#1s;

	lrVar1				:LREAL;
	lrVar2				:LREAL;
	sSendCommand		:STRING;
END_VAR
VAR_OUTPUT
END_VAR
VAR
	fbClientServerConnection: FB_ClientServerConnection;
	fbSocketSend: FB_SocketSend;
	sSendString: STRING;
	fbSocketReceive: FB_SocketReceive;
	iStep: INT;
	rtEnable: R_TRIG;
	tonUpdate: TON;
	sReceiveString: STRING;
END_VAR


----------------------------------------------------------------
rtEnable(CLK:=i_xEnable);

IF i_xEnable = FALSE THEN
	iStep := 0;
END_IF

CASE iStep OF
	0: (* idle *)
		fbClientServerConnection.bEnable:= FALSE;
		fbSocketSend.bExecute := FALSE;
		fbSocketReceive.bExecute := FALSE;
		IF i_xEnable = TRUE THEN
			iStep := 10;
		END_IF

	10: (* make the conection *)
		fbClientServerConnection.bEnable:= TRUE;
		IF fbClientServerConnection.eState = eSOCKET_CONNECTED THEN
			iStep := 100;
		ELSIF fbClientServerConnection.bError THEN
			iStep :=0;
		END_IF

	100:
		IF tonUpdate.Q THEN
			fbSocketSend.bExecute := FALSE; (* reset send*)
			fbSocketReceive.bExecute := FALSE; (*reset receive *)
			iStep := 110;
			tonUpdate(IN := FALSE);  (* reset timer *)
		END_IF

	110:
		(* command to just set a variable - this would be commanded moves as well (ie PA, BG etc) *)
(*
		sSendString := 'var1=TIME';
		(* append a number to a variable decleration - ie var1=123.45 *)
(*		sSendString := 'var1=';
		sSendString := CONCAT(sSendString,LREAL_TO_STRING(lrVar1)); *)
		sSendString := CONCAT(sSendString,'$r');(*append carriage return and line feed*)
		fbSocketSend.pSrc:= ADR(sSendString);
		fbSocketSend.cbLen := LEN(sSendString);
		fbSocketSend.bExecute := TRUE;
*)

		(* command with a response *)
		sSendString := sSendCommand;
		sSendString := CONCAT(sSendString,'$r$n');(*append carriage return and line feed*)
		fbSocketSend.pSrc:= ADR(sSendString);
		fbSocketSend.cbLen := LEN(sSendString);
		fbSocketSend.bExecute := TRUE;
		iStep := 120;

	120:
		IF NOT fbSocketSend.bBusy THEN
			IF NOT fbSocketSend.bError THEN
				iStep := 125;
			ELSE
				(* hanldle error *)
				iStep := 9000;
			END_IF
		END_IF

	125:
		(*clear memory for receive string and set receive to true *)
		MEMSET(destAddr:=ADR(sReceiveString), fillByte:=0, n:=SIZEOF(sReceiveString));
		fbSocketReceive.bExecute := TRUE;
		iStep := 130;

	130:
		(* read receive data *)
		fbSocketReceive.pDest := ADR(sReceiveString);
		fbSocketReceive.cbLen := SIZEOF(sReceiveString) - 1;
		iStep := 140;

	140:
		(* check to see if received data - if not, read again (130) *)
		IF NOT fbSocketReceive.bBusy THEN
			IF NOT fbSocketReceive.bError THEN
				IF fbSocketReceive.nRecBytes > 0 THEN
					iStep := 100;
				ELSE
					fbSocketReceive.bExecute := FALSE; (*reset receive *)
					iStep := 125;
				END_IF
			ELSE
				(* hanldle error *)
				iStep := 9000;
			END_IF
		END_IF

	9000: (* error step *)
		iStep:=0;

END_CASE

fbClientServerConnection(
	sSrvNetID:= i_sSrvNetID,
	nMode:= CONNECT_MODE_ENABLEDBG,
	sRemoteHost:= i_sRemoteHost,
	nRemotePort:= i_nRemotePort,
	tReconnect:= i_tReconnect	);

fbSocketSend(
	sSrvNetId:='' ,
	hSocket:= fbClientServerConnection.hSocket,
	tTimeout:= t#2s);

fbSocketReceive(
	sSrvNetId:='' ,
	hSocket:= fbClientServerConnection.hSocket,
	tTimeout:= t#2s);

tonUpdate(IN := TRUE, PT:= i_tUpdateTime);
