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=> );