ABSTRACT

InputFromProcess, (* Function which returns measured value, yn, of the system as a real value *)

OutputToActuator; (* Procedure which sends manipulated variable, mn, to the actuator *)

FROM 10 IMPORT (* 10 is a language support libarary of input and output proce­ dures *)

KeyPressed ; (* Returns value TRUE if a key has been pressed *) FROM SYSTEM IMPORT (* SYSTEM is a language support library *) NEWPROCESS, IOTRANSFER, TRANSFER; (* For an explanation of these see

note below *) CONST

BIOSCIockHook = 1CH; WorkSpaceSize = 5000;

VAR Workspace: ARRAY[1.. WorkSpaceSize] OF BYTE; ISR, Main: ADDRESS; ClockTicks, Ts: CARDINAL; TimeToStop, PrepareToStop: BOOLEAN; en, enOld, Kd, Ki, Kp, mn, sn, sp, yn: REAL;

P R O C E D U R E PlDControl; BEGIN

sn := sn + en; mn := Kp*en + Ki*sn + Kd*(en - enOld); enOld := en;

END PlDControl; P R O C E D U R E Control;

yn := lnputFromProcess(): en := sp -yn; PlDControl; OutputToActuator(mn);

END Control; P R O C E D U R E InterruptServiceRoutine; BEGIN

LOOP IOTRANSFER(ISR, Main, BIOSCIockHook); INC(ClockTicks) IF ClockTicks MOD Ts = 0 THEN

Control; END (* IF*) IF ClockTicks > MaxCardinal THEN

ClockTicks := 0; END (* IF *) IF PrepareToStop THEN EXIT

END (* LOOP *) TimeToStop := TRUE; T R A N S F E R O R , Main);

END InterruptServiceRoutine; BEGIN (* Main *) (* Set initial conditions *) NEWPROCESS(lnterruptServiceRoutine, ADR(WorkSpace),

SIZE(WorkSpaceSize), ISR); TRANSFER(Main, ISR); LOOP

(* Do anything *) IF KeyPressedQ THEN

PrepareToStop:= T R U E END (* IF *) IF TimeToStop THEN

EXIT END (* IF *)

END (* Loop *) END PID_2.