一往確認日記 |
2016年12月28日 [長年日記]
_ Escalator - 命令のデコード(4)
Escalatorというのは、各種PLCがメーカーや機種毎にプロジェクトデータが異なるため互換性がなく、移植するのが大変なのを解決しようとするものです。
ここのescalatorのカテゴリーを見てもらえると今までの経緯を見てもらうことができます。
サブルーチンの説明が続いているので、このままサブルーチンの説明を進めます。
デバイスの状態を読み込んだり直値を得る部分です。
デバイスを表すデータ形式はこの様になっています。
最上位ビットが0の場合は、そのあとのビットで数値を表し直値として0-127の値として返します。 1の場合はデバイスから取得するですが、ここで7bit以上の直値を得る方法がない事に気づいてしまいました。 必要な段階になったら再検討します。
具体例としてはこの様な変換になります。
この処理をする部分ですが、まずは1バイト読み込みopcode1に代入します。 bit7をnon_immedeateに取り出します。 0なら読み込んだ値opcode1を直値としてFD1に入れて戻ります。 bit7が1の場合はbit4をlen_16に取り出します。
len_16が1の場合は2バイト読み込み、0なら1バイト読み込みopcode2に入れています。 これがデバイスの何番目かを示すポインターになります。
opcode1の下位4bitをdevice_typeに取り出し、該当するデバイス配列から値をよみ出し、デバイスタイプによってFY0かFD1に入れて返しています。
ELSEのFX0、FX1への代入が何をしようとしてたのか思い出せない… FY0、FD1の間違いの様な気がしますが不都合がでたら考えます。
今はwordデバイスを扱いう命令がないので、Value Typeは判断していません。 命名を追加*1した段階で入れる事にします。
*1 するところまでいけるかどうかという事もありますが…