バイトシフト

概略

DMなどのメモリの下位からはじまる文字列を上位側にシフトして扱いやすくします。
メモリは下図のようにD0から
[2031][3233]・・・(アスキーコードで" 12345678TEST")と入っています。
この文字列の先頭のスペースを取り除きD10から[3132][3334]・・・("12345678TEST")となるように並び替えます。
(下図は実行した結果のD10からの値も入った状態です)

16進表示
Memory

ASCII表示
Memory


方法1:列挙する方法

MOVD命令を使用して1バイト移動させます。
少ない文字列ならコレでもOKなのですが、記述が多くなるためタイプミスなどが発生しやすくなり注意が必要です。

ラダー1


方法2:DEL$を使う方法

DEL$命令は文字列から指定したバイト数を削除する命令です。
D0からの文字列の最初の1文字を削除してD10に結果を格納するには下図のようになります。
注意:文字列の命令なので00HEXまでを文字として扱われます。00HEXは文字の最後に必ず必要です。

DEL$を使用した例


方法3:ストラクチャードテキスト(ST)を使う方法

ストラクチャードテキスト(ST)を使用した例をひとつ紹介します。
STでは高級言語のようにテキストベースの記述方法でプログラムを作成します。下図のようにMIDやLENなど高級言語で使われる命令が使用できます。
注意:この方法も文字列として扱うので最後に必ず00HEXが必要です。

ラダーでファンクションブロック(ST)の呼び出し
ファンクションブロックの呼び出し

STの記述例
STの記述例


方法4:バイナリデータのバイトシフト

00HEXを含むエリアをバイトシフトしたい場合は文字列として扱えないため上記の2,3の方法が使えません。また、シフトしたいエリアが多い場合は方法1を羅列するのは手間が掛かり、変更時も大変です。これらを解消するためにFOR~NEXTで下図のようにプログラミングすることでスッキリして分かりやすくなります。

FOR~NEXTでバイトシフトの例