TOPに戻る

ラズパイ5 +Python+CANopenでモータを回す ⑨ CANバス信号を見る<後編>CANopenのデコードができ無償で使えるツールAnalog Devices TMCL-IDE

 CANバスを流れるデータは、いろいろなツールでロギングできます。下の画像は、ラズパイで、can-utilsのダンプ・ソフトcandumpを動かしたものです。

 例えば、一番左のcan0はデバイス名で、その右の3桁の数値はCAN-IDもしくはCOB-IDと呼ばれます。

これをデコードしてくれるWebがあります。

  Online CANopen COB-ID converter

 その右側の[8]はフレームのバイト数です。最初や最後のNMT、SYNCなどを除くと、大半が8バイトで構成されています。これがフレームと呼ばれ、最初の1バイトは、たとえば0x40は読み込みのアップロード要求です。0x4Bは、アップロード応答のコマンド指定子CSです。

 その次の2バイトがStatuswordやSDOのコマンド(index)になります。indexは数百あるので、手作業でデコードするのは大変ですが、できないわけではありません。デコードは、オブジェクト・ディクショナリを見ながら行います。MEXE02などのツールを使ってもできますが、.edsファイルはテキストなので、検索しながら一致する命令を探します。

 慣れると、10個ほどのindexが頻繁に出てくるので、覚えてしまいます。indexに続くのがデータですが、多くが、ControlwordもしくはStatuswordです。解釈はバイナリで読み取ります。

 一番解読しにくいのがエラー・コードですし、コードがわかっても意味が分からないことが多いです。

◆Controlword

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

◆Statusword

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

●開発ツールTMCL-IDE

 現在アナログ・デバイセズになっていますが、BLDCモータやステッピング・モータ、それらのインターフェース・ボードを作っていたTMCL社の開発ツールは、デバイスやメーカの制限もなく、CANバスを監視できたり、NMTのコマンドをCANバスに送出できます。

 2022年TMCM-CANopen Revision V1.6.0.0では、CANバスのダンプはできました。

 現在ダウンロードできるTMCL-IDE 4.2.0ではCANopenのデコードもリアルタイムに行ってくれます。

 利用できるインターフェース機器の一部です。ここでは、Ixxat (USB-to-CAN V2 Compact)を使っています。

  • CAN-USB/2 (ESD)
  • Leaf Light v2 (Kvaser)
  • IPEH-002021 (Peak)
  • Ixxat (USB-to-CAN V2 and USB-to-CAN V2 Compact)
  • RTMI(USB-2-RTMI?)

●実行例-<その1>canreset.py

 canreset.pyを動かします。

import canopen
import time
import logging
# logging.basicConfig(level=logging.DEBUG)

# Start with creating a network representing one CAN bus
network = canopen.Network()

# Connect to the CAN bus
# sudo ip link set can0 up type can bitrate 1000000
network.connect(bustype='socketcan', channel='can0')
print("\n===start  ID=12 OrientalMotor\n")

network.check()

# Add some nodes with corresponding Object Dictionaries
node = canopen.BaseNode402(12,'Downloads/BLVD-KRD_CANopen_V200.eds')
network.add_node(node)

# all nodes simulaneously as a broadcast message
network.nmt.state = 'RESET'
time.sleep(0.5)
print('network state 1) = {0}'.format(network.nmt.state))

# Reset network
node.nmt.state = 'RESET'
node.nmt.wait_for_bootup(15)
node.nmt.state = 'RESET COMMUNICATION'
node.nmt.wait_for_bootup(15)
print('node state 1) = {0}\n'.format(node.nmt.state))

node.setup_402_state_machine()
time.sleep(0.1)
print('state_machine state 1) = {0}'.format(node.state))
#clear Fault
node.sdo[0x6040].raw = 0x80
time.sleep(0.2)
network.check()
print('state_machine state 2) = {0}'.format(node.state))

print('\ngoing to exit... stopping...')
if network:
    for node_id in network:
        node = network[node_id]
        node.nmt.state = 'PRE-OPERATIONAL'
        #node.nmt.stop_node_guarding()
        #node.nmt.state = 'STOPPED'
