CAN通信は登場から40年余りの歳月が経過しているが、現在でも幅広く使用されているプロトコルの1つです。PLCnextコントローラAXC F 1152、AXC F 2152、AXC F 3152ではAxiolineのCAN通信モジュールAXL F IF CAN 1Hを使用してCAN通信のプログラミングをすることが可能です。
CAN通信ライブラリ
CAN通信モジュールAXL F IF CAN 1Hがあれば原理的にはスクラッチからプログラミングすることは可能ですが、CAN通信をファンクションブロックとしてまとめたCAN通信ライブラリをPLCnext Storeからダウンロードして利用することができます。
本記事ではCANbus Libraryを使ったプログラミングを説明します。
CANbus Libraryをダウンロードし解凍すると、AsynCom、CANbusという名前で拡張子が.pcwlxのライブラリファイルがありますので、記事PLCnext Storeからダウンロードしたライブラリのインストールを参考にPLCnext Engineerに取り込んでください。
CAN通信サンプルプロジェクト
ダウンロード、解凍したCANbusCANbus Libraryのフォルダの中には、CAN通信用に使えるいくつかのサンプルプログラムが入っています。ここでは、AxiolineシリーズのCAN通信モジュールAXL F IF CAN 1H用の一番低レベルなCAN通信のサンプルプログラム CAN_11_EXA_AXL.pcwexを使用します(ここで11はバージョンです。より新しいバージョンではこの数字が増加します)。このファイルを適当な名前(この記事ではTest_CAN_11_EXA_AXL.pcwex)に変えてPLCnext EngineerのProjectフォルダにコピーしてください(デフォルトはC:\Users\Public\Documents\PLCnext Engineer\Projects)。
PLCnext EngineerのOpen Projectでそのプロジェクトを開いて使用します。
サンプルプロジェクトの編集
- Function Block ExampleMachineの編集
- サンプルプロジェクトでアプリケーションレベルのCAN通信の送受信処理は、ExampleMachineというFunction Blockに記載します。左側のPLANTペインのExampleMachine : ExampleMachine_1の上で右クリック→Go To Typeで、ExampleMachine Function Blockの編集画面を表示します。
- 複数のサンプルコード編集画面
- サンプルプログラムは長いので、EditorGroupというPLCnext Engineerの仕組みで複数のブロック毎に別々の編集画面が開けるようになっています。
- INIT 初期化処理
- E_1000 Function Blockインスタンス1つでCAN送信→CAN受信→CAN送信→CAN受信
- E_2000 送信用受信用にそれぞれ1つずつFunction Blockインスタンスを使ってCAN送信→CAN受信→CAN送信→CAN受信
- E_3000 CAN通信モジュールAXL F IF CAN 1Hのパラメータ設定書き込み、読み出し
- E_4000 CAN通信モジュールAXL F IF CAN 1HにCANメッセージの受信フィルタを設定
- サンプルプログラムは長いので、EditorGroupというPLCnext Engineerの仕組みで複数のブロック毎に別々の編集画面が開けるようになっています。
- 必要な処理の変更
- サンプルプログラムは、上記E_1000~E_4000のいずれの処理を実行するかを決めるiExample変数及び各処理のどの段階まで進んだかを表すiState変数で管理されています。
- 例えば、処理E_1000では、iStateが20の時にCANメッセージ送信フレームをセット、30の時にCAN送信完了を確認、40の時にCANメッセージ受信フレームを確認しています。
- 参考
- ファンクションブロックマニュアル (CANbus LIbrary ver11に付属するCANbus_11.pdf)
- サンプルプロジェクト CAN_11_EXA_AXL.pcwexの別冊メモ(Test_CAN_11_EXA_AXL.pdf)
データフロー概要
- Main programからCANメッセージをCANバスに送信
- E_1000、E_2000のCANメッセージ送信処理のデータフロー
( AXL IF CAN 1Hへの送信はGDS Port間転送を利用。 arrOutputPD → can-master-1 / OUT64byte )
- E_1000、E_2000のCANメッセージ送信処理のデータフロー
- CANバスからのCANメッセージをMain programで受信
- E_1000、E_2000のCANメッセージ受信処理のデータフロー
( AXL IF CAN 1Hからの受信はGDS Port間転送を利用。 can-master-1 / IN64byte → arrInputPD )
- E_1000、E_2000のCANメッセージ受信処理のデータフロー
- AXL F IF CAN 1Hのパラメータを設定
- E_3000のAXL F IF CAN 1Hのパラメータ設定のデータフロー
- AXL F IF CAN 1Hの11bitフィルタレンジを設定
- E_4000の11bitフィルタ設定のデータフロー
- AXL F IF CAN 1Hの29bitフィルタレンジを設定
- E_4000の29bitフィルタ設定のデータフロー
モジュール構成の一致
サンプルプログラムのI/O構成は、AXL F IF CAN 1Hが1台のみです。ご使用の環境が他のモジュールを含んでいて、モジュール構成が異なる場合、プロジェクトのモジュール構成を実モジュール構成に合わせる必要があります。
AXCコントローラのAxioバス上に接続されている場合は、AXCコントローラと通信できる状況で下記のように[Read Axioline F devices]を実行すると、実際に接続されているモジュールをプロジェクトに取り込むことができます。
CANデバイスとの接続
プログラムが接続されるCANデバイス用に編集され、プロジェクトのモジュール構成も一致したら、CANデバイスを実際にAXL F IF CAN 1Hに接続します。
※接続イメージ(実際にはツイストペア線が使用されます)
プログラムの実行とデバッグ
接続が終わったら、プロジェクトを実際にAXCコントローラに書き込んで実行できます。PLCnext Engineerのウォッチ、ロジックアナライザ、ブレークポイント機能の他、CANバスを直接モニタする計測器やCANバスからEthernetに転送してモニタする計測器(下記例ではUSR-CANET200を使用)などを利用して動作や通信状態を確認できます。
- フレーム解析例
- 08 (Frame Information)
- Data length is 8
- 00 00 00 7b (Frame ID)
- 01 23 45 67 89 ab cd ef (Frame data)
- PCからUSR_CANET200の設定ポートにUDPでトンネルしたCANメッセージを送信
- 88 (Frame Information)
- Extended frame, the data length is 8
- 00 00 00 7c (Frame ID)
- 01 23 45 67 89 ab cd ef (Frame data)
- 88 (Frame Information)
- USR-CANET200によってCANメッセージに変換されAXL F IF CAN 1Hで受信される。