つづき
SUB ladder !ラダーロジックのテーブルを計算する FOR xx=1 TO w !1列目から(母線から順次右へ) ※サイクルタイム !AND結線の計算 FOR yy=h TO 1 STEP -1 !1行目から(先頭行から末尾行まで1列ごと) LET tt$=UCASE$(cTBL$(yy,xx)) !機器を得る IF tt$<>"" THEN !機器なら LET nm=nTBL(yy,xx) !番号を得る LET v1=xPrev(xx,yy) !前列からの積を考慮して SELECT CASE tt$ CASE "SA" !スイッチのa接点 LET v0=X(nm) CASE "SB" !スイッチのb接点 LET v0=NT(X(nm)) CASE "A" !リレーのa接点 LET v0=Y(nm) CASE "B" !リレーのb接点 LET v0=NT(Y(nm)) CASE "TA" !タイマのa接点 LET v0=T(nm) CASE "TB" !タイマのb接点 LET v0=NT(T(nm)) CASE "CA" !カウンタのa接点 LET v0=C(nm) CASE "CB" !カウンタのb接点 LET v0=NT(C(nm)) CASE "O" !リレーのコイル CALL relay(nm,v1) LET v0=Y(nm) CASE "T" !タイマ CALL tim(nm,vTMR(nm),v1) LET v0=T(nm) CASE "C" !カウンタ CALL cnt(nm,vCNT(nm),v1) LET v0=C(nm) CASE "CR" !カウンタリセット CALL cntclr(nm,v1) LET v0=C(nm) CASE "─","┬","┤","┘","┴" !結線 LET v0=1 CASE "│","├","└" !結線 LET v0=0 !前列とは無関係 CASE ELSE PRINT cTBL$(yy,xx);" は未サポートです。" STOP END SELECT LET vTBL(yy,xx)=AND(v1,v0) !状態を設定する END IF NEXT yy !OR結線の計算 LET v1=0 FOR yy=h TO 1 STEP -1 !1行目から SELECT CASE UCASE$(cTBL$(yy,xx)) !結線なら CASE "┬" !開始 LET v1=vTBL(yy,xx) LET sav_yy=yy !行を記録する CASE "┤","│","├" !延長 LET v1=OR(v1,vTBL(yy,xx)) !1つ上との論理和 CASE "┘","└","┴" !終了 LET v1=OR(v1,vTBL(yy,xx)) FOR tmp=yy TO sav_yy !ここまでを同じにする LET vTBL(tmp,xx)=v1 NEXT tmp LET v1=0 CASE ELSE END SELECT NEXT yy NEXT xx !MAT PRINT vTBL !debug END SUB
|