«前の日記(2016年12月27日) 最新 次の日記(2016年12月29日)» 編集

一往確認日記


2016年12月28日 [長年日記]

_ Escalator - 命令のデコード(4)

Escalatorというのは、各種PLCがメーカーや機種毎にプロジェクトデータが異なるため互換性がなく、移植するのが大変なのを解決しようとするものです。

ここのescalatorのカテゴリーを見てもらえると今までの経緯を見てもらうことができます。

サブルーチンの説明が続いているので、このままサブルーチンの説明を進めます。

デバイスの状態を読み込んだり直値を得る部分です。

デバイスを表すデータ形式はこの様になっています。

https://gyazo.com/23edfaac11bff449d1008571101290bb

最上位ビットが0の場合は、そのあとのビットで数値を表し直値として0-127の値として返します。 1の場合はデバイスから取得するですが、ここで7bit以上の直値を得る方法がない事に気づいてしまいました。 必要な段階になったら再検討します。

具体例としてはこの様な変換になります。

https://gyazo.com/7358e5cebfa63b7dfbc6f03c4da8ed5b

この処理をする部分ですが、まずは1バイト読み込みopcode1に代入します。 bit7をnon_immedeateに取り出します。 0なら読み込んだ値opcode1を直値としてFD1に入れて戻ります。 bit7が1の場合はbit4をlen_16に取り出します。

https://gyazo.com/f3ee5d6df31453d86bdcce05ef048c93

len_16が1の場合は2バイト読み込み、0なら1バイト読み込みopcode2に入れています。 これがデバイスの何番目かを示すポインターになります。

https://gyazo.com/99b3be7fb0f93a3544c1f596459eddc5

opcode1の下位4bitをdevice_typeに取り出し、該当するデバイス配列から値をよみ出し、デバイスタイプによってFY0かFD1に入れて返しています。

ELSEのFX0、FX1への代入が何をしようとしてたのか思い出せない… FY0、FD1の間違いの様な気がしますが不都合がでたら考えます。

https://gyazo.com/82620c2076e19f90a32889ae5cceb326

https://gyazo.com/804288ffc437b548598fe4ef481f615b

今はwordデバイスを扱いう命令がないので、Value Typeは判断していません。 命名を追加*1した段階で入れる事にします。

*1 するところまでいけるかどうかという事もありますが…