HOME > ソフテックだより > 第439号(2023年12月6日発行) 技術レポート「横河電機製PLC CAN2.0B インタフェースモジュール 〜実装時によくある失敗と工夫〜」

「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。

ソフテックだより(発行日順)のページへ
ソフテックだより 技術レポート(技術分野別)のページへ
ソフテックだより 現場の声(シーン別)のページへ


ソフテックだより 第439号(2023年12月6日発行)
技術レポート

「横河電機製PLC CAN2.0B インタフェースモジュール
〜実装時によくある失敗と工夫〜」

1. はじめに

PLCを用いた機器の制御は広く一般に普及しています。
中でもCAN通信を用いたPLCによる制御は、自動車をはじめとして多くの機械製品に採用されている制御方法です。

横河電機製PLC FA-M3シリーズではCAN2.0Bインタフェースモジュール(F3LD21-0N、以降CAN通信モジュールと呼びます)を用いてCAN通信を行うシステムを作成することができます。
今回はCAN通信モジュールを用いたCAN通信を実装する上で私自身が出会った失敗や実装する上で失敗しやすいと感じた点と、その対処法や工夫を紹介いたします。

2.  よくある失敗

2.1 CAN通信速度設定の失敗

CAN通信モジュールでは125kbps/250kbps/500kbps/1Mbpsの4つの通信速度の中から一つを選び設定することができます。
ありがちなのはCAN通信モジュールの設定をしたのはいいものの、制御対象である通信相手の通信速度を設定することを忘れる失敗です。
私も同様の失敗をしました。

2.2 受信バッファ関連の設定失敗

データが受信できていないときは制御バッファやグローバルマスク、受信バッファなどのバッファ関連の設定が失敗している可能性があります。
下記の図に受信時のデータふりわけ手順について記載しました。

 CAN通信受信時のデータ振り分けの仕組み
図1. CAN通信受信時のデータ振り分けの仕組み

図の(1)〜(3)は以下のようになります。

(1)グローバルマスクによる振り分け
グローバルマスクの条件を満たすように各受信メッセージを制御バッファ(受信用)へ振り分けます。

(2)制御バッファ(受信用)から受信データバッファへの振り分け
制御バッファ(受信用)のデータを受信データバッファに振り分けます。

(3)受信データ格納領域への振り分け
受信データ格納領域に設定したCANIDと一致するようにメッセージを振り分けます。

ここでよくあるのがCANIDとグローバルマスク設定時のミスです。
それぞれ設定時にはCAN通信モジュールの設定レジスタに書き込む必要がありますが、設定したいグローバルマスク・CANIDをそのまま書き込むのではなく、ビットシフトをしたうえで書き込む必要があります。
下記にその図を記載します。
具体的な設定手順はCAN通信モジュールのマニュアルを参考にしてください。

グローバルマスクと設定レジスタの関係
図2.グローバルマスクと設定レジスタの関係

CANIDと設定レジスタの関係
図3.CANIDと設定レジスタの関係

2.3 CAN-High/Lowケーブルの誤配線

CAN通信は2つの信号線の電圧差によってデータを送受信します。
高電圧側をCAN-High、低電圧側をCAN-Lowと呼びます。
配線ミスとしてよくあるのがCAN-High、CAN-Lowのケーブルが入れ替わっているものです。

私もこの逆転による通信不良を起こしたことがありました。
気づけばなんてことはない失敗ではありますが意外と気づくことが難しい失敗です。

2.4 エンディアンの違い

横河電機製FA-M3シリーズはビッグエンディアン方式でデータを格納しています。
対して制御対象はリトルエンディアンであることも多いです。
通信機器間でエンディアンが違っている場合はバイトスワップする必要があります。
エンディアンの考慮を忘れると想定外の挙動につながる場合があるので注意が必要です。

例えば私がかかわった開発ではモーターを制御する開発がありました。
そこでは回転速度を指令値としてモーターに送っていました。
仮にPLC上で1ワードの値0x0014(=20)という回転数の指令値を出すことを考えると、エンディアンの違っている場合には、モーターではこの値が0x1400(=5120)と解釈されてしまいます。
つまりいきなり大きな回転指令値がモーターに伝わってしまうことになります。
通信処理を作成する際は必ず通信相手のエンディアンを確認しましょう。
また実機試験を行う場合はこのような不測の事態に備えて、常に緊急停止ができるような体制で試験を行うことも重要です。

3. CAN通信処理作成時の工夫

CAN通信モジュールで多数のメッセージの送受信処理を実現するには工夫が必要です。

3.1 制御バッファ関連設定の工夫

CAN通信ではメッセージの数や種類によって制御バッファ関連の設定を工夫しなければなりません。

CAN通信モジュールの制御バッファは15個しかありませんので、送受信メッセージが15種類を超えた時は1つの制御バッファから複数のCANIDのメッセージを送受信する必要があります。

1つの制御バッファ(受信用)に複数のCANIDのメッセージを格納するには、グローバルマスクによる設定が必要となります。
グローバルマスクは制御バッファに設定されたCANIDと、受信したメッセージのCANIDの一致条件を定めます。
グローバルマスクで1となっているビット位置と同じビット位置のCANIDが一致していれば、受信メッセージは制御バッファに格納されます。
例えば次の図4のようになります。

グローバルマスクによる処理
図4 .グローバルマスクによる処理

3.2 送信メッセージの工夫

複数のCANメッセージを送信している場合、1つの制御バッファ(送信用)から複数のメッセージを送るように登録する必要があります。
この時複数のメッセージの送信要求が同時に発生することを想定して、送信メッセージのバッファをCPUが持ち、CAN通信モジュールの同じ制御バッファに同時に書き込んで、送信することのないように処理を作成します。
すなわち1IDずつメッセージを送信するようにします。

4. おわりに

CAN通信は規約や設定事項が多く、なかなか1回ですべてうまくいくというのは難しいと思います。
私もとある開発で行った現地での実機との通信試験が、社内試験ですべてOKが出ていたにも関わらず、うまくいかなかったことがあります。
社内試験で問題なかったことを踏まえ、実機にかかわる項目を精査した結果、通信設定が不足していたことが原因だと判明しました。
その時は社内試験から少し時間が空いた中での現地試験でしたので、社内試験ではどう設定したか(=想定される実機の設定をどうしたか)について忘れている面がありました。
現地試験では何か問題が起きた時、まず自身の新規開発部分を疑うということが多いと思います。
ですが単体試験や社内試験に通ったものを持ち込んでいる場合は、落ち着いて試験時の操作を思いだすことも重要だと感じました。

今後は今回得られた知見をもとによりわかりやすく、より正確なCAN通信による制御を実装したいと考えています。

(Y.A.)


関連ページへのリンク

関連するソフテックだより

ページTOPへ