ラズパイ5 +Python+CANopenでモータを回す ⑥ 二つの状態遷移(NMTとStatus Machine)
モータを動かすために、二つの状態遷移を制御します。CANopenのアプリケーション層のベースになるCiA 301の規約にはNMTがあります。その上に位置するモーション・コントローラCiA 402の規約には、Status Machineが用意されています。
NMTは、どのメーカのプラットホームでも同じように制御できるようです。Status Machineは、機種依存性があるようです。
面倒な気がしますが、複数のモータがあって、複数の機種、複数の会社のモデルを使うような環境だと、こういう規約が必要なんだと思います。
サポート・ソフト MEXE02では、NMT=通信ステート、Status Machine=運転ステートと呼びます。
●NMT(Network Management)
CiA 301は、CANopenアプリケーション層のもろもろを規定しています。これには、CANopen通信サービスとプロトコルだけでなく、データ型、エンコード・ルール、ディクショナリ・オブジェクトも含まれます。
また、ネットワーク管理サービス (NMT)も規定します。 NMTはマスター/スレーブ アーキテクチャに従います。ほとんどのデバイスは NMTスレーブとみなされ、ノード ID(1~127)によって識別されます。
NMT プロトコルは、ステート・マシン変更コマンド(デバイスの起動および停止など)の発行、リモート・デバイスの起動およびエラー状態の検出に使用されます。
BLV Series R Type Driver CANopen Communication Profile
に書かれたNMTの遷移図です。
電源が入ると、1のInitializationはすぐに通過し、2のPre-operationalに移行します。この状態で、SDOの読み書きができます。3のOperationalに移行すれば、PDOのやり取りもできる実働モードになります。
トラブルがあれば、10 Stoppedになり、解除(reset)することで、1に戻ります。
(※)電源を入れると、「NMTステートがPre-operationalの場合、自動的にStart Remote Nodeが発行され、Operationalステートに遷移する」という NMT-Start Remote Node 自動発行機能が、「BLV シリーズ R タイプ 取扱説明書 機能編」に書かれていますが、どこで設定したらそうなるかは見つかりません。
サポート・ソフト MEXE02のCANopen通信ステータスの左上の画面です。電源ONでPre-operationalになっています。
リモート運転モードをONにし、S-ONすると、PDOを読み出すのでOperationalに移行しているはずですが、実際はPre-operationalのままです。変ですね。
pythonのcanopenライブラリでは、デバイスの状態を変更するのに使われます。
state
'INITIALISING',
'STOPPED',
'OPERATIONAL',
'SLEEP',
'STANDBY',
'PRE-OPERATIONAL'
COMMANDS
'OPERATIONAL'
'STOPPED'
'SLEEP'
'STANDBY'
'PRE-OPERATIONAL'
'INITIALISING'
'RESET'
'RESET COMMUNICATION'
【例】node.nmt.state = 'OPERATIONAL'
すべてのノードの状態をブロードキャスト メッセージとして同時に変更。
network.nmt.state = 'OPERATIONAL'
# Reset network
node.nmt.state = 'RESET COMMUNICATION'
node.nmt.state = 'RESET'
node.nmt.wait_for_bootup(15)
今のノードの状態を表示。
print('node state = {0}\n'.format(node.nmt.state))
pythonのライブラリやCのライブラリ(例えばEPOS4)を使う場合は、上記のための予約語があるのですが、ない場合は、8ビットの各ビットをチェックして状態を知ります。
State | LowByte of Controlword [binary] |
---|---|
shutdown | 0xxx x110 |
switch on | 0xxx x111 |
disable voltage | 0xxx xx0x |
quick stop | 0xxx x01x |
disable operation | 0xxx 0111 |
enable operation | 0xxx 1111 |
fault reset | 1xxx xxxx |
●Status Machine
Status Machineとは、ディジタル制御可能なデバイスの各状態のデバイスの動作を定義し、使用可能なコマンドと電源が有効かどうかを決定するそうです。
BLV Series R Type Driver CANopen Communication Profile
に書かれたStatus Machineの遷移図です。
下の図は、サポート・ソフト MEXE02のCANopen通信ステータスの右上の画面です。電源ONでSwitch on disabledになっています。
たとえば、TARGET_POSITIONを設定し、Controlword (command) を送って、Ready to switch on->Switched on->Operation enabledへ推移させます。これでドライブが動作できるようになります。
トラブルがあればFaultになるので、運転再開時には、Not ready to switch on状態に戻してからSwitch on disabledに移行します。
pythonのcanopenライブラリでは、使い始める前に、次の1文を実行します。
node.setup_402_state_machine()
state(ステート)の指定は下記の単語が用意されています。
【例】node.state = 'SWITCH ON DISABLED'
state
- ‘NOT READY TO SWITCH ON’
- ‘SWITCH ON DISABLED’
- ‘READY TO SWITCH ON’
- ‘SWITCHED ON’
- ‘OPERATION ENABLED’
- ‘FAULT’
- ‘FAULT REACTION ACTIVE’
- ‘QUICK STOP ACTIVE’
COMMANDS
- ‘SWITCH ON DISABLED’
- ‘DISABLE VOLTAGE’
- ‘READY TO SWITCH ON’
- ‘SWITCHED ON’
- ‘OPERATION ENABLED’
- ‘QUICK STOP ACTIVE’
Fault状態を抜ける方法です。‘NOT READY TO SWITCH ON’に移行します。
node.sdo[0x6040].raw = 0x80
現在の状態を表示します。
network.check()
print('state_machine state = {0}'.format(node.state))
pythonのライブラリやCのライブラリを使う場合は、上記のための予約語があるのですが、ない場合は、16ビットの各ビットをチェックして状態を知ります。
State | ID | Statusword [binary] |
---|---|---|
Start | 0 | x0xx xxx0 x000 0000 |
Not Ready to Switch On | 1 | x0xx xxx1 x000 0000 |
Switch on disabled | 2 | x0xx xxx1 x100 0000 |
ready to switch on | 3 | x0xx xxx1 x010 0001 |
switched on | 4 | x0xx xxx1 x010 0011 |
refresh | 5 | x1xx xxx1 x010 0011 |
measure init | 6 | x1xx xxx1 x011 0011 |
operation enable | 7 | x0xx xxx1 x011 0111 |
quick stop active | 8 | x0xx xxx1 x001 0111 |
fault reaction active (disabled) | 9 | x0xx xxx1 x000 1111 |
fault reaction active (enabled) | 10 | x0xx xxx1 x001 1111 |
Fault | 11 | x0xx xxx1 x000 1000 |
●資料