20220830ProgBtn6.txt
HOPE-2020およびHOPE-2022システムの新しいプログラムです。
ピン番号や、命令の方法が大きく変わっています。
20220830ProgBtn6.txt
10 '---20220830ProgBtn6.txt
20 OUT $E3,$8A
30 OUT $E7,$83
40 P%=0
50 N%=0:PROG$=" "
60 SUB%=0:ST%=0
70 MUKI%=0:PMUKI%=0
80 OUT $E0,0:A%=0
90 IF SUB%=0 THEN OUT $E5,255 ELSE OUT $E5,241
100 '
110 PRINT "PROG?":PIN%=IN($E5)
120 IF PIN%=IN($E5)GOTO 120
130 PIN%=IN($E5)
140 IF BIT(PIN%,0)=0 GOTO 1120
150 IF BIT(PIN%,7)=0 THEN PROG$=PROG$+"0"
160 IF BIT(PIN%,6)=0 THEN PROG$=PROG$+"4"
170 IF BIT(PIN%,5)=0 THEN PROG$=PROG$+"2"
180 IF BIT(PIN%,4)=0 THEN PROG$=PROG$+"3"
190 IF BIT(PIN%,3)=0 THEN PROG$=PROG$+"1"
200 IF BIT(PIN%,2)=0 GOTO 250
210 IF N%=LEN(PROG$)GOTO 120 ELSE GOTO 220
220 N%=LEN(PROG$)
230 IF N%>=38 THEN PRINT "OVERFLOW!":GOSUB 890:GOTO 40
240 PRINT "INPUT>>>",RIGHT$(PROG$,1),PROG$:GOTO 120
250 '---TONE=F
260 BEEP INT(50000/440)
270 GOSUB 890
280 '
290 PRINT "RUN":PRINT " "
300 OUT $E0,254
310 HUA%=0:HUB%=0
320 SHUT$="O"
330 '
340 FOR C%=1 TO N%
350 P%=VAL(RIGHT$(LEFT$(PROG$,C%+1),1))
360 IF C%<N% THEN PF%=VAL(RIGHT$(LEFT$(PROG$,C%+2),1))
370 PRINT " ":PRINT " LOOP >>> ",C%
380 PRINT P%,PF%
390 '
400 IF P%<PF% THEN PMUKI%=0
410 IF P%>PF% THEN PMUKI%=1
420 '
430 '-----MAIN-----
440 '
450 H%=IN($E1)
460 BT%=IN($E5)
470 '
480 IF (ST%=1)*(BIT(BT%,2)=0)THEN PRINT "RESTORE.":GOTO 40
490 IF BIT(BT%,0)=0 GOTO 1120
500 IF (BIT(BT%,1)=0)*(ST%=0)THEN P%=2:PF%=1:PRINT "STOP":ST%=1:GOTO 400
510 '
520 IF BIT(H%,7)=1 THEN MUKI%=0:'RIGHT
530 '
540 IF BIT(H%,3)=1 THEN MUKI%=0:SUB%=1
550 IF (BIT(H%,3))*(ST%=1)THEN ST%=0:GOTO 1050
560 '
570 IF BIT(H%,5)=1 THEN HUA%=1:GOSUB 1010
580 IF (BIT(H%,5))*(P%=2)THEN MUKI%=PMUKI%
590 IF (BIT(H%,5))*(P%>2)THEN MUKI%=0
600 IF (BIT(H%,5))*(P%=1)THEN MUKI%=1:SUB%=1
610 IF (BIT(H%,5))*(P%=0)THEN MUKI%=1:SUB%=0
620 '
630 IF BIT(H%,4)=1 THEN HUB%=1
640 IF (BIT(H%,4))*(P%=3)THEN MUKI%=PMUKI%
650 IF (BIT(H%,4))*(P%>3)THEN MUKI%=0
660 IF (BIT(H%,4))*(P%<3)THEN MUKI%=1
670 '
680 IF BIT(H%,6)=1 THEN MUKI%=1:'LEFT
690 '
700 IF HUA%+HUB%=0 THEN SHUT$="O"
710 IF HUA%+HUB%=1 THEN SHUT$="C"
720 IF HUA%+HUB%=2 THEN SHUT$="O":HUA%=0:HUB%=0:GOSUB 890
730 '
740 IF SHUT$="O"THEN OUT $E2,(4+3*MUKI%)
750 IF SHUT$="C"THEN OUT $E2,(0+3*MUKI%)
760 '
770 PT%=255
780 IF SUB%=0 THEN RES PT%,7
790 IF SUB%=1 THEN FOR X%=4 TO 7:RES PT%,X%:NEXT X%
800 OUT $E4,PT%
810 '
820 IF P%=0 THEN A%=7
830 IF P%=1 THEN A%=3
840 IF P%=2 THEN A%=5
850 IF P%=3 THEN A%=4
860 IF P%=4 THEN A%=6
870 IF BIT(H%,A%)=1 GOTO 930 ELSE GOTO 430
880 '
890 FOR LOOP%=1 TO 300
900 NEXT LOOP%
910 RETURN
920 '
930 PRINT "PASS POINT>>>",A%
940 NEXT C%
950 IF PF%=0 THEN OUT $E2,7:IF BIT(IN($E1),7)=0 THEN OUT $E0,0 ELSE GOTO 950
960 FOR FIN%=1 TO 2
970 BEEP INT(50000/440):GOSUB 890
980 NEXT FIN%
990 GOTO 80
1000 '
1010 IF PF%=2 THEN SUB%=1:MUKI%=1
1020 IF PF%=1 THEN SUB%=0:MUKI%=1
1030 RETURN
1040 '
1050 OUT $E0,0:PRINT "RESET?"
1060 FOR CON%=0 TO 2500
1070 IF BIT(IN($E5),2)=0 THEN PROG$="2351":GOTO 220
1080 IF INT(CON%/250)=(CON%/250)THEN PRINT 10-(CON%/250)
1090 NEXT CON%
1100 GOTO 60
1110 '
1120 PRINT "Emergency brake activated!"
1130 OUT $E0,0
1140 IF SUB%=0 THEN OUT $E5,255 ELSE OUT $E5,241
1150 FOR EM%=1 TO 3
1160 GOSUB 890
1170 '---TONE=F
1180 BEEP INT(50000/440)
1190 NEXT EM%
1200 STOP
20220831ProgBtn6解説.txt
10 '---20220830ProgBtn6.txt
20 OUT $E3,$8A
30 OUT $E7,$83
20~30 82C55コントロールワード設定
40 P%=0
40 現在位置P%(POINT)を1に設定
50 N%=0:PROG$=" "
50 命令入力のPROG$とその文字数N%を設定
60 SUB%=0:ST%=0
70 MUKI%=0:PMUKI%=0
60 ポイント切り替えの制御SUB%を本線側にして、車両を待避線に格納するかどうかのST%(STOP)を格納しないように設定する
70 現在の進行方向MUKI%と目的地に到着してからの進行方向をPMUKI%(POINT-MUKI)を右に設定する
80 OUT $E0,0:A%=0
90 IF SUB%=0 THEN OUT $E5,255 ELSE OUT $E5,241
80 列車を停止させる
90 ポイント切り替えを制御するソレノイドの電源を切る
100 '
110 PRINT "PROG?":PIN%=IN($E5)
110 PROG$を入力待ちにする
120 IF PIN%=IN($E5)GOTO 120
120 同じ信号を連続して読み込まないようにする
130 PIN%=IN($E5)
130 操作パネルからの入力信号をPIN%に格納する
140 IF BIT(PIN%,0)=0 GOTO 1120
140 緊急停止ボタン用
150 IF BIT(PIN%,7)=0 THEN PROG$=PROG$+"0"
160 IF BIT(PIN%,6)=0 THEN PROG$=PROG$+"4"
170 IF BIT(PIN%,5)=0 THEN PROG$=PROG$+"2"
180 IF BIT(PIN%,4)=0 THEN PROG$=PROG$+"3"
190 IF BIT(PIN%,3)=0 THEN PROG$=PROG$+"1"
150~190 ボタン入力に沿って命令をPROG$の最後尾に追加する
200 IF BIT(PIN%,2)=0 GOTO 250
200 発車ボタン用
210 IF N%=LEN(PROG$)GOTO 120 ELSE GOTO 220
220 N%=LEN(PROG$)
210~220 PROG$の文字数を数えて、文字数が変化していたら更新する
230 IF N%>=38 THEN PRINT "OVERFLOW!":GOSUB 890:GOTO 40
230 変数の桁数が40お超えるとオーバーフローが発生するので、その前に警告を兼ねてPROG$をリセットする
240 PRINT "INPUT>>>",RIGHT$(PROG$,1),PROG$:GOTO 120
240 入力された信号を表示する
250 '---TONE=F
260 BEEP INT(50000/440)
270 GOSUB 890
260 発車音代わりに0.1秒間"ラ"の音を鳴らす
270 行番号600(FOR文による遅延プログラム)で発車までの間隔をあける
280 '
290 PRINT "RUN":PRINT " "
300 OUT $E0,254
310 HUA%=0:HUB%=0
320 SHUT$="O"
290 デバッグ用プリント
300 列車を発車させる
310 踏切用フラグHUA%,HUB%(HUMIKIRI-A,HUMIKIRI-B)をそれぞれ0にする
320 踏切開閉を制御するSHUT$をO(OPEN)にする
330 '
340 FOR C%=1 TO N%
350 P%=VAL(RIGHT$(LEFT$(PROG$,C%+1),1))
360 IF C%<N% THEN PF%=VAL(RIGHT$(LEFT$(PROG$,C%+2),1))
370 PRINT " ":PRINT " LOOP >>> ",C%
380 PRINT P%,PF%
340 メインシステムのループを、N%(L-110)回繰り返す
350~360 プログラムを1文字ずつ順番に抜き出してP%(POINT),PF%(POINT-FUTURE)に格納する
370~380 デバッグ用プリント
390 '
400 IF P%<PF% THEN PMUKI%=0
410 IF P%>PF% THEN PMUKI%=1
410~420 目的地とスタート位置から到着後の方向を割り出す
420 '
430 '-----MAIN-----
440 '
450 H%=IN($E1)
460 BT%=IN($E5)
470 '
480 IF (ST%=1)*(BIT(BT%,2)=0)THEN PRINT "RESTORE.":GOTO 40
490 IF BIT(BT%,0)=0 GOTO 1120
500 IF (BIT(BT%,1)=0)*(ST%=0)THEN P%=2:PF%=1:PRINT "STOP":ST%=1:GOTO 400
510 '
520 IF BIT(H%,7)=1 THEN MUKI%=0:'RIGHT
530 '
540 IF BIT(H%,3)=1 THEN MUKI%=0:SUB%=1
550 IF (BIT(H%,3))*(ST%=1)THEN ST%=0:GOTO 1050
560 '
570 IF BIT(H%,5)=1 THEN HUA%=1:GOSUB 1010
580 IF (BIT(H%,5))*(P%=2)THEN MUKI%=PMUKI%
590 IF (BIT(H%,5))*(P%>2)THEN MUKI%=0
600 IF (BIT(H%,5))*(P%=1)THEN MUKI%=1:SUB%=1
610 IF (BIT(H%,5))*(P%=0)THEN MUKI%=1:SUB%=0
620 '
630 IF BIT(H%,4)=1 THEN HUB%=1
640 IF (BIT(H%,4))*(P%=3)THEN MUKI%=PMUKI%
650 IF (BIT(H%,4))*(P%>3)THEN MUKI%=0
660 IF (BIT(H%,4))*(P%<3)THEN MUKI%=1
670 '
680 IF BIT(H%,6)=1 THEN MUKI%=1:'LEFT
450~680 ホールICの入力によって踏切制御HUA%,HUB%とMUKI%,SUB%を設定する
690 '
700 IF HUA%+HUB%=0 THEN SHUT$="O"
710 IF HUA%+HUB%=1 THEN SHUT$="C"
720 IF HUA%+HUB%=2 THEN SHUT$="O":HUA%=0:HUB%=0:GOSUB 890
700~720 踏切の開閉を認識する
730 '
740 IF SHUT$="O"THEN OUT $E2,(4+3*MUKI%)
750 IF SHUT$="C"THEN OUT $E2,(0+3*MUKI%)
740~750 踏切の開閉を出力する
760 '
770 PT%=255
780 IF SUB%=0 THEN RES PT%,7
790 IF SUB%=1 THEN FOR X%=4 TO 7:RES PT%,X%:NEXT X%
800 OUT $E4,PT%
770~800 ポイント切り替えの出力をする
810 '
820 IF P%=0 THEN A%=7
830 IF P%=1 THEN A%=3
840 IF P%=2 THEN A%=5
850 IF P%=3 THEN A%=4
860 IF P%=4 THEN A%=6
870 IF BIT(H%,A%)=1 GOTO 930 ELSE GOTO 430
820~860 センサー番号からポート番号に変換する
870 目的地に到着したらループの先頭に戻る
880 '
890 FOR LOOP%=1 TO 300
900 NEXT LOOP%
910 RETURN
890~910 FOR文を用いた遅延プログラム
920 '
930 PRINT "PASS POINT>>>",A%
940 NEXT C%
930 ディスプレイ用出力
950 IF PF%=0 THEN OUT $E2,7:IF BIT(IN($E1),7)=0 THEN OUT $E0,0 ELSE GOTO 950
950 停車時の位置修正
960 FOR FIN%=1 TO 2
970 BEEP INT(50000/440):GOSUB 890
980 NEXT FIN%
990 GOTO 80
960~990 プログラム通り走ったらBeep音を鳴らす
1000 '
1010 IF PF%=2 THEN SUB%=1:MUKI%=1
1020 IF PF%=1 THEN SUB%=0:MUKI%=1
1030 RETURN
1000~1030 方向を制御して出力する
1040 '
1050 OUT $E0,0:PRINT "RESET?"
1060 FOR CON%=0 TO 2500
1070 IF BIT(IN($E5),2)=0 THEN PROG$="2351":GOTO 220
1080 IF INT(CON%/250)=(CON%/250)THEN PRINT 10-(CON%/250)
1090 NEXT CON%
1100 GOTO 60
1110 '
1120 PRINT "Emergency brake activated!"
1130 OUT $E0,0
1140 IF SUB%=0 THEN OUT $E5,255 ELSE OUT $E5,241
1150 FOR EM%=1 TO 3
1160 GOSUB 890
1170 '---TONE=F
1180 BEEP INT(50000/440)
1190 NEXT EM%
1200 STOP