PROCEDURE NOZERO; BEGIN IF M=0.0 THEN M:=0.00000001; END; PROCEDURE REMOVEBLANKS; {THIS PROCEDURE REMOVES LEADING AND TRAILING BLANKS FROM DATA } BEGIN VAL(DATA,DUMMY,CODE); {TRY TO CONVERT WITH A DUMMY VARIABLE} IF CODE>0 THEN BEGIN REPEAT; DELETE(DATA,CODE,1); {REMOVE THE OFFENDING CHAR} IF LENGTH(DATA)=0 THEN BEGIN WRITELN('***DATA READ ERROR***'); HALT; END; VAL(DATA,DUMMY,CODE); UNTIL CODE=0; END; END; PROCEDURE PRINT_MENU; { THIS PROCEDURE PRINTS THE ELEMENT TYPE MENU } BEGIN CLRSCR; WRITELN;WRITELN(' ELEMENT TYPE MENU');WRITELN; WRITELN(' (1) SER R (12) TRANSMISSION LINE'); WRITELN(' (2) PAR R (13) PAR OPEN STUB'); WRITELN(' (3) SER L (14) PAR SHORT STUB'); WRITELN(' (4) PAR L (15) SER OPEN STUB'); WRITELN(' (5) SER C (16) SER SHORT STUB'); WRITELN(' (6) PAR C (17) TRANSFORMER'); WRITELN(' (7) SER (S-RLC)'); WRITELN(' (8) PAR (S-RLC)'); WRITELN(' (9) SER (P-RLC)'); WRITELN('(10) PAR (P-RLC)'); WRITELN('(11) SER (S-RL/P-C)'); WRITELN; END; PROCEDURE PRINT_DIELECTRIC_CONSTANTS; { THIS PROCEDURE PRINTS OUT THE DIELECTRIC CONSTANTS CHART } BEGIN CLRSCR; WRITELN; WRITELN('DIELECTRIC CONSTANT CHART:'); WRITELN; WRITELN('AIR 1.00'); WRITELN('DUROID 5880 2.20'); WRITELN('DUROID 5870 2.23'); WRITELN('TEFLON-FIBERGLASS (PTFE) 2.55'); WRITELN('FUSED SILICA (QUARTZ) 3.78'); WRITELN('G-10 FIBERGLASS 4.50'); WRITELN('ALUMINA OR EPSILAM 10 10.00'); WRITELN; END; {THIS PROCEDURE TAKES THE STRINGS REPRESENTING THE TWO PARTS OF A COMPLEX NUMBER AND CONVERTS THEM TO THEIR REAL EQUIVALENTS THEN IT LOADS THE VALUES INTO THE CORRECT ELEMENT SPOTS } PROCEDURE CALC_VALUES; BEGIN DATA:=RESIST; REMOVEBLANKS; VAL(DATA,RL,CODE); IF CODE>0 THEN BEGIN WRITELN('*** COMPLEX NUMBER ERROR ***'); HALT; END; DATA:=IMAG; REMOVEBLANKS; IF INDUCT THEN BEGIN ET[N-1]:=3;C[N-1]:=0.0;R[N-1]:=0.0; VAL(DATA,L[N-1],CODE); IF CODE>0 THEN BEGIN WRITELN('*** COMPLEX NUMBER ERROR ***'); HALT; END; L[N-1]:=(L[N-1]/(PI*2.0*FREQ*1E+6))*1.0E+9; END; IF NOT INDUCT THEN BEGIN ET[N-1]:=5;L[N-1]:=0.0;R[N-1]:=0.0; VAL(DATA,C[N-1],CODE); IF CODE>0 THEN BEGIN WRITELN('*** COMPLEX NUMBER ERROR ***'); HALT; END; C[N-1]:=(1.0/(PI*2.0*FREQ*1.0E+6*C[N-1]))*1.0E+12; END; END; PROCEDURE PRINT_ELEMENT_TABLE; { THIS PROCEDURE PRINTS A LISTING OF THE ELEMENT VALUES } BEGIN CLRSCR;DELAY(100);WRITELN; WRITELN('ELEM TYPE R L C'); WRITELN(' (ZO) (L) (E)'); WRITELN('SOURCE R ',RS:14:3); N:=1;REPEAT; WRITELN(N:2,ET[N]:10,R[N]:17:3,L[N]:14:3,C[N]:14:3); N:=N+1; UNTIL N>NS; WRITELN('LOAD R ',RL:14:3); WRITELN;WRITELN('NOTE: R,L,C ARE FOR ELEMENT TYPES 1-11.'); WRITELN(' ZO,L,E ARE FOR ELEMENT TYPES 12-16.');WRITELN; END; FUNCTION EXPON(VALUE,POWER:REAL):REAL; {THIS FUNCTION TAKES TWO REAL NUMBERS (VALUE AND POWER) END RAISES VALUE BY THE POWER 'POWER'.} BEGIN EXPON:=EXP(LN(VALUE)*POWER); END; FUNCTION TAN(VALUE:REAL):REAL; {THIS FUNCTION PRODUCES THE TANGENT OF THE VALUE } BEGIN TAN:=SIN(VALUE)/COS(VALUE); END; PROCEDURE ENTER_ELEMENT_TYPE; { THIS PROCEDURE LOADS THE PROPER INFO INTO THE COMPONENT ARRAYS. AT ENTRY THE VARIABLE "N" SHOULD BE SET TO THE ELEMENT NUMBER TO BE ASSIGNED THE PROCEDURE WILL RETURN WITH THE VAR "N" UNCHANGED AND THE VALUES SET } LABEL 10; BEGIN IF SAME_TYPE THEN GOTO 10; CORRECT:=FALSE; REPEAT; PRINT_MENU; WRITELN('ENTER ELEMENT TYPE FOR SECTION ',N:2); WRITE('ELEMENT TYPE (1-17)? ');READLN(ET[N]); IF (ET[N]>0) AND (ET[N]<18) THEN CORRECT:=TRUE UNTIL CORRECT; CORRECT:=FALSE; { ELEMENT TYPE MUST BE OK SO PROCESS IT } 10: IF ET[N]<3 THEN BEGIN WRITE('R',N:2,' (OHMS) = ');READLN(M); NOZERO; (* CHECKS FOR ZERO ENTRY *) R[N]:=M;L[N]:=0.0;C[N]:=0.0; END; IF (ET[N]=3) OR (ET[N]=4) THEN BEGIN WRITE('L',N:2,' (nH) = ');READLN(M); NOZERO; L[N]:=M;R[N]:=0;C[N]:=0; END; IF (ET[N]=5) OR (ET[N]=6) THEN BEGIN WRITE('C',N:2,' (pF) = ');READLN(M); NOZERO; (* CHECKS FOR ZERO ENTRY *) C[N]:=M;R[N]:=0;L[N]:=0; END; IF (ET[N]>6) AND (ET[N]<12) THEN BEGIN WRITE('R',N:2,' (OHMS) = ');READLN(M); NOZERO; R[N]:=M; WRITE('L',N:2,' (nH) = ');READLN(M); NOZERO; L[N]:=M; WRITE('C',N:2,' (pF) = ');READLN(M); NOZERO; C[N]:=M; END; IF (ET[N]>11) AND (ET[N]<17) THEN BEGIN PRINT_DIELECTRIC_CONSTANTS; WRITE('ENTER DESIRED DIELECTRIC CONST. = ');READLN(M); NOZERO;DC:=M; C[N]:=INT(DC*100.0+0.5)/100.0; REPEAT; WRITELN;WRITELN('ARE THE LINES/STUBS IN:');WRITELN; WRITE('(1) PHYSICAL DIMENSIONS, OR (2) ELECTRICAL PARAMETERS? '); READLN(PE);IF (PE=1) OR (PE=2) THEN CORRECT:=TRUE; UNTIL CORRECT; CORRECT:=FALSE; IF PE=1 THEN BEGIN WRITELN;WRITE('ENTER THE WIDTH (IN) = ');READLN(M); NOZERO;W:=M; WRITE('ENTER THE LENGTH (IN) = ');READLN(M); NOZERO;L[N]:=INT(M*100.0+0.5)/100.0; WRITE('ENTER BOARD THICKNESS (IN) = ');READLN(M); NOZERO;TH:=M; IF W/TH<1 THEN BEGIN EF:=((C[N]+0.5)+((C[N]-1.0)/2.0)*(EXPON((1+12.0*(TH/W)),-0.5))+0.04*EXPON((1.0-W/TH),2.0)); ZO:=(60.0/SQRT(EF))*LN(8.0*TH/W+0.25*W/TH); R[N]:=INT(ZO*100.0+0.5)/100.0; END ELSE BEGIN EF:=((C[N]+1.0)/2.0)+((C[N]-1.0)/2.0)*EXPON((1.0+12.0*(TH/W)),(-0.5)); ZO:=(120.0*3.14159/SQRT(EF))/(W/TH+1.393+0.667*LN(W/TH+1.44)); R[N]:=INT(ZO*100.0+0.5)/100.0; END; END; IF PE=2 THEN BEGIN WRITELN;WRITE('ENTER THE CHAR. IMPEDANCE (OHMS) = ');READLN(M); NOZERO;R[N]:=INT(M*100.0+0.5)/100.0; WRITE('ENTER ELECTRICAL LENGTH (DEGS) = ');READLN(M); NOZERO;DE:=M; WRITE('ENTER CENTER FREQUENCY (Mhz) = ');READLN(M); NOZERO;FO:=M; L[N]:=(DE*3.0E+10)/(C[N]*FO*FR*360.0); L[N]:=INT(L[N]*100.0+0.5)/100.0 END; END; IF ET[N]=17 THEN BEGIN WRITELN;WRITE('TURNS RATIO (N) = ');READLN(M); NOZERO;TR:=M; END; END; PROCEDURE PRINT_TYPE; BEGIN IF ET[N]=1 THEN WRITE(LST,'SERIES R '); IF ET[N]=2 THEN WRITE(LST,'PARALLEL R '); IF ET[N]=3 THEN WRITE(LST,'SERIES L '); IF ET[N]=4 THEN WRITE(LST,'PARALLEL L '); IF ET[N]=5 THEN WRITE(LST,'SERIES C '); IF ET[N]=6 THEN WRITE(LST,'PARALLEL C '); IF ET[N]=7 THEN WRITE(LST,'SERIES-SERIES RLC '); IF ET[N]=8 THEN WRITE(LST,'PARALLEL-SERIES RLC '); IF ET[N]=9 THEN WRITE(LST,'SERIES-PARALLEL RLC '); IF ET[N]=10 THEN WRITE(LST,'PARALLEL-PARALLEL RLC '); IF ET[N]=11 THEN WRITE(LST,'SERIES-SERIES RL/PARL C'); IF ET[N]=12 THEN WRITE(LST,'TRANSMISSION LINE '); IF ET[N]=13 THEN WRITE(LST,'OPEN PARALLEL STUB '); IF ET[N]=14 THEN WRITE(LST,'SHORTED PARALLEL STUB '); IF ET[N]=15 THEN WRITE(LST,'OPEN SERIES STUB '); IF ET[N]=16 THEN WRITE(LST,'SHORTED SERIES STUB '); IF ET[N]=17 THEN WRITE(LST,'TRANSFORMER '); END;