PROGRAM MAIN
VAR CONSTANT
	kp : LREAL := ...; (* wstaw wyliczone kp*)
	Ti : TIME := T#...S; (* wstaw wyliczone Ti *)
	Td : TIME := T#...S; (* wstaw wyliczone Td *)
END_VAR
VAR
	init : BOOL := TRUE;
	man : BOOL := FALSE;
	eMode : E_CTRL_MODE;
	stPidParams: ST_CTRL_PID_PARAMS;
	fbPid : FB_CTRL_PID;
	fbPosTp : TP;
	actualInput : LREAL;

	inObj AT%I* : INT;
	outObj AT%Q* : INT;
	outPosObj AT%Q* : BOOL;

	insulina, glukoza, glukozaZadana : LREAL;
	stopPID : BOOL;
	posilek : BOOL;
END_VAR

--------------------------------------------------------------------------------------

IF init THEN
	init := FALSE;

	stPidParams.tCtrlCycleTime := T#10ms;
	stPidParams.tTaskCycleTime := T#10ms;
	stPidParams.fKp := kp;
	stPidParams.tTn := Ti;
	stPidParams.tTv := Td;
	stPidParams.tTd := Td / 5;
	stPidParams.fOutMinLimit := -100;
	stPidParams.fOutMaxLimit := 0;

	eMode := eCTRL_MODE_ACTIVE;
END_IF

glukoza := INT_TO_LREAL(inObj) * 500 / 16#7FFF;
IF stopPID THEN actualInput := glukozaZadana; ELSE actualInput := glukoza; END_IF

fbPid(
	fSetpointValue:= glukozaZadana,
	fActualValue:= actualInput,
	fManSyncValue:= 0,
	bSync:= FALSE,
	eMode:= eMode,
	bHold:= FALSE,
	stParams:= stPidParams,
	fOut=> insulina,
	bARWactive=> , 
	eState=> , 
	eErrorId=> ,
	bError=> );

insulina := -insulina;
IF man THEN insulina := 37; END_IF
outObj := LREAL_TO_INT(insulina / 100 * 16#7FFF);

fbPosTp(IN:=posilek , PT:=T#500ms , Q=>outPosObj , ET=> );