IMD 1.18: 11/10/2014 15:05:17 blank label voormalige tekst: "optical fibers"      :OPTICAL FIBERw??0  .RCEDIT20.SSYSTETESbPROCTA9.SLgREClRCEDIT2RUNTIME3.S!CONFIG3S*RUNTIME.S)recipQCONFIGSCONFIG3.SCOMM2.SPNTIME1.SCOMMEGUUS01.SUUSPC9N.SUUS09N.S      RZRHps; SOFTST : 0..MAXDONR; RATIOLINK : 0..MAXAONR; RATIOVALUE : REAL END; DI = RECORD NAME : ARRAY[1..NAMELENGTH] OF CHAR; S 3PCOD?\+P1c1BR&W RCONFIGURAFE : SAFESTATE; CONTROL : DICONTROL; DOLINK : 0..MAXDONR END; DOUT = RECORD NAME : ARRAY[1..NAMELENGTH] OF CHAR; CONTROL : DOCONTROL; 3@1@1111F=05D21 1 45$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> INTERLOCK : 0..MAXDONR; CONDLOCK : 0..MAXDONR END; TEMPCONTROL = ARRAY[T_AUTO_MAN..O2_AO] OF INTEGER; LATHECONTROL = ARRAY[L_AUTO_MAN..ROTAT_AO] OF INTEGER; SYSTEM =your choice:  RECORD AILIST : ARRAY[1..MAXAINR] OF AI; AOLIST : ARRAY[1..MAXAONR] OF AO; DILIST : ARRAY[1..MAXDINR] OF DI; DOLIST : ARRAY[1..MAXDONR] OF DOUT; TE311F=N5D21 1 45$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>MP : TEMPCONTROL; LATHE : LATHECONTROL END; MAXSTRING = ARRAY[1..MAXLENGTH] OF CHAR; IOPORTTYPE= ARRAY[1..2] OF CHAR; VAR I,IOERROR : INTEGER; CHOICE : CHAR; SYSTEMENTRY :31@6#6#11'05$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> FILE OF SYSTEM; $SUBTITLE READ ONE CHARACTER FROM KEYBOARD FUNCTION getchoice : CHAR; VAR C : CHAR; BEGIN WRITE('':10,'your choice: '); PROMPT; GET(INPUT); IF EOLN(INPUT) THEN C := '0' ELSE READ(C); READLN; getchoice := C END; C = change, D = delete, = exit{getchoice} FUNCTION getchar : CHAR; VAR ANSWER : CHAR; BEGIN GET(INPUT); IF EOLN(INPUT) THEN ANSWER := 'N' ELSE READ(ANSWER); READLN; getchar := ANSWER; END; {getchar} FUNCTION getanswer : CHAR; BEGIN WRITELN; WRITELN('C = change, D =311F'=1%21 1 (1"ҐUF1 =1%D&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>     3vr11F+=1%21 1 (1"ҐUF 1 vr=1%Dvrvr 9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>R TOO LARGE'); 6 : WRITELN('NUMBER < 0'); OTHERWISE: WRITELN('ERROR') END {X} END; {error} PROCEDURE stars; VAR I : INTEGER; BEGIN WRITELN; FOR I := 0 TO 75 DO WRITE('*'); WRITELN; WRITELN; END; {stars} PROCEDURE clearscreen; VAR CL Rt@5 RW(bq  delete, = exit'); getanswer := getchoice; END; {getanswer} $SUBTITLE READ INTEGER, READ REAL, READ STRING FUNCTION readint(F:INTEGER) : INTEGER; VAR I,OLD,IOERROR : INTEGER; BEGIN OLD :=F; GET(INPUT); IF NOT EOLN(INPUT) THEN BEGIN I RW+V0OABORT (INPUT,FALSE); READLN (INPUT,I); IOERROR := IORESULT(INPUT); IF IOERROR <> 0 THEN BEGIN READLN; I := OLD; END; IOABORT(INPUT,TRUE); END {IF} ELSE I:= OLD; readint := I END; {readint} FUNCTION read 3PCOD?\+P1c1BR&W RCONFIGURreal(F:REAL) : REAL; VAR IOERROR : INTEGER; R,OLD : REAL; BEGIN OLD :=F; GET(INPUT); IF NOT EOLN(INPUT) THEN BEGIN IOABORT (INPUT,FALSE); READLN (INPUT,R); IOERROR := IORESULT(INPUT); IF IOERROR <> 0 THEN BEGIN 3@1@1111F=05D21 1 45$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> READLN; R := OLD END; IOABORT(INPUT,TRUE); END {IF} ELSE R:= OLD; readreal := R; END; {readreal} PROCEDURE readstring (VAR INP: MAXSTRING; VAR C: BOOLEAN); {READ STRINGS OF MAX 50 CHARACTERS} VAR F : FILE OF MAXSTRING; I : Iyour choice: NTEGER; BEGIN RESET (F,'/TERM'); GET (F); C := (F^[1] <> ' '); {if no char_string is entered F^[1] = blank} IF C {a new string is entered} THEN FOR I := 1 TO MAXLENGTH DO INP[I] := F^[I] END; {readstring} $SUBTITLE ERROR, CLEARSCREEN, AI_AO_311F=N5D21 1 45$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>DI_DO PROC'S PROCEDURE error(X : INTEGER); BEGIN CASE X OF 1 : WRITELN('INPUT ERROR'); 2 : WRITELN('NUMBER TOO LARGE'); 3 : WRITELN('TOO MANY CHARACTERS'); 4 : WRITELN('INPUT IS NOT A NUMBER'); 5 : WRITELN('NUMBER < 0 O31@6#6#11'05$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>     C = change, D = delete, = exit3 @60601@111@E112204FАDё"N2Α"N72Α"Nx54.DБDHГDBЕD<ЖD6AT6AE>ђ"Nx=OPyFy9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>311F'=1%21 1 (1"ҐUF1 =1%D&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>choose AO, AI, DO, DI, TC (temperature control), LC (lathe control)or to exit: 362q=56 q2@@1212Α"Nx= T*xFBq62quueF/u2"N2u2"NxuuaF u#qD219>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3 Oy "By1 Ҝ1z1J 1yD,@1D3@1D(@"1D@31DEyD,@D1D4@P1D)@\1D@h1DE>y1 1&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>/TERM F AI only setpoint controlAI sets DO if < AI sets DO if > don't care band limit upper limitlower limit3Db@11Dp@ 11Db@11DT@111DF@G11D8@_11D*@j11DAFE>&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3 OSy"B!y1 Ҝ1z1J 1y1 y1 y1 y1 z11&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>INPUT ERRORNUMBER TOO LARGETOO MANY CHARACTERSINPUT IS NOT A NUMBERNUMBER < 0 OR TOO LARGENUMBER < 0ERROR3 Ocy"By1 Ҝ1y D@1D@1DEy DB@ 1DN@1DC@ 1D8@+1D-@61D"@A1DE>y1 1&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>316KeF=*1aF#D11$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>low highignore abort alarm hold time resetbuzzer 3 +541=X11$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3Oy "By1 Ҝ1y D@1D@1DEy 1 y1 1&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>     normally closednormally open ANALOG OUTPUTSNR NAME MAX. VALUE UNIT AI-LINK DO-LINK SOFTST RATIOLINK RATIO3@1?By1 1@1@/1?By1 1@01@F1?By1 1@G1?By1 1@b1?By1 1@}1@1?By1 1@1@1?By1 1$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>30@1@110@646411u u u y20 ґu u y4u y6;QF1u uYFʰ111u u y9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>auto/manual switch is DI:flame sensor is DI:flame ignition is DO:temperature control is AI:preform temperature is AO:Hydrogen burner is AO:Oxigen burner is AO:DIGITAL INPUTSNR NAME SAFE STATE TYPE OF CONTROL DO-LINK3@1@1?By1 1@1?By1 1@;1?By1 1@[1@t1?By1 1@u1@1?By1 1$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>30@1@110@6A6A11u u u y20ґu u y4u y6;QF1u uYFʰ111u u y9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>auto/manual switch is DI:End switch gasinlet side is DI:End switch exhaust side is DI: Lathe translation is AO:Lathe rotation is AO:DIGITAL OUTPUTSNR NAME TYPE OF DO INTERLOCK CONDITIONAL INTERLOCK30@1@110@6#6#1@36*6*11u u u y20 ґu u y4u y6;QF1u uYFʰ111u u y9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>34F10@1@1100119>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ANALOG INPUTSNR NAME MAX. VALUE UNIT TYPE OF LOOP TYPE OF CONTROL DOLINKTEMPERATURE CONTROL ASSIGNMENTS30@1@110@6#6#1@46*6*11u u u y20 ґu u y4u y6;QF1u uYFʰ111u u y9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>     LATHE CONTROL ASSIGNMENTSXXXXXXXXXXXXXXX30 @11'054=YP*5@11'054F[@9@>12222221)0쑰1 =/1ꑰ1 =/1葰1 @H111@W1@X1104=NPF<@u@|1220 ވF&@11(0@11(00 4F @@1DD]ڈ>>>>>3Ocy"B@7 J J J&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*54F 24*0D]ڈ܈*54F 24*0D]ڈ܈*54F 24*0DZ]ڈ܈*54F 24*0D.24*0D#24*0DE.1bސQFDQ4F0 6 24*024*024>XXXXXXXXXX*06 24*024*024*014F @@1D1@6)6)111 $>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3Oy "B@7 J y Yy 6 aFOy  "BJ J J&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>OUTPUT ON LINEPRINTER (Y/N/)DISPLAY ALL ENTRIES? (Y/N/)/P1 OUTPUT OPTICAL FIBERSSYSTEM CONFIGURATION TABLE /TERM OUTPUT STARTING NUMBER: ENDING NUMBER: /P1 OUTPUT /TERM OUTPUT press to return to the job selectionXXXXXXXXXX3Oy "B@7 J @ 7J JJJyYyaFOSy"B!JJ&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3eF?ҋBaF#D$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>XXXXXXXXXXXXXXX3eF?ҋBaF#D$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3OSy"B!@7 J @ 7J yJJJJJ ҐY6 aF20&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>36 eF20aF#DeF20aF#DeF20aF#D6 eF20aF#D00$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>     3Oy "Bq@112204F uȑ"N2Α"N7 @11uJ)uz0@112204FuJ "N2Α"N7@11@,11@D6'6'11@l6'6'11@11'054.D6DPuJDEuJD:uJD/uJD$0DA04>>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXF60E>@11@11@Ơ11@ע11@ꢢ11'054.D6DNuJDCuJD8uJD-uJD"0DA04F60E>@11(uy0quʈFuJuʋ D0&>>>>>>>>>>>>>>>>>>>>>>>>>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX R (c NUMBER := READINT(TEMP [FLAME_DI]); IF NUMBER IN [0..MAXDINR] THEN TEMP [FLAME_DI] := NUMBER; WRITE('flame ignition is DO: '); PROMPT(OUTPUT); NUMBER := READINT(TEMP [LITFLAME]); IF NUMBER IN [0..MAXDONR] TXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXHEN TEMP [LITFLAME] := NUMBER; WRITE('temperature control is AI: '); PROMPT(OUTPUT); NUMBER := READINT(TEMP [TEMP_AI]); IF NUMBER IN [0..MAXAINR] THEN TEMP [TEMP_AI] := NUMBER; WRITE('preform temperature is AO: '); XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX PROMPT(OUTPUT); NUMBER := READINT(TEMP [PREF_AO]); IF NUMBER IN [0..MAXAONR] THEN TEMP [PREF_AO] := NUMBER; WRITE('hydrogen burner is AO: '); PROMPT(OUTPUT); NUMBER := READINT(TEMP [H2_AO]); IF NUMBER XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXIN [0..MAXAONR] THEN TEMP [H2_AO] := NUMBER; WRITE('oxigen burner is AO: '); PROMPT(OUTPUT); NUMBER := READINT(TEMP [O2_AO]); IF NUMBER IN [0..MAXAONR] THEN TEMP [O2_AO] := NUMBER; END {WITH} END; {TEMP_change} PROCEDXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX RoXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX0000000000)R)R RR     d LATHE ONE 3 f 3TIME ZERO  z0D0D70D0AFE>uyUFOuy "Bu7 Ouy "BJ uJ 7Ouy "BJuzOuy "BJOuy "BJOuy "BJy&>>>>>>>>>>>>>>> TIME THREEBLOCK 4-6 3f3NAME: MAXIMUM VALUE: UNIT: LINK WITH AI NUMBER: LINK WITH DO NUMBER: SOFTSTART NUMBER: RATIOLINK WITH AO NUMBER: RATIOVALUE: o TIME 5 3!Ocy"Bq@112204F uȑ"N2Α"N7 @11@11@$11'054.D D3uJ D(uJ D0DA02F60E@011@B11@P11@]11@j11@v11@11'054.DMDhuJ >END 7 D\uJ DQuJ DFuJ D;uJ D0uJ D%0DA06F60E@11(uy0quʈFuJuʋ D0&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>NAME: MAXIMUM VALUE: UNIT: TYPE OF LOOP: (1) setpoint control (2) AI switches DO if below setpoint (3) AI switches DO if above setpoint (4) AI onlyTYPE OF CONTROL: (1) don't care (2) bandlimit (3) upper limit (4) lower limitNAME: SAFE STATE: (1) low (2) highTYPE OF CONTROL: (1) ignore (2) abort (3) alarm (4) hold (5) time reset (6) buzzerLINK WITH DO NUMBER: LINK WITH DO NUMBER: 3"Oy "Bq@112204F uȑ"N2Α"N7 @11@ 11@711'054.D D3uJ D(uJ D0DA02F60E@L11(uy 0quDuy UFOuy  "BJ uJ uʋ DuyUF2uJ >3 OSy"B!q@112204F uƑ"N2Α"N7 @11uJ)uz0@112204FuJ "N2Α"N7@11(uy0quD:uyquJuʐUF20DiuJuȋ DW0DPA FE>!uʋ Ouy  "BJ y D0DV0DOA FE!t@g6&6&11(uy0quʈuyUFuJuʋ D0&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>@411(uy0quȈFuJuȋ D0@J11(uy0quȈFuJuȋ D0@]11(uy0quD^uJuJ DzuyUF1uJuȋ@x11uJ)u>>>     3#@11(?By0҈F?B҅@11(?By0҈F?B҅@011(?By0҈F?B҅@G11(?By0҈F?B҅@c11(?By0҈F?B҅@11(?By0҈>0000000000 ffF?B҅@11(?By0҈F?B҅$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> TIMED UfUU VH=VLATHECONTR  U3 Uauto/manual switch is DI: flame sensor is DI: flame ignition is DO: temperature control is AI: preform temperature is AO: hydrogen burner is AO: oxigen burner is AO: V?9 BLOCK TWO U U 33$@11(?By0҈F?B҅@6 6 11(?By0҈F?B҅@;11(?By0҈F?B҅@Z11(?By0҈F?B҅@s11(?By0҈F?B҅$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 3f TIME 4  'D' : DO_DELETE(PORTSELECT); '0' : ; OTHERWISE: ERROR(1) END {ANSWER}; END {4} END {CASE} UNTIL PORTSELECT = 0 ELSE CASE T DISP_DIS t DISPTIMEDISP_PRO1DISP_SYS DISP_STA)YPESELECT OF 0 : ; 5 : BEGIN TEMP_display; ANSWER := getanswer; CASE ANSWER OF 'C' : TEMP_change; 'D' : TEMP_delete; ND; 5500 5505 5510 PROCEDURE hold_proc; 5515 {changes the procstatus to hold if requested} 5520 BEGIN 5525 WITH STATUS DO 5530 BEGIN 5535 IF PROCSTATUS = RUN THEN 5540 BEGIN 5545 PROCSTATUS := HLD; 5550 WRITELN('hold done'); '0' : ; OTHERWISE: ERROR(1) END {ANSWER}; END; {5} 6 : BEGIN LATHE_display; ANSWER := getanswer; CASE ANSWER OF ' 5555 END {IF} 5560 ELSE 5565 BEGIN 5570 WRITELN('hold is only allowed when process is running'); 5575 WRITE('process status is:'); 5580 disp_procstatus; 5585 WRITELN; 5590 END; {ELSE} 5595 END; {WITH}  Rx R,       (TYPESELECT IN [1..3]) THEN TYPESELECT := TYPESELECT +1; END {ELSE}; END; {AI_AO_DI_DO} $SUBTITLE DISPLAY THE ANALOG INPUTS/OUTPUTS PROCEDURE AI_display(VAR PORTNR :INTEGER); BEGIN WITH SYSTEMENTRY^.AILIST[PORTNR] DO BEGIN WRITEFuyu y҅x61QF9 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>(PORTNR:2, NAME:12, SCALE:9:3, UNIT:10); CASE LOOP OF AIONLY : WRITE('AI only ':18); SETPOINT : WRITE('setpoint control':18); AIDOBELOW: WRITE('AI sets DO if < ':18); AIDOABOVE: WRITE('AI s R,ets DO if > ':18); END; {LOOP} CASE CONTROL OF DONTCARE : WRITE('don''t care ':14); BANDLIMIT : WRITE('band limit ':14); UPPERLIMIT : WRITE('upper limit':14); LOWERLIMIT : WRITE('lower limit':14) END {AICONTROL}; WRITELN(DOLINK:9) END {WITH} END {AI_display}; PROCEDURE AO_display(VAR PORTNR :INTEGER); BEGIN WITH SYSTEMENTRY^.AOLIST[PORTNR] DO BEGIN WRITE(PORTNR:2, NAME:12, SCALE:9; BEGIN CASE X OF 1 : WRITELN('INPUT ERROR'); 2 : WRITELN('ENTRY TOO LARGE'); 3 : WRITELN('new value exceeds the maximum value'); 4 : WRITELN('INPUT IS NOT A NUMBER'); 5 : WRIRa)EAR : CHAR; BEGIN CLEAR := CHR($1B); {ESCAPE CHAR} WRITELN(CLEAR,'X') {ESC,X CLEARS THE EXORTERM SCREEN} END; {clearscreen} PROCEDURE AI_AO_DI_DO (VAR TYPESELECT:INTEGER;VAR IOPORT:IOPORTTYPE); VAR INPUTSTRING : MAXSTRING; CH : CHAR; CHANGE0000000000 : BOOLEAN; BEGIN WRITE('choose AO, AI, DO, DI, TC (temperature control),'); WRITELN(' LC (lathe control)'); WRITE('or to exit: '); PROMPT(OUTPUT); READSTRING (INPUTSTRING, CHANGE); IF NOT CHANGE THEN TYPESELECT:=0 ELSE BEGIN TIME0 U[ XXXXXXXXXXIOPORT[1 FOR 2] := INPUTSTRING[1 FOR 2]; CH := INPUTSTRING[1]; CASE CH OF 'A' : TYPESELECT := 1; 'D' : TYPESELECT := 3; 'T' : TYPESELECT := 5; 'L' : TYPESELECT := 6; END {CASE CH}; IF (IOPORT[2] ='O') AND XXXXXXXXXXXXXXXXXXXX      33ffXXXXXXXXXXR = 24; MAXDONR = 32; OFF1 = -1; OFF2 = 47; OFF3 = 95; OFF4 = 143; MAXLENGTH = 70; STEPSINBLOCK = 70; MAXTAB = 70; MAXFUNC = 50; MAXRECORD = 49; C' : LATHE_change; 'D' : LATHE_delete; '0' : ; OTHERWISE: ERROR(1) END {ANSWER}; END {6} END {CASE} UNTIL TYPESELECT = 0 END {EDITENTRY}; $SUBT JOBLENGTH = 10; PAGELENGTH =59; TYPE AICONTROL = (DONTCARE,BANDLIMIT,UPPERLIMIT,LOWERLIMIT); AI_LOOP = (AIONLY,AIDOBELOW,AIDOABOVE,AISETSAO,SETPOINT); DICONTROL = (IGNORE,ABORT,ALARM,HOLD,TIMERESET,BUZZER); SAITLE START OF MAIN PROGRAM BEGIN {CONFIGURATOR} IOABORT (SYSTEMENTRY,FALSE); clearscreen; RESET (SYSTEMENTRY,'/D1/SYSTEM'); IOERROR := IORESULT(SYSTEMENTRY); IOABORT (SYSTEMENTRY,TRUE); IF (IOERROR = 216) THEN create_SF ELSE GET (SYSTEMENTFESTATE = (LOW,HIGH); DOCONTROL = (NORMAL,INVERTED); TEMP_TYPE = (T_AUTO_MAN,TEMP_AI,PREF_AO,H2_AO,O2_AO); LATHE_TYPE = (L_AUTO_MAN,SPEED_AO,INLETSWITCH,EXHAUSTSWITCH); NAMETYPE= ARRAY[1..NAMELENGTH] OF CHAR; ARY); REPEAT clearscreen; WRITELN('SYSTEM FILE EDITOR PROGRAM'); WRITELN; WRITELN('(0) exit'); WRITELN('(1) change/delete an entry'); WRITELN('(2) print systemfile'); CHOICE := getchoice; CASE CHOICE OF '0'I = RECORD NAME : NAMETYPE; UNIT : ARRAY[1..UNITLENGTH] OF CHAR; SCALE : REAL; LOOP : AI_LOOP; CONTROL : AICONTROL; R,DOLINK : 0..MAXDONR; AOLINK : 0..MAXAONR END; AO = RECORD NAME : NAMETYPE; UNIT : ARRAY[1..UNITLENGTH] OF CHAR; SCALE : REAL;     AILINK : 0..MAXAINR; DOLINK : 0..MAXDONR; SOFTST : 0..MAXDONR; RATIOLINK : 0..MAXAONR; RATIOVALUE : REAL END; DI = BOOLEAN; EDIT_TABLE: TABLEDEF; BEGIN chngAOset(SET_OF_AO); REPEAT clearscreen; {STEPTITLE;} dispAOset(SET_OF_AO,COUNT); WRITELN ('enter number to change a function table or to exit'); AONR :RECORD NAME : NAMETYPE; SAFE : SAFESTATE; CONTROL : DICONTROL; DOLINK : 0..MAXDONR END; DOUT = RECORD NAME : NAMETYPE; $TITLE RECIPE EDITOR FOR FIBER OPTICS CONTROL PROGRAM RECIPE_EDITOR(INPUT,OUTPUT); CONST NONAME = 'XXXXXXXXXX'; NOUNIT = 'XXXXX'; NAMELENGTH = 10; UNITLENGTH = 5; MAXAINR = 32; MAXAONR = 16; MAXDIN CONTROL : DOCONTROL; INTERLOCK : 0..MAXDONR; CONDLOCK : 0..MAXDONR END; TEMPCONTROL = ARRAY[T_AUTO_MAN..O2_AO] OF INTEGER; LATHECONTROL = ARRAY[L_AUTO_MAN..EXHAU      STSWITCH] OF INTEGER; SYSTEM = RECORD AILIST : ARRAY[1..MAXAINR] OF AI; AOLIST : ARRAY[1..MAXAONR] OF AO; DILIST : ARRAY[1..MAXDINR] OF DI; DOLIST : ARRAY[1..MAXDONRSETP : INTEGER; O2_SETP : INTEGER; FAST_SPEED: INTEGER; END; {IOSET HAS THE INFO FOR DIGITAL INPUTS, OUTPUTS(2X) AND CHANGING AO'S IN A BLOCKSTEP} TABLEDEF = ARRAY [1..MA] OF DOUT; TEMP : TEMPCONTROL; LATHE : LATHECONTROL; END; MAXSTRING = ARRAY[1..MAXLENGTH] OF CHAR; IOPORTTYPE= ARRAY[1..2] OF CHAR; RCD_INDEX = (NOT_ALLOCAXTAB] OF INTEGER; FUNCDEF = ARRAY [1..MAXFUNC] OF CHAR; {TO BE DEFINED YET} VAR I,IOERROR, SYSERROR : INTEGER; CHOICE,ANSWER: CHAR; CHANGE,FOUND,OK : BOOLEAN; STEPNUMBER : INTEGER; LATHE_LENGTH: ITED,RCD_DONTCARE,RCD_1HEADER,RCD_2HEADER, TIMED_STEP, EVENT_STEP, BLOCK_STEP, RCD_TABLE, RCD_FUNCTION); INDEXDEF = RECORD DESCRIPTOR : RCD_INDEX; STARTSTEPNR : INTEGER; END_OR_AONR :NTEGER; INPUTSTRING : MAXSTRING; RCNAME : ARRAY [1..25] OF CHAR; INDEXNAME : ARRAY [1..32] OF CHAR; INDEX : FILE OF INDEXLIST; STEP_EDIT : STEPDEF; HEADER1_EDIT : HEAD1; HEADER2_EDIT : INTEGER; END; INDEXLIST = ARRAY[0..MAXRECORD] OF INDEXDEF; HEAD1 = RECORD JOBNR : ARRAY[1..JOBLENGTH] OF CHAR; ALARMVAL : ARRAY[1..MAXAINR] OF INTEGER; ALARMCONTRO HEAD2; RECIPE : FILE OF RECORD CASE INTEGER OF 0 : (HEADER1 : HEAD1); 1 : (HEADER2 : HEAD2); 2 : (STEP : STEPDEF); L: ARRAY[1..MAXAINR] OF DICONTROL; END; HEAD2 = RECORD ABORTVAL : ARRAY[1..MAXAINR] OF INTEGER; ABORTCONTROL: ARRAY[1..MAXAINR] OF DICONTROL; LATHE_LENGTH : INTEGER; {CM}  3 : (TABLE : TABLEDEF); 4 : (FUNC : FUNCDEF); END {RECORD}; SYSTEMENTRY : FILE OF SYSTEM; FUNCTION real_val (MAXVAL: REAL; CURVAL: INTEGER): REAL; VAR X : REAL; BEGIN X := MAXVA TUBE_WEIGHT : REAL; {KG} TUBE_DIAMETER: REAL; {MM} END; AOLISTTYPE= ARRAY[1..MAXAONR] OF INTEGER; AILISTTYPE= ARRAY[1..20] OF INTEGER; SETTYPE = SET OF 0..255; L * CURVAL / $FFF; IF X < 0 THEN X := 0.0; real_val := X; END; {real_val} FUNCTION int_val (MAXVAL: REAL; VALUE: REAL): INTEGER; VAR I : INTEGER; X : REAL; BEGIN X := VALUE * $FFF / MAXVAL; IF X > $FFF THEN I := $FFF ELSE I := ROUND (X) RAMP_TYPE = (RAMP_TIME,ENDSPEED); RAMPTYPE = ARRAY [1..5,RAMP_TIME..ENDSPEED] OF INTEGER; STEPDEF = RECORD NAME : NAMETYPE; AOLIST : AOLISTTYPE; ; int_val := I; END; {int_val} $SUBTITLE READ ONE CHARACTER FROM KEYBOARD FUNCTION getchoice : CHAR; VAR C : CHAR; BEGIN WRITE('':15,'your choice: '); PROMPT; GET(INPUT); IF EOLN(INPUT) THEN C := '0' ELSE READ(C); READLN; ge AILIST : AILISTTYPE; IOSET : SETTYPE; SPEEDCONT : RAMPTYPE; TERMINATOR: BOOLEAN; TIME : INTEGER; H2_tchoice := C END; {getchoice} FUNCTION getchar : CHAR; VAR ANSWER : CHAR; BEGIN GET(INPUT); IF EOLN(INPUT) THEN ANSWER := 'N' ELSE READ(ANSWER); READLN; getchar := ANSWER; END; {getchar} FUNCTION getanswer : CHAR; BEGIN WRITELN; WRITE(      'C = change, D = delete, = exit'); PROMPT(OUTPUT); getanswer := getchoice; END; {getanswer} FUNCTION readint(F:INTEGER) : INTEGER; VAR I,OLD,IOERROR : INTEGER; BEGIN OLD :=F; GET(INPUT); IF NOT EOLN(INPUT) THEN BEGIN IOABORT (INPDURES FUNCTION steprequest: INTEGER; BEGIN WRITE('step number: '); PROMPT(OUTPUT); steprequest := READINT(0); END; {steprequest} FUNCTION findendstep : INTEGER; VAR I,MAX : INTEGER; BEGIN MAX := 0; FOR I := 0 TO MAXRECORD DO WITH INDEX^[I] UT,FALSE); READLN (INPUT,I); IOERROR := IORESULT(INPUT); IF IOERROR <> 0 THEN BEGIN READLN; I := OLD END; IOABORT(INPUT,TRUE); END {IF} ELSE I:= OLD; readint := I END; {readint} $SUBTITLE CHANGES F TO NEDO IF STARTSTEPNR > MAX THEN MAX := STARTSTEPNR; findendstep := MAX; END{findendstep}; PROCEDURE searchstepindex (VAR INDEXTYPE: RCD_INDEX; STEPNR: INTEGER; VAR TOTSTEPNR: INTEGER; VAR FOUND : BOOLEAN); {search for thW VALUE IF ANY IS CORRECTLY ENTERED FUNCTION readreal(F:REAL) : REAL; VAR IOERROR : INTEGER; R,OLD : REAL; BEGIN OLD :=F; GET(INPUT); IF NOT EOLN(INPUT) THEN BEGIN IOABORT (INPUT,FALSE); READLN (INPUT,R); IOERROR := IORESULT(INPUe requested step record; if found then position recipe file to read this record} VAR I : INTEGER; BEGIN I := -1; REPEAT I :=I+1; WITH INDEX^[I] DO BEGIN FOUND := (STARTSTEPNR= STEPNR) AND (DESCRIPTOR IN [TIMEDT); IF IOERROR <> 0 THEN BEGIN READLN; R := OLD END; IOABORT(INPUT,TRUE); END {IF} ELSE R:= OLD; readreal := R; END; {readreal} PROCEDURE readstring (VAR INP: MAXSTRING; VAR C: BOOLEAN); VAR F : FILE OF MAXSTRIN_STEP..BLOCK_STEP]); INDEXTYPE := DESCRIPTOR; TOTSTEPNR := END_OR_AONR; END {WITH} UNTIL FOUND OR (I = MAXRECORD); IF FOUND THEN REPOSITION (RECIPE,I); END; {searchstepindex} $SUBTITLE RECIPE INDEX FILE PROCEDURES PRG; I : INTEGER; BEGIN RESET (F,'/TERM'); GET (F); C := (F^[1] <> ' '); {if no char_string is entered F^[1] = blank} IF C {a new string is entered} THEN FOR I := 1 TO MAXLENGTH DO INP[I] := F^[I] END; {readstring} PROCEDURE error(X : INTOCEDURE searchfullindex (INDEXTYPE: RCD_INDEX; STEPNR: INTEGER; TOTSTEPNR : INTEGER; VAR FOUND : BOOLEAN); {search for the requested record; if found then position recepe file to read this record} VAR I : INTEGER; BEGIN I := -EGER); BEGIN CASE X OF 1 : WRITELN('INPUT ERROR'); 2 : WRITELN('ENTRY TOO LARGE'); 3 : WRITELN('new value exceeds the maximum value'); 4 : WRITELN('INPUT IS NOT A NUMBER'); 5 : WRITELN('max. time is 8 hrs, 59 minutes, 51; REPEAT I :=I+1; WITH INDEX^[I] DO BEGIN FOUND := (STARTSTEPNR= STEPNR) AND (END_OR_AONR=TOTSTEPNR) AND (DESCRIPTOR = INDEXTYPE); END {WITH} UNTIL FOUND OR (I = MAXRECORD); IF FOUND THEN REPOSITION 9 seconds'); 6 : WRITELN('max. number of steps in a blockstep is',STEPSINBLOCK:3); 7 : WRITELN('no spaces in name allowed; first char. not a number'); OTHERWISE: WRITELN('ERROR') END {X} END; {error} PROCEDURE stars; {prints a line of sta(RECIPE,I); END; {searchfullindex} PROCEDURE check_index (VAR OCCUPIED : BOOLEAN;COPYBEGIN,LENGTH :INTEGER); {checks if no steps are defined between copybegin, copybegin+length} VAR I, COUNT : INTEGER; MESSAGE, EXIST : BOOLEAN; BEGIN OCCUPIED := FALrs} VAR I : INTEGER; BEGIN WRITELN; FOR I := 0 TO 75 DO WRITE('*'); WRITELN; WRITELN; END; {stars} PROCEDURE clearscreen; VAR CLEAR : CHAR; BEGIN CLEAR := CHR($1B); WRITELN (CLEAR,'X'); END; {clearscreen} $SUBTITLE RECIPE INDEX FILE PROCESE; FOR I := 0 TO MAXRECORD DO WITH INDEX^[I] DO IF DESCRIPTOR IN [TIMED_STEP..BLOCK_STEP] THEN BEGIN MESSAGE := TRUE; FOR COUNT := 0 TO END_OR_AONR-1 DO BEGIN EXIST := ((STARTSTEPNR + C      OUNT)>= COPYBEGIN) AND ((STARTSTEPNR + COUNT) < (COPYBEGIN + LENGTH)); IF EXIST AND MESSAGE THEN BEGIN WRITE('a step with stepnumber',STARTSTEPNR:5); WRITELN('and length' DESCRIPTOR := NOT_ALLOCATED; STARTSTEPNR := -1; END_OR_AONR := 1; END {IF} END {WITH} UNTIL FOUND OR (I = MAXRECORD); END; {del_from_index} $SUBTITLE CREATE NEW STEP FUNCTION steptotal(TOTAL,STARTSTEP: INTEGER) : INTE,END_OR_AONR:3,' still exists'); MESSAGE := FALSE; END; {IF} IF EXIST THEN OCCUPIED := TRUE; END; {FOR} END; {IF} END; {check_index} PROCEDURE add_to_index (INDEXTYPE: RCD_INDEX; STEPNR: INTGER; VAR NEW: INTEGER; OK,OCCUPIED : BOOLEAN; BEGIN WRITELN('total number of steps in this block is',TOTAL:3); REPEAT OCCUPIED := FALSE; WRITE('new total: '); PROMPT(OUTPUT); NEW := readint(TOTAL); OK := (NEW <= STEPSINBLOCEGER; TOTSTEPNR : INTEGER); {change first not_allocated record in index to the requested type} VAR I : INTEGER; FOUND : BOOLEAN; BEGIN I := -1; REPEAT I :=I+1; WITH INDEX^[I] DO BEGIN K) AND (NEW > 0); IF NOT OK THEN ERROR(6); IF OK AND (NEW > TOTAL) THEN check_index(OCCUPIED,STARTSTEP + TOTAL,NEW - TOTAL); UNTIL OK AND NOT OCCUPIED; steptotal := NEW; END {steptotal}; PROCEDURE create_step(VAR STEP_EDIT :STEPDEF;V FOUND := (DESCRIPTOR = NOT_ALLOCATED); IF FOUND THEN BEGIN DESCRIPTOR := INDEXTYPE; STARTSTEPNR:= STEPNR; END_OR_AONR:= TOTSTEPNR; REPOSITION (RECIPE,I); END {IF} END {WITH} UNAR INDEXTYPE: RCD_INDEX; STEPNR: INTEGER; VAR TOTSTEPNR : INTEGER); {asks the user the step type and clears all the fields for this step} VAR I : INTEGER; OK : BOOLEAN; BEGIN REPEAT OK := TRUE; WRITELN; WRITELTIL FOUND OR (I = MAXRECORD); IF (I= MAXRECORD) THEN WRITELN('too many steps in recipe'); END; {add_to_index} $SUBTITLE RECIPE INDEX FILE PROCEDURES PROCEDURE change_index (STEPNR: INTEGER; NEWTOTAL : INTEGER); {change total nr of steps in a block_step}N('(1) TIMED STEP'); WRITELN('(2) LATHE CONTROLLED STEP'); WRITELN('(3) LATHE CONTROLLED BLOCK OF STEPS'); CHOICE := GETCHOICE; CASE CHOICE OF '1' : INDEXTYPE := TIMED_STEP; '2' : INDEXTYPE := EVENT_STEP; '3' :  VAR I : INTEGER; FOUND : BOOLEAN; BEGIN I := -1; REPEAT I :=I+1; WITH INDEX^[I] DO BEGIN FOUND := (STARTSTEPNR= STEPNR) AND (DESCRIPTOR= BLOCK_STEP); IF FOUND THEN END_OR_AONR := NEWTOTAL; END {WITH} UNTIL FOBEGIN INDEXTYPE := BLOCK_STEP; TOTSTEPNR := steptotal(1,STEPNR); END; OTHERWISE : OK := FALSE; END;{CASE} UNTIL OK; add_to_index (INDEXTYPE,STEPNR,TOTSTEPNR); {INITIALIZE THIS NEW STEP} UND OR (I = MAXRECORD); END {change_index}; PROCEDURE del_from_index (INDEXTYPE: RCD_INDEX; STEPNR: INTEGER; TOTSTEPNR : INTEGER; VAR FOUND : BOOLEAN); {search for the requested record; if found then delete entry from index} VAWITH STEP_EDIT DO BEGIN NAME := NONAME; FOR I := 1 TO MAXAONR DO AOLIST[I] := 0; FOR I := 1 TO 20 DO AILIST[I] := 0; IOSET := []; FOR I := 1 TO 5 DO BEGIN SPEEDCONT [I,RAMP_TIME] := 0; SPEEDCONT [I,ENDSPEED ]R I : INTEGER; BEGIN I := -1; REPEAT I :=I+1; WITH INDEX^[I] DO BEGIN FOUND := (STARTSTEPNR= STEPNR) AND (END_OR_AONR=TOTSTEPNR) AND (DESCRIPTOR = INDEXTYPE); IF FOUND THEN BEGIN  := 0; END {FOR}; TERMINATOR := FALSE; TIME := 0; H2_SETP := 0; O2_SETP := 0; FAST_SPEED := 0; END {WITH}; END {create_step}; $SUBTITLE STEP NAME CHANGE PROCEDURE disp_control(CONTROL : DICONTROL); BEGIN CASE CONTROL OF       IGNORE : WRITE('IGNORE':12); BUZZER : WRITE('BUZZER':12); HOLD : WRITE('HOLD ':12); ALARM : WRITE('ALARM ':12); ABORT : WRITE('ABORT ':12); TIMERESET : WRITE('TIME RESET':12); OTHERWISE : WRITE('':12); END {CASE} EN IF OK THEN IF AOLINK = 0 THEN BEGIN VALUE := real_val (SCALE, AIONLYLIST[K]); WRITE (NAME:12,VALUE:9:3,UNIT:7,'':8); COUNT := COUNT + 1; K := K + 1; IF LINE THEND; {disp_control} PROCEDURE steptitle; {stepnumber and stepname are global} BEGIN WRITELN('STEP',STEPNUMBER:5,': ',STEP_EDIT.NAME); END; {steptitle} PROCEDURE stepname(VAR STEPNAME : NAMETYPE); VAR INPUTSTRING : MAXSTRING; CHANGE : BOOLEAN; BEGIN  WRITELN; {2 ENTRIES PER LINE} LINE := NOT LINE; END {IF}; END {WITH}; I := I + 1; UNTIL (COUNT = MAX) OR (I > MAXAINR); ANY := COUNT <> 0; OFFSET := I; STEP_OFFSET := K; WRITELN; END; {disp_AI} PROCEDURE DO_na WRITE ('new name: '); PROMPT (OUTPUT); READSTRING (INPUTSTRING,CHANGE); IF CHANGE THEN STEPNAME [1 FOR 10] := INPUTSTRING [1 FOR 10]; END; {stepname} PROCEDURE namecheck(NAME : NAMETYPE;VAR OK :BOOLEAN); {checks if name <> XXXXXXXXXX; OK ifme(NR : INTEGER); {WRITES NAME OF OUTPUT OR THE CORRESPONDING A.O. NAME} VAR OK : BOOLEAN; I : INTEGER; BEGIN WITH SYSTEMENTRY^ DO BEGIN namecheck(DOLIST[NR].NAME,OK); IF OK THEN WRITE(DOLIST[NR].NAME:12) ELSE FOR I := 1 TO MA true} BEGIN OK:= NAME <> NONAME ; END; $SUBTITLE SETPOINTS, UNLINKED ANALOG INPUTS PROCEDURE disp_MFC (MFC_LIST : AOLISTTYPE; VAR OFFSET: INTEGER; MAX: INTEGER;VAR ANY: BOOLEAN); { displays all AO setpoints} VAR I,COUNT: INTEGER; XAONR DO IF AOLIST[I].DOLINK = NR THEN WRITE (AOLIST[I].NAME:12); END {WITH}; END;{DO_name} PROCEDURE checkinterlock(DOSET :SETTYPE; VAR INTER_ERROR : BOOLEAN); {CHECKS THE DIGITAL OUTPUTS FOR INTERLOCK VIOLATIONS} {A ON AND B ON IS LINE,OK: BOOLEAN; VALUE: REAL; BEGIN COUNT := 0; I := OFFSET; LINE := FALSE; REPEAT WITH SYSTEMENTRY^.AOLIST[I] DO BEGIN namecheck(NAME,OK); IF OK THEN BEGIN VALUE := real_val (SCALE, MFC AN INVALID CONDITION} {PRINTS MESSAGE AND SETS INTER_ERROR FLAG} VAR DONR : INTEGER; ERROR : BOOLEAN; BEGIN INTER_ERROR := FALSE; FOR DONR := 1 TO MAXDONR DO WITH SYSTEMENTRY^.DOLIST[DONR] DO IF INTERLOCK <> 0 THEN BEGIN _LIST[I]); WRITE (NAME:12,VALUE:9:3,UNIT:7,'':8); COUNT := COUNT + 1; IF LINE THEN WRITELN; {2 ENTRIES PER LINE} LINE := NOT LINE; END {IF}; END {WITH}; I := I + 1; UNTIL (COUNT ERROR := ((DONR + OFF2 IN DOSET) AND (INTERLOCK+OFF2 IN DOSET)) OR ((DONR + OFF3 IN DOSET) AND (INTERLOCK+OFF3 IN DOSET)); IF ERROR THEN BEGIN WRITE('INTERLOCK ERROR BETWEEN');  = MAX) OR (I > MAXAONR); ANY := COUNT <> 0; OFFSET := I; WRITELN; END; {disp_MFC} PROCEDURE disp_AI (AIONLYLIST: AILISTTYPE;VAR OFFSET: INTEGER; MAX: INTEGER;VAR ANY: BOOLEAN; VAR STEP_OFFSET: INTEGER); { displays all unlinked (with A DO_name (DONR); WRITE('AND'); DO_name (INTERLOCK); WRITELN; INTER_ERROR := TRUE; END {IF}; END {IF}; END; {checkinterlock} PROCEDURE check_conditional(DOSET :SETTYPE; VAR CONDO) AI setpoints, 8 at a time} VAR I,K, COUNT: INTEGER; OK,LINE: BOOLEAN; VALUE: REAL; BEGIN COUNT := 0; I := OFFSET; K := STEP_OFFSET; LINE := FALSE; REPEAT WITH SYSTEMENTRY^.AILIST[I] DO BEGIN namecheck(NAME,OK); ':25); WRITELN; WRITELN ('':20,'SYSTEM CONFIGURATION TABLE '); stars; LINE := 11; END {IF}; IF ANSWER = 'N' THEN BEGIN REPEAT REWRITE (OUTPUT,'/TERM'); AI_AO_DI_DO (TYPESELECT, IOPORT); IF TYPESELECT      IN [1..4] THEN BEGIN WRITE ('STARTING NUMBER: '); PROMPT; LOOPSTART := 1; LOOPSTART := READINT(LOOPSTART); WRITE ('ENDING NUMBER: '); PROMPT; LOOPEND := 1; LOOROR := TRUE; END {IF}; END;{IF} END; {check_conditional} PROCEDURE check_ratio(STEP_EDIT :STEPDEF;VAR RATIO_ERROR : BOOLEAN); {CHECKS THE RATIO BETWEEN TWO ANALOG OUTPUTS} {RATIO IS OK IF VAL(A)/VAL(B) < RATIOVALUE; RATIOLINK RECORDED BY A}PEND := READINT(LOOPEND); END; {IF} clearscreen; IF LP THEN REWRITE (OUTPUT,'/P1'); CASE TYPESELECT OF 0 : ; 1 : BEGIN OK :=(LOOPEND >=LOOPSTART) AND (LOOPEND IN [1..MAXAINR])  {AN ERRORMESSAGE IS PRINTED AND A FLAG SET} VAR DIVIDEND,DIVISOR :REAL; AONR,RATIONR : INTEGER; ERROR : BOOLEAN; BEGIN RATIO_ERROR := FALSE; WITH SYSTEMENTRY^ DO FOR AONR := 1 TO MAXAONR DO BEGIN RATIONR := AOLIST[AONR].RATIO AND (LOOPSTART IN [1..MAXAINR]); IF OK THEN print_AI (LINE,LOOPSTART,LOOPEND,LP) END; {1} 2 : BEGIN OK :=(LOOPEND >=LOOPSTART) AND (LOOPEND IN [1..MAXAONR]) AND (LOOLINK; IF RATIONR <> 0 THEN BEGIN DIVIDEND := real_val(AOLIST[AONR].SCALE,STEP_EDIT.AOLIST[AONR]); DIVISOR := real_val(AOLIST[RATIONR].SCALE, STEP_EDIT.AOLIST[RATIONR]); IF DIVISPSTART IN [1..MAXAONR]); IF OK THEN print_AO (LINE,LOOPSTART,LOOPEND,LP) END; {2} 3 : BEGIN OK :=(LOOPEND >=LOOPSTART) AND (LOOPEND IN [1..MAXDINR]) AND (LOOPSTART IN [1..MAXDOR <> 0 THEN ERROR := (DIVIDEND / DIVISOR)> AOLIST[AONR].RATIOVALUE ELSE ERROR := (DIVIDEND <> 0); IF ERROR THEN BEGIN WRITELN('RATIO ERROR BETWEEN',AOLIST[AONR].NAME:12, AOLISTINR]); IF OK THEN print_DI (LINE,LOOPSTART,LOOPEND,LP) END; {3} 4 : BEGIN OK :=(LOOPEND >=LOOPSTART) AND (LOOPEND IN [1..MAXDONR]) AND (LOOPSTART IN [1..MAXDONR]); [RATIONR].NAME:12); RATIO_ERROR := TRUE; END; {IF} END; {IF} END; {FOR} END; {check_ratio} PROCEDURE stepsetpoints(VAR STEP_EDIT : STEPDEF); { changes the setpoints (AI, AO) per 8 } VAR OFFSET, STEP_OFFSET ,K, I, COUNIT_ERROR : BOOLEAN); {CHECKS THE DIGITAL OUTPUTS FOR CONDITIONAL INTERLOCK VIOLATIONS } {OK = (A ON IF B IS ON; B OFF ONLY IF A IS OFF); {PRINTS MESSAGE AND SETS CONDIT_ERROR FLAG} VAR DONR : INTEGER; ERROR : BOOLEAN; BEGIN CONDIT_ERROR := FALSE; T,DONR : INTEGER; ANSWER : CHAR; VALUE : REAL; ANY, OK, SETBIT, INTER_ERROR, CONDIT_ERROR, RATIO_ERROR : BOOLEAN; BEGIN clearscreen; REPEAT {UNTIL NOT ERRORS} OFFSET := 1; REPEAT {UNTIL OFFSET > MAXAONR} steptitle; I := OFFSET;  FOR DONR := 1 TO MAXDONR DO WITH SYSTEMENTRY^.DOLIST[DONR] DO IF CONDLOCK <> 0 THEN BEGIN ERROR := ((DONR + OFF2 IN DOSET) AND NOT(CONDLOCK+OFF2 IN DOSET)) OR ((DONR + OFF3 IN DOSET) AND NOT(CONDLOCK+O disp_MFC (STEP_EDIT.AOLIST,OFFSET,8, ANY); IF ANY THEN BEGIN COUNT := 0; WRITELN('change any of these setpoints (Y/N)? '); PROMPT(OUTPUT); ANSWER := getchar; IF ANSWER = 'Y' THEN REPEAT FF3 IN DOSET)); IF ERROR THEN BEGIN WRITE('CONDITIONAL INTERLOCK ERROR BETWEEN'); DO_name (DONR); WRITE('AND'); DO_name (CONDLOCK); WRITELN; CONDIT_ER WITH SYSTEMENTRY^.AOLIST[I] DO BEGIN namecheck(NAME,OK); IF OK THEN REPEAT WRITE(NAME,'max. value:':13,SCALE:9:3,'new value: ':12); PROMPT(OUTPUT);       VALUE := real_val(SCALE,STEP_EDIT.AOLIST[I]); VALUE := readreal(VALUE); OK := VALUE <= SCALE; IF OK THEN STEP_EDIT.AOLIST[I] := int_val(SCALE, VALUE) ELSE ERROR(3); TEP_EDIT.AILIST[K] := int_val(SCALE, VALUE); COUNT := COUNT +1; K := K + 1; END {IF} ELSE ERROR(3); UNTIL OK; I := I + 1; END {WITH};  DONR := DOLINK; UNTIL OK; END {WITH}; IF DONR <> 0 THEN BEGIN WITH SYSTEMENTRY^.DOLIST[DONR] DO SETBIT := ((VALUE > 0) AND (CONTROL = NORMAL)) OR  UNTIL (COUNT = 8) OR (I > MAXAINR); END {IF} UNTIL OFFSET > MAXAINR END; {stepsetpoint} $SUBTITLE DIGITAL OUTPUTS PROCEDURE disp_DO (VAR DIGOUTS : SETTYPE;VAR OFFSET :INTEGER; MAX: INTEGER;VAR ANY: BOOLEAN; OFFCONST:INTEGER;ALL:BOOLEAN) ((VALUE = 0) AND (CONTROL = INVERTED)); WITH STEP_EDIT DO IF SETBIT THEN IOSET := IOSET + [DONR+OFF2] + [DONR+OFF3] ELSE IOSET := IOSET - [DONR+OFF2] - [DONR+OFF3]; END {IF}; ; { displays all digital outputs if ALL = TRUE, else the unlinked D.O.'s} VAR I,COUNT,AONR,LINE: INTEGER; OK : BOOLEAN; SETTING : ARRAY [0..2] OF CHAR; BEGIN COUNT := 0; I := OFFSET; LINE := 0; REPEAT WITH SYSTEMENTRY^.DOLIST[I] D COUNT := COUNT +1; I := I + 1; UNTIL (COUNT = 8) OR (I > MAXAONR); END;{IF} clearscreen; UNTIL OFFSET > MAXAONR; checkinterlock(STEP_EDIT.IOSET,INTER_ERROR); check_conditional(STEP_EDIT.IOSET,CONDIT_ERROR); checkO BEGIN namecheck(NAME,OK); IF OK THEN WRITE(NAME:10) ELSE IF ALL THEN FOR AONR := 1 TO MAXAONR DO IF SYSTEMENTRY^.AOLIST[AONR].DOLINK = I THEN BEGIN WRITE(SYSTEMENTRY^.AO_ratio (STEP_EDIT,RATIO_ERROR); UNTIL NOT(INTER_ERROR OR CONDIT_ERROR OR RATIO_ERROR); {NEXT THE UNLINKED AI'S CAN BE CHANGED } OFFSET := 1; STEP_OFFSET := 1; REPEAT {UNTIL OFFSET > MAXAINR} clearscreen; steptitle; I := OFFSET; KLIST[AONR].NAME:10); OK := TRUE; END; {IF} IF OK THEN BEGIN IF ((I+OFFCONST IN DIGOUTS) AND (CONTROL = NORMAL)) OR ((NOT (I+OFFCONST IN DIGOUTS)) AND (CONTROL = INVERTED)) THEN  := STEP_OFFSET; disp_AI (STEP_EDIT.AILIST,OFFSET,8, ANY, STEP_OFFSET); IF ANY THEN BEGIN COUNT := 0; WRITELN('change any of these setpoints (Y/N)? '); PROMPT(OUTPUT); ANSWER := getchar; IF ANSWER = ' SETTING := ' ON' ELSE SETTING := 'OFF'; WRITE (SETTING:4,'':6); COUNT := COUNT + 1; LINE := LINE + 1; IF LINE = 4 THEN {4 DO'S PER LINE} BEGIN WRITELN; LINE Y' THEN REPEAT WITH SYSTEMENTRY^.AILIST[I] DO BEGIN namecheck(NAME,OK); IF OK AND (AOLINK = 0) THEN REPEAT WRITE(NAME,'max. value:':13,SCALE:9:3,'new value: ':= 0; END {IF}; END {IF}; I := I + 1; END {WITH}; UNTIL (COUNT = MAX) OR (I > MAXDONR); ANY := COUNT <> 0; OFFSET := I; WRITELN; END; {disp_DO} $SUBTITLE DIGITAL OUTPUTS PROCEDURE stepoutputs(VAR DIGOUTS : SETTYPE;:12); PROMPT(OUTPUT); VALUE := real_val(SCALE,STEP_EDIT.AILIST[K]); VALUE := readreal(VALUE); OK := VALUE <= SCALE; IF OK THEN BEGIN S OFFCONST: INTEGER); VAR ANSWER : CHAR; OFFSET, I, COUNT: INTEGER; INTER_ERROR, CONDIT_ERROR, ANY, SETBIT,OK : BOOLEAN; {SETBIT TRUE = ACTIVATE, FALSE = DEACTIVATE} BEGIN clearscreen; REPEAT {UNTIL NO ERRORS} OFFSET := 1; REPEAT {UNTIL      OFFSET > MAXDONR} steptitle; I := OFFSET; disp_DO (DIGOUTS,OFFSET,8,ANY,OFFCONST,FALSE); IF ANY THEN BEGIN WRITE('change any of these outputs (Y/N)? '); PROMPT (OUTPUT); ANSWER := getchar; IF ANSWER disp_control (CONTROL); COUNT := COUNT + 1; IF LINE THEN WRITELN {2 ENTRIES PER LINE} ELSE WRITE('':5); LINE := NOT LINE; END {IF}; END; {WITH} I := I + 1; UNTIL ( = 'Y' THEN BEGIN WRITELN('0 = OFF, 1 = ON, = don''t change'); WRITELN; COUNT := 0; REPEAT WITH SYSTEMENTRY^.DOLIST[I] DO BEGIN namecheck(NAME,OK); COUNT = MAX) OR (I > MAXDINR); ANY := COUNT <> 0; OFFSET := I; WRITELN; END; {disp_DI} $SUBTITLE DIGITAL INPUTS PROCEDURE stepinputs(VAR DIGINPUTS : SETTYPE); VAR ANSWER : CHAR; OFFSET, I, COUNT: INTEGER; ANY, SETBIT,OK: BOOLEAN; {SET IF OK THEN BEGIN WRITE(NAME,' : '); PROMPT(OUTPUT); COUNT := COUNT + 1; ANSWER := getchar; IF ANSWER <> 'N' THEN BIT TRUE = CHECK, FALSE = DON'T CHECK} BEGIN OFFSET := 1; REPEAT {UNTIL OFFSET > MAXDINR} clearscreen; steptitle; I := OFFSET; disp_DI (DIGINPUTS,OFFSET,8,ANY); IF ANY THEN BEGIN WRITE('change any of t BEGIN SETBIT :=((ANSWER = '1') AND (CONTROL= NORMAL)) OR ((ANSWER = '0') AND (CONTROL= INVERTED)); IF SETBIT THEN DIGOUTS := DIGOUTS + [I+OFFCONST] hese inputs (Y/N)? '); PROMPT (OUTPUT); ANSWER := getchar; IF ANSWER = 'Y' THEN BEGIN WRITELN('0 = don''t check this input in this step'); WRITELN('1 = check this input, = don''t change');  ELSE DIGOUTS := DIGOUTS - [I+OFFCONST]; END {IF} END {IF}; END {WITH}; I := I + 1; UNTIL (COUNT = 8) OR (I> MAXDONR); END {IF} END; {IF} clearscreen;  COUNT := 0; REPEAT WITH SYSTEMENTRY^.DILIST[I] DO BEGIN namecheck(NAME,OK); IF OK THEN BEGIN WRITE(NAME,' : '); PROMPT(OUT UNTIL OFFSET > MAXDONR; checkinterlock(DIGOUTS,INTER_ERROR); check_conditional(DIGOUTS,CONDIT_ERROR); UNTIL NOT(INTER_ERROR OR CONDIT_ERROR); END {stepinputs}; $SUBTITLE DIGITAL INPUTS PROCEDURE disp_DI (VAR DIGINPUTS : SETTYPE; PUT); COUNT := COUNT + 1; ANSWER := getchar; IF ANSWER <> 'N' THEN BEGIN SETBIT :=(ANSWER = '1'); IF SETBIT THEN  VAR OFFSET: INTEGER; MAX: INTEGER;VAR ANY: BOOLEAN); { displays all AO setpoints} VAR I,COUNT: INTEGER; LINE,OK : BOOLEAN; SETTING : ARRAY [0..10] OF CHAR; BEGIN COUNT := 0; I := OFFSET; LINE := FALSE; REPEAT WITH SYSTEMENTRY^.DILIS DIGINPUTS := DIGINPUTS + [I+OFF1] ELSE DIGINPUTS := DIGINPUTS - [I+OFF1]; END {IF} END {IF}; END {WITH}; I := I + 1; UNTIL (COUNT = 8) OR (I> MAXDINR);T[I] DO BEGIN namecheck(NAME,OK); IF OK THEN BEGIN IF I+OFF1 IN DIGINPUTS THEN SETTING := 'check ' ELSE SETTING := 'don''t check'; WRITE (NAME,SETTING:13);  END {IF} END {IF} UNTIL OFFSET > MAXDINR; END {stepinputs}; $SUBTITLE READ AND DISPLAY TIME ENTRIES PROCEDURE converttime(TIME: MAXSTRING;VAR TIM: INTEGER;VAR OK : BOOLEAN); {CHANGE TIME ENTRY (H.MM.SS) TO SECONDS} {OK IS TRUE IF ENTERED T     IME IS CORRECT, OTHERWISE FALSE} VAR I : INTEGER; CH,CH10 : CHAR; BEGIN {CHECK ALL CHARACTERS FOR CORRECTNESS} OK := (TIME[1] IN ['0'..'8']) AND (TIME[2] = '.') AND (TIME[3] IN ['0'..'5']) AND (TIME[4] IN ['0'..'9,TT,'':2); PROMPT(OUTPUT); READSTRING(INPUTSTRING,CHANGE); IF CHANGE THEN CONVERTTIME(INPUTSTRING,SECONDS,OK); UNTIL OK END; {steptime} $SUBTITLE EDIT SPEED RAMPING INFO PROCEDURE dispramps( VAR SPEEDINFO :RAMPTYPE); VAR N,I : INT']) AND (TIME[5] = '.') AND (TIME[6] IN ['0'..'5']) AND (TIME[7] IN ['0'..'9']) ; IF OK THEN BEGIN CH := TIME[1]; TIM := (ORD(CH)- ORD('0')); CH10 := TIME[3]; CH := TIME[4]; EGER; STARTSPEED,VALUE : REAL; BEGIN WITH SYSTEMENTRY^ DO BEGIN N := LATHE[SPEED_AO]; WRITELN('interval time(h.mm.ss) start speed','':9,'end speed'); STARTSPEED := 0.0; FOR I := 1 TO 5 DO BEGIN VALUE := real_val TIM := 60 * TIM +10*(ORD(CH10)- ORD('0'))+ (ORD(CH)- ORD('0')); CH10 := TIME[6]; CH := TIME[7]; TIM := 60 * TIM +10*(ORD(CH10)- ORD('0'))+ (ORD(CH)- ORD('0')); END {IF} ELSE IF TIME[1] > '8' THEN ERROR(5) EL(AOLIST[N].SCALE,SPEEDINFO[I,ENDSPEED]); WRITE (I:2,'':8); disptime(SPEEDINFO[I,RAMP_TIME]); WRITE(STARTSPEED:13:3,AOLIST[N].UNIT:7); WRITELN(VALUE:13:3,AOLIST[N].UNIT:7); STARTSPEED := VALUE; END {FOR}; END {SE ERROR(1) END {converttime}; $SUBTITLE READ AND DISPLAY TIME ENTRIES PROCEDURE disptime(TIM : INTEGER); {CHANGES TIME (SECONDS) TO H.MM.SS REPRESENTATION AND PRINTS IT} VAR TIME : ARRAY[1..7] OF CHAR; POWEROF60 : 1..3600; QUOTIENT : INTEGERWITH} END {dispramps}; PROCEDURE chngsetp(N : INTEGER;VAR CURVAL : INTEGER); VAR VALUE : REAL; OK : BOOLEAN; BEGIN WITH SYSTEMENTRY^.AOLIST[N] DO REPEAT VALUE := real_val(SCALE, CURVAL); WRITE(NAME,'max. value:':13,SCALE:9:3,UNIT:6,'new va; REMAINDER : INTEGER; QUOT10 : 0..5; REMAIN10 : 0..9; BEGIN POWEROF60 := 3600; REMAINDER := TIM; QUOTIENT := REMAINDER DIV POWEROF60; {EXTRACT HOURS} REMAINDER:= REMAINDER MOD POWEROF60; TIME[1] := (CHR(QUOTIENT + ORD('0'))); Plue: ':14); PROMPT(OUTPUT); VALUE := readreal(VALUE); OK := VALUE <= SCALE; IF OK THEN CURVAL := int_val(SCALE, VALUE) ELSE ERROR(3); UNTIL OK; END; {chngsetp} PROCEDURE stepspeed (VAR SPEEDINFO : RAMPTYPE); VAR I,N : INOWEROF60 := POWEROF60 DIV 60; QUOTIENT := REMAINDER DIV POWEROF60; {EXTRACT MINUTES} REMAINDER:= REMAINDER MOD POWEROF60; {SECONDS } QUOT10 := QUOTIENT DIV 10; REMAIN10 := QUOTIENT MOD 10; TIME[2] := '.'; TIME[3] := (CHR(QUOT10 + ORD('0')))TEGER; VALUE :REAL; CHOOCE : CHAR; INPUTSTRING : MAXSTRING; CHANGE, OK : BOOLEAN; BEGIN REPEAT {UNTIL I = 0} clearscreen; steptitle; WRITELN('five time intervals can be given, in which the lathe'); WRITELN (' speed is ramped; TIME[4] := (CHR(REMAIN10 + ORD('0'))); QUOT10 := REMAINDER DIV 10; REMAIN10 := REMAINDER MOD 10; TIME[5] := '.'; TIME[6] := (CHR(QUOT10 + ORD('0'))); TIME[7] := (CHR(REMAIN10 + ORD('0'))); WRITE(TIME:9); END {disptime}; PROCEDURE stept lineair between start and end value.'); dispramps (SPEEDINFO); WRITELN; WRITE ('enter nr of interval to be changed or to exit: '); prompt(OUTPUT); I := READINT(0); IF (I< 6) AND (I> 0) THEN BEGIN REPEAT ime(VAR SECONDS : INTEGER); CONST TT ='time is (h.mm.ss.):'; VAR CHANGE ,OK : BOOLEAN; INPUTSTRING : MAXSTRING; BEGIN clearscreen; steptitle; REPEAT OK := TRUE; WRITE('step',TT); disptime (SECONDS); WRITELN; WRITE('new ' WRITE ('new time: '); prompt(OUTPUT); readstring(INPUTSTRING,CHANGE); OK := TRUE; IF CHANGE THEN converttime(INPUTSTRING,SPEEDINFO[I,RAMP_TIME],OK); UNTIL OK; WRITELN ('new      end speed'); N := SYSTEMENTRY^.LATHE [SPEED_AO]; chngsetp(N, SPEEDINFO [I,ENDSPEED]); END {IF} UNTIL I = 0; END; {stepspeed} PROCEDURE stepterminator (VAR TERMINATOR :BOOLEAN); VAR CHOOSE : CHAR; BEGIN clearscreen; steptitle; IN SET_OF_AO) AND OK THEN BEGIN WRITE(I:2, NAME:12,'':3); ELEMENTS := ELEMENTS + 1; LINE := LINE + 1; IF LINE = 4 THEN BEGIN WRITELN; LINE := 0; END; END {IF}; END {WITH};  WRITE('this step is'); IF NOT TERMINATOR THEN WRITE (' not'); WRITELN(' defined as end step'); WRITELN('mark this step as end step (Y/N) ?'); CHOOSE := getchoice; IF CHOOSE <> '0' THEN TERMINATOR := (CHOOSE = 'Y'); END; {stepterminator} $SWRITELN; END {dispAOset}; PROCEDURE chngAOset (VAR SET_OF_AO : SETTYPE); VAR I, N, COUNT : INTEGER; ANSWER : CHAR; SETALL : SETTYPE; BEGIN clearscreen; WRITELN('all outputs that can be defined as changing during a blockstep'); SETALL := []; FOUBTITLE FAST FORWARD PARAMETERS PROCEDURE dispforward (N, CURVAL: INTEGER); VAR VALUE : REAL; BEGIN WITH SYSTEMENTRY^.AOLIST[N] DO BEGIN VALUE := real_val (SCALE, CURVAL); WRITE(NAME,VALUE:8:2,UNIT:6,'':2); END {FOR} END {dispforward}; PRR I := 1 TO MAXAONR DO SETALL := SETALL + [I+OFF4]; dispAOset(SETALL,COUNT); WRITELN('outputs currently defined as changing in this block step'); dispAOset(SET_OF_AO,COUNT); IF COUNT = 0 THEN WRITELN('NONE DEFINED'); IF COUNT < 5 THEN REPEOCEDURE stepforward (VAR STEP_EDIT : STEPDEF); {change the fast forward parameters, i.e. digital outputs, H2, O2 and speed of burner} VAR N : INTEGER; VALUE : REAL; BEGIN clearscreen; steptitle; WRITELN('FAST FORWARD PARAMETERS'); stepoutputs AT WRITE('enter a number to add an entry or to exit: '); PROMPT(OUTPUT); N := readint(0); IF (N>0) AND (N < MAXAONR) AND NOT(N IN SET_OF_AO) THEN BEGIN SET_OF_AO := SET_OF_AO + [N+OFF4]; COUNT := COUNT + 1; (STEP_EDIT.IOSET,OFF3); WITH SYSTEMENTRY^ DO BEGIN N := TEMP[H2_AO]; dispforward (N, STEP_EDIT.H2_SETP); WRITELN; chngsetp (N, STEP_EDIT.H2_SETP); N := TEMP[O2_AO]; dispforward (N, STEP_EDIT.O2_SETP); WRITELN; ch END; UNTIL (N = 0) OR (COUNT = 5); IF COUNT > 0 THEN REPEAT WRITE('enter a number to delete an entry or to exit: '); PROMPT(OUTPUT); N := readint(0); IF (N>0) AND (N < MAXAONR) AND (N+OFF4 IN SET_OF_AO) THEN BEGIN ngsetp (N, STEP_EDIT.O2_SETP); N := LATHE[SPEED_AO]; dispforward (N, STEP_EDIT.FAST_SPEED); WRITELN; chngsetp (N, STEP_EDIT.FAST_SPEED); END; {WITH} END {stepforward}; PROCEDURE dispAOset(SET_OF_AO : SETTYPE; VAR ELEMENTS: INTEGER);  SET_OF_AO := SET_OF_AO - [N+OFF4]; {DELETE THE AO_TABLE TOO} COUNT := COUNT - 1; END; UNTIL (N = 0) OR (COUNT = 0); END; {chngAOset} $SUBTITLE DISPLAY/EDIT THE SETPOINT TABLES OF A BLOCK STEP PROCEDURE disptables (VAR SET_OF_AO : SVAR I,LINE : INTEGER; OK : BOOLEAN; BEGIN LINE := 0; ELEMENTS := 0; FOR I := 1 TO MAXAONR DO WITH SYSTEMENTRY^.AOLIST[I] DO BEGIN namecheck(NAME,OK); {AO'S WITH ASSOCIATED RATIOLINKS OR INTERLOCKS CANNOT BE PUT IN BLOCKTABLEETTYPE; STEPNUMBER : INTEGER; TOTSTEPNR : INTEGER); VAR I, N, COUNT : INTEGER; EXIST : BOOLEAN; VALUE : REAL; BLOCKTABLE : ARRAY[1..5] OF TABLEDEF; BEGIN COUNT := 1; FOR I := 1 TO MAXAONR DO IF I+OFF4 IN SET_OF_S} IF OK THEN BEGIN IF (DOLINK <> 0) THEN OK := (SYSTEMENTRY^.DOLIST[DOLINK].INTERLOCK = 0) AND (SYSTEMENTRY^.DOLIST[DOLINK].CONDLOCK = 0); OK := OK AND (RATIOLINK = 0); END {IF}; IF (I+OFF4 AO THEN BEGIN searchfullindex(RCD_TABLE,STEPNUMBER,I,EXIST); IF EXIST THEN BEGIN GET(RECIPE); BLOCKTABLE[COUNT] := RECIPE^.TABLE; END ELSE FOR N := 1 TO MAXTAB DO BLOCKTABLE[C     OUNT,N] := 0; {INITIALIZE TABLE} COUNT := COUNT+1; END {IF}; WRITE('step'); WITH SYSTEMENTRY^ DO BEGIN FOR I := 1 TO MAXAONR DO IF I+OFF4 IN SET_OF_AO THEN WRITE (AOLIST[I].NAME:15); WRITELN; FOR N := 1 T RECIPE^.TABLE := EDIT_TABLE; PUT(RECIPE); END {IF} ELSE IF AONR <> 0 THEN WRITELN('this output is not defined as a changing one'); UNTIL AONR = 0; END {steptables}; $SUBTITLE EDIT THE RECIPE HEADER PROCEDURE display_header(VAR OFFSET:INTO TOTSTEPNR DO BEGIN COUNT := 1; WRITE((N+STEPNUMBER-1):3,'':2); FOR I := 1 TO MAXAONR DO IF I+OFF4 IN SET_OF_AO THEN BEGIN VALUE := real_val(AOLIST[I].SCALE, BLOCKTABLE[COUNT,N]); EGER; MAX:INTEGER;VAR ANY:BOOLEAN); {display max nr of AIlimits if they exist} VAR I, COUNT : INTEGER; VALUE : REAL; CONTR : DICONTROL; OK : BOOLEAN; BEGIN COUNT := 0; I := OFFSET; WRITE('nr','name':6,'alarm limit1':19,'action':8); WRI WRITE (VALUE:9:3,AOLIST[I].UNIT:6); COUNT := COUNT+1; END {IF}; WRITELN; END {FOR}; END {WITH}; END {disptables}; PROCEDURE steptables (VAR SET_OF_AO : SETTYPE; STEPNUMBER : INTEGER; TOTSTTELN('alarm limit2':16,'action':8,'max. value':12); REPEAT WITH SYSTEMENTRY^.AILIST[I] DO BEGIN namecheck(NAME,OK); IF OK THEN BEGIN VALUE := real_val (SCALE,HEADER1_EDIT.ALARMVAL[I]); WRITE(I:2,NAMEPNR : INTEGER); VAR I, COUNT,AONR, NR : INTEGER; VALUE : REAL; OK, EXIST : BOOLEAN; EDIT_TABLE: TABLEDEF; BEGIN chngAOset(SET_OF_AO); REPEAT clearscreen; {STEPTITLE;} dispAOset(SET_OF_AO,COUNT); WRITELN ('enter number to change a fuE:12,VALUE:9:3); CONTR := HEADER1_EDIT.ALARMCONTROL[I]; disp_control (CONTR); VALUE := real_val (SCALE,HEADER2_EDIT.ABORTVAL[I]); CONTR := HEADER2_EDIT.ABORTCONTROL[I]; WRITE(VALUE:12:3); dinction table or to exit'); AONR := readint(0); IF (AONR>0) AND (AONR+OFF4 IN SET_OF_AO) THEN BEGIN searchfullindex(RCD_TABLE,STEPNUMBER,AONR,EXIST); IF EXIST THEN BEGIN GET(RECIPE); EDIT_TABLE := RECIPE^.TABLE sp_control (CONTR); WRITELN(SCALE:9:3,UNIT:6); COUNT := COUNT + 1; END {IF}; END {WITH}; I := I + 1; UNTIL (COUNT = MAX) OR (I> MAXAINR); ANY := (COUNT <> 0); OFFSET := I; END; {disp_header} PROCEDURE create_h END {IF} ELSE BEGIN add_to_index(RCD_TABLE,STEPNUMBER,AONR); FOR I := 1 TO MAXTAB DO EDIT_TABLE[I] := 0; {INITIALIZE TABLE} END; {ELSE} clearscreen; WITH SYSTEMENTRY^.AOLIST[AONR] DO BEGIN eader; VAR I : INTEGER; BEGIN WITH HEADER1_EDIT DO BEGIN JOBNR := '0000000000'; FOR I:=1 TO MAXAINR DO BEGIN ALARMVAL[I] := 0; ALARMCONTROL[I] := IGNORE; END; {FOR} END; {WITH} WITH HEADER2_EDIT DO BEGIN  WRITELN(NAME,'max. value:':13,SCALE:9:3,UNIT:6); FOR I := 1 TO TOTSTEPNR DO REPEAT VALUE := real_val(SCALE, EDIT_TABLE[I]); WRITE(I:2,NAME:12,'value:':9,VALUE:9:3,UNIT:6,'new value: ':14); PROMPT(OUTPUT); FOR I:=1 TO MAXAINR DO BEGIN ABORTVAL[I] := 0; ABORTCONTROL[I] := IGNORE; END; {FOR} LATHE_LENGTH := 0; TUBE_WEIGHT := 0; TUBE_DIAMETER:= 0; END; {WITH} REPOSITION(RECIPE,0); RECIPE^.HEADER1 := HEADER1_EDIT VALUE := readreal(VALUE); OK := VALUE <= SCALE; IF OK THEN EDIT_TABLE[I] := int_val(SCALE, VALUE) ELSE ERROR(3); UNTIL OK; END; {WITH} searchfullindex(RCD_TABLE,STEPNUMBER,AONR,EXIST); ; PUT(RECIPE); REPOSITION(RECIPE,1); RECIPE^.HEADER2 := HEADER2_EDIT; PUT(RECIPE); END; {create_header} PROCEDURE change_limit(NR:INTEGER; LIMITNR:INTEGER;VAR LIMVAL : INTEGER; VAR CONTR : DICONTROL); VAR NUMBER : INTEGER;       VALUE : REAL; BEGIN WRITE(SYSTEMENTRY^.AILIST[NR].NAME,' alarm limit',LIMITNR:2); VALUE := real_val (SYSTEMENTRY^.AILIST[NR].SCALE,LIMVAL); WRITE(VALUE:9:3,'new alarm limit: ':19); PROMPT(OUTPUT); VALUE := readreal(VALUE); LIMVAL := int_vaADER1 := HEADER1_EDIT; PUT(RECIPE); REPOSITION(RECIPE,1); RECIPE^.HEADER2 := HEADER2_EDIT; PUT(RECIPE); END {change_header}; $SUBTITLE STEP EDITOR PROCEDURE step_change (VAR STEP_EDIT : STEPDEF); VAR CHOICE : CHAR; INDEXTYPE : RCD_INDEX; l(SYSTEMENTRY^.AILIST[NR].SCALE, VALUE); WRITE('type of action: '); PROMPT(OUTPUT); NUMBER := readint(0); CASE NUMBER OF 1 : CONTR := IGNORE; 2 : CONTR := BUZZER; 3 : CONTR := HOLD; 4 : CONTR := ALARM; 5 : CONTR := ABORT; TOTSTEPNR, NEWTOTAL : INTEGER; FOUND,EXIST: BOOLEAN; BEGIN WRITELN; WRITE('(starting) '); STEPNUMBER := steprequest; searchstepindex(INDEXTYPE,STEPNUMBER,TOTSTEPNR,EXIST); IF EXIST THEN BEGIN GET(RECIPE); STEP_EDIT := RECIPE^.ST OTHERWISE : ; END {CASE}; END {change_limit}; PROCEDURE change_header; {records 0 and 1 in the recipe file are reserved for the header} VAR I, OFFSET, COUNT ,NUMBER : INTEGER; FOUND, ANY : BOOLEAN; VALUE : REAL; BEGIN clearscreen; REPEP END {IF} ELSE create_step (STEP_EDIT,INDEXTYPE,STEPNUMBER,TOTSTEPNR); REPEAT clearscreen; WRITELN; WRITELN('STEP CHANGE FUNCTIONS':35); WRITELN; steptitle; WRITELN; WRITELN('(0) exit'); WRITELN('(1) name'); WRITELN('(2) setpoiOSITION (RECIPE,0); GET(RECIPE); HEADER1_EDIT := RECIPE^.HEADER1; REPOSITION (RECIPE,1); GET(RECIPE); HEADER2_EDIT := RECIPE^.HEADER2; COUNT := 0; OFFSET:= 1; REPEAT clearscreen; I := OFFSET; display_header (OFFSET,4, ANY); nt change '); WRITELN('(3) on/off outputs'); WRITELN('(4) digital inputs'); WRITELN('(5) recipe terminator'); IF INDEXTYPE = TIMED_STEP THEN WRITELN('(6) time') ELSE BEGIN WRITELN('(6) speed control'); WRITELN('(7) fast for IF ANY THEN BEGIN WRITELN; WRITELN('TYPE OF ACTION: (1) ignore'); WRITELN('(2) buzzer':26); WRITELN('(3) hold':24); WRITELN('(4) alarm':25); WRITELN('(5) abort':25); REPEAT WRITE('eward parameters'); END; {ELSE} IF INDEXTYPE = BLOCK_STEP THEN BEGIN WRITELN('(8) total nr of steps in block_step'); WRITELN('(9) tables for changing setpoints per step'); END {IF}; CHOICE := getchoice; CASE CHOICE OF '0' : ; nter nr to change a limit or action, or to exit: '); PROMPT(OUTPUT); I := READINT(0); IF I IN [1..MAXAINR] THEN BEGIN WITH HEADER1_EDIT DO change_limit(I,1,ALARMVAL[I],ALARMCON '1' : stepname (STEP_EDIT.NAME); '2' : stepsetpoint (STEP_EDIT); '3' : stepoutputs (STEP_EDIT.IOSET,OFF2); '4' : stepinputs (STEP_EDIT.IOSET); '5' : stepterminator (STEP_EDIT.TERMINATOR); '6' : IF INDEXTYPETROL[I]); WITH HEADER2_EDIT DO change_limit(I,2,ABORTVAL[I],ABORTCONTROL[I]); END{IF} ELSE IF I <> 0 THEN ERROR(1); UNTIL I=0; END {IF}; UNTIL OFFSET > MAXAINR; WITH HEADER2_EDIT DO BE = TIMED_STEP THEN steptime(STEP_EDIT.TIME) ELSE stepspeed (STEP_EDIT.SPEEDCONT); '7' : IF INDEXTYPE <>TIMED_STEP THEN stepforward(STEP_EDIT); '8' : IF INDEXTYPE = BLOCK_STEP THEN BEGIN NEWTOTAL :GIN WRITE('approximate distance between end switches of lathe is: '); WRITELN(LATHE_LENGTH:3,' CM'); WRITE('new distance: '); PROMPT(OUTPUT); LATHE_LENGTH := READINT(LATHE_LENGTH); END; {WITH} REPOSITION(RECIPE,0); RECIPE^.HE=steptotal(TOTSTEPNR,STEPNUMBER); change_index(STEPNUMBER,NEWTOTAL); TOTSTEPNR := NEWTOTAL; END {IF}; '9' : IF INDEXTYPE = BLOCK_STEP THEN steptables(STEP_EDIT.IOSET, STEPNUMBER     ,TOTSTEPNR); OTHERWISE : ERROR(1) END {CASE}; UNTIL CHOICE = '0'; searchstepindex(INDEXTYPE,STEPNUMBER,TOTSTEPNR,EXIST); RECIPE^.STEP := STEP_EDIT; PUT (RECIPE); END {step_chng}; $SUBTITLE DELETE STEPS PROCEDURE step_delete(VAR STEP_EDIT :  3PCOD?\+P1c1RLP_ADDRESTEPDEF); VAR INDEXTYPE,INDEX1 : RCD_INDEX; STEPNUMBER,TOTSTEPNR,AONR : INTEGER; FOUND,EXIST: BOOLEAN; ANSWER : CHAR; BEGIN WRITELN; STEPNUMBER := steprequest; searchstepindex(INDEXTYPE,STEPNUMBER,TOTSTEPNR,EXIST); IF EXIST THEN BEG3, , , M̉},M},@11 y1 1,M춅,@1y1 1,,->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>IN WRITE('delete a '); CASE INDEXTYPE OF TIMED_STEP : WRITE('time'); EVENT_STEP : WRITE('lathe'); BLOCK_STEP : WRITE('block of lathe'); OTHERWISE : ; END; {CASE} WRITE(' controlled step(s)? (Y/N) '); OLD LP ADDRESS IS:NEW LP ADDRESS IS: PROMPT(OUTPUT); ANSWER := getchar; IF ANSWER = 'Y' THEN BEGIN STEP_EDIT := RECIPE^.STEP; del_from_index(INDEXTYPE,STEPNUMBER,TOTSTEPNR,FOUND); IF INDEXTYPE = BLOCK_STEP THEN BEGIN INDEX1 := RCD_T[&LP_ADDREABLE; FOR AONR := 1 TO MAXAONR DO IF AONR+OFF4 IN STEP_EDIT.IOSET THEN BEGIN del_from_index(INDEX1,STEPNUMBER,AONR,FOUND); IF FOUND THEN WRITELN ('associated setpoint ta Rm5600 END; 5605 5610 PROCEDURE start_proc; 5615 VAR NR,VALUE,X,COUNT, COUNT1 : INTEGER; 5620 CH : CHAR; 5625 BEGIN 5630 WITH STATUS DO 5635 IF (PROCSTATUS = RSET) AND (RECP_END <> 0) THEN 5640 BEGIN 5645 move_halfspeed; 5650  3PCOD?\+P1c1RRECEIVE_ disp_status(FALSE); 5655 WRITELN('wait until exhaustswitch is high (inp 10)'); 5660 REPEAT 5665 getDIstat; 5670 getAIstat; 5675 UNTIL (EXHAUSTDI +OFF1) IN IOSET; 5680 {at exhaust switch} 5685 PROCSTAT3(y11}đQFOݜB(y11‘}MQOݜ‘ByQF6U6d}(y11}}đQQFđQF(y11}D}$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Rh3Mq=p6 qq=p6 qM}6UM}O@@1@11O1OO7OO@1O@&1#@0@71#}}}򲥅0Oݜ‘ByQ|ˑ}@A1˓1 @G1}OݜByFONOݜBy+}MQOݜByQF}O1-)>>     O1~O=1%OOGO1(O1"}O1UF}@H11 @L1D/O1(O1"}UF}@M11 @Q1QQFO=1%}QF@R11=|‘}}QF1}OݜBF11->>>>>>>>>>>>>>>>>>>>>>>>>>>>> PUT(RECIPE); END {IF}; END {IF}; END; {ELSE} END {IF} ELSE WRITELN('source step does not exist'); END {stepcopy}; $SUBTITLE PRINT RECIPE OR STEPS PROCEDURE step_display; VAR INDEXTYPE : RCD_INDEX; TOTSTEPNR, OF/TERM FN FILENAME: G G /TERM OUTPUT BLOCKPUTGETUNRECOVERABLE ERRORFSET, STEP_OFFSET, NR : INTEGER; ANY,FOUND : BOOLEAN; BEGIN searchstepindex(INDEXTYPE,STEPNUMBER,TOTSTEPNR,FOUND); IF FOUND THEN BEGIN GET(RECIPE); STEP_EDIT := RECIPE^.STEP; STARS; WRITE('':20); STEPTITLE; IF STEP_"d)fRECEIVE_READBYTEEDIT.TERMINATOR THEN WRITELN('':20,'end step'); IF INDEXTYPE = BLOCK_STEP THEN WRITELN('':20,'total nr of steps in this block:',TOTSTEPNR:3); IF INDEXTYPE = TIMED_STEP THEN BEGIN WRITE('':20,'steptime (h.mm.ss) is: '); ble also deleted'); END {IF} END {IF} END{IF} END {IF} ELSE WRITELN ('step does not exist'); END {step_delete}; $SUBTITLE COPY STEPS PROCEDURE step_copy(VAR STEP_EDIT: STEPDEF); VAR STEPNUMBER,TOTSTEPNR,DESTINNR,INDEXPS1,TOT disptime(STEP_EDIT.TIME); WRITELN; END {IF} ELSE BEGIN STARS; WRITE('PARAMETER SETTINGS WITH BURNER MOVING TOWARDS THE'); WRITELN(' EXHAUST SIDE'); END {ELSE}; STARS; WRITELN('':20,'analog outAL, N : INTEGER; ANSWER : CHAR; INDEXTYPE,INDEX1 : RCD_INDEX; FOUND,EXIST,OCCUPIED: BOOLEAN; TABLELIST : TABLEDEF; BEGIN WRITELN; WRITE('source '); STEPNUMBER := steprequest; searchstepindex(INDEXTYPE,STEPNUMBER,TOTSTEPNR,EXIST); IF EXIST puts'); WRITELN; OFFSET := 1; disp_MFC(STEP_EDIT.AOLIST,OFFSET,MAXAONR,ANY); WRITELN('':20,'unlinked analog inputs'); WRITELN; OFFSET := 1; STEP_OFFSET := 1; disp_AI (STEP_EDIT.AILIST,OFFSET,MAXAINR,ANY,STEP_OFFSET);THEN BEGIN GET(RECIPE); STEP_EDIT := RECIPE^.STEP; WRITE('destination '); DESTINNR := steprequest; check_index(OCCUPIED,DESTINNR,TOTSTEPNR); IF OCCUPIED THEN WRITELN('cannot copy the source step') ELSE BEGIN  WRITELN; WRITELN; WRITELN('':20,'digital outputs'); WRITELN; OFFSET := 1; disp_DO (STEP_EDIT.IOSET ,OFFSET,MAXDONR,ANY,OFF2,TRUE); WRITELN; WRITELN; WRITELN('':20,'digital inputs'); WRITELN; OFFSET := add_to_index (INDEXTYPE,DESTINNR,TOTSTEPNR); RECIPE^.STEP := STEP_EDIT; PUT(RECIPE); IF INDEXTYPE = BLOCK_STEP THEN {COPY AO-TABLES} FOR N := 1 TO MAXAONR DO IF N+OFF4 IN STEP_EDIT.IOSET THEN BEGIN  1; disp_DI (STEP_EDIT.IOSET ,OFFSET,MAXDINR,ANY); WRITELN; IF INDEXTYPE <> TIMED_STEP THEN BEGIN WRITELN; WRITELN('':20,'speed control'); WRITELN; dispramps(STEP_EDIT.SPEEDCONT); STARS; W searchfullindex(RCD_TABLE,STEPNUMBER,N,FOUND); IF FOUND THEN BEGIN GET(RECIPE); TABLELIST := RECIPE^.TABLE; add_to_index(RCD_TABLE,DESTINNR,N); RECIPE^.TABLE := TABLELIST; RITE('PARAMETER SETTINGS WITH BURNER MOVING TOWARDS THE'); WRITELN(' GAS INLET SIDE'); STARS; WRITELN('':20,'digital outputs'); WRITELN; OFFSET := 1; disp_DO (STEP_EDIT.IOSET ,OFFSET,MAXDONR,ANY,OFF3,TRUE);       WRITELN; WITH SYSTEMENTRY^ DO BEGIN dispforward(TEMP[H2_AO],STEP_EDIT.H2_SETP); dispforward(TEMP[O2_AO],STEP_EDIT.O2_SETP); dispforward(LATHE[SPEED_AO],STEP_EDIT.FAST_SPEED); END; {WITH}  BEGIN WRITELN('enter to exit'); ANSWER := getchar; END; {ELSE} END {ELSE} END {print_recipe}; $SUBTITLE MAIN PROGRAM BEGIN clearscreen; STARS; WRITELN('':20,' RECIPE EDITOR'); STARS; IOABORT (SYSTEMENTRY,FALSE) WRITELN; END {IF}; IF INDEXTYPE = BLOCK_STEP THEN BEGIN STARS; WRITELN('':20,'changing setpoints in this block'); STARS; dispTABLES(STEP_EDIT.IOSET,STEPNUMBER,TOTSTEPNR); END; {IF} END {IF} ELSE ; RESET (SYSTEMENTRY,'/D1/SYSTEM'); SYSERROR := IORESULT(SYSTEMENTRY); IOABORT (SYSTEMENTRY,TRUE); IF SYSERROR = 216 THEN WRITELN ('no configuration file') ELSE BEGIN GET (SYSTEMENTRY); REPEAT WRITE('enter name of recip BEGIN WRITELN; WRITELN('':20,'step',STEPNUMBER:3,' does not exist'); WRITELN; END; WRITELN; END; {stepdisplay} PROCEDURE print_recipe(VAR STEP_EDIT : STEPDEF); VAR I, OFFSET,NR, RECIPE_END: INTEGER; YR,MON,DAY,HR,MIN,SEC : INTEGER; LP,e: '); PROMPT(OUTPUT); readstring(INPUTSTRING,CHANGE); IF CHANGE THEN BEGIN OK := NOT (INPUTSTRING[1] IN ['0'..'9',' ']); END {IF} ELSE OK := FALSE; IF NOT OK THEN ERROR(7); UNTIL OK; FOUND: BOOLEAN; RECIPNAME : ARRAY[1..12] OF CHAR; ANSWER : CHAR; BEGIN WRITE('output on printer (Y/N)? '); PROMPT(OUTPUT); ANSWER := getchar; LP := ANSWER = 'Y'; WRITE('display all steps (Y/N)? '); PROMPT(OUTPUT); ANSWER := getchar; IF  RCNAME [1 FOR 11] := '/D1/RECIPE/'; INDEXNAME [1 FOR 17] := '/D1/RECIPE/index.'; FOR I := 1 TO 12 DO BEGIN RCNAME [I+11]:= INPUTSTRING [I]; INDEXNAME [I+17]:= INPUTSTRING [I]; END; {FOR} UPDATE (RECIPE,RCNAME); ANSWER = 'N' THEN STEPNUMBER := steprequest; IF LP THEN BEGIN REWRITE(OUTPUT,'/P1'); STARS; SYSTIME(YR,MON,DAY,HR,MIN,SEC); WRITELN('':20,YR:1,'/',MON:1,'/',DAY:1,'OPTICAL FIBERS':25); WRITELN; FOR I := 1 TO 12 DO  UPDATE (INDEX,INDEXNAME); REPOSITION (INDEX,0); GET (INDEX); IF EOF(INDEX) THEN BEGIN FOR I := 0 TO 1 DO WITH INDEX^[I] DO BEGIN STARTSTEPNR := 0; END_OR_AONR := 0;  RECIPNAME[I] := RCNAME [I + 11]; WRITELN('':20,'RECIPE ',RECIPNAME); STARS; WRITELN; END {IF} ELSE clearscreen; IF ANSWER = 'N' THEN step_display ELSE BEGIN WRITELN('':20,'RECIPE HEADER'); STARS; REPOSIT IF I = 0 THEN DESCRIPTOR := RCD_1HEADER ELSE DESCRIPTOR := RCD_2HEADER; END; {WITH} FOR I := 2 TO MAXRECORD DO WITH INDEX^[I] DO BEGIN DESCRIPTOR := NOT_ALLOCATED; STION(RECIPE,0); GET(RECIPE); RECIPE^.HEADER1:= HEADER1_EDIT; REPOSITION(RECIPE,1); GET(RECIPE); RECIPE^.HEADER2:= HEADER2_EDIT; OFFSET := 1; display_header(OFFSET,16,FOUND); STEPNUMBER := 0; RECIPE_END := findendARTSTEPNR := -1; END_OR_AONR := 1; END; {WITH} create_header; END; {IF} clearscreen; REPEAT REPOSITION (INDEX,0); GET (INDEX); WRITELN('':20,'RECIPE EDITOR'); WRITELN; step; REPEAT {UNTIL RECIPE_END} step_display; STEPNUMBER := STEPNUMBER + 1; UNTIL STEPNUMBER > RECIPE_END; IF LP THEN BEGIN PAGE(OUTPUT); WRITELN; REWRITE(OUTPUT,'/TERM'); END {IF} ELSEWRITELN('(0) EXIT'); WRITELN('(1) CHANGE HEADER'); WRITELN('(2) CHANGE A STEP'); WRITELN('(3) COPY A STEP'); WRITELN('(4) DELETE STEP'); WRITELN('(5) PRINT RECIPE'); CHOICE:= getchoice; clearscr     een; CASE CHOICE OF '0' : ; '1' : change_header; '2' : step_change(STEP_EDIT); '3' : step_copy (STEP_EDIT); '4' : step_delete(STEP_EDIT); '5' : print_recipe(STEP_EDIT); OOP = (AIONLY,AIDOBELOW,AIDOABOVE,AISETSAO,SETPOINT); DICONTROL = (IGNORE,ABORT,ALARM,HOLD,TIMERESET,BUZZER); SAFESTATE = (LOW,HIGH); DOCONTROL = (NORMAL,INVERTED); TEMP_TYPE = (T_AUTO_MAN,TEMP_AI,PREF_AO,H2_AO,O2_AO OTHERWISE : ERROR(1) END {CASE}; REPOSITION (INDEX,0); PUT (INDEX); UNTIL CHOICE = '0'; END {ELSE} END. {recipe editor} TEP_EDIT); '4' : step_delete(STEP_EDIT); '5' : print_recipe(STEP_EDIT); ); LATHE_TYPE = (L_AUTO_MAN,SPEED_AO,INLETSWITCH,EXHAUSTSWITCH); NAMETYPE= ARRAY[1..NAMELENGTH] OF CHAR; AI = RECORD NAME : NAMETYPE; UNIT : ARRAY[1..UNITLENGTH] OF CHAR;  processaction(ALCONTR); END {IF} ELSE AIPREALARM := AIPREALARM + [AINR]; END {ELSE} END {ELSE} END; {ELSE} IF NOT (ALARMSTATUS OR ABORTSTATUS) TH SCALE : REAL; LOOP : AI_LOOP; CONTROL : AICONTROL; DOLINK : 0..MAXDONR; AOLINK : 0..MAXAONR END; AO = RECORD NAME : NRH0. AMETYPE; UNIT : ARRAY[1..UNITLENGTH] OF CHAR; SCALE : REAL; AILINK : 0..MAXAINR; DOLINK : 0..MAXDONR; SOFTST : 0..MAXDONR;   RS L:3, UNIT:10); WRITELN(AILINK:4, DOLINK:8, SOFTST:10, RATIOLINK:8, RATIOVALUE:15:1) END {WITH} END {AO_display}; PROCEDURE DI_display(VAR PORTNR :INTEGER); BEGIN WITH SYSTEMENTRY^.DILIST[PORTNR] DO BEGIN WRITE(PORTNR:2, NAME:12$TITLE RUNTIME FOR FIBER OPTICS CONTROL PROGRAM RUNTIME(INPUT,OUTPUT); CONST NONAME = 'XXXXXXXXXX'; NOUNIT = 'XXXXX'; NAMELENGTH = 10; UNITLENGTH = 5; MAXAINR = 32; MAXAONR = 16; MAXDINR = 24; ); CASE SAFE OF LOW : WRITE('low ':6); HIGH : WRITE('high':6) END {DISAFE}; CASE CONTROL OF IGNORE : WRITE('ignore ':18); ABORT : WRITE('abort ':18 MAXDONR = 32; OFF1 = -1; OFF2 = 47; OFF3 = 95; OFF4 = 143; MAXLENGTH = 70; STEPSINBLOCK = 70; MAXTAB = 70; MAXFUNC = 50; MAXRECORD = 49; JOBLEN); ALARM : WRITE('alarm ':18); HOLD : WRITE('hold ':18); TIMERESET : WRITE('time reset':18); BUZZER : WRITE('buzzer ':18); END {DICONTROL}; WRITELN(DOLINK:9GTH = 10; PAGELENGTH =59; DA_BOARD = $ED08; {TO BE CHANGED TO ED20 WITH NEW BOARDS} AD_BOARD = $ED00; DI_BOARD = $EE08; DO_BOARD = $EE00; TYPE AICONTROL = (DONTCARE,BANDLIMIT,UPPERLIMIT,LOWERLIMIT); AI_L); END {WITH} END {DI_display}; $SUBTITLE DISPLAY THE DIGITAL OUTPUTS, TEMP. AND LATHE CONTROL PROCEDURE DO_display(VAR PORTNR :INTEGER); BEGIN WITH SYSTEMENTRY^.DOLIST[PORTNR] DO BEGIN WRITE(PORTNR:2, NAME:12); CASE CONTRO     L OF NORMAL : WRITE('normally closed':17); INVERTED : WRITE('normally open ':17) END {DOCONTROL}; WRITELN(INTERLOCK:4,CONDLOCK:11) END {WITH} END {DO_display}; PROCEDURE TEMP_display; BEGIN 311F=N5D21 1 45$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> WITH SYSTEMENTRY^ DO BEGIN WRITELN('auto/manual switch is DI:',TEMP [T_AUTO_MAN]:2); WRITELN('flame sensor is DI:','':7, TEMP[FLAME_DI]:2); WRITELN('flame ignition is DO:','':5,TEMP[LITFLAME]:2); WRITELN('temperature contro31@6#6#11'05$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>l is AI:',TEMP [TEMP_AI]:2); WRITELN('preform temperature is AO:',TEMP [PREF_AO]:2); WRITELN('Hydrogen burner is AO:','':4,TEMP [H2_AO]:2); WRITELN('Oxigen burner is AO:','':6, TEMP [O2_AO]:2); END {WITH} END {TEMP_display}; PROCC = change, D = delete, = exit 3PCOD?\+P1c1{;RRECIPE_E311F'=1%21 1 (1"ҐUF1 =1%D&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3v M rv bF Crvr9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3vr11F+=1%21 1 (1"ҐUF 1 vr=1%Dvrvr 9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3vM v rvM ZFMDvq9 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>36Fq=56 q2@@1212"Nx= T*xFBq6FquueF/uF"N2uF"NxuuaF u#qD219>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3@1@1111F=05D21 1 45$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>/TERM F your choice: 3 D~@11D@ 11D@6#6#11Dp@@11Db@V6*6*11DR@6&6&16F1 1D<@636311D,@ܕ11DAFE>r&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>     INPUT ERRORENTRY TOO LARGEnew value exceeds the maximum valueINPUT IS NOT A NUMBERmax. time is 8 hrs, 59 minutes, 59 secondsmax. number of steps in a blockstep isno spaces in name allowed; first char. not a numberERROR3u =61eFOFԋ1BypFw=5yeFdy]ya*544F/@1y1 @1y1 @"11=54Fu =aF#DaF#De9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3 16KeF=*1aF#D11$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>a step with stepnumberand length still exists3 +541=X11$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>36ґOFҋ1ByQ*54Fu JЅJхO 1461QF61QF @119>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3 @11(0$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>too many steps in recipestep number: 36ґOFҋ1ByQyQ*54FJх461QF9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3 61eF'OFԋ1ByYFyaF#D$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>36ґOFҋ1Byu QyQyu Q*xFԐJ6Jx61QF9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>36ґOFҋ1Byu Qyp*u yyx61QFxFO 19>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3@6&6&1Г1 1=5@'11(06FeҐY*54F0 4YF 2044Fq 9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>36ґOFҋ1Byu QyQyu Q*x61QFxFO 19>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>total number of steps in this block isnew total:      3=51@11@11@)6#6#11'0|.D'u D6u D.u (0D=5DA13F61E>4Fu yy0u @M7 eFJ ҋ"BaF#DeFJ*ҋ"BaF#DJR eF5Jr>new name: "BBJrҋ"BBaF#DJ=JJJJ9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>32 @W *9 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>(1) TIMED STEP(2) LATHE CONTROLLED STEP(3) LATHE CONTROLLED BLOCK OF STEPSXXXXXXXXXXXXXXXXXXXX3DM@1D[@1DP@1DE@1D:@1D/@#1D$@.1DAFE&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3u y=5OPԋ"B!8 204FK)z2 ԋ"By0rݜ1v1J 1@1ґ4F14*5ԑQԠYFҐU*u ԅ19&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>IGNOREBUZZERHOLD ALARM ABORT TIME RESET3@11 @1O11$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3u yy=5O֋ "B8 204FXyQFO)z2ԋ"By0rߜ1v󙓰1J 1@1ґԑ4F14*5֑u Q6 YF|ҐU*u օԅ190>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>STEP: 3@112204F ё"N2"N7 &>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3Oы "B8 204FOы "B1D=eF3OPӋ"B!yQFOPӋ"B!1aF#D&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>     3=6 eF~Oҋ "By UF[6/w y 6/w 6_w y 6_w *54F"@10@1y 01=aF#D9">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>1@d1z1@p11)zJ*؋"By0r)v0rvzf*54F%J*؋"B(zv0ԑؑD0 4Fy֑ԘQ6 YFF6 YF&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>INTERLOCK ERROR BETWEENANDchange any of these setpoints (Y/N)? max. value:new value: change any of these setpoints (Y/N)? max. value:new value: 3=6 eFOҋ "ByUF_6/w y6/w 6_w y6_w *54F$@6#6#10@$1y01=aF#D~9">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3!uyO؋ "B8 204F ޚ1DH4FCqeF7OPԋ"B!yQFOPԋ"B!1=5aF#D4Fbuu{ y Quu{ y QF 2@7D2@721@1֑ґҔQF1ؑu Q6 YFu ֐U*u؅>CONDITIONAL INTERLOCK ERROR BETWEENAND19 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3=qeFOPދ"B!yܐUF)OPދ"B!z2ދ"By0r)OP܋"B!z2܋"By0rv VFvv OPދ"B!zZ*5D v V*54F3@1OPދ"B!1OP܋"B!11=aF#D)9>>>>>>>>>>>>>>>>>>>>> ONOFFRATIO ERROR BETWEEN3"0 022=0!4F@6#6#11'054=YPF@$6$6$111OՋ "B8 204Feޚ1@I11ӑ'054=NTFB4=1Py Q4=0Py Q*54F{  D{  ՑӘQ6 YFq0 6 YF${ 20{ 2044>3 0 0J 8 2204FE@6%6%111'054=YPF%OP֋"B!q8 204FꚚ1@&1z1@211)zJ ֋"By0r)v0rvzf*54FJ ֋"B(zv0D0 y4F}ҐUFmOҋ "Bqv Zy >F9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Qv Ry Q*5q4FJR{ R6/6_ DJR{ R6/6_ ԑ֑ԘQ֠YF0 ܠYF{ R20{ R20820444Fn0 0J*8(22204Fڐ@>6%6%111'054=YPFO֋ "Bq8 204yQF>change any of these outputs (Y/N)? 0 = OFF, 1 = ON, = don't change :      3#u y=5O`ԋ"Bq8 204FW6u { F 2@7 D2@ 7 㚚121y 0ґ4F1D@14*5ԑQԨYF~ҐU*u ԅ19>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>steptime is (h.mm.ss.):new time is (h.mm.ss.):check don't check3(OBy@6&6&1@'1@(11CrqeF)OPԋ"B!zҋ"BBy0rҒ1 @21ҋ"BBy0&v򝓰1OPԋ"B!J 1v1OPԋ"B!J 11vraF#Df&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3$0 0220#4F@6"6"11'054=YPF@#6'6'11@K6)6)11O`Ջ"B8 204FSܚ1@u11ӑ'054=NTF04=1P*54F{ 6 D{ 6 ՑӘQըYFרYF1&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>interval time(h.mm.ss) start speedend speedchange any of these inputs (Y/N)? 0 = don't check this input in this step1 = check this input, = don't change :  R3%2 "Nx.2 "Nx=.P2 "Nx.?2 "Nx.2 "Nx=.P2 "Nx.?2 "Nx.*xFt2 "Nx54.=0.2 "Nx52 "Nx56>$TITLE RUNTIME FOR FIBER OPTICS CONTROL PROGRAM RUNTIME(INPUT,OUTPUT); CONST NONAME = 'XXXXXXXXXX'; NOUNIT = 'XXXXX'; NAMELENGTH = 10; UNITLENGTH = 5; MAXAINR = 32; MAXAONR = 16; MAXDINR = 24; 2 "Nx=8XF0 D0 9J>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> MAXDONR = 32; OFF1 = -1; OFF2 = 47; OFF3 = 95; OFF4 = 143; INTOFF1 = 9; INTOFF2 = 12; MAXLENGTH = 70; STEPSINBLOCK = 70; MAXTAB = 70; MAXFUNC3&M2"N=0.+6<ۚۚ q2"N=.2"N=0.+2"N=0.+ݚݚ q2"N=.2"N=0.+2"N=0.+21&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> = 50; MAXRECORD = 49; JOBLENGTH = 10; PAGELENGTH =59; SOFTCOUNT = 6; DELAYCOUNT = 20; FLAMECOUNT = 9; DA_BOARD = $ED20; AD_BOARD = $ED00; DI_BOARD = $EE08; DO_BOARD = $EE00;3'0 0=5@1@1y0&1@1@1@2112204F 28F20%4F&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> TYPE AICONTROL = (DONTCARE,BANDLIMIT,UPPERLIMIT,LOWERLIMIT); AI_LOOP = (AIONLY,AIDOBELOW,AIDOABOVE,AISETSAO,SETPOINT); DICONTROL = (IGNORE,ABORT,ALARM,HOLD,TIMERESET,BUZZER); SAFESTATE = (LOW,HIGH); DOCONTROL = (     NORMAL,INVERTED); TEMP_TYPE = (T_AUTO_MAN,TEMP_AI,PREF_AO,H2_AO,O2_AO); LATHE_TYPE = (L_AUTO_MAN,SPEED_AO,INLETSWITCH,EXHAUSTSWITCH); NAMETYPE= ARRAY[1..NAMELENGTH] OF CHAR; AI = RECORD NAME : NAMETYPE; 3+0 0@1xF@ 1@11@'6"6"11'054=0TF4=YP*&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> UNIT : ARRAY[1..UNITLENGTH] OF CHAR; SCALE : REAL; LOOP : AI_LOOP; CONTROL : AICONTROL; DOLINK : 0..MAXDONR; this step is not defined as end stepmark this step as end step (Y/N) ? AOLINK : 0..MAXAONR END; AO = RECORD NAME : NAMETYPE; UNIT : ARRAY[1..UNITLENGTH] OF CHAR; SCALE : REAL; AILINK : 0..MAXAINR; 3,OPЋ"B!)z0rך1v1J 1@19>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> DOLINK : 0..MAXDONR; SOFTST : 0..MAXDONR; RATIOLINK : 0..MAXAONR; RATIOVALUE : REAL END; DI = RECORD NAME : NAMETYPE; 3)OPЋ"B!)zy0rؚ1@1z1J 1@ 11)v0rvzf*54F(zv0D0 4F9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3-0 0@11JR6_0"OByy0,1J0)OByy0,1J0)OByy0,1J0)&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>max. value:new value: FAST FORWARD PARAMETERS3*0 0@646411@56565110(1@k646411(0ԖaԐYFa@11220=54F28Fԋ"BB20%4F@11OByԋ"BB0)ԐQFU&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3.ѐeFOPԋ"B!8 204FCyUF.Oy "By QOy "ByQ*54yQ*5Mw 4F*Ԓ1 ٜ1@1yґҔQF1aF#D[19">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>five time intervals can be given, in which the lathe speed is ramped lineair between start and end value.enter nr of interval to be changed or to exit: new time: new end speed      3/0 @6>6>11s ّqueFw Ms uaF#Dw 20.@?686811{ 20.ҐQF @x11ҕaFF@606011(0ԐYԠa{ F{ M ґԐQҕQFҐYFK@636311(0ԐYԠaM{ F{ >>enter number to change a function table or to exitmax. value:value:new value: this output is not defined as a changing oneM ґԐQҐQF&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>32u y@1@1@1@1@1@)1@011Oԋ "B8 204F)zO'ԋ "By0rԒ1 ޜ1v1Ogԋ "Byۋ0)zOԋ "By0rOԋ "Byv1ۋ0z1J >all outputs that can be defined as changing during a blockstepoutputs currently defined as changing in this block stepNONE DEFINEDenter a number to add an entry or to exit: enter a number to delete an entry or to exit: 11ґԑQ6 YF-ҐU*u ԅ9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>30q6u6eFMu { Fa204FO18ҋ"BO7D66Fq4u4eF'8ҋ"BԋF"Bu4aF#Dґu6aF#D@1q6u6eF1Mu { FOP֋"B!1u6aF#Dϰ1q6u6eF1 @1>nrnamealarm limit1actionalarm limit2actionmax. valueq4u4eFqMu { FR)OP֋"B!z8ҋ"BԋF"By0rv1OP֋"B!J 1ґu4aF#D1u6aF#D\9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>33O@7 6 eF*O'ҋ "BOgҋ "BaF#D֑6 eF*Oҋ "BOҋ "BaF#D֐} ~ ~O 1OO7O1O 1OO7O1$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>step000000000031u 0/0 u { 20.@686811(0ԐYMu { FS204FO1eO7D206FqcuceFe؋F"BucaF#D0 OPԋ"B!qcuc1@91ucz1ucJ 11qauaeF)ucze؋F"By0rؒ1 uc>34Ou  "B1@1u 1 )Ou  "Bzy0rv1@11)v0r(Ou  "Bzv0@ 11(0D!ѐD5ѕD/ѓD)ђD#ёDDAFE>9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>1@E1v󙓰1ucJ 1@L11)v0rvuczf*54Fe؋F"B(uczv0D0 4FluaaF#D^20Oe7O1DԐUF @X6,6,11ԐQF\9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> alarm limitnew alarm limit: type of action: !     350 O 1O1OO7O 1O1OO70 22024F1@11@11@&11@/11@911@C676711(0؈FAؑO'؋ "BOg؋ "B04ؒO؋ "BO؋ "B04D ؐUF0 ؐQF6 YF=@{67671>>delete a timelatheblock of lathe controlled step(s)? (Y/N) associated setpoint table also deletedstep does not exist1 @11@11(0}O 1OO7O1O 1OO7O1$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>381@1(0 22204FO1O7@1(0 204F@11Dt0O7O1QFXq^u^eFJM{ RF-204F O1`O70O`7O1u^aF#DD @111&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>TYPE OF ACTION: (1) ignore(2) buzzer(3) hold(4) alarm(5) abortenter nr to change a limit or action, or to exit: approximate distance between end switches of lathe is: CMnew distance: source destination cannot copy the source stepsource step does not exist361@1(0 }22204FO1O7D 2200 1@ 6#11101@"11@,11@611@L11@`11@t11ӔQF@11D@11@11ӖQF@6$6$11@6+6+11'054.DD0D0 D>3922204FO1OO70 @10-F@1@11ҖQF@ 1@ 6 6 1ړ1 1ҔQF@-1@.1.0&1D0 @F61611@x110 @1@111O8 220@1@111O8(26 22011@1>JR6/0"DJR0$DJ0+D{ӔQF J0'DJr0*DaӔUF0-DTӖQF(׽00D=ӖQF JR01D+0 D$A09F60E gjqx4=0PF2220O7O1&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>@111O26 26/=0!11@1@111O220#1ҔUF1@Ϥ1@Н111O0(0 @61611@2110 @B1@C111O26 26_=0!1OBy00,OBy20,OBy40,1ҖQF%0 @S1@T>>(starting) STEP CHANGE FUNCTIONS(0) exit(1) name(2) setpoint change (3) on/off outputs(4) digital inputs(5) recipe terminator(6) time(6) speed control(7) fast forward parameters(8) total nr of steps in block_step6 6 110 O00D&1@u1@v11 @{1111$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>(9) tables for changing setpoints per stepend steptotal nr of steps in this block:steptime (h.mm.ss) is: PARAMETER SETTINGS WITH BURNER MOVING TOWARDS THE EXHAUST SIDEanalog outputsunlinked analog inputsdigital outputsdigital inputsspeed control371(0 22204F@1D$@ 1D.@1D#@1DDAFE@$11'054=YPF_O7ԋ20ԖQFFeF:M{ RFҋ204F @@6&6&11aF#DD @g11&>>>>>>>>>>>>>>>>>>>>>>>>>>>PARAMETER SETTINGS WITH BURNER MOVING TOWARDS THE GAS INLET SIDEdigital outputschanging setpoints in this blockstep does not exist"     3:@11'054=YP*5@11'054=NPF(0 }4F@4@910 2222221)@C1䑰1 =/1⑰1 =/11 @D111queF(2؋ "N?؛"NxuaF#D@S1@T12ޜ110 1D0 4=NPF09D@]1>>>TEMENTRY^.AILIST [AILINK].UNIT := UNIT; SYSTEMENTRY^.AILIST [AILINK].SCALE := SCALE; SYSTEMENTRY^.AILIST [AILINK].CONTROL:= BANDLIMIT; SYSTEMENTRY^.AILIST [AILINK].LOOP := SETPOINT; SYSTEMENTRY^.AILIST [AILINK].AOLI@^110 O 1O1OO7O 1O1OO72202}(0 09}YF4F11@l@s1D@}11'05&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>TIME0 U[ output on printer (Y/N)? display all steps (Y/N)? /P1 OUTPUT OPTICAL FIBERSRECIPE RECIPE HEADER/TERM OUTPUT enter to exitTIME0 U[ TIME0 U[ 3M "q=pϐqMq=pqM,q:=pEq@0 0 @1@110 O=1%O@@1(O1"}O=1%MQF@'11D`O1@=11??0F?"Nx.*|D=|F0 F?"N@T7 Or"N@`7}queFI?>>>>TIME0 U[ XXXXXXXXXX:= READINT(DOLINK); IF NUMBER IN [0..MAXDONR] THEN DOLINK := NUMBER ELSE ERROR(5); {NR TOO LARGE} WRITE('SOFTSTART NUMBER: '); PROMPT(OUTPUT); NUMBER := READINT(SOFTST); IF NUMBER IN [0..MAXDONR] THEN SXXXXXXXXXXTIME0 U[OFTST := NUMBER ELSE ERROR(5); {NR TOO LARGE} WRITE('RATIOLINK WITH AO NUMBER: '); PROMPT(OUTPUT); NUMBER := READINT(RATIOLINK); CASE NUMBER OF 0: BEGIN RATIOLINK := 0; RATIOVALUE:= 0;  `a CREATE_Hbc1CHANGE_Ld'PfCHANGE_Hg i,STEP_CHAkmSTEP_DEL END;{0} 1..MAXAONR : BEGIN IF NUMBER <> PORTNR THEN BEGIN RATIOLINK := NUMBER; WRITE('RATIOVALUE: '); PROMPT(OUTPUT); RATIO"N?F"NxOr "N?F"NxuaF#}DO?@r1#O6Or@|1#O6 1O61O61F}queFBOF1BqJJQF򼒅D򼓅uaF#}D}61queF7OF1Bq򼐅J6JuaF #}>>VALUE := READREAL(RATIOVALUE); END {IF} ELSE ERROR(1) END{1}; OTHERWISE : ERROR(5) END; {CASE} IF AILINK <> 0 THEN BEGIN SYSTEMENTRY^.AILIST [AILINK].NAME := NAME; SYSD030 O6 1O61@1@111@11@11@11@Š11@֠11@硡11'0|0 .D4DM05DGO06D>O08D5O07D,O0:D#0 DA05F60EO6 1O61=0PF&1161->>>>>>>>>>>>#      RECIPE EDITOR/D1/SYSTEM SYSTEMEN no configuration fileenter name of recipe: /D1/RECIPE//D1/RECIPE/index.RECIPE INDEX RECIPE EDITOR(0) EXIT(1) CHANGE HEADER(2) CHANGE A STEP(3) COPY A STEP(4) DELETE STEP(5) PRINT RECIPEmnLSTEP_COPo %BrSTEP_DISt%vPRINT_REw D%zRECIPE_E*REAL_VAL.INT_VAL 2GETCHOIC GETCHAR $GETANSWE : READINT K READREALRx: Z { READSTRI  ERROR  )STARS  CLEARSCRSTEPREQU 9FINDENDS,YSEARCHSTMSEARCHFU0000000000  A )0CHECK_IN_ADD_TO_I =CHANGE_IVDEL_FROMa3STEPTOTAPXCREATE_S m!/DISP_CON"##STEPTITL  INTRO fSTEP1 $G%% STEPNAME& ' NAMECHEC( )DISP_MFC*+DISP_AI ,n-DO_NAME -+.CHECKINT/+0(CHECK_CO12CHECK_RAf3BLOCK G 333/6|STEPSETP79 DISP_DO :4<MSTEPOUTP=>DISP_DI ? 7@ySTEPINPUA,CCONVERTTCDDISPTIMEDHM]E3STEPTIME3INTRO fINTRO fFG3DISPRAMPHICHNGSETPJRKKSTEPSPEELOMJSTEPTERMN=ODISPFORWPwQSTEPFORWR SDISPAOSET)GVCHNGAOSERAY[1..MAXAONR] OF AO; DILIST : ARRAY[1..MAXDINR] OF DI; DOLIST : ARRAY[1..MAXDONRW)YDISPTABLZ'\STEPTABL]&_;DISPLAY_`a CREATE_Hbc1CHANGE_Ld'PfCHANGE_Hg i,STEP_CHAkl{STEP_DELUS := RUN; 5690 DEPOSITION := FALSE; 5695 REPEAT {until end of recipe or terminator} 5700 newstep; 5705 disp_status(FALSE); 5710 WRITELN('simulate 6 seconds softstart'); haust switch} 5685 PROCSTAT$     US := RUN; 569.DILIST[NR] DO 2110 BEGIN 2112 IF (NR + OFF1) IN RECIPE[INDEXNUMBER].STEP.IOSET THEN 2114 {check this input} 2116 BEGIN 2118 IF SAFE = LOW THEN 2120 ALARMSTATUS := (NR +OFF1) IN STATUS.IOSET 212/TERM F R,B3@1@1111F=05D21 1 45$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>   your choice: {KG} TUBE_DIAMETER: REAL; {MM} END; AOLISTTYPE= ARRAY[1..MAXAONR] OF INTEGER; AILISTTYPE= ARRAY[1..20] OF INTEGER; SETTYPE = SET OF 0..255; 3+541=X11$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>EN BEGIN AIPREALARM := AIPREALARM - [AINR]; AIALARM1 := AIALARM1 - [AINR]; AIALARM2 := AIALARM2 - [AINR]; END; {IF} END; {WITH} END; {alabtest} PROCEDURE inputtest; VAR OLDIOSET : SETTYPE; 3+541=@11$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> R&FV3@72 uQyF"Nx= T*xFfeF"ґNҋNxaF#DГN2 uQyF"NxuQuQy2 uQyF"Nx= PF9L>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 3PCOD?\+P1c1"& RRUNTIME  R,36Fq=56 q2@@1212"Nx= T*xFBq6FquueF/uF"N2uF"NxuuaF u#qD219>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>EDURE LATHE_display; BEGIN WITH SYSTEMENTRY^ DO BEGIN WRITELN('auto/manual switch is DI:','':6, LATHE [L_AUTO_MAN]:2); WRITELN('End switch gasinlet side is DI:',LATHE[INLETSWITCH]:2); WRITELN('End switch exhaust side is DI: ',LA%     THE[EXHAUSTSWITCH]:2); WRITELN('Lathe translation is AO:','':7, LATHE [SPEED_AO]:2); WRITELN('Lathe rotation is AO:','':10, LATHE [ROTAT_AO]:2); END {WITH} END {LATHE_display}; $SUBTITLE PRINT SYSTEM ENTRIES PROCEDURE print_AI(VAR3ѐeFB2 ԋNx54.F 4.=0.DњyaF#D9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> LINECOUNT:INTEGER;START,ENDNUM:INTEGER;LP:BOOLEAN); VAR I : INTEGER; BEGIN stars; WRITELN('':20,'ANALOG INPUTS'); stars; WRITELN(CAA,CAI); I := START; LINECOUNT := LINECOUNT +10; REPEAT AI_display(I); I := I + 1; LINECOUNT := 3Аa*54FM֑eFS4ҐQFؘ؈FҋN=0.+DؚҋN=A.+ԠaF#D9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>LINECOUNT + 1; IF LP AND (LINECOUNT = PAGELENGTH-1) THEN BEGIN PAGE(OUTPUT); LINECOUNT := 0; END {IF} UNTIL I > ENDNUM; WRITELN; WRITELN; WRITELN; LINECOUNT := LINECOUNT+3; END; {print_AI} PROCEDURE print_AO(VAR LI3 M2"N=0.+6<ۚۚ q2"N=.2"N=0.+2"N=0.+ݚݚ q2"N=.2"N=0.+2"N=0.+21&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>NECOUNT:INTEGER;START,ENDNUM:INTEGER;LP:BOOLEAN); VAR I : INTEGER; BEGIN stars; WRITELN('':20,'ANALOG OUTPUTS'); stars; WRITELN(CAA,CAO); I := START; LINECOUNT := LINECOUNT +10; REPEAT AO_display(I); I := I + 1; LINECOUNT := LI3 2 12 14FDuyy202Nx12Nx1ԑYF9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>NECOUNT + 1; IF LP AND (LINECOUNT = PAGELENGTH-1) THEN BEGIN PAGE(OUTPUT); LINECOUNT := 0; END {IF} UNTIL I > ENDNUM; WRITELN; WRITELN; WRITELN; LINECOUNT := LINECOUNT+3; END; {print_AO} $SUBTITLE PRINT SYSTEM ENT3 44 F2820 җu1/2820 19>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>RIES PROCEDURE print_DI(VAR LINECOUNT:INTEGER;START,ENDNUM:INTEGER;LP:BOOLEAN); VAR I : INTEGER; BEGIN stars; WRITELN('':20,'DIGITAL INPUTS'); stars; WRITELN(CDI); I := START; LINECOUNT := LINECOUNT +10; REPEAT DI_display(I); 3 4 uF uuD6 1211MqMMڑ҅(y11֑ؐQ֐QFؐQF(y1120ڔ1 2얔1D@1ړ1 @11ڑYF19>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>0000CHANNEL TIMED OUT3ѐ=5eFs2 ֋Nx54.F 4.=0.D!4. ~F 4.=A.D֐QҗYF=5ҘѠyaF#D4F My9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3 1214 uFu1 = 1uuDP1queF֒1 uaF#D1queF=-1uaF#D1s ПMq2B(y11Mq26B(y116w F =11D=01֑ԑԘQF1YF˰19>>>>>&     3ёQF j6/ jD j6/ j js МqueF,Mq(2By11҅uaF#D9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3}$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>31214 uFu1 = 1uuDI1qeFؒ1 aF#D1qeF=-1aF#D16 6/ jF =11D=01ؑԑԘQF1YF˰19>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3}$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>344 FuuF uu02809>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3@11?204F?"Nx=SPFD2N?ҋF"Nx2N?ґF"Nxғ2?8F220ґ2?8F2202@SFD2@SFD2@ SFD2@ SFDt2@SFDd2@SFDT2@SFDD2@SFD42@S>>3uF uuD1211OJҋ"By20Ҕ1 21ґYFհ19>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>FD"2@SFD2@!SFDՐQF 2820ՈF 2820ՈF 2820ՔQF 2820DT280Do280 De280 D[280 DQ280DG280D=D:D70D10D+D(D% E> ՚QF$>>>>>>>>>>>>>>>>>3MБғ1/OJ"B1/9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>: MMAOAIDIDOTMWDBZIDRSEX344 uF uu02809>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3}ސ}eFOJҋ"BaF#D6 eFO ҋ "BaF#D j   ʈ $>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>31@14 F0 uM~aFu}0 19>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3M "qt=pqzM,q=pqMq=pq0@1@110@1@111@)11@311'0|0.D D.0D(D%A09F60E> =0PFp111->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>time OPTICAL FIBERS CONTROLJOB SELECTION(0) EXIT(9) MAINTENANCE MODE'      (~!HRUNTIME Z {READSTRI2GETCHOIC CLEARSCR CURSORHO READ4CHA ) HEXTOINT )S DIGTOINT TIMED_STEP, EVENT_STEP, BLOCK_STEP, RCD_TABLE, RCD_FUNCTION); INDEXDEF = RECORD DESCRIPTOR : RCD_INDEX; STARTSTEPNR : INTEGER; END_OR_AONR : INTEGER; END; IN )| INTTOHEX  DISPTIME UDISP_MM )MM_COMMA*AI_COMMA2*DI_COMMA2GsSETDOSTA*DISPDOSTDEXLIST = ARRAY[0..MAXRECORD] OF INDEXDEF; HEAD1 = RECORD JOBNR : ARRAY[1..JOBLENGTH] OF CHAR; ALARMVAL : ARRAY[1..MAXAINR] OF INTEGER; ALARMCONTROL: ARRAY[1..MAXAINR] OF DICONTROL; *2DO_COMMA )ZDISPAOST!SETAOSTA*&AO_COMMA3TM_COMMA ID_COMMA RS_COMMAQ$MAINTENA END; HEAD2 = RECORD ABORTVAL : ARRAY[1..MAXAINR] OF INTEGER; ABORTCONTROL: ARRAY[1..MAXAINR] OF DICONTROL; LATHE_LENGTH : INTEGER; {CM} TUBE_WEIGHT : REAL; {'~ INIT_STAKG} TUBE_DIAMETER: REAL; {MM} END; AOLISTTYPE= ARRAY[1..MAXAONR] OF INTEGER; AILISTRCP = ARRAY[1..20] OF INTEGER; AILISTTYPE= ARRAY[1..MAXAINR] OF INTEGER; SETTYPE = SET OF 0..25 SAFE : SAFESTATE; CONTROL : DICONTROL; DOLINK : 0..MAXDONR END; DOUT = RECORD NAME : NAMETYPE; CONTROL : DOCONTROL; auto/manual switch is DI:end switch gas inlet side is DI:end switch exhaust side is DI:Lathe translation is AO:Lathe rotation is AO: INTERLOCK : 0..MAXDONR; CONDLOCK : 0..MAXDONR END; TEMPCONTROL = ARRAY[T_AUTO_MAN..O2_AO] OF INTEGER; LATHECONTROL = ARRAY[L_AUTO_MAN..EXHAUSTSWITCH] OF INTEGER; SYSTEM = RECOR3%0 220 ֈF1@121@11(00 DwDԈF@!6#6#1@E6*6*1120 '054.D620@p6#6#1@6*6*1120 DM20DEDB0D;A0DF60E>DԈF@6#6#1>D AILIST : ARRAY[1..MAXAINR] OF AI; AOLIST : ARRAY[1..MAXAONR] OF AO; DILIST : ARRAY[1..MAXDINR] OF DI; DOLIST : ARRAY[1..MAXDONR] OF DOUT; TEMP :@6*6*1120 '054.D620 @+6#6#1@O6*6*1120 DL20DDDA0D:A0DF60ED;ԈF@z64641120 '054.D,20!@64641120 DL20DDDA0D:A0DF60E TEMPCONTROL; LATHE : LATHECONTROL; END; MAXSTRING = ARRAY[1..MAXLENGTH] OF CHAR; IOPORTTYPE= ARRAY[1..2] OF CHAR; RCD_INDEX = (NOT_ALLOCATED,RCD_DONTCARE,RCD_1HEADER,RCD_2HEADER, DԈF@6A6A1120'054.D,20"@B6A6A1120DM20DEDB0D;A0DF60E>DE>~)aԐQFBDDD0'054.D0#DM0DGDD0>>(     D;A0DF60E>D{0'054.D0$DJ0DDDA0D:A0DF60EDE>+.֐QF@$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 2 : (STEP : STEPDEF); 3 : (TABLE : TABLEDEF); 4 : (FUNC : FUNCDEF); END {RECORD}; PROCESSSTATUS = (IDLE,RSET,EXECUTE,FINISH); enter number or to exit: NR NAME MAX. VALUE UNIT TYPE OF LOOP TYPE OF CONTROL DOLINKNR NAME MAX. VALUE UNIT TYPE OF LOOP TYPE OF CONTROL DOLINKNR NAME MAX. VALUE UNIT  STPSTATUS = (PRERUN,RUN,HLD,ALRM,ABRT,BUZZ); AISETTYPE = SET OF 1..MAXAINR; DISETTYPE = SET OF 1..MAXDINR; STATUSDEF = RECORD PROCSTATUS : PROCESSSTATUS; STEPSTATUS : STPSTATUS; CURRENTSTEP: INTEAI-LINK DO-LINK SOFTST RATIOLINK RATIONR NAME MAX. VALUE UNIT AI-LINK DO-LINK SOFTST RATIOLINK RATIONR NAME SAFE STATE TYPE OF CONTROL DO-LINKNR NAME SAFE STATE TYPE OF CONTROL DO-LINKGER; STEPTYPE : RCD_INDEX; STARTSTEP : INTEGER; TOTSTEP : INTEGER; INDEXNR : INTEGER; TIMEREMAIN : INTEGER; DEPOSITION : BOOLEAN; RECP_END : INTEGER; RECIPENR NAME TYPE OF DO INTERLOCK CONDITIONAL INTERLOCKNR NAME TYPE OF DO INTERLOCK CONDITIONAL INTERLOCKNAME : ARRAY [1..12] OF CHAR; JOBNR : ARRAY [1..10] OF CHAR; STEPNAME : ARRAY [1..10] OF CHAR; AILIST : AILISTTYPE; AOLIST : AOLISTTYPE; IOSET : SETTYPE; DEVIATION : AIL5; RAMP_TYPE = (RAMP_TIME,ENDSPEED); RAMPTYPE = ARRAY [1..5,RAMP_TIME..ENDSPEED] OF INTEGER; STEPDEF = RECORD NAME : NAMETYPE; AOLIST : AOLISTTYPE; ISTTYPE; AIPREALARM : AISETTYPE; AIALARM1 : AISETTYPE; AIALARM2 : AISETTYPE; DIALARM : DISETTYPE; PANEL : ARRAY[0..1] OF INTEGER; NEXTSPEED : INTEGER; END; {RECORD STATU AILIST : AILISTRCP; IOSET : SETTYPE; SPEEDCONT : RAMPTYPE; TERMINATOR: BOOLEAN; TIME : INTEGER; SDEF} CHARARRAY = ARRAY[0..3] OF CHAR; ABSINTDEF = RECORD CASE BOOLEAN OF TRUE : (VALUE : ^INTEGER); FALSE: (ADDRESS : INTEGER) END; INT16  H2_SETP : INTEGER; O2_SETP : INTEGER; FAST_SPEED: INTEGER; END; {IOSET HAS THE INFO FOR DIGITAL INPUTS, OUTPUTS(2X) AND CHANGING AO'S IN A BLOCKSTEP} TABLEDEF = ARRAY [1 = ARRAY[0..15] OF INTEGER; COMMANDTYPE = (MM_,AO_,AI_,DI_,DO_,TM_,WD_,ID_,RS_,BZ_,EX_,HH_, IV_); COMMANDDEF = RECORD CODESTRING : ARRAY[0..1] OF CHAR; NUMSTRING : CHARARRAY; NUMVA..MAXTAB] OF INTEGER; FUNCDEF = ARRAY [1..MAXFUNC] OF CHAR; {TO BE DEFINED YET} RECIPEDEF = RECORD CASE INTEGER OF 0 : (HEADER1 : HEAD1); 1 : (HEADER2 : HEAD2);LID : BOOLEAN; VALSTRING : CHARARRAY; VALVALID : BOOLEAN; NUM : INTEGER; VALUE : INTEGER; CODE : COMMANDTYPE; END; VAR I,SPEEDNR,INLETDI,EXHAUSTDI,IOERROR, )      SYSERROR : INTEGER; FLAMESENSOR,H2_AONR,O2_AONR : INTEGER; RAMPINDEX,BEGINSPEED : INTEGER; INCREMENT : REAL; FLAMEON,TEMPMANUAL,LATHEMANUAL,SAFEHIGH : BOOLEAN; CHOICE,ANSWER: CHAR; CHANGE,FOUND,OK WRITELN('ENTRY TOO LARGE'); 3 : WRITELN('new value exceeds the maximum value'); 4 : WRITELN('INPUT IS NOT A NUMBER'); 5 : WRITELN('max. time is 8 hrs, 59 minutes, 59 seconds'); 6 : WRITELN('max. number of steps in a blockstep is',: BOOLEAN; STEPNUMBER : INTEGER; OLD_DOSET : SETTYPE; TIMERRAMP,TIMERSOFT,TIMERDELAY,TIMERFLAME,TIMERLATHE, TIMERTEMP : INTEGER; INPUTSTRING : MAXSTRING; RECIPERECORD: FILE OF RECIPEDEF; STATUS STEPSINBLOCK:3); 7 : WRITELN('no spaces in name allowed; first char. not a number'); OTHERWISE: WRITELN('ERROR') END {X} END; {error} PROCEDURE stars; {prints a line of stars} VAR I : INTEGER; BEGIN WRITELN; FOR I := 0 TO 75 DO WRITE('*' : STATUSDEF; INDEX : FILE OF INDEXLIST; SYSTEMENTRY : FILE OF SYSTEM; RECIPE : ARRAY[0..MAXRECORD] OF RECIPEDEF; FUNCTION real_val(MAXVAL: REAL; CURVAL: INTEGER): REAL; VAR X : REAL; BEGIN X := MAXVAL * CURVAL / $F); WRITELN; WRITELN; END; {stars} PROCEDURE clearscreen; VAR CLEAR : CHAR; BEGIN CLEAR := CHR($1B); WRITELN (CLEAR,'X'); END; {clearscreen} PROCEDURE cursorhome; VAR HOME : CHAR; BEGIN HOME := CHR($1B); WRITELN (HOME,'@'); END; {cursorhome}FF; IF X < 0 THEN X := 0.0; real_val := X; END; {real_val} $SUBTITLE READ ONE CHARACTER FROM KEYBOARD FUNCTION getchoice : CHAR; VAR C : CHAR; BEGIN WRITE('':15,'your choice: '); PROMPT; GET(INPUT); IF EOLN(INPUT) THEN C := '0' EL FUNCTION findendstep : INTEGER; VAR I,MAX : INTEGER; BEGIN MAX := 0; FOR I := 0 TO MAXRECORD DO WITH INDEX^[I] DO IF STARTSTEPNR > MAX THEN MAX := STARTSTEPNR; findendstep := MAX; END{findendstep}; PROCEDURE searchstepindex (VARSE READ(C); READLN; getchoice := C END; {getchoice} FUNCTION getchar : CHAR; VAR ANSWER : CHAR; BEGIN GET(INPUT); IF EOLN(INPUT) THEN ANSWER := 'N' ELSE READ(ANSWER); READLN; getchar := ANSWER; END; {getchar} FUNCTION readint(F:INTEGER0].HEADER1.ALARMVAL[AINR]; ABORTSTATUS := -DEVIATION[AINR] > RECIPE[1].HEADER2.ABORTVAL[AINR]; END; END; {CASE} ALCONTR := RECIPE[0].HEADER1.ALARMCONTROL[A) : INTEGER; VAR I,OLD,IOERROR : INTEGER; BEGIN OLD :=F; GET(INPUT); IF NOT EOLN(INPUT) THEN BEGIN IOABORT (INPUT,FALSE); READLN (INPUT,I); IOERROR := IORESULT(INPUT); IF IOERROR <> 0 THEN BEGIN READLN; I :INR]; ABCONTR := RECIPE[1].HEADER2.ABORTCONTROL[AINR]; END; {IF} IF ABORTSTATUS AND (AINR IN AIALARM2) THEN {NOTHING} ELSE BEGIN IF AINR IN AIALARM1 THEN BEGIN AIALARM2 := AIAL= OLD END; IOABORT(INPUT,TRUE); END {IF} ELSE I:= OLD; readint := I END; {readint} PROCEDURE readstring (VAR INP: MAXSTRING; VAR C: BOOLEAN); VAR F : FILE OF MAXSTRING; I : INTEGER; BEGIN RESET (F,'/TERM'); GET (F); C := (F^[16%6%1,s1,tO20,u4F,vO"Nx=LPO"Nx=PP*,w&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>] <> ' '); {if no char_string is entered F^[1] = blank} IF C {a new string is entered} THEN FOR I := 1 TO MAXLENGTH DO INP[I] := F^[I] END; {readstring} PROCEDURE error(X : INTEGER); BEGIN CASE X OF 1 : WRITELN('INPUT ERROR'); 2 :  INDEXTYPE: RCD_INDEX; STEPNR: INTEGER; VAR TOTSTEPNR: INTEGER; VAR FOUND : BOOLEAN;VAR INDEXNR :INTEGER); {search for the requested step record} VAR I : INTEGER; BEGIN I := -1; REPEAT I :=I+1; WITH INDEX^[I] DO BEGIN FOUN*     D := (STARTSTEPNR= STEPNR) AND (DESCRIPTOR IN [TIMED_STEP..BLOCK_STEP]); IF FOUND THEN BEGIN INDEXTYPE := DESCRIPTOR; TOTSTEPNR := END_OR_AONR; INDEXNR := I; END; {IF} END {WITMENTRY^.DILIST[I] DO BEGIN namecheck(NAME,OK); IF OK THEN BEGIN IF I+OFF1 IN STATUS.IOSET THEN SETTING := 'HIGH' ELSE SETTING := ' LOW'; WRITE (NAME,SETTING:5); H} UNTIL FOUND OR (I = MAXRECORD); END; {searchstepindex} PROCEDURE searchfullindex (INDEXTYPE: RCD_INDEX; STEPNR: INTEGER; VAR TOTSTEPNR: INTEGER; VAR FOUND : BOOLEAN;VAR INDEXNR :INTEGER); {search for the requested step record} VAR I : INTEG COUNT := COUNT + 1; IF COUNT = 3 THEN BEGIN WRITELN; {3 ENTRIES PER LINE} COUNT := 0; END {IF} ELSE WRITE('':10); END {IF}; END; {WITH} ER; BEGIN I := -1; REPEAT I :=I+1; WITH INDEX^[I] DO FOUND := (STARTSTEPNR= STEPNR) AND (END_OR_AONR=TOTSTEPNR) AND (DESCRIPTOR = INDEXTYPE); IF FOUND THEN INDEXNR := I; UNTIL FOUND OR (I = MAXRECORD); END;{sea I := I + 1; UNTIL I > MAXDINR; WRITELN; END; {disp_DI} PROCEDURE disptime(TIM : INTEGER); {CHANGES TIME (SECONDS) TO H.MM.SS REPRESENTATION AND PRINTS IT} VAR TIME : ARRAY[1..7] OF CHAR; POWEROF60 : 1..3600; QUOTIENT : INTEGER; rchfullindex} PROCEDURE namecheck(NAME : NAMETYPE;VAR OK :BOOLEAN); {checks if name <> XXXXXXXXXX; OK if true} BEGIN OK:= NAME <> NONAME ; END; PROCEDURE bottomline(VAR LP: BOOLEAN); VAR CHANGE : BOOLEAN; BEGIN WRITE('enter LP for a hardcopy, REMAINDER : INTEGER; QUOT10 : 0..5; REMAIN10 : 0..9; BEGIN POWEROF60 := 3600; REMAINDER := TIM; QUOTIENT := REMAINDER DIV POWEROF60; {EXTRACT HOURS} REMAINDER:= REMAINDER MOD POWEROF60; TIME[1] := (CHR(QUOTIENT + ORD('0'))); POWEROF6to exit'); prompt; readstring(INPUTSTRING,CHANGE); IF CHANGE THEN LP := (INPUTSTRING[1] = 'L') AND (INPUTSTRING[2] = 'P'); END; {bottomline} PROCEDURE disp_AIstatus; { displays all AI values in the status} VAR I,COUNT,LINE : INTEGER; OK: BO0 := POWEROF60 DIV 60; QUOTIENT := REMAINDER DIV POWEROF60; {EXTRACT MINUTES} REMAINDER:= REMAINDER MOD POWEROF60; {SECONDS } QUOT10 := QUOTIENT DIV 10; REMAIN10 := QUOTIENT MOD 10; TIME[2] := '.'; TIME[3] := (CHR(QUOT10 + ORD('0'))); TIMOLEAN; VALUE: REAL; BEGIN COUNT := 0; LINE := 0; I := 1; REPEAT WITH SYSTEMENTRY^.AILIST[I] DO BEGIN namecheck(NAME,OK); IF OK THEN BEGIN VALUE := real_val (SCALE, STATUS.AILIST[I]); E[4] := (CHR(REMAIN10 + ORD('0'))); QUOT10 := REMAINDER DIV 10; REMAIN10 := REMAINDER MOD 10; TIME[5] := '.'; TIME[6] := (CHR(QUOT10 + ORD('0'))); TIME[7] := (CHR(REMAIN10 + ORD('0'))); WRITE(TIME:9); END {disptime}; PROCEDURE disp_procsta WRITE (NAME:10,VALUE:9:3,UNIT:6); COUNT := COUNT + 1; IF COUNT = 3 THEN BEGIN WRITELN; COUNT := 0; END {IF} ELSE WRITE('':1); END {IF};tus; BEGIN WITH STATUS DO BEGIN CASE PROCSTATUS OF IDLE : WRITE('IDLE':8); EXECUTE: WRITE('EXECUTE' :8); RSET : WRITE('RESET':8); FINISH : WRITE('FINISHED':8); OTHERWISE :; END {CASE}; END; {WITH} END; { END {WITH}; I := I + 1; UNTIL I > MAXAINR; WRITELN; WRITELN; END; {disp_AIstatus} PROCEDURE disp_DIstatus; VAR I,COUNT: INTEGER; OK : BOOLEAN; SETTING : ARRAY [0..3] OF CHAR; BEGIN COUNT := 0; I := 1; REPEAT WITH SYSTE45GETAISTA56#PROCESSA7 8DIFFEREN8 G[<ALABTEST=+Gv?INPUTTES@)pAURESET_PRBhCJHOLD_PROD(GSTART_PR+     disp_procstatus} PROCEDURE disp_stpstatus; BEGIN WITH STATUS DO BEGIN CASE STEPSTATUS OF PRERUN : WRITE('PRERUN':8); RUN : WRITE('RUN' :8); HLD : WRITE('HOLD':8); ALRM : WRITE('ALARM':8); ABRT : WRITE('AB3M (q=pҐqO=1%0 O@@ 1(O1"}O=1%MQF0DO10 @111@111@:11@U11'0|.DD*0%D$0D0DA02F60E>=0PFO@j@v1O10 1->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ORT':8); BUZZ : WRITE('BUZZER':8); OTHERWISE :; END {CASE}; END; {WITH} END; {disp_stpstatus} PROCEDURE disp_systime; VAR YR,MON,DAY,HR,MIN,SEC : INTEGER; BEGIN SYSTIME(YR,MON,DAY,HR,MIN,SEC); WRITE('date: ',YR:1,'/',MON:1,'/',/D1/SYSTEM SYSTEMEN SYSTEM FILE EDITOR PROGRAM(0) exit(1) change/delete an entry(2) print systemfile/D1/SYSTEM SYSTEMEN DAY:1,'time: ':8); IF HR < 10 THEN WRITE ('0',HR:1,'.') ELSE WRITE(HR:2,'.'); IF MIN < 10 THEN WRITE ('0',MIN:1,'.') ELSE WRITE(MIN:2,'.'); IF SEC < 10 THEN WRITE ('0',SEC:1) ELSE WRITE(SEC:2); END; {disp_systime} PROCEDURE disp_status(LP : BOOLEAN)P =QCONFIGUR2GETCHOIC GETCHAR $GETANSWE :READINT KREADREALF { READSTRI  pERROR ; VAR I, OFFSET,NR: INTEGER; FOUND: BOOLEAN; ANSWER : CHAR; BEGIN IF LP THEN BEGIN REWRITE(OUTPUT,'/P1'); STARS; WRITELN; WRITELN('':20,'OPTICAL FIBERS STATUS DISPLAY'); WRITELN; STARS; WRITELN; END {IF} ELSE  ) STARS  CLEARSCR4&WAI_AO_DItAI_DISPL`AO_DISPLLDI_DISPL` DO_DISPLTEMP_DIS clearscreen; WITH STATUS DO BEGIN IF PROCSTATUS <> IDLE THEN BEGIN WRITE(RECIPENAME); WRITE('JOB:':6,JOBNR:11); END; IF PROCSTATUS IN [EXECUTE,FINISH] THEN BEGIN WRITE('STEP':7,CURRENTSTEP:5,STEPNAME:1LATHE_DI^PRINT_AI_PRINT_AO EPRINT_DI!"SPRINT_DO#.$!PRINT_TE%&&PRINT_LA'%I*PRINTSYS2); disp_procstatus; END; {IF} IF STEPSTATUS IN [HLD..ABRT] THEN {disp_failure}; WRITELN; disp_systime; IF STEPTYPE = TIMED_STEP THEN BEGIN WRITE('':4,'remaining steptime: '); disptime(TIMEREMAIN); +g,AI_DELET-^.AO_DELET/ ,0 DI_DELET1 R2 DO_DELET3 &4TEMP_DEL4 &5LATHE_DE5 w6CREATE_S688AI_CHANG END; WRITELN; WRITELN; disp_AIstatus; WRITELN; disp_DIstatus; IF LP THEN BEGIN STARS; PAGE(OUTPUT); REWRITE(OUTPUT,'/TERM'); LP := FALSE; END; {IF} { bottomline(LP); IF LP TH::=AO_CHANG>8@DI_CHANGA8CDO_CHANGD'7FTEMP_CHAG'HLATHE_CHI %MEDITENTREN disp_status(LP); } END {WITH} END {disp_status}; PROCEDURE chng_jobnr; VAR CHANGE : BOOLEAN; I : INTEGER; BEGIN WITH STATUS DO BEGIN WRITELN('current job number:',JOBNR:12); WRITE ('new job number:','':6); PROMPT; readst IF INTERLOCK <> 0 THEN SYSTEMENTRY^.DOLIST[INTERLOCK].INTERLOCK := 0; INTERLOCK := NUMBER; END {0}; 1..MAXDONR : BEGIN IF NUMBER <> PORTNR THEN ,     URE LATHE_change; VAR NUMBER : INTEGER; BEGIN WITH SYSTEMENTRY^ DO BEGIN WRITE('auto/manual switch is DI:'); PROMPT(OUTPUT); NUMBER := READINT(LATHE [L_AUTO_MAN]); IF NUMBER IN [0..MAXDONR] THEN LATHE [L_AUTO_MAN] :ON(RECIPERECORD,0); REPOSITION(INDEX,0); GET (INDEX); I := 0; IF EOF(INDEX) THEN WRITELN('recipe does not exist') ELSE BEGIN WHILE NOT EOF(RECIPERECORD) DO BEGIN GET(RECIPERECORD); RECIPE[I] = NUMBER; WRITE('end switch gas inlet side is DI:'); PROMPT(OUTPUT); NUMBER := READINT(LATHE [INLETSWITCH]); IF NUMBER IN [0..MAXDINR] THEN LATHE [INLETSWITCH] := NUMBER; WRITE('end switch exhaust side is DI:'); := RECIPERECORD^; I := I+1; END {WHILE}; WITH STATUS DO RECP_END := findendstep; END {ELSE}; IF STATUS.PROCSTAT = RSET THEN disp_status(FALSE); END {IF} ELSE WRITELN('not allowed; a process is running'); END; { PROMPT(OUTPUT); NUMBER := READINT(LATHE [EXHAUSTSWITCH]); IF NUMBER IN [0..MAXDINR] THEN LATHE [EXHAUSTSWITCH] := NUMBER; WRITE('Lathe translation is AO:'); PROMPT(OUTPUT); NUMBER := READINT(LATHE [SPEED_AO]); load_recipe} PROCEDURE setAOstat(NUM : INTEGER; DATA : INTEGER); VAR DA_DATA : ABSINTDEF; {$D-} BEGIN WITH DA_DATA DO BEGIN ADDRESS := DA_BOARD +(NUM-1)* 2; FIELDPUT(VALUE^,3,16,DATA); END {WITH} END; {setAOstat} {$D+} PROCEDURE set IF NUMBER IN [0..MAXAONR] THEN LATHE [SPEED_AO] := NUMBER; WRITE('Lathe rotation is AO:'); PROMPT(OUTPUT); NUMBER := READINT(LATHE [ROTAT_AO]); IF NUMBER IN [0..MAXAONR] THEN LATHE [ROTAT_AO] := NUMBER; END {WITH}DOAO(OFF : INTEGER); VAR DATA,OFFSET,I : INTEGER; DO_DATA : ABSINTDEF; IOCONVERT: RECORD CASE BOOLEAN OF TRUE: (IOSET :SETTYPE); FALSE:(INTREP : INT16) END; BEGIN WITH IOCONVERT DO BEGIN IOSET ring(INPUTSTRING,CHANGE); IF CHANGE THEN FOR I := 1 TO 10 DO JOBNR[I]:= INPUTSTRING[I]; END; {WITH} END; {chng_jobnr} PROCEDURE load_recipe; VAR INPUTSTRING : MAXSTRING; RCNAME : ARRAY [1..25] OF CHAR; INDEXNAME : ARR: ; '1': editentry; '2': printsystem; OTHERWISE: error(1) {INPUTERROR} END {CHOICE}; UNTIL CHOICE = '0'; REWRITE(SYSTEMENTRY,'/D1/SYSTEM'); PUT(SYSTEMENTRY); clearscreen; END. {CONFIGURATOR} E CHOICE OF '0'AY [1..32] OF CHAR; CHANGE,OK : BOOLEAN; I : INTEGER; BEGIN IF STATUS.PROCSTAT IN [IDLE, RSET, FINISH] THEN BEGIN REPEAT WRITE('enter name of recipe: '); PROMPT(OUTPUT); readstring(INPUTSTRING,CHANGE); IF30 BEGIN 5335 IF NR IN OLDIOSET THEN 5340 BEGIN 5345 DIALARM := DIALARM + [NR]; 5346 WRITE('DI',NR:4,'':2); 5350 processaction(ALCONTR); 5355 END {IF} 5360 END; {ELS CHANGE THEN BEGIN OK := NOT (INPUTSTRING[1] IN ['0'..'9',' ']); END {IF} ELSE OK := FALSE; IF NOT OK THEN ERROR(7); UNTIL OK; RCNAME [1 FOR 11] := '/D1/RECIPE/'; INDEXNAME [1 FOR 17] := '/D1/RECIPE/index.';E} 5365 IF NOT ALARMSTATUS THEN 5370 DIALARM := DIALARM - [NR]; 5375 END; {WITH} 5380 END; {FOR} 5385 END; {inputtest} 5390 5395 PROCEDURE reset_proc; 5400 {changes the procstatus to reset if requested; in reset the flame i FOR I := 1 TO 12 DO BEGIN STATUS.RECIPENAME[I] := INPUTSTRING[I]; RCNAME [I+11]:= INPUTSTRING [I]; INDEXNAME [I+17]:= INPUTSTRING [I]; END; {FOR} UPDATE (RECIPERECORD,RCNAME); UPDATE (INDEX,INDEXNAME); REPOSITI0000000000E -      XXXXXXXXXXAXDONR] OF DOUT; TEMP : TEMPCONTROL;  END; {IOSET HAS THE INFO FOR DIGITAL INPUTS, OUTPUTS(2X) AND CHANGING AO'S IN A BLOCKSTEP} TABLEDEF = ARRAY [1..MAXTAB] OF INTEGER; FUNCDEF = ARRAY [1..MAXFUNC] OF CHAR; {TO BE DEFIN IF OK THEN print_DO (LINE,LOOPSTART,LOOPEND,LP) END {4}; 5 : print_TEMP (LINE, LP); 6 : print_LATHE (LINE, LP); END; {CASE} UNTIL TYPESELECT = 0; END {IF} ELSE BEGIN IF NOT LP THEN cle Rarscreen; LOOPSTART := 1; LOOPEND := MAXAINR; print_AI(LINE,LOOPSTART,LOOPEND,LP); LOOPEND := MAXAONR; print_AO(LINE,LOOPSTART,LOOPEND,LP); LOOPEND := MAXDINR; print_DI(LINE,LOOPSTART,LOOPEND,LP); LOOPEND := MAXDONR;:= STATUS.IOSET; IF OFF = OFF3 THEN OFFSET := INTOFF2 ELSE OFFSET := INTOFF1; FOR I := 0 TO 1 DO BEGIN {$D- NO RUNTIME ERROR CHECKING} DO_DATA.ADDRESS := DO_BOARD+ 2 * I; DATA := FIELDGET(INTREP[OFFSET-I],7,16);  print_DO(LINE,LOOPSTART,LOOPEND,LP); print_TEMP (LINE, LP); print_LATHE (LINE, LP); PAGE(OUTPUT); END; {ELSE} IF LP THEN REWRITE(OUTPUT,'/TERM') ELSE BEGIN WRITELN; WRITE ('press to return to the job selection'); DO_DATA.VALUE^ := DATA; END {FOR}; {$D+} END; {WITH} FOR I := 1 TO MAXAONR DO setAOstat(I,STATUS.AOLIST[I]); END; {setDOAO} PROCEDURE init_status; VAR I : INTEGER; BEGIN WITH STATUS DO BEGIN PROCSTATUS := IDLE; STEPSTATUS PROMPT (OUTPUT); READLN; END {ELSE} END; {printsystem} $SUBTITLE PROCEDURES TO DELETE/INITIATE ENTRIES PROCEDURE AI_delete(VAR PORTNR : INTEGER); BEGIN WITH SYSTEMENTRY^.AILIST[PORTNR] DO BEGIN NAME := NONAME;  := PRERUN; CURRENTSTEP := -1; STARTSTEP := 0; TOTSTEP := 0; FOR I := 1 TO MAXAONR DO AOLIST[I] := 0; IOSET := []; NEXTSPEED := 0; AIPREALARM := []; AIALARM1 := []; AIALARM2 := []; DIALARM := []; EN UNIT := NOUNIT; SCALE := 0; LOOP := AIONLY; CONTROL := DONTCARE; DOLINK := 0; IF (AOLINK>0) AND (AOLINK 0) AND (SOFTST <> 0) THEN BEGIN CONTR := SYSTEMENTRY^.DOLIST[DOLINK].CONTROL; NR := DOLINK + OFF2; SETBIT :=((CONTR = NORMAL) AND NOT (NR IN OLD_DOSET) AND (NR IN STATUS.IOSET)) OR ((CONTR = INVERTED) AND (NR IN OLD_DOSET) AND NOT (NR IN STATUS.IOSET)); IF SETBIT THEN BEGIN STATUS.IOSET := STATUS.IOSET + [SOFTST+ OFF2] + [SOFTST+ O.     FF3]; TIMERSOFT := 6; END; {IF} END; {IF} END; {setsoft} PROCEDURE clearsoft; VAR AONR : INTEGER; BEGIN FOR AONR := 1 TO MAXAONR DO WITH SYSTEMENTRY^.AOLIST[AONR] DO IF SOFTST <> 0 THEN STATUS.IOSET := STATUS.IOSET -AMPINDEX = 0 {AT START OF A NEW STEP} THEN BEGIN TIMERRAMP := 0; STATUS.AOLIST[SPEEDNR] := 0; END {IF} ELSE BEGIN TIMERRAMP := TIMERRAMP - 1; REALVALUE :=(SPEEDCONT[RAMPINDEX,RAMP_TIME] -TIMERRAMP)* INCRE [SOFTST +OFF2] - [SOFTST + OFF3]; END; {clearsoft} PROCEDURE speedramp; VAR I,INDEXNUMBER: INTEGER; REALVALUE : REAL; FOUND : BOOLEAN; BEGIN INDEXNUMBER := STATUS.INDEXNR; WITH RECIPE[INDEXNUMBER].STEP DO IF RAMPINDEX < 6 THEN BEGIN IF RMENT; STATUS.AOLIST[SPEEDNR] := ROUND(REALVALUE) + BEGINSPEED; END; {ELSE} {compute next ramping increment, if TIMERRAMP = 0} IF TIMERRAMP = 0 THEN BEGIN BEGINSPEED := STATUS.AOLIST[SPEEDNR]; REPEAT RAMPINDEX  := NOUNIT; SCALE := 0; I := AILINK; AILINK := 0; DOLINK := 0; SOFTST := 0; RATIOLINK := 0; RATIOVALUE := 0 END; {WITH} := RAMPINDEX + 1; IF RAMPINDEX <6 THEN FOUND := SPEEDCONT[RAMPINDEX,RAMP_TIME] <> 0 ELSE FOUND := FALSE; IF FOUND THEN BEGIN TIMERRAMP := SPEEDCONT[RAMPINDEX,RAMP_TIME]; INCREME IF (I >0) AND (I 5); END; {IF} setAOstat(SPEEDNR,STATUS.AOLIST[SPEEDNR]); END; {IF} END; {speedramp} PROCEDURE move_half := IGNORE; DOLINK := 0 END {WITH} END {DI_delete}; PROCEDURE DO_delete(VAR PORTNR : INTEGER); BEGIN WITH SYSTEMENTRY^.DOLIST[PORTNR] DO BEGIN NAME := NONAME; CONTROL := NORMAL; IF (INspeed; VAR VALUE : INTEGER; BEGIN VALUE := $800; {$800 IS HALF OF FULL SCALE} STATUS.AOLIST[SPEEDNR] := VALUE; STATUS.NEXTSPEED := VALUE; setAOstat(SPEEDNR,VALUE); END; {move_halfspeed} PROCEDURE nextstep; VAR NEXT, EXIST,SETBIT : BOOLEAN; AOITERLOCK>0) AND (INTERLOCK RECP_END); IND LATHE [L] := 0 END {WITH} END {LATHE_delete}; PROCEDURE create_SF; {INITIALIZES THE SYSTEMFILE} VAR I : INTEGER; BEGIN FOR I := 1 TO MAXAINR DO AI_delete(I); FOR I := 1 TO MAXAONR DO AO_delete(I); FOR I := 1 TO MAXDINR DO DI_delete(I); EXNR := INDEXNUMBER; END; {WITH} IF NEXT AND EXIST THEN BEGIN {put new step in status for execution} WITH RECIPE[INDEXNUMBER].STEP DO BEGIN STATUS.STEPNAME := NAME; STATUS.AOLIST := AOLIST; STATUS.IOSET := IOSET;/      IF STATUS.STEPTYPE = TIMED_STEP THEN STATUS.TIMEREMAIN := TIME ELSE BEGIN RAMPINDEX := 0; {swap the deposition and fast forward speed;step starts with fast} STATUS INTEGER; DI_DATA : ABSINTDEF; IOCONVERT: RECORD CASE BOOLEAN OF TRUE: (IOSET : SETTYPE); FALSE: (INTREP: INT16); END; BEGIN WITH IOCONVERT DO BEGIN IOSET := []; OFFSET := 15; {$D- NO RUNTIM.NEXTSPEED := AOLIST[SPEEDNR]; {forward speed} STATUS.AOLIST[SPEEDNR] := FAST_SPEED; END; {ELSE} END; {WITH} WITH STATUS DO IF RECIPE[INDEXNUMBER].STEP.TERMINATOR THEN RECP_END := CURRENTSTEP + TOTSTEP-1; E ERROR CHECKING} DI_DATA.ADDRESS := DI_BOARD; INTREP[OFFSET] := FIELDGET(DI_DATA.VALUE^,7,16); {GET INPUT 1 TO 16, 8 BITS SHIFTED TO GET 8-16 IN M.S. BITS} DI_DATA.ADDRESS := DI_BOARD + 2; INTREP[OFFSET-1] := FIELDGET(DI_DATA.VAL END; {IF} {end of loading the next step except for the changing AO part} {the next section is also executed if a block step is not yet finished} WITH STATUS DO IF STEPTYPE = BLOCK_STEP THEN FOR AONR := 1 TO MAXAONR DO IF (AONR +OFF4) IN IUE^,7,8); {GET INPUT 17-24 ONLY IN THE L.S. BITS OF DATA} {$D+} FOR DINR := 1 TO MAXDINR DO BEGIN IF (DINR+OFF1) IN IOSET THEN STATUS.IOSET := STATUS.IOSET + [DINR+OFF1] ELSE SOSET THEN BEGIN RAMPINDEX := 0; {init for speed ramp in deposition stroke} searchfullindex(RCD_TABLE,STARTSTEP,AONR,EXIST,AOINDEX); IF EXIST THEN BEGIN BLOCKNR := CURRENTSTEP - STARTSTEP +1; TATUS.IOSET := STATUS.IOSET - [DINR+OFF1] END; END {WITH}; END; {getDIstat} PROCEDURE getAIstat; { STARTS THE CONVERSION OF AN ANALOG CHANNEL AND READ THE} { CONVERTED DIGITAL VALUE} VAR NR,READY,COUNT,DATA: INTEGER; AD_SELECT, AD_DATA : ABSINTD VALUE := RECIPE[AOINDEX].TABLE[BLOCKNR]; AOLIST[AONR] := VALUE; DONR := SYSTEMENTRY^.AOLIST[AONR].DOLINK; IF DONR <> 0 THEN BEGIN CONTR := SYSTEMENTRY^.DOLIST[DONR].CONTROL; EF; BEGIN {$D- SUPPRESS RUNTIME CHECKS; POINTER ACCESSES NON MEMORY ADDRESSES} AD_SELECT.ADDRESS := AD_BOARD; AD_DATA .ADDRESS := AD_BOARD + 2; FOR NR := 1 TO 16 DO WITH AD_SELECT DO BEGIN VALUE^ := 256 *(NR-1) + 4; COU SETBIT := ((VALUE > 0) AND (CONTR = NORMAL)) OR ((VALUE = 0) AND (CONTR = INVERTED)); IF SETBIT THEN IOSET := IOSET + [DONR+OFF2] + [DONR+OFF3] ELSE IOSETNT := 10; REPEAT READY := FIELDGET(VALUE^,2,1); COUNT := COUNT-1; UNTIL (READY = 0) OR (COUNT=0); IF READY = 0 THEN BEGIN STATUS.AILIST[NR]:= FIELDGET(AD_DATA.VALUE^,15,12); END {IF}  := IOSET - [DONR+OFF2] - [DONR+OFF3]; END; {IF} END; {IF} END; {IF} { all changes are now made to insure the correct digital and analog output settings} {next the softstarts will be computed and added to the digital outputs} ELSE STATUS.AILIST[NR] := 0; END; {WITH} {$D+ ENABLE RUN TIME ERROR CHECKING AGAIN} END; {getAIstat} PROCEDURE processaction(CONTR : DICONTROL); BEGIN CASE CONTR OF IGNORE : WRITELN('IGNORE'); BUZZER : {setbuzzer}WRITELN('BUZZER {they are added to both deposition and fast forward settings and are {cleared in both after 6 seconds} setsoft(OLDDOSET); {now all outputs can be set according to the status} setDOAO(OFF3); END; {newstep} PROCEDURE getDIstat; VAR DINR,OFFSET:'); HOLD : {hold_proc}WRITELN('HOLD'); ALARM : {setalarm} WRITELN('ALARM'); ABORT : {setabort} WRITELN('ABORT'); TIMERESET: {settimereset}WRITELN('TIME RESET'); END; {CASE} END; {processaction} PROCEDURE difference; {computes the0      difference between setpoints and inputvalues, for linked and unlinked ai's} VAR NR, TABLEOFFSET, AONR :INTEGER; AILOOP : AI_LOOP; BEGIN TABLEOFFSET := 1; FOR NR := 1 TO MAXAINR DO BEGIN WITH SYSTEMENTRY^.AILIST[NR]DO BEGIN AILO.ALARMCONTROL[AINR]; ABCONTR := RECIPE[1].HEADER2.ABORTCONTROL[AINR]; END; {IF} IF ABORTSTATUS AND (AINR IN AIALARM2) THEN {NOTHING} ELSE BEGIN IF AINR IN AIALARM1 THEN BEGIN AOP := LOOP; AONR := AOLINK; END; {WITH} WITH STATUS DO IF AILOOP = SETPOINT THEN DEVIATION[NR] := AOLIST[AONR] - AILIST[NR] ELSE BEGIN DEVIATION[NR] := AILIST[TABLEOFFSET] - AILIST[NR]; IALARM2 := AIALARM2 + [AINR]; AIALARM1 := AIALARM1 - [AINR]; WRITE('AI',AINR:4,'':2); processaction(ABCONTR); END {IF} ELSE BEGIN IF ALARMSTATUS AND (AINR IN AIALARM1) TABLEOFFSET := TABLEOFFSET + 1; END; {ELSE} END; {FOR} END; {difference} PROCEDURE alabtest; VAR NR,AINR : INTEGER; ALARMSTATUS : BOOLEAN; ABORTSTATUS : BOOLEAN; ALCONTR, ABCONTR : DICONTROL; BEGIN FOR AINR := 1 TO MAXAINR DO THEN {NOTHING} ELSE BEGIN IF AINR IN AIPREALARM THEN BEGIN AIALARM1 := AIALARM1 + [AINR]; AIPREALARM := AIPREALARM - [AINR]; WRITE('AI',AIN WITH STATUS DO BEGIN IF ABS(DEVIATION[AINR]) <> 1 THEN {1 BIT DIFFERENCE IS WITHIN ACCURACY} BEGIN CASE SYSTEMENTRY^.AILIST[AINR].CONTROL OF DONTCARE : BEGIN ALARMSTATUS := FALSE; ABORTSTR:4,'':2); processaction(ALCONTR); END {IF} ELSE AIPREALARM := AIPREALARM + [AINR]; END {ELSE} END {ELSE} END; {ELSE} IF NOT (ALARMSTATUS OR ATUS := FALSE; END; BANDLIMIT: BEGIN ALARMSTATUS := ABS(DEVIATION[AINR]) > RECIPE[0].HEADER1.ALARMVAL[AINR]; ABORTSTATUS := ABS(DEVIATION[AINR]) > ABORTSTATUS) THEN BEGIN AIPREALARM := AIPREALARM - [AINR]; AIALARM1 := AIALARM1 - [AINR]; AIALARM2 := AIALARM2 - [AINR]; END; {IF} END; {WITH} END; {alabtest} PROCEDURE inputtest; VAR OLDIOSET  RECIPE[1].HEADER2.ABORTVAL[AINR]; END; UPPERLIMIT: BEGIN ALARMSTATUS := DEVIATION[AINR] > RECIPE[0].HEADER1.ALARMVAL[AINR]; : SETTYPE; NR ,INDEXNUMBER : INTEGER; ALARMSTATUS : BOOLEAN; ALCONTR : DICONTROL; BEGIN OLDIOSET := STATUS.IOSET; INDEXNUMBER := STATUS.INDEXNR; FOR NR := 1 TO MAXDINR DO BEGIN WITH SYSTEMENTRY^.DILIST[NR] DO BEGIN IF ABORTSTATUS := DEVIATION[AINR] > RECIPE[1].HEADER2.ABORTVAL[AINR]; END; LOWERLIMIT: BEGIN ALARMSTATUS := -DEVIATION[AINR] >  (NR + OFF1) IN RECIPE[INDEXNUMBER].STEP.IOSET THEN {check this input} BEGIN IF SAFE = LOW THEN ALARMSTATUS := (NR +OFF1) IN STATUS.IOSET ELSE ALARMSTATUS := NOT ((NR +OFF1) IN STATUS.IOSET);  RECIPE[0].HEADER1.ALARMVAL[AINR]; ABORTSTATUS := -DEVIATION[AINR] > RECIPE[1].HEADER2.ABORTVAL[AINR]; END; END; {CASE} ALCONTR := RECIPE[0].HEADER1 ALCONTR := CONTROL; END ELSE ALARMSTATUS := FALSE; END; {WITH} WITH STATUS DO BEGIN IF ALARMSTATUS AND (NR IN DIALARM) THEN {NOTHING} ELSE BEGIN IF NR IN OLD1     IOSET THEN BEGIN DIALARM := DIALARM + [NR]; WRITE('DI',NR:4,'':2); processaction(ALCONTR); END {IF} END; {ELSE} IF NOT ALARMSTATUS THEN DIALARM := DIALARM - [NR] END; {ELSE} END; {WITH} END; {hold_step} PROCEDURE execstep; VAR NEWSTEP : BOOLEAN; VALUE : INTEGER; BEGIN IF TIMERDELAY <> 0 THEN TIMERDELAY := TIMERDELAY -1; IF TIMERDELAY = 0 THEN BEGIN difference; ALABtest; INPUTtest; END; {WITH} END; {FOR} END; {inputtest} PROCEDURE reset_proc; {softstarts H2, O2 burner MFC's when tempcontrol is manual and flame is off and process status is idle or finished.} {global are FLAMESENSOR, H2_AONR, O2_AONR, TIMERS FOR SOFTST, FLAM; END; {IF} IF TIMERSOFT <> 0 THEN TIMERSOFT := TIMERSOFT -1; IF TIMERSOFT = 0 THEN BEGIN clearsoft; setDOAO(OFF3); END; {IF} WITH STATUS DO BEGIN IF (TIMEREMAIN <> 0) AND (STEPTYPE = TIMED_STEP) THEN TIMEREMAIN := TIMERE} {global are FLAMEON, SAFEHIGH, TEMPMANUAL} BEGIN WITH SYSTEMENTRY^ DO BEGIN TEMPMANUAL := NOT ((TEMP[T_AUTO_MAN] +OFF1) IN STATUS.IOSET); SAFEHIGH := DILIST[FLAMESENSOR].SAFE = HIGH; END; WITH STATUS DO IF SAFEHIGH THEN FLAMEON EMAIN -1 ELSE BEGIN {* check change to deposit setting of outputs in event, block step} IF ((INLETDI + OFF1) IN IOSET) AND (NOT DEPOSITION) THEN BEGIN VALUE := AOLIST[SPEEDNR]; AOLIST[SPEEDNR] := NEXTSPEED; NEXTSPEED := VAL:= (FLAMESENSOR +OFF1) IN IOSET ELSE FLAMEON := NOT((FLAMESENSOR +OFF1) IN IOSET); IF STATUS.PROCSTATUS IN [IDLE,FINISH] THEN BEGIN IF (NOT FLAMEON) AND TEMPMANUAL THEN BEGIN WITH SYSTEMENTRY^ DO STATUS.IOSET := STATUUE; setAOstat(SPEEDNR,AOLIST[SPEEDNR]); setDOAO(OFF2); DEPOSITION := TRUE; END; {IF} IF DEPOSITION THEN speedramp; END; {ELSE} {* check end of step criteria} IF (PROCSTATUS <> FINISH) AND (STEPSTATUS IN [RUN,BUZZ]) TS.IOSET + [AOLIST[H2_AONR].DOLINK + OFF3] + [AOLIST[O2_AONR].DOLINK + OFF3] + [AOLIST[H2_AONR].SOFTST + OFF3] + [AOLIST[O2_AONR].SOFTST + OFF3] {+ [TEMP[LITFLAME] +HEN BEGIN IF (STEPTYPE = TIMED_STEP) THEN NEWSTEP := ((TIMEREMAIN = 0) AND (STEPSTATUS = RUN)) ELSE {BLOCKSTEP, EVENTSTEP} BEGIN NEWSTEP := DEPOSITION AND ((EXHAUSTDI+OFF1) IN IOSET); IF NEWSTEP THEN DEPOSITION := FOFF3]}; setDOAO(OFF3); TIMERSOFT := 6; END; {IF} IF NOT TEMPMANUAL THEN WRITELN('temperature control not in MANUAL') ELSE STATUS.PROCSTATUS := RSET; END {IF} ELSE BEGIN WRITELN('reset is only allowed when ALSE; END; END; {IF} {* check if at end of recipe} IF (RECP_END = CURRENTSTEP) AND NEWSTEP THEN BEGIN PROCSTATUS := FINISH; STEPSTATUS := PRERUN; {stop the lathe ?} END; {* not at end of recipe} IF NEWSTEP AND (PROCSTATUS <> process is idle or finished'); WRITE('process status is:'); disp_procstatus; WRITELN; END; {ELSE} END;{rset_proc} PROCEDURE hold_step; {changes the stepstatus to hold if requested} BEGIN WITH STATUS DO BEGIN IF PROCSTATUS = EXECUTE FINISH) THEN BEGIN IF (STEPTYPE = TIMED_STEP) THEN STEPSTATUS := PRERUN; nextstep; TIMERSOFT := SOFTCOUNT; TIMERDELAY := DELAYCOUNT; IF {new} (STEPTYPE = TIMED_STEP) THEN STEPSTATUS := RUN; END; {IF} {* check foTHEN BEGIN STEPSTATUS := HLD; WRITELN('hold done'); END {IF} ELSE BEGIN WRITELN('hold is only allowed when process is running'); WRITE('process status is:'); disp_procstatus; WRITELN; r switch from prerun to run} IF (STEPSTATUS = PRERUN) AND ((EXHAUSTDI +OFF1) IN IOSET) THEN BEGIN STEPSTATUS := RUN; DEPOSITION := FALSE; END; {IF} END; {WITH} END; {execstep} PROCEDURE runtime; {checks digital and analog inputs and take2     s action -decounts timers + action at end of step, softstarts, delays -switches from fast forward to deposit at exhaust switch -test if step and process is finished } BEGIN {WHOLESEC := NOT WHOLESEC;} {IF WHOLESEC DO} WITH STATUS DO BEGIN getDI 3PCOD?\+P1c1]Q,W RRUNTIME stat; getAIstat; IF (STEPSTATUS = PRERUN) AND (PROCSTATUS = RSET) AND ((EXHAUSTDI + OFF1) IN IOSET) THEN BEGIN PROCSTATUS := EXECUTE; STEPSTATUS := RUN; DEPOSITION := FALSE; END;{IF} CASE PROCSTATUS 3,v M r,v bF Cr,vr,9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>OF IDLE : ; {no special action} RSET : {The H2, O2 valves are opened and flame ignition turned on. After 6 seconds the softstarts are cleared. After 9 seconds the flame sensor is being checked. The flame should be on, otherwise the valves are closed again 3,@1@1,1,1,1F ,,=05D21 ,1 ,,45$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>and processstatus returns to idle. As long as the system in reset the flame is monitored, together with H2, O2 setpoints. } BEGIN IF TIMERSOFT <> 0 THEN BEGIN TIMERSOFT := TIMERSOFT - 1; IF TIMERSOFT = 0 THEN your choice:  BEGIN TIMERFLAME := 3; clearsoft; setDOAO(OFF3); END; {IF} END {IF} ELSE BEGIN IF TIMERFLAME > 0 THEN BEGIN TIMERFLAME := TIMERFLAME - 3,1,1F ,=N5D21 ,1 ,45,$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>1; IF TIMERFLAME = 0 THEN BEGIN {STATUS.IOSET := STATUS.IOSET - [SYSTEMENTRY^.TEMP[LITFLAME] + OFF3];} setDOAO(OFF3); END; {IF} END; {IF} 3,,1,1FK,,=1%,21 1 ,(1",ҐUF,,1 ,,,=1%, , D, , &>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> IF (TIMERFLAME = 0) AND NOT FLAMEON THEN BEGIN WITH SYSTEMENTRY^ DO STATUS.IOSET := STATUS.IOSET - [AOLIST[H2_AONR].DOLINK + OFF3] - [AOLIST[O2_AONR].DOLINK + OFF3] ; 3,6Fq=56 q2@@1,21,2"Nx= T*,xFH,q6FquueF2uF"N2uF"N,xuuaF u#qD219>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> setDOAO(OFF3); STATUS.PROCSTATUS := IDLE; {setbuzzer} END; {IF} END; {ELSE} END; {RSET} EXECUTE, FINISH : execstep; END; {case} {check key requests} disp_status(FALSE); {set /TERM F 3     NK := PORTNR; END {IF} END {WITH} END {change_AO}; $SUBTITLE CHANGE DIGITAL INPUTS IN SYSTEMFILE PROCEDURE DI_change(VAR PORTNR :INTEGER); VAR INPUTSTRING : MAXSTRING; CHANGE : BOOLEAN; CHOICE : CHAR; NUMBER : INTEGER; BEGIN WITHproc} {main program body} BEGIN clearscreen; STARS; WRITELN('':20,' OPTICAL FIBERS CONTROL'); STARS; IOABORT (SYSTEMENTRY,FALSE); RESET (SYSTEMENTRY,'/D1/SYSTEM'); SYSERROR := IORESULT(SYSTEMENTRY); IOABORT (SYSTEMENTRY,TRUE); IF SYS SYSTEMENTRY^.DILIST[PORTNR] DO BEGIN WRITE('NAME: '); PROMPT(OUTPUT); READSTRING(INPUTSTRING,CHANGE); IF CHANGE THEN NAME[1 FOR NAMELENGTH] := INPUTSTRING[1 FOR NAMELENGTH]; WRITELN('SAFE STATE: ERROR = 216 THEN WRITELN ('no configuration file') ELSE BEGIN GET (SYSTEMENTRY); WITH SYSTEMENTRY^ DO BEGIN SPEEDNR := LATHE[SPEED_AO]; INLETDI := LATHE[INLETSWITCH]; EXHAUSTDI := LATHE[EXHAUSTSWITCH];  '); WRITELN(' (1) low'); WRITELN(' (2) high'); CHOICE := GETCHOICE; CASE CHOICE OF '0' : ; '1' : SAFE := LOW; '2' : SAFE := HIGH; OTHERWISE: ERROR(1) END {C FLAMESENTSOR := 16; {TO BE CHANGED TO TEMP[FLAMEDI]} H2_AONR := TEMP[H2_AO]; O2_AONR := TEMP[O2_AO]; END; init_status; STATUS.RECP_END := 0; REPEAT WRITELN('':20,'JOB SELECTION'); WRITELN; WRITEASE}; WRITELN('TYPE OF CONTROL: '); WRITELN(' (1) ignore'); WRITELN(' (2) abort'); WRITELN(' (3) alarm'); WRITELN(' (4) hold'); WRITELN(' (5) time reset'); WRITELN(' (6) buzzer');LN('(X) EXIT'); WRITELN('(1) RECIPE EDITOR'); WRITELN('(2) LOAD A RECIPE'); WRITELN('(3) DISPLAY STATUS'); WRITELN('(4) CHANGE STATUS'); WRITELN('(5) CHANGE JOBNUMBER'); WRITELN('(6) RESET'); W CHOICE := GETCHOICE; CASE CHOICE OF '0' : ; '1' : CONTROL := IGNORE; '2' : CONTROL := ABORT; '3' : CONTROL := ALARM; '4' : CONTROL := HOLD; '5' : CONTROL := TIMERESERITELN('(7) START'); WRITELN('(8) HOLD '); WRITELN('(9) MAINTENANCE MODE'); CHOICE:= getchoice; clearscreen; CASE CHOICE OF 'X' : ; '0' : ;{realtimeIRQ} '1' : ;{CHAIN RECIPE EDITORoperator panel} END; {WITH} END; {runtime} PROCEDURE realtimeIRQ; BEGIN REPEAT WRITELN('enter to simulate the timer interrupt'); READLN; runtime; UNTIL (STATUS.PROCSTATUS = FINISH); END; {realtimeIRQ} PROCEDURE start_proc; VARARM := AIPREALARM - [AINR]; AIALARM1 := AIALARM1 - [AINR]; AIALARM2 := AIALARM2 - [AINR]; END; {IF} END; {WITH} END; {alabtest} PROCEDURE inputtest; VAR OLDIOSET : SETTYPE; NR ,INDEXNUMBER : INTEGER; ALARM NR,VALUE,X,COUNT, COUNT1 : INTEGER; CH : CHAR; BEGIN WITH STATUS DO IF (PROCSTATUS = RSET) AND (RECP_END <> 0) THEN BEGIN move_halfspeed; disp_status(FALSE); STEPSTATUS := PRERUN; realtimeIRQ; END STATUS : BOOLEAN; ALCONTR : DICONTROL; BEGIN OLDIOSET := STATUS.IOSET; INDEXNUMBER := STATUS.INDEXNR; FOR NR := 1 TO MAXDINR DO BEGIN WITH SYSTEMENTRY^.DILIST[NR] DO BEGIN IF (NR + OFF1) IN RECIPE[INDEXNUMBER].STEP.IOSET THE ELSE IF (PROCSTATUS = EXECUTE) AND (STEPSTATUS = HLD) THEN STEPSTATUS := RUN ELSE IF PROCSTATUS <> RSET THEN WRITELN('process status is not reset') ELSE WRITELN ('no recipe loaded'); END; {start_Rx@4     00000000003#DfR^Id#DSTEP0 33TTSTEP1 STEP0 33TTSTEP1 T; '6' : CONTROL := BUZZER; OTHERWISE: ERROR(1) END {CASE}; WRITE('LINK WITH DO NUMBER: '); PROMPT(OUTPUT); NUMBER := READINT(DOLINK); IF NUMBER IN [0..MAXDONR] THEN DOLINK :=MAN,TEMP_AI,PREF_AO,H2_AO,O2_AO); LATHE_TYPE = (L_AUTO_MAN,SPEED_AO,INLETSWITCH,EXHAUSTSWITCH); NAMETYPE= ARRAY[1..NAMELENGTH] OF CHAR;  NUMBER ELSE ERROR(5) {NR TOO LARGE} END {WITH} END {change_DI}; $SUBTITLE CHANGE THE DIGITAL OUTPUTS IN THE SYSTEMFILE PROCEDURE DO_change(VAR PORTNR :INTEGER); VAR INPUTSTRING : MAXSTRING; CHANGE : BOOLEAN; CHOICE : CHAR; NU IF INTERLOCK <> 0 THEN SYSTEMENTRY^.DOLIST[INTERLOCK].INTERLOCK := 0; INTERLOCK := NUMBER; END {0}; 1..MAXDONR : BEGIN IF NUMBER <> PORTNR THEN MBER : INTEGER; BEGIN WITH SYSTEMENTRY^.DOLIST[PORTNR] DO BEGIN WRITE('NAME: '); PROMPT(OUTPUT); READSTRING(INPUTSTRING,CHANGE); IF CHANGE THEN NAME[1 FOR NAMELENGTH] := INPUTSTRING[1 FOR NAMELENGTH];  BEGIN INTERLOCK := NUMBER; SYSTEMENTRY^.DOLIST[INTERLOCK].INTERLOCK := PORTNR {INFO RECORDED BY BOTH DO'S} END {IF} ELSE ERROR(1)  WRITELN('TYPE OF DIGITAL OUTPUT: '); WRITELN(' (1) normally closed'); WRITELN(' (2) normally open'); CHOICE := GETCHOICE; CASE CHOICE OF '0' : ; '1' : CONTROL := NORMAL;  END {1..MAXDONR}; OTHERWISE : ERROR(5); {NR TOO LARGE} END; {CASE} WRITE('CONDITIONAL INTERLOCK WITH DO NUMBER: '); PROMPT(OUTPUT); NUMBER := READINT(CONDLOCK); IF (NUMBER IN [0..MAXDONR]) AND (NU '2' : CONTROL := INVERTED; OTHERWISE: ERROR(1) END {CASE}; WRITE('INTERLOCK WITH DO NUMBER: '); PROMPT(OUTPUT); NUMBER := READINT(INTERLOCK); CASE NUMBER OF 0 : BEGIN MBER <> PORTNR) THEN CONDLOCK := NUMBER ELSE ERROR(5) {NR TOO LARGE} END {WITH} END; {change_DO} $SUBTITLE CHANGE THE TEMPERATURE CONTROL DEFINITIONS PROCEDURE TEMP_change; VAR NUMBER : INTEGER; BEGIN WITH SYSTEMENTRY^ DO 5      BEGIN WRITE('auto/manual switch is DI: '); PROMPT(OUTPUT); NUMBER := READINT(TEMP [T_AUTO_MAN]); IF NUMBER IN [0..MAXDINR] THEN TEMP [T_AUTO_MAN] := NUMBER; WRITE('flame sensor is DI: '); PROMPT(OUTPUT); RR RZ.RRQPROEFindex.PROEFDEMϱ9index.DEMϱAPROE?index.PROEHGETCHOIC2GETCHAR  GETANSWE$READINT  :READREALKREADSTRIF { ERROR  pSTARS  ) CLEARSCR   AI_AO_DI4&WTESTRUindex.TESTRUTESTRUNnindex.TESTRUNRUNTIMEindex.RUNTIMENTESTRUNindex.TESTRUN AI_DISPLt AO_DISPL` DI_DISPLL DO_DISPL` TEMP_DISLATHE_DIPRINT_AI^PRINT_AO_PRINT_DI EPRINT_DO!"index.LJYindex.LJpSPRINT_TE#.$!PRINT_LA%&&PRINTSYS'%I*AI_DELET+g,AO_DELET-^.DI_DELET/ ,0 DO_DELET1 R2 TEMP_DEL3 &4LATHE_DE4 &5CREATE_S5 w6AI_CHANG688AO_CHANG::= DI_CHANG>8@!DO_CHANGA8C"TEMP_CHAD'7F#LATHE_CHG'H$EDITENTRI %M%CONFIGURP =Q is DI: '); PROMPT(OUTPUT);  NUMBER := READINT(TEMP [FLAME_DI]); IF NUMBER IN [0..MAXDINR] THEN TEMP [FLAME_DI] := NUMBER; WRITE('flame ignition is DO: '); PROMPT(OUTPUT); NUMBER := READINT(TEMP [LITFLAME]); IF NUMBER IN [0..MAXDONR] THEN TEMP [LITFLAME] := NUMBER; WRITE('temperature control is AI: '); PROMPT(OUTPUT); NUMBER := READINT(TEMP [TEMP_AI]); IF NUMBER IN [0..MAXAINR] THEN TEMP [TEMP_AI] := NUMBER; WRITE('preform temperature is AO: '); 6      PROMPT(OUTPUT); NUMBER := READINT(TEMP [PREF_AO]); IF NUMBER IN [0..MAXAONR] THEN TEMP [PREF_AO] := NUMBER; WRITE('hydrogen burner is AO: '); PROMPT(OUTPUT); NUMBER := READINT(TEMP [H2_AO]); IF NUMBER 3 ,R6,S,Tґ,UO$ҋ1B,V,Wyu Q,Xyp*,YxF',Z,[uy,\u y,]҅,^,_,`x61QF,a9 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>IN [0..MAXAONR] THEN TEMP [H2_AO] := NUMBER; WRITE('oxigen burner is AO: '); PROMPT(OUTPUT); NUMBER := READINT(TEMP [O2_AO]); IF NUMBER IN [0..MAXAONR] THEN TEMP [O2_AO] := NUMBER; END {WITH} END; {TEMP_change} PROCED3 ,i6,j,kґ,lO$ҋ1B,myu Qyu yQ,nyuQ*,oxF҅,px61QF,q9 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3,D,@11D,@ 11D, @6#6#11D,!@@11Dq,"@V6*6*11D^,#@6&6&16F1 1DE,$@636311D2,%@ܕ1,&1DAFE>Zk|,'&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> FOR I := 1 TO MAXDONR DO DO_delete(I); TEMP_delete; LATHE_delete; END;{create_SF} $SUBTITLE CHANGE ANALOG INPUTS PROCEDURE AI_change(VAR PORTNR : INTEGER); VAR INPUTSTRING : MAXSTRING; CHANGE : BOOLEAN; CHOICE : CHAR; NUMBER : INTEGEINPUT ERRORENTRY TOO LARGEnew value exceeds the maximum valueINPUT IS NOT A NUMBERmax. time is 8 hrs, 59 minutes, 59 secondsmax. number of steps in a blockstep isno spaces in name allowed; first char. not a numberERRORR; BEGIN WITH SYSTEMENTRY^.AILIST[PORTNR] DO BEGIN WRITE('NAME: '); PROMPT(OUTPUT); READSTRING(INPUTSTRING,CHANGE); IF CHANGE THEN NAME[1 FOR NAMELENGTH] := INPUTSTRING[1 FOR NAMELENGTH]; WRITE('MA3,,1,-6KeF=*1aF#D,.1,/1,0$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>XIMUM VALUE: '); PROMPT(OUTPUT); SCALE := READREAL(SCALE); WRITE('UNIT: '); PROMPT(OUTPUT); READSTRING(INPUTSTRING,CHANGE); IF CHANGE THEN UNIT[1 FOR UNITLENGTH] := INPUTSTRING[1 FOR UNITLENGTH]; 3,5+5,641=X11,7$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> WRITELN('TYPE OF LOOP:'); WRITELN(' (1) setpoint control'); WRITELN(' (2) AI switches DO if below setpoint'); WRITELN(' (3) AI switches DO if above setpoint'); WRITELN(' (4) AI only'); CHOICE := GETC3 ,<+5,=41=@11,>$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>HOICE; CASE CHOICE OF '0' : ; '1' : LOOP := SETPOINT; '2' : LOOP := AIDOBELOW; '3' : LOOP := AIDOABOVE; '4' : LOOP := AIONLY; OTHERWISE: ERROR(1) END; {CASE} WRITELN3 ,D,E61eF0,FO$ԋ1B,GyYF,HyaF#D,I,J$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>('TYPE OF CONTROL:'); WRITELN(' (1) don''t care'); WRITELN(' (2) bandlimit'); WRITELN(' (3) upper limit'); WRITELN(' (4) lower limit'); CHOICE := GETCHOICE; CASE CHOICE OF '0' : ; 7      RqHIGH LOW3 ,w2 @W *,x9 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3,M,,,,2"N=0.+,6<,,,ۚ,ۚ q,2"N=.,2"N=0.+,2"N=0.+,ݚ,ݚ q,2"N=.,2"N=0.+,2"N=0.+,21,&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>XXXXXXXXXX3,,,PDA,@1DI,@1D;,@ 1D-,@1D,D,AFE>,,$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3,}@6%6%1,~1,Oh20,4F,Oh"Nx=LPOh"Nx=PP*,&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>IDLEEXECUTERESETFINISHEDenter LP for a hardcopy, to exit3,,,RD],@1Di,@1D[,@ 1DM,@1D?,@1D1,@1D#,D,AFE>,,$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3,,,,,O֋ "B,,8 20 ,4Fm,,)zO֋ "By0r,ޚ1v1J 1,ԑ,ԓQF,,1,,,D@1,,,֑,6 YF[,1,1,$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>PRERUNRUNHOLDALARMABORTBUZZER3,2222221),@1ܑ1 =/1ڑ1 =/1ؑ1 @1,֚aF=01֑1 =.1D ֒1 =.1, ԚaF=01ԑ1 =.1D Ԓ1 =.1, ҚaF=01ґ1 DҒ1 , $>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3,,,,Oԋ"B,,8 20 ,4Fl,,6 F,2,@7D2@7,ۚ121,ґ,ғQF,,1,,,D@ 1,,,ԑ,ԨYF],1,$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>date: time: 8     3,4FL,,@@1,0,1,@1@11,1,0,1,,D0,,,PUF$, ,!Oc1,"@.1Oo1,#,$P F&,%,&@31T1 Oy1,'0,(,)RF,*1,+0,,VQF$,-,.@81@91,/>>3,,,M Б,ғ1/,,9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>^0,0,11,21,30,41,50,64F%,7,80,91,:@N@U1,;=5,<,=,>,?,@,A%>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3,,, s ,6_QF,D,queF<,,,M,(2By11,օ,uaF#D,,,queF%,Oҋ"By0uaF#D,&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>/P1 OUTPUT OPTICAL FIBERS STATUS DISPLAYJOB:STEPremaining steptime: /TERM OUTPUT 3,,,}P,}R,6}T,}X,}Z,eF,Oҋ"BaF#D, ,}, C, c,ˆ ,È ,,6/0,Ɛ},ǐ},Ȑ},ɐ},ʐ},ː},$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3,H,I,J@1Oo11,K@1@$1,L1,MOh20,N4F6,OeF),POoӋ "NOhӋF"NxaF#D,Q,R$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3,ӑeF,Orԋ"B!,yUyUF,,Oy "By ,y6/,֐Qw ҃ ,֑Qw ҃ *5,4F,,,݃ y6/y6_ ,ޖ},,aF#D=,9 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>current job number:new job number:3,eFH,Orҋ"B!,yUF, y6/y6_ aF#D,$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3,[P F,\,],^@1,_1,`20,atF',b,c2"Nx.*5,d,eD=5,f4F0,g4F,h2"N@7 ,i2"N@#7,jq}q{u}u{eF~,k,lOcu} "N2u}F"Nx,m2u}"N2u}F"Nx,n2u} "N>>3,\,Oҋ1B,ƖaFZ,,ƐQF%,,},Oú"B,,DL,,},JrƋ"BByr,Oú"Bv,,,QF,,Oú"By},,Ƒ},ƖaF#,JrƋ"BBy,U*5D>>2u}F"Nx,ou}u{aF u}#q}D,pO2@51#,qO2@?1#,rOɐ 1,sO 1,tO1,uq},vO1F,w@I1,x1DQ,y,zO1F2,{,|O1,}Ou}1BO7,~u}q},D,,(0 }a,,PQF=0,,D @_6!6!11,$>>=5, 4FJ, , JrƋ"BBy}, JrƋ"BBy,  ~,,4ƕYFm,,Oú"By0,,$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>enter name of recipe: /D1/RECIPE//D1/RECIPE/index.RECIPERE INDEX recipe does not existnot allowed; a process is running3,M,Oú"B҅,},0,$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>9     3,%,&,'T}T,(TXZQ*5,) s ,*4FC,+,,OVTOZ220 ,-4FT,.}TDT}X,/4TaYF,0}\,1,244F,3,4Oߋ1Bq,5,6Oyu7 ,7OuJ 7 ,8u{ R ,9VQF,:,;uy}^DA,<,=},>,?>3!,M,M,eF,,,Mؑ,,,(y11,ԑ,֐QԐQF,֐QF!,,O"B(y11,,D O"B,aF#D,,$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> file') ELSE BEGIN GET (SYSTEMENTRY); WITH SYSTEMENTRY^ DO BEGIN SPEEDNR := LATHE[SPEED_AO]; INLETDI := LATHE[INLETSWITCH]; EXHAUSTDI := LATHE[EXHAUSTSWITCH]; END; init_status; STATUS.RECP_END := 0;3",Di,@11Dn,@11D],@11DL,@11D;,@11D*,@11D,E,&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> RIGNOREBUZZERHOLDALARMABORTTIME RESET0000000000XXX3#,,6 eF,,O֋ "B,,y,y,,,ؔQF8,O֋ "BOҋ"ByO֋ "B,yD?,,O֋ "BOԋ "ByO֋ "By,ԑ,,aF#D?,$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>XXXRAMPTEST 3 XXXXXXXXXX3$,ԑ6 eFG,,,Oҋ "ByUF,,Oҋ "ByDY,,=5,=5,DU,,Oҋ "By,OBJ ҋ "ByY*5,Oҋ "By,OBҋ "ByY*5,D,,Oҋ "By,OBJ ҋ "ByY*5>>>uJ "By},@Oú"Buy,A,B,C,DOߋ1BxF,ETZ}a,F,G,H,I,JVQF6,KqueF%,LM F,M,N},OX2220 ,P4F,Q,RTX,SO1B׋F"By,TO݋"BՅ,UOr>>>>>,Oҋ "By,OBҋ "ByY*5,D,,Oҋ "By,OBJ ҋ "ByY*5,Oҋ "By,OBҋ "ByY*5,D,E> ,OBJJҋ "By,OBJ@ҋ "By,,,4>"B!y,VِUF},W,XOً "By q,YՐYu͐Q,ZՐQu͑Q*5,[4F,\ 6/6_,] D,^ 6/6_ ,_,`,auaF#D,b,c,d,e,f,gw 0,h,i6_0,j$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>҃ F,D,,҃ cFP,,  , c c,@1Ҕ1 @1,؋0",,D,,4҃ cF,Dy,,҃ CFP,, c c, C C,@1Ҕ1 @1, ڋ0", , D, C C, >>>3 ,u,v,ws ,x,y,zM,{2B(y11,|,}M,~2ґB(y11,,,queFP,,6w F, 6, D, 6, uaF#D,,$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,,,44F6,, C C, c c,  ,,aF#D,$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>:     AIAI ANSWER := getanswer; CASE ANSWER OF 'C' : BEGIN AI_change(PORTSELECT); WRITELN(CAA,CAI); AI_display(PORTSELECT) 3%, s , \q,!qܨquueFE,",#Ou܋"Bq,$,%u6Ouދ1B{ RFY,&,',(uy QF,)u6,* *5D,+u6 *5,,uy q,-,.D=5,/,0,1,24u܃ F,3DW,4,5uw FE,6,7>>XXXXXXXXXXSTEP5  u ,8@1uܔ1 @1,9uً0",:,;,<4F,= u ,>,?uuaF u#qD,@$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>DI R,3&,J,K,LOBy6 *|,MO‹"By Q*|,N,O,PF6,Q *|D6 *|,R,SP F,T,UF,V,W,X,Y Or"B!y6_,ZOr"B!y6_,[Or"B!y6_,\Or"B!y6_,]> END; {LATHE_change} $SUBTITLE EDIT SYSTEM FILE ENTRIES PROCEDURE EDITENTRY; {SYSTEMFILE IS GLOBAL} VAR MAX : INTEGER; TYPESELECT,PORTSELECT :INTEGER; IOPORT : ARRAY[1..2] OF CHAR; ANSWER : CHAR; BEGIN REPEAT clearscreen; AI_AO_D END; TEMPCONTROL = ARRAY[T_AUTO_MAN..O2_AO] OF INTEGER; LATHECONTROL = ARRAY[L_AUTO_MAN..EXHAUSTSWITCH] OF INTEGER; SYSTEM = RECORD AILIST : ARRAY[1..MAXAINR] OI_DO (TYPESELECT, IOPORT); IF TYPESELECT IN [1..4] THEN REPEAT WRITELN; WRITE('enter ',IOPORT,' number or to exit: '); PROMPT(OUTPUT); PORTSELECT := 0; PORTSELECT := READINT(PORTSELECSTEP 3 TEMP : TEMPCONTROL; T); clearscreen; CASE TYPESELECT OF 0 : ; 1 : IF PORTSELECT IN [1..MAXAINR] THEN BEGIN WRITELN(CAA,CAI); AI_display(PORTSELECT);  IF SYSTEM IS IDLE} '2' : load_recipe; '3' : BEGIN clearscreen; disp_status(FALSE); bottomline(OK); IF OK THEN disp_status(OK); END; ;      '4' : {chng_status}; '5' : chng_jobnr; '6' : reset_proc; '7' : start_proc; '8' : hold_step; '9' : {maintenance}; OTHERWISE : ERROR(1) END {CASE}; UNTIL CHOICE = 'X'; E) IN IOSET; 5985 IF NEWSTEP THEN DEPOSITION := FALSE; 5990 END; 5995 END; {IF} 6000 {* check if at end of recipe} 6005 IF (RECP_END = CURRENTSTEP) AND NEWSTEP THEN 6010 BEGIN 6015 PROCSTATUS := FINISH; 6020 STEPSTATUS := PND {ELSE} END. {runtime} TATUS = EXECUTE THEN 5700 BEGIN 5705 STEPSTATUS := HLD; 5710 WRITELN('hold done'); 5715 END {IF} 5720 ELSE 5725 BEGIN 5730 WRITELN('hold is only allowed when process is running'); 5735 RERUN; 6025 {stop the lathe ?} 6030 END; 6035 {* not at end of recipe} 6040 IF NEWSTEP AND (PROCSTATUS <> FINISH) THEN 6045 BEGIN 6050 IF (STEPINDEX = TIMED_STEP) THEN 6055 STEPSTATUS := PRERUN; 6060 nextstep; 6065 TIMERSOFT : WRITE('process status is:'); 5740 disp_procstatus; 5745 WRITELN; 5750 END; {ELSE} 5755 END; {WITH} 5760 END; 5765 PROCEDURE execstep; 5770 VAR NEWSTEP : BOOLEAN; 5775 5780 BEGIN 5785 IF TIMERDELAY <> 0 THEN 5790 TIMERDE= SOFTCOUNT; 6070 TIMERDELAY := DELAYCOUNT; 6075 IF {new} (STEPINDEX = TIMED_STEP) THEN 6080 STEPSTATUS := RUN; 6085 END; {IF} 6090 {* check for switch from prerun to run} 6095 IF (STEPSTATUS = PRERUN) AND ((EXHAUSTDI +OFF1) IN IOSET LAY := TIMERDELAY -1; 5795 IF TIMERDELAY = 0 THEN 5800 BEGIN 5805 difference; 5810 ALABtest; 5815 INPUTtest; 5820 END; {IF} 5825 IF TIMERSOFT <> 0 THEN 5830 TIMERSOFT := TIMERSOFT -1; 5835 IF TIMERSOFT = 0 THEN 5840 BEGIN 58THEN 6100 BEGIN 6105 STEPSTATUS := RUN; 6110 DEPOSIT := FALSE; 6115 END; {IF} 6118 END; {WITH} 6120 END; {execstep} 6125 6130 PROCEDURE runtime; 6135 {checks digital and analog inputs and takes action 6140 -decounts timers + action at end 45 clearsoft; 5850 setDOAO(OFF3); 5855 END; {IF} 5856 WITH STATUS DO 5857 BEGIN 5860 IF (TIMEREMAIN <> 0) AND (STEPTYPE = TIMED_STEP) THEN 5865 TIMEREMAIN := TIMEREMAIN -1 5870 ELSE 5875 BEGIN 5880 {* check change to deposit settof step, softstarts, delays 6145 -switches from fast forward to deposit at exhaust switch 6150 -test if step and process is finished } 6155 6160 BEGIN 6165 {WHOLESEC := NOT WHOLESEC;} 6170 {IF WHOLESEC DO} 6175 WITH STATUS DO 6180 BEGIN 6185 geing of outputs in event, block step} 5885 IF ((INLETDI + OFF1) IN IOSET) AND (NOT DEPOSITION) THEN 5890 BEGIN 5895 VALUE := AOLIST[SPEEDNR]; 5900 AOLIST[SPEEDNR] := NEXTSPEED; 5905 NEXTSPEED := VALUE; 5910 setAOstat(SPEEtDIstat; 6190 getAIstat; 6195 IF (STEPSTATUS = PRERUN) AND (PROCSTATUS = RSET) AND 6200 ((EXHAUSTDI + OFF1) IN IOSET) THEN 6205 BEGIN 6210 PROCSTATUS := EXECUTE; 6215 STEPSTATUS := RUN; 6220 DEPOSITION := FALSDNR,AOLIST[SPEEDNR]); 5915 setDOAO(OFF2); 5920 DEPOSITION := TRUE; 5925 END; {IF} 5930 IF DEPOSIT THEN 5935 speedramp; 5940 END; {ELSE} 5945 {* check end of step criteria} 5950 IF (PROCSTATUS <> FINISH) AND (STEPSTATUS IN [E; 6225 END;{IF} 6230 CASE PROCSTATUS OF 6235 IDLE : ; {no special action} 6236 RSET : 6240 {The H2, O2 valves are opened and flame ignition turned on. 6245 After 6 seconds the softstarts are cleared. 6250 After 9 seconds the flame sensor is beinRUN,BUZZER]) THEN 5955 BEGIN 5960 IF (STEPTYPE = TIMED_STEP) THEN 5965 NEWSTEP := ((TIMEREMAIN = 0) AND (STEPSTATUS = RUN)) 5970 ELSE {BLOCKSTEP, EVENTSTEP} 5975 BEGIN 5980 NEWSTEP := DEPOSITION AND ((EXHAUSTDI+OFF1) + OFF1g checked. The flame should be 6255 on, otherwise the valves are closed again and processstatus returns to 6260 idle. 6265 As long as the system in reset the flame is monitored, together with H2, 6270 O2 setpoints. } er 9 seconds the flame sensor is bein<      ,^6_0,_},`,aF,b@6!6!1,c1D}P,d,eD-,f,g@"666611,h@Y1,i0,j1,k,l$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>,QFX,,,, Or"B!y6_, Or"B!y6_ , 6_0, }P, ,,,D%,,,0(D,E>,,=0,,,$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>temperature control not in MANUALreset is only allowed when process is idle or finishedprocess status is:3*,,@6*6*11,1 , 0),!PQF,"$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3',q,r,sPQF!,t,u}R,v@11,w,xD-,y,z@ 6,6,11,{@71,|0,}1,~,,$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>enter to simulate the timer interrupthold donehold is only allowed when process is runningprocess status is:3+,),*PQaUF',+,,0,-=0,.}R,/0*,0,1DH,2PQRQF ,3,4}RD*,5PUF,6@1,71D @11,8$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3(,UF ,},QF,,0#,0$,0%,,UF ,},QF,,0,6_0,,,,^UVQF,^,}^D,,,6 `F],,Oú"By,Oú"BDž,},Oú"By0,>process status is not resetno recipe loaded6/0,=|`,,`F,0,,,PUR"FO,,VQF,^QRQ,*5D',,`6 *5,4F=|`,,,,aTQ4F,,}P,}R,,,,4PUFA,,VQF,}R,0,–},ä},āVQF,ő}R>>>3,=M "q=pqM,q=p#qMq=pؐq0,>0,?@1@11,@0,AO=1%,BO@@&1,C(O1"},DO=1%,EMQF,F@01,G1D<,H,IO1,J,K,LO By},MO By},NO By},O},POBy},Q>,,,ȁRQ6 F,,ʑ}R,=|`,,,$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>OBy},R,S0,T}a,U,V@F1@G11,W1,X@U11,Y@_11,Z@r11,[@11,\@11,]@11,^@š11,_@͚11,`@ؚ11,a@㥥11,b'0|,c0,d.D,eD,fD,gD,h0D>>>3),,,0 ,0!,݁RQPQ,޶6 F,,}P,}R,=|`,,PD+,D8,,,,,,,,,,UF=,,},QF,,},0,6_0,,,D,,YF0,,},QF,,,,6_0,,>,i,j0,k=0,l?0,mF*0,nD,oD,p0D,q0&D,r0+D~,s0'Du,tDo,u,v0DbA0XF60E)ou{i,w=XPFI,x,y111->>>>>>>>>>>>>>>=      OPTICAL FIBERS CONTROL/D1/SYSTEM SYSTEMEN no configuration fileJOB SELECTION(X) EXIT(1) RECIPE EDITOR(2) LOAD A RECIPE(3) DISPLAY STATUS(4) CHANGE STATUS(5) CHANGE JOBNUMBER(6) RESET(7) START(8) HOLD (9) MAINTENANCE MODE362q=56 q2@@1212Α"Nx= T*xFBq62quueF/u2"N2u2"NxuuaF u#qD219>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>M) PRUNTIME 6REAL_VALMGETCHOIC 1GETCHAR  mREADINT Z READSTRI ERROR  8 STARS /TERM F    CLEARSCR   CURSORHO  NFINDENDS,SEARCHSTiSEARCHFU  NAMECHECK&BOTTOMLIDISP_AIS3Db@11Dp@ 11Db@11DT@111DF@G11D8@_11D*@j11DAFE>&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  DISP_DISDISPTIMEoDISP_PRO#DISP_STP DISP_SYS)d!_DISP_STA"#%CHNG_JOB$)&LOAD_RECINPUT ERRORNUMBER TOO LARGETOO MANY CHARACTERSINPUT IS NOT A NUMBERNUMBER < 0 OR TOO LARGENUMBER < 0ERROR'&(SETAOSTA(*')SETDOAO )'*INIT_STA* G+SETSOFT +G[,CLEARSOF, .SPEEDRAM. ./MOVE_HAL/632NEXTSTEP316KeF=*1aF#D11$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>2(G3GETDISTA34GETAISTA45*PROCESSA6 7DIFFEREN7 G[;ALABTEST<+Gv>INPUTTES?GvAlRESET_PRBhCJHOLD_STE3 +541=X11$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>D'8GEXECSTEPGEIRUNTIME I0J+REALTIMEK L-START_PR3 @60601@111@E112204FАDё"N2Α"N72Α"Nx54.DБDHГDBЕD<ЖD6AT6AE>ђ"Nx=OPyFy9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>3vr11F+=1%21 1 (1"ҐUF 1 vr=1%Dvrvr 9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>choose AO, AI, DO, DI, TC (temperature control), LC (lathe control)or to exit: >     3 Oy "By1 Ҝ1z1J 1yD,@1D3@1D(@"1D@31DEyD,@D1D4@P1D)@\1D@h1DE>y1 1&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>YPESELECT OF 0 : ; 5 : BEGIN TEMP_display; ANSWER := getanswer; CASE ANSWER OF 'C' : TEMP_change; 'D' : TEMP_delete; AI only setpoint controlAI sets DO if < AI sets DO if > don't care band limit upper limitlower limit '0' : ; OTHERWISE: ERROR(1) END {ANSWER}; END; {5} 6 : BEGIN LATHE_display; ANSWER := getanswer; CASE ANSWER OF '3 OSy"B!y1 Ҝ1z1J 1y1 y1 y1 y1 z11&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>C' : LATHE_change; 'D' : LATHE_delete; '0' : ; OTHERWISE: ERROR(1) END {ANSWER}; END {6} END {CASE} UNTIL TYPESELECT = 0 END {EDITENTRY}; $SUBT3 Ocy"By1 Ҝ1y D@1D@1DEy DB@ 1DN@1DC@ 1D8@+1D-@61D"@A1DE>y1 1&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ITLE START OF MAIN PROGRAM BEGIN {CONFIGURATOR} IOABORT (SYSTEMENTRY,FALSE); clearscreen; RESET (SYSTEMENTRY,'/D1/SYSTEM'); IOERROR := IORESULT(SYSTEMENTRY); IOABORT (SYSTEMENTRY,TRUE); IF (IOERROR = 216) THEN create_SF ELSE GET (SYSTEMENTlow highignore abort alarm hold time resetbuzzer RY); REPEAT clearscreen; WRITELN('SYSTEM FILE EDITOR PROGRAM'); WRITELN; WRITELN('(0) exit'); WRITELN('(1) change/delete an entry'); WRITELN('(2) print systemfile'); CHOICE := getchoice; CASE CHOICE OF '0'3Oy "By1 Ҝ1y D@1D@1DEy 1 y1 1&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>: ; '1': editentry; '2': printsystem; OTHERWISE: error(1) {INPUTERROR} END {CHOICE}; UNTIL CHOICE = '0'; REWRITE(SYSTEMENTRY,'/D1/SYSTEM'); PUT(SYSTEMENTRY); clearscreen; END. {CONFIGURATOR} E CHOICE OF '0'normally closednormally open  RW20t| 'D' : DO_DELETE(PORTSELECT); '0' : ; OTHERWISE: ERROR(1) END {ANSWER}; END {4} END {CASE} UNTIL PORTSELECT = 0 ELSE CASE T3@1?By1 1@1@/1?By1 1@01@F1?By1 1@G1?By1 1@b1?By1 1@}1@1?By1 1@1@1?By1 1$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>?     auto/manual switch is DI:flame sensor is DI:flame ignition is DO:temperature control is AI:preform temperature is AO:Hydrogen burner is AO:Oxigen burner is AO:SPRINT_TE$I%!PRINT_LA&;'PRINTSYS(%L,AI_DELET-.AO_DELET/0DI_DELET1 D2 DO_DELET3 p4 TEMP_DEL5 86LATHE_DE6 87CREATE_S7 3@1@1?By1 1@1?By1 1@;1?By1 1@[1@t1?By1 1@u1@1?By1 1$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>8AI_CHANG88;AO_CHANG=:A DI_CHANGB8#E!DO_CHANGF8`I"TEMP_CHAJ'L#LATHE_CHM')O$EDITENTRP %V%CONFIGURY =,[TYPE; 4460 BEGIN 4465 WITH SYSTEMauto/manual switch is DI:End switch gasinlet side is DI:End switch exhaust side is DI: Lathe translation is AO:Lathe rotation is AO: END; {C} 'D' : AI_delete(PORTSELECT); '0' : ; OTHERWISE: ERROR(1) END {ANSWER} END {1}; 2 : IF PORT30@1@110@6#6#1@36*6*11u u u y20 ґu u y4u y6;QF1u uYFʰ111u u y9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>SELECT IN [1..MAXAONR] THEN BEGIN WRITELN(CAA,CAO); AO_display(PORTSELECT); ANSWER := getanswer; CASE ANSWER OF 'C' : BEGIN ANALOG INPUTSNR NAME MAX. VALUE UNIT TYPE OF LOOP TYPE OF CONTROL DOLINK AO_change (PORTSELECT); WRITELN(CAA,CAO); AO_display(PORTSELECT); END; {C} 'D' : AO_delete (PORTSELECT); 30@1@110@6#6#1@46*6*11u u u y20 ґu u y4u y6;QF1u uYFʰ111u u y9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> '0' : ; OTHERWISE: ERROR(1) END {ANSWER}; END {2}; 3 : IF PORTSELECT IN [1..MAXDINR] THEN BEGIN WRITELN(CDI); ANALOG OUTPUTSNR NAME MAX. VALUE UNIT AI-LINK DO-LINK SOFTST RATIOLINK RATIO30@1@110@646411u u u y20 ґu u y4u y6;QF1u uYFʰ111u u y9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> AI_DISPLt AO_DISPLr DI_DISPLL DO_DISPL TEMP_DISLATHE_DIPRINT_AI^PRINT_AO_PRINT_DI !EPRINT_DO"#DIGITAL INPUTSNR NAME SAFE STATE TYPE OF CONTROL DO-LINK@     30@1@110@6A6A11u u u y20ґu u y4u y6;QF1u uYFʰ111u u y9>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> END {3}; 4 : IF PORTSELECT IN [1..MAXDONR] THEN BEGIN WRITELN(CDO); DO_DISPLAY(PORTSELECT); ANSWER := getanswer; CASE ANSWDIGITAL OUTPUTSNR NAME TYPE OF DO INTERLOCK CONDITIONAL INTERLOCKER OF 'C' : BEGIN DO_change (PORTSELECT); WRITELN(CDO); DO_display(PORTSELECT); END; {C} 34F10@1@1100119>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> RATIOLINK : 0..MAXAONR; RATIOVALUE : REAL END; DI = RECORD NAME : NAMETYPE; SAFE : SAFESTATE; CONTROL : DICONTROL; TEMPERATURE CONTROL ASSIGNMENTS DOLINK : 0..MAXDONR END; DOUT = RECORD NAME : NAMETYPE; CONTROL : DOCONTROL; INTERLOCK : 0..MAXDONR; CONDLOCK : 0..MAXDONR 30@1@1100119>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> END; TEMPCONTROL = ARRAY[T_AUTO_MAN..O2_AO] OF INTEGER; LATHECONTROL = ARRAY[L_AUTO_MAN..EXHAUSTSWITCH] OF INTEGER; SYSTEM = RECORD AILIST : ARRAY[1..MAXAINR] OF AI; AOLIST : ARRAY[LATHE CONTROL ASSIGNMENTS1..MAXAONR] OF AO; DILIST : ARRAY[1..MAXDINR] OF DI; DOLIST : ARRAY[1..MAXDONR] OF DOUT; TEMP : TEMPCONTROL; LATHE : LATHECONTROL;  DI_DISPLAY(PORTSELECT); ANSWER := getanswer; CASE ANSWER OF 'C' : BEGIN DI_change (PORTSELECT); WRITELN(CDI);  END; MAXSTRING = ARRAY[1..MAXLENGTH] OF CHAR; IOPORTTYPE= ARRAY[1..2] OF CHAR; RCD_INDEX = (NOT_ALLOCATED,RCD_DONTCARE,RCD_1HEADER,RCD_2HEADER, TIMED_STEP, EVENT_STEP, BLOCK_STEP, RCD_TABLE, RCD_FUNCTION); I DI_display(PORTSELECT); END; {C} 'D' : DI_DELETE(PORTSELECT); '0' : ; OTHERWISE: ERROR(1) END {ANSWER}; NDEXDEF = RECORD DESCRIPTOR : RCD_INDEX; STARTSTEPNR : INTEGER; END_OR_AONR : INTEGER; END; INDEXLIST = ARRAY[0..MAXRECORD] OF INDEXDEF; HEAD1 = RECORD JOBNR : AA     RRAY[1..JOBLENGTH] OF CHAR; ALARMVAL : ARRAY[1..MAXAINR] OF INTEGER; ALARMCONTROL: ARRAY[1..MAXAINR] OF DICONTROL; END; HEAD2 = RECORD ABORTVAL : ARRAY[1..MAXAINR] OF INTEGER; PROCSTAT : PROCESSSTATUS; CURRENTSTEP: INTEGER; STEPTYPE : RCD_INDEX; STARTSTEP: INTEGER; TOTSTEP : INTEGER; TIMEREMAIN: INTEGER; RECIPENAME : ARRAY [1..12] OF CHAR; J ABORTCONTROL: ARRAY[1..MAXAINR] OF DICONTROL; LATHE_LENGTH : INTEGER; {CM} TUBE_WEIGHT : REAL; {KG} TUBE_DIAMETER: REAL; {MM} END; OBNR : ARRAY [1..10] OF CHAR; STEPNAME : ARRAY [1..10] OF CHAR; AILIST : ARRAY [1..MAXAINR] OF INTEGER; AOLIST : ARRAY [1..MAXAONR] OF INTEGER; IOSET : SETTYPE; AIPREALARM : AISETT AOLISTTYPE= ARRAY[1..MAXAONR] OF INTEGER; AILISTTYPE= ARRAY[1..20] OF INTEGER; SETTYPE = SET OF 0..255; RAMP_TYPE = (RAMP_TIME,ENDSPEED); RAMPTYPE = ARRAY [1..5,RAMP_TIME..ENDSPEED] OF INTEGERYPE; AIALARM1 : AISETTYPE; AIALARM2 : AISETTYPE; DIALARM : DISETTYPE; PANEL : ARRAY[0..1] OF INTEGER; END; {RECORD STATUSDEF} CHARARRAY = ARRAY[0..3] OF CHAR; ABSINTDEF = RECO; STEPDEF = RECORD NAME : NAMETYPE; AOLIST : AOLISTTYPE; AILIST : AILISTTYPE; IOSET : SETTYPE; SPEEDCONT RD CASE BOOLEAN OF TRUE : (VALUE : ^INTEGER); FALSE: (ADDRESS : INTEGER) END; INT16 = ARRAY[0..15] OF INTEGER; COMMANDTYPE = (MM_,AO_,AI_,DI_,DO_,: RAMPTYPE; TERMINATOR: BOOLEAN; TIME : INTEGER; H2_SETP : INTEGER; O2_SETP : INTEGER; FAST_SPEED: INTEGER; TM_,WD_,ID_,RS_,BZ_,EX_,HH_, IV_); COMMANDDEF = RECORD CODESTRING : ARRAY[0..1] OF CHAR; NUMSTRING : CHARARRAY; NUMVALID : BOOLEAN; VALSTRING : CHARARRAY; VALVALID  END; {IOSET HAS THE INFO FOR DIGITAL INPUTS, OUTPUTS(2X) AND CHANGING AO'S IN A BLOCKSTEP} TABLEDEF = ARRAY [1..MAXTAB] OF INTEGER; FUNCDEF = ARRAY [1..MAXFUNC] OF CHAR; {TO BE DEFINED YET} RECIPEDEF = RECORD  : BOOLEAN; NUM : INTEGER; VALUE : INTEGER; CODE : COMMANDTYPE; END; VAR I,IOERROR, SYSERROR : INTEGER; CHOICE,ANSWER: CHAR; CHANGE,FOUND,OK : BOOLEAN;  CASE INTEGER OF 0 : (HEADER1 : HEAD1); 1 : (HEADER2 : HEAD2); 2 : (STEP : STEPDEF); 3 : (TABLE : TABLEDEF);  STEPNUMBER : INTEGER; INPUTSTRING : MAXSTRING; RECIPERECORD: FILE OF RECIPEDEF; STATUS : STATUSDEF; INDEX : FILE OF INDEXLIST; SYSTEMENTRY : FILE OF SYSTEM; RECIPE : ARRAY[0..MAXRECORD] OF 4 : (FUNC : FUNCDEF); END {RECORD}; PROCESSSTATUS = (IDLE,RSET,RUN,HLD,ALRM,ABRT,FINISH,MANUAL); AISETTYPE = SET OF 1..MAXAINR; DISETTYPE = SET OF 1..MAXDINR; STATUSDEF = RECORD  RECIPEDEF; PROCEDURE readstring (VAR INP: MAXSTRING; VAR C: BOOLEAN); VAR F : FILE OF MAXSTRING; I : INTEGER; BEGIN RESET (F,'/TERM'); GET (F); C := (F^[1] <> ' '); {if no char_string is entered F^[1] = blank} IF C {a new string is enteredB     } THEN FOR I := 1 TO MAXLENGTH DO INP[I] := F^[I] END; {readstring} FUNCTION getchoice : CHAR; VAR C : CHAR; BEGIN WRITE('':15,'your choice: '); PROMPT; GET(INPUT); IF EOLN(INPUT) THEN C := '0' ELSE READ(C); READLN; getchoice := C FOR} END;{DIGtoINT} PROCEDURE INTtoHEX(VALUE : INTEGER;VAR DIGITSTRING : CHARARRAY); {CONVERTS INTEGER TO AN ASCII STRING OF HEXADECIMALS FOR PRINTING} VAR QUOT,REMAIN,POWEROF16,I : INTEGER; NEGATIVE : BOOLEAN; BEGIN REMAIN := VALUE; NEGATIVE := (END; PROCEDURE clearscreen; VAR CLEAR : CHAR; BEGIN CLEAR := CHR($1B); WRITELN (CLEAR,'X'); END; {clearscreen} PROCEDURE cursorhome; VAR HOME : CHAR; BEGIN HOME := CHR($1B); WRITELN (HOME,'@'); END; {cursorhome} PROCEDURE read4char(VAR I: INTEGVALUE < 0); IF NEGATIVE THEN REMAIN := 32767+ (REMAIN+1); POWEROF16 := 16 *16 *16; FOR I := 0 TO 3 DO BEGIN QUOT := REMAIN DIV POWEROF16; REMAIN:= REMAIN MOD POWEROF16; IF NEGATIVE AND (I=0) THEN QUOT := QUOT + 8; IF QUOER; INPUTSTRING: MAXSTRING; VAR DIGITSTRING: CHARARRAY; VAR VALID:BOOLEAN); {READ A MAXIMUM OF 4 CHARACTERS RIGHT JUSTIFIED INTO AN ARRAY} {IF NO CHAR'S ENTERED, ARRAY HAS VALUE OF '0000' AND VALID= FALSE} VAR K : INTEGER; BEGIN DIGIT IN [0..9] THEN DIGITSTRING[I] := CHR(QUOT+ORD('0')) ELSE BEGIN QUOT := QUOT-10; DIGITSTRING[I] := CHR(QUOT+ORD('A')); END; POWEROF16 := POWEROF16 DIV 16; END; {FOR} END; { INTtoHEX} PROCEDURE disptime(TIM :TSTRING := '0000'; VALID := INPUTSTRING[I] <> ' '; IF VALID THEN REPEAT FOR K := 1 TO 3 DO DIGITSTRING[K-1]:=DIGITSTRING[K]; DIGITSTRING[3] := INPUTSTRING[I]; I := I+1; UNTIL INPUTSTRING[I] = ' '; END; {read INTEGER); {CHANGES TIME (SECONDS) TO H.MM.SS REPRESENTATION AND PRINTS IT} VAR TIME : ARRAY[1..7] OF CHAR; POWEROF60 : 1..3600; QUOTIENT : INTEGER; REMAINDER : INTEGER; QUOT10 : 0..5; REMAIN10 : 0..9; BEGIN POWEROF60 := 3600;4char} PROCEDURE HEXtoINT(DIGITSTRING: CHARARRAY;VAR VALUE:INTEGER); {CONVERTS HEXDIGITSTRING INTO A (SIGNED) INTEGER} VAR I,J,DIGIT :INTEGER; CH : CHAR; NEGATIVE : BOOLEAN; BEGIN VALUE := 0; NEGATIVE := FALSE; FOR I := 0 TO 3 DO BEGIN  REMAINDER := TIM; QUOTIENT := REMAINDER DIV POWEROF60; {EXTRACT HOURS} REMAINDER:= REMAINDER MOD POWEROF60; TIME[1] := (CHR(QUOTIENT + ORD('0'))); POWEROF60 := POWEROF60 DIV 60; QUOTIENT := REMAINDER DIV POWEROF60; {EXTRACT MINUTES} REMAINDE CH := DIGITSTRING[I]; IF CH IN ['0'..'9'] THEN DIGIT := ORD(CH)-ORD('0') ELSE IF CH IN ['A'..'F'] THEN DIGIT := 10 + ORD(CH) - ORD('A') ELSE DIGIT := 0; IF (I=0) AND (DIGIT>7) THEN BEGIN NEGATR:= REMAINDER MOD POWEROF60; {SECONDS } QUOT10 := QUOTIENT DIV 10; REMAIN10 := QUOTIENT MOD 10; TIME[2] := '.'; TIME[3] := (CHR(QUOT10 + ORD('0'))); TIME[4] := (CHR(REMAIN10 + ORD('0'))); QUOT10 := REMAINDER DIV 10; REMAIN10 := REMAINDIVE := TRUE; DIGIT := DIGIT-8; END;{IF} VALUE := 16 * VALUE + DIGIT; END;{FOR} IF NEGATIVE THEN VALUE := -32767 + VALUE -1; END;{HEXtoINT} PROCEDURE DIGtoINT(DIGITSTRING: CHARARRAY;VAR VALUE:INTEGER); {CONVERTS DIGITSTRING INTO A (SER MOD 10; TIME[5] := '.'; TIME[6] := (CHR(QUOT10 + ORD('0'))); TIME[7] := (CHR(REMAIN10 + ORD('0'))); WRITE(TIME:9); END {disptime}; PROCEDURE disp_MM(COMMAND : COMMANDDEF;VAR MM_DATA :ABSINTDEF); VAR COUNT,MAX,I,DATA : INTEGER; DIGITSTRIIGNED) INTEGER} VAR I,DIGIT :INTEGER; CH : CHAR; BEGIN VALUE := 0; FOR I := 0 TO 3 DO BEGIN CH := DIGITSTRING[I]; IF CH IN ['0'..'9'] THEN DIGIT := ORD(CH)-ORD('0') ELSE DIGIT := 0; VALUE := 10 * VALUE + DIGIT; END;{NG : CHARARRAY; BEGIN WITH COMMAND DO BEGIN WRITE(CODESTRING:4,NUMSTRING:6); I := 0; IF VALVALID THEN MAX := 0 ELSE MAX := 15; {$D-} REPEAT MM_DATA.ADDRESS := NUM + I; DATA := MM_DATA.VALUE^; INTtoHEX(DAC     TA,DIGITSTRING); WRITE(DIGITSTRING[2]:2,DIGITSTRING[3]); I := I+1; UNTIL I > MAX; {$D+} END {WITH}; END; {dispMM} PROCEDURE MM_command(COMMAND : COMMANDDEF); {sets MM to a value if specified in value, otherwise displays requested MM DO BEGIN WRITELN; WRITE(CODESTRING:6); IF NUMVALID AND (NUM IN [1..MAXDINR]) THEN BEGIN WRITE(NUM:4,' '); I := NUM; MAX := NUM; END ELSE BEGIN WRITELN; FOR I := 1 TO 8 DO WRITE and the 15 successing locations} VAR MM_DATA : ABSINTDEF; BEGIN WITH COMMAND DO IF VALVALID AND NUMVALID THEN BEGIN {$D-} disp_MM(COMMAND,MM_DATA); FIELDPUT(MM_DATA.VALUE^,7,8,VALUE); {$D+} END; {IF} disp_MM(COMMAND,(I:2); WRITELN; FOR I := 0 TO 16 DO WRITE('-'); WRITELN; I := 1; MAX := MAXDINR; END; {ELSE} END; {WITH} WITH IOCONVERT DO BEGIN IOSET := []; OFFSET := 15; {$D- NO RUNTIME ERROR CHECKING} MM_DATA); WRITELN; END; {MM_command} PROCEDURE AI_command(COMMAND : COMMANDDEF); VAR DATA,I,READY,COUNTER,MAX,STARTCONV: INTEGER; AD_SELECT,AD_DATA : ABSINTDEF; DIGITSTRING : CHARARRAY; BEGIN WITH COMMAND DO BEGIN IF NUMVALID AND (NUM  DI_DATA.ADDRESS := DI_BOARD; INTREP[OFFSET] := FIELDGET(DI_DATA.VALUE^,7,16); {GET INPUT 1 TO 16, 8 BITS SHIFTED TO GET 8-16 IN M.S. BITS} DI_DATA.ADDRESS := DI_BOARD+2; INTREP[OFFSET+ OFF1] := FIELDGET(DI_DATA.VALUE^,7,8); {IN [1..MAXAINR]) THEN BEGIN I := NUM; MAX := NUM; END ELSE BEGIN I := 1; MAX := MAXAINR; END; {ELSE} WRITELN; WRITELN(CODESTRING:6); END; {WITH} {$D- SUPPRESS RUNTIME CHECKS; POINTER AGET INPUT 17-24 ONLY IN THE L.S. BITS OF DATA} {$D+} COUNT := 0; REPEAT IF (I+ OFF1) IN IOSET THEN WRITE('1':2) ELSE WRITE('0':2); I := I+1; COUNT := COUNT+1; IF COUNT = 8 THEN CCESSES NON MEMORY ADDRESSES} WITH AD_SELECT DO BEGIN ADDRESS := AD_BOARD; AD_DATA .ADDRESS := AD_BOARD + 2; REPEAT STARTCONV := 256 *(I-1) + 4; COUNTER := 10; VALUE^ := STARTCONV; REPEAT READY BEGIN WRITELN; COUNT := 0; END; {IF} UNTIL I > MAX; END {WITH}; WRITELN; END; {DI_command} PROCEDURE setDOstat(NUM : INTEGER; VAL: INTEGER); VAR OFFSET,K,I,COUNT,DATA : INTEGER; DIGITSTRING : CHARARRAY; DO_DATA : AB := FIELDGET(VALUE^,2,1); COUNTER := COUNTER-1; UNTIL (READY = 0) OR (COUNTER=0); IF READY = 0 THEN BEGIN DATA:= FIELDGET(AD_DATA.VALUE^,15,12); INTtoHEX(DATA,DIGITSTRING); WRITE(I:4,DIGITSINTDEF; IOCONVERT: RECORD CASE BOOLEAN OF TRUE: (IOSET : SETTYPE); FALSE: (INTREP: INT16) END; BEGIN WITH STATUS DO BEGIN IF VAL = 1 THEN IOSET := IOSET + [NUM + OFF2] STRING:6); END {IF} ELSE WRITELN('CHANNEL',I:3,' TIMED OUT'); I := I+1; UNTIL I > MAX; END; {WITH} {$D+ ENABLE RUN TIME ERROR CHECKING AGAIN} WRITELN; END; {AI_command} PROCEDURE DI_command(COMMAND : COMMANDDEF); VAR DAT ELSE IOSET := IOSET - [NUM + OFF2]; IOCONVERT.IOSET := IOSET; END; {WITH} OFFSET := 12; WITH IOCONVERT DO FOR K := 0 TO 1 DO BEGIN {$D- NO RUNTIME ERROR CHECKING} DO_DATA.ADDRESS := DO_BOARD + 2 * K; A,MAX,I,COUNT,OFFSET: INTEGER; DIGITSTRING : CHARARRAY; DI_DATA : ABSINTDEF; IOCONVERT: RECORD CASE BOOLEAN OF TRUE: (IOSET : SETTYPE); FALSE: (INTREP: INT16) END; BEGIN WITH COMMAND DATA := FIELDGET(INTREP[OFFSET-K],7,16); DO_DATA.VALUE^ := DATA; END {FOR}; {$D+} END; {setDOstat} PROCEDURE dispDOstat(COMMAND : COMMANDDEF); VAR DATA,I,MAX,COUNT,OFFSET: INTEGER; DIGITSTRING : CHARARRAY; BEGIN WITH COMMAND DO BED     GIN WRITELN; WRITE(CODESTRING:6); IF NUMVALID AND (NUM IN [1..MAXDONR]) THEN BEGIN WRITE(NUM:4,' '); I := NUM; MAX := NUM; END ELSE BEGIN WRITELN; FOR I := 1 TO 8 DO WRITE(I:2); NUMVALID AND (NUM IN [1..MAXAONR]) THEN setAOstat(NUM,VALUE); dispAOstat(COMMAND); END; {AO_command} PROCEDURE TM_command(COMMAND : COMMANDDEF); BEGIN WRITELN; WRITE('time'); WITH COMMAND DO BEGIN IF NUMVALID THEN BEGIN  WRITELN; FOR I := 0 TO 16 DO WRITE('-'); WRITELN; I := 1; MAX := MAXDONR; END; {ELSE} END; {WITH} COUNT := 0; WITH STATUS DO REPEAT IF (I+OFF2) IN IOSET THEN WRITE('1':2) ELSE WRITE(' disptime(STATUS.TIMEREMAIN); IF NUM <32400 THEN STATUS.TIMEREMAIN := NUM; END; disptime(STATUS.TIMEREMAIN); WRITELN; END {WITH}; END; {TM_command} PROCEDURE ID_command; BEGIN STATUS.PROCSTATUS := IDLE; END; {ID_co0':2); I := I+1; COUNT := COUNT+1; IF COUNT = 8 THEN BEGIN WRITELN; COUNT := 0; END;{IF} UNTIL I > MAX; WRITELN; END; {dispDO} PROCEDURE DO_command(COMMAND : COMMANDDEF); {sets ao to a mmand} PROCEDURE RS_command; BEGIN STATUS.PROCSTATUS := RSET; END; {RS_command} PROCEDURE maintenance; VAR I : INTEGER; CHANGE : BOOLEAN; COMMAND: COMMANDDEF; BEGIN WITH COMMAND DO REPEAT{UNTIL CODE = EX_} WRITE(': '); PROMPT(OUvalue if specified in value, otherwise displays requested ao or all if no nr requested} BEGIN WITH COMMAND DO IF VALVALID AND NUMVALID THEN IF (NUM IN [1..MAXDONR]) AND (VALUE IN [0..1]) THEN setDOstat(NUM,VALUE); dispDOsTPUT); readstring(INPUTSTRING,CHANGE); IF CHANGE THEN BEGIN IF INPUTSTRING[1] = 'S' THEN I := 3 ELSE I := 1; CODESTRING[0] := INPUTSTRING[I]; CODESTRING[1] := INPUTSTRING[I+1]; tat(COMMAND); END; {DO_command} PROCEDURE dispAOstat(COMMAND : COMMANDDEF); VAR COUNT,MAX,I : INTEGER; DIGITSTRING : CHARARRAY; BEGIN WITH COMMAND DO BEGIN IF NUM IN [1..MAXAONR] THEN BEGIN I := NUM; MAX := NUM;  I := I+3; read4char(I,INPUTSTRING,NUMSTRING,NUMVALID); I := I+1; read4char(I,INPUTSTRING,VALSTRING,VALVALID); {command is now put into a standard format, ready to be interpreted} IF CODESTRING = 'MM' THENEND {IF} ELSE BEGIN I := 1; MAX := MAXAONR; END {ELSE}; WRITELN; WRITELN(CODESTRING:6); REPEAT INTtoHEX(STATUS.AOLIST[I],DIGITSTRING); WRITE(I:4,DIGITSTRING:6); I := I+1; UNTIL I >  CODE := MM_ ELSE IF CODESTRING = 'AO' THEN CODE := AO_ ELSE IF CODESTRING = 'AI' THEN CODE := AI_ ELSE IF CODESTRING = 'DI' THEN CODE := DI_ ELSE IF CODESTRING = 'DO' MAX; WRITELN; END {WITH}; END; {dispAOstat} PROCEDURE setAOstat(NUM : INTEGER; DATA : INTEGER); VAR DA_DATA : ABSINTDEF; {$D-} BEGIN WITH DA_DATA DO BEGIN ADDRESS := DA_BOARD +(NUM-1)* 2; FIELDPUT(VALUE^,3,16,DATA); FIELDPUT(THEN CODE := DO_ ELSE IF CODESTRING = 'TM' THEN CODE := TM_ ELSE IF CODESTRING = 'WD' THEN CODE := WD_ ELSE IF CODESTRING = 'BZ' THEN CODE := BZ_ ELSE IF CODESTRING = 'STATUS.AOLIST[NUM],3,16,DATA); END {WITH} END; {setDA} {$D+} PROCEDURE AO_command(COMMAND : COMMANDDEF); {sets ao to a value if specified in value, otherwise displays requested ao or all if no nr requested} BEGIN WITH COMMAND DO IF VALVALID AND ID' THEN CODE := ID_ ELSE IF CODESTRING = 'RS' THEN CODE := RS_ ELSE IF CODESTRING = 'EX' THEN CODE := EX_ ELSE CODE := IV_; IF CODE = MM_ THEN HEXtoINT(NUMSTRING,NUM); E      IF CODE IN [MM_,AO_] THEN HEXtoINT(VALSTRING,VALUE); IF CODE IN [AO_..BZ_] THEN DIGtoINT(NUMSTRING,NUM); IF CODE = DO_ THEN DIGtoINT(VALSTRING,VALUE); CASE CODE OF AO_ : AO_command(COMMAND); *06 24*024*024*014F @@1D1@6)6)111 $>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>AI_ : AI_command(COMMAND); MM_ : MM_command(COMMAND); DI_ : DI_command(COMMAND); DO_ : DO_command(COMMAND); TM_ : TM_command(COMMAND); WD_ : {WD_command}; BZ_ : {BZ_commandOUTPUT ON LINEPRINTER (Y/N/)DISPLAY ALL ENTRIES? (Y/N/)/P1 OUTPUT OPTICAL FIBERSSYSTEM CONFIGURATION TABLE /TERM OUTPUT STARTING NUMBER: ENDING NUMBER: /P1 OUTPUT /TERM OUTPUT press to return to the job selection}; ID_ : ID_command; RS_ : RS_command; EX_ : ; IV_ : ; END; {CASE} END; {IF} UNTIL CODE = EX_; END;{maintenance} PROCEDURE init_status; VAR I : INTEGER; BEGIN WITH STATUS DO3Oy "B@7 J @ 7J JJJyYyaFOSy"B!JJ&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> BEGIN PROCSTAT := IDLE; CURRENTSTEP := 0; FOR I := 1 TO MAXAONR DO AOLIST[I] := 0; FOR I := 1 TO MAXAINR DO AILIST[I] := 0; IOSET := []; AIPREALARM := []; AIALARM1 := []; AIALARM2 := []; DIALARM :=XXXXXXXXXXXXXXX []; END; {WITH} END; {init_status} BEGIN clearscreen; WRITELN('':20,' OPTICAL FIBERS CONTROL'); init_status; REPEAT WRITELN('':20,'JOB SELECTION'); WRITELN; WRITELN('(0) EXIT'); WRITELN('(9) MAINTENANCE M3OSy"B!@7 J @ 7J yJJJJJ ҐY6 aF20&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ODE'); CHOICE:= getchoice; clearscreen; CASE CHOICE OF '0' : ; '9' : maintenance; OTHERWISE : ; END {CASE}; UNTIL CHOICE = '0'; END. {runtime} IT'); WRITELN('(9) MAINTENANCE MXXXXXXXXXXXXXXX30 @11'054=YP*5@11'054F[@9@>12222221)0쑰1 =/1ꑰ1 =/1葰1 @H111@W1@X1104=NPF<@u@|1220 ވF&@11(0@11(00 4F @@1DD]ڈ>>>>>3Ocy"B@7 J J J&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*54F 24*0D]ڈ܈*54F 24*0D]ڈ܈*54F 24*0DZ]ڈ܈*54F 24*0D.24*0D#24*0DE.1bސQFDQ4F0 6 24*024*024>XXXXXXXXXXF     3Oy "B@7 J y Yy 6 aFOy  "BJ J J&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>LINK WITH DO NUMBER: XXXXXXXXXX3 OSy"B!q@112204F uƑ"N2Α"N7 @11uJ)uz0@112204FuJ "N2Α"N7@11(uy0quD:uyquJuʐUF20DiuJuȋ DW0DPA FE>!3eF?ҋBaF#D$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>@411(uy0quȈFuJuȋ D0@J11(uy0quȈFuJuȋ D0@]11(uy0quD^uJuJ DzuyUF1uJuȋ@x11uJ)u>>>3eF?ҋBaF#D$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>z0D0D70D0AFE>uyUFOuy "Bu7 Ouy "BJ uJ 7Ouy "BJuzOuy "BJOuy "BJOuy "BJy&>>>>>>>>>>>>>>>36 eF20aF#DeF20aF#DeF20aF#D6 eF20aF#D00$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>NAME: MAXIMUM VALUE: UNIT: LINK WITH AI NUMBER: LINK WITH DO NUMBER: SOFTSTART NUMBER: RATIOLINK WITH AO NUMBER: RATIOVALUE: 3Oy "Bq@112204F uȑ"N2Α"N7 @11uJ)uz0@112204FuJ "N2Α"N7@11@,11@D6'6'11@l6'6'11@11'054.D6DPuJDEuJD:uJD/uJD$0DA04>>3!Ocy"Bq@112204F uȑ"N2Α"N7 @11@11@$11'054.D D3uJ D(uJ D0DA02F60E@011@B11@P11@]11@j11@v11@11'054.DMDhuJ >F60E>@11@11@Ơ11@ע11@ꢢ11'054.D6DNuJDCuJD8uJD-uJD"0DA04F60E>@11(uy0quʈFuJuʋ D0&>>>>>>>>>>>>>>>>>>>>>>>>>D\uJ DQuJ DFuJ D;uJ D0uJ D%0DA06F60E@11(uy0quʈFuJuʋ D0&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>NAME: MAXIMUM VALUE: UNIT: TYPE OF LOOP: (1) setpoint control (2) AI switches DO if below setpoint (3) AI switches DO if above setpoint (4) AI onlyTYPE OF CONTROL: (1) don't care (2) bandlimit (3) upper limit (4) lower limitNAME: SAFE STATE: (1) low (2) highTYPE OF CONTROL: (1) ignore (2) abort (3) alarm (4) hold (5) time reset (6) buzzerLINK WITH DO NUMBER: G     3"Oy "Bq@112204F uȑ"N2Α"N7 @11@ 11@711'054.D D3uJ D(uJ D0DA02F60E@L11(uy 0quDuy UFOuy  "BJ uJ uʋ DuyUF2uJ >3%0 220 ֈF1@121@11(00 DwDԈF@!6#6#1@E6*6*1120 '054.D620@p6#6#1@6*6*1120 DM20DEDB0D;A0DF60E>DԈF@6#6#1>uʋ Ouy  "BJ y D0DV0DOA FE!t@g6&6&11(uy0quʈuyUFuJuʋ D0&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>@6*6*1120 '054.D620 @+6#6#1@O6*6*1120 DL20DDDA0D:A0DF60ED;ԈF@z64641120 '054.D,20!@64641120 DL20DDDA0D:A0DF60ENAME: TYPE OF DIGITAL OUTPUT: (1) normally closed (2) normally openINTERLOCK WITH DO NUMBER: CONDITIONAL INTERLOCK WITH DO NUMBER: DԈF@6A6A1120'054.D,20"@B6A6A1120DM20DEDB0D;A0DF60E>DE>~)aԐQFBDDD0'054.D0#DM0DGDD0>>3#@11(?By0҈F?B҅@11(?By0҈F?B҅@011(?By0҈F?B҅@G11(?By0҈F?B҅@c11(?By0҈F?B҅@11(?By0҈>D;A0DF60E>D{0'054.D0$DJ0DDDA0D:A0DF60EDE>+.֐QF@$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>F?B҅@11(?By0҈F?B҅$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>enter number or to exit: NR NAME MAX. VALUE UNIT TYPE OF LOOP TYPE OF CONTROL DOLINKNR NAME MAX. VALUE UNIT TYPE OF LOOP TYPE OF CONTROL DOLINKNR NAME MAX. VALUE UNIT auto/manual switch is DI: flame sensor is DI: flame ignition is DO: temperature control is AI: preform temperature is AO: hydrogen burner is AO: oxigen burner is AO: AI-LINK DO-LINK SOFTST RATIOLINK RATIONR NAME MAX. VALUE UNIT AI-LINK DO-LINK SOFTST RATIOLINK RATIONR NAME SAFE STATE TYPE OF CONTROL DO-LINKNR NAME SAFE STATE TYPE OF CONTROL DO-LINK3$@11(?By0҈F?B҅@6 6 11(?By0҈F?B҅@;11(?By0҈F?B҅@Z11(?By0҈F?B҅@s11(?By0҈F?B҅$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>NR NAME TYPE OF DO INTERLOCK CONDITIONAL INTERLOCKNR NAME TYPE OF DO INTERLOCK CONDITIONAL INTERLOCKauto/manual switch is DI:end switch gas inlet side is DI:end switch exhaust side is DI:Lathe translation is AO:Lathe rotation is AO:3M (q=pҐqO=1%0 O@@ 1(O1"}O=1%MQF0DO10 @111@111@:11@U11'0|.DD*0%D$0D0DA02F60E>=0PFO@j@v1O10 1->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>H     /D1/SYSTEM SYSTEMEN SYSTEM FILE EDITOR PROGRAM(0) exit(1) change/delete an entry(2) print systemfile/D1/SYSTEM SYSTEMEN  P=P+0 008D NEXT i 0098 8315 STOP 009D STOP O NUMBER: SOFTSTART NUMBER: RATIOLINK WITH AO NUMBER: RATIOVALUE: P =QCONFIGUR2GETCHOIC GETCHAR $GETANSWE :READINT KREADREALF { READSTRI  pERROR 3!,Ocy"Bq,,@1,1,220,,4F uȑ"N2Α"N7 , @11,!@11,"@$11,#'05,$4.D/,%D@,&uJ D2,'uJ D$,(,)0DA02F60E>,*@011,+@B11,,@P11,->>>  ) STARS  CLEARSCR4&WAI_AO_DItAI_DISPL`AO_DISPLLDI_DISPL` DO_DISPLTEMP_DIS@]11,.@j11,/@v11,0@11,1'05,24.Dg,3D,4uJ Dq,5uJ Dc,6uJ DU,7uJ DG,8uJ D9,9uJ D+,:,;0DA06F60E,<@1,=1,>(uy0q,?uʈF>>LATHE_DI^PRINT_AI_PRINT_AO EPRINT_DI!"SPRINT_DO#.$!PRINT_TE%&&PRINT_LA'%I*PRINTSYS,@uJ,Auʋ D,B0,C&>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>+g,AI_DELET-^.AO_DELET/ ,0 DI_DELET1 R2 DO_DELET3 &4TEMP_DEL4 &5LATHE_DE5 w6CREATE_S688AI_CHANGNAME: SAFE STATE: (1) low (2) highTYPE OF CONTROL: (1) ignore (2) abort (3) alarm (4) hold (5) time reset (6) buzzerLINK WITH DO NUMBER: ::=AO_CHANG>8@DI_CHANGA8CDO_CHANGD'7FTEMP_CHAG'HLATHE_CHI %MEDITENTR3",NOy "Bq,O,P@1,Q1,R220,S,T4F uȑ"N2Α"N7 ,U@11,V@ 11,W@711,X'05,Y4.D/,ZD@,[uJ D2,\uJ D$,],^0DA02F60E>,_@L1,`1,a(uy 0q,buD,c>>> ? '1' : CONTROL := DONTCARE; '2' : CONTROL := BANDLIMIT; '3' : CONTROL := UPPERLIMIT; '4' : CONTROL := LOWERLIMIT; OTHERWISE: ERROR(1) END; {CASE} WRITE('LINK WITH DO NUMBER: '); PROMPTPROCEDURE PROGRAM 0000 DIM B(500):BYTE 000C W=0 \P=1 001C FOR i=1 TO 1000 002F 8305 W=W+0 \ IF W>1000 THEN 8315 \ IF LAND(PEEK($FCF4),1)=1 THEN 8305 0062 B(12)=PEEK($FCF5) 006E IF B(P)=4 THEN 8315 0081 (OUTPUT); NUMBER := READINT(DOLINK); IF NUMBER IN [0..MAXDONR] THEN DOLINK := NUMBER ELSE ERROR(5); {NR TOO LARGE} END {WITH} END {change_AI}; $SUBTITLE CHANGE ANALOG OUTPUTS IN SYSTEMFILE PROCEDURE AO_change(VAI     R PORTNR :INTEGER); VAR INPUTSTRING : MAXSTRING; CHOICE : CHAR; CHANGE : BOOLEAN; NUMBER, I : INTEGER; BEGIN WITH SYSTEMENTRY^.AOLIST[PORTNR] DO BEGIN WRITE('NAME: '); PROMPT(OUTPUT); READSTRING(INPUTSTRING,CHANGE); ND = CURRENTSTEP); PROCSTATUS := FINISH; END {IF} ELSE IF PROCSTATUS <> RSET THEN WRITELN('process status is not reset') ELSE WRITELN ('no recipe loaded'); END; {start_proc} BEGIN clearscreen; STA IF CHANGE THEN NAME[1 FOR NAMELENGTH] := INPUTSTRING[1 FOR NAMELENGTH]; WRITE('MAXIMUM VALUE: '); PROMPT(OUTPUT); SCALE := READREAL(SCALE); WRITE('UNIT: '); PROMPT(OUTPUT); READSTRING(INPUTSTRING,CHANGE); RS; WRITELN('':20,' OPTICAL FIBERS CONTROL'); STARS; IOABORT (SYSTEMENTRY,FALSE); RESET (SYSTEMENTRY,'/D1/SYSTEM'); SYSERROR := IORESULT(SYSTEMENTRY); IOABORT (SYSTEMENTRY,TRUE); IF SYSERROR = 216 THEN WRITELN ('no configuration file' IF CHANGE THEN UNIT[1 FOR UNITLENGTH] := INPUTSTRING[1 FOR UNITLENGTH]; WRITE('LINK WITH AI NUMBER: '); PROMPT(OUTPUT); NUMBER := READINT(AILINK); CASE NUMBER OF 0: BEGIN I := AILINK; ) ELSE BEGIN GET (SYSTEMENTRY); WITH SYSTEMENTRY^ DO BEGIN SPEEDNR := LATHE[SPEED_AO]; INLETDI := LATHE[INLETSWITCH]; EXHAUSTDI := LATHE[EXHAUSTSWITCH]; END; init_status; STATUS.RECP_END := 0;  AILINK := 0; IF I <> 0 THEN AI_delete (I); END;{0} 1..MAXAINR : AILINK := NUMBER; OTHERWISE : ERROR(5) {NR TOO LARGE} END {CASE}; WRITE('LINK WITH DO NUMBER: '); PROMPT(OUTPUT); NUMBER REPEAT WRITELN('':20,'JOB SELECTION'); WRITELN; WRITELN('(0) EXIT'); WRITELN('(1) RECIPE EDITOR'); WRITELN('(2) LOAD A RECIPE'); WRITELN('(3) DISPLAY STATUS'); WRITELN('(4) CHANGE STATUS');  R RT := 0 TO 1000 DO X := X; UNTIL TIMEREMAIN <= 0 ELSE BEGIN REPEAT getDIstat; UNTIL (INLETDI + OFF1) IN IOSET; VALUE := AOLIST[SPEEDNR]; AOLIST[SPEEDNR0' : ; '1' : ;{CHAIN RECIPE EDITOR IF SYSTEM IS IDLE} '2' : load_recipe; '3' : BEGIN clearscreen; disp_status(FALSE); bottomline(OK); IF OK THE] := NEXTSPEED; NEXTSPEED := VALUE; setAOstat(SPEEDNR,AOLIST[SPEEDNR]); setDOAO(OFF2); DEPOSITION := TRUE; disp_status(FALSE); WRITELN('wait until exhaustswitch is high (inN disp_status(OK); END; '4' : {chng_status}; '5' : chng_jobnr; '6' : reset_proc; '7' : start_proc; '8' : hold_proc; '9' : {maintenance}; OTHERWISE : ERROR(1) p 10)'); REPEAT getDIstat; getAIstat; speedramp; FOR COUNT := 0 TO 1000 DO X := X; UNTIL (EXHAUSTDI +OFF1) IN IOSET; END {ELSE} UNTIL (RECP_E END {CASE}; UNTIL CHOICE = '0'; END {ELSE} END. {runtime}  '5' : chng_jobnr; '6' : reset_proc; '7' : start_proc; '8' : hold_proc; '9' : {maintenance}; OTHERWISE : ERROR(1) J     REAL_VAL6GETCHOICMGETCHAR  1READINT  mREADSTRIZ ERROR  STARS  8 CLEARSCR   CURSORHO   FINDENDS  N  SEARCHST, SEARCHFUi NAMECHEC  BOTTOMLIK&DISP_AISDISP_DIS  DISPTIMEDISP_PRO1DISP_SYS DISP_STA)dPROCEDURE PROGRAM GUUS DIM PR:BYTE DIM B(500):BYTE OPEN #PR,"/P1":WRITE W=0 \P=1 FOR i=1 TO 20 8305 W=W+0 \ IF W>1000 THEN 8315 \ IF LAND(PEEK($FCF4),1)=1 THEN 8305 B(12)=PEEK($FCF5) IF B(P)=4 THEN 8315 P=P+0 NEXT i PRINT #PR,"HELLO" 8315 STOP STOP _CHNG_JOB !%LOAD_REC") %SETAOSTA&&'SETDOAO '*'(INIT_STA(')SETSOFT ) G*CLEARSOF*G[+SPEEDRAM+ - MOVE_HAL. ./NEWSTEP /63 @3+GETDISTA4(G5GETAISTA56 PROCESSA6 J7!DEVIATIO7 8"ALABTEST8 G+<#INPUTTES<+G\>$RESET_PR>)p?U%HOLD_PRO@hAJ&START_PRB(gE'RUNTIME FPROCEDURE GUUS DIM PR:BYTE DIM B(500):BYTE OPEN #PR,"/P1":WRITE W=0 \P=1 FOR i=1 TO 20 8305 W=W+0 \ IF W>1000 THEN 8315 \ IF LAND(PEEK($FCF4),1)=1 THEN 8305 B(12)=PEEK($FCF5) IF B(P)=4 THEN 8315 P=P+0 NEXT i PRINT #PR,"HELLO" 8315 STOP STOP >>>>>>>>>>>>> auto/manual switch is DI:end switch gas inlet side is DI:end switch exhaust side is DI:Lathe translation is AO:Lathe rotation is AO:PROCEDURE PROGRAM DIM PR:BYTE DIM B(500):BYTE OPEN #PR,"/P1":WRITE W=0 \P=1 FOR i=1 TO 20 8305 W=W+0 \ IF W>1000 THEN 8315 \ IF LAND(PEEK($FCF4),1)=1 THEN 8305 B(12)=PEEK($FCF5) IF B(P)=4 THEN 8315 P=P+0 NEXT i PRINT #PR,"HELLO" 8315 STOP STOP >>>>>>>>>>3%,,0 ,220 ,ֈF,,ΰ1,@121@1,а1,ѐ,(0,0 ,DA,DP,ԈF,,@!6#6#1@E6*6*11,20 ,'05,4.DS,,20,@p6#6#1@6*6*11,2,0 D[,20DP,DJ,,0>>D;A0DF60E>,Dv,ԈF,,@6#6#1@6*6*11,20 ,'05,4.DQ,,20 ,@+6#6#1@O6*6*11,20 ,DY,20DN,DH,,0D;A0DF60E>" PROGRA*TK/P1J? S>S?SFU? S > UME;>U`E;0? S?ȆUE;?S?0?&TKHELLO???hF?B҅,@c1,1,(>,D,ԈF,,@z646411,20 ,'05,4.DG,,20!,@646411,20 ,DX,20DM,DG,,0D:A0DF60E,D,ԈF,,@6A6A11>>K     , 20, '05, 4.DG, , 20",@B6A6A11,20,DY,20DN,DH,,0D;A0DF60E>,,DE>m/,,QF`D0,D ,D ,,0,'05,4.D(,0#DZ, >>>/D1/SYSTEM SYSTEMEN SYSTEM FILE EDITOR PROGRAM(0) exit(1) change/delete an entry(2) print systemfile/D1/SYSTEM SYSTEMEN 0DN,!DH,",#0D;A0DF60E>,$D,%,&0,''05,(4.D%,)0$DV,*0DM,+DG,,,-0D:A0DF60E,.,/DE>u,0,1Q>Y =,[CONFIGURMGETCHOIC 1GETCHAR %$GETANSWE mREADINT ~READREALF READSTRI  pERROR F$>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  8 STARS  CLEARSCR4&WAI_AO_DItAI_DISPLrAO_DISPLLDI_DISPL DO_DISPLTEMP_DISenter number or to exit: NR NAME MAX. VALUE UNIT TYPE OF LOOP TYPE OF CONTROL DOLINKNR NAME MAX. VALUE UNIT TYPE OF LOOP TYPE OF CONTROL DOLINKNR NAME MAX. VALUE UNIT LATHE_DI^PRINT_AI_PRINT_AO !EPRINT_DI"#SPRINT_DO$I%!PRINT_TE&;'PRINT_LA(%L,PRINTSYSAI-LINK DO-LINK SOFTST RATIOLINK RATIONR NAME MAX. VALUE UNIT AI-LINK DO-LINK SOFTST RATIOLINK RATIONR NAME SAFE STATE TYPE OF CONTROL DO-LINKNR NAME SAFE STATE TYPE OF CONTROL DO-LINK-.AI_DELET/0AO_DELET1 D2 DI_DELET3 p4 DO_DELET5 86TEMP_DEL6 87LATHE_DE7 8CREATE_S88;AI_CHANGNR NAME TYPE OF DO INTERLOCK CONDITIONAL INTERLOCKNR NAME TYPE OF DO INTERLOCK CONDITIONAL INTERLOCK=:AAO_CHANGB8#EDI_CHANGF8`IDO_CHANGJ'LTEMP_CHAM')OLATHE_CHP %VEDITENTR3,5M (q=pҐqO=1%,60 ,7O@@ 1,8(O1"},9O=1%,:MQF ,;0DO1,<,=,>0 ,?@11,@1,A@111,B@:11,C@U11,D'0|,E.D%,FD6,G0%D-,H0D$,I,J0DA02F60E>,K>>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX=0PFa,LO@j@v1,MO1,N0 ,O1->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXL     XXXXXXXXXXF@6A6A1120'054.D,20"@B6A6A1120DM20DEDB0D;A0DF60E>DE>~)aԐQFBDDD0'054.D0#DM0DGDD0>> AO = RECORD NAME : ARRAY[1..NAMELENGTH] OF CHAR; UNIT : ARRAY[1..UNITLENGTH] OF CHAR; SCALE : REAL; AILINK : 0..MAXAINR; DOLINK : 0..MAXDONR  R~"Oj$0CLj I := I + 1; LINECOUNT := LINECOUNT + 1; IF LP AND (LINECOUNT = PAGELENGTH-1) THEN BEGIN PAGE(OUTPUT); LINECOUNT := 0; END {IF} UNTIL I > ENDNUM; WRITELN; WRITELN; WRITELN; LINECOUNT := LINECOUNT+3; END; {pri$TITLE SYSTEM FILE CONFIGURATOR PROGRAM PROGRAM CONFIGURATOR(INPUT,OUTPUT,SYSTEMENTRY); CONST NONAME = 'XXXXXXXXXX'; NOUNIT = 'XXXXX'; NAMELENGTH = 10; UNITLENGTH = 5; MAXAINR = 32; MAXAONR = 16; MAXnt_DI} PROCEDURE print_DO(VAR LINECOUNT:INTEGER;START,ENDNUM:INTEGER;LP:BOOLEAN); VAR I : INTEGER; BEGIN stars; WRITELN('':20,'DIGITAL OUTPUTS'); stars; WRITELN(CDO); I := START; LINECOUNT := LINECOUNT +10; REPEAT DO_display(I); I DINR = 24; MAXDONR = 32; MAXLENGTH = 50; PAGELENGTH =59; CAA='NR NAME MAX. VALUE UNIT '; CAI='TYPE OF LOOP TYPE OF CONTROL DOLINK'; CAO='AI-LINK DO-LINK SOFTST RATIOLINK RATIO'; := I + 1; LINECOUNT := LINECOUNT + 1; IF LP AND (LINECOUNT = PAGELENGTH-1) THEN BEGIN PAGE(OUTPUT); LINECOUNT := 0; END {IF} UNTIL I > ENDNUM; WRITELN; WRITELN; WRITELN; LINECOUNT := LINECOUNT+3; END; {print_DO CDI='NR NAME SAFE STATE TYPE OF CONTROL DO-LINK'; CDO='NR NAME TYPE OF DO INTERLOCK CONDITIONAL INTERLOCK'; TYPE AICONTROL = (DONTCARE, BANDLIMIT, UPPERLIMIT, LOWERLIMIT); AI_LOOP = (AIONLY, AIDOBELOW, A} $SUBTITLE PRINT SYSTEM ENTRIES PROCEDURE print_TEMP(VAR LINECOUNT:INTEGER; LP: BOOLEAN); BEGIN IF LP THEN PAGE(OUTPUT); stars; WRITELN('':20,'TEMPERATURE CONTROL ASSIGNMENTS'); stars; TEMP_display; WRITELN; WRITELN; END; {priIDOABOVE, SETPOINT); DICONTROL = (IGNORE, ABORT, ALARM, HOLD, TIMERESET, BUZZER); SAFESTATE = (LOW,HIGH); DOCONTROL = (NORMAL,INVERTED); TEMP_TYPE = (T_AUTO_MAN, FLAME_DI, LITFLAME, TEMP_AI, PRnt_TEMP} PROCEDURE print_LATHE(VAR LINECOUNT:INTEGER; LP: BOOLEAN); BEGIN stars; WRITELN('':20,'LATHE CONTROL ASSIGNMENTS'); stars; LATHE_display; WRITELN; WRITELN; END; {print_LATHE} $SUBTITLE MAIN PRINTING ROUTINE PROCEDURE printsyEF_AO, H2_AO, O2_AO); LATHE_TYPE = (L_AUTO_MAN, INLETSWITCH, EXHAUSTSWITCH, SPEED_AO, ROTAT_AO); AI = RECORD NAME : ARRAY[1..NAMELENGTH] OF CHAR; UNIT : ARRAY[1..UNITLENGTH] OF Cstem; VAR ANSWER,ANSWER1 : CHAR; OK,LP : BOOLEAN; LOOPSTART,LOOPEND,I,LINE : INTEGER; TYPESELECT : INTEGER; IOPORT : IOPORTTYPE; YR,MON,DAY,HR,MIN,SEC : INTEGER; BEGIN clearscreen; WRITELN ('OUTPUT ON LINEPRINTER (Y/N/)'); ANSWEHAR; SCALE : REAL; LOOP : AI_LOOP; CONTROL : AICONTROL; DOLINK : 0..MAXDONR; AOLINK : 0..MAXAONR END; R := getchar; LP := (ANSWER = 'Y'); WRITELN ('DISPLAY ALL ENTRIES? (Y/N/)'); ANSWER := getchar; IF LP THEN BEGIN REWRITE (OUTPUT,'/P1'); SYSTIME (YR,MON,DAY,HR,MIN,SEC); stars; WRITELN (YR:1,'/',MON:1,'/',DAY:1,'OPTICAL FIBERS