「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。
ソフテックだより(発行日順)のページへ
ソフテックだより 技術レポート(技術分野別)のページへ
ソフテックだより 現場の声(シーン別)のページへ
この度、横河電機株式会社殿のPLC(プログラマブルロジックコントローラ)FA-M3に対応するCAN通信モジュールの開発を担当しました。
CANとは何か、というところから始め、開発したモジュールの機能や詳細なパフォーマンスについて、紹介させていただきます。
CANとは、Controller Area Networkの略称であり、耐ノイズ特性を意識して設計された通信規格です。Low/Highの電気信号2線でデータ伝送を行います。
同一バス上に複数のCAN通信機器が接続可能で、それぞれの機器はアドレスのようなものは持たず、メッセージに個別のIDを付けて送信し、各々の機器がそのIDで必要なメッセージを区別し受信処理する、という方式になっています。エラーの検出や通知といった機能も備えています。
車載機器間の通信手段として開発・発展してきたCANですが、現在ではその信頼性や洗練された故障検出機能などが認められ、幅広い分野で注目されています。
今回開発したCANモジュールは、横河電機株式会社殿のパートナー製品として弊社より販売致しており、FA-M3ホームページでも紹介していただいています。
以下が製品画像になります。
図1. 今回開発したCANモジュール
本製品についての詳細はこちらのリンク先をご参照ください。 → CANモジュール紹介ページ
以降、本ソフテックだより文中でも「SZ20」の呼称を使用させていただきます。
「SZ20」には以下のような特徴があります。
ラダーCPUからの制御は、データレジスタへのREAD/WRITE命令(下図)と、入出力リレーのON/OFFによって行います。
図2. READ命令とWRITE命令
n1およびn2に1〜3799の数値を入れてSZ20のデータレジスタにアクセスすることで、通信機能の設定や送受信データの読み書きを行います。
例として、SZ20のデータレジスタの100番でCANメッセージバッファ1の機能が指定できるので、そこに0x0001を書き込むと送信バッファとして使用、という設定になります。そのようにして各データレジスタにWRITE命令を繰り返した後、入出力リレーによって初期化要求をかければ初期化が完了し、CAN通信動作が開始されます。
初期化完了後は、モジュールが自動的に周期送信するデータの内容をWRITE命令で随時書き換える、という処理と、メッセージが受信されたかどうかを該当レジスタに対しREAD命令を繰り返し実行することによって監視→新しいメッセージがあればデータ部分もREADする、という処理の二つを行うのが一般的な使用方法になると想定しています。
なお、周期送信以外に、任意のタイミングで1メッセージだけ送信する機能も備えています。
以下に送受信処理のフローチャートを示します。
図3. 送受信処理フローチャート
モジュールの詳細な仕様は以下のとおりです。
伝送媒体 | DeviceNetケーブル(信号系2本、シールド1本、電源系2本) |
---|---|
伝送距離 | 125kbps時、太ケーブル使用で、幹線500m、支線6m(条件によって変動) |
通信用電源 | 電圧DC 11〜25V、消費電流 40mA以下(DC 25V)をCANコネクタに供給 |
終端抵抗 | 121Ω、ON/OFF選択可能 |
外形寸法 | 28.9(W) mm × 100(H) mm ×83.2(D) mm (突起部を除く) |
質量 | 110g |
表1. 一般仕様
通信プロトコル | CAN 2.0B フォーマット(標準11bitIDおよび拡張29bitID対応) |
---|---|
対象フレーム | データフレーム(リモートフレームは非対応) |
チャネル数 | 1チャネル |
送信機能 | 自動周期送信(10ms〜65530ms)と手動送信(※)が可能 |
受信機能 | 受信データの格納が自動的に行われ、任意のタイミングで読み出すことが可能 |
使用可能ID数 | 自動周期送信は14個のIDまで可能で、手動送信(※)は制限なし グローバルマスクを設定することで320個のIDまで受信可能 (これらは同時に使用可能な数で、随時設定し直せばこれ以上も可能) |
伝送速度 | 125kbps/250kbps/500kbps/1Mbpsから選択可能 |
表2. 機能仕様
※ 任意タイミングで1フレームのみ送信する方式です。
320個のIDの受信設定について、詳しく説明します。
まず、SZ20に搭載されているCANコントローラには15個のメッセージバッファがあります。それらにグローバルマスクを設定できるので、例えば、グローバルマスクを0xF000と設定した場合、上位4bitが一致するデータをそれぞれのバッファで受信することができます。
バッファ番号 | 受信ID設定 | 受信可能ID(※) |
---|---|---|
0 | 0x2000 | 0010 **** *** (256-383) |
1 | 0x3000 | 0011 **** *** (384-511) |
2 | 0x4000 | 0100 **** *** (512-639) |
表3. グローバルマスク設定例(0xF000でマスク)
※ 標準IDは11bitで、グローバルマスクおよび受信ID設定の下位5bitは無視されます。
次に、各バッファで受信されたメッセージをデータレジスタ内にコピーしていくのですが、その際に、今度はマスク無しのIDでコピー先のアドレスを決定します。コピー先(格納レジスタと呼んでいます)が20ブロックあり、各ブロックに16個までのIDが設定可能なので、40×8=320のIDが受信可能となります。各ブロックはそれぞれ1つのCANメッセージバッファに対応し、その相手はユーザーが任意に指定できます。(下図)
図4. 受信機能説明
こうして受信メッセージを振り分けるところまでをSZ20が自動で行いますので、ラダーCPUは、格納レジスタの内必要なIDと対応するアドレスの受信通知を監視し、通知のあったところのデータを取得すれば受信処理が完了します。
送信については、前述したとおり、自動周期送信と、手動送信(任意タイミングで1フレームのみ送信)が可能です。
まずは自動周期送信について説明します。メッセージバッファにIDと送信周期を設定した上で送信要求をONにすると、そのバッファのCANデータ領域にあるデータを自動的に送信し続けます。送信要求OFF→データ領域書き換え→送信要求ONという手順を踏むと(図3)、送信するデータ内容を変更して周期送信を続行します。
手動送信モードに設定したバッファでは、送信要求がONになった直後に送信処理を実行し、自動的に送信要求をOFFにします。自動周期送信モードでは初期設定完了後のID変更が不可となっていますが、こちらの手動送信では1回ごとにIDを変更することが可能なので、CPUモジュールからの制御次第で0x0〜0x7FFのIDを全て送信することもできます。(拡張モード時はさらに多くのIDも)
SZ20のパフォーマンスについて調査し、以下のような結果を得ています。
まず送信ですが、自動送信周期を仕様上10ms単位で設定可能としていますが、最低の10msでも余裕があり、問題なく動作します。
受信処理の負荷によって変動しますが、送信間隔には数百μsecの誤差が発生します。
受信については、扱うIDの数やバッファの配置によって限界性能が変化します。
また、限界に達する要因が二つあり、一つはラダー側のデータ取り込み速度が間に合わずに格納バッファでメッセージの上書きが発生するもの、もう一つはSZ20に設けてある内部バッファがオーバフローしメッセージが破棄されてしまうものです。おおまかに、前者は少数のIDを短い間隔で受信した時、後者は多数のIDを短い間隔で受信した時に発生します。
ある個数のIDを周期的に受信させた場合の限界性能がどこにあるかを調査した結果を、以下の表にまとめました。
ID 1個 | ID 2個 (2バッファに1IDずつ) |
ID 15個 (1バッファに15IDずつ) |
ID 15個 (15バッファに1IDずつ) |
ID 75個 (15バッファに5IDずつ) |
|
0.1%以上の格納レジスタ 上書きが発生 |
0.8ms以下 | 0.8ms以下 | - (※1) | - (※1) | - (※1) |
SZ20内部バッファオーバフローが発生 | 0.1ms以下 | 0.2ms以下 | 2.1ms以下 | 2.1ms以下 | 11.4ms以下 |
ラダー最長スキャンタイム CPU:SP76(Vシリーズ) (※2) |
0.5ms | 0.6ms | 1.1ms | 1.1ms | 2.9ms |
ラダー最長スキャンタイム CPU:SP35 (※2) |
13.2ms | 13.3ms | 22.2ms | 22.5ms | 49.3ms |
表4. 受信パフォーマンス
※1 SZ20内部バッファオーバフローが先に発生するため計測不可
※2 受信有無を確認し、有ればデータを取り出す、という処理にて計測
「格納レジスタ上書き」と「内部バッファオーバフロー」の2項目は、下図の区間がどのくらいの時間になると現象が出るかを計測した結果です。
図5. パフォーマンス調査内容
「0.1%以上の格納レジスタ上書き」というのは、例えば100,000フレームのメッセージを受信させた際、1,000フレーム以上のメッセージがCPUモジュールによって読み出されず破棄されてしまったということを表します。この割合が0%になるところを探すのは、数十秒に1回上書きが発生するような周期もあるので難しく、逆に、ある周期からは発生割合が一気に増えるので、0.1%以上という条件としています。発生周期はラダースキャンタイムとの兼ね合いになります。
IDが1個、2個と扱うフレームの量が少ない時は内部バッファオーバフローがなかなか発生せず、CPUモジュールによるデータ取り出しが間に合わなくなるところで、格納レジスタ上書きが発生します。この限界値はCPUモジュールの能力とプログラム次第ですが、ラダースキャンタイムの2倍以上の周期であれば全てのメッセージをもれなく格納することができます。
扱うメッセージが多いときは、SZ20の処理能力が間に合わず内部バッファがオーバフローし、その時に受信したメッセージを破棄してしまいます。1msあたり約6フレーム以下のペースでの受信に耐えられる、という結果が出ています。
これは長期的に見た場合の値であり、瞬間的にはそれ以上も可能です。例えば、1msの間に10フレーム受信し、その後100ms間隔が空いてからまた10フレーム連続で受信、という場合は瞬間的に6フレーム/msを超えていますが、無受信期間にバッファ内の一時データが処理されるのでオーバフローしません。
SZ20はPLCのCAN通信ユニットということで、十分な設置スペースがあり、温度や振動へのある程度の耐久性が求められる環境にも向いていると思います。
車載機器とのデータ通信や、CAN通信機器の検査など、様々なシステムにぜひご活用ください。
(N.N.)
関連ページへのリンク
関連するソフテックだより