0 'PIDSIM.BA released 12/5/2003 1 'Was version 2.0 of PID2J2.BA 2 '(c)R.H.Pigford 1991 3 ' Simulates process w/ dead time and 4 ' lags in series. Teaches PID 5 ' tuning skills. Could be adapted to 6 ' control a real process. 10 CLEAR 256,59500:LOADM"TREND2":LOADM"LCD2LJ" 15 PRINT"Loading ...":FORI=0TO319:POKE59637+I,0:NEXTI'put 0's in TREND2.CO buffer to start 20 DEFSTR H 25 CLS 30 GOSUB585 'set init values 35 M=1:GOSUB535 'strt in auto 40 GOSUB615 'set default tuning 45 GOSUB560 'set simulator consts 50 GOSUB285 'add last 3 lines to screen 55 GOSUB230 'build screen 60 GOTO 75 65 A$=INKEY$:RETURN 70 '_________ main loop ______________ 75 A$=INKEY$:IFA$<>""THEN GOSUB 450 80 IF O=0 THEN 75 'on Hold 85 'deviation from SP? 90 GOSUB 355 'simulate the process 95 IF M=1 THEN GOSUB390'auto 100 IF M=0 THEN GOSUB425'man 105 EA=SP-PV 110 GOSUB 315 'check limits 115 PRINT@471,USING"###.## %";CO; 120 PRINT@71,USING"###.## %";PV; 125 PRINT@111,USING"###.## %";SP; 130 PRINT@540,TIME$; 135 '_____ Proc Var mark ___ 140 YP%=INT(101-PV+.5) 145 IF YP%=QP% THEN 175 150 LINE(158,QP%)-(163,QP%),0'main bar 155 IFYP%>2THENLINE(160,QP%-1)-(161,QP%-1),0'top small bar 160 IFYP%<100THENLINE(160,QP%+1)-(161,QP%+1),0'btm small bar 165 LINE(160,YP%-1)-(161,YP%-1),1:LINE(158,YP%)-(163,YP%),1:LINE(160,YP%+1)-(161,YP%+1),1 170 '_____ Set Point mark ____ 175 YS%=INT(101-SP+.5) 180 IFYS%=QS% THEN 210 185 LINE(169,QS%)-(172,QS%),0 190 IFYS%>2THENLINE(170,QS%-1)-(171,QS%-1),0 195 IFYS%<100THENLINE(170,QS%+1)-(171,QS%+1),0 200 LINE(170,YS%-1)-(171,YS%-1),1:LINE(169,YS%)-(172,YS%),1:LINE(170,YS%+1)-(171,YS%+1),1 205 'pass the Y PV val in l, Y SP val in h 210 CALL 59500,,256*YS%+YP% 'TREND2.CO 215 QP%=YP%:QS%=YS% 220 GOTO75 ' ----- do loop again ------ 225 '________ setup screen ____________ 230 LINE(0,0)-(157,102),1,B 235 LINE(157,0)-(239,102),1,B 240 FOR F=1TO101STEP10:LINE(165,F)-(167,F),1:NEXTF 245 FOR F=1TO101STEP10:PRESET(0,F):NEXTF 250 FOR F=1TO101STEP2:PSET(166,F):NEXTF 255 PRINT @69,"PV"; 260 PRINT @109,"SP"; 265 PRINT @469,"CO"; 270 PRINT@552,H3; 275 RETURN 280 '___ lower 3 screen line data _____ 285 PRINT@520,"Prop = ";USING"####";PB;:PRINT" %"; 290 PRINT@560,"Integ= ";USING"#.##";TI;:PRINT" Min/Rpt";:PRINT@580,"uit

rint an"; 295 PRINT@600,"Deriv= ";USING"#.##";TD;:PRINT" Min";:PRINT@620,"une old uto"; 300 PRINT@230,"PIDSIM.BA";:PRINT@270,"(c) 2002";:PRINT@310,"RHPigford"; 305 RETURN 310 '---check variable limits (0-100)__ 315 IF CO<=0THENCO=0 320 IF CO>=100THENCO=100 325 IF PV>=100THENPV=100 330 IF PV<=0THENPV=0 335 IF SP<=0THENSP=0 340 IF SP>=100THENSP=100 345 RETURN 350 '_______simulate a process_________ 355 R4=R3:R3=R2:R2=R1:R1=R0 360 Y1=((K1*T*R4)/(T1+T))+((T1*Y0)/(T1+T)) 365 Y3=((K2*T*Y1)/(T2+T))+((T2*Y2)/(T2+T)) 370 Y2=Y3:Y0=Y1 375 PV=PV+Y3+(.025*(RND(1)))-(.025*(RND(1))) 380 RETURN 385 '__________ automatic _____________ 390 OP=KC*(EA-EB) 395 OP=OP+(KC*T*EA/TI) 400 OP=OP+(TD*KC/T)*(EA-2*EB+EC) 405 R0=OP 'send change to simulator 410 EC=EB:EB=EA:CO=CO+OP 415 RETURN 420 '__________ manual _____________ 425 R0=X 430 X=0 435 SP=PV 440 RETURN 445 '______ check any key strokes ____ 450 IFA$="M"ORA$="m"THEN M=0:GOSUB535:RETURN 455 IFA$="A"ORA$="a"THEN M=1:GOSUB535:RETURN 460 IFA$=CHR$(31)ANDM=1THEN SP=SP-1'down 465 IFA$=CHR$(30)ANDM=1THEN SP=SP+1'up 470 IFA$=CHR$(190)ANDM=1THENSP=SP+10'code= 475 IFA$=CHR$(197)ANDM=1THENSP=SP-10'code- 480 IFA$=CHR$(29)ANDM=0THENCO=CO-1:X=-1'left arrow 485 IFA$=CHR$(28)ANDM=0THENCO=CO+1:X=1'rt arrow 490 IFA$=CHR$(190)ANDM=0THENCO=CO+10:X=10 'code= 495 IFA$=CHR$(197)ANDM=0THENCO=CO-10:X=-10'code- 500 '_ Call LCD2LJ.CO Scrn prt > LJet _ 505 IFA$="p"ORA$="P"THEN CALL 60000 510 IFA$="h"ORA$="H"THEN O=1-O 'hold 515 IFA$="T"ORA$="t"THENA$="":GOSUB650:GOSUB285 520 IFA$="q"ORA$="Q"THEN PRINTCHR$(27);CHR$(87):MENU 525 RETURN 530 '_________ print mode$ ___________ 535 PRINT@29,H1+M$(M)+H0; 540 IFM=0THEN:PRINT@432,H1+CHR$(155)+CHR$(154)+H0:PRINT@152," " 545 IFM=1THENPRINT@152,H1+CHR$(152)+CHR$(153)+H0:PRINT@432," " 550 RETURN 555 '___set process model dynamics ___ 560 T=.05:T1=1:K1=1:T2=1:K2=1:H3=H1+"TEMP"+H0 565 'T=.05:T1=.05:K1=1:T2=.1:K2=1:H3=H1+"FLOW"+H0 570 'T = sampling rate (approx 1 sec) 575 RETURN 580 '---- init values ----- 585 H1=CHR$(27)+"p":H0=CHR$(27)+"q":O=1 590 PV=50:CO=50:SP=50:Y3=0:Y0=0:Y1=0:Y2=0:Y3=0 595 QP%=2:QS%=2 600 M$(1)=" AUTOMATIC":M$(0)=" MANUAL " 605 RETURN 610 '__ set initial PID tuning values _ 615 Z=0 620 TD=0 625 PB=75:KC=100/PB 'gain PB=100/KC 630 TI=.5 'integral time(MIN/RPT) 635 PRINT CHR$(27);CHR$(86); 'no scrol 640 RETURN 645 '____ change tuning ______________ 650 GOSUB 770 655 PRINT@600,"Change "+H1+"P"+H0+" "+H1+"I"+H0+" "+H1+"D"+H0+" ? or "; 660 GOSUB65 665 IFA$="P"ORA$="p"THEN GOSUB 695 670 IFA$="I"ORA$="i"THEN GOSUB 720 675 IFA$="D"ORA$="d"THEN GOSUB 745 680 IFA$=CHR$(13)THEN A$="":GOSUB770:RETURN 685 GOTO 655 690 '___ get new PB val _____ 695 GOSUB770:Z1=PB:PRINT@600,"P="PB;:GOSUB775 700 INPUT PB$:IF PB$=""THEN A$="":PV=Z1:GOSUB770:RETURN 705 PB = VAL(PB$):IFPB<10 OR PB>1000 THEN BEEP:PB=Z1:GOTO695 710 KC=100/PB:GOSUB770:RETURN 'with new PB val 715 '___ get new I val ______ 720 GOSUB770:Z2=TI:PRINT@600,"I="TI;:GOSUB775 725 INPUT TI$:IFTI$=""THEN A$="":TI=Z2:GOSUB770:RETURN 730 TI=VAL(TI$):IFTI<.05 OR TI>10 THEN BEEP:TI=Z2:GOTO 720 735 GOSUB770:RETURN 'with nte TI val 740 '___ get new TD val _______ 745 GOSUB770:Z3=TD:PRINT@600,"D="TD;:GOSUB775 750 INPUT TD$:IFTD$=""THEN A$="":TD=Z3:GOSUB770:RETURN 755 TD=VAL(TD$):IFTD<0 OR TD>10 THENBEEP:TD=Z3:GOTO745 760 GOSUB770:RETURN 'with new TD val 765 '____ clear line #16 _____ 770 PRINT@600,CHR$(27);CHR$(75);:RETURN 775 PRINT" Enter new val or ";:RETURN