«前の日(04-21) 最新 次の日(04-23)» 追記

一往確認日記


2016年04月22日

_ Escalatorのデータ型(2)

PLCのデータレジスタは16bitのWORD型が多いです。 ニーモニックは8bitで定義したので、残りの8bitでデータ型を表したいと思います。

上位3bit

|7|6|5| | |:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:--| |0|||直値。6-0bitの数値を直接扱う| |1|0|0|ビット扱い| |1|0|1|ワード扱い| |1|1|0|ダブルワード扱い| |1|1|1|バイト列扱い|

上位5bit

4-3bit\2-0bit 111 110 101 100 011 010 001 000
00 M Y X
01 SC L T C
10 D TC CC
11 SD H TS CS

割り当てはすっきりしたかんじで、余裕もあるのでこれですすめます。

続く


2019年04月22日

_ ラダーをRubyに置き換え - PLCのRuby言語コントロールユニット(2)

PLCのソフトをラダーの代わりにRubyで書けたらという企画です。

実際にRubyで置き換えた場合に、同時にいろんな事をさせようとすると排他処理を考える必要があります。
別々に動作している間でデータの塊をやり取りするときに、途中で値が変わってしまうと、予想もしていなかった動作になることがしばしばあります。
Rubyの場合はこの点が難しいところではないかと考えています。

ラダーの場合は順番に進んでいくのでスキャン単位で考えるとデータの塊が途中で変わってというのはあまり意識しなくてもいいところは利点です。

そういうのは後々考えるとしてRubyだとどんな感じになるかなというのを考えていきます。

単純にスイッチとランプを接続した回路

単純にスイッチを押している間ランプが点灯する回路で考えます。

Image from Gyazo

入出力デバイスX0, Y0は、Rubyでそのままx0, y0という変数としてアクセスできると仮定して、単純な代入になります。

y0 = x0

自己保持回路

ONスイッチでモーターが回転して、OFFスイッチで停止する回路で考えます。

Image from Gyazo

Rubyは論理演算ができるので、|| (or) と && (and) 演算子でそのまま表現できます。

y1 = (x1 || y1) && !x2

論理演算で置き換えればラダーそのままをRubyに置き換えられます。 ただ、デバイスが3つなのでまだ分かりますが、デバイスが増えてきたらラダーの方が断然分かりやすそうですね。

他の場合もこの置き換えで考えましょう。

シリンダーセンサー

Image from Gyazo

B接点は! (not)で表せますが、
はて、センサー異常はタイマーを使ってますが、Rubyではどうしましょうか…

次回への宿題とします。