今まで運がいいのか悪いのか三菱をメインで使ってきたのですが、お客様の指定でオムロンを使うことになりました。ラダーだけなら過去に触ったこともあるのですが通信とかも含めて初めてのことが多くえらく苦労しました。
ひとえにマニュアルを良く読まないのが悪いのですが、これだけ苦労しても次に使う頃には忘れそうなので備忘録としてこのブログを作りました。
先ずはFOR
何故FOR文かというと、ハードトラブルでしか発生しないらしい(オムロンさんのサポートセンター情報)シーケンサエラーを発生させた思い出深い命令だからですorz
w100.00をIR0に、D100をIR1にセットし ,IR1+ <= 100なら,IR0+をONにするだけの単純なFOR文しかも回数は11回だけ、これで前記したレベルのトラブルが出る理由が正直分からない。
わからないから悩むのをやめて11回書きました。はい書きました(大した量じゃないけど)
とにかく時間がなくトラブった所はトラブらない方法で書き直しましたが、本当はこの辺りをきちんとしておきたかった。
閑話休題
- インデックスレジスタ(IR)
早い話がポインタ アドレスを触りたい時は IRn 中身を弄りたい時は,IRnと書く
nは数字0-15
- IRのインクリメント
,IR0+ ,IR0++のように書く。2以上増やしたい時は +L IRn &m IRn のようにする
アドレスをいじる時はDWORDの命令で
- IRのアドレスを変えずに任意の場所を見る
10,IRn のように頭に数字を書く。これ大事。DIM命令と併用すると最強
- IRにアドレスをセットする命令
MOVR とか SETR 他もあるかもしれないけど使ってないから分かんない
MOVR D100 IR0
MOVR W100,01 IR1
for &10
= ,IR0+ &0 なら OUT ,IR1+
next
ラダーでなくても何となく分かるよね、よね?>未来の自分
でもって、例えばコントローラーユニットが13個のユニットから情報を得ていて
ユニットごとに17個のデータをD1000から順番に・・・
UNIT
1 D1000~D1016
2 D1017~D1033
こんな感じに並んでいた場合
DIM 1 &17 &13 D1000
と先ずはテーブル攻勢を設定します。早い話が構造体の配列みたいなもので
テーブル1の構造は D1000から1レコードあたり17WORDのデータが13個並んでいるというもので、レコードの戦闘番号は0 レコード番号×13+D1000 でアドレス出してると思えばいい感じ
SETR 1 xx IRn (XXはレコード番号)
を使ってレコード先頭のアドレスをIRにセットします
つまりは
DIM 1 &17 &13 D1000
mov &0 D1
movr D100 IR1
for &13
SETR 1 D1 IR0
mov 4,IR0 ,IR1+
mov 6,IR0 ,IR1+
mov 12,IR0 ,IR1+
++ D1
next
このようにかけば任意の情報だけを連続して並べることが出来ます
個人的にはこの書き方のほうが、各ユニットの必要な情報を読みに行く形に見えて好きなのですが
movr D1000 IR0
movr D100 IR1
for &13
mov 4,IR0 ,IR1+
mov 6,IR0 ,IR1+
mov 12,IR0 ,IR1+
+L IR0 &17 IR0
next
でも同じ結果になります。
コントローラーユニットで収集するデータ数が変わった時に前者ははDIMを書き換える・・・つまりはデータ構造の定義を変えるだけですが、後者はアドレスを意識する感じで何となく苦手です。
まぁ、今にしてみれば単純な話ですね
次は日まで来たら通信かな?