1 REM *** ***************************************************** 1 REM *** * Baysix Electronics Inc. * 1 REM *** * Building Automation System * 1 REM *** * Version 2.1.3 * 1 REM *** * by Kelly Torrance * 1 REM *** * Commissioned 09.27.96 * 1 REM *** * * 1 REM *** * Copyright 1996 by * 1 REM *** * Baysix Electronics Inc. * 1 REM *** * 835 W. Grant Hwy. * 1 REM *** * Marengo Il. 60152 * 1 REM *** * (815) 568-6037 FAX (815) 568-6932 * 1 REM *** * * 1 REM *** * Unauthorized use or duplication of this * 1 REM *** * software is strictly forbidden. * 1 REM *** ***************************************************** 1 REM GLOBAL NUMERIC VARIABLES USED 1 REM A = NORTH WALL TIME 1 REM B = UPSTAIRS TIME 1 REM C = DOWNSTAIRS TIME 1 REM D = BAY 2 FLOR TIME 1 REM E = BAY 3 FLOR TIME 1 REM F = BAY 5 & 6 FLOR TIME 1 REM G = BAY 3 FAN TIMER 1 REM H = H = REAL TIME CLOCK MINUTE VALUE 1 REM I = BAY 3 FANS ENABLED 1 REM J = BAY 4 FLOR TIME 1 REM K = TEMPERATURE OFFSET (SET BY "T" COMMAND) 1 REM L = WATTS REQUESTED 1 REM M = SECURITY MODE (1 OR 0) 1 REM N = PLC COMMAND TYPE (0 = ANALOG, 1 = DIGITAL, 2 = USER) 1 REM O = TOTAL WATTS AVAILABLE (INITIALLY 0, MAXIMUM 47200) 1 REM P = AIR CONDITIONER DEADBAND VARIABLE 1 REM Q = IF DEMAND > 30000 WATTS Q = 1 (TURNS ON GENERATOR) 1 REM R = SCREEN MODE 1 REM S = TIME DELAY AFTER WALK-THROUGH SHUT-DOWN 1 REM Y = AVAILABLE WATTS REMAINING 1 REM Z = TEMPORARY STORAGE VARIABLE 1 REM 1 REM STRING VARIABLES USED 1 REM A$ = TEMP. STORAGE FOR PLC$, COMMAND$, OUTPUT$ 1 REM B$ = OUTPUT$ 1 REM C$ = COMMAND$ 1 REM D$ = FREE 1 REM E$ = SPRAY BOOTH STATUS$ (Enabled, Disabled) 1 REM F$ = COMPRESSOR STATUS$ ( '','') 1 REM G$ = PLC REPLY$ 1 REM H$ = INPUT REQUEST$ (DEMAND$) 1 REM I$ = LAST SCAN OUTPUT REQUEST$ (DEMAND$) 1 REM J$ = PLC ANALOG VALUE OF D0100 1 REM K$ = PLC DIGITAL VALUE OF M0100 1 REM L$ = PLC REPLY TO A USER COMMAND 1 REM T$ = CHECK FOR CHANGE OF INSIDE SECURITY BREACH 1 REM U$ = CHECK FOR CHANGE SECURITY STATUS 1 REM V$ = SECURITY STATUS MESSAGE 1 REM W$ = CHECK FOR CHANGE OF PERIMETER STATUS 1 REM X$ = PERIMETER SECURITY BREACH MESSAGE 1 REM Y$ = INSIDE SECURITY BREACH MESSAGE 1 REM Z$ = TEMPORARY STORAGE STRING 1 REM 1 REM *** DISABLE CONSOLE BREAK ON MAIN PORT, AUX PORT, AND KEYBOARD *** 1 REM 1 BYTE $1E = 0 : REM BYTE $7B = 0 : REM BYTE $2E = 0 10 REM 10 REM *** AUX PORT (VIDEO) = 9600,ODD,7,1,TX ENABLED *** 10 REM 10 BYTE $C023 = 62 : BYTE $AA = 37 : BYTE $AB = 33 20 REM 20 REM *** MAIN PORT (PLC) = 9600,EVEN,8,1,TX ENABLED *** 20 REM 20 BYTE $C003 = 30 : BYTE $A7 = 101 : BYTE $A8 = 97 30 REM 30 REM 30 TRAP 7000 40 REM 40 REM *** INITIALIZE VIDEO DISPLAY : SET TIMER 2 TO 1 SEC. *** 40 REM 40 GOSUB 8000 : DBYTE 0 = 10 : ONIRQ 0,9000 : DBYTE 2 = 600 50 BELL : LCD "_INITIALIZED_";BYTE 12;":";BYTE 10;":";BYTE 8; 60 K = 3 : Y$ = "?" : X$ = "??" : H = 61 90 REM 90 REM *** BEGIN MAIN LOOP : SET DEMAND(L) TO 10Kw AND DEMAND(H$) TO NULL *** 90 REM 90 L = 10000 : H$ = "" 100 REM *** LOGIC FOR BAY 1 N WALL LIGHT (POUT 1) *** 100 REM 100 IF PIN 1 = 0 A = 900 : H$ = "A" 110 IF PIN 4 = 1 A = 0 120 IF A L = 10800 200 REM 200 REM *** BAY 1 UP FLOR (POUT 2) *** 200 REM 200 IF PIN 2 = 0 B = 900 : H$ = H$ + "B" 210 IF M = 1 B = 0 220 IF B L = L + 1200 300 REM 300 REM *** BAY 1 DOWN FLOR (POUT 3) *** 300 REM *** TURN ON IF N.W. LIGHTS COME ON *** 300 REM *** ADD 5 MIN. (UP TO 35) EACH TIME THE PIR IS ACTIVE *** 300 REM 300 IF (PIN 3 = 0) AND (C<1800) C = C + 300 : H$ = H$ + "C" 310 IF (A > 0) AND (C = 0) C = A 330 IF C L = L + 2000 400 REM 400 REM *** BAY1 LOWBAYS (POUT 4) *** 400 REM 400 IF PIN 4 = 1 L = L + 1200 : H$ = H$ + "D" 500 REM 500 REM *** BAY2 LOWBAYS (POUT 5) *** 500 REM 500 IF PIN 5 = 1 L = L + 3000 : H$ = H$ + "E" 600 REM 600 REM *** BAY3 HIBAYS (POUT 6) *** 600 REM 600 IF PIN 6 = 1 L = L + 4200 : H$ = H$ + "F" 700 REM 700 REM *** BAY4 HIBAYS (POUT 7) *** 700 REM 700 IF PIN 7 = 1 L = L + 4200 : H$ = H$ + "G" 800 REM 800 REM *** BAY 2 FLOR (POUT 10) *** 800 REM 800 IF ((PIN 10 = 0) AND (S = 0)) OR (PIN 5 = 1) D = 900 : H$ = H$ + "H" 810 IF M = 1 D = 0 820 IF D L = L + 1600 900 REM 900 REM *** BAY 3 FLOR (POUT 11) *** 900 REM *** PIN 9 IS THE FAN SWITCH...TURN LIGHTS ON WHEN PAINTING *** 900 REM 900 IF ((PIN 11 = 0) AND (S = 0)) OR (PIN 9 = 1) E = 900 : H$ = H$ + "I" 910 IF ((PIN 6 = 1) AND (PIN 9 = 0)) OR (M = 1) E = 0 920 IF E L = L + 800 1000 REM 1000 REM *** BAY 2 FAN (POUT 12) *** 1000 REM 1000 IF (PIN 8 = 1) AND (M = 0) H$ = H$ + "J" : L = L + 500 1100 REM 1100 REM *** BAY 4 FLOR (POUT 19) *** 1100 REM 1100 IF (PIN 12 = 1) AND (S = 0) J = 900 : H$ = H$ + "K" 1110 IF (PIN 7 = 1) OR (M = 1) J = 0 1120 IF J L = L + 800 1200 REM 1200 REM *** BAY 5 & 6 FLOR (POUT 20) *** 1200 REM 1200 IF PIN 13 = 1 F = 900 : H$ = H$ + "L" 1210 IF M = 1 F = 0 1220 IF F L = L + 500 1300 REM 1300 REM *** BAY 5 HIBAYS (POUT 21) *** 1300 REM 1300 IF PIN 18 = 1 L = L + 2520 : H$ = H$ + "M" 1400 REM 1400 REM *** BAY 6 HIBAYS (POUT 18) *** 1400 REM 1400 IF PIN 19 = 1 L = L + 3240 : H$ = H$ + "N" 1500 REM 1500 REM *** BAY 3 FANS *** 1500 REM 1500 REM *** PIN 9 = BAY 3 FAN SWITCH *** 1500 REM 1500 IF (PIN 9 = 1) AND (M = 0) I = 1 : L = L + 7000 : H$ = H$ + "O" 1530 IF (PIN 9 = 0) OR (M = 1) I = 0 1535 IF BYTE 12 < 17 GOTO 1600 1540 REM WALK-THROUGH SHUT-DOWN LOGIC 1540 IF (A>850)AND(D>850)AND(E>850)AND(J>850)AND(F>850)AND(A>F)D=5:E=5:J=0:F=0:S=6 1550 IF (A>850)AND(D>850)AND(E>850)AND(J>850)AND(F>850)AND(F>A)D=5:E=5:J=0:A=0:S=6 1600 REM 1600 REM *** REQUEST COMPRESSOR *** 1600 REM 1600 F$ = "Request " 1610 REM 1610 REM *** DISABLE THE COMPRESSOR WHEN SECURITY IS SET *** 1610 REM *** DISABLE THE COMPRESSOR FROM 7:00 P.M. TO 5:00 A.M. *** 1610 REM *** DISABLE THE COMPRESSOR ON SUNDAY *** 1610 REM 1610 IF (M = 1)OR(BYTE 12>19)OR(BYTE 12<5)OR(BYTE 14<2) F$ = "Disabled" 1700 REM 1700 REM *** ADD 5Kw TO DEMAND IF OUTSIDE TEMP.> 75 *** 1700 REM *** KEEP ADDING 5Kw UNTIL THE TEMP.< 7 *** 1700 REM 1700 REM 1700 IF ADC 0 > 79 P = 5000 1710 IF ADC 0 < 75 P = 0 1715 REM *** ADD BUILDING LIGHTS *** 1715 IF (BYTE 12 < 6) OR (BYTE 12 > 18) L = L + 1002 1720 L = L + P 1730 REM 1730 REM *** IF SUPPLY(O) HAS NOT BEEN ESTABLISHED SKIP THE OUTPUT SEQUENCE *** 1730 REM 1730 IF O = 0 GOTO 4000 1740 REM *** IF DEMAND > SUPPLY START THE GENERATOR (M109) *** 1740 IF L < 30000 Q = 0 1750 IF (L > 29999) OR (I = 1) Q = 1 1755 IF O > 1 Y = O-(10000+P) 1760 IF (BYTE 12 < 6) OR (BYTE 12 > 18) Y = Y - 1002 1770 IF O = 1 Y = 0:A = 0:B = 0:C = 0:D = 0:E = 0:F = 0:G = 0:H = 0:J = 0 1780 B$ = "" 1800 REM *** BAY 2 HB *** 1800 Z = INSTR(H$,"E") 1810 IF (Z = 0) OR (Y<3000) POUT 5=0 : GOTO 1830 1820 IF Y>2999 POUT 5=1 : Y = Y-3000 : B$ = B$+"E" 1830 REM *** BAY 3 HB *** 1830 Z = INSTR(H$,"F") 1840 IF (Z = 0) OR (Y<4200) POUT 6=0 : GOTO 1860 1850 IF Y > 4199 POUT 6=1 : Y = Y-4200 : B$ = B$+"F" 1860 REM *** BAY 5 HB *** 1860 Z = INSTR(H$,"M") 1870 IF (Z = 0) OR (Y < 2520) POUT 21=0 : GOTO 1890 1880 IF Y > 2519 POUT 21=1 : Y = Y-2520 : B$ = B$+"M" 1890 REM *** BAY 6 HB *** 1890 Z = INSTR(H$,"N") 1900 IF (Z = 0) OR (Y < 3240) POUT 18=0 : GOTO 1920 1910 IF Y > 3239 POUT 18=1 : Y = Y-3240 : B$ = B$+"N" 1920 REM *** BAY 1 NW *** 1930 IF (A = 0) OR (Y < 800) POUT 1=0 : GOTO 1950 1940 IF Y > 799 POUT 1 = 1 : Y = Y-800 : B$ = "A" 1950 REM *** BAY 1 UP *** 1950 IF (B = 0) OR (Y < 1200) POUT 2=0 : GOTO 1970 1960 IF Y > 1199 POUT 2 = 1 : Y = Y-1200 : B$ = B$+"B" 1970 REM *** BAY 1 DN *** 1970 IF (C = 0) OR (Y < 2000) POUT 3=0 : GOTO 1990 1980 IF Y > 1999 POUT 3 = 1 : Y = Y-2000 : B$ = B$ + "C" 1990 REM *** BAY 1 HB *** 1990 Z = INSTR(H$,"D") 2000 IF (Z = 0) OR (Y < 1200) POUT 4=0 : GOTO 2020 2010 IF Y > 1199 POUT 4=1 : Y = Y-1200 : B$ = B$+"D" 2020 REM *** BAY 4 HB *** 2020 Z = INSTR(H$,"G") 2030 IF (Z = 0) OR (Y < 4200) POUT 7=0 : GOTO 2050 2040 IF Y > 4199 POUT 7=1 : Y = Y-4200 : B$ = B$+"G" 2050 REM *** BAY 2 FL *** 2050 IF (D = 0) OR (Y < 1600) POUT 10=0 : GOTO 2070 2060 IF Y > 1599 POUT 10=1 : Y = Y-1600 : B$ = B$ + "H" 2070 REM *** BAY 3 FL *** 2070 IF (E = 0) OR (Y < 800) POUT 11=0 : GOTO 2090 2080 IF Y > 799 POUT 11=1 : Y = Y-800 : B$ = B$ + "I" 2090 REM *** BAY 2 FN *** 2090 Z = INSTR(H$,"J") 2100 IF (Z = 0) OR (Y < 500) POUT 12=0 : GOTO 2120 2110 IF Y > 499 POUT 12=1 : Y = Y-500 : B$ = B$+"J" 2120 REM *** BAY 4 FL *** 2120 IF (J = 0) OR (Y < 800) POUT 19=0 : GOTO 2140 2130 IF Y > 799 POUT 19=1 : Y = Y-800 : B$ = B$ + "K" 2140 REM *** BAY 6 FL *** 2140 IF (F = 0) OR (Y < 500) POUT 20=0 : GOTO 2170 2150 IF Y > 499 POUT 20=1 : Y = Y-500 : B$ = B$ + "L" 2170 REM *** DAMPER *** 2170 IF (I = 0) OR (O < 45000) OR (Y<7000) POUT 13=0 : I=0 : GOTO 2190 2180 POUT 13=1 : Y = Y-7000 : B$ = B$+"O" 2190 REM *** INTAKE *** 2190 IF (G < 10) OR (I = 0) POUT 15=0 : GOTO 2210 2200 POUT 15=1 : B$ = B$+"P" 2210 REM *** EXHAUST AND PAINT BOOTH PERMIT *** 2210 IF (G < 15) OR (I = 0) POUT 14=0 : POUT 23=1 : E$="Disabled" : GOTO 2230 2220 POUT 14=1 : POUT 23=0 : E$ = "Enabled " : B$ = B$+"Q" 2230 REM *** COMPRESSOR *** 2230 IF (INSTR(F$,"Disabled")=1)OR(Y<6000) POUT 22=1:F$="Disabled":GOTO 3000 2240 IF (INSTR(F$,"Request ")=1)AND(Y>5999)POUT 22=0:L=L+6000:F$="Enabled " 3000 REM 3000 REM *** IF SECURITY IS ON PRINT SECURITY BREACHES TO THE VIDEO *** 3000 REM 3000 IF R = 0 GOTO 4000 3010 Z$ = "" 3020 IF (INSTR(H$,"A")) OR (INSTR(H$,"B")) OR (INSTR(H$,"C")) Z$ = "BAY 1 : " 3040 REM *** BAY 2 *** 3040 IF (INSTR(H$,"H")) Z$ = Z$ + "BAY 2 : " 3060 REM *** BAY 3 *** 3060 IF (INSTR(H$,"I")) Z$ = Z$ + "BAY 3 : " 3080 REM *** BAY 4 *** 3080 IF (INSTR(H$,"K")) Z$ = Z$ + "BAY 4 : " 3100 REM *** BAY 5 *** 3100 IF (INSTR(H$,"L")) Z$ = Z$ + "BAY 5 : " 3120 REM *** M105 IS TRUE WHEN A GAS ALARM HAS OCCURRED *** 3120 IF VAL(K$(6,1)) = 1 Z$ = "******* GAS ALARM ******* : " 3130 REM *** M106 IS TRUE WHEN A FIRE ALARM HAS OCCURRED *** 3130 IF VAL(K$(7,1)) = 1 Z$ = "****** FIRE ALARM ****** : " 3140 REM *** M107 IS TRUE WHEN A SECURITY ALARM HAS OCCURRED *** 3140 REM *** TURN ON BAY 1 DOWNSTAIRS ( 01-13-94 ) *** 3140 IF VAL(K$(8,1)) = 1 Z$ = "*** PERIMETER BREACH *** : " : C = 120 3150 IF LEN(Z$) = 0 GOTO 4000 3160 GOTO 3170+BYTE 14 3170 GOTO 4000 3171 Z$=Z$+"Sun:" : GOTO 3178 3172 Z$=Z$+"Mon:" : GOTO 3178 3173 Z$=Z$+"Tue:" : GOTO 3178 3174 Z$=Z$+"Wed:" : GOTO 3178 3175 Z$=Z$+"Thr:" : GOTO 3178 3176 Z$=Z$+"Fri:" : GOTO 3178 3177 Z$=Z$+"Sat:" 3178 Z = BYTE 12 3180 IF Z > 11 Z$=Z$+STR$(Z-12)+":"+STR$(BYTE 10)+" p.m." 3190 IF Z < 12 Z$=Z$+STR$(Z)+":"+STR$(BYTE 10)+" a.m." 3200 Y$ = Z$ 4000 REM 4000 REM *** PARSE MAIN(PLC) PORT INPUT *** 4000 REM 4000 IF STAT# 0 = 0 GOTO 4330 4001 G$ = "" 4005 IF N = 0 J$ = "" 4010 IF N = 1 K$ = "" 4015 DO : W = INCHR$( 0 ) 4025 A$ = CHR$( W ) 4030 REM CARRIAGE RETURN 4030 IF W = 13 A$ = "*" 4035 REM LINE FEED 4035 IF W = 10 A$ = "" 4040 REM NAK 4040 IF W = 21 A$ = "?" : C$="Invalid Command " 4045 REM ACK 4045 IF W = 6 A$ = "@" 4050 REM ^B 4050 IF W = 2 A$ = "[" 4055 REM ^C 4055 IF W = 3 A$ = "]" 4060 G$ = G$ + A$ 4065 IF LEN(G$) < 6 GOTO 4090 4070 IF (N = 0) AND (LEN(J$)<4) J$ = J$ + A$ 4080 IF (N = 1) AND (LEN(K$)<16) K$ = K$ + A$ 4090 UNTIL (STAT# 0 = 0) OR (LEN(G$)>67) 4095 IF N = 2 L$ = G$ 4100 Z = INSTR(G$,"[") : IF (Z = 0) OR (N = 2) N = 0 : GOTO 4330 4110 REM 4110 REM *** N=0 WHEN THE INPUT IS ANALOG, N=1 WHEN DIGITAL *** 4110 REM 4110 IF N = 0 GOTO 4200 4120 REM *** DETERMINE THE AMOUNT OF POWER AVAILABLE *** 4120 REM *** M101 IS TRUE WHEN GENERATOR POWER IS RUNNING *** 4120 IF VAL(K$(1,1)) = 1 O = 47200 : GOTO 4200 4130 REM *** M100 IS TRUE WHEN EDISON IS ON *** 4130 IF VAL(K$(2,1)) = 1 O = 30000 : GOTO 4200 4140 REM *** IF NO POWER IS AVAILABLE THEN O = 1 *** 4140 O = 1 4200 REM 4200 REM *** R0000 CONTAINS HOURS OF GENERATOR USE *** 4200 REM 4200 REM 4200 REM *** ANALYZE ANALOG VALUE OF D0100 IF SECURITY IS ON *** 4200 REM *** THE VALUE OF D0100 WILL CONTAIN A CODE INDICATING 4200 REM *** THE LAST PERIMETER SECURITY BREACH *** 4200 REM 4200 REM *** R = 0 WHEN SECURITY IS ON (R IS THE DISPLAY-MODE) *** 4200 IF R = 0 GOTO 4330 4205 Z = VAL(J$) 4207 IF Z < 12 GOTO 4210+Z 4210 GOTO 4330 4211 X$ = "LAST PERIMETER BREACH : OFFICE *" : GOTO 4330 4212 X$ = "LAST PERIMETER BREACH : BAY 1 MAN-DOOR *" : C = 120 : GOTO 4330 4213 X$ = "LAST PERIMETER BREACH : BAY 2 MAN-DOOR *" : GOTO 4330 4214 X$ = "LAST PERIMETER BREACH : BAY 4 MAN-DOOR *" : GOTO 4330 4215 X$ = "LAST PERIMETER BREACH : BAY 6 MAN-DOOR *" : GOTO 4330 4216 X$ = "LAST PERIMETER BREACH : BAY 1 BAY-DOOR *" : GOTO 4330 4217 X$ = "LAST PERIMETER BREACH : BAY 2 BAY-DOOR *" : GOTO 4330 4218 X$ = "LAST PERIMETER BREACH : BAY 3 BAY-DOOR *" : GOTO 4330 4219 X$ = "LAST PERIMETER BREACH : BAY 4 BAY-DOOR *" : GOTO 4330 4220 X$ = "LAST PERIMETER BREACH : BAY 5 BAY-DOOR *" : GOTO 4330 4221 X$ = "LAST PERIMETER BREACH : BAY 6 BAY-DOOR *" 4330 REM 4330 REM *** PARSE AUX PORT INPUT *** 4330 REM *** GLOBAL VARIABLE C$ (Command input) *** 4330 REM 4330 X = INCHR$( 1 ) : IF X=0 GOTO 4990 4335 DBYTE 2 = 600 4340 A$ = CHR$( X ) 4350 IF (X = 10) OR (X = 13) GOTO 4410 4360 IF INSTR(C$,"*") = 1 C$ = "" 4370 C$ = C$ + A$ 4380 REM 4380 REM *** TOGGLE (M)ODE TO SET SECURITY SYSTEM *** 4380 REM 4380 IF INSTR(C$,"1320") = 1 M = 1 - M : R = M : BELL : GOSUB 8000 : C$ = "" 4390 IF LEN(C$) => 60 C$ = "" 4400 IF STAT# 1 <> 0 GOTO 4330 4405 GOTO 5000 4410 REM 4410 REM *** PROCESS USER COMMAND *** 4410 REM 4410 REM *** RESET VIDEO DISPLAY : "C"LS COMMAND *** 4410 REM 4410 IF INSTR(C$,"C") = 1 GOSUB 8000 : C$ = "": L$ = "" 4420 REM 4420 REM *** CHANGE SCREEN MODES *** 4420 REM 4420 IF INSTR(C$," ") = 1 R = 1 - R:GOSUB 8000:C$ = "":U$ = "":W$ = "":T$ = "" 4430 REM 4430 REM *** SET ALL TIMERS TO 0 : "R"ESET COMMAND *** 4430 REM 4430 IF INSTR(C$,"R")=1 A = 0:B = 0:C = 0:D = 0:E = 0:F = 0:G = 0:H = 0:J = 0:C$ = "" 4435 REM 4435 REM *** START THE GENERATOR : "GEN" COMMAND *** 4435 REM 4435 IF INSTR(C$,"GEN") = 1 Q = 1 : C$ = "" 4440 REM 4440 REM *** SET TEMPERATURE OFFSET (0 TO 9) *** 4440 REM 4440 IF INSTR(C$,"T") = 1 K = VAL(C$(2,1)):C$ = "":DBYTE 4 = 0 4450 REM 4450 REM *** SET THE HOUR IN THE REAL-TIME-CLOCK *** 4450 IF INSTR(C$,"H") = 1 NVR -10 = VAL(C$(2,2)):C$ = "" 4460 REM 4460 REM *** SET THE MIN. IN THE REAL-TIME-CLOCK *** 4460 IF INSTR(C$,"M") = 1 NVR -12 = VAL(C$(2,2)):C$ = "" 4850 REM 4850 REM *** SEND DIRECT COMMAND TO PLC *** 4850 REM 4850 IF INSTR(C$,"00FF") = 0 GOTO 4900 4860 IF INSTR(C$,"00FF") <> 1 GOTO 4900 4870 DO:Z=INCHR$(0):UNTIL STAT# 0 = 0 4880 PRINT# 0 CHR$(5);C$;CHR$(13);CHR$(10); : C$ = "" : N = 2 4900 IF LEN(C$) <> 0 C$ = "Invalid Command " 4990 IF DBYTE 2 = 0 GOTO 5130 5000 REM 5000 REM *** THIS ROUTINE UPDATES THE VIDEO DISPLAY *** 5000 REM 5000 Z$ = CHR$(13) + CHR$(10) 5010 IF R = 1 GOTO 5130 5020 REM PRINT A CARRIAGE RETURN/LINE FEED TO THE DISPLAY 5020 PRINT# 1 Z$; 5030 REM ACTIVE INPUTS(H$), OUTPUTS(B$), M100(K$) 5030 PRINT# 1 H$ ; " * ";Z$ ; B$ ; " * " ; Z$ ; Z$ ; K$ ; Z$ ; Z$ ; 5040 REM TEMPERATURE DATA 5040 PRINT# 1 ADC 0;Z$;(ADC 1-K);Z$;(ADC 2-K);Z$;(ADC 3-K);Z$;(ADC 5-K) 5045 PRINT# 1 K ; Z$ ; Z$ ; Z$ ; Z$ ; L$ ; Z$ ; J$ 5050 REM Air Conditioning usage(P), watts supplied(O), watts demanded(L) 5050 PRINT# 1 STR$(P) ; Z$ ; STR$(O) ; Z$ ; STR$(L) 5060 REM Security Status 5060 IF VAL(K$(4,1)) = 1 PRINT# 1 "ARMED " 5070 IF VAL(K$(4,1)) = 0 PRINT# 1 "DISARMED" 5080 PRINT# 1 E$ ; Z$ ; F$ ; Z$ ; G$ ; " " ; Z$ ; 5090 PRINT# 1 "Command ? "; 5095 IF VAL(C$(1,1)) = 1 GOTO 5130 5100 PRINT# 1 C$; 5110 IF LEN( C$ ) = 0 PRINT# 1 "* "; : C$ = "*" 5120 IF INSTR(C$,"Invalid Command ") = 1 C$ = "" : PRINT# 1 CHR$(7); 5130 REM 5130 REM *** PRINT SECURITY STATUS TO THE DISPLAY *** 5130 REM 5130 IF R = 0 GOTO 5190 5140 IF INSTR(Y$,T$) = 0 PRINT# 1 Y$: T$ = Y$:PRINT# 1 " ***";CHR$(13); 5150 IF INSTR(X$,W$) = 0 PRINT# 1 X$: W$ = X$:PRINT# 1 " ***";CHR$(13); 5160 IF VAL(K$(4,1)) = 0 V$ = "Security is NOT ARMED !" 5170 IF VAL(K$(4,1)) = 1 V$ = "Security is ARMED...Please exit through Bay 1 Man-door !" 5180 IF INSTR(V$,U$) = 0 PRINT# 1 V$ : U$ = V$ 5190 REM *** N=2 AFTER SENDING A DIRECT COMMAND TO THE PLC *** 5190 IF N = 2 GOTO 90 5200 N = 1 - N 5210 REM *** WORD READ D100 (PERIMETER BREACH) OR R000 (GENERATOR HOURS) *** 5210 IF (N = 0)AND(R=1) PRINT# 0 CHR$(5);"00FFWR0D010001";CHR$(13);CHR$(10); 5215 IF (N = 0)AND(R=0) PRINT# 0 CHR$(5);"00FFWR0R000001";CHR$(13);CHR$(10); 5220 REM *** BIT READ M100-M115 *** 5220 IF N = 1 PRINT# 0 CHR$(5);"00FFBR0M010010";CHR$(13);CHR$(10); 5230 REM 5230 REM *** SEND TEMPERATURE DATA TO THE PLC EVERY 3 MINUTES *** 5230 REM 5230 IF DBYTE 4 > 0 GOTO 5455 5240 Z$ = CHR$(5) + "00FFWW0D000005" 5250 REM 5250 REM *** OUTSIDE TEMPERATURE *** 5250 REM 5250 Z = ADC 0 : IF Z < 100 Z$ = Z$ + "0" 5260 IF Z < 10 Z$ = Z$ + "0" 5270 Z$ = Z$ + "0" + STR$(Z) 5280 REM 5280 REM *** BAY 1 TEMPERATURE *** 5280 REM *** SUBTRACT K DEGREES WHEN THE HIGHBAYS ARE ON *** 5280 REM 5280 Z = ADC 1 : IF INSTR(B$,"D") <> 0 OR INSTR(B$,"C") <> 0 Z = Z - K 5290 IF Z < 100 Z$ = Z$ + "0" 5300 IF Z < 10 Z$ = Z$ + "0" 5310 Z$ = Z$ + "0" + STR$(Z) 5320 REM 5320 REM *** BAY 2 TEMPERATURE *** 5320 REM 5320 Z = ADC 2 : IF INSTR(B$,"E") <> 0 Z = Z - K 5330 IF Z < 100 Z$ = Z$ + "0" 5340 IF Z < 10 Z$ = Z$ + "0" 5350 Z$ = Z$ + "0" + STR$(Z) 5360 REM 5360 REM *** BAY 3&4 TEMPERATURE *** 5360 REM 5360 Z = ADC 3 : IF (INSTR(B$,"F")<>0) OR (INSTR(B$,"G")<>0) Z = Z - K 5370 IF Z < 100 Z$ = Z$ + "0" 5380 IF Z < 10 Z$ = Z$ + "0" 5390 Z$ = Z$ + "0" + STR$(Z) 5400 REM 5400 REM *** BAY 5&6 TEMPERATURE *** 5400 REM 5400 Z = ADC 5 : IF (INSTR(B$,"M")<>0) OR (INSTR(B$,"N")<>0) Z = Z - K 5410 IF Z < 100 Z$ = Z$ + "0" 5420 IF Z < 10 Z$ = Z$ + "0" 5430 Z$ = Z$ + "0" + STR$(Z) + CHR$(13) + CHR$(10) 5440 PRINT# 0 Z$; 5450 DBYTE 4 = 1800 5455 REM *** JUMP OVER THE RTC ROUTINE UNLESS THE MINUTE HAS CHANGED *** 5455 IF H = BYTE 10 GOTO 5625 5460 REM 5460 REM *** SEND REAL TIME CLOCK DATA TO PLC *** 5460 REM 5460 REM *** SECONDS *** 5460 Z$ = CHR$(5) + "00FFWW0D0020070" 5470 Z = BYTE 8 : IF Z < 10 Z$ = Z$ + "0" 5480 Z$ = Z$ + "0" + STR$(Z) + "00" 5490 REM *** MINUTES *** 5490 Z = BYTE 10 : IF Z < 10 Z$ = Z$ + "0" 5500 Z$ = Z$ + STR$(Z) + "00" 5510 REM *** HOURS *** 5510 Z = BYTE 12 : IF Z < 10 Z$ = Z$ + "0" 5520 Z$ = Z$ + STR$(Z) + "000" 5530 REM *** DAY OF WEEK *** 5530 Z = BYTE 14 : Z$ = Z$ + STR$(Z) + "00" 5540 REM *** DAY OF MONTH *** 5540 Z = BYTE 15 : IF Z < 10 Z$ = Z$ + "0" 5550 Z$ = Z$ + STR$(Z) + "00" 5560 REM *** MONTH *** 5560 Z = BYTE 16 : IF Z < 10 Z$ = Z$ + "0" 5570 Z$ = Z$ + STR$(Z) 5580 REM *** YEAR *** 5580 Z = BYTE 17 : IF Z < 90 Z$ = Z$ + "20" 5590 IF Z < 10 Z$ = Z$ + "0" : GOTO 5610 5600 IF Z > 90 Z$ = Z$ + "19" 5610 Z$ = Z$ + STR$(Z) + CHR$(13) + CHR$(10) 5620 PRINT# 0 Z$;:H = BYTE 10 5625 REM 5625 REM *** START THE GENERATOR ON TUESDAY AT 7:00 A.M. *** 5625 REM 5625 IF (BYTE 10 = 0) AND (BYTE 12 = 7) AND (BYTE 14 = 3) Q = 1 5630 REM 5630 REM *** WRITE TO PLC M108 TO 0 OR 1 TO SET SECURITY SYSTEM *** 5630 REM *** WRITE TO PLC M109 TO 0 OR 1 TO START GENERATOR *** 5630 REM *** WRITE TO PLC M110 TO 0 OR 1 BAY 1 SECURITY ALERT *** 5630 REM *** WRITE TO PLC M111 TO 0 OR 1 BAY 2 SECURITY ALERT *** 5630 REM *** WRITE TO PLC M112 TO 0 OR 1 BAY 3 SECURITY ALERT *** 5630 REM *** WRITE TO PLC M113 TO 0 OR 1 BAY 4 SECURITY ALERT *** 5630 REM *** WRITE TO PLC M114 TO 0 OR 1 BAY 5 SECURITY ALERT *** 5630 REM *** WRITE 1 TO PLC M116 TO CHECK COMMUNICATION *** 5630 REM 5630 Z$ = CHR$(5) + "00FFBW0M010808" + STR$(M) + STR$(Q) 5640 REM 5640 REM *** CHECK FOR INSIDE SECURITY BREACH *** 5640 REM *** BAY 1 *** 5640 IF (INSTR(H$,"A")) OR (INSTR(H$,"B")) OR (INSTR(H$,"C")) Z$ = Z$ + "1" 5650 IF LEN(Z$) < 18 Z$ = Z$ + "0" 5660 REM *** BAY 2 *** 5660 IF (INSTR(H$,"H")) Z$ = Z$ + "1" 5660 IF LEN(Z$) < 19 Z$ = Z$ + "0" 5670 REM *** BAY 3 *** 5670 IF (INSTR(H$,"I")) Z$ = Z$ + "1" 5680 IF LEN(Z$) < 20 Z$ = Z$ + "0" 5690 REM *** BAY 4 *** 5690 IF (INSTR(H$,"K")) Z$ = Z$ + "1" 5700 IF LEN(Z$) < 21 Z$ = Z$ + "0" 5710 REM *** BAY 5 *** 5710 IF (INSTR(H$,"L")) Z$ = Z$ + "1" 5720 IF LEN(Z$) < 22 Z$ = Z$ + "0" 5730 Z$ = Z$ + "1" + CHR$(13) + CHR$(10) 5740 PRINT# 0 Z$; 5800 REM 5800 REM *** LOOP TO BEGINNING *** 5800 REM 5800 GOTO 90 7000 REM 7000 REM *** ERROR TRAP ROUTINE *** 7000 REM 7000 PRINT#1 "Error #"; BYTE $1F ; " in Line #"; DBYTE 32 7010 PRINT# 1 CHR$(7); 7020 STOP 8000 REM 8000 REM *** INITIALIZE DISPLAY *** 8000 REM 8000 PRINT# 1 CHR$(12); CHR$(7); 8010 IF R = 1 GOTO 8300 8020 PRINT# 1 " -----------Active Inputs-----------> Bay 1... A = North wall" 8030 PRINT# 1 " -----------Active Outputs----------> B = Upstairs" 8040 PRINT# 1 "0123456789ABCDEF = M100-M115, True = 1, False = 0 C = Downstairs" 8050 PRINT# 1 " ------------> 0 = Generator ready D = Highbays" 8060 PRINT# 1 " Temperature Data 1 = Edison power on Bay 2... E = Highbays" 8080 PRINT# 1 " = Outside 2 = Generator error H = Flourescents" 8090 PRINT# 1 " = Bay 1 3 = Security on J = Fan" 8095 PRINT# 1 " = Bay 2 4 = Main gas valve Bay 3... F = Highbays" 8100 PRINT# 1 " = Bay 3 & 4 5 = Gas alarm I = Flourescents" 8110 PRINT# 1 " = Bay 5 & 6 6 = Fire alarm O = Damper" 8120 PRINT# 1 " = Temperature Offset 7 = Security alarm P = Intake" 8130 PRINT# 1 " ( Enter 'T' + # ) 8 = Set security Q = Exhaust" 8140 PRINT# 1 " 9 = Start Generator Bay 4... G = Highbays" 8150 PRINT# 1 " A = Intruder Bay 1 K = Flourescents" 8160 PRINT# 1 "*** Reserved for PLC reply *** B = Intruder Bay 2 Bay 5... M = Highbays" 8170 PRINT# 1 " = Generator Hours C = Intruder Bay 3 L = Flourescents" 8180 PRINT# 1 " = Air Cond. Demand D = Intruder Bay 4 Bay 6... N = Highbays" 8190 PRINT# 1 " = Wattage Supply E = Intruder Bay 5" 8200 PRINT# 1 " = Wattage Demand F = Comm. Check Bit" 8210 PRINT# 1 " = Security Status -> Begin PLC commands with '00FF'." 8220 PRINT# 1 " = Spray Booth Status -> Spacebar + Enter changes screen modes." 8230 PRINT# 1 " = Compressor Status -> Enter 'CLS' to reset display." 8240 PRINT# 1 CHR$(10); 8250 PRINT# 1 "Command ? "; : RETURN 8300 REM 8300 REM *** DISPLAY COMMAND SET AND DUMP VARIABLES *** 8300 REM 8300 PRINT# 1 " **** Command Set ****" 8310 PRINT# 1 " > CLS + Enter clears the screen and" 8320 PRINT# 1 " resets the PLC reply string." 8330 PRINT# 1 " > RESET + Enter sets all timers to zero." 8340 PRINT# 1 " > Spacebar + Enter changes display mode." 8350 PRINT# 1 " > T# + Enter sets temperature offset." 8360 PRINT# 1 CHR$(10); 8370 PRINT# 1 " *** Example PLC Commands ***" 8375 PRINT# 1 " > 00FFBR0X008010 : 00FFWW0D020005" 8380 PRINT# 1 " 1...2345....6. 1...2345....6." 8390 PRINT# 1 " -------------------------------" 8400 PRINT# 1 " 1. PLC address (Always 00FF)" 8410 PRINT# 1 " 2. Bit/Word" 8420 PRINT# 1 " 3. Read/Write" 8430 PRINT# 1 " 4. Response Delay (Use zero)" 8440 PRINT# 1 " 5. Device address (X,Y,M,D,etc.)" 8450 PRINT# 1 " 6. # of I/O points in HEX (10 = 16)" 8460 PRINT# 1 " CAUTION : Writing to M0100-M0115 may" 8470 PRINT# 1 " cause unexpected machine operation." 8480 PRINT# 1 CHR$(10); 8490 PRINT# 1 "A=";A;" B=";B;" C=";C;" D=";D;" E=";E;" F=";F;" G=";G;" H=";H 8500 PRINT# 1 "I=";I;" J=";J;" K=";K;" L=";L;" M=";M;" N=";N;" O=";O;" P=";P 8510 PRINT# 1 "Q=";Q;" R=";R;" S=";S;" T=";T;" U=";U;" V=";V;" W=";W;" X=";X 8520 PRINT# 1 "Y=";Y;" Z=";Z 8530 RETURN 9000 REM 9000 REM *** INC/DEC TIMERS *** 9000 REM 9000 IF A A = A-1 9030 IF B B = B-1 9040 IF C C = C-1 9050 IF D D = D-1 9060 IF E E = E-1 9070 IF F F = F-1 9080 IF J J = J-1 9085 IF S S = S-1 9090 IF (I = 1) AND (G < 15) G = G+1 9110 IF I = 0 G = 0 9120 DBYTE 0 = 10 : RETURN