TOPに戻る

ラズパイ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

資料

CANopen for Python

christiansandberg/canopen

連載 ラズパイ5 +Python+CANopenでモータを回す

(1) 構成と環境(オリエンタルモーター の「BLMR5100K-A-B」 + 「BLVD-KRD」)

(2) サポート・ソフト MEXE02

(3) PythonでSDOの読み出し(仮)caninfo.py

(4) CANopenのベーシックな規格とSDO/PDO、オブジェクト・ディクショナリ<前編>

(5) CANopenのベーシックな規格とSDO/PDO、オブジェクト・ディクショナリ<後編>

(6) 二つの状態遷移(NMTとStatus Machine)

(7) CANバス信号を見る<前編>canreset.py candump0.py

(8) CANバス信号を見る<中編>Arduino

(9) CANバス信号を見る<後編>CANopenのデコードができ無償で使えるツールAnalog Devices TMCL-IDE

(10) モーション CiA 402の規格<Homing mode> canHome.py

(11) モーション CiA 402の規格<Profile Position Mode (PPM)-前編> canPPMread.py

(12) モーション CiA 402の規格<Profile Position Mode (PPM)-中編> caninfo2.py canppm.py

(13) モーション CiA 402の規格<Profile Position Mode (PPM)-後編> canppm2.py

(14) モーション CiA 402の規格<Profile Velocity Mode (PVM)> campvm.py