今回の目的
前回、pyserialでAZD-KDに接続されたステッピングモータををModbusプロトコルで動かしました。
今回は適当に作ったserial通信周りをPyModbusに置き換えつつ、ModbusプロトコルとPyModbusの使い方について学んでいきます。
森岡が書いたテストコードはこちら。
Modbusとは
ModbusはWikipediaによると、Modicon社が策定したPLCと通信するためのプロトコルです。
FA業界におけるデファクトスタンダードになっています。
通信は大きく3パターンあり、エラーチェックの方式がそれぞれ異なっています。
通信方式 | エラーチェック | |
---|---|---|
Modbus RTU | Serial | CRC |
Modubs ASCII | Serial | LRC |
Modbus TCP | Socket | なし(TCP標準) |
PyModbusとは
PyModbusは名前の通り、Pythonで書かれたModbus用のライブラリです。
ソケット通信のModbus TCP、シリアル通信のModbus RTUとModbus ASCIIなどの主要な通信方式に対応しているだけでなく、ユーティリティが充実しています。
PCのスペックが低い時代に組まれた成熟した通信は大体バイナリで値の管理をしっかりしないといけないの場合が多いのですが、Modbusも例に洩れず、そういった送信コマンドのサイズ管理をして行く必要があります。
こういった場合、Pythonなどの型のサイズを利用者に意識させない高級スクリプト言語だと返ってやりづらかったりするのですが、PyModbusではPayload Builderというクラスを使って、そのあたりを使いやすくしてくれています。
また、上記のエラーチェックも特に何も記述しなくても通信方式にあわせて宜しくやってくれます。
AZD-KDをPyModbusで制御する
で、戻って今回テストで使うAZD-KDをPyModbusで動かしてみます。
いくつかメソッドがありますが、AZD-KDは基本的にはWriteコマンドを利用すれば大体できそうです。ただ、タイミングチャートを見るとちゃんと値を受け取ってインターバルを取ってから次のコマンドを送ったほうが良さそうなので、Readも面倒くさがらずに実装します。
接続
PyModbusでのModbus RTU接続は以下のようになります。
stopbits、parity、baudrate、bytesizeはAZD-KDの初期設定値に合わせています。
portはPCによって異なるので適当にあわせてください。
timeoutはAZD-KDのタイミングチャートを見てざっくり設定しました。
from pymodbus.client.sync import ModbusSerialClient as ModbusClient
client = ModbusClient(method = "rtu", port="COM7",stopbits = 1, bytesize = 8, parity = 'E', baudrate= 115200, timeout= 0.02)
connection = client.connect()
コマンド
コマンドは以下の感じ。これは『動き方を記録したメモリの0番目(メモリアドレスは6144)』に『位置決めの方式』と『step数(回転角度)』を書き込むコマンドです。
AZD-KDは基本コマンドは全て32bitです。
skip_encodeはbuilder使う場合はtrueにしておいたほうがよさげでした。
unitはデイジーチェーンしたModbusデバイスの何番にこの書き込みを行うか。
前回AZD-KDを半固定抵抗を回して1番にしていたので0x01を指定しています。
from pymodbus.constants import Endian
from pymodbus.payload import BinaryPayloadBuilder
# メッセージの作成
builder = BinaryPayloadBuilder(byteorder=Endian.Big)
builder.add_32bit_int(2) # 相対位置決め運転
builder.add_32bit_int(1000) # 1000step回転させる
result = client.write_registers(address=6144, values=builder.build(), unit=0x01, skip_encode=True)
AZD-KDの通常運転
AZD-KDの運転(モーター制御)には2パターンあります。
通常運転はそのまま、通常の運転です。
通常運転は以下の3つの通信が必要になります。
- 利用する運転Noのメモリ領域に運転情報を書き込み
- 運転開始コマンドを書き込み
- 運転開始終了コマンドを書き込み
一応上記のgithubには書いてみましたが通信を3回もしなければならないので遅いです。
AZD-KDの仕様上、60FPSではやりとりできないので3回もやってると目に見えて遅そう。
AZD-KDのダイレクト運転
もうひとつがダイレクト運転。
通常運転よりも操作できるパラメータは少ないですが書き込むと即座に動き出します。
インタラクティブに動かすならこちらだけで良いかと思います。
こちらもgithubのサンプルに一通りパラメータ類を書き込んでます。
動いたので
次にやっと本題。Modbusを使い、TouchDesignerでAZD-KDを動かします。