#network.sync.stop()
network.disconnect()

 仮想環境envcanで実行中の様子です。

 TMCL-IDEのトレース画面です。ほとんどがnode.setup_402_state_machineの実行部分のようです。内容は、マッピングされたPDOデータの読み出しです。

 

 TMCL-IDE 4.2.0をインストールしたら、メニューとかに見当たりません。C:\Analog Devices\に実行プログラムがありました。

●コントローラBLVD-KRDのedsを読み込む

 上記のcanreset.pyのデコードは、どのメーカも同じindexが用意されているので、問題なく表示されているようです。しかし、6000番台はほぼ同じでも、2000や4000番台は、メーカによって相当異なります。

 なので、BLVD-KRD_CANopen_V200.edsを読み込んで使いたいです。

 C:\Analog Devices\TMCL-IDE-Rel4.2.0にUserEdsというディレクトリを新規に作ります。このUserEds内に、BLVD-KRD_CANopen_V200.edsをコピーしておきます。

 TMCL-IDEを立ち上げます。

  Device欄にあるIxxat (USB-to-CAN V2 Compact)を選択し、ID=12をサーチさせるとBLVD-KRDを見つけてきて、edsファイルも読み込んでくれます。そうすると、サブメニューが追加され、オブジェクト・ディクショナリの表示や値の変更などができるようになります。

 MEXE02と異なり、CANopenの各種indexの読み書きやNMTの状態遷移などが直接実行される有用なツールになります。

 

●canreset.pyを動かすPythonの仮想環境

 2023年10月に更新されたラズパイOS bookwormでは、pythonは仮想環境を利用してプログラムを作ります。

python仮想環境 備忘録

仮想環境の作成

python -m venv envtest

有効化

source envtest/bin/activate

無効化

deactivate

初期状態に(いったん deactivate してから)

python -m venv --clear envtest

 

 envcanという仮想環境を作ります。

yoshi@ras05:~ $ python -m venv envcan

yoshi@ras05:~ $ source envcan/bin/activate

 作り立ての仮想環境には、ライブラリがない状態です。canopenライブラリをインストールします。

(envcan) yoshi@ras05:~ $ pip install canopen
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting canopen
  Using cached https://www.piwheels.org/simple/canopen/canopen-2.2.0-py3-none-any.whl (61 kB)
Collecting python-can>=3.0.0
  Using cached https://www.piwheels.org/simple/python-can/python_can-4.3.1-py3-none-any.whl (262 kB)
Collecting wrapt~=1.10
  Using cached wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (80 kB)
Collecting packaging>=23.1
  Using cached https://www.piwheels.org/simple/packaging/packaging-24.0-py3-none-any.whl (53 kB)
Collecting typing-extensions>=3.10.0.0
  Downloading https://www.piwheels.org/simple/typing-extensions/typing_extensions-4.11.0-py3-none-any.whl (34 kB)
Collecting msgpack~=1.0.0
  Using cached msgpack-1.0.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (400 kB)
Installing collected packages: wrapt, typing-extensions, packaging, msgpack, python-can, canopen
Successfully installed canopen-2.2.0 msgpack-1.0.8 packaging-24.0 python-can-4.3.1 typing-extensions-4.11.0 wrapt-1.16.0

(envcan) yoshi@ras05:~ $ pip list
Package           Version
----------------- -------
canopen           2.2.0
msgpack           1.0.8
packaging         24.0
pip               23.0.1
python-can        4.3.1
setuptools        66.1.1
typing_extensions 4.11.0
wrapt             1.16.0

 実行します。最初に、ip link setコマンドでデバイスcan0の状態をUPに設定します。

(envcan) yoshi@ras05:~ $ sudo ip link set can0 up type can bitrate 1000000

(envcan) yoshi@ras05:~ $ python canreset.py

●実行例-<その2>caninfo2.py

 caninfo2.pyを動かします。実行画面です。

 TMCL-IDEのトレース画面です。

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