一往確認日記 |
2016年12月20日
_ Escalator - bit stack 初期化
Escalatorというのは、各種PLCがメーカーや機種毎にプロジェクトデータが異なるため互換性がなく、移植するのが大変なのを解決しようとするものです。
ここのescalatorのカテゴリーを見てもらえると今までの経緯を見てもらうことができます。
今回はbit stackの初期化です。
パソコンとのやり取りの部分もありますが、省略します。
bit stackはLDから始まるブロックの状態やMPSなどで分岐する時に記憶するための領域です。
SD_DEVICE[ESC_SD_I_BSTACK]から4 word取っています。 ANBなどで最終的にすべてのANDを取ってtrue/falseを判定するので初期値としてオール1のFFFFを設定しています。 wordで処理しているのでブロックの最大レベルが16までとなります。
LDがあると今までの状態をbit0に入れて左にシフトします。
4word取っているのはMPSに出会うとword単位でshiftします。 MPSによる分岐が4レベルまで扱えることになります。
current_bit_valueが状態の初期値でtrueになります。
cycle_runningはラダー処理中であることを示しtrueになっています。
暫く触っていなかったのでbit stackが何をやっているのかすっかり忘れていました。 今後のためにもここに書き留めおいた方がいいですね。
2020年12月20日
_ PLCでmruby (4) ニーモニック変換に方針転換
mrubyをPLCで動かすにはmrubyのVirtual Machineを実装すればできると思っていましたが、前回の出力をみるとmrubyのニーモニックからラダーのニーモニックに変換するのが手取り早い気がします。
ニーモニック変換器を作ることを当面の目標としましょう。
前回の出力を再掲します。
% mrbc --verbose a.rb
00001 NODE_SCOPE:
00001 local variables:
00001 a
00001 NODE_BEGIN:
00001 NODE_ASGN:
00001 lhs:
00001 NODE_LVAR a
00001 rhs:
00001 NODE_INT 1 base 10
irep 0x7f897b4059c0 nregs=3 nlocals=2 pools=0 syms=0 reps=0 iseq=8
local variable names:
R1:a
file: a.rb
1 000 OP_LOADI_1 R2
1 002 OP_MOVE R1 R2 ; R1:a
1 005 OP_RETURN R2
1 007 OP_STOP
これなら、ラダーで下の様な感じで作れれば置き換えができそうです。(ニーモニックは特定のPLCではなく雰囲気です)
ただ、クラスなど絡んでくるとそんなに簡単ではなく、難しいことは予想されます。
LD ON
@SET SCOPE
LD SCOPE
MOV #1, R2
MOV R2, R1
RST SCOPE