以下、本発明の実施の形態に係るプログラマブルコントローラについて、図面に基づいて具体的に説明する。
図1は、本発明の実施の形態に係るプログラマブルコントローラの構成を示す模式図である。図1に示すように、プログラマブルコントローラ1は、CPUユニット2と、機能ごとに独立した複数の拡張ユニット3、3、・・・とで構成されている。拡張ユニット3、3、・・・には、機能ごとに動作を制御する対象となる外部機器5、5、・・・が接続してあり、ラダープログラム等の制御プログラムに従って、CPUユニット2からの指令により各外部機器5の動作を制御する。なお、本実施の形態では、CPUユニット2と拡張ユニット3とを別体で構成しているが、例えば拡張ユニット3の機能を、CPUユニット2の内部に内蔵させる構成であっても良い。
CPUユニット2は、内蔵するメモリ21に記憶してある制御プログラムに従って、接続してある拡張ユニット3、3、・・・に対して指令を送出するCPUを備えている。また、拡張ユニット3、3、・・・は、CPUユニット2からの指令に従って、接続してある外部機器5、5、・・・の動作を制御する。なお、外部機器5、5、・・・の動作を制御するためのパラメータ情報等は、拡張ユニット3、3、・・・が内蔵するメモリ31、31、・・・に記憶してある。また、パラメータ情報等をCPUユニット2内のメモリ21に記憶しておき、通信経路7を介してユニット間通信により読み出して参照しても良い。
図1の例では、拡張ユニット3aは通信ユニットであり、フィールドネットワーク6を介して外部機器5、5、・・・とデータ通信することが可能に接続されている。CPUユニット2と通信ユニット3aとの間は通信経路(バス)7を介したユニット間通信が行われている。
通信ユニット3aは、フィールドネットワーク6を介したデータ通信機能を有する広義の入出力ユニットであり、フィールドネットワーク6を介して外部機器5から受信したデータは、通信経路7を介したユニット間通信によりCPUユニット2へ転送され、CPUユニット2から通信経路7を介したユニット間通信により受け取った送信データは、フィールドネットワーク6を介して所望の外部機器5へ送信される。通信ユニット3aの動作を制御する制御プログラムは、ユーザが、演算表示装置4にインストールされたラダーエディタなどのプログラム作成ソフトウェアを用いて自由に作成・編集できるようになっている。演算表示装置4において作成・編集され、演算表示装置4の記憶装置に記憶された制御プログラムは、ユーザの操作に基づいて、演算表示装置4からCPUユニット2へダウンロードされる。
CPUユニット2は、1スキャンの間にデータの入出力リフレッシュ処理と演算処理とを実行する。図2は、本発明の実施の形態に係るプログラマブルコントローラ1のCPUユニット2でのスキャンタイムの構成を示す模式図である。図2に示すように、CPUユニット2は、プログラムを実行する前のユニット間通信(入力リフレッシュ)201により、フィールドネットワーク6を介した受信データを含めた入力データをCPUユニット2内のメモリ21に取り込み、更新された入力データを用いてプログラムを実行(演算)する(202)。
プログラムの実行により演算処理した後、ユニット間通信(出力リフレッシュ)203により、フィールドネットワーク6を介した送信データを含めた出力データをCPUユニット2内のメモリ21から送信する。なお、END処理204とは、演算表示装置4、CPUユニット2に接続された表示器(図示せず)等の外部機器とのデータ通信、システムのエラーチェック等の周辺サービスに関する処理全般を意味する。
CPUユニット2のスキャンタイムTは、プログラムが同一である場合、ユニット間通信(入力リフレッシュ)201及びユニット間通信(出力リフレッシュ)203に要する時間の長短により増減する。ユニット間通信201及びユニット間通信203に要する時間は、データ通信の対象となるデータの1スキャン当たりに通信されるデータ量に依存する。したがって、フィールドネットワーク6を介したデータ通信における複数のコネクションの通信タイミングが重なった場合、ユニット間通信201及び/又はユニット間通信203にてデータ量が増加するので、ユニット間通信201及び/又はユニット間通信203に要する時間が長くなる。したがって、全体としてCPUユニット2のスキャンタイムTが長くなり、場合によっては、定時的にCPUユニット2に取り込まなければ把握することができない高速の入力信号の変化を取りこぼす等の問題が生じるおそれがある。
また、フィールドネットワーク6を介して送受信されるデータには、例えば制御信号と計測結果のように一組でデータ通信されるべきデータもある。これらのデータは、データの同時性を維持するべく同一のコネクションにてデータ通信され、ユニット間通信においても同一のスキャンにてデータ通信される。なお、フィールドネットワーク6を介したデータ通信の通信周期に対してスキャンタイムTが長い場合、どのデータからデータ通信するかリフレッシュ優先度を設定する必要がある。1スキャン内の通信では、データ通信するデータの順序は任意だからである。
例えばデータ送信を行う場合、CPUユニット2から通信ユニット3aへユニット間通信するときに、通信ユニット3aからフィールドネットワーク6を介して外部機器5への送信が終了するまで、通信ユニット3aにて通信データが待ち状態となることがある。送信データの一部が書き換えられる等の障害の発生を回避するためである。しかし、センサ入力、アクチュエータ出力等の入出力データのように、入出力応答性が要求されるデータも存在する。これらの入出力データが通信ユニット3aにて待ち状態となることは好ましくない。
そこで、本実施の形態では、スキャンタイムTの定時性を可能な限り維持しつつ、同時性が要求されるデータのユニット間通信を行うとともに、入出力応答性が要求されるデータは優先的にユニット間通信を行うよう通信ユニット3aの動作を制御する。図3は、本発明の実施の形態に係るプログラマブルコントローラ1のフィールドネットワーク通信で受信したデータを入力リフレッシュでCPUユニット2へ転送する場合を示す機能ブロック図である。
図3において、CPU等で構成されているCPUユニット2の制御部20は、上限値情報入力受付部22、及び優先度入力受付部23として機能する。上限値情報入力受付部22は、1スキャン当たりに入出力(データ通信)することが可能なデータサイズの上限値(以下、リフレッシュ上限値)の入力を受け付ける。1スキャン当たりに入力することが可能な入力リフレッシュ上限値と出力することが可能な出力リフレッシュ上限値とを、別々に入力を受け付けても良いし、合算したリフレッシュ上限値として入力を受け付けても良い。また、上限値情報として上限値の入力を受け付けることに限定されるものではなく、デフォルト値を段階別に指定しておき、例えば「データサイズ大」、「データサイズ中」、「データサイズ小」というような選択の入力を受け付けても良い。
なお、入力リフレッシュ上限値と出力リフレッシュ上限値とを合算として上限値の入力を受け付ける場合、入力リフレッシュ上限値と出力リフレッシュ上限値とを所定の割合で割り振る。例えば1:1の割合で、入力を受け付けた上限値を入力リフレッシュ上限値と出力リフレッシュ上限値とに割り振っても良いし、入力によるデータ通信量の方が大きい場合には、2:1の割合で割り振る等、ユニット間通信をより効率良く実行することが可能となる。
リフレッシュ上限値の入力は、本実施の形態に係るプログラマブルコントローラ1に接続されている演算表示装置4を介して受け付ける。入力を受け付けたリフレッシュ上限値は、通信線を介してCPUユニット2及び通信ユニット3aへ送信され、CPUユニット2内のメモリ21及び通信ユニット3a内のメモリ31へ記憶される。また、通信線を介してCPUユニット2へ送信してCPUユニット2内のメモリ21へ記憶した上で、ユニット間通信により通信ユニット3aへ転送してメモリ31に記憶しても良い。つまり、CPUユニット2と通信ユニット3aとは、リフレッシュ上限値について情報共有している。
優先度入力受付部23は、通信ユニット3aがフィールドネットワーク6を介して外部機器5とデータ通信するために確立するコネクションごとに、少なくとも通信ユニット3aがデータを送受信するコネクションを識別するコネクションID、データを送受信するために必要となる情報(例えば送受信の相手方のアドレス、送受信の区別等に関する情報、送受信するデータのデータサイズ、通信周期等)、そして入出力リフレッシュに対するコネクション間の相対的な優先度(以下、リフレッシュ優先度)の入力を受け付ける。また、送受信データを記憶する待ちデータ記憶部35内のアドレスについては、静的に特定される場合には入力を受け付ける必要はない。しかし、メモリを有効に活用すること等を目的として動的に特定する場合には、別途入力を受け付けても良い。
リフレッシュ優先度は、例えば2段階の「通常」と「優先」とし、「優先」と入力を受け付けた場合、対応するコネクションに対するユニット間通信を優先して行う。もちろん、2段階に限定されるものではなく、多段階の優先順位の入力を受け付けても良いし、他のデータよりも最優先でデータ通信を行う「最優先」の入力を受け付けても良い。「最優先」の入力を、入出力応答性が特に要求されるデータのデータ通信を行うコネクションに対して受け付けることにより、例えば多くの待ちデータが一時記憶されている場合であっても、毎スキャン確実にデータ通信を行うことが可能となり、入出力応答性を損なうことを回避することができる。
リフレッシュ優先度の入力は、本実施の形態に係るプログラマブルコントローラ1に接続されている演算表示装置4を介して受け付ける。入力を受け付けたリフレッシュ優先度は、通信線を介してCPUユニット2及び通信ユニット3aへ送信され、CPUユニット2内のメモリ21及び通信ユニット3a内のメモリ31へ記憶される。また、通信線を介してCPUユニット2へ送信してCPUユニット2内のメモリ21へ記憶した上で、ユニット間通信により通信ユニット3aへ転送してメモリ31に記憶しても良い。つまり、CPUユニット2と通信ユニット3aとは、リフレッシュ優先度について情報共有している。なお、上述したコネクションID、データを送受信するために必要となる情報に関しても、同様に情報共有している。
フィールドネットワーク6を介して受信した受信データは、通信ユニット3aの動作を制御する制御部30のフィールドネットワーク通信制御部34により、受信する場合に使用するコネクションを識別するコネクションIDと対応付けて、フィールドネットワーク通信用メモリ38の受信バッファ39に一時記憶される。受信データをCPUユニット2へ転送する場合の優先度制御、リフレッシュ上限値に従った帯域制御、同時性を維持するためのCPUユニット2と共用する待ちデータ記憶部35の排他制御は、制御部30が行う。
CPUユニット2とのユニット間通信のための待ちデータ記憶部35はバッファメモリとして機能し、例えば2ポートメモリで構成される。待ちデータ記憶部35は、受信データを一次記憶する受信データ領域352の他、CPUユニット2との間で同時性を維持するために使用するフラグ情報、排他制御で使用するセマフォを配置したハンドシェイク領域351を有する。
また、リフレッシュ優先度制御を行うために、優先受信FIFO36と通常受信FIFO37とを備えている。
通信ユニット3aの制御部30は、フィールドネットワーク通信制御部34がデータを受信した場合、どのコネクション(コネクションID)を介して受信した受信データであるかを確認した上で、該コネクションIDに対応するリフレッシュ優先度と、待ちデータ記憶部(バッファメモリ)35の受信データ領域352にて受信データを記憶するアドレスを確認し、該コネクションIDの受信データをCPUユニット2が待ちデータ記憶部(バッファメモリ)35から読み出し中でない場合には、受信バッファ39から待ちデータ記憶部35の受信データ領域352における該コネクションのアドレスへ受信データを転送して、受信バッファ39を開放する。
なお、制御部30は、例えばセマフォ等の仕組みを用いて、待ちデータ記憶部35においてCPUユニット2と通信ユニット3aとの間でいずれか一方が書き込み中のデータを他方が読み出さないよう排他制御する。これにより、同一コネクションのデータの同時性を確保することができる。
フィールドネットワーク6を介して受信した受信データに対応するコネクションのリフレッシュ優先度が「優先」である場合は優先受信FIFO36に、「通常」である場合は通常受信FIFO37に、それぞれコネクションIDを書き込む。リフレッシュ優先度が「最優先」である場合には、無条件で毎スキャン、ユニット間通信で入出力リフレッシュされるので、受信データを待ちデータ記憶部35の受信データ領域352における該コネクションのアドレスへ転送しておけば、以後特段の処理は不要となる。
以下、受信データの同時性を維持して通信ユニット3aからCPUユニット2へ転送する方法について説明する。図4は、本発明の実施の形態に係るプログラマブルコントローラ1のフィールドネットワーク通信での受信データ転送方法を示すシーケンス図である。
図4において、受信データの同時性を維持して通信ユニット3aからCPUユニット2へ転送するために、CPUユニット2と通信ユニット3aとは、待ちデータ記憶部35のハンドシェイク領域351を用いてユニット間通信する。待ちデータ記憶部35は、全てのコネクションが独立して通信を行ってもユニット間通信に支障が出ない十分なメモリ容量を確保しており、複数コネクションのユニット間通信を独立して要求することができる。
まず、通信ユニット3aの制御部30は、フィールドネットワーク6を介して所定のコネクションIDに対応する受信データを受信し(401)、受信バッファ39に所定のコネクションIDに対応する受信データを一時記憶する(402)。そして、制御部30は、受信データを受信バッファ39から受信データ領域352へ転送した後、所定の条件を満たしている場合には、所定のコネクションIDの入力リフレッシュ要求(ユニット間通信要求)をCPUユニット2へ通知する(403)。具体的には、待ちデータ記憶部35のハンドシェイク領域351に、生成した入力リフレッシュ要求を記憶しておき、CPUユニット2が任意のタイミングで確認する。
CPUユニット2は、通信ユニット3aの入力リフレッシュ要求を所定のタイミングで確認し(404)、所定のコネクションIDによる受信データを受信データ領域352から受け取る(405)。所定のタイミングとは、各スキャンのプログラム実行前の入力リフレッシュ処理の開始のタイミングである。CPUユニット2は、まずリフレッシュ優先度が「最優先」であるコネクションの受信データを、全て待ちデータ記憶部35の受信データ領域352から受信する。次に、ハンドシェイク領域351の入力リフレッシュ要求を確認し、対応するコネクションIDの受信データを待ちデータ記憶部35の受信データ領域352から受信した後、コネクションIDに対応する入力リフレッシュ完了を通信ユニット3aへ通知する(406)。具体的には、待ちデータ記憶部35のハンドシェイク領域351に、該コネクションIDに対応する入力リフレッシュ完了通知を記憶しておく。通信ユニット3aの制御部30は、所定のタイミングで入力リフレッシュ完了通知が記憶されていることを確認し、入力リフレッシュ完了通知が記憶されている場合には対応する入力リフレッシュ要求(ユニット間通信要求)をクリアするとともに、該入力リフレッシュ完了通知をクリアする(407)。
図3に戻って、制御部30の要求生成部33は、CPUユニット2に対して要求していて、しかも完了していない全ての入力リフレッシュ要求に対応する各コネクションの受信データ(未完了コネクション)のデータサイズを累計することにより、要求中であり未完了である入力リフレッシュの合計データサイズを算出する。算出した合計データサイズが、入力を受け付けたリフレッシュ上限値を超えている場合には、新たな入力リフレッシュ要求は行わない。
算出した合計データサイズが、入力を受け付けたリフレッシュ上限値以下である場合、要求生成部33は、優先受信FIFO36を確認する。入力リフレッシュ要求待ちのコネクションIDが存在する場合、該コネクションIDに対応する入力リフレッシュ要求を生成して、CPUユニット2へ通知する。
要求生成部33は、入力リフレッシュ要求待ちのコネクションIDが見つからない場合、通常受信FIFO37を確認する。入力リフレッシュ要求待ちのコネクションIDが存在する場合、該コネクションIDに対応する入力リフレッシュ要求を生成して、CPUユニット2へ通知する。
ただし、優先受信FIFO36に入力リフレッシュ要求待ちのコネクションIDが存在する場合であっても、通常受信FIFO37に入力リフレッシュ要求待ちのコネクションIDが存在し、しかも直近所定回数、例えば直近3回連続して優先受信FIFO36のコネクションIDに対応する入力リフレッシュ要求を生成していたときには、通常受信FIFO37の入力リフレッシュ要求待ちのコネクションIDに対応する入力リフレッシュ要求を生成して、CPUユニット2へ通知する。これにより、コネクションのリフレッシュ優先度が「優先」である受信データの割合が高い場合、コネクションのリフレッシュ優先度が「通常」であるコネクションが入力リフレッシュを行うことができない状態に陥ることを未然に回避することができる。
要求生成部33は、入力リフレッシュ要求を生成して、CPUユニット2へ通知した後、現在CPUユニット2に対して要求していて、しかも完了していない全ての入力リフレッシュ要求に対応する各コネクションの受信データのデータサイズを再度累計し、要求中であり未完了である入力リフレッシュの合計データサイズを算出する。算出した合計データサイズが、入力を受け付けたリフレッシュ上限値を超えている場合には、処理を終了し、超えていない場合には上述した処理を繰り返す(以下、上述の処理を受信要求生成処理という)。
以下、リフレッシュ優先度に応じた受信FIFOを用いたデータ受信処理について、フローチャートに基づいて詳細に説明する。なお、本実施の形態では、優先受信FIFO36及び通常受信FIFO37に、それぞれコネクションIDを書き込む都度、合計データサイズがリフレッシュ上限値を超えているか否かを確認して受信要求生成処理を行う。しかし、合計データサイズがリフレッシュ上限値を超えている場合、新たな入力リフレッシュ要求は行わないので、CPUユニット2が入力リフレッシュ処理を完了して合計データサイズがリフレッシュ上限値以下となり次第、入力リフレッシュ要求を行う必要がある。そのため、CPUユニット2からの入力リフレッシュ完了通知を確認するとともに、入力リフレッシュ完了が通知されていれば、対応する入力リフレッシュ要求(ユニット間通信要求)をクリアするとともに、該入力リフレッシュ完了通知をクリアする処理を行った上で、入力リフレッシュ要求中でありながら未完了であるコネクションの受信データの合計データサイズを再度累計し、合計データサイズとリフレッシュ上限値との比較結果に基づく受信要求生成処理を行う一連の処理フローを定期的に実行すれば良い。
図5は、本発明の実施の形態に係るプログラマブルコントローラ1の通信ユニット3aの制御部30の受信処理手順を示すフローチャートである。通信ユニット3aの制御部30は、CPUユニット2又は演算表示装置4から、1スキャン当たりに入出力することが可能なデータサイズのリフレッシュ上限値、及び通信ユニット3aがデータを送受信する(データ通信するために確立する)コネクションごとのリフレッシュ優先度を取得し、メモリ31に記憶する(ステップS501)。制御部30は、フィールドネットワーク6を介して外部機器5から受信データを受信したか否かを判断し(ステップS502)、受信データを受信していないと判断した場合(ステップS502:NO)、制御部30は、受信待ち状態となる。制御部30が、受信データを受信したと判断した場合(ステップS502:YES)、制御部30は、受信データをフィールドネットワーク通信用メモリ38の受信バッファ39に待ちデータとして記憶した後、待ちデータ記憶部35の受信データ領域352へ転送する(ステップS503)。この時点で受信バッファ39は開放される。
制御部30は、受信データを受信したコネクションIDのリフレッシュ優先度をメモリ31から読み出し(ステップS504)、読み出したリフレッシュ優先度が「優先」であるか否かを判断する(ステップS505)。制御部30が、読み出したリフレッシュ優先度が「優先」であると判断した場合(ステップS505:YES)、制御部30は、優先受信FIFO36にコネクションIDを書き込む(ステップS506)。
制御部30が、読み出したリフレッシュ優先度が「優先」ではないと判断した場合(ステップS505:NO)、制御部30は、読み出したリフレッシュ優先度が「通常」であるか否かを判断する(ステップS507)。制御部30が、読み出したリフレッシュ優先度が「通常」であると判断した場合(ステップS507:YES)、制御部30は、通常受信FIFO37にコネクションIDを書き込む(ステップS508)。
制御部30が、読み出したリフレッシュ優先度が「通常」ではないと判断した場合(ステップS507:NO)、制御部30は、受信FIFOにコネクションIDを書き込まず、リフレッシュ上限値チェック結果に基づいて、入力リフレッシュ要求を生成する(ステップS509)。
リフレッシュ上限値チェックは、任意のタイミングで定期的に実行される。図6は、本発明の実施の形態に係るプログラマブルコントローラ1の通信ユニット3aの制御部30のリフレッシュ上限値チェック処理の手順を示すフローチャートである。
図6において、通信ユニット3aの制御部30は、受信している入力リフレッシュ完了通知及び対応する入力リフレッシュ要求をクリアし(ステップS601)、入力リフレッシュ要求中であり、未完了であるコネクションの受信データの合計データサイズを算出する(ステップS602)。制御部30は、算出した合計データサイズが、入力を受け付けたリフレッシュ上限値(データサイズの上限値)以下であるか否かを判断する(ステップS603)。
制御部30が、算出した合計データサイズが、入力を受け付けたリフレッシュ上限値を超えていると判断した場合(ステップS603:NO)、制御部30は、処理を終了する。制御部30が、算出した合計データサイズが、入力を受け付けたリフレッシュ上限値以下であると判断した場合(ステップS603:YES)、制御部30は、入力リフレッシュ要求を生成する(ステップS604)。
図7は、本発明の実施の形態に係るプログラマブルコントローラ1の通信ユニット3aの制御部30のステップS604の詳細処理手順を示すフローチャートである。
通信ユニット3aの制御部30は、優先受信FIFO36にコネクションIDが記憶されているか否かを判断する(ステップS701)。制御部30が、優先受信FIFO36にコネクションIDが記憶されていると判断した場合(ステップS701:YES)、制御部30は、通常受信FIFO37にコネクションIDが記憶されているか否かを判断する(ステップS702)。
制御部30が、通常受信FIFO37にコネクションIDが記憶されていると判断した場合(ステップS702:YES)、制御部30は、直近3回は優先受信FIFO36に記憶されているコネクションIDに対応する入力リフレッシュ要求を生成したか否かを判断する(ステップS703)。制御部30が、直近3回は優先受信FIFO36に記憶されているコネクションIDに対応する入力リフレッシュ要求を生成したと判断した場合(ステップS703:YES)、制御部30は、通常受信FIFO37から読み出したコネクションIDに対応する入力リフレッシュ要求を生成する(ステップS704)。
制御部30が、優先受信FIFO36にコネクションIDが記憶されていないと判断した場合(ステップS701:NO)、制御部30は、通常受信FIFO37にコネクションIDが記憶されているか否かを判断する(ステップS705)。制御部30が、通常受信FIFO37にコネクションIDが記憶されていると判断した場合(ステップS705:YES)、制御部30は、通常受信FIFO37から読み出したコネクションIDに対応する入力リフレッシュ要求を生成する(ステップS704)。生成した入力リフレッシュ要求はハンドシェイク領域351に記憶する。
制御部30が、通常受信FIFO37にコネクションIDが記憶されていないと判断した場合(ステップS702:NO)、及び直近3回のうち、少なくとも1回は通常受信FIFO37に記憶されているコネクションIDに対応する入力リフレッシュ要求を生成したと判断した場合(ステップS703:NO)、制御部30は、優先受信FIFO36から読み出したコネクションIDに対応する入力リフレッシュ要求を生成する(ステップS706)。制御部30が、通常受信FIFO37にコネクションIDが記憶されていないと判断した場合(ステップS705:NO)、入力リフレッシュ要求を生成することなく処理を終了する。
図8は、本発明の実施の形態に係るプログラマブルコントローラ1のCPUユニット2の制御部20の処理手順を示すフローチャートである。図8において、CPUユニット2の制御部20は、リフレッシュ優先度が「最優先」である全てのコネクションIDに対応する受信データを入力リフレッシュ処理によりCPUユニット2へ転送し(ステップS801)、一のコネクションIDを選択し(ステップS802)、ハンドシェイク領域351に選択したコネクションIDに対応する入力リフレッシュ要求が存在するか否かを判断する(ステップS803)。
制御部20が、入力リフレッシュ要求が存在すると判断した場合(ステップS803:YES)、制御部20は、受信データ領域352から対応する受信データを読み出し(ステップS804)、入力リフレッシュ完了通知を送信する(ステップS805)。制御部20が、入力リフレッシュ要求が存在しないと判断した場合(ステップS803:NO)、制御部20は、ステップS804、ステップS805をスキップする。
制御部20は、全てのコネクションIDを選択したか否かを判断し(ステップS806)、制御部20が、まだ選択していないコネクションIDが存在すると判断した場合(ステップS806:NO)、制御部20は、次のコネクションIDを選択し(ステップS807)、処理をステップS803へ戻して上述した処理を繰り返す。制御部20が、全てのコネクションIDを選択したと判断した場合(ステップS806:YES)、制御部20は、処理を終了する。
これにより、待ちデータのデータサイズが、入力を受け付けたリフレッシュ上限値以下である場合、入力を受け付けたリフレッシュ優先度の高いコネクションを優先して、1スキャン当たりでCPUユニット2とユニット間通信すべきコネクションのユニット間通信要求を生成することにより、1スキャン当たりのユニット間通信に要する時間を平滑化するとともに、優先度の高いコネクションの入出力応答性の低下を抑制することができる。
同様に、図9は、本発明の実施の形態に係るプログラマブルコントローラ1のフィールドネットワーク通信で送信するデータを出力リフレッシュによりCPUユニット2から転送する場合を示す機能ブロック図である。図9において、CPU等で構成されているCPUユニット2の構成は、入力リフレッシュ時と同様であることから詳細な説明は省略する。
図9において、CPU等で構成されているCPUユニット2の制御部20は、上限値情報入力受付部22、及び優先度入力受付部23として機能する。上限値情報入力受付部22は、1スキャン当たりに入出力(データ通信)することが可能なリフレッシュ上限値の入力を受け付ける。1スキャン当たりに入力することが可能な入力リフレッシュ上限値と出力することが可能な出力リフレッシュ上限値とを、別々に入力を受け付けても良いし、合算したリフレッシュ上限値として入力を受け付けても良い。
リフレッシュ上限値の入力は、本実施の形態に係るプログラマブルコントローラ1に接続されている演算表示装置4を介して受け付ける。入力を受け付けたリフレッシュ上限値は、通信線を介してCPUユニット2及び通信ユニット3aへ送信され、CPUユニット2内のメモリ21及び通信ユニット3a内のメモリ31へ記憶される。また、通信線を介してCPUユニット2へ送信したリフレッシュ上限値をCPUユニット2内のメモリ21へ記憶した上で、ユニット間通信により通信ユニット3aへ転送してメモリ31に記憶しても良い。つまり、CPUユニット2と通信ユニット3aとは、リフレッシュ上限値について情報共有している。
優先度入力受付部23は、通信ユニット3aがフィールドネットワーク6を介して外部機器5とデータ通信するために確立するコネクションごとに、少なくとも通信ユニット3aがデータを送受信するコネクションを識別するコネクションID、データを送受信するために必要となる情報(例えば送受信の相手方のアドレス、送受信の区別等に関する情報、送受信するデータのデータサイズ、通信周期等)、そして入出力リフレッシュに対するコネクション間の相対的な優先度(リフレッシュ優先度)の入力を受け付ける。また、送受信データを記憶する待ちデータ記憶部35内のアドレスについては、静的に特定される場合には入力を受け付ける必要はない。しかし、メモリを有効に活用すること等を目的として動的に特定する場合には、別途入力を受け付けても良い。
リフレッシュ優先度の入力は、本実施の形態に係るプログラマブルコントローラ1に接続されている演算表示装置4を介して受け付ける。入力を受け付けたリフレッシュ優先度は、通信線を介してCPUユニット2及び通信ユニット3aへ送信され、CPUユニット2内のメモリ21及び通信ユニット3a内のメモリ31へ記憶される。なお、通信線を介してCPUユニット2へ送信してCPUユニット2内のメモリ21へ記憶した上で、ユニット間通信によって通信ユニット3aへと転送し、メモリ31に記憶しても良い。つまり、CPUユニット2と通信ユニット3aとは、リフレッシュ優先度について情報共有している。
なお上述したコネクションID、データを送受信するために必要となる情報に関しても、同様に情報共有している。
CPUユニット2とのユニット間通信のための待ちデータ記憶部35はバッファメモリとして機能し、例えば2ポートメモリで構成される。待ちデータ記憶部35は、送信データを一次記憶する送信データ領域353の他、CPUユニット2との間で同時性を維持するために使用するフラグ情報、排他制御で使用するセマフォを配置したハンドシェイク領域351を有する。
また、リフレッシュ優先度制御を行うために、優先送信FIFO92と通常送信FIFO93とを備えている。
通信ユニット3aの動作を制御する制御部30のデータ通信部32は、コネクションごとに設定している送信間隔を計時する、内蔵する送信タイマ40がタイムアップした場合、待ちデータ記憶部35の送信データ領域353に一時記憶してある、タイムアップしたコネクションに対応する送信データを、CPUユニット2が書き込み中でない場合には、フィールドネットワーク通信用メモリ38の送信バッファ91へ転送し、フィールドネットワーク通信制御部34へデータ送信を依頼する。
なお、制御部30は、例えばセマフォ等の仕組みを用いて、待ちデータ記憶部35においてCPUユニット2と通信ユニット3aとの間でいずれか一方が書き込み中のデータを他方が読み出さないよう排他制御する。待ちデータ記憶部35の送信データ領域353に記憶されている送信データをCPUユニット2が書き込み中である場合、送信バッファ91への転送を行うことなく、フィールドネットワーク通信制御部34にデータ送信を依頼する。これは、スキャンタイムTに比較して、コネクションの送信間隔が短い場合に生じうる現象であり、送信バッファ91に残存しているコネクションに対応する前回の送信データを再送信することになる。これにより、同一コネクションのデータの同時性を確保することができる。
フィールドネットワーク通信制御部34へデータ送信を依頼した後、依頼した送信データに対応するコネクションのリフレッシュ優先度が「優先」である場合は優先送信FIFO92に、「通常」である場合は通常送信FIFO93に、それぞれコネクションIDを書き込む。リフレッシュ優先度が「最優先」である場合には、無条件で毎スキャン、リフレッシュされるので、特段の処理は不要である。
以下、送信データの同時性を維持してCPUユニット2から送信データを受け取る方法について説明する。図10は、本発明の実施の形態に係るプログラマブルコントローラ1のフィールドネットワーク通信での送信データ転送方法を示すシーケンス図である。
図10において、送信データの同時性を維持してCPUユニット2から通信ユニット3aへ転送するために、CPUユニット2と通信ユニット3aとは、待ちデータ記憶部35のハンドシェイク領域351を用いてユニット間通信する。待ちデータ記憶部35は、全てのコネクションが独立して通信を行ってもユニット間通信に支障が出ない十分なメモリ容量を確保しており、複数コネクションのユニット間通信を独立して要求することができる。
まず、通信ユニット3aの制御部30に内蔵する送信タイマ40のタイムアップをトリガとして、所定のコネクションIDに対応する送信データの送信を開始する(1001)。具体的には、所定のコネクションIDに対応する送信データを、待ちデータ記憶部35の送信データ領域353から送信バッファ91へ送信する(1002)。そして、制御部30は、所定の条件を満たしている場合には、所定のコネクションIDの出力リフレッシュ要求(ユニット間通信要求)をCPUユニット2へ通知する(1003)。具体的には、待ちデータ記憶部35のハンドシェイク領域351に、生成した出力リフレッシュ要求を記憶しておき、CPUユニット2が任意のタイミングで確認する。
CPUユニット2は、通信ユニット3aの出力リフレッシュ要求を所定のタイミングで確認し(1004)、所定のコネクションIDによる送信データを送信データ領域353へ書き込む(1005)。所定のタイミングとは、各スキャンのプログラム実行後の出力リフレッシュ処理開始のタイミングである。CPUユニット2は、まずリフレッシュ優先度が「最優先」であるコネクションの送信データを全て、待ちデータ記憶部35の送信データ領域353へ送信する。次に、ハンドシェイク領域351の出力リフレッシュ要求を確認し、対応するコネクションIDの送信データを待ちデータ記憶部35の送信データ領域353へ送信した後、コネクションIDに対応する出力リフレッシュ完了を通信ユニット3aへ通知する(1006)。具体的には、待ちデータ記憶部35のハンドシェイク領域351に、該コネクションIDに対応する出力リフレッシュ完了通知を記憶しておく。通信ユニット3aの制御部30は、所定のタイミングで出力リフレッシュ完了通知が記憶されていることを確認し、出力リフレッシュ完了通知が記憶されている場合には、対応する出力リフレッシュ要求(ユニット間通信要求)をクリアするとともに、該出力リフレッシュ完了通知をクリアする(1007)。
図9に戻って、制御部30の要求生成部33は、CPUユニット2に対して要求していて、しかも完了していない全ての出力リフレッシュ要求に対応する各コネクションの送信データのデータサイズを累計することにより、要求中であり未完了である出力リフレッシュの合計データサイズを算出する。算出した合計データサイズが、入力を受け付けたリフレッシュ上限値を超えている場合には、新たな出力リフレッシュ要求は行わない。
算出した合計データサイズが、入力を受け付けたリフレッシュ上限値以下である場合、要求生成部33は、優先送信FIFO92を確認する。出力リフレッシュ要求待ちのコネクションIDが存在する場合、該コネクションIDに対応する出力リフレッシュ要求を生成して、CPUユニット2へ通知する。
要求生成部33は、出力リフレッシュ要求待ちのコネクションIDが見つからない場合、通常送信FIFO93を確認する。出力リフレッシュ要求待ちのコネクションIDが存在する場合、該コネクションIDに対応する出力リフレッシュ要求を生成して、CPUユニット2へ通知する。
ただし、優先送信FIFO92に出力リフレッシュ要求待ちのコネクションIDが存在する場合であっても、通常送信FIFO93に出力リフレッシュ要求待ちのコネクションIDが存在し、しかも直近所定回数、例えば直近3回連続して優先送信FIFO92のコネクションIDに対応する出力リフレッシュ要求を生成していたときには、通常送信FIFO93の出力リフレッシュ要求待ちのコネクションIDに対応する出力リフレッシュ要求を生成して、CPUユニット2へ通知する。これにより、コネクションのリフレッシュ優先度が「優先」である送信データの割合が高い場合、コネクションのリフレッシュ優先度が「通常」であるコネクションが出力リフレッシュを行うことができない状態に陥ることを未然に回避することができる。
要求生成部33は、出力リフレッシュ要求を生成して、CPUユニット2へ通知した後、現在CPUユニット2に対して要求していて、しかも完了していない全ての出力リフレッシュ要求に対応する各コネクションの送信データのデータサイズを再度累計し、要求中であり未完了である出力リフレッシュの合計データサイズを算出する。算出した合計データサイズが、入力を受け付けたリフレッシュ上限値を超えている場合には、処理を終了し、超えていない場合には上述した処理を繰り返す(以下、上述した処理を送信要求生成処理という)。
以下、リフレッシュ優先度に応じた送信FIFOを用いたデータ送信処理について、フローチャートに基づいて詳細に説明する。なお、本実施の形態では、優先送信FIFO92及び通常送信FIFO93に、それぞれコネクションIDを書き込む都度、合計データサイズがリフレッシュ上限値を超えているか否かを確認して、送信要求生成処理を実行する。しかし、合計データサイズがリフレッシュ上限値を超えている場合、新たな出力リフレッシュ要求は行わないので、CPUユニット2が出力リフレッシュ処理を完了して合計データサイズがリフレッシュ上限値以下となり次第、出力リフレッシュ要求を行う必要がある。そのため、CPUユニット2からの出力リフレッシュ完了通知を確認するとともに、出力リフレッシュ完了が通知されている場合、対応する出力リフレッシュ要求(ユニット間通信要求)をクリアするとともに、該出力リフレッシュ完了通知をクリアする処理を行った上で、出力リフレッシュ要求中でありながら未完了のコネクションの送信データの合計データサイズを再度累計し、合計データサイズの値とリフレッシュ上限値との比較結果に基づいて送信要求生成処理を行う一連の処理フローを定期的に実行すれば良い。
図11は、本発明の実施の形態に係るプログラマブルコントローラ1の通信ユニット3aの制御部30の送信処理手順を示すフローチャートである。通信ユニット3aの制御部30は、CPUユニット2又は演算表示装置4から、1スキャン当たりに入出力することが可能なリフレッシュ上限値、及び通信ユニット3aがデータを送受信する(データ通信するために確立する)コネクションごとのリフレッシュ優先度を取得し、メモリ31に記憶する(ステップS1101)。なお、プログラマブルコントローラ1を運用する前に事前に取得して記憶してある場合、ステップS1101は省略することができる。制御部30は、送信コネクションごとに送信タイミングを計時している送信タイマ40がタイムアップしたか否かを判断し(ステップS1102)、制御部30が、タイムアップしていないと判断した場合(ステップS1102:NO)、制御部30は、タイムアップ待ち状態となる。制御部30が、タイムアップしたと判断した場合(ステップS1102:YES)、制御部30は、タイムアップした送信タイマ40に対応するコネクションの送信データ領域353に対してCPUユニット2が書き込み中でなければ、該コネクションの送信データを送信バッファ91の所定領域に転送する(ステップS1103)。その後、フィールドネットワーク通信制御部34にデータ送信を指示する。フィールドネットワーク通信制御部34は指示を受けると直ちに送信を行う。
制御部30は、送信データを送信したコネクションIDのリフレッシュ優先度をメモリ31から読み出し(ステップS1104)、読み出したリフレッシュ優先度が「優先」であるか否かを判断する(ステップS1105)。制御部30が、読み出したリフレッシュ優先度が「優先」であると判断した場合(ステップS1105:YES)、制御部30は、優先送信FIFO92にコネクションIDを書き込む(ステップS1106)。
制御部30が、読み出したリフレッシュ優先度が「優先」ではないと判断した場合(ステップS1105:NO)、制御部30は、読み出したリフレッシュ優先度が「通常」であるか否かを判断する(ステップS1107)。制御部30が、読み出したリフレッシュ優先度が「通常」であると判断した場合(ステップS1107:YES)、制御部30は、通常送信FIFO93にコネクションIDを書き込む(ステップS1108)。
制御部30が、読み出したリフレッシュ優先度が「通常」ではないと判断した場合(ステップS1107:NO)、制御部30は、送信FIFOにコネクションIDを書き込まず、リフレッシュ上限値チェック結果に基づいて、出力リフレッシュ要求を生成する(ステップS1109)。
リフレッシュ上限値チェックは、任意のタイミングで定期的に実行される。図12は、本発明の実施の形態に係るプログラマブルコントローラ1の通信ユニット3aの制御部30のリフレッシュ上限値チェック処理の手順を示すフローチャートである。
図12において、通信ユニット3aの制御部30は、受信している出力リフレッシュ完了通知及び対応する出力リフレッシュ要求をクリアし(ステップS1201)、出力リフレッシュ要求中であり、未完了であるコネクションの送信データの合計データサイズを算出する(ステップS1202)。制御部30は、算出した合計データサイズが、入力を受け付けたリフレッシュ上限値(データサイズの上限値)以下であるか否かを判断する(ステップS1203)。
制御部30が、算出した合計データサイズが、入力を受け付けたリフレッシュ上限値を超えていると判断した場合(ステップS1203:NO)、制御部30は、処理を終了する。制御部30が、算出した合計データサイズが、入力を受け付けたリフレッシュ上限値以下であると判断した場合(ステップS1203:YES)、制御部30は、出力リフレッシュ要求を生成する(ステップS1204)。
図13は、本発明の実施の形態に係るプログラマブルコントローラ1の通信ユニット3aの制御部30のステップS1204の詳細処理手順を示すフローチャートである。
通信ユニット3aの制御部30は、優先送信FIFO92にコネクションIDが記憶されているか否かを判断する(ステップS1301)。制御部30が、優先送信FIFO92にコネクションIDが記憶されていると判断した場合(ステップS1301:YES)、制御部30は、通常送信FIFO93にコネクションIDが記憶されているか否かを判断する(ステップS1302)。
制御部30が、通常送信FIFO93にコネクションIDが記憶されていると判断した場合(ステップS1302:YES)、制御部30は、直近3回は優先送信FIFO92に記憶されているコネクションIDに対応する出力リフレッシュ要求を生成したか否かを判断する(ステップS1303)。制御部30が、直近3回は優先送信FIFO92に記憶されているコネクションIDに対応する出力リフレッシュ要求を生成したと判断した場合(ステップS1303:YES)、制御部30は、通常送信FIFO93から読み出したコネクションIDに対応する出力リフレッシュ要求を生成する(ステップS1304)。
制御部30が、優先送信FIFO92にコネクションIDが記憶されていないと判断した場合(ステップS1301:NO)、制御部30は、通常送信FIFO93にコネクションIDが記憶されているか否かを判断する(ステップS1305)。制御部30が、通常送信FIFO93にコネクションIDが記憶されていると判断した場合(ステップS1305:YES)、制御部30は、通常送信FIFO93から読み出したコネクションIDに対応する出力リフレッシュ要求を生成する(ステップS1304)。生成した出力リフレッシュ要求はハンドシェイク領域351に記憶する。
制御部30が、通常送信FIFO93にコネクションIDが記憶されていないと判断した場合(ステップS1302:NO)、及び直近3回のうち、少なくとも1回は通常送信FIFO93に記憶されているコネクションIDに対応する出力リフレッシュ要求を生成したと判断した場合(ステップS1303:NO)、制御部30は、優先送信FIFO92から読み出したコネクションIDに対応する出力リフレッシュ要求を生成する(ステップS1306)。制御部30が、通常送信FIFO93にコネクションIDが記憶されていないと判断した場合(ステップS1305:NO)、出力リフレッシュ要求を生成することなく処理を終了する。
図14は、本発明の実施の形態に係るプログラマブルコントローラ1のCPUユニット2の制御部20の処理手順を示すフローチャートである。図14において、CPUユニット2の制御部20は、リフレッシュ優先度が「最優先」である全てのコネクションIDに対応する送信データを出力リフレッシュ処理によりCPUユニット2から転送し(ステップS1401)、一のコネクションIDを選択し(ステップS1402)、ハンドシェイク領域351に選択したコネクションIDに対応する出力リフレッシュ要求が存在するか否かを判断する(ステップS1403)。
制御部20が、出力リフレッシュ要求が存在すると判断した場合(ステップS1403:YES)、制御部20は、送信データ領域353へ対応する送信データを転送し(ステップS1404)、出力リフレッシュ完了通知を送信する(ステップS1405)。制御部20が、出力リフレッシュ要求が存在しないと判断した場合(ステップS1403:NO)、制御部20は、ステップS1404、ステップS1405をスキップする。
制御部20は、全てのコネクションIDを選択したか否かを判断し(ステップS1406)、制御部20が、まだ選択していないコネクションIDが存在すると判断した場合(ステップS1406:NO)、制御部20は、次のコネクションIDを選択し(ステップS1407)、処理をステップS1403へ戻して上述した処理を繰り返す。制御部20が、全てのコネクションIDを選択したと判断した場合(ステップS1406:YES)、制御部20は、処理を終了する。
以上のように本実施の形態によれば、スキャンタイムTの定時性を維持しつつ、入出力応答性が要求されるデータを優先的にユニット間通信することができる。すなわち、CPUユニット2のスキャンタイムのばらつきをある程度抑えて、安定した制御処理を行うことができるとともに、同時性よりも入出力応答性が要求されるデータを最優先で転送しつつ、同時性を保って転送することが要求されるデータについて通信レスポンスが劣化すること(入出力応答性の低下)を抑制することができる。
なお、演算表示装置4は、CPUユニット2とデータ通信することが可能に接続してあり、作成した制御プログラムをCPUユニット2へ送信する。図15は、本発明の実施の形態に係るプログラマブルコントローラ1と接続してある演算表示装置4の、CPU等の制御部を用いた場合の構成を示すブロック図である。
図15に示すように本実施の形態に係る演算表示装置4は、少なくとも制御部(CPU)41、メモリ42、ハードディスク等の記憶装置43、I/Oインタフェース44、ビデオインタフェース45、通信インタフェース46、可搬型ディスクドライブ47及び上述したハードウェアを接続する内部バス48で構成されている。
制御部41は、内部バス48を介して演算表示装置4の上述したようなハードウェア各部と接続されており、上述したハードウェア各部の動作を制御するとともに、記憶装置43に記憶しているコンピュータプログラム100に従って、種々のソフトウェア的機能を実行する。メモリ42は、SRAM、SDRAM等の揮発性メモリで構成され、コンピュータプログラム100の実行時にロードモジュールが展開され、コンピュータプログラム100の実行時に発生する一時的なデータ等を記憶する。
記憶装置43は、内蔵される固定型記憶装置(ハードディスク)、ROM等で構成されている。記憶装置43に記憶しているコンピュータプログラム100は、プログラム及びデータ等の情報を記録したDVD、CD−ROM等の可搬型記録媒体90から、可搬型ディスクドライブ47によりダウンロードされ、実行時には記憶装置43からメモリ42へ展開して実行される。もちろん、通信インタフェース46を介してネットワークに接続されている外部のコンピュータからダウンロードされたコンピュータプログラムであっても良い。
I/Oインタフェース44は、キーボード441、マウス442等の入力装置と接続され、データの入力を受け付ける。また、ビデオインタフェース45は、CRTモニタ、LCD等の表示装置451と接続され、所定の画像を表示する。
通信インタフェース46は内部バス48に接続されており、インターネット、LAN、WAN等の外部のネットワークに接続されることにより、外部のコンピュータ等とデータ通信することが可能となっている。また、通信線を介してCPUユニット2へデータ通信することが可能となっている。
なお、本実施の形態では、演算表示装置4はCPUユニット2と接続する構成としているが、拡張ユニット3と接続しても良い。すなわち、プログラマブルコントローラ1の通信ポートに接続することができれば、接続形態を問うものではない。
また、本発明は上記実施の形態に限定されるものではなく、本発明の趣旨の範囲内であれば多種の変形、置換等が可能であることは言うまでもない。例えば、外部機器5を識別する情報に対応付けて、確立するべきコネクションに関する情報及び該コネクションに設定するべき優先度に関する情報を記憶しても良い。このようにすることで、データ通信する外部機器5を特定した時点でデータ通信するコネクションの優先度に関する情報を取得することができ、入力を受け付ける必要がない。