Permalink
Fetching contributors…
Cannot retrieve contributors at this time
341 lines (239 sloc) 10.1 KB

LadderDrive

概要

LadderDriveはPLC(Programmable Logic Controller)向けの抽象的なラダーです。 どのPLCでも同じソース(できればバイナリー)で実行できる形態を目指しています。

まずはニーモニックレベルで実現し、その上に分かりやすい形のプログラミングツールを用意できればと考えています。

使い方

使用するにはRubyが実行できる環境が必要です。 Rubyの実行環境の構築はWebサイト等を検索して構築してください。

インストール

gemでLadderDriveをインストールします。

$ gem install ladder_drive

https://gyazo.com/6f00d74612def41fb33d836275b74c24

プロジェクト作成

LadderDriveをインストールするとladder_driveコマンドが使用できる様になります。 ladder_driveコマンドでラダーを構成するプロジェクトファイルを作ります。

$ ladder_drive create my_project
$ cd my_project

https://gyazo.com/c538f66129aa425e2b1da4f478a10f52

ファイルの構成は下の様になっています。 plc以下にLadderDriveを実行するPLCプロジェクトの雛形があります。 現在はエミュレーターと三菱電機のiQ-RシリーズR08CPUのみの対応となっています。 他メーカーや他の機種は今後追加する予定です。

.
├── Rakefile
├── asm
│   └── main.esc
├── config
│   └── plc.yml
└── plc
    └── mitsubishi
        └── iq-r
            └── r08
                ├── LICENSE
                └── r08.gx3

通信設定

PLCの通信設定

plcディレクトリ以下の使用したいPLCのプロジェクトファイルを開きます。 IPアドレスなど必要な箇所を変更し、PLCに転送します。

LadderDriveの設定

config/plc.ymlファイルで設定します。

現在はiQ-Rのみの対応なので:host: 192.168.0.10の行でPLCに設定したIPアドレスを指定するだけで接続できます。

# plc.yml
plc:                        # Beginning of PLC section.
  iq-r:                     # It's a target name
    cpu: iq-r               # It's just a comment.
    protocol: mc_protocol   # It's a protocol to communicate with PLC.
    host: 192.168.0.10      # It's PLC's IP address or dns name.
    port: 5007              # It's PLC's port no.

LadderDriveプログラム作成

LadderDriveのプログラムはasm以下にあります。 現在はmain.escファイルから生成します。

main.escを編集しプログラムを作成します。 PLC側の実装がまだ進んでいないので実行できるニーモニックはLD、OUT、AND、ORとその反転程度です。

ニーモニックについてはWikiの方を参照してください。

# main.esc
# |M0|-|M1|----(M2)
LD  M0
AND M1
OUT M2
END

プログラムの転送

LadderDriveプログラムをplcに転送するにはrakeコマンドを使用します。 デフォルトではエミュレーターが対象になり、エミュレーターが起動します。

$ rake

targetを指定するとplc.ymlのplcセクション内の該当するターゲットが対象になります。

$ rake target=iq-r

plc.ymlファイルのdefaultセクションのtargetでデフォルトのターゲットを設定できます。

# plc.yml
default:
  target: iq-r

この場合にrakeを行うとrake target=iq-rをしたのと同じになります。

転送後プログラムが実行されます。

$ rake [target=iq-r]
uploading build/main.hex ...
launching emulator ...
done launching
done uploading

  LadderDrive is an abstract PLC.
  This is a console to communicate with PLC.

>

アップロードが完了するとコンソールモードになります。 コンソールモードではコマンドを打つ事でデバイスの読み書きができます。

デバイスの値を読み取るにはrコマンドを使用します。 下の例ではm0から8個分のデバイスを読み出します。

> r m0 8

デバイスに値を書き込むにはwコマンドを使用します。 下の例ではM0からM7まで書き込んでいます。

> w m0 0 0 0 1 1 0 1 1

ボタンを押した様にパルス状にデバイスをオンにするにはpコマンドを使用します。

> p m0

オンになる時間をデバイスのあとに指定することもできます。単位は秒です。

> p m0 1.5
# |M0|---(M1)
LD  M0
OUT M1

https://gyazo.com/565d24a35887503281a46775f6ccd747

warning: constant ::Fixnum is deprecated の表示が出る場合は次の様にしてみてください。

$ RUBYOPT="-W0" rake

Raspberry Pi

Raspberry Pi上で動作させることもできます。 XとYデバイスはGPIOに割り付けます。

インストール

OSとしてRaspbianを使用した場合は次の手順でインストールできます。

$ sudo apt-get update
$ sudo apt-get install ruby-dev
$ sudo apt-get install libssl-dev
$ sudo gem install ladder_drive --no-ri --no-rdoc

この時の環境は下の通りです。

$ uname -a
Linux raspberrypi 4.9.41+ #1023 Tue Aug 8 15:47:12 BST 2017 armv6l GNU/Linux

実行

$ ladder_drive create project
$ cd project
$ sudo rake target=raspberrypi

I/O設定

Project下のconfig/plc.ymlファイルで変更できます。 inputsで入力ピンを定義します。outputsで出力ピンを定義します。 pinにGPIO番号を指定します。 入力の場合は pull up, pull downの指定や invertで反転させることができます。

  # Raspberry Pi
  raspberrypi:
    cpu: Raspberry Pi
    io: # assign gpio to x and y
      inputs:
        x0:
          pin: 4        # gpio no
          pull: up      # up | down | off で指定します。
          invert: true
        x1:
          pin: 17
          pull: up
          invert: true
        x2:
          pin: 27
          pull: up
          invert: true
      outputs:
        y0:
          pin: 18
        y1:
          pin: 23
        y2:
          pin: 42

サービスとして Ladder Drive を起動

電源投入でLadder Driveが起動する様にサービスとして立ち上げることができます。 Ladder Driveプロジェクのディレクトリで以下のコマンドを実行することでサービスを立ち上げることができます。

$ sudo rake service:install
$ sudo rake service:enable
$ sudo rake service:start

LadderDrive on Raspberry Pi

PLCデバイスへのアクセスツールとしての利用

LadderDriveはPLCデバイスの読み書きツールとしての利用もできます。 下の様にとても簡単に読み書きできます。

require 'ladder_drive'

plc = LadderDrive::Protocol::Mitsubishi::McProtocol.new host:"192.168.0.10"

plc["M0"] = true
plc["M0"]         # => true
plc["M0", 10]     # => [true, false, ..., false]

plc["D0"] = 123
plc["D0"]       # => 123
plc["D0", 10] = [0, 1, 2, ..., 9]
plc["D0".."D9"]   => [0, 1, 2, ..., 9]

プラグイン

UnixベースのマシンでLadder Driveを実行した場合にプラグインで機能を拡張できます。
例えば各種センサーを読み込みLadder Driveのデバイスにセットしたり、Webサービスと連動させたりという事ができます。

プラグインを作成する場合はプロジェクにpluginsディレクトリを作成し、xxx_plugin.rbというファイル名のRubyスクリプトを作成します。xxxはプラグインの名称を示しbarプラグインならbar_plugin.rbになります。

プラグインのコールバック

起動時にプラグインの初期化をするためにplugin_xxx_initが呼び出されます。(xxxはプラグインの名称が入り、sample_plugin.rbならxxxにsampleが入ります)
初期が必要な場合はここで行なってください。

Ladder Driveが1サイクル実行後にplugin_xxx_execを呼び出します。(xxxについては上記の通りです)
ここでLadder Driveデバイスへの読み書きなどを行います。

あらかじめ用意されているプラグイン

Ladder Driveでは次のプラグインがあらかじめ用意されています。
Ladder DriveをIoT Gateway として機能させるプラグインになります。

名称 内容
ifttt IFTTTのWebhooksを起動します。
google_drive Google spreadsheetにデータを書き込みます。
plc_mapper 複数のPLCのデータをLadder Driveのメモリーに展開します。
slack Slackにデータの変化を記録します。
trello trelloのカードを指定のリストに移動します。

これらの用意されているプラグインをインストールするには

$ ladder_drive plugin plugin_name

plugin_nameには上記プラグインの名称を入れます。
指定されたプラグインがpluginsディレクトリーに作成されます。

それぞれのプラグインの使い方はWikiの方に記載する予定です。

LadderDriveに関する情報

ライセンス

MIT