20220830ProgBtn6.txt

31Aug - by Joe-90 - 0 - In 未分類

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