(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2024-01-15
(45)【発行日】2024-01-23
(54)【発明の名称】通信制御機器および通信制御機器の制御方法
(51)【国際特許分類】
H04L 69/10 20220101AFI20240116BHJP
【FI】
H04L69/10
(21)【出願番号】P 2020039984
(22)【出願日】2020-03-09
【審査請求日】2023-01-11
(73)【特許権者】
【識別番号】000002945
【氏名又は名称】オムロン株式会社
(74)【代理人】
【識別番号】100155712
【氏名又は名称】村上 尚
(72)【発明者】
【氏名】玉井 俊規
【審査官】宮島 郁美
(56)【参考文献】
【文献】特開2005-258509(JP,A)
【文献】特開2004-343734(JP,A)
【文献】国際公開第2018/146899(WO,A1)
(58)【調査した分野】(Int.Cl.,DB名)
H04L12/00-12/66,13/00,41/00-49/9057,61/00-65/80,69/00-69/40
(57)【特許請求の範囲】
【請求項1】
読み込んだディスクリプタに従ってメインメモリから送信バッファへとデータを転送し、前記送信バッファに転送された前記データを送信する通信制御機器であって、
複数の前記ディスクリプタの各々において規定されている、送信予定時刻
と実行優先度
との
双方に基づいて、複数の前記ディスクリプタの中から、読み込むディスクリプタを選択する選択部と、
前記選択部によって選択された前記ディスクリプタを読み込む読込部と
を備える通信制御機器。
【請求項2】
読み込んだディスクリプタに従ってメインメモリから送信バッファへとデータを転送し、前記送信バッファに転送された前記データを送信する通信制御機器であって、
複数の前記ディスクリプタの各々において規定されている、送信予定時刻および実行優先度の少なくとも一方に基づいて、複数の前記ディスクリプタの中から、読み込むディスクリプタを選択する選択部と、
前記選択部によって選択された前記ディスクリプタを読み込む読込部と
を備え、
複数の前記ディスクリプタの中の或るディスクリプタの前記実行優先度が、別のディスクリプタの前記実行優先度よりも高い場合、前記選択部は、
(A)現在時刻に、前記或るディスクリプタに対応するデータを前記メインメモリから前記送信バッファへと転送するのに要する転送時間と、前記別のディスクリプタに対応するデータを前記メインメモリから前記送信バッファへと転送するのに要する転送時間とを加えた時刻である予定合計時刻と、(B)前記或るディスクリプタの前記送信予定時刻とを比較し、
前記或るディスクリプタの前記送信予定時刻が、前記予定合計時刻よりも後だと、前記或るディスクリプタに優先して前記別のディスクリプタを選択し、
前記或るディスクリプタの前記送信予定時刻が、前記予定合計時刻以前だと、前記別のディスクリプタに優先して前記或るディスクリプタを選択す
る通信制御機器。
【請求項3】
読み込んだディスクリプタに従ってメインメモリから送信バッファへとデータを転送し、前記送信バッファに転送された前記データを送信する通信制御機器であって、
複数の前記ディスクリプタの各々において規定されている、送信予定時刻および実行優先度の少なくとも一方に基づいて、複数の前記ディスクリプタの中から、読み込むディスクリプタを選択する選択部と、
前記選択部によって選択された前記ディスクリプタを読み込む読込部と
を備え、
判定時間が予め設定されており、
前記読込部は、前記ディスクリプタの送信予定時刻から前記判定時間を遡った時刻になってから、前記ディスクリプタを読み込
む通信制御機器。
【請求項4】
読み込んだディスクリプタに従ってメインメモリから送信バッファへとデータを転送し、前記送信バッファに転送された前記データを送信する通信制御機器であって、
複数の前記ディスクリプタの各々において規定されている、送信予定時刻および実行優先度の少なくとも一方に基づいて、複数の前記ディスクリプタの中から、読み込むディスクリプタを選択する選択部と、
前記選択部によって選択された前記ディスクリプタを読み込む読込部と
を備え、
前記送信バッファは、
前記読込部が読み込んだ前記ディスクリプタの順に、前記ディスクリプタに対応する前記データが格納される通常送信バッファと、
前記通常送信バッファに格納されている前記データに対応する前記ディスクリプタを前記選択部が選択してから、前記通常送信バッファに格納されている前記データが送信されるまでの間に前記読込部が読み込んだディスクリプタであって、前記通常送信バッファに格納されている前記データに対応する前記ディスクリプタよりも前記実行優先度が高いディスクリプタに対応する前記データが格納される特別送信バッファと
を含
む通信制御機器。
【請求項5】
読み込んだディスクリプタに従ってメインメモリから送信バッファへとデータを転送し、前記送信バッファに転送された前記データを送信する通信制御機器の制御方法であって、
複数の前記ディスクリプタの各々において規定されている、送信予定時刻
と実行優先度
との
双方に基づいて、複数の前記ディスクリプタの中から、読み込むディスクリプタを選択する選択ステップと、
前記選択ステップにて選択された前記ディスクリプタを読み込む読込ステップと
を含む制御方法。
【請求項6】
読み込んだディスクリプタに従ってメインメモリから送信バッファへとデータを転送し、前記送信バッファに転送された前記データを送信する通信制御機器の制御方法であって、
複数の前記ディスクリプタの各々において規定されている、送信予定時刻および実行優先度の少なくとも一方に基づいて、複数の前記ディスクリプタの中から、読み込むディスクリプタを選択する選択ステップと、
前記選択ステップにて選択された前記ディスクリプタを読み込む読込ステップと
を含み、
複数の前記ディスクリプタの中の或るディスクリプタの前記実行優先度が、別のディスクリプタの前記実行優先度よりも高い場合、前記選択ステップにおいては、
(A)現在時刻に、前記或るディスクリプタに対応するデータを前記メインメモリから前記送信バッファへと転送するのに要する転送時間と、前記別のディスクリプタに対応するデータを前記メインメモリから前記送信バッファへと転送するのに要する転送時間とを加えた時刻である予定合計時刻と、(B)前記或るディスクリプタの前記送信予定時刻とを比較し、
前記或るディスクリプタの前記送信予定時刻が、前記予定合計時刻よりも後だと、前記或るディスクリプタに優先して前記別のディスクリプタを選択し、
前記或るディスクリプタの前記送信予定時刻が、前記予定合計時刻以前だと、前記別のディスクリプタに優先して前記或るディスクリプタを選択する制御方法。
【請求項7】
読み込んだディスクリプタに従ってメインメモリから送信バッファへとデータを転送し、前記送信バッファに転送された前記データを送信する通信制御機器の制御方法であって、
複数の前記ディスクリプタの各々において規定されている、送信予定時刻および実行優先度の少なくとも一方に基づいて、複数の前記ディスクリプタの中から、読み込むディスクリプタを選択する選択ステップと、
前記選択ステップにて選択された前記ディスクリプタを読み込む読込ステップと
を含み、
判定時間が予め設定されており、
前記読込ステップにおいては、前記ディスクリプタの送信予定時刻から前記判定時間を遡った時刻になってから、前記ディスクリプタを読み込む制御方法。
【請求項8】
読み込んだディスクリプタに従ってメインメモリから送信バッファへとデータを転送し、前記送信バッファに転送された前記データを送信する通信制御機器の制御方法であって、
複数の前記ディスクリプタの各々において規定されている、送信予定時刻および実行優先度の少なくとも一方に基づいて、複数の前記ディスクリプタの中から、読み込むディスクリプタを選択する選択ステップと、
前記選択ステップにて選択された前記ディスクリプタを読み込む読込ステップと
を含み、
前記送信バッファは、
前記読込ステップにおいて読み込んだ前記ディスクリプタの順に、前記ディスクリプタに対応する前記データが格納される通常送信バッファと、
前記通常送信バッファに格納されている前記データに対応する前記ディスクリプタを前記選択ステップにおいて選択してから、前記通常送信バッファに格納されている前記データが送信されるまでの間に前記読込ステップにおいて読み込んだディスクリプタであって、前記通常送信バッファに格納されている前記データに対応する前記ディスクリプタよりも前記実行優先度が高いディスクリプタに対応する前記データが格納される特別送信バッファと
を含む制御方法。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、読み込んだディスクリプタに従ってメインメモリから送信バッファへとデータを転送し、前記送信バッファに転送された前記データを送信する通信制御機器等に関する。
【背景技術】
【0002】
従来、PLC(Programmable Logic Controller;以下、PLCとも称す)などの産業用制御装置について、プロセッサの負荷を分散させるための各種の試みが知られている。例えば、下掲の特許文献1には、複数のコアからなるプロセッサと、複数のキューと、複数の通信ポートとを備え、各キューを各コアに対応付け、各コアにおける処理結果を、各コアに対応する各キューに格納するコントローラが開示されている。特許文献1のコントローラでは、コアの数と同数のキューが設けられ、また、キューの数と同数の通信ポートが設けられて、各コアに対応する各キューが、各コアにおける処理結果の出力等を制御することによって、プロセッサの負担を軽減しようとしている。
【先行技術文献】
【特許文献】
【0003】
【発明の概要】
【発明が解決しようとする課題】
【0004】
しかしながら、上述のような従来技術は、ネットワークセグメントごとに送信キューを分けるため、ネットワークセグメントが多くなると、それに合わせて送信キューが複数必要になり、実現が困難になるとの問題がある。すなわち、ネットワーク・インターフェイス・カード(Network Interface Card、NIC)の半導体、FPGA(Field-programmable gate array)のゲート使用量などを考慮すると、増やすことができる送信キューの個数には限界がある。
【0005】
本発明の一態様は、実装サイズを抑制しつつ、ソフトウェア(プロセッサ)の処理負荷を低減することのできる通信制御機器を実現することを目的とする。
【課題を解決するための手段】
【0006】
上記の課題を解決するために、本発明の一態様に係る通信制御機器は、読み込んだディスクリプタに従ってメインメモリから送信バッファへとデータを転送し、前記送信バッファに転送された前記データを送信する通信制御機器であって、複数の前記ディスクリプタの各々において規定されている、送信予定時刻および実行優先度の少なくとも一方に基づいて、複数の前記ディスクリプタの中から、読み込むディスクリプタを選択する選択部と、前記選択部によって選択された前記ディスクリプタを読み込む読込部と、を備えている。
【0007】
前記の構成によれば、前記通信制御機器は、複数の前記ディスクリプタの各々において規定されている、送信予定時刻および実行優先度の少なくとも一方に基づいて、複数の前記ディスクリプタの中から、読み込むディスクリプタを選択する。そして、前記通信制御機器は、選択した前記ディスクリプタを読み込み、読み込んだ前記ディスクリプタに従って、前記メインメモリから前記送信バッファへと前記データを転送する。つまり、前記通信制御機器は、複数の前記ディスクリプタの中から、読み込むべきディスクリプタを、複数の前記ディスクリプタの各々の送信予定時刻および実行優先度の少なくとも一方に基づいて、1つずつ選択する。
【0008】
そのため、前記通信制御機器は、各々がDMAC(Direct Memory Access Controller)および送信バッファを含む、複数の送信キューを備える必要がなく、実装サイズを小さくすることができる。
【0009】
また、前記通信制御機器は、複数の前記ディスクリプタの読込順序を制御することによって、ソフトウェア(プロセッサ)による処理結果の出力等を、具体的には、前記データの送信順序を制御する。つまり、ソフトウェアは、前記通信制御機器を、「送信データの、送信順序および実際の送信時刻(実送信時刻)」の管理を行う送信キューを複数備えた、1つのハードウェアとして扱うことができる。そのため、前記通信制御機器は、処理結果の出力制御(例えば、「送信データの、送信順序および実送信時刻」の管理)等に係るソフトウェアの処理負荷を低減することができる。
【0010】
したがって、前記通信制御機器は、実装サイズを抑制しつつ、ソフトウェアの処理負荷を低減することができるとの効果を奏する。
【0011】
本発明の一態様に係る通信制御機器について、複数の前記ディスクリプタの中の或るディスクリプタの前記実行優先度が、別のディスクリプタの前記実行優先度よりも高い場合、前記選択部は、(A)現在時刻に、前記或るディスクリプタに対応するデータを前記メインメモリから前記送信バッファへと転送するのに要する転送時間と、前記別のディスクリプタに対応するデータを前記メインメモリから前記送信バッファへと転送するのに要する転送時間とを加えた時刻である予定合計時刻と、(B)前記或るディスクリプタの前記送信予定時刻とを比較し、前記或るディスクリプタの前記送信予定時刻が、前記予定合計時刻よりも後だと、前記或るディスクリプタに優先して前記別のディスクリプタを選択し、前記或るディスクリプタの前記送信予定時刻が、前記予定合計時刻以前だと、前記別のディスクリプタに優先して前記或るディスクリプタを選択してもよい。
【0012】
前記の構成によれば、前記通信制御機器は、前記或る送信ディスクリプタの実行優先度が、前記別のディスクリプタの実行優先度よりも高いと、前記予定合計時刻と前記或るディスクリプタの前記送信予定時刻とを比較する。そして、前記或るディスクリプタの前記送信予定時刻が、前記予定合計時刻よりも後だと、前記通信制御機器は、前記或るディスクリプタに優先して前記別のディスクリプタを選択する。また、前記或るディスクリプタの前記送信予定時刻が、前記予定合計時刻以前だと、前記通信制御機器は、前記別のディスクリプタに優先して前記或るディスクリプタを選択する。
【0013】
ここで、複数の前記ディスクリプタの各々において規定されている実行優先度のみに基づいて、読み込むべきディスクリプタを選択した場合、実行優先度が低いディスクリプタは、常に、実行優先度が高いディスクリプタよりも後に読み込まれることになる。
【0014】
しかし、前記或るディスクリプタより実行優先度が低い前記別のディスクリプタの送信予定時刻が、前記或るディスクリプタの送信予定時刻よりも十分に早い場合、実行優先度のみに従ってディスクリプタの読込順序を決定することは、必ずしも適切ではない。
【0015】
例えば、前記別のディスクリプタに対応する送信データを前記メインメモリに転送した後であっても、前記或る送信ディスクリプタに対応する送信データを、前記或る送信ディスクリプタの送信予定時刻よりも前に、前記メインメモリへと転送できる場合がある。そのような場合、前記別のディスクリプタを読み込んだ(実行した)後に、前記或るディスクリプタを読み込めばよく、つまり、前記別のディスクリプタを、前記或る送信ディスクリプタよりも先に読み込むべきである。
【0016】
また、複数の前記ディスクリプタの各々において規定されている送信予定時刻のみに基づいて、読み込むべきディスクリプタを選択した場合、送信予定時刻が遅いディスクリプタは、常に、送信予定時刻が早いディスクリプタよりも後に読み込まれることになる。
【0017】
しかし、前記或るディスクリプタよりも実行優先度が低い前記別のディスクリプタの送信予定時刻が、前記或るディスクリプタの送信予定時刻の直前である場合、送信予定時刻のみに従ってディスクリプタの読込順序を決定することは、必ずしも適切ではない。
【0018】
例えば、前記別のディスクリプタに対応する送信データを前記メインメモリに転送した後では、前記或る送信ディスクリプタに対応する送信データを、前記或る送信ディスクリプタの送信予定時刻よりも前に、前記メインメモリへと転送できない場合がある。そのような場合、前記別のディスクリプタを読み込む(実行する)前に、前記或るディスクリプタを読み込まなくてはならず、つまり、前記或るディスクリプタを、前記別の送信ディスクリプタよりも先に読み込むべきである。
【0019】
前記通信制御機器は、実行優先度のみに従ったディスクリプタの読込順序の決定、および、送信予定時刻のみに従ったディスクリプタの読込順序の決定の各々が有する上述の不備を補う。すなわち、複数の前記ディスクリプタの中の或るディスクリプタの前記実行優先度が、別のディスクリプタの前記実行優先度よりも高い場合、前記通信制御機器は、前記予定合計時刻と前記或るディスクリプタの前記送信予定時刻とを比較する。そして、前記通信制御機器は、前記予定合計時刻と前記或るディスクリプタの前記送信予定時刻との比較結果に基づいて、読み込むべきディスクリプタを選択する。
【0020】
したがって、前記通信制御機器は、実行優先度および送信予定時刻のいずれか一方にのみ従って読み込むべきディスクリプタを選択する方法に比べて、読み込むべきディスクリプタを適切に選択することができるとの効果を奏する。
【0021】
本発明の一態様に係る通信制御機器において、判定時間が予め設定されており、前記読込部は、前記ディスクリプタの送信予定時刻から前記判定時間を遡った時刻になってから、前記ディスクリプタを読み込んでもよい。
【0022】
前記の構成によれば、前記通信制御機器は、前記ディスクリプタの送信予定時刻から前記判定時間を遡った時刻になってから、前記ディスクリプタを読み込む。
【0023】
ここで、或るディスクリプタを読み込んだ後に、前記或るディスクリプタの送信予定時刻よりも現在時刻に近い時刻を送信予定時刻とする別のディスクリプタが生成された場合、以下の問題が発生する。すなわち、前記或るディスクリプタに対応するデータが障害となって、前記別のディスクリプタに対応するデータを、前記別のディスクリプタの送信予定時刻で送信することができないという問題が発生する。
【0024】
これは、前記送信バッファに格納されたデータは、格納された順で送信されるからである。つまり、前記或るディスクリプタに対応するデータが前記別のディスクリプタに対応するデータより先に格納されたなら、前記或るディスクリプタに対応するデータが送信されてからでないと、前記別のディスクリプタに対応するデータは送信されない。そして、前記或るディスクリプタに対応するデータは、前記或るディスクリプタの送信予定時刻にならなければ送信されない。しかしながら、前記或るディスクリプタの送信予定時刻は、前記別のディスクリプタの送信予定時刻よりも後であるから、前記別のディスクリプタに対応するデータを、前記別のディスクリプタの送信予定時刻で送信することはできない。
【0025】
そこで、前記通信制御機器は、前記ディスクリプタの送信予定時刻から前記判定時間を遡った時刻になってから、前記ディスクリプタを読み込むことによって、上述の問題が発生する可能性を抑制する。すなわち、前記或るディスクリプタの送信予定時刻よりも現在時刻に近い時刻を送信予定時刻とする前記別のディスクリプタを読み込む前に、前記或るディスクリプタを読み込むことがないよう、前記通信制御機器は、前記或るディスクリプタの読込時刻を調整する。具体的には、前記通信制御機器は、前記或るディスクリプタの送信予定時刻から前記判定時間を遡った時刻になってから、前記或るディスクリプタを読み込む。
【0026】
したがって、前記通信制御機器は、前記或るディスクリプタの送信予定時刻よりも現在時刻に近い時刻を送信予定時刻とする前記別のディスクリプタを読み込む前に、前記或るディスクリプタを読み込むことを防ぐことができるとの効果を奏する。
【0027】
本発明の一態様に係る通信制御機器において、前記送信バッファは、前記読込部が読み込んだ前記ディスクリプタの順に、前記ディスクリプタに対応する前記データが格納される通常送信バッファと、前記通常送信バッファに格納されている前記データに対応する前記ディスクリプタを前記選択部が選択してから、前記通常送信バッファに格納されている前記データが送信されるまでの間に前記読込部が読み込んだディスクリプタであって、前記通常送信バッファに格納されている前記データに対応する前記ディスクリプタよりも前記実行優先度が高いディスクリプタに対応する前記データが格納される特別送信バッファと、を含んでもよい。
【0028】
前記の構成によれば、前記通信制御機器は、前記通常送信バッファと前記特別送信バッファとを含む前記送信バッファを備えている。そして、前記通信制御機器は、通常は、読み込んだ前記ディスクリプタの順に、読み込んだ前記ディスクリプタに対応するデータを、前記通常送信バッファに格納する。
【0029】
前記通信制御機器は、「前記通常送信バッファに格納されている前記データに対応する前記ディスクリプタを選択してから、前記通常送信バッファに格納されている前記データを送信するまで」の間に新たなディスクリプタを読み込むと、以下の判定を実行する。すなわち、前記通信制御機器は、前記新たなディスクリプタの前記実行優先度が、前記通常送信バッファに格納されている前記データに対応する前記ディスクリプタの前記実行優先度よりも高いかを判定する。
【0030】
そして、前記新たなディスクリプタの前記実行優先度の方が高い場合、前記通信制御機器は、前記新たなディスクリプタに対応するデータを、前記特別送信バッファに格納する。前記新たなディスクリプタの前記実行優先度の方が低い、または、前記実行優先度が同じ場合、前記通信制御機器は、前記新たなディスクリプタに対応するデータを、前記普通送信バッファに格納する。
【0031】
ここで、前記選択部が或るディスクリプタを選択してから、前記或るディスクリプタに対応するデータが送信されるまでの間に、前記或るディスクリプタより前記実行優先度が高い別のディスクリプタを前記読込部が読み込む可能性がある。そのような場合、送信バッファが1つしかなかったとしたら、前記別のディスクリプタに対応するデータは、1つしかない送信バッファに、前記或るディスクリプタに対応するデータよりも後に格納されざるを得ない。その結果、前記別のディスクリプタに対応するデータを、前記或るディスクリプタに対応するデータよりも先に送信することは不可能となる。
【0032】
これに対して、前記通信制御機器は、前記通常送信バッファと前記特別送信バッファとを含む前記送信バッファを備えている。そして、前記通信制御機器は、上述の通り、前記通常送信バッファに格納されているデータよりも優先して送信すべきデータが新たに発生すると、そのようなデータを前記特別送信バッファに格納する。
【0033】
したがって、前記通信制御機器は、前記或るディスクリプタを選択してから、前記或るディスクリプタに対応するデータを送信するまでに発生した、前記或るディスクリプタに対応するデータより優先送信すべきデータを、優先送信できるとの効果を奏する。
【0034】
上記の課題を解決するために、本発明の一態様に係る制御方法は、読み込んだディスクリプタに従ってメインメモリから送信バッファへとデータを転送し、前記送信バッファに転送された前記データを送信する通信制御機器の制御方法であって、複数の前記ディスクリプタの各々において規定されている、送信予定時刻および実行優先度の少なくとも一方に基づいて、複数の前記ディスクリプタの中から、読み込むディスクリプタを選択する選択ステップと、前記選択ステップにて選択された前記ディスクリプタを読み込む読込ステップと、を含んでいる。
【0035】
前記の構成によれば、前記制御方法は、複数の前記ディスクリプタの各々において規定されている、送信予定時刻および実行優先度の少なくとも一方に基づいて、複数の前記ディスクリプタの中から、読み込むディスクリプタを選択する。そして、前記制御方法は、選択した前記ディスクリプタを読み込み、読み込んだ前記ディスクリプタに従って、前記メインメモリから前記送信バッファへと前記データを転送する。つまり、前記制御方法は、複数の前記ディスクリプタの中から、読み込むべきディスクリプタを、複数の前記ディスクリプタの各々の送信予定時刻および実行優先度の少なくとも一方に基づいて、1つずつ選択する。
【0036】
そのため、前記制御方法を実行する通信制御機器は、各々がDMACおよび送信バッファを含む、複数の送信キューを備える必要がなく、前記制御方法を実行する通信制御機器の実装サイズを小さくすることができる。
【0037】
また、前記制御方法は、複数の前記ディスクリプタの読込順序を制御することによって、ソフトウェア(プロセッサ)による処理結果の出力等を、具体的には、前記データの送信順序を制御する。つまり、ソフトウェアは、前記通信制御機器を、「送信データの、送信順序および実送信時刻」の管理を行う送信キューを複数備えた、1つのハードウェアとして扱うことができる。そのため、前記通信制御機器は、処理結果の出力制御(例えば、「送信データの、送信順序および実送信時刻」の管理)等に係るソフトウェアの処理負荷を低減することができる。
【0038】
したがって、前記制御方法は、前記制御方法を実行する通信制御機器の実装サイズを抑制しつつ、ソフトウェアの処理負荷を低減することができるとの効果を奏する。
【発明の効果】
【0039】
本発明の一態様によれば、実装サイズを抑制しつつ、ソフトウェア(プロセッサ)の処理負荷を低減することができるとの効果を奏する。
【図面の簡単な説明】
【0040】
【
図1】本発明の実施形態1に係る通信コントローラを含むPLCの要部構成を示す図である。
【
図2】
図1のPLCを含む制御システムの概要を示す図である。
【
図3】本発明の実施形態1に係る通信コントローラの実行する処理の概要を説明するフロー図である。
【
図4】ケース1において、優先度のみに基づいて、先に読み込むべきディスクリプタを選択した場合に発生する状況を説明する図である。
【
図5】ケース2において、送信時刻のみに基づいて、先に読み込むべきディスクリプタを選択した場合に発生する状況を説明する図である。
【
図6】本発明の実施形態1に係る通信コントローラが優先度と送信時刻とを考慮して実行する選択処理の一例を示すフロー図である。
【
図7】本発明の実施形態1に係る通信コントローラが
図6に例示したフローを実行することにより選択するディスクリプタを説明する図である。
【
図8】ケース1について、
図6に例示したフローを実行した場合の具体的処理例を示す図である。
【
図9】ケース2について、
図6に例示したフローを実行した場合の具体的処理例を示す図である。
【
図10】本発明の実施形態1に係る通信コントローラが、或る送信データの転送時間を算出する際に用いる情報を整理した表である。
【
図11】ケース3において、判定時間を設けない場合に発生する状況を説明する図である。
【
図12】ケース3について、本発明の実施形態1に係る通信コントローラに判定時間を設けた場合に実現される、具体的な処理例を示す図である。
【
図13】CPUおよびリクエスタが実行する処理例を示すフロー図である。
【
図14】ディスクリプタ実行管理部およびBUF管理部等が実行する処理例を示すフロー図である。
【
図15】
図14の(A)に例示した選択処理の一例を示すフロー図である。
【
図16】
図15に例示した更新処理について、対象ディスクリプタの優先度がカレント優先度と同じ場合、および、前者が後者より高い場合の例を示すフロー図である。
【
図17】
図15に例示した更新処理について、対象ディスクリプタの優先度がカレント優先度より低い場合の例を示すフロー図である。
【発明を実施するための形態】
【0041】
〔実施形態1〕
以下、本発明の一側面に係る実施の形態(以下、「本実施形態」とも表記する)を、図面に基づいて説明する。なお、図中同一または相当部分には同一符号を付してその説明は繰返さない。本実施の形態においては、機械および設備等の制御対象を制御するPLC(プログラマブル・ロジック・コントローラ、Programmable Logic Controller)1の備える通信コントローラ10を通信制御機器の典型例として説明を行なう。
【0042】
以下の説明において、「n」は「1」以上の整数を示すものとし、また、「バッファ」を「BUF」と略記し、送信ディスクリプタを格納する「ディスクリプタメモリ」をTXと略記することがある。例えば、第一バッファ162(0)を「BUF0」と略記し、第二バッファ162(1)を「BUF1」と略記し、第nバッファ162(n-1)を「BUFn-1」と略記することがある。第一バッファ162(0)、第二バッファ162(1)、第nバッファ162(n-1)の各々を特に区別する必要がない場合には、単に「バッファ162」または「BUF」とすることがある。
【0043】
同様に、第一ディスクリプタメモリ14(0)を「TX0」と略記し、第二ディスクリプタメモリ14(1)を「TX1」と略記し、第nディスクリプタメモリ14(n-1)を「TXn-1」と略記することがある。第一ディスクリプタメモリ14(0)、第二ディスクリプタメモリ14(1)、第nディスクリプタメモリ14(n-1)の各々を特に区別する必要がない場合には、単に「ディスクリプタメモリ14」または「TX」とすることがある。
【0044】
さらに、第一リクエスタ15(0)、第二リクエスタ15(1)、第nリクエスタ15(n-1)の各々を特に区別する必要がない場合には、単に「リクエスタ15」とすることがある。
【0045】
§1.適用例
本発明の一態様に係る通信コントローラ10(通信制御機器)についての理解を容易にするため、先ず、本発明が適用される場面の一例について、具体的には、通信コントローラ10を備えるPLC1を含む制御システム0の概要について、
図2を用いて説明する。
【0046】
(制御システムの概要)
図2は、制御システム0の概要を示す図である。制御システム0は、PLC1と、ネットワークハブ2と、各々がネットワークハブ2を介してPLC1に接続されているネットワーク3(1)および3(2)とを含んでいる。以下、ネットワーク3(1)と、ネットワーク3(2)とを特に区別する必要がない場合には、単に「ネットワーク3」と称することがある。ネットワーク3は、1つ以上のネットワークデバイスを含んでいる。
【0047】
図2に例示する制御システム0においては、ネットワークハブ2を介して、複数のネットワーク3が、PLC1に接続している。制御システム0における通信には、ギガ帯域が使用されてもよい。
【0048】
PLC1は、制御システム0の全体を制御する制御装置であり、ネットワークハブ2は、PLC1と複数のネットワーク3との間の通信を管理するネットワークハブまたはネットワークスイッチである。
図2に示す制御システム0においては、PLC1の1つのネットワークポート(すなわち、
図1の送信ポート18)に対して、複数のネットワーク3が、例えば、ネットワーク3(1)および3(2)が、存在している。
【0049】
ここで、ネットワーク3(1)および3(2)のいずれもが制御ネットワークであってもよいし、すなわち、PLC1と通信を行う全てのネットワーク3が制御ネットワークであってもよい。また、ネットワーク3(1)および3(2)のいずれか一方が制御ネットワークであり、他方がデータネットワークであってもよく、つまり、PLC1と通信を行うネットワーク3について、制御ネットワークとデータネットワークとが混在していてもよい。
【0050】
例えば、ネットワーク3が制御ネットワークである場合、PLC1は、生産設備内の入力機器及び出力機器の制御を司る制御装置であり、また、ネットワークデバイスは、例えば、生産設備内の入力機器及び出力機器である。PLC1とネットワークデバイスとは、ネットワーク3を介してサイクリックに通信を行なうことで、INデータ及びOUTデータ(以下、「IOデータ」という)の送受信を行ない、PLC1は、生産設備の全体を制御する。すなわち、ネットワーク3が制御ネットワークである場合、制御システム0は、PLC1をマスタ装置(データ伝送を管理するマスタ装置)とし、ネットワークデバイスをスレーブ装置とするマスタ・スレーブ制御システムと捉えることができる。
【0051】
ネットワーク3が制御ネットワークである場合、ネットワーク3は、EtherCAT(Ethernet for Control Automation Technology:登録商標)規格等の産業用イーサネット(登録商標)規格に準拠するものであってもよい。ネットワーク3が制御ネットワークである場合、ネットワーク3は、EtherNet/IP(登録商標)規格に準拠するものであってもよい。
【0052】
以下では、
図2におけるPLC1とネットワークデバイスとの間の通信(以下、「ネットワーク通信」とも称する)がEthernet規格に準拠する例について説明する。また、CPU30と通信コントローラ10とは、PCIe(Peripheral Component Interconnect Express)によって通信可能に接続されているものとする。
【0053】
なお、
図2には、ネットワークハブ2を介して、複数のネットワーク3が、PLC1に接続する制御システム0を例示したが、制御システム0において、PLC1に、複数のネットワーク3がネットワークハブ2を介して接続することは必須ではない。制御システム0において、1つのネットワーク3(特に、1つの制御ネットワーク)が、ネットワークハブ2を介さずに、PLC1に接続してもよい。例えば、マスタ・スレーブ制御システムである制御システム0において、マスタ装置であるPLC1と、各々がスレーブ装置である1つ以上のネットワークデバイスとを、一筆書きの形式で通信可能に接続してもよい。
【0054】
(本実施形態に係る通信コントローラが実行する処理の概要)
以下に
図1等を用いて詳細を説明していく通信コントローラ10について、その理解を容易にするため、通信コントローラ10が実行する処理を、以下のように整理しておく。
【0055】
すなわち、通信コントローラ10がソフトウェア(つまり、CPU30)から複数の送信要求(つまり、複数の送信ディスクリプタの実行要求)を略同時に受け付けると、通信コントローラ10のディスクリプタ実行管理部13は、選択処理を実行する。
【0056】
選択処理において、先ず、ディスクリプタ実行管理部13(特に、選択部131)は、実行すべき複数の送信ディスクリプタ(ディスクリプタ)の各々について、「送信時刻TT」および「ソフトウェアが指定する優先度P」を取得する。そして、ディスクリプタ実行管理部13は、取得した「複数のディスクリプタの各々の、送信時刻TTおよび優先度P」を用いて、実行するディスクリプタを選択し、つまり、読み込むディスクリプタを選択する。詳細は後述するが、ディスクリプタ実行管理部13は、読み込むディスクリプタを選択する際に、「複数のディスクリプタの各々の、データサイズ(つまり、データ転送サイズ)」を利用してもよい。
【0057】
ここで、CPUの処理負荷を軽減するため、ハードウェアによる論理回路で構成したNIC等によって、「送信データの、送信順序および実際の送信時刻(実送信時刻RTT)」の管理を行う構成が知られている。「実送信時刻RTT」とは、その送信データが実際に送信される時刻であり、実送信時刻RTTを送信時刻TTに一致させる送信を「時刻送信」とも称する。
【0058】
「送信データの、送信順序および実送信時刻RTT」の管理を行うNICの一例において、「送信データの、送信順序および実送信時刻RTT」の管理を行う送信キューは、DMAC(Direct Memory Access Controller)および送信BUFを備えている。そして、そのようなNICの一例においては、「送信データの、送信順序および実送信時刻RTT」の管理を行うべき通信ネットワークごとに、「DMACおよび送信BUFを備える、送信キュー」が設けられている。
【0059】
ただし、「送信データの、送信順序および実送信時刻RTT」の管理を行うべき通信ネットワークごとに、「DMACおよび送信BUFを備える、送信キュー」をNICに設けようとすると、以下の問題が発生する。すなわち、上述の管理を行うべき通信ネットワークの数が増えるにしたがって、「DMACおよび送信BUFを含む、送信キュー」の数も増えるため、NICの実装サイズが大きくなってしまう。
【0060】
これに対して、通信コントローラ10は、上述の選択処理(特に、読み込むディスクリプタの選択処理)を実行することにより、「DMACおよび送信BUFを含む、送信キュー」を複数備える必要がない。
【0061】
例えば、
図1に例示する通信コントローラ10は、メインメモリ20から読み出した送信データを送信する前に一時的に保持しておくためのバッファ162を「2つ」備えているが、通信コントローラ10が備えるバッファ162は、「1つ」であってもよい。すなわち、通信コントローラ10は、実行すべき複数のディスクリプタを、望ましい順序で1つずつ実行するので、通信コントローラ10は、送信データを一時的に保持しておくためのバッファ162を、「1つ」備えていればよい。ただし、バッファ162を「2つ」以上備えることにより、通信コントローラ10は、或るディスクリプタを実行後に、それよりも優先度Pの高い別のディスクリプタを実行した場合に、その別のディスクリプタに対応するデータを優先して送信することができる。通信コントローラ10がバッファ162を「2つ」以上備える構成について、詳細は後述する。
【0062】
また、
図1に例示するように、通信コントローラ10は、実行すべき複数のディスクリプタを、望ましい順序で1つずつ実行することができるので、メインメモリ20とバッファ162との間のデータ交換を実現するDMAC12を、「1つ」備えていればよい。
【0063】
したがって、通信コントローラ10は、「DMACおよび送信BUFを含む、送信キュー」を複数備える必要がないため、実装サイズを小さくすることができる。特に、「送信データの、送信順序および実送信時刻RTT」の管理を行うべき通信ネットワーク(ネットワーク3)の数が増えても、通信コントローラ10は、実装サイズの拡大を抑制することができる。
【0064】
詳細は
図1を用いて後述するが、通信コントローラ10は、「1つ」の送信ポート18、「1つ」のDMAC12を備えている。そして、通信コントローラ10は、「1つ」の送信ポート18、「1つ」のDMAC12に対して、「送信データの、送信順序および実送信時刻RTT」の管理を行う送信キューを複数備えている。具体的には、通信コントローラ10は、ディスクリプタメモリ14およびリクエスタ15の各々を、複数備え、また、実行すべき複数のディスクリプタを、望ましい順序で1つずつ実行するためのディスクリプタ実行管理部13を「1つ」備えている。通信コントローラ10は、複数のディスクリプタメモリ14と、複数のリクエスタ15と、ディスクリプタ実行管理部13とによって、「送信データの、送信順序および実送信時刻RTT」の管理を行う送信キューを複数備えているのと同様の効果を実現する。したがって、通信コントローラ10は、実装サイズを抑制しつつ、送信キューを複数備えているのと同様に、「送信データの、送信順序および実送信時刻RTT」を管理することができる。
【0065】
例えば、通信コントローラ10は、FPGA(Field-Programmable gate array)またはASIC(Application Specific Integrated Circuit)等のハードウェアによる論理回路で構成される。その場合、ソフトウェア(つまり、CPU30)は、通信コントローラ10を、「送信データの、送信順序および実送信時刻RTT」を管理する送信キューを複数備えたハードウェアとして取り扱うことができる。したがって、通信コントローラ10をハードウェアによる論理回路で構成することにより、「送信データの、送信順序および実送信時刻RTT」の管理を行う通信コントローラ10は、ソフトウェア(つまり、CPU30)の処理負荷を低減することができる。
【0066】
したがって、通信コントローラ10は以下のように整理することができる。すなわち、通信コントローラ10(通信制御機器)は、読み込んだ送信ディスクリプタに従ってメインメモリ20からバッファ162(送信バッファ)へとデータ(送信データ)を転送し、バッファ162に転送されたデータを送信する通信制御機器である。
【0067】
通信コントローラ10は、選択部131および読込部132を備えている。選択部131は、複数の送信ディスクリプタの各々において規定されている、「送信時刻TT(送信予定時刻)」および「優先度P(実行優先度)」の少なくとも一方に基づいて、複数の送信ディスクリプタの中から、読み込む送信ディスクリプタを選択する。すなわち、選択部131は、複数の送信ディスクリプタの各々において規定されている、「送信時刻TTおよび優先度Pの少なくとも一方」に基づいて、複数の送信ディスクリプタの中から、実行する送信ディスクリプタを選択する。また、読込部132は、選択部131によって選択された送信ディスクリプタを読み込み、つまり、選択部131によって選択された送信ディスクリプタを実行する。
【0068】
前記の構成によれば、通信コントローラ10は、複数の送信ディスクリプタの各々において規定されている、送信時刻TTおよび優先度Pの少なくとも一方に基づいて、複数の送信ディスクリプタの中から、読み込むディスクリプタを選択する。そして、通信コントローラ10は、選択した送信ディスクリプタを読み込み、読み込んだ送信ディスクリプタに従って、メインメモリ20からバッファ162へと送信データを転送する。つまり、通信コントローラ10は、複数の送信ディスクリプタの中から、読み込むべきディスクリプタを、複数の送信ディスクリプタの各々の送信時刻TTおよび優先度Pの少なくとも一方に基づいて、1つずつ選択する。
【0069】
そのため、通信コントローラ10は、各々がDMACおよび送信バッファを含む、複数の送信キューを備える必要がなく、実装サイズを小さくすることができる。
【0070】
また、通信コントローラ10は、複数の送信ディスクリプタの読込順序を制御することによって、ソフトウェア(プロセッサ、つまり、CPU30)による処理結果の出力等を、具体的には、「送信データの、送信順序および実送信時刻RTT」を制御する。つまり、ソフトウェアは、通信コントローラ10を、「送信データの、送信順序および実送信時刻RTT」の管理を行う送信キューを複数備えた、1つのハードウェアとして扱うことができる。そのため、通信コントローラ10は、処理結果の出力制御(例えば、「送信データの、送信順序および実送信時刻RTT」の管理)等に係るソフトウェアの処理負荷を低減することができる。
【0071】
したがって、通信コントローラ10は、実装サイズを抑制しつつ、ソフトウェアの処理負荷を低減することができるとの効果を奏する。
【0072】
通信コントローラ10において、バッファ162は、通常送信バッファと特別送信バッファとに大別される。通常送信バッファには、読込部132が読み込んだ送信ディスクリプタの順に、送信ディスクリプタに対応するデータが格納される。特別送信バッファには、「以下の2つの条件を共に満たすディスクリプタ」に対応するデータが格納される。条件1は、「『通常送信バッファに格納されているデータに対応する送信ディスクリプタを選択部131が選択してから、そのデータが送信されるまで』の間に、読込部132が読み込んだディスクリプタであること」である。条件2は、「通常送信バッファに格納されているデータに対応する送信ディスクリプタよりも、優先度Pが高い」である。
【0073】
第一バッファ162(0)、第二バッファ162(1)、・・・、第nバッファ162(n-1)のうち、少なくとも1つを特別送信バッファとし、それ以外のバッファ162を、通常送信バッファとしてもよい。
【0074】
前記の構成によれば、通信コントローラ10は、前記通常送信バッファと前記特別送信バッファとを含むバッファ162を備えている。そして、通信コントローラ10は、通常は、読み込んだ送信ディスクリプタの順に、読み込んだ送信ディスクリプタに対応するデータを、前記通常送信バッファに格納する。
【0075】
通信コントローラ10は、「前記通常送信バッファに格納されているデータに対応する送信ディスクリプタを選択してから、前記通常送信バッファに格納されているデータを送信するまで」の間に新たなディスクリプタを読み込むと、以下の判定を実行する。すなわち、通信コントローラ10は、その新たなディスクリプタの優先度Pが、前記通常送信バッファに格納されているデータに対応する送信ディスクリプタの優先度Pよりも高いかを判定する。
【0076】
そして、その新たなディスクリプタの優先度Pの方が高い場合、通信コントローラ10は、その新たなディスクリプタに対応するデータを、前記特別送信バッファに格納する。これに対して、その新たなディスクリプタの優先度Pの方が低い、または、両者の優先度Pが同じ場合、通信コントローラ10は、その新たなディスクリプタに対応するデータを、前記普通送信バッファに格納する。
【0077】
ここで、選択部131が或る送信ディスクリプタを選択してから、その或る送信ディスクリプタに対応するデータが送信されるまでの間に、その或る送信ディスクリプタより優先度Pが高い別のディスクリプタを読込部132が読み込む可能性がある。そのような場合、送信バッファが1つしかなかったとしたら、その別のディスクリプタに対応するデータは、1つしかない送信バッファに、その或る送信ディスクリプタに対応するデータよりも後に格納されざるを得ない。その結果、その別のディスクリプタに対応するデータを、その或る送信ディスクリプタに対応するデータよりも先に送信することは不可能となる。
【0078】
これに対して、通信コントローラ10は、前記通常送信バッファと前記特別送信バッファとを含むバッファ162を備えている。そして、通信コントローラ10は、上述の通り、前記通常送信バッファに格納されているデータよりも優先して送信すべきデータが新たに発生すると、そのようなデータを前記特別送信バッファに格納する。
【0079】
したがって、通信コントローラ10は、或る送信ディスクリプタの選択後、その或る送信ディスクリプタに対応するデータを送信するまでに発生した、その或る送信ディスクリプタに対応するデータより優先送信すべきデータを、優先送信できるとの効果を奏する。
【0080】
§2.構成例
これまでに概要を説明してきた通信コントローラ10、および、通信コントローラ10を含むPLC1について、次に、
図1を用いてその詳細を説明していく。
【0081】
図1は、PLC1の構成例を示す図である。
図1に例示する通り、PLC1は、ハードウェア構成として、通信コントローラ10と、メインメモリ20と、CPU30とを含む。PLC1は、さらに、不図示の不揮発性メモリ、および、外部装置とPLC1とを接続するためのUSBコネクタなどを含んでもよい。通信コントローラ10と、メインメモリ20と、CPU30と、不揮発性メモリとの間は、各種のバス(内部バス)を介してそれぞれ結合されている。
【0082】
CPU30は、典型的には、汎用的なコンピュータアーキテクチャに準じて構成され、内部クロックに従って順次命令コードを解釈して実行する。CPU30は、ハードウェア構成としては、1つ以上のCPUコアと、ネットワーク制御部とを含んでいる。
CPU30は、各種の演算処理を実行し、実行結果として生成したデータを、送信データとしてメインメモリ20に格納する。また、CPU30は、送信データとしてメインメモリ20に格納したデータについて、その送信データの優先度P、送信時刻TT、メインメモリ20中のアドレス、データサイズ等を規定したディスクリプタデータを、メインメモリ20に格納する。送信データの優先度P、送信時刻TT、メインメモリ20中のアドレス、データサイズ等を規定したディスクリプタデータは、「送信ディスクリプタ」、または、単に「ディスクリプタ」と略記することがある。
【0083】
送信データの「送信時刻TT」は、CPU30によって付与され、通信コントローラ10がその送信データをネットワーク3へと送信する時刻を示しており、つまり、その送信データがネットワーク3へと送信されるべき、送信予定時刻を示している。また、送信データの「優先度P」は、CPU30によって付与され、「その送信データを『送信時刻TT』に送信する」必要性の高さを示し、例えば、「その送信データを、送信周期を維持して、ネットワーク3へと周期的に送信する」必要性の高さを示している。
【0084】
ここで、一般的に、PLC1などの産業用コントローラとデバイス(例えば、
図2の「ネットワークデバイス」)とは、一定周期でデータ交換を実行する。制御システム0においては、1つ以上のネットワークデバイスを含むユニット群について、1つ以上のデータ交換周期、および、そのユニット群の通信優先度CPが設定されていてもよい。
【0085】
そして、通信優先度CPと優先度Pとは対応付けられていてもよい。また、或るユニット群(例、ユニット群U1)の通信優先度CPが、別のユニット群(例、ユニット群U2)の通信優先度CPよりも高いことは、その或るユニット群の通信周期を維持する必要が、その別のユニット群より高いことを意味してもよい。さらに、或るユニット群(例、ユニット群U1)の通信優先度CPが、別のユニット群(例、ユニット群U2)の通信優先度CPよりも高いことは、その或るユニット群の通信周期が、その別のユニット群の通信周期よりも早い(短い)ことを意味してもよい。
【0086】
例えば、「PLC1(特に、通信コントローラ10)が或るネットワークデバイスとの間で実行する周期的な通信」は、「PLC1が別のネットワークデバイスとの間で実行する周期的な通信」よりも、通信周期を維持する必要が高いことがある。そのような場合には、「その或るネットワークデバイスとの間で実行する周期的な通信」の通信優先度CPは、「その別のネットワークデバイスとの間で実行する周期的な通信」の通信優先度CPよりも高い。
【0087】
また、「PLC1(特に、通信コントローラ10)が或るネットワークデバイスとの間で実行する周期的な通信」は、「PLC1が別のネットワークデバイスとの間で実行する周期的な通信」よりも、通信周期が短い(早い)ことがある。そのような場合には、「その或るネットワークデバイスとの間で実行する周期的な通信」の通信優先度CPは、「その別のネットワークデバイスとの間で実行する周期的な通信」の通信優先度CPよりも高い。
【0088】
そして、「或るネットワークデバイスとの間で実行する周期的な通信」の通信優先度CPが「別のネットワークデバイスとの間で実行する周期的な通信」の通信優先度CPより高い場合、CPU30は、送信データに対し、以下のように優先度Pを付与する。すなわち、CPU30は、「その或るネットワークデバイスを宛先とする送信データ」には、「その別のネットワークデバイスを宛先とする送信データ」に付与する優先度Pよりも高い優先度Pを付与する。
【0089】
メインメモリ20は、PLC1の記憶手段であり、例えば、PLC1(特に、通信コントローラ10)がネットワーク3へと送信するデータ(送信データ)が格納される。メインメモリ20は、揮発性の記憶領域(RAM)であり、「CPU30による各種の演算処理によって生成され、ネットワーク3へと送信される」送信データの格納に加えて、PLC1へ電源投入後にCPU30で実行されるべき各種プログラムを保持する。また、メインメモリ20は、CPU30による各種プログラムの実行時の作業用メモリとしても使用される。このようなメインメモリ20として、例えば、DRAM(Dynamic Random Access Memory)、SRAM(Static Random Access Memory)等を用いることができる。
【0090】
図1に例示するメインメモリ20には、送信データと共に、送信データに対応するディスクリプタデータ(送信ディスクリプタ)が格納されている。送信ディスクリプタは、対応する送信データの送信時刻TT、優先度P、および、データサイズ等を示す情報を含んでいる。
【0091】
PLC1は、各種のプログラムおよびパラメータなどのデータを不揮発的に保持する不揮発性メモリを備えていてもよい。不揮発性メモリに格納されるこれらのデータは、必要に応じて、CPU30がアクセスできるようにメインメモリ20にコピーされる。このような不揮発性メモリは、フラッシュメモリのような半導体メモリを用いることができる。あるいは、ハードディスクドライブのような磁気記録媒体、DVD-RAM(Digital Versatile Disk Random Access Memory)のような光学記録媒体などを用いることもできる。
【0092】
通信コントローラ10は、メインメモリ20に格納されているデータ(送信データ)をネットワーク3へと送信する通信制御機器であり、例えば、NIC(Network Interface Card、ネットワーク・インターフェイス・カード)として実現される。通信コントローラ10は、典型的には、FPGA(Field-Programmable gate array)またはASIC(Application Specific Integrated Circuit)等のハードウェアによる論理回路で構成される。通信コントローラ10は、メインメモリ20およびCPU30の各々と、データの送受信が可能に構成されている。
【0093】
通信コントローラ10は、送信ポート18を介してネットワーク3と接続され、ネットワーク3とのデータの遣り取りを制御し、特に、送信データの送信を制御し、例えば、「送信データの、送信順序および実送信時刻RTT」を制御する。通信コントローラ10は、例えば、ネットワーク3における物理層およびデータリンク層の機能を提供する。すなわち、通信コントローラ10は、ネットワーク3の準拠する規格に従い、送信データの送信および受信データの受信を制御する。具体的には、通信コントローラ10は、メインメモリ20に格納されているデータ(送信データ)を自装置内のバッファ162へと転送し、バッファ162に格納した送信データを、ネットワーク3に接続されているネットワークデバイスへと送信する。
【0094】
通信コントローラ10は、送信ディスクリプタに規定されている内容に従って送信データを送信し、例えば、送信ディスクリプタに規定されている送信時刻TTに、その送信ディスクリプタに対応する送信データを送信する。通信コントローラ10が、送信データを、その送信データについて設定されている送信時刻TT(つまり、その送信データに対応する送信ディスクリプタで規定されている送信時刻TT)で送信することを「時刻送信」とも称する。
【0095】
ここで、通信コントローラ10は、複数の送信データの送信順序を、それら複数の送信データをバッファ162に格納する順序によって制御し、具体的には、それら複数の送信データに対応する複数のディスクリプタの読込順序(実行順序)を制御する。特に、通信コントローラ10は、複数の送信ディスクリプタの各々において規定されている、送信時刻TTおよび優先度Pの少なくとも一方に基づいて、優先的に読み込む送信ディスクリプタを選択する。
【0096】
詳細は後述するが、PLC1は、CPU30ではなく、ハードウェアによる論理回路で構成した通信コントローラ10によって、メインメモリ20に格納されているデータ(送信データ)の、ネットワーク3への送信順序および実送信時刻RTTを制御する。したがって、PLC1は、CPU30の処理負荷を増大させることなく、ハードウェアによる論理回路で構成した通信コントローラ10によって、送信データの、ネットワーク3への送信順序および実送信時刻RTTを制御することができるとの効果を奏する。
【0097】
図1に例示する通信コントローラ10は、機能ブロックとして、IF11、DMAC12、ディスクリプタ実行管理部13、2つ以上のディスクリプタメモリ14、2つ以上のリクエスタ15、BUF管理部16、調停部17、および、送信ポート18を備える。
【0098】
IF11は、通信コントローラ10(特に、DMAC12)が、メインメモリ20およびCPU30の各々と通信するためのインターフェースである。
【0099】
DMAC12は、メインメモリ20と、ディスクリプタメモリ14およびバッファ162の各々との間のデータ交換を実行する。例えば、DMAC12は、CPU30によってメインメモリ20に設定されたディスクリプタデータ(送信ディスクリプタ)を読み出して、ディスクリプタメモリ14に格納する。
【0100】
また、DMAC12は、送信ディスクリプタに規定されている内容に従って、メインメモリ20からバッファ162へと送信データを転送し、つまり、メインメモリ20に格納されているデータを取得して、取得したデータをバッファ162に格納する。例えば、DMAC12は、送信ディスクリプタに規定されている、「メインメモリ20のアドレス」および「送信データのデータサイズ」によって特定される送信データを、メインメモリ20から取得する。DMAC12は、送信ディスクリプタに対応する送信データを、その送信ディスクリプタに規定されている「送信時刻TT」と共に、バッファ162へと転送する。
【0101】
DMAC12は、「ディスクリプタメモリ14に格納されている送信ディスクリプタであって、ディスクリプタ実行管理部13によって読み出された(実行された)送信ディスクリプタ」に従って、メインメモリ20からバッファ162へと送信データを転送する。
【0102】
ディスクリプタ実行管理部13は、CPU30からの送信要求があると、その送信要求に従って、メインメモリ20からバッファ162へと送信データを転送する。具体的には、ディスクリプタ実行管理部13は、リクエスタ15から「実行すべき(読み込むべき)送信ディスクリプタがある」ことを通知されると、ディスクリプタメモリ14を参照して、送信ディスクリプタを読み込む(実行する)。そして、ディスクリプタ実行管理部13は、読み込んだ送信ディスクリプタに規定されている内容をDMAC12に設定し、読み込んだ送信ディスクリプタに従って、DMAC12に、送信データをメインメモリ20からバッファ162へと転送させる。ディスクリプタ実行管理部13は、選択部131および読込部132を含んでいる。
【0103】
選択部131は、リクエスタ15から「実行すべき(読み込むべき)送信ディスクリプタがある」旨を通知されると、そのリクエスタ15に対応するディスクリプタメモリ14を参照し、ディスクリプタメモリ14に格納されている送信ディスクリプタを取得する。例えば、選択部131は、第一リクエスタ15(0)から「読み込むべき送信ディスクリプタがある」ことを通知されると、第一リクエスタ15(0)に対応する第一ディスクリプタメモリ14(0)に格納されている送信ディスクリプタを取得する。同様に、選択部131は、第nリクエスタ15(n-1)から「読み込むべき送信ディスクリプタがある」ことを通知されると、第nリクエスタ15(n-1)に対応する第nディスクリプタメモリ14(n-1)に格納されている送信ディスクリプタを取得する。
【0104】
選択部131は、リクエスタ15からの「読み込むべき送信ディスクリプタがある」旨の通知に応じて、そのリクエスタ15に対応するディスクリプタメモリ14から送信ディスクリプタを取得し、取得した送信ディスクリプタを読込部132に通知する。
【0105】
選択部131は、複数のリクエスタ15の各々から略同時に「読み込むべき送信ディスクリプタがある」ことを通知されると、読み込む(実行する)送信ディスクリプタの順序を決定し、つまり、優先的に読み込む送信ディスクリプタを1つずつ選択する。そして、選択部131は、選択した送信ディスクリプタを読込部132に通知する。
【0106】
具体的には、選択部131は、複数のリクエスタ15の各々から略同時に「読み込むべき送信ディスクリプタがある」ことを通知されると、複数のリクエスタ15の各々に対応するディスクリプタメモリ14を参照する。そして、選択部131は、「各々が、複数のリクエスタ15の各々に対応する」複数のディスクリプタメモリ14の各々に格納されている送信ディスクリプタを取得する。
【0107】
選択部131は、「各々が、複数のディスクリプタメモリ14の各々に格納されている」複数の送信ディスクリプタの各々の、「送信時刻TTおよび優先度Pの少なくとも一方」を取得する。そして、選択部131は、複数の送信ディスクリプタの各々の「送信時刻TTおよび優先度Pの少なくとも一方」に基づいて、それら複数の送信ディスクリプタの読込順序を決定し、つまり、それら複数の送信ディスクリプタの実行順序を決定する。具体的には、選択部131は、複数の送信ディスクリプタの各々の「送信時刻TTおよび優先度Pの少なくとも一方」に基づいて、それら複数の送信ディスクリプタの中から、優先的に(つまり、より早く)読み込む送信ディスクリプタを1つずつ選択する。
【0108】
例えば、選択部131は、第一リクエスタ15(0)および第二リクエスタ15(1)の各々から、略同時に、「読み込むべき送信ディスクリプタがある」ことを通知されると、以下の処理を実行する。すなわち、選択部131は、第一リクエスタ15(0)に対応する第一ディスクリプタメモリ14(0)を参照して、第一ディスクリプタメモリ14(0)に格納されている送信ディスクリプタ(例えば、ディスクリプタA)を取得する。同様に、選択部131は、第二リクエスタ15(1)に対応する第二ディスクリプタメモリ14(1)を参照して、第二ディスクリプタメモリ14(1)に格納されている送信ディスクリプタ(例えば、ディスクリプタB)を取得する。
【0109】
選択部131は、ディスクリプタAおよびディスクリプタBの各々の「送信時刻TTおよび優先度Pの少なくとも一方」を取得する。そして、選択部131は、ディスクリプタAおよびディスクリプタBの各々の「送信時刻TTおよび優先度Pの少なくとも一方」に基づいて、ディスクリプタAおよびディスクリプタBの読込順序を決定する。
【0110】
具体的には、選択部131は、ディスクリプタAおよびディスクリプタBの各々の「送信時刻TTおよび優先度Pの少なくとも一方」に基づいて、ディスクリプタAおよびディスクリプタBのうち、先に読み込む送信ディスクリプタを選択する。そして、選択部131は、選択した送信ディスクリプタを読込部132に通知する。選択部131は、ディスクリプタAおよびディスクリプタBのうち、先に読み込む送信ディスクリプタとしてディスクリプタAを選択すると、ディスクリプタAを読込部132に通知する。また、選択部131は、ディスクリプタAおよびディスクリプタBのうち、先に読み込む送信ディスクリプタとしてディスクリプタBを選択すると、ディスクリプタBを読込部132に通知する。
【0111】
読込部132は、選択部131から送信ディスクリプタを通知されると、通知された送信ディスクリプタを読み込み、つまり、選択部131から通知された送信ディスクリプタを実行する。読込部132は、読み込んだ送信ディスクリプタに規定されている内容をDMAC12に設定し、つまり、読み込んだ送信ディスクリプタに規定されている内容をDMAC12に通知する。そして、読込部132は、DMAC12に、読み込んだ送信ディスクリプタに規定されている内容に従った転送処理を実行させ、つまり、DMAC12に、読み込んだ送信ディスクリプタに従って送信データをメインメモリ20からバッファ162へと転送させる。
【0112】
ディスクリプタメモリ14には、送信ディスクリプタ(ディスクリプタデータ)が、FIFO(first in, first out、先入れ先出し)方式で格納される。CPU30が、ディスクリプタデータのメインメモリ20への設定(格納)を完了して、通信コントローラ10に送信要求を発行すると、通信コントローラ10は、メインメモリ20からディスクリプタデータを読み出してディスクリプタメモリ14に格納する。
【0113】
リクエスタ15は、要求レジスタを含んでおり、対応するディスクリプタメモリ14に送信ディスクリプタが格納されると、リクエスタ15の要求レジスタには「1」が格納される。要求レジスタに「1」が格納されている間、リクエスタ15は、ディスクリプタ実行管理部13(特に、選択部131)に、「実行すべき(読み込むべき)送信ディスクリプタがある」ことを通知し続ける。
【0114】
また、対応するディスクリプタメモリ14に格納されている送信ディスクリプタが読み込まれ、その送信ディスクリプタに対応するデータのバッファ162への転送が完了すると、リクエスタ15の要求レジスタには「0」が格納される。要求レジスタに「0」が格納されている間、リクエスタ15は、ディスクリプタ実行管理部13(特に、選択部131)に、「実行すべき送信ディスクリプタがない」ことを通知し、または、「実行すべき送信ディスクリプタがある」ことを通知しない。
【0115】
例えば、ディスクリプタAが第一ディスクリプタメモリ14(0)に格納されると、第一ディスクリプタメモリ14(0)に対応する第一リクエスタ15(0)の要求レジスタには「1」が格納される。そして、ディスクリプタAが読み込まれ、ディスクリプタAに対応するデータのバッファ162への転送が完了すると、第一ディスクリプタメモリ14(0)の要求レジスタには「0」が格納される。
【0116】
同様に、ディスクリプタBが第二ディスクリプタメモリ14(1)に格納されると、第二ディスクリプタメモリ14(1)に対応する第二リクエスタ15(1)の要求レジスタには「1」が格納される。そして、ディスクリプタBが読み込まれ、ディスクリプタBに対応するデータのバッファ162への転送が完了すると、第二ディスクリプタメモリ14(1)の要求レジスタには「0」が格納される。
【0117】
リクエスタ15はさらに、設定レジスタ151を含んでいる。設定レジスタ151には、CPU30から通信コントローラ10へと通知される、「実行個数」および「実行番号」が格納される。「実行個数」および「実行番号」について、詳細は後述する。
【0118】
BUF管理部16は、送信データの送信順序および実送信時刻RTTを制御し、具体的には、送信データを、その送信データについて設定されている送信時刻TTに、ネットワーク3へと送信し、または、送信しようとする。BUF管理部16は、時刻指定送信管理部161およびバッファ162を含んでいる。
【0119】
時刻指定送信管理部161は、バッファ162に格納されている送信データを、その送信データについて設定されている送信時刻TTで送信し、つまり、その送信データに対応する送信ディスクリプタで規定されている送信時刻TTで送信する。具体的には、時刻指定送信管理部161は、データ(送信データ)がバッファ162に格納されていると、その送信データに対応する送信ディスクリプタで規定されている送信時刻TTを確認する。そして、時刻指定送信管理部161は、現在時刻CTが確認した送信時刻TTになると、送信リクエストを調停部17に出力する。時刻指定送信管理部161は、送信リクエストを受け付けた調停部17からのレスポンスとして、アクセス許可があると、その送信データをネットワーク3に送信する。
【0120】
バッファ162は、メインメモリ20に格納されているデータ(送信データ)をネットワーク3へと送信するために、送信データ(受信データ)を一時的に保持しておく。バッファ162には、ネットワーク3へと送信される送信データが、DMAC12によってFIFO(first in, first out、先入れ先出し)方式で格納される。
【0121】
調停部17は、ネットワーク3への複数の送信リクエストを調整し、つまり、複数のバッファ162の各々に格納されている送信データの送信時刻TTが略同時となった場合に、いずれの送信データの時刻送信を優先すべきかを決定する。
言い換えれば、調停部17は、複数のバッファ162の各々に格納されている送信データに係る送信リクエストを略同時に受け付けると、アクセス許可を与える送信リクエストを選択する。
【0122】
ここで、バッファ162が、通常送信バッファと特別送信バッファとに大別され、通常送信バッファおよび特別送信バッファの各々に格納されている送信データに係る送信リクエストを略同時に受け付けると、調停部17は、以下の処理を実行する。すなわち、調停部17は、特別送信バッファに格納されている送信データに係る送信リクエストを、通常送信バッファに格納されている送信データに係る送信リクエストよりも優先する。つまり、調停部17は、特別送信バッファに格納されている送信データに係る送信リクエストにアクセス許可を与える。
【0123】
§3.動作例
(通信コントローラによって実行される処理の全体概要)
図3は、通信コントローラ10の実行する処理の概要を説明するフロー図である。
図3に示すように、先ず、ディスクリプタ実行管理部13(特に、選択部131)は、複数のディスクリプタの各々において規定されている、送信時刻TTおよび優先度Pの少なくとも一方を取得する(S10)。そして、選択部131は、取得した「複数のディスクリプタの各々の、送信時刻TTおよび優先度Pの少なくとも一方」に基づいて、複数のディスクリプタの中から、読み込むディスクリプタを選択する(S20)。選択部131は、読み込むディスクリプタを選択すると、選択したディスクリプタを、読込部132に通知する。
【0124】
読込部132は、選択部131によって選択されたディスクリプタを読み込む(S30)。読込部132は、読み込んだディスクリプタに規定されているアドレス(メインメモリ20における格納先アドレス)、送信データのデータサイズ等を、DMAC12に設定する(S40)。
【0125】
DMAC12は、S40において設定された内容に従って、メインメモリ20に格納されている送信データをバッファ162へと転送する(すなわち、送信データをバッファ162に格納する)(S50)。そして、BUF管理部16は、バッファ162に格納されている送信データを送信する(S60)。
【0126】
これまで
図3を用いて説明してきた通信コントローラ10の実行する処理は、以下のように整理することができる。すなわち、通信コントローラ10の実行する処理(制御方法)は、読み込んだ送信ディスクリプタに従ってメインメモリ20からバッファ162へとデータ(送信データ)を転送し、バッファ162に転送されたデータを送信する通信制御機器の制御方法である。
【0127】
通信コントローラ10の実行する制御方法は、選択ステップ(S20)と、読込ステップ(S30)と、を含んでいる。選択ステップは、複数の送信ディスクリプタの各々において規定されている、「送信時刻TT」および「優先度P」の少なくとも一方に基づいて、複数の送信ディスクリプタの中から、読み込むディスクリプタを選択する処理である。すなわち、選択ステップは、複数の送信ディスクリプタの各々において規定されている、「送信時刻TTおよび優先度Pの少なくとも一方」に基づいて、複数の送信ディスクリプタの中から、実行する送信ディスクリプタを選択する処理である。また、読込ステップは、選択ステップにて選択された送信ディスクリプタを読み込む処理であり、つまり、選択ステップにて選択された送信ディスクリプタを実行する処理である。
【0128】
前記の構成によれば、通信コントローラ10の実行する制御方法は、複数の送信ディスクリプタの各々において規定されている、送信時刻TTおよび優先度Pの少なくとも一方に基づいて、複数の送信ディスクリプタの中から、読み込むディスクリプタを選択する。そして、通信コントローラ10の実行する制御方法は、選択した送信ディスクリプタを読み込み、読み込んだ送信ディスクリプタに従って、メインメモリ20からバッファ162へと送信データを転送する。つまり、通信コントローラ10の実行する制御方法は、複数の送信ディスクリプタの中から、読み込むべきディスクリプタを、複数の送信ディスクリプタの各々の送信時刻TTおよび優先度Pの少なくとも一方に基づいて、1つずつ選択する。
【0129】
そのため、前記制御方法を実行する通信コントローラ10は、各々がDMACおよび送信バッファを含む、複数の送信キューを備える必要がなく、通信コントローラ10の実装サイズを小さくすることができる。
【0130】
また、前記制御方法(つまり、通信コントローラ10の実行する制御方法)は、複数の送信ディスクリプタの読込順序を制御することによって、ソフトウェア(プロセッサ)による処理結果の出力等を、具体的には、前記データの送信順序を制御する。つまり、ソフトウェアは、前記制御方法を実行する通信コントローラ10を、「送信データの、送信順序および実送信時刻RTT」の管理を行う送信キューを複数備えた、1つのハードウェアとして扱うことができる。そのため、前記制御方法は、処理結果の出力制御(例えば、「送信データの、送信順序および実送信時刻RTT」の管理)等に係るソフトウェアの処理負荷を低減することができる。
【0131】
したがって、通信コントローラ10の実行する制御方法は、通信コントローラ10の実装サイズを抑制しつつ、ソフトウェアの処理負荷を低減することができるとの効果を奏する。
【0132】
上述の通り、通信コントローラ10は、送信時刻TTおよび優先度Pの少なくとも一方を用いて、読み込むべきディスクリプタ(つまり、実行すべきディスクリプタ)を選択し、つまり、複数のディスクリプタの読込順序(実行順序)を制御する。したがって、通信コントローラ10は、実装サイズを抑制しつつ、ソフトウェア(つまり、CPU30)の処理負荷を、特に、「送信データの、送信順序および実送信時刻RTT」の管理に係る処理負荷を、低減することができる。
【0133】
ここで、通信コントローラ10の開発者はさらに、以下のケース1、ケース2、および、ケース3を想定して、通信コントローラ10がこれら3つのケースに直面した場合にも、読み込むべきディスクリプタを好適に選択できるように工夫した。以下、詳細を説明する。
【0134】
(ケース1において、優先度のみでディスクリプタを選択した場合について)
図4は、ケース1において、ディスクリプタ中の優先度Pのみに基づいて、先に実行すべき(つまり、先に読み込むべき)ディスクリプタを選択した場合に発生する状況を説明する図である。ケース1では、低い優先度Pが設定されているディスクリプタの規定する送信時刻TT(低優先)が、高い優先度Pが設定されているディスクリプタの規定する送信時刻TT(高優先)より早く、かつ、両者の送信時刻TTの間の時間間隔が大きい。以下では、低い優先度Pが設定されているディスクリプタを「低優先ディスクリプタ」と称し、また、高い優先度Pが設定されているディスクリプタを「高優先ディスクリプタ」と称することがある。
図4において、通信コントローラ10は、「NIC(Network Interface Card、ネットワーク・インターフェイス・カード)」と略記されている。
【0135】
図4に例示するケース1において、TX0、つまり、第一ディスクリプタメモリ14(0)には、送信データD(0)の送信時刻TT(0)として「9:05」を規定し、送信データD(0)の優先度Pとして「1」を規定したディスクリプタが格納されている。また、TX1、つまり、第二ディスクリプタメモリ14(1)には、送信データD(1)の送信時刻TT(1)として「9:00」を規定し、送信データD(1)の優先度Pとして「2」を規定したディスクリプタが格納されている。
【0136】
つまり、ケース1において、TX0には高優先ディスクリプタが格納され、TX1には低優先ディスクリプタが格納されている。TX0に格納されている高優先ディスクリプタが規定する、送信データD(0)の「送信時刻TT(0)」は「9:05」であり、TX1に格納されている低優先ディスクリプタが規定する、送信データD(1)の「送信時刻TT(1)」は「9:00」である。低優先ディスクリプタの規定する送信時刻TT(1):「9:00」は、高優先ディスクリプタの規定する送信時刻TT(0):「9:05」より早い。また、送信データD(1)の送信時刻TT(1):「9:00」と、送信データD(0)の送信時刻TT(0):「9:05」との間の時間間隔は「5」であり、両者の送信時刻TTの間の時間間隔は大きい。つまり、低優先ディスクリプタの規定する送信時刻TT(低優先)が、高優先ディスクリプタの規定する送信時刻TT(高優先)よりも早く、かつ、送信時刻TT(低優先)と送信時刻TT(高優先)との間の時間間隔が大きい。
【0137】
ケース1において、ディスクリプタの規定する「優先度P」だけで、先に実行するディスクリプトを選択した場合、TX0に格納されている高優先ディスクリプタが、TX1に格納されている低優先ディスクリプタよりも先に実行される。
【0138】
低優先ディスクリプタよりも先に高優先ディスクリプタが実行されることで、高優先ディスクリプタに対応するデータD(0)は、低優先ディスクリプタに対応するデータD(1)よりも先に、バッファ162(BUF)に格納される。
【0139】
図4に示す例では、データD(0)がBUF0、つまり、第一バッファ162(0)に格納された後に、データD(1)は、BUF1、つまり、第二バッファ162(1)に格納されている。なお、データD(0)を格納するバッファ162と、データD(1)を格納するバッファ162とを分けることは必須ではなく、両者は同じバッファ162に格納されてもよい。例えば、データD(0)とデータD(1)とは、各々に対応するディスクリプタが実行された(読み込まれた)順で、同じバッファ162に格納されてもよい。
図4では、データD(0)が、データD(1)よりも先に、バッファ162(BUF)に格納されることを理解しやすいように、データD(0)をBUF0に格納し、データD(1)をBUF1に格納する例を示したに過ぎない。
【0140】
データD(1)よりも先にデータD(0)がバッファ162に格納されることで、データD(1)のネットワーク3への送信は、データD(0)がネットワーク3へと送信された後に実行される。つまり、送信データD(0)が、その送信時刻TT(0):「9:05」にネットワーク3へと送信された後に、データD(1)のネットワーク3への送信が実行される。そのため、送信データD(1)を、その送信時刻TT(1)である「9:00」に、ネットワーク3へと送信することはできない。
【0141】
(ケース2において、送信時刻のみでディスクリプタを選択した場合について)
図5は、ケース2において、ディスクリプタ中の送信時刻TTのみに基づいて、先に実行すべき(つまり、先に読み込むべき)ディスクリプタを選択した場合に発生する状況を説明する図である。ケース2では、低優先ディスクリプタの規定する送信時刻TT(低優先)が、高優先ディスクリプタの規定する送信時刻TT(高優先)より早く、かつ、送信時刻TT(低優先)と送信時刻TT(高優先)との間の時間間隔が小さい。
図5において、通信コントローラ10は、「NIC」と略記されている。
【0142】
図5に例示するケース2において、TX0には、送信データD(0)の「送信時刻TT(0)」として「9:01」を規定し、送信データD(0)の「優先度P」として「1」を規定したディスクリプタが格納されている。また、TX1には、送信データD(1)の「送信時刻TT(1)」として「9:00」を規定し、送信データD(1)の「優先度P」として「2」を規定したディスクリプタが格納されている。
【0143】
つまり、ケース2において、TX0には高優先ディスクリプタが格納され、TX1には低優先ディスクリプタが格納されている。TX0に格納されている高優先ディスクリプタが規定する、送信データD(0)の「送信時刻TT(0)」は「9:01」であり、TX1に格納されている低優先ディスクリプタが規定する、送信データD(1)の「送信時刻TT(1)」は「9:00」である。低優先ディスクリプタの規定する送信時刻TT(0):「9:00」は、高優先ディスクリプタの規定する送信時刻TT(1):「9:01」より早い。また、送信データD(1)の送信時刻TT(1):「9:00」と送信データD(0)の送信時刻TT(0):「9:01」との間の時間間隔は「1」であり、送信時刻TT(1)と送信時刻TT(0)との間の時間間隔は小さい。つまり、低優先ディスクリプタの規定する送信時刻TT(低優先)が、高優先ディスクリプタの規定する送信時刻TT(高優先)よりも早く、かつ、送信時刻TT(低優先)と送信時刻TT(高優先)との間の時間間隔が小さい。
【0144】
ケース2において、ディスクリプタの規定する「送信時刻TT」だけで、実行するディスクリプトを選択した場合、TX1に格納されている低優先ディスクリプタが、TX0に格納されている高優先ディスクリプタよりも先に実行される。
【0145】
高優先ディスクリプタよりも先に低優先ディスクリプタが実行されることで、低優先ディスクリプタに対応するデータD(1)は、高優先ディスクリプタに対応するデータD(0)よりも先に、バッファ162(BUF)に格納される。
【0146】
図5に示す例では、データD(1)がBUF1、つまり、第二バッファ162(1)に格納された後に、データD(0)は、BUF0、つまり、第一バッファ162(0)に格納されている。なお、データD(0)を格納するバッファ162と、データD(1)を格納するバッファ162とを分けることは必須ではなく、両者は同じバッファ162に格納されてもよい。例えば、データD(0)とデータD(1)とは、各々に対応するディスクリプタが実行された(読み込まれた)順で、同じバッファ162に格納されてもよい。
図5では、データD(1)が、データD(0)よりも先に、バッファ162(BUF)に格納されることを理解しやすいように、データD(0)をBUF0に格納し、データD(1)をBUF1に格納する例を示したに過ぎない。
【0147】
データD(0)よりも先にデータD(1)がバッファ162に格納されることで、データD(0)のネットワーク3への送信は、データD(1)がネットワーク3へと送信された後に実行される。つまり、送信データD(1)が、その送信時刻TT(1):「9:00」にネットワーク3へと送信された後に、データD(0)のネットワーク3への送信が実行される。そのため、送信データD(0)を、その送信時刻TT(0)である「9:01」に、ネットワーク3へと送信することはできない。
【0148】
(ケース1およびケース2を想定した工夫)
通信コントローラ10の開発者は、上述のケース1およびケース2のいずれにおいても、通信コントローラ10が読み込むべきディスクリプタを好適に選択できるように、通信コントローラ10について、更なる工夫を施した。
【0149】
具体的には、通信コントローラ10は、「低優先ディスクリプタの規定する送信時刻TT(低優先)が、高優先ディスクリプタの規定する送信時刻TT(高優先)より早い」場合、以下の処理を実行する。すなわち、通信コントローラ10は、現在時刻CTに、高優先ディスクリプタに対応するデータ(高優先データ)の転送時間RTと、低優先ディスクリプタに対応するデータ(低優先データ)の転送時間RTとを加えた時刻(予定合計時刻ERT)を算出する。言い換えれば、通信コントローラ10は、「予定合計時刻ERT = 現在時刻CT +高優先データの転送時間RT + 低優先データの転送時間RT」を算出する。「転送時間RT」とは、或るデータ(或る送信データ)を、メインメモリ20からバッファ162へと転送するのに要する時間(期間)である。
【0150】
次に、通信コントローラ10は、算出した予定合計時刻ERTと、高優先データの送信時刻TT(高優先)とを比較する。
【0151】
ここで、予定合計時刻ERTが送信時刻TT(高優先)より大きい(遅い)場合、通信コントローラ10は、低優先データをバッファ162へ転送した後であっても、高優先データのバッファ162への転送を、送信時刻TT(高優先)に間に合わせられる。つまり、予定合計時刻ERTが送信時刻TT(高優先)より遅い場合、通信コントローラ10は、低優先データをバッファ162へ転送した後であっても、送信時刻TT(高優先)前に、高優先データをバッファ162へ転送することができる。
【0152】
したがって、予定合計時刻ERTが送信時刻TT(高優先)より遅い場合、通信コントローラ10は、低優先ディスクリプタを選択して低優先ディスクリプタを実行した(読み込んだ)後、高優先ディスクリプタを実行する(読み込む)。
【0153】
また、予定合計時刻ERTが送信時刻TT(高優先)より小さい(早い)場合、通信コントローラ10は、低優先データをバッファ162へ転送した後では、高優先データのバッファ162への転送を、送信時刻TT(高優先)に間に合わせることができない。つまり、予定合計時刻ERTが送信時刻TT(高優先)より早い場合、通信コントローラ10は、低優先データをバッファ162へ転送した後では、送信時刻TT(高優先)前に、高優先データをバッファ162へ転送することができない。
【0154】
したがって、予定合計時刻ERTが送信時刻TT(高優先)より早い場合、通信コントローラ10は、高優先ディスクリプタを選択して高優先ディスクリプタを実行した(読み込んだ)後、低優先ディスクリプタを実行する(読み込む)。
【0155】
図6は、選択部131が優先度Pと送信時刻TTとの双方を考慮して実行する選択処理(読み込むべきディスクリプタを、つまり、実行すべきディスクリプタを、選択する処理)の一例を示すフロー図である。具体的には、
図6は、選択部131の実行する、「高優先ディスクリプタと低優先ディスクリプタとのうち、どちらのディスクリプタを先に実行すべきか(先に読み込むべきか)を選択する」処理の詳細を説明するフロー図である。
【0156】
図6に示すように、先ず、選択部131は、高優先ディスクリプタの送信時刻TT(高優先)と比べて、低優先ディスクリプタの送信時刻TT(低優先)の方が早いかを判定する(S110)。「送信時刻TT(高優先)の方が、送信時刻TT(低優先)よりも早い、または、両者が同じ」場合(S110でNO)、選択部131は、高優先ディスクリプタと低優先ディスクリプタとのうち、高優先ディスクリプタを選択する(S140)。
【0157】
「送信時刻TT(低優先)の方が、送信時刻TT(高優先)よりも早い」場合(S110でYES)、選択部131は予定合計時刻ERTを算出する(S120)。前述の通り、予定合計時刻ERTは、現在時刻CTに、低優先ディスクリプタに対応するデータの転送時間RT(低優先)と、高優先ディスクリプタに対応するデータの転送時間RT(高優先)とを加えた時刻である。
【0158】
そして、選択部131は、「高優先ディスクリプタに規定されている送信時刻TT(高優先)よりも、予定合計時刻ERTが大きいか(予定合計時刻ERTが遅い)」を判定する(S130)。「送信時刻TT(高優先)よりも、予定合計時刻ERTが遅い」場合(S130でYES)、選択部131は、高優先ディスクリプタと低優先ディスクリプタとのうち、高優先ディスクリプタを選択する(S140)。
【0159】
「送信時刻TT(高優先)よりも、予定合計時刻ERTが早い、または、両者が同じ」場合(S130でNO)、選択部131は、高優先ディスクリプタと低優先ディスクリプタとのうち、低優先ディスクリプタを選択する(S140)。
【0160】
(ケース1およびケース2について、本実施形態に係る通信コントローラの選択結果)
図7は、選択部131が
図6に例示したフローを実行することにより、選択部131によって選択されるディスクリプタを説明する図である。
【0161】
前述の通り、ケース1において、TX0には、送信データD(0)の「送信時刻TT(0)」として「9:05」を規定し、送信データD(0)の「優先度P」として「1」を規定した高優先ディスクリプタが格納されている。また、TX1には、送信データD(1)の「送信時刻TT(1)」として「9:00」を規定し、送信データD(1)の「優先度P」として「2」を規定した低優先ディスクリプタが格納されている。
【0162】
ここで、高優先ディスクリプタに対応するデータ(高優先データ)の、メインメモリ20からバッファ162への転送に要する転送時間RT(高優先)は、「2」である。また、低優先ディスクリプタに対応するデータ(低優先データ)の、メインメモリ20からバッファ162への転送に要する転送時間RT(低優先)は、「2」である。そして、現在時刻CTは「08:58」である。そのため、低優先ディスクリプタを実行した後に高優先ディスクリプタを実行した場合に、高優先データの、メインメモリ20からバッファ162への転送が完了する時刻(すなわち、予定合計時刻ERT)は、「09:02」となる。
【0163】
ここで、予定合計時刻ERT「09:02」は、送信時刻TT(高優先):「9:05」よりも早い。したがって、選択部131は、高優先ディスクリプタと低優先ディスクリプタとのうち、低優先ディスクリプタ(TX1に格納されているディスクリプタ)を選択し、通信コントローラ10は、先ず、低優先ディスクリプタを実行する(読み込む)。
【0164】
前述の通り、ケース2において、TX0には、送信データD(0)の「送信時刻TT(0)」として「9:01」を規定し、送信データD(0)の「優先度P」として「1」を規定した高優先ディスクリプタが格納されている。また、TX1には、送信データD(1)の「送信時刻TT(1)」として「9:00」を規定し、送信データD(1)の「優先度P」として「2」を規定した低優先ディスクリプタが格納されている。
【0165】
ここで、高優先ディスクリプタに対応するデータ(高優先データ)の、メインメモリ20からバッファ162への転送に要する転送時間RT(高優先)は、「2」である。また、低優先ディスクリプタに対応するデータ(低優先データ)の、メインメモリ20からバッファ162への転送に要する転送時間RT(低優先)は、「2」である。そして、現在時刻CTは「08:58」である。そのため、低優先ディスクリプタを実行した後に高優先ディスクリプタを実行した場合に、高優先データの、メインメモリ20からバッファ162への転送が完了する時刻(すなわち、予定合計時刻ERT)は、「09:02」となる。
【0166】
ここで、予定合計時刻ERT「09:02」は、送信時刻TT(高優先):「9:01」よりも遅い。したがって、選択部131は、高優先ディスクリプタと低優先ディスクリプタとのうち、高優先ディスクリプタ(TX0に格納されているディスクリプタ)を選択し、通信コントローラ10は、先ず、高優先ディスクリプタを実行する(読み込む)。
【0167】
(ケース1について、優先度と送信時刻とを考慮してディスクリプタを選択した場合)
図8は、ケース1について、
図6に例示したフローを実行した場合の具体的処理例を示す図である。前述の通り、低優先ディスクリプタを実行した後に高優先ディスクリプタを実行した場合に、高優先データの、メインメモリ20からバッファ162への転送が完了する時刻(すなわち、予定合計時刻ERT)は、「09:02」となる。そして、予定合計時刻ERT「09:02」は、ケース1において高優先ディスクリプタに規定されている送信時刻TT(高優先):「9:05」よりも早い。
【0168】
したがって、選択部131は、高優先ディスクリプタと低優先ディスクリプタとのうち、低優先ディスクリプタ(TX1に格納されているディスクリプタ)を選択し、通信コントローラ10は、先ず、低優先ディスクリプタを実行する(読み込む)。
【0169】
高優先ディスクリプタよりも先に低優先ディスクリプタが実行されることで、低優先ディスクリプタに対応するデータD(1)は、高優先ディスクリプタに対応するデータD(0)よりも先に、バッファ162(BUF)に格納される。
【0170】
したがって、バッファ162に先に格納されたデータD(1)が送信された後に、データD(1)よりも後にバッファ162に格納されたデータD(0)が送信される。具体的には、通信コントローラ10(特に、時刻指定送信管理部161)は、バッファ162に先に格納されたデータD(1)を、送信データD(1)の「送信時刻TT(1)」である「9:00」に、送信する。そして、通信コントローラ10(特に、時刻指定送信管理部161)は、データD(1)の送信後、データD(1)よりも後にバッファ162に格納されたデータD(0)を、送信データD(0)の「送信時刻TT(0)」である「9:05」に、送信する。
【0171】
したがって、ケース1において、通信コントローラ10は、低優先ディスクリプタの送信時刻TT(低優先)通りに、低優先データを送信し、かつ、高優先ディスクリプタの送信時刻TT(高優先)通りに、高優先データを送信することができる。
【0172】
(ケース2について、優先度と送信時刻とを考慮してディスクリプタを選択した場合)
図9は、ケース2について、
図6に例示したフローを実行した場合の具体的処理例を示す図である。前述の通り、低優先ディスクリプタを実行した後に高優先ディスクリプタを実行した場合に、高優先データの、メインメモリ20からバッファ162への転送が完了する時刻(すなわち、予定合計時刻ERT)は、「09:02」となる。そして、予定合計時刻ERT「09:02」は、ケース2において高優先ディスクリプタに規定されている送信時刻TT(高優先):「9:01」よりも遅い。
【0173】
したがって、選択部131は、高優先ディスクリプタと低優先ディスクリプタとのうち、高優先ディスクリプタ(TX0に格納されているディスクリプタ)を選択し、通信コントローラ10は、先ず、高優先ディスクリプタを実行する(読み込む)。
【0174】
低優先ディスクリプタよりも先に高優先ディスクリプタが実行されることで、高優先ディスクリプタに対応するデータD(0)は、低優先ディスクリプタに対応するデータD(1)よりも先に、バッファ162(BUF)に格納される。
【0175】
したがって、バッファ162に先に格納されたデータD(0)が送信された後に、データD(0)よりも後にバッファ162に格納されたデータD(1)が送信される。具体的には、通信コントローラ10(特に、時刻指定送信管理部161)は、バッファ162に先に格納されたデータD(0)を、送信データD(0)の「送信時刻TT(0)」である「9:01」に、送信する。そして、通信コントローラ10(特に、時刻指定送信管理部161)は、データD(0)の送信後、データD(0)よりも後にバッファ162に格納されたデータD(1)を、できるだけ早いタイミングで、送信する。
【0176】
したがって、ケース2において、通信コントローラ10は、高優先ディスクリプタの送信時刻TT(高優先)通りに、高優先データを送信し、また、低優先データについても、できるだけ早い時間に送信することができる。
【0177】
これまで
図4から
図9を用いて説明してきた内容は、以下のように整理することができる。すなわち、通信コントローラ10について、複数の送信ディスクリプタの中の或る送信ディスクリプタの優先度Pが、別のディスクリプタの優先度Pよりも高い場合、選択部131は、以下の処理を実行する。先ず選択部131は、「現在時刻CTに、その或る送信ディスクリプタに対応するデータの転送時間RTと、その別のディスクリプタに対応するデータの転送時間RTとを加えた時刻」である予定合計時刻ERTを算出する。転送時間RTとは、データ(送信データ)をメインメモリ20からバッファ162へと転送するのに要する時間である。そして、選択部131は、算出した予定合計時刻ERTと、その或る送信ディスクリプタの送信時刻TTとを比較する。
【0178】
その或る送信ディスクリプタの送信時刻TTが、予定合計時刻ERTよりも後だと(遅いと)、選択部131は、その或る送信ディスクリプタに優先して、その別のディスクリプタを選択する。また、その或る送信ディスクリプタの送信時刻TTが、予定合計時刻ERT以前だと、選択部131は、その別のディスクリプタに優先して、その或る送信ディスクリプタを選択する。
【0179】
前記の構成によれば、通信コントローラ10は、或る送信ディスクリプタの優先度Pが、別のディスクリプタの優先度Pよりも高いと、予定合計時刻ERTと、その或る送信ディスクリプタの送信時刻TTとを比較する。そして、その或る送信ディスクリプタの送信時刻TTが、予定合計時刻ERTよりも後だと(遅いと)、通信コントローラ10は、その或る送信ディスクリプタに優先して、その別のディスクリプタを選択する。また、その或る送信ディスクリプタの送信時刻TTが、予定合計時刻ERT以前だと、通信コントローラ10は、その別のディスクリプタに優先して、その或る送信ディスクリプタを選択する。
【0180】
ここで、複数の送信ディスクリプタの各々において規定されている優先度Pのみに基づいて読み込むべきディスクリプタを選択した場合、優先度Pが低いディスクリプタは、常に、優先度Pが高いディスクリプタよりも後に読み込まれる(実行される)ことになる。
【0181】
しかし、或る送信ディスクリプタより優先度Pが低い別のディスクリプタの送信時刻TTが、その或る送信ディスクリプタの送信時刻TTよりも十分に早い場合、優先度Pのみに従ってディスクリプタの読込順序を決定することは、必ずしも適切ではない。
【0182】
例えば、その別のディスクリプタに対応する送信データをメインメモリに転送した後であっても、その或る送信ディスクリプタに対応する送信データを、その或る送信ディスクリプタの送信時刻TTよりも前に、メインメモリ20へと転送できる場合がある。そのような場合、その別のディスクリプタを読み込んだ(実行した)後に、その或るディスクリプタを読み込めばよく、つまり、その別のディスクリプタを、その或る送信ディスクリプタよりも先に読み込むべきである。
【0183】
また、複数のディスクリプタの各々において規定されている送信時刻TTのみに基づいて、読み込むべきディスクリプタを選択した場合、送信時刻TTが遅いディスクリプタは、常に、送信時刻TTが早いディスクリプタよりも後に読み込まれることになる。
【0184】
しかし、或るディスクリプタよりも優先度Pが低い別のディスクリプタの送信時刻TTが、その或るディスクリプタの送信時刻TTの直前である場合、送信時刻TTのみに従ってディスクリプタの読込順序を決定することは、必ずしも適切ではない。
【0185】
例えば、その別のディスクリプタに対応する送信データをメインメモリ20に転送した後では、その或る送信ディスクリプタに対応する送信データを、その或る送信ディスクリプタの送信時刻TTよりも前に、メインメモリ20へと転送できない場合がある。そのような場合、その別のディスクリプタを読み込む(実行する)前に、その或るディスクリプタを読み込まなくてはならず、つまり、その或るディスクリプタを、その別の送信ディスクリプタよりも先に読み込むべきである。
【0186】
通信コントローラ10は、優先度Pのみに従ったディスクリプタの読込順序の決定、および、送信時刻TTのみに従ったディスクリプタの読込順序の決定の各々が有する上述の不備を補う。すなわち、複数の送信ディスクリプタの中の或る送信ディスクリプタの優先度Pが、別のディスクリプタの優先度Pよりも高い場合、通信コントローラ10は、予定合計時刻ERTと或る送信ディスクリプタの送信時刻TTとを比較する。そして、通信コントローラ10は、予定合計時刻ERTと或る送信ディスクリプタの送信時刻TTとの比較結果に基づいて、読み込むべきディスクリプタを選択し、つまり、実行するディスクリプタを選択する。
【0187】
したがって、通信コントローラ10は、優先度Pおよび送信時刻TTのいずれか一方にのみ従って読み込むべきディスクリプタを選択する方法に比べて、読み込むべきディスクリプタを適切に選択することができるとの効果を奏する。
【0188】
(転送時間の算出例)
図10は、通信コントローラ10が、或る送信データについて、その転送時間RTを算出する際に用いる情報を整理した表である。具体的には、通信コントローラ10(特に、選択部131)は、或る送信データのデータサイズと、「通信コントローラ10が、データを、メインメモリ20からバッファ162へと転送する際の転送速度」とから、或る送信データの転送時間RTを計算する。
【0189】
通信コントローラ10は、メインメモリ20と通信コントローラ10(特に、バッファ162)との間のデータ転送に係る理論値速度(転送レート)を、PLC1の起動時(特に、プロトコル確立時)に取得することができる。例えば、メインメモリ20と通信コントローラ10とがPCIe(Peripheral Component Interconnect Express)で接続する場合、通信コントローラ10は、PCIeの規格で保証されているレート(理論値)を、レジスタを参照して確認する。
【0190】
ここで、「実行率」および「オーバーヘッド」の各々は、レート(理論値)ごとに、予め準備されている。具体的には、「実行率」は、通信コントローラ10の生産時(開発時)に、レート(理論値)ごとにチューニングされている。「実行率」は、PLC1の起動時に、ソフトウェア(つまり、CPU30)によって設定されてもよい。同様に、「オーバーヘッド」は、通信コントローラ10の生産時(開発時)に、レート(理論値)ごとにチューニングされている。
【0191】
通信コントローラ10は、確認したレート(理論値)に対応する「実行率」を取得し、レート(理論値)と実行率とから「転送速度」を算出する。また、通信コントローラ10は、レート(理論値)ごとに予め準備しておいた「オーバーヘッド」を、或るデータの転送時間RTを算出するのに利用する。
【0192】
送信データのデータサイズ(転送サイズ)は、送信ディスクリプタに記載されているため、通信コントローラ10は、送信ディスクリプタを読み出すごとに、送信データの転送サイズを取得することができる。
【0193】
通信コントローラ10(特に、選択部131)は、取得した送信データの転送サイズと、レート(理論値)ごとの、「転送速度」および「オーバーヘッド」とから、以下の式を用いて、その送信データの転送時間RTを算出する。すなわち、通信コントローラ10は、「転送時間RT = {オーバーヘッド + (転送サイズ / 転送速度)}」から、送信データの転送時間RTを算出する。
【0194】
(ケース3について)
図11は、ケース3において、判定時間JT(詳細は後述する)を設けない場合に発生する状況を説明する図である。ケース3において、或るディスクリプタは、現在時刻CTから所定時間以上離れた時刻を「送信時刻TT」として規定している。
図11において、通信コントローラ10は、「NIC」と略記されている。
【0195】
図11に例示するケース3において、TX0には、送信データD(0)の「送信時刻TT(0)」として「9:10」を規定し、送信データD(0)の「優先度P」として「1」を規定したディスクリプタが格納されている。また、TX1には、送信データD(1)の「送信時刻TT(1)」として「9:00」を規定し、送信データD(1)の「優先度P」として「1」を規定したディスクリプタが格納されている。さらに、TX2、つまり、第三ディスクリプタメモリ14(2)には、送信データD(2)の「送信時刻TT(2)」として「9:00」を規定し、送信データD(2)の「優先度P」として「2」を規定したディスクリプタが格納されている。
【0196】
ここで、「TX0に格納されている高優先ディスクリプタ」を実行した(読み込んだ)後に、「TX1に格納されている高優先ディスクリプタ」および「TX2に格納されている低優先ディスクリプタ」の各々を実行すると、
図11に示す状況が発生する。なお、「TX0に格納されている高優先ディスクリプタ」を実行した後に実行されるのは、「TX1に格納されている高優先ディスクリプタ」が先でも、「TX2に格納されている低優先ディスクリプタ」が先でもよい。
【0197】
すなわち、「TX0に格納されている高優先ディスクリプタ」を最初に実行した場合、「TX0に格納されている高優先ディスクリプタ」に対応する高優先データD(0)が、バッファ162の最初に格納される。
【0198】
そして、「TX1に格納されている高優先ディスクリプタ」は、「TX0に格納されている高優先ディスクリプタ」よりも後に実行される。そのため、「TX1に格納されている高優先ディスクリプタ」に対応する高優先データD(1)は、高優先データD(0)よりも後に、バッファ162に格納される。
【0199】
バッファ162には、高優先データD(1)の前に高優先データD(0)が格納されているため、高優先データD(0)をネットワーク3に送信してからでないと、送信高優先データD(1)をネットワーク3に送信することはできない。
【0200】
ここで、前述の通り、送信データD(1)の「送信時刻TT(1)」は「9:00」であるのに対して、送信データD(0)の「送信時刻TT(0)」は「9:10」である。そのため、「9:00」に送信データD(1)をネットワーク3に送信することはできず、送信データD(1)をネットワーク3に送信できるタイミングは、送信データD(0)を「9:10」にネットワーク3に送信した後になる。
【0201】
図11に示すように、ケース3においては、現在時刻CTから所定時間以上離れた時刻(例えば、送信時刻TT(0))を、「送信時刻TT」として規定するディスクリプタ(例、
図11の「TX0に格納されている高優先ディスクリプタ」)が発生している。ケース3では、さらに、送信時刻TT(0)を「送信時刻TT」として規定するディスクリプタの後に、「送信時刻TT(0)より現在時刻CTに近い送信時刻TT(例、送信時刻TT(1))を、『送信時刻TT』として規定する」ディスクリプタが発生している。
【0202】
ケース3において、先に発生した「送信時刻TT(0)を『送信時刻TT』として規定するディスクリプタ」を、「送信時刻TT(1)を、『送信時刻TT』として規定するディスクリプタ」よりも先に実行した場合、
図11に示す状況が生じてしまいう。すなわち、「送信時刻TT(0)を、『送信時刻TT』として規定するディスクリプタ」に対応するデータが邪魔となって、「送信時刻TT(1)を、『送信時刻TT』として規定するディスクリプタ」に対応するデータを、送信時刻TT(1)に送信できない。
【0203】
(ケース3を想定した工夫)
通信コントローラ10の開発者は、上述のケース3においても、通信コントローラ10が読み込むべきディスクリプタを好適に選択できるように、通信コントローラ10について、更に以下の工夫を施した。
【0204】
すなわち、通信コントローラ10には、予め判定時間JTが設けられており、通信コントローラ10は、判定時間JTを用いて、ディスクリプタを実行する(読み込む)タイミングを調整する。具体的には、通信コントローラ10は、「ディスクリプタで規定された送信時刻TTから、判定時間JTを遡った時刻」になってから、そのディスクリプタを読み込む(実行する)。
【0205】
通信コントローラ10は、「ディスクリプタで規定された送信時刻TT」から「現在時刻CT」を差し引いた期間が判定時間JTよりも大きいと、つまり、「(送信時刻TT - 現在時刻CT) > 判定時間JT」なら、そのディスクリプタを実行しない。通信コントローラ10は、「ディスクリプタで規定された送信時刻TT」から「現在時刻CT」を差し引いた期間が判定時間JT以下となると、つまり、「(送信時刻TT - 現在時刻CT) ≦ 判定時間JT」となると、そのディスクリプタを実行する。
【0206】
図12は、ケース3について、判定時間JTを設けた通信コントローラ10によって実現される具体的な処理例を示す図である。前述の通り、ケース3において、TX0には、送信データD(0)の「送信時刻TT(0)」として「9:10」を規定し、送信データD(0)の「優先度P」として「1」を規定したディスクリプタが格納されている。また、TX1には、送信データD(1)の「送信時刻TT(1)」として「9:00」を規定し、送信データD(1)の「優先度P」として「1」を規定したディスクリプタが格納されている。さらに、TX2には、送信データD(2)の「送信時刻TT(2)」として「9:00」を規定し、送信データD(2)の「優先度P」として「2」を規定したディスクリプタが格納されている。
【0207】
通信コントローラ10は、送信データD(0)の「送信時刻TT(0)」として「9:10」を規定したディスクリプタを、「『9:10』から判定時間JTを遡った時刻」になるまで、実行しない。つまり、「送信時刻TTから現在時刻CTを差し引いた時間(期間)が、判定時間JTよりも大きい」間は、通信コントローラ10は、送信時刻TTを規定するディスクリプタを読み込まない(実行しない)。
【0208】
そして、通信コントローラ10は、送信データD(1)の「送信時刻TT(1)」として「9:00」を規定したディスクリプタを、「『9:00』から現在時刻CTを差し引いた期間」が判定時間JT以下となると、実行する。つまり、「送信時刻TTから現在時刻CTを差し引いた時間が、判定時間JT以下」となると、通信コントローラ10は、送信時刻TTを規定するディスクリプタを、読み込むべきディスクリプタとみなし、言い換えれば、選択部131による選択処理の対象とする。
【0209】
そのため、通信コントローラ10は、「TX1に格納されている高優先ディスクリプタ」を、「TX0に格納されている高優先ディスクリプタ」よりも先に実行する。したがって、通信コントローラ10は、「TX1に格納されている高優先ディスクリプタ」に対応する高優先データD(1)を、高優先データD(0)よりも先に、バッファ162に格納する。
【0210】
バッファ162には、高優先データD(0)の前に高優先データD(1)が格納されているため、通信コントローラ10は、高優先データD(0)をネットワーク3に送信する前に、送信高優先データD(1)をネットワーク3に送信することができる。具体的には、通信コントローラ10は、送信高優先データD(1)を、送信時刻TT(1):「9:00」にネットワーク3に送信した後、送信高優先データD(0)を、送信時刻TT(0):「9:10」にネットワーク3に送信する。
【0211】
これまで
図11および
図12を用いて説明してきた内容は、以下のように整理することができる。すなわち、通信コントローラ10において、判定時間JTが予め設定されており、読込部132は、送信ディスクリプタの送信時刻TTから判定時間JTを遡った時刻になってから、送信ディスクリプタを読み込む。
【0212】
前記の構成によれば、通信コントローラ10は、送信ディスクリプタの送信時刻TTから判定時間JTを遡った時刻になってから、その送信ディスクリプタを読み込む。
【0213】
ここで、或る送信ディスクリプタを読み込んだ後に、その或る送信ディスクリプタの送信時刻TTよりも現在時刻CTに近い時刻を送信時刻TTとする別のディスクリプタが生成された場合、以下の問題が発生する。すなわち、その或る送信ディスクリプタに対応するデータが障害となって、その別のディスクリプタに対応するデータを、その別のディスクリプタの送信時刻TTで送信することができないという問題が発生する。
【0214】
これは、バッファ162に格納されたデータは、格納された順で送信されるからである。つまり、或る送信ディスクリプタに対応するデータが別のディスクリプタに対応するデータより先に格納されたなら、その或る送信ディスクリプタに対応するデータが送信されてからでないと、その別のディスクリプタに対応するデータは送信されない。そして、その或る送信ディスクリプタに対応するデータは、その或る送信ディスクリプタの送信時刻TTにならなければ送信されない。しかしながら、その或る送信ディスクリプタの送信時刻TTは、その別のディスクリプタの送信時刻TTよりも後であるから、その別のディスクリプタに対応するデータを、その別のディスクリプタの送信時刻TTで送信することはできない。
【0215】
そこで、通信コントローラ10は、送信ディスクリプタの送信時刻TTから判定時間JTを遡った時刻になってから、その送信ディスクリプタを読み込むことによって、上述の問題が発生する可能性を抑制する。すなわち、或る送信ディスクリプタの送信時刻TTより現在時刻CTに近い時刻を送信時刻TTとする別のディスクリプタを読み込む前に、その或る送信ディスクリプタを読み込むことがないよう、通信コントローラ10は、上述の調整を実行する。言い換えれば、通信コントローラ10は、その或る送信ディスクリプタの読込時刻(実行時刻)を調整し、具体的には、その或る送信ディスクリプタの送信時刻TTから判定時間JTを遡った時刻になってから、その或る送信ディスクリプタを読み込む(実行する)。
【0216】
したがって、通信コントローラ10は、或る送信ディスクリプタの送信時刻TTよりも現在時刻CTに近い時刻を送信時刻TTとする別のディスクリプタを読み込む前に、その或る送信ディスクリプタを読み込むことを防ぐことができるとの効果を奏する。
【0217】
(ケース1、2、および、3に対応する通信コントローラの実行する処理について)
これまで、ケース1、ケース2、および、ケース3の各々において、通信コントローラ10が、実行すべき複数のディスクリプタについて、望ましい順序、望ましいタイミングで実行する(読み込む)ことができることを説明してきた。このような通信コントローラ10が実行する処理について、以下、
図13から
図17を参照して説明していく。
【0218】
(CPUおよびリクエスタが実行する処理例)
図13は、CPU30およびリクエスタ15が実行する処理例を示すフロー図であり、特に、
図13の(A)はCPU30が実行する処理例を示しており、
図13の(B)はリクエスタ15が実行する処理例を示している。
【0219】
図13の(A)に示すように、送信要求があると、CPU30は、送信データをメインメモリ20に設定し(S210)、つまり、送信データをメインメモリ20に格納する。また、CPU30は、送信ディスクリプタをメインメモリ20に設定し(S220)、つまり、送信ディスクリプタをメインメモリ20に格納する。そして、CPU30は、通信コントローラ10に送信要求を出力し(S230)、具体的には、送信ディスクリプタの実行番号および実行個数を、通信コントローラ10に通知する。
【0220】
「実行個数」は、CPU30が通信コントローラ10に送信の実行を要求する送信データの個数であり、言い換えれば、通信コントローラ10によって実行されるべき送信ディスクリプタの個数である。また、「実行番号」は、リクエスタ15の番号を示しており、また、ディスクリプタメモリ14の番号を示している。例えば、実行個数が「n」であると、実行番号として、「0」から「n-1」が通信コントローラ10に通知される。実行番号および実行個数は、例えば、リクエスタ15の設定レジスタ151に格納される(設定される)。
【0221】
送信処理は通信コントローラ10が実行するので、CPU30が実行すべき処理は、S230で終了する。送信要求が別途あれば、CPU30は、S210からS230までの処理を都度実行してもよい。
【0222】
図13の(B)に示すように、先ず、リクエスタ15は、CPU30からの送信要求があるかを判定する(S310)。CPU30からの送信要求がないと(S310でNO)、リクエスタ15は、CPU30からの送信要求があるまで待機しておく。
【0223】
CPU30からの送信要求があると(S310でYES)、通信コントローラ10(特に、リクエスタ15)は、以下の処理を実行する。すなわち、CPU30からの送信要求を受け付けた通信コントローラ10は、受け付けた送信要求に従って、メインメモリ20に格納されているディスクリプタを取得し、取得したディスクリプタをディスクリプタメモリ14に格納する。具体的には、CPU30によってリクエスタ15の設定レジスタ151に設定された「実行個数」に基づいて、メインメモリ20から取得すべきディスクリプタを特定し、特定したディスクリプタをメインメモリ20から取得する。そして、通信コントローラ10(特に、リクエスタ15)は、取得したディスクリプタを、「リクエスタ15の設定レジスタ151に設定された『実行番号』に対応する、ディスクリプタメモリ14(ディスクリプタメモリ14の領域)」に格納する。例えば、実行個数が「n」であると、メインメモリ20から取得された「n」個のディスクリプタは、ディスクリプタメモリ14中の、第一ディスクリプタメモリ14(0)から第nディスクリプタメモリ14(n-1)の各々に格納される。
【0224】
また、CPU30からの送信要求を受け付けた通信コントローラ10は、受け付けた送信要求に従ってディスクリプタを格納したディスクリプタメモリ14に対応するリクエスタ15の要求レジスタに「1」を格納する。例えば、通信コントローラ10は、送信要求に従って取得したディスクリプタAを第一ディスクリプタメモリ14(0)に格納すると、第一ディスクリプタメモリ14(0)に対応する第一リクエスタ15(0)の要求レジスタに「1」を格納する。また、通信コントローラ10は、送信要求に従って取得したディスクリプタBを第二ディスクリプタメモリ14(1)に格納すると、第二ディスクリプタメモリ14(1)に対応する第二リクエスタ15(1)の要求レジスタに「1」を格納する。
【0225】
要求レジスタに「1」が格納されたリクエスタ15は、ディスクリプタ実行管理部13に、「実行すべき(読み込むべき)送信ディスクリプタがある」ことを通知する「要求信号=1」を出力する(S320)。そして、リクエスタ15は、ディスクリプタ実行管理部13から、転送完了通知があるかを判定する(S330)。
【0226】
ディスクリプタ実行管理部13からの転送完了通知がないと(S330でNO)、リクエスタ15は、ディスクリプタ実行管理部13からの転送完了通知があるまで待機しておく。
【0227】
ディスクリプタ実行管理部13からの転送完了通知があると(S330でYES)、リクエスタ15は、要求レジスタに「0」を格納し、また、ディスクリプタ実行管理部13に「要求信号=0」を出力する(S340)。「要求信号=0」は、「実行すべきディスクリプタがない」ことをディスクリプタ実行管理部13に通知する信号である。
【0228】
(ディスクリプタ実行管理部およびBUF管理部等が実行する処理例)
図14は、ディスクリプタ実行管理部13およびBUF管理部16等が実行する処理例を示すフロー図であり、特に、
図14の(A)はディスクリプタ実行管理部13が実行する処理例を示しており、
図14の(B)はリクエスタ15が実行する処理例を示している。
【0229】
図14の(A)に示すように、ディスクリプタ実行管理部13は、リクエスタ15からの要求(「要求信号=1」。具体的には、送信ディスクリプタの実行要求(読込要求))があるかを判定する(S410)。リクエスタ15からの要求がないと(S410でNO)、ディスクリプタ実行管理部13は、リクエスタ15からの要求があるまで待機しておく。
【0230】
リクエスタ15からの要求があると(S410でYES)、ディスクリプタ実行管理部13は、実行すべき送信ディスクリプタ(つまり、読み込むべき送信ディスクリプタ)を選択する選択処理を実行する(S420)。選択処理の詳細については、
図15から
図17を参照して、後述する。
【0231】
ディスクリプタ実行管理部13は、S420の選択処理で選択した送信ディスクリプタを実行し、つまり、選択した送信ディスクリプタを読み込む。そして、ディスクリプタ実行管理部13は、読み込んだ送信ディスクリプタに規定されている内容に従って、DMAC12に転送リクエストを出力する(S430)。転送リクエストは、DMAC12への転送指示であり、具体的には、「読み込んだ送信ディスクリプタに規定されている内容に従ってメインメモリ20から送信データを取得し、取得した送信データを、バッファ162へと転送する」ことをDMAC12に指示する。
【0232】
ディスクリプタ実行管理部13は、DMAC12から、「転送リクエストに対応する送信データの転送処理を、DMAC12が完了した」ことを示す転送完了報告があるかを判定する(S440)。DMAC12からの転送完了報告がないと(S440でNO)、ディスクリプタ実行管理部13は、DMAC12からの転送完了報告があるまで待機しておく。
【0233】
DMAC12からの転送完了報告があると(S440でYES)、ディスクリプタ実行管理部13は、リクエスタ15に、転送完了通知を発行する(S450)。「転送完了通知」は、「送信ディスクリプタに規定されている内容に従って、メインメモリ20からバッファ162への送信データの転送処理が完了した」ことを示す情報である。
【0234】
図14の(B)に示すように、先ず、BUF管理部16は、バッファ162に送信データがあるかを判定する(S510)。バッファ162に送信データがないと(S510でNO)、BUF管理部16は、バッファ162に送信データが存在するようになるまで待機しておく。
【0235】
バッファ162に送信データがあると(S510でYES)、時刻指定送信管理部161は、「現在時刻CTが、バッファ162に存在する送信データの送信時刻TTであるか」を判定する(S520)。現在時刻CTがバッファ162に存在する送信データの送信時刻TTでないと(S520でNO)、時刻指定送信管理部161は、現在時刻CTがバッファ162に存在する送信データの送信時刻TTになるまで待機しておく。
【0236】
現在時刻CTがバッファ162に存在する送信データの送信時刻TTになると(S520でYES)、時刻指定送信管理部161は、送信リクエストを、調停部17に発行する(S530)。「送信リクエスト」は、「バッファ162に存在する送信データの送信を、調停部17に指示する」情報である。
【0237】
調停部17は、「他の送信データの送信を実行中ではないか」を確認し、他の送信データの送信を実行中ではないことを確認すると、時刻指定送信管理部161にアクセス許可を出力する。調停部17は、他の送信データの送信を実行中だと、時刻指定送信管理部161にアクセス許可を出力しない。
【0238】
時刻指定送信管理部161は、調停部17からのアクセス許可があるかを判定する(S540)。調停部17からのアクセス許可がないと(S540でNO)、時刻指定送信管理部161(BUF管理部16)は、調停部17からのアクセス許可があるまで待機しておく。
【0239】
調停部17からのアクセス許可があると(S540でYES)、時刻指定送信管理部161(BUF管理部16)は、バッファ162に存在する送信データの送信を実行する(S550)。
【0240】
(選択処理の詳細例)
図15は、
図14の(A)に例示した選択処理(S420)の一例を示すフロー図である。前述の通り、ディスクリプタ実行管理部13は、実行すべき(読み込むべき)、1つ以上の送信ディスクリプタについて実行順序を決定し、例えば、実行すべき複数の送信ディスクリプタの中から、実行する送信ディスクリプタを1つ1つ選択していく(選択処理)。ディスクリプタ実行管理部13の実行する、この選択処理について、以下、
図15から
図17を参照して、その詳細を説明していく。
【0241】
図15に示すように、ディスクリプタ実行管理部13は、例えば、カレント送信時刻CST、カレント優先度CPR、カレント転送時間CRTの3つの変数の各々に、「0」を設定する(S1100)。以下、カレント送信時刻CST、カレント優先度CPR、および、カレント転送時間CRTを総称して、「カレント変数」と称することがある。
【0242】
次に、ディスクリプタ実行管理部13は、各々が送信要求に対応する、1つ以上のディスクリプタの中から、任意のディスクリプタ(=対象ディスクリプタ)を1つ選択し、その対象ディスクリプタの優先度P、送信時刻TT等を取得する(S1200)。「各々が送信要求に対応する、1つ以上のディスクリプタ」とは、「
図13の(B)において、送信要求のあった(S310でYES)ディスクリプタ」である。
【0243】
以下の説明において、対象ディスクリプタの規定している「送信時刻TT」を「NST」と略記し、対象ディスクリプタの規定している「優先度P」を「NPR」と略記し、対象ディスクリプタに対応する送信データの「転送時間RT」を「NRT」と略記する。また、対象ディスクリプタに対応する送信データを「対象データ」と略記することがある。同様に、カレント送信時刻CST、カレント優先度CPR、カレント転送時間CRTに対応する内容を規定しているディスクリプタを、「カレントディスクリプタ」と略記し、カレントディスクリプタに対応する送信データを「カレント」と略記することがある。
【0244】
そして、ディスクリプタ実行管理部13は、「『対象ディスクリプタの送信時刻NSTから現在時刻CTを差し引いた時間(期間)』が、判定時間JT以下であるか」を判定する(S1300)。対象ディスクリプタの送信時刻NSTから現在時刻CTを差し引いた時間が、判定時間JTより大きいと(S1300でNO)、ディスクリプタ実行管理部13は、「送信要求のあったディスクリプタを全て判定したか」を確認する(S1600)。対象ディスクリプタの送信時刻NSTから現在時刻CTを差し引いた時間が、判定時間JT以下であると(S1300でYES)、ディスクリプタ実行管理部13は、カレント優先度CPRと対象ディスクリプタの優先度NPRとを比較する(S1400)。
【0245】
ここで、S1300の処理は、
図12を用いて説明した、「通信コントローラ10は、『ディスクリプタで規定された送信時刻TTから、判定時間JTを遡った時刻』以降に、そのディスクリプタを読み込む(実行する)」との処理に対応する。
【0246】
つまり、S1300において、現在時刻CTが「或るディスクリプタの規定する送信時刻TTから、判定時間JTを差し引いた時間」より小さいと、ディスクリプタ実行管理部13は、現在時刻CTでは、その或るディスクリプタを選択処理の対象から除外する。現在時刻CTが「或るディスクリプタの規定する送信時刻TTから、判定時間JTを遡った時刻」より早いと、ディスクリプタ実行管理部13は、現在時刻CTでは、その或るディスクリプタに対し選択処理を実行せず、その或るディスクリプタを読み込まない。
【0247】
S1300において、現在時刻CTが「或るディスクリプタの規定する送信時刻TTから、判定時間JTを差し引いた時間」以上であると、ディスクリプタ実行管理部13は、現在時刻CTにおいて、その或るディスクリプタを選択処理の対象とする。現在時刻CTが「或るディスクリプタの規定する送信時刻TTから、判定時間JTを遡った時刻」以降であると、ディスクリプタ実行管理部13は、現在時刻CTにおいて、その或るディスクリプタに対し選択処理を実行する。
【0248】
S1400においてカレント優先度CPRと対象ディスクリプタの優先度NPRとを比較したディスクリプタ実行管理部13は、カレント優先度CPRと対象ディスクリプタの優先度NPRとの関係ごとに、更新処理を実行する(S1500)。具体的には、ディスクリプタ実行管理部13は、対象ディスクリプタの優先度NPRが、(1)カレント優先度CPRと同じ場合、(2)カレント優先度CPRより高い場合、(3)カレント優先度CPRより低い場合の各々について、更新処理を実行する。カレント優先度CPRと対象ディスクリプタの優先度NPRとの関係ごとに、ディスクリプタ実行管理部13が実行する更新処理について、その詳細は、
図16および
図17を参照して説明する。
【0249】
S1500の更新処理を実行後、ディスクリプタ実行管理部13は、「送信要求のあったディスクリプタを全て判定したか」を確認する(S1600)。例えば、ディスクリプタ実行管理部13は、「送信要求のあったディスクリプタを全てについて、S1200(またはS1700)からS1500までの処理を実行したか」を確認する。
【0250】
送信要求のあったディスクリプタを全て判定していないと(S1600でNO)、ディスクリプタ実行管理部13は、送信要求のあったディスクリプタの中から、未判定のディスクリプタの1つを「対象ディスクリプタ」として選択する。そして、ディスクリプタ実行管理部13は、選択した対象ディスクリプタの優先度NPR、送信時刻NST等を取得する(S1700)。そして、ディスクリプタ実行管理部13は、S1300以降の処理を実行する。
【0251】
つまり、ディスクリプタ実行管理部13は、送信要求のあったディスクリプタの中に、S1200(またはS1700)からS1500までの処理を実行していないディスクリプタがないかを確認する。S1200(またはS1700)からS1500までの処理を実行していないディスクリプタがあると、ディスクリプタ実行管理部13は、そのディスクリプタについて、S1700からS1500までの処理を実行する。
【0252】
最後に、ディスクリプタ実行管理部13は、カレント送信時刻CST、カレント優先度CPR、カレント転送時間CRTに対応するディスクリプタを、現在時刻CTにおいて実行する(読み込む)ディスクリプタとして、選択する(S1800)。
【0253】
(更新処理の詳細例)
図16は、
図15に例示した更新処理(S1500)について、対象ディスクリプタの優先度NPRがカレント優先度CPRと同じ場合、および、対象ディスクリプタの優先度NPRがカレント優先度CPRより高い場合の例を示すフロー図である。
【0254】
(対象ディスクリプタの優先度がカレント優先度と同じ場合の更新処理例)
対象ディスクリプタの優先度NPRがカレント優先度CPRと同じ場合、ディスクリプタ実行管理部13は、
図16の(A)に例示する更新処理を実行する。すなわち、ディスクリプタ実行管理部13は先ず、「カレント送信時刻CSTより、対象ディスクリプタの送信時刻NSTの方が早いか」を判定する(S1511)。
【0255】
カレント送信時刻CSTより対象ディスクリプタの送信時刻NSTの方が早いと(S1511でYES)、ディスクリプタ実行管理部13は、カレント送信時刻CST、カレント優先度CPR、カレント転送時間CRTの各々の値を更新する(S1512)。具体的には、ディスクリプタ実行管理部13は、カレント送信時刻CSTの値を、対象ディスクリプタの送信時刻NSTの値によって更新する。また、ディスクリプタ実行管理部13は、カレント優先度CPRの値を、対象ディスクリプタの優先度NPRの値によって更新する。さらに、ディスクリプタ実行管理部13は、カレント転送時間CRTの値を、対象ディスクリプタに対応する送信データの転送時間NRTの値によって更新する。
【0256】
S1511の判定において、「カレント送信時刻CST=0」の場合、ディスクリプタ実行管理部13は、「S1511でYES」であるとして次の処理へ遷移し、つまり、S1512を実行する。
【0257】
カレント送信時刻CSTより対象ディスクリプタの送信時刻NSTの方が遅い、または、カレント送信時刻CSTと対象ディスクリプタの送信時刻NSTとが同じ場合(S1511でNO)、ディスクリプタ実行管理部13は、更新処理を終了する。
【0258】
(対象ディスクリプタの優先度がカレント優先度より高い場合の更新処理例)
対象ディスクリプタの優先度NPRがカレント優先度CPRより高い場合、ディスクリプタ実行管理部13は、
図16の(B)に例示する更新処理を実行する。すなわち、ディスクリプタ実行管理部13は先ず、「カレント送信時刻CSTより、対象ディスクリプタの送信時刻NSTの方が早いか、または、カレント送信時刻CSTと対象ディスクリプタの送信時刻NSTとが同じか」を判定する(S1521)。
【0259】
カレント送信時刻CSTより対象ディスクリプタの送信時刻NSTの方が早い、または、両者が同じであると(S1521でYES)、ディスクリプタ実行管理部13は、カレント変数を更新する(S1525)。具体的には、ディスクリプタ実行管理部13は、カレント送信時刻CSTの値を、対象ディスクリプタの送信時刻NSTの値によって更新する。また、ディスクリプタ実行管理部13は、カレント優先度CPRの値を、対象ディスクリプタの優先度NPRの値によって更新する。さらに、ディスクリプタ実行管理部13は、カレント転送時間CRTの値を、対象ディスクリプタに対応する送信データの転送時間NRTの値によって更新する。
【0260】
S1521の判定において、「カレント送信時刻CST=0」の場合、ディスクリプタ実行管理部13は、「S1521でYES」であるとして次の処理へ遷移し、つまり、S1525を実行する。
【0261】
カレント送信時刻CSTより対象ディスクリプタの送信時刻NSTの方が遅いと(S1521でNO)、ディスクリプタ実行管理部13は、カレントの転送実行後に対象データを転送した場合の終了時刻(つまり、予定合計時刻ERT)を計算する(S1523)。すなわち、ディスクリプタ実行管理部13は、「予定合計時刻ERT = 現在時刻CT +カレント転送時間CRT + 対象ディスクリプタの転送時間NRT」を算出する。
【0262】
ディスクリプタ実行管理部13は、「対象ディスクリプタの送信時刻NST < 予定合計時刻ERT」であるかを判定し、つまり、「対象ディスクリプタの送信時刻NSTが予定合計時刻ERTより小さい(早い)か」を判定する(S1524)。
【0263】
対象ディスクリプタの送信時刻NSTが予定合計時刻ERTより早い場合(S1524でYES)、ディスクリプタ実行管理部13は、カレント変数を更新する(S1525)。対象ディスクリプタの送信時刻NSTが予定合計時刻ERTと同じ、または、対象ディスクリプタの送信時刻NSTが予定合計時刻ERTより大きい(遅い)場合(S1524でNO)、ディスクリプタ実行管理部13は、更新処理を終了する。
【0264】
ここで、
図16の(B)では、対象ディスクリプタの優先度NPRがカレント優先度CPRより高いから、対象ディスクリプタは「
図6の高優先ディスクリプタ」に対応し、カレントディスクリプタは「
図6の低優先ディスクリプタ」に対応する。また、
図16の(B)において、送信時刻NSTは、
図6の「高優先ディスクリプタの規定する送信時刻TT(高優先)」に対応する。
【0265】
したがって、
図16の(B)のS1524は、
図6のS130と同様の判定を行っている。すなわち、S1524でYESだと、ディスクリプタ実行管理部13は、高優先ディスクリプタに対応する対象ディスクリプタが、現在時刻CTにおいて実行されるディスクリプタとして選択されるように、カレントディスクリプタを更新する。
【0266】
また、S1524でNOだと、ディスクリプタ実行管理部13は、低優先ディスクリプタに対応するカレントディスクリプタが、現在時刻CTにおいて実行されるディスクリプタとして選択されるように、カレントディスクリプタの更新を実行しない。
【0267】
(対象ディスクリプタの優先度がカレント優先度より低い場合の更新処理例)
図17は、
図15に例示した更新処理(S1500)について、対象ディスクリプタの優先度NPRがカレント優先度CPRより低い場合の例を示すフロー図である。
図17に示すように、ディスクリプタ実行管理部13は先ず、「カレント送信時刻CSTより、対象ディスクリプタの送信時刻NSTの方が早いか」を判定する(S1531)。
【0268】
カレント送信時刻CSTより対象ディスクリプタの送信時刻NSTの方が早いと(S1531でYES)、ディスクリプタ実行管理部13は、カレントの転送実行後に対象データを転送した場合の終了時刻(つまり、予定合計時刻ERT)を計算する(S1523)。すなわち、ディスクリプタ実行管理部13は、「予定合計時刻ERT = 現在時刻CT +カレント転送時間CRT + 対象ディスクリプタの転送時間NRT」を算出する。
【0269】
ディスクリプタ実行管理部13は、「カレント送信時刻CST < 予定合計時刻ERT」であるかを判定し、つまり、「カレント送信時刻CSTが予定合計時刻ERTより小さい(早い)か」を判定する(S1533)。カレント送信時刻CSTが予定合計時刻ERTより早い場合(S1533でYES)、ディスクリプタ実行管理部13は、更新処理を終了する。
【0270】
カレント送信時刻CSTが予定合計時刻ERTと同じ、または、カレント送信時刻CSTが予定合計時刻ERTより大きい(遅い)場合(S1533でNO)、ディスクリプタ実行管理部13は、カレント変数を更新する(S1534)。
【0271】
ここで、
図17では、対象ディスクリプタの優先度NPRがカレント優先度CPRより低いから、対象ディスクリプタは「
図6の低優先ディスクリプタ」に対応し、カレントディスクリプタは「
図6の高優先ディスクリプタ」に対応する。また、
図17において、カレント送信時刻CSTは、
図6の「高優先ディスクリプタの規定する送信時刻TT(高優先)」に対応する。
【0272】
したがって、
図17のS1533は、
図6のS130と同様の判定を行っている。すなわち、S1533でYESだと、ディスクリプタ実行管理部13は、高優先ディスクリプタに対応するカレントディスクリプタが、現在時刻CTにおいて実行されるディスクリプタとして選択されるように、カレントディスクリプタの更新を実行しない。
【0273】
また、S1533でNOだと、ディスクリプタ実行管理部13は、低優先ディスクリプタに対応する対象ディスクリプタが、現在時刻CTにおいて実行されるディスクリプタとして選択されるように、カレントディスクリプタを更新する。
【0274】
§4.変形例
(ネットワーク構成例について)
図2に例示した制御システム0において、複数のネットワーク3が、ネットワークハブ2を介して、PLC1に接続している。しかしながら、制御システム0において、1つのネットワーク3がネットワークハブ2を介さずにPLC1に接続し、例えば、PLC1と、1つ以上のネットワークデバイスとが、一筆書きの形式で互いに通信可能に接続されていてもよい。
【0275】
本発明は上述した各実施形態に限定されるものではなく、請求項に示した範囲で種々の変更が可能であり、異なる実施形態にそれぞれ開示された技術的手段を適宜組み合わせて得られる実施形態についても本発明の技術的範囲に含まれる。
【符号の説明】
【0276】
10 通信コントローラ(通信制御機器)
20 メインメモリ
162 バッファ(送信バッファ)
131 選択部
132 読込部
CT 現在時刻
ERT 予定合計時刻
JT 判定時間
P 優先度(実行優先度)
RT 転送時間
S20 選択ステップ
S30 読込ステップ
TT 送信時刻(送信予定時刻)