(57)【特許請求の範囲】
【請求項１】
ユーザプログラムを周期的に実行する基本ユニットと、該基本ユニットと外部機器とに接続される拡張ユニットとを有するプログラマブルコントローラであって、
前記拡張ユニットは、
前記外部機器と接続するためのインターフェースと、
前記インターフェースに入力される前記外部機器からの信号を、予め設定された周期でサンプリングするサンプリング手段と、
前記サンプリング手段によりサンプリングされたデータを順次記憶する記憶部と、
前記基本ユニットからの読み出し要求に応じて、前記記憶部に記憶されているデータを前記基本ユニットに出力するデータ収集制御手段と、を備え、
前記データ収集制御手段は、
前記読み出し要求に含まれる読み出し対象のデータ個数に基づいて、前記記憶部に記憶されている特定の先頭データから、記憶された順に該データ個数のデータを読み出して出力した後、
次回の前記読み出し要求に応じるために前記特定の先頭データとする対象を前記データ個数に応じて変更させることを特徴とするプログラマブルコントローラ。
【請求項２】
前記記憶部は、記憶されているデータの記憶位置をシフトさせるシフトレジスタを含み、
前記データ収集制御手段は、前記シフトレジスタに最も古く記憶されているデータを、前記特定の先頭データにすることを特徴とする請求項１に記載のプログラマブルコントローラ。
【請求項３】
前記記憶部は、終端の記憶位置と先端の記憶位置が連結されたリングバッファを含み、
前記データ収集制御手段は、前記リングバッファにおいて次の読み出し先を示すポインタにて特定されるデータを、前記特定の先頭データにすることを特徴とする請求項１に記載のプログラマブルコントローラ。
【請求項４】
前記基本ユニットと前記拡張ユニットの双方からアクセス可能な共有記憶領域を含む第１の記憶部と、前記記憶部である第２の記憶部とを有し、
前記データ収集制御手段は、前記外部機器からサンプリングされたデータを前記第２の記憶部に順に記憶させ、前記基本ユニットからの読み出し要求に応じて、前記第２の記憶部に格納されたデータを前記第１の記憶部の前記共有記憶領域に記憶させることを特徴とする請求項１乃至３のいずれか一項に記載のプログラマブルコントローラ。
【請求項５】
前記データ収集制御手段は、前記基本ユニットからのバッファリング要求に応じて前記外部機器からサンプリングしたデータを前記第２の記憶部に入力して格納することを特徴とする請求項４に記載のプログラマブルコントローラ。
【請求項６】
前記データ収集制御手段は、前記基本ユニットからの前記バッファリング要求に応じた前記第２の記憶部へのデータの格納が完了すると、前記共有記憶領域に格納完了情報を格納し、
前記基本ユニットは、前記ユーザプログラムを実行する中で前記格納完了情報を周期的に判定し、前記格納完了情報が格納されていれば、前記共有記憶領域からの読み出し要求を発行することを特徴とする請求項５に記載のプログラマブルコントローラ。
【請求項７】
前記データ収集制御手段は、前記基本ユニットからのバッファリング要求に応じた前記第２の記憶部へのデータの格納が完了すると前記基本ユニットに対して割り込み要求を出力する割り込み要求部を有し、
前記基本ユニットは前記割り込み要求に応じて、前記共有記憶領域からの読み出し要求を発行することを特徴とする請求項５に記載のプログラマブルコントローラ。
【請求項８】
前記基本ユニットは、前記ユーザプログラムに含まれた読み出し命令およびバッファリング命令それぞれの実行により、前記拡張ユニットに前記読み出し要求および前記バッファリング要求それぞれを発行することを特徴とする請求項５乃至７のいずれか一項に記載のプログラマブルコントローラ。
【請求項９】
前記基本ユニットは、前記読み出し要求として、前記拡張ユニットの識別情報と前記共有記憶領域内のアドレスとデータ長とを指定し、
前記識別情報で特定される前記拡張ユニットの前記データ収集制御手段は、前記第２の記憶部に格納されたデータを、指定された前記アドレスとデータ長とにより特定される記憶領域に出力することを特徴とする請求項４乃至８のいずれか一項に記載のプログラマブルコントローラ。
【請求項１０】
前記第２の記憶部および第３の記憶部を前記基本ユニットと接続するためのインターフェース部を更に有し、
前記インターフェース部は、前記読み出し要求に応じて、前記読み出し要求が前回の読み出し要求のリトライでない場合には前記共有記憶領域からデータを読み出すとともに該データを複製して前記第３の記憶部に保存し、前記読み出し要求が前回の読み出し要求のリトライである場合には、前記第３の記憶部からデータを読み出すことを特徴とする請求項４乃至９のいずれか一項に記載のプログラマブルコントローラ。
【請求項１１】
前記第１の記憶部は、前記ユーザプログラムで設定される前記拡張ユニットによる動作のパラメータを記憶するデバイス領域をさらに含むことを特徴とする請求項４乃至１０のいずれか一項に記載のプログラマブルコントローラ。
【請求項１２】
前記データ収集制御手段はさらに、前記基本ユニットからの書き込み要求に応じて前記基本ユニットからのデータを前記共有記憶領域に格納し、前記共有記憶領域に格納したデータを前記第２の記憶部に入力し、前記第２の記憶部に格納されたデータを前記外部機器に、前記入力された順序で出力することを特徴とする請求項４乃至１１のいずれか一項に記載のプログラマブルコントローラ。
【請求項１３】
ユーザプログラムを周期的に実行する基本ユニットと外部機器とに接続されるプログラマブルコントローラの拡張ユニットであって、
前記外部機器と接続するためのインターフェースと、
前記インターフェースに入力される前記外部機器からの信号を、予め設定された周期でサンプリングするサンプリング手段と、
前記サンプリング手段によりサンプリングされたデータを順次記憶する記憶部と、
前記基本ユニットからの読み出し要求に応じて、前記記憶部に記憶されているデータを前記基本ユニットに出力するデータ収集制御手段とを備え、
前記データ収集制御手段は、
前記読み出し要求に含まれる読み出し対象のデータ個数に基づいて、前記記憶部に記憶されている特定の先頭データから、記憶された順に該データ個数のデータを読み出して出力した後、
次回の前記読み出し要求に応じるために前記特定の先頭データとする対象を前記データ個数に応じて変更させることを特徴とするプログラマブルコントローラの拡張ユニット。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラマブル・ロジック・コントローラ及びプログラマブル・ロジック・コントローラの拡張ユニット、制御方法および制御プログラムに関する。
【背景技術】
【０００２】
特許文献１が示すようにプログラマブル・ロジック・コントローラ（ＰＬＣ）の基本ユニットには拡張ユニットが接続される。拡張ユニットの中には、外部機器等から収集したデータを交換バッファに格納し、基本ユニットにおける読み出し処理に応じて収集したデータを、共有メモリを介して基本ユニットに出力するものがある。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０１４−０５２６７２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかしこの交換バッファ方式では、たとえば共有メモリのサイズの制約等により、収集したデータを所定サイズのページを単位として基本ユニットが読み取るため、ページの切り替えが必要となる。ページの切り替えは、基本ユニットが実行するユーザプログラムにより、読み取り対象のページ番号の指定を明示的にプログラムしておくことで実現されていた。また共有メモリにリングバッファを構成して、そこにデータを直接バッファリングする方式も提案されているが、この方式ではポインタの管理をユーザプログラムで行う必要があった。いずれにしても従来の方式はユーザプログラムの複雑化をもたらし、ユーザの設計負担を重くする。さらにプログラムの可読性を低下させて、プログラムの明快さを損なう。さらに同期処理をユーザプログラムのレベルで実行させると、それに伴う処理負荷も増大する。
【０００５】
本発明は上記従来例に鑑みて成されたもので、拡張ユニットによりバッファ管理を一元的に行うことで基本ユニットによるバッファの管理負担を軽減し、ひいてはプログラム設計の負担を軽減しつつ大量のデータの交換を行えるＰＬＣを提供することを目的とする。さらに、プログラムの可読性を向上させること、また基本ユニットと拡張ユニットとの間のデータの交換を効率的に行わせることを目的とする。
【課題を解決するための手段】
【０００６】
上記目的を達成するために本発明は、たとえば、
ユーザプログラムを周期的に実行する基本ユニットと、該基本ユニットと外部機器とに接続される拡張ユニットとを有するプログラマブルコントローラであって、
前記拡張ユニットは、
前記外部機器と接続するためのインターフェースと、
前記インターフェースに入力される前記外部機器からの信号を、予め設定された周期でサンプリングするサンプリング手段と、
前記サンプリング手段によりサンプリングされたデータを順次記憶する記憶部と、
前記基本ユニットからの読み出し要求に応じて、前記記憶部に記憶されているデータを前記基本ユニットに出力するデータ収集制御手段と、を備え、
前記データ収集制御手段は、
前記読み出し要求に含まれる読み出し対象のデータ個数に基づいて、前記記憶部に記憶されている特定の先頭データから、記憶された順に該データ個数のデータを読み出して出力した後、
次回の前記読み出し要求に応じるために前記特定の先頭データとする対象を前記データ個数に応じて変更させることを特徴とする。
【０００７】
また他の側面によれば本発明は、たとえば、
ユーザプログラムを周期的に実行する基本ユニットと外部機器とに接続されるプログラマブルコントローラの拡張ユニットであって、
前記外部機器と接続するためのインターフェースと、
前記インターフェースに入力される前記外部機器からの信号を、予め設定された周期でサンプリングするサンプリング手段と、
前記サンプリング手段によりサンプリングされたデータを順次記憶する記憶部と、
前記基本ユニットからの読み出し要求に応じて、前記記憶部に記憶されているデータを前記基本ユニットに出力するデータ収集制御手段と、を備え、
前記データ収集制御手段は、
前記読み出し要求に含まれる読み出し対象のデータ個数に基づいて、前記記憶部に記憶されている特定の先頭データから、記憶された順に該データ個数のデータを読み出して出力した後、
次回の前記読み出し要求に応じるために前記特定の先頭データとする対象を前記データ個数に応じて変更させることを特徴とする。
【発明の効果】
【０００８】
本発明によれば、プログラム設計の負担を軽減しつつ大量のデータの交換を行える。さらに、プログラムの可読性を向上させる。また基本ユニットと拡張ユニットとの間のデータの交換を効率的に行わせることができる。
【図面の簡単な説明】
【０００９】
【図１】ＰＬＣシステムの一例を示す図
【図２】ユーザプログラムの一例を示す図
【図３】プログラム作成支援装置の一例を示す図
【図４】ＰＬＣの一例を示す図
【図５】スキャンタイムを説明するための図
【図６】ベースレス・ビルディングタイプのＰＬＣの一例を示す図
【図７】基本ユニットおよび拡張ユニットそれぞれのＣＰＵが実現する機能の一例を示す図
【図８】プログラム作成支援装置により実現される機能の一例を示す図
【図９】（Ａ）プログラム作成支援装置により表示されるバッファリング設定のユーザインターフェースの一例を示す図、（Ｂ）プログラム作成支援装置により表示されるバッファリング設定のラダープログラムの一例を示す図
【図１０】バッファリングされたデータを読み出すためのラダープログラムの一例を示す図
【図１１】バッファリングしたデータを読み出す動作の一例を説明する模式図
【図１２】共有メモリの構成の一例を示す図
【図１３】基本ユニットによる、バファリングされたデータの読み出し手順の一例を示すフローチャート
【図１４】拡張ユニットによる、バファリングおよび読み出し手順の一例を示すフローチャート
【図１５】バッファリングされたデータを読み出すためのラダープログラムの他の例を示す図
【図１６】バッファリングしたデータを読み出す動作の他の例を説明する模式図およびそのラダープログラムの例を示す図
【図１７】バッファリングしたデータを読み出す動作の更に他の例を説明する模式図
【図１８】バッファリングされたデータのバックアップを伴う読み出し手順の一例を示すフローチャート
【図１９】バッファへデータを書き込む動作の一例を説明する模式図
【発明を実施するための形態】
【００１０】
［第１実施形態］
以下に本発明の一実施形態を示す。以下で説明される個別の実施形態は、本発明の上位概念、中位概念および下位概念など種々の概念を理解するために役立つであろう。また、本発明の技術的範囲は、特許請求の範囲によって確定されるのであって、以下の個別の実施形態によって限定されるわけではない。
【００１１】
はじめにプログラマブル・ロジック・コントローラ（ＰＬＣ、単にプログラマブルコントローラと呼ばれてもよい）を当業者にとってよりよく理解できるようにするために、一般的なＰＬＣの構成とその動作について説明する。
【００１２】
図１は、本発明の実施の形態によるプログラマブル・ロジック・コントローラシステムの一構成例を示す概念図である。図１に示すように、このシステムは、ラダープログラムなどのユーザプログラムの編集を行うためのプログラム作成支援装置１と、工場等に設置される各種制御装置を統括的に制御するためのＰＬＣ（プログラマブル・ロジック・コントローラ）２とを備えている。ＰＬＣ２は、ＣＰＵが内蔵された基本ユニット３と１つないし複数の拡張ユニット４を備えている。基本ユニット３に対して１つないし複数の拡張ユニット４が着脱可能となっている。基本ユニット３は基本ユニットと呼ばれることもある。あるいはＣＰＵユニットと呼ぶこともある。
【００１３】
基本ユニット３には、表示部５及び操作部６が備えられている。表示部５には、基本ユニット３に取り付けられている各拡張ユニット４の動作状況などを表示することができ、表示部５の表示内容は、操作部６を操作することにより切り替えることができる。表示部５には、通常、ＰＬＣ２内のデバイスの現在値（デバイス値）やＰＬＣ２内で生じたエラー情報などが表示される。なお、デバイスとは、デバイス値を格納するために設けられたメモリ上の領域を指す名称である。デバイス値とは、入力機器からの入力状態、出力機器への出力状態およびユーザプログラム上で設定される内部リレー（補助リレー）、タイマー、カウンタ、データメモリ等の状態を示す情報である。
【００１４】
拡張ユニット４は、ＰＬＣ２の機能を拡張するために用意されており、基本ユニット３に対して側方から取り付けられる。１つ目の拡張ユニット４は、基本ユニット３に対して側方から直接的に取り付けられる。２つ目以降の拡張ユニット４は、既に取り付けられている拡張ユニット４に対して、側方から直列的に取り付けられる。たとえば、基本ユニット３の右側面と拡張ユニット４の左側面とが連結面になっている。同様に、１つ目の拡張ユニット４の右側面の形状等は基本ユニット３の右側面とほぼ同じであるため、１つ目の拡張ユニット４の右側面に２つ目の拡張ユニット４の左側面が連結される。このような連結方式は、数珠つなぎ方式とかデイジーチェーン方式と呼ばれてもよい。各連結面にはコネクタが設けられており、通信や電力供給を行うためのバスもコネクタを介して連結される。このようにして、基本ユニット３と複数の拡張ユニット４が直列的に取り付けられると、各拡張ユニット４内に備えられた配線（例：バス）を介して、各拡張ユニット４が基本ユニット３に対して通信可能に接続される。各拡張ユニット４には、その拡張ユニット４の機能に対応する被制御装置１６（図４）が接続され、これにより、各被制御装置１６が拡張ユニット４を介して基本ユニット３に接続される。被制御装置１６には、センサなどの入力装置や、アクチュエータなどの出力装置が含まれる。また被制御装置１６はＰＬＣの外部にあることから外部装置と呼ぶこともある。
【００１５】
プログラム作成支援装置１は、たとえば、携帯可能ないわゆるノートタイプやタブレットタイプのパーソナルコンピュータであって、表示部７及び操作部８が備えられている。ＰＬＣ２を制御するためのユーザプログラムの一例であるラダープログラムは、プログラム作成支援装置１を用いて作成され、その作成されたラダープログラムは、プログラム作成支援装置１内でニモニックコードに変換される。そして、プログラム作成支援装置１を、ＵＳＢ(Universal Serial Bus)などの通信ケーブル９を介してＰＬＣ２の基本ユニット３に接続し、ニモニックコードに変換されたラダープログラムをプログラム作成支援装置１から基本ユニット３に送ると、そのラダープログラムが基本ユニット３内でマシンコードに変換され、基本ユニット３に備えられたメモリ内に記憶される。
【００１６】
なお、図１では示していないが、プログラム作成支援装置１の操作部８には、プログラム作成支援装置１に接続されたマウスなどのポインティングデバイスが含まれていてもよい。また、プログラム作成支援装置１は、ＵＳＢ以外の他の通信ケーブル９を介して、ＰＬＣ２の基本ユニット３に対して着脱可能に接続されるような構成であってもよい。
【００１７】
図２は、ラダープログラムの作成時にプログラム作成支援装置１の表示部７に表示されるラダー図１７の一例を示す図である。図２に示すように、ＰＬＣ２を制御するためのラダープログラムは、プログラム作成支援装置１の表示部７にマトリックス状に表示される複数のセル１８内に仮想デバイスのシンボル１９を適宜配置して、視覚的なリレー回路を表すラダー図１７を構築することにより作成される。
【００１８】
ラダー図１７には、たとえば、１０列×Ｎ行（Ｎは任意の自然数）のセル１８が配置されている。そして、各行のセル１８内に、図２に示す左側から右側に向かって、時系列的に仮想デバイスのシンボル１９を適宜配置することにより、視覚的なリレー回路を作成することができる。作成されるリレー回路は、１行で表される直列的なリレー回路であってもよいし、複数行に並列的に表されたリレー回路を互いに結合することにより作成された、並列的なリレー回路であってもよい。
【００１９】
図２に示すリレー回路は、入力装置からの入力信号に基づいてオン／オフされる３つの仮想デバイス（以下、「入力デバイス」と呼ぶ。）のシンボル１９ａ，１９ｂ，１９ｃと、出力装置の動作を制御するためにオン／オフされる仮想デバイス（以下、「出力デバイス」と呼ぶ。）のシンボル１９ｄとが適宜結合されることにより構成されている。
【００２０】
各入力デバイスのシンボル１９ａ，１９ｂ，１９ｃの上方に表示されている文字（「Ｒ０００１」、「Ｒ０００２」及び「Ｒ０００３」）は、その入力デバイスのデバイス名（アドレス名）２１を表している。各入力デバイスのシンボル１９ａ，１９ｂ，１９ｃの下方に表示されている文字（「フラグ１」、「フラグ２」及び「フラグ３」）は、その入力デバイスに対応付けられたデバイスコメント２２を表している。出力デバイスのシンボル１９ｄの上方に表示されている文字（「原点復帰」）は、その出力デバイスの機能を表す文字列からなるラベル２３である。
【００２１】
図２に示す例では、デバイス名「Ｒ０００１」及び「Ｒ０００２」にそれぞれ対応する２つの入力デバイスのシンボル１９ａ，１９ｂが直列的に結合されることにより、ＡＮＤ回路が構成されている。また、これらの２つの入力デバイスのシンボル１９ａ，１９ｂからなるＡＮＤ回路に対して、デバイス名「Ｒ０００３」に対応する入力デバイスのシンボル１９ｃが並列的に結合されることにより、ＯＲ回路が構成されている。すなわち、このリレー回路では、２つのシンボル１９ａ，１９ｂに対応する入力デバイスがいずれもオンした場合、又は、シンボル１９ｃに対応する入力デバイスがオンした場合にのみ、シンボル１９ｄに対応する出力デバイスがオンされるようになっている。
【００２２】
図３は、図１のプログラム作成支援装置１の電気的構成について説明するためのブロック図である。図３に示すように、プログラム作成支援装置１には、ＣＰＵ２４、表示部７、操作部８、記憶装置２５及び通信部２６が備えられている。表示部７、操作部８、記憶装置２５及び通信部２６は、それぞれＣＰＵ２４に対して電気的に接続されている。記憶装置２５は、少なくともＲＡＭを含む構成であり、ラダープログラム記憶部２５ａと、編集ソフト記憶部２５ｂとを備えている。
【００２３】
ユーザは、編集ソフト記憶部２５ｂに記憶されている編集ソフトをＣＰＵ２４に実行させて、操作部８を通じてラダープログラムを編集する。ここで、ラダープログラムの編集には、ラダープログラムの作成及び変更が含まれる。編集ソフトを用いて作成されたラダープログラムは、ラダープログラム記憶部２５ａに記憶される。また、ユーザは、必要に応じてラダープログラム記憶部２５ａに記憶されているラダープログラムを読み出し、そのラダープログラムを、編集ソフトを用いて変更することができる。通信部２６は、通信ケーブル９を介してプログラム作成支援装置１を基本ユニット３に通信可能に接続するためのものである。
【００２４】
図４は、ＰＬＣ２の電気的構成について説明するためのブロック図である。図４に示すように、基本ユニット３には、ＣＰＵ１０、表示部５、操作部６、記憶装置１２及び通信部１４が備えられている。表示部５、操作部６、記憶装置１２、及び通信部１４は、それぞれＣＰＵ１０に電気的に接続されている。記憶装置１２は、ＲＡＭやＲＯＭ、メモリカードなどを含んでもよく、ラダープログラムなどが記憶される。記憶装置１２には、プログラム作成支援装置１から入力されたラダープログラムやユーザデータが上書きして記憶される。また、記憶装置１２には基本ユニット用の制御プログラムも格納されている。
【００２５】
図５は、本発明の実施の形態に係るプログラマブルコントローラの基本ユニット３でのスキャンタイムの構成を示す模式図である。図５が示すように１つのスキャンタイムＴは、入出力のリフレッシュを行うためのユニット間通信２０１、プログラム実行２０２、ＥＮＤ処理２０４により構成されている。ユニット間通信２０１で、基本ユニット３は、ラダープログラムを実行して得られた出力データを基本ユニット３内の記憶装置１２から外部機器などに送信するとともに、受信データを含めた入力データを基本ユニット３内の記憶装置１２に取り込む。プログラム実行２０２で、基本ユニット３は、更新された入力データを用いてプログラムを実行（演算）する。基本ユニット３はプログラムの実行によりデータを演算処理する。なお、ＥＮＤ処理とは、プログラム作成支援装置１や基本ユニット３に接続された表示器（図示せず）等の外部機器とのデータ通信、システムのエラーチェック等の周辺サービスに関する処理全般を意味する。ただし、基本ユニット３が実行したラダープログラムの命令が例えば拡張ユニット４からのデータの入力（読み取り）或いは出力（書き込み）に係る命令であれば、プログラム実行２０２の中でユニット間通信を行うこともあり得る。
【００２６】
このように、プログラム作成支援装置１はユーザの操作に応じたラダープログラムを作成し、作成したラダープログラムをＰＬＣ２に転送する。ＰＬＣ２は、入出力リフレッシュ、ラダープログラムの実行およびＥＮＤ処理を１サイクル（１スキャン）として、このサイクルを周期的、すなわちサイクリックに繰り返し実行する。これにより、各種入力機器（センサ等）からのタイミング信号に基づいて、各種出力機器（モータ等）を制御する。よって、ＰＬＣ２は汎用のパーソナルコンピュータ（ＰＣ）とは全く異なる動きをする。
【００２７】
＜連結構造＞
図６（Ａ）はＰＬＣ２を構成する基本ユニット３、拡張ユニット４およびエンドユニット１１が連結される前の状態を示している。この例では、基本ユニット３の右方向に１つ以上の拡張ユニット４が連結される。最も右に位置する拡張ユニット４にはエンドユニット１１が連結される。エンドユニット１１は、最も右に位置する拡張ユニット４の右側面を保護するものであり、バスの終端機能を備えていてもよい。なお、拡張ユニット４の前面にはダイレクトアクセススイッチ２７が設けられてもよい。ダイレクトアクセススイッチ２７が操作されると、操作されたことを示す信号が通信バスを介して拡張ユニット４から基本ユニット３に伝達される。基本ユニット３は、この信号を受信することで、拡張ユニット４のダイレクトアクセススイッチ２７が操作されたことを認識し、所定の処理（テスト結果の表示など）を実行する。
【００２８】
図６（Ｂ）はＰＬＣ２を構成する基本ユニット３、拡張ユニット４およびエンドユニット１１が連結された状態を示している。このＰＬＣ２はベースレスのビルディングタイプであるため、ベースを使用せずに、基本ユニット３、拡張ユニット４およびエンドユニット１１が連結される。工場において制御盤に設置しやすくするために、ＰＬＣ２の背面にはＤＩＮレールなどの基準レール１３が取り付けられるようになっている。なお、基本ユニット３および拡張ユニット４の連結状態を維持するためにロック機構が採用されてもよい。
【００２９】
本実施形態では、基本ユニット３と拡張ユニット４とをつなぐバスとしては、たとえばアドレスとデータ、制御信号を並列に構成したパラレルバスや、アドレスやデータを引数とするコマンド及びレスポンスをパケットとして送受信するシリアルバスなど、種々の構成を採用できる。
【００３０】
＜ＰＬＣの機能＞
図７は、基本ユニット３及び拡張ユニット４それぞれの機能の一例を示す機能ブロック図である。これらの機能ブロックは、たとえばそれぞれのユニットのＣＰＵが制御プログラムを実行することで実現される。なお、各機能はＡＳＩＣ（特定用途集積回路）などの論理回路として実装されてもよい。記憶装置１２は、設定データ１０５及びラダープログラム１０６を含むプロジェクトデータ１０４などを記憶している。プロジェクトデータ１０４は、プログラム作成支援装置１によって作成されて転送されてきたものであり、各拡張ユニットによるデータのバッファリングに関する設定を含む設定データ１０５と、ラダープログラム１０６とを含んでいる。プロジェクトデータ管理部７００は、通信部１４を介してプログラム作成支援装置１からプロジェクトデータ１０４を受信して記憶装置１２に格納する。バッファリング設定部７０１は、プロジェクトデータ１０４に含まれた設定データのうち、バッファリングに関する設定値を、所定の格納場所にセットする。所定の格納場所とは、たとえば後述する共有メモリ７１３のバッファリング設定領域７１３１などである。メモリ制御部７０２は、たとえばラダープログラムの実行により共有メモリ７１３を含むメモリへのアクセスを制御する。ローカルメモリ７０３は、基本ユニット１０により使用されるメモリであり、たとえば共有メモリ７１３から読み取られたデータの転送先であり、あるいは共有メモリ７１３に書き込まれるデータの転送元となる。バスインターフェース（Ｉ／Ｆ）７０４は、拡張ユニット４と接続するバスのインターフェースであり、バスの構成に応じた機能を有する。たとえばバスがシリアルバスであれば、シリアル−パラレル変換等を行う機能を有していてもよい。表示部５は、デバイスの状態を表示したり、あるいはユーザが操作部８を用いてデバイスへの値の設定を行うためのユーザインターフェース等を表示できる表示部である。表示部５および操作部８により行える設定には、バッファリング設定を含む。
【００３１】
なお、通信部１４は、物理的に１つのユニットというわけではなく、ローカルエリアネットワーク用の通信回路や通信バスを介した通信を行う通信回路を含んでいる。もちろん、これらの複数の通信回路が１つのユニット（チップ）として実装されてもよい。
【００３２】
一方拡張ユニット４は、データ収集制御部７１１、バッファメモリ７１２、共有メモリ７１３、共有メモリ制御部７１４、バスＩ／Ｆ７１５を有する。データ収集制御部７１１は、被制御装置１６等からの入力データをサンプリングして対応するバッファに格納する。トリガや周期、サンプル数については共有メモリ７１３の設定領域７１３１に格納されたバッファリング設定に従う。バッファメモリ７１２はＦＩＦＯ（先入先出）構成を有するバッファであり、たとえばシフトレジスタやリングバッファ等により実現される。リングバッファ等、入力ポインタおよび出力ポインタが必要な構成では、ポインタはデータ収集制御部７１１により管理される。共有メモリ７１３は、基本ユニット３および拡張ユニット４の双方からアクセス可能なメモリであり、バッファリング設定などの設定データを格納するバッファリング設定領域７１３１と、基本ユニット３と拡張ユニット４との間のデータの交換のためのバッファ割当領域７１３２とを含む。共有メモリ制御部７１４は、共有メモリを制御する。バスＩ／Ｆ７１５は、基本ユニットおよび他の拡張ユニットと接続するためのバスのインターフェースである。
【００３３】
なお、データ収集制御部７１１は、外部機器からの入力データをサンプリングする機構を有しており、その機構をサンプリング手段と呼ぶこともできる。データ収集制御部７１１は、サンプリングしたデータをバッファメモリ７１２に順次格納することができる。またデータ収集制御部７１１は、基本ユニット３からの読み出し要求に応じてバッファメモリ７１２からのデータの基本ユニット３への出力、すなわち読み出しの制御を行うことができる。読み出しの際には、データ収集制御部７１１は、読み出し要求に含まれる読み出し対象のデータ個数に基づいて、バッファメモリ７１２に記憶されている特定の先頭データから、記憶された順に指定されたデータ個数のデータを読み出して出力する。その後、次回の前記読み出し要求に応じるためにバッファメモリ７１２に格納されたデータの先頭の位置を読み出されたデータ個数に応じてシフトさせる。すなわち、次回の前記読み出し要求に応じるために特定の先頭データとする対象を前記データ個数に応じて変更させる。これにより、次に読み出すべきデータが、バッファメモリ７１２の先頭データとなる。
【００３４】
このバッファメモリ７１２に格納された特定の先頭データの位置のシフトは、データに対する先頭の位置の相対的な操作であってよい。たとえば、バッファメモリ７１２としてシフトレジスタを採用した場合には、出力後に読み出されたデータをシフトレジスタから追い出すようにシフト動作を行い、読み出された値をシフトレジスタから追い出す。これにより、次に読み出すデータ、すなわちシフトレジスタから読み出しが済んでいないデータのうち、最も古く記憶されているデータをシフトレジスタの先頭データにする。またたとえば、バッファメモリ７１２がリングバッファであれば、データをシフトするまでもなく、先頭すなわち次の読み出し先を示すポインタをシフトして、バッファメモリ７１２から読み出しが済んでいないデータのうち、最も古いデータを次に読み出されるデータとする。この場合、データの物理的なシフトは行われないが、先頭を示すポインタを基準とすれば、この操作は論理的にはデータのシフトと同じ意味を持ち、特定の先頭データの位置がシフトされる効果を奏する。
【００３５】
バッファメモリ７１２への入力と出力とは互いに独立した操作であることから、データ収集制御部７１１は、バッファメモリ７１２への入力と出力とを非同期に実行する構成を有する。そこで、データ収集制御部７１１のうち、サンプリングを実行する部分をサンプリング手段、サンプリングされたデータのバッファリングを制御する部分をデータ入力制御手段あるいはバッファリング制御手段、バッファメモリ７１２からの出力（読み出し）を制御する部分をデータ出力制御手段などと呼ぶこともできる。これら３つの機能は、本実施形態ではデータ収集制御部７１１により実現されているが、それぞれ独立した機能ユニットにより実現することもできる。また任意の機能を組み合わせてひとつのユニットとして構成することもできる。たとえば、データ入力制御機能とデータ出力制御機能とをまとめてデータ収集制御手段と呼び、サンプリング機能をサンプリング手段として区別した構成をとることもできる。
【００３６】
拡張ユニット４の機能は、たとえばそのＣＰＵがシステムプログラムを実行することで実現する。そのため拡張ユニット４は、ＣＰＵおよび記憶装置を備えている。記憶装置１２は、ＲＯＭやＲＡＭなどにより構成されており、共有メモリとローカルなメモリとを含む。なお、各機能はＡＳＩＣ（特定用途集積回路）などの論理回路として実装されてもよい。
【００３７】
＜プログラム作成支援装置の機能＞
図８は、プログラム作成支援装置のＣＰＵ２４が制御プログラムを実行することで実現する機能の一例を示す図である。プログラム作成支援装置１の機能のうち、基本ユニット３や拡張ユニット４の配置に関するユニット構成情報（設定データ１０５など）の設定機能を少なくとも有した設定支援装置が提供されてもよい。ここでは、説明の便宜上、プログラム作成支援機能も含むプログラム作成支援装置１として設定データ１０５の設定支援装置について説明する。設定データ１０５には、各拡張ユニット４が、被制御装置１６から入力される信号等をサンプリングし、デジタルデータとしてバッファリングするためのトリガやサンプリング周期等が含まれる。なお、ラダープログラムを作成して基本ユニット３に転送する支援装置と、設定データ１０５を作成して基本ユニット３に転送する支援装置とはそれぞれ別々に用意されてもよい。つまり、設定データ１０５の設定支援装置は、設定データ１０５の設定機能を有した支援装置であってもよいし、設定データ１０５の設定機能およびプログラム作成支援機能も含む支援装置であってもよい。なおラダープログラムを構成する個々の命令を本例ではラダー命令と呼ぶことがある。
【００３８】
図８において、バッファリング設定編集部１０１は、表示部７にバッファリング設定を入力するためのユーザインターフェースを表示し、ユーザが操作部８を通じて指定した設定値を受け付け、バッファリング設定を含む設定データ１０５を作成し、プロジェクトデータ作成部１０３に渡す。図９（Ａ）に、拡張ユニットのチャネルごとのバッファリング設定のためのユーザインターフェースの例を示す。拡張ユニット４は、その目的に応じて被制御装置１６から入力されるデータ等をサンプリングするが、複数種類のデータをサンプリングする場合、それぞれのデータの経路をチャネルと呼び、バッファリングしたデータもチャネルごとのＩＤ（チャネルＩＤまたはチャネル番号）により互いに区別する。したがって複数のチャネルを有する拡張ユニット４については、図９（Ａ）による設定をチャネルごとに行うこととなる。
【００３９】
なお、図９（Ａ）に示したユーザインターフェースの例において、設定可能な項目は上から順に以下の通りである。設定された値は、共有メモリ７１３の設定領域７１３１にセットされる。
（１）バッファリングを使用するか、すなわちバッファリングを行うか否かを示すバッファリング使用設定。
（２）バッファリング周期の指定方法（たとえばバッファリング設定編集部１０１によるか、それともラダープログラムによるか等）を設定するバッファリング周期指定。
（３）バッファリングを実行する周期であるバッファリング周期（サンプリング周期をいうこともできる）設定。
（４）バッファリングを開始するトリガ条件設定。
（５）トリガレベルの指定方法（たとえばバッファリング設定編集部１０１によるか、それともラダープログラムによるか等）を設定するトリガレベル指定、
（６）バッファリングを開始するために、指定されたトリガ条件が満たすべきトリガレベル設定。
（７）バッファリング点数の指定方法（たとえばバッファリング設定編集部１０１によるか、それともラダープログラムによるか等）を設定するバッファリング点数指定。
（８）バッファリング点数（サンプル数ということもできる）設定。
（９）トリガ条件がトリガレベルに達する前にサンプリングしておくべきデータ点数であるトリガ条件トリガ前データ点数設定。
【００４０】
プログラム作成部１０２は、表示部７にラダープログラムを作成するためのグラフィカルユーザインターフェース（ＧＵＩ）を表示し、ユーザが操作部８を通じて入力したラダー図にしたがってラダープログラム１０６を作成し、プロジェクトデータ作成部１０３に渡す。プロジェクトデータ作成部１０３は、設定データ１０５とラダープログラム１０６とを含むプロジェクトデータ１０４を作成し、通信部２６を介して基本ユニット３に転送する。
【００４１】
図９（Ｂ）は、プログラム作成部１０２によりラダープログラムでバッファリング設定を行う際のユーザインターフェースの例を示す。図９（Ｂ）の例では、チャネルの指定はされていないが、複数のチャネルがある場合には、さらにチャネルを指定する。この例では、共有メモリ７１３のアドレス０２００〜０２０４がバッファリング設定のための設定領域であり、順にモード選択、バッファリング点数設定、バッファリング周期設定、トリガ条件設定、トリガ前バッファリング点数設定がセットされる。行番号（左欄）００００３〜００００７が、その設定のための書き込み（ＵＷＲＩＴ）命令であり、ユニット番号１の拡張ユニットに対して、モードは連続モード、点数は５０００点、周期は１００μ秒、トリガ条件は入力端子、トリガ前バッファリング点数は０に設定されている。なおユニット番号とは、ＰＬＣにおいてユニットを固有に識別するための番号である。
【００４２】
このようにバッファリング設定は、ユーザインターフェースを介して管理者等が設定を行うこともできるし、ラダープログラムの一部として設定を行うこともできる。
【００４３】
＜共有メモリ＞
共有メモリ７１３の構成例を図１２に示す。図１２に示すように、共有メモリ７１３は、バスＩ／Ｆ７１５からは読み出しのみが可能で、拡張ユニット４では、たとえばそのＣＰＵが読み書き可能なデータ入力領域と、バスＩ／Ｆ７１５からは読み書きが可能で、拡張ユニット４では読み出しのみが可能なデータ出力領域と、バスＩ／Ｆおよび拡張ユニット４がともに読み書き可能な双方向領域と、バッファメモリ７１２のデータ等を基本ユニットから読み取るためのバッファ割り当て領域とを含む。例えば、バッファリング設定領域７１３１は図１２のデータ出力領域に、バッファ割当領域７１３２は図１２のバッファ割当領域に割り当てられている。基本ユニット３から見た場合、データ入力領域は入力デバイス、データ出力領域は出力デバイスとして扱うことができる。共有メモリ７１３は主として図５に示したプログラム実行２０２の間に行われる通信であるダイレクト通信のために用いられる。バッファ割当領域７１３２は固定的であり、データ収集制御部７１１や、ユーザプログラム内でバッファ割当領域７１３２へアクセスする命令では、固定的に割り当てられたアドレスおよび領域サイズが用いられる。
【００４４】
＜拡張ユニットからのデータ読み取り（ラダー命令）＞
基本ユニット３は、ラダープログラムを実行することで拡張ユニット４が被制御装置１６等から取得してバッファリングしたデータを、共有メモリ７１３を介して読み取ることができる。図１０にそのラダープログラムの一例を示す。図中、＃は１０進数、＄は１６進数を示す。これは他の図においても同様である。ラダープログラムは、ラインの左側に実行条件となるデバイス等を記述し、右側に、条件が満たされた場合に実行される命令を記述する。ラダープログラムが実行され、デバイスがテストされた時点で実行条件が満たされていなければ、対応する命令はスキップされ実行されない。ひとつの条件に対して複数の命令を実行する場合には、それらの命令は実行順に線で結ばれて示される。なお以下では、拡張ユニット４ではチャネルは１つであるものとし、拡張ユニット４が有するチャネルが唯一の場合にはその指定を省くものとして説明する。
【００４５】
図１０においてラダー命令１００１は読み取り命令ＵＲＥＡＤであり、指定した拡張ユニットの指定した読み取り元アドレスから読み出した指定長のデータを、指定した宛先アドレスに移動する命令である。読取命令１００１は、指定拡張ユニットが１、読み取り元アドレスが０２１Ａ、宛先アドレスがレジスタＲ１０００、データ長が１ワード、をパラメータとする命令である。この命令は、常時オンであるデバイスＣＲ２００２を条件としており、この命令は１スキャンで１回必ず実行される。もちろんＣＲ２００２は常時オンのデバイスの一例に過ぎない。そして、読み取り命令により、例えばデータ入力領域に含まれるアドレス０２１Ａの１ワードのデータがレジスタＲ１０００に複製される。また、Ｒ１００４がオンであり、かつ変数Ｚ１の値が１００００でないことを実行条件として、命令１００２および命令１００３がこの順に実行される。アドレス０２１Ａから所定長の領域は、データ収集制御部７１１が所定長（たとえばバッファ割当領域７１３２の長さ）のデータのバッファリングを完了したことを示すバッファリング完了通知等を書き込むための領域であり、命令１００１の実行によってレジスタＲ１００４にバッファリング完了通知が格納される。また変数Ｚ１は例えば読み取り開始に先立ってその初期値が０に設定されている。したがって、指定した拡張ユニット１により、所定長のバッファリングが完了しており、かつ、変数Ｚ１が１００００でないなら、Ｕ＿ＲＤＢＦ命令１００２が実行される。Ｕ＿ＲＤＢＦ命令１００２は読み取り命令であり、拡張ユニット４の共有メモリ７１３からの読み出しのために使用される命令である。命令１００２は、拡張ユニット番号１の共有メモリ７１３のバッファ割当領域７１３２のアドレスであるアドレス２０００を読み取り元アドレスとし、そこから１０００ワードのデータを宛先アドレスである（ＥＭ１００００：Ｚ１）に複製する命令である。アドレスＥＭ１００００：Ｚ１は、ベースをＥＭ１００００、オフセットをＺ１の値とするアドレス指定である。加算命令１００３は、変数Ｚ１に値１０００を加算して変数Ｚ１に格納する命令である。これにより宛先アドレスのオフセットである変数Ｚ１に、読み取り指定長である１０００が加算される。したがって命令１００２、１００３を繰り返すことで、バッファ割当領域７１３２のデータが、１回の読み取りにつき１０００ワードずつＥＭ１００００を先頭アドレスとするメモリ領域に連続して格納される。アドレスＥＭ１００００：Ｚ１は例えばローカルメモリ７０３に割り当てられる。なお図１０は、プログラム作成支援装置１のユーザインターフェースに表示された命令の例であるが、基本ユニットに転送されたプログラムも論理的には図１０に示した構成を有している。
【００４６】
さて、拡張ユニット４でバッファリングしたデータを基本ユニット３から読み取るために実行するラダープログラムは図１０に示したようなものであるが、ただ繰り返しただけでは同じデータを読んでしまうため、１回の読み取り命令の実行が完了する都度、バッファ割当領域７１３２の内容を、次に読み取るべきデータで更新する必要がある。本実施形態では読み取りに付随する一連の動作として基本ユニット３及び拡張ユニット４によりバッファ割当領域７１３２の更新が行われる。
【００４７】
＜拡張ユニットからのデータ読み取り（各ユニットの動作）＞
図１１は、基本ユニット３が共有メモリ７１３のバッファ割当領域７１３２からデータを読み出した際に行われるＰＬＣ２の動作例を示す模式図である。ＣＰＵ１０がたとえば、共有メモリ７１３の所定アドレスの領域に所定値を書き込むことでバッファリング開始要求、すなわちバファリング開始の指示を拡張ユニット４に与える。拡張ユニット４のデータ収集制御部７１１は例えば定期的に当該領域を参照し、バッファリング開始指示があれば、別途格納されたバッファリング設定を参照し、設定に従ってバッファリングを開始する。データ収集制御部７１１は、入力されるデータを時系列にバッファメモリ７１２に格納する。すなわちＦＩＦＯの末尾に新たなデータを格納していく。データ収集制御部７１１は、バッファリング設定で指定された量（たとえばサンプル数）のデータのバッファリングを完了するまでバッファリングを続ける。そしてバッファ割当領域７１３２相当の量のデータのバッファリングが完了すると、バッファリング完了通知を、共有メモリ７１３を介して基本ユニット３へと送る。
【００４８】
一方基本ユニット３のＣＰＵ１０は、例えば図１０に示すラダープログラムを実行する。その中で条件具備（すなわちバッファリング完了）をきっかけとするＵ＿ＲＤＢＦ命令の実行により、まずバッファの読み取りを行うことを示す通知（あるいは要求）がＣＰＵ１０により例えば共有メモリ７１３の所定の領域に書き込まれる。この領域を定期的に監視する拡張ユニット４のデータ収集制御部７１１は、バッファの読み取りを行うことを示す通知があると、バッファメモリ７１２からデータを出力し、バッファ割当領域７１３２へと書き込み、バッファの読み取りを行うことを示す通知をリセットする。そして、バッファメモリ７１２からバッファ割当領域７１３２へと、当該領域のサイズに相当するデータ量を格納し終えたなら、バッファメモリ７１２からのデータの出力を停止し、共有メモリ７１３に設けた移動完了通知をオンとする。ここでバッファメモリ７１２はＦＩＦＯであるので、出力したデータはバッファメモリ７１２から失われ、バッファの先頭は次に読みだすべきデータとなる。
【００４９】
一方、ＣＰＵ１０は、ラダー命令１００１の実行によりバッファリング完了通知を読み、命令１００２によりテストする。そして、バッファリング完了通知がオンとなり、変数Ｚ１が所定値でない、すなわち読み取りが完了していないなら、読み取り命令１００２を実行して、バッファ割当領域７１３２から読み取ったデータを指定したアドレスへと書き込む。バッファ割当領域７１３２からの読み取りが完了すると完了したことを通知する読み取り完了通知を共有メモリ７１３の所定の領域にセットする。データ収集制御部７１１はこの領域を例えば定期的にテストし、読み取り完了通知がセットされていれば続きのデータをバッファメモリ７１２からバッファ割当領域７１３２に出力し、読み取り完了通知をリセットする。
【００５０】
以上をバッファした全データを出力するまで繰り返し、バッファリングした全データを出力したなら処理は終了となる。なお本例では、読み出すべき全データ量は基本ユニットで実行するラダープログラムにより管理されているため、データ収集制御部７１１がバッファリングした全データを出力し終えた旨の通知は行わなくともよい。
【００５１】
以上がバッファリングしたデータを拡張ユニット４から基本ユニット３へ出力する動作となる。なお上記説明ではバッファ割当領域７１３２へは、基本ユニット３または拡張ユニット４のいずれか一方がアクセスするものとして説明したが、共有メモリ７１３としてデュアルポートメモリを採用したり、あるいは十分に広帯域のメモリを採用することで、読み取りと書き込みとを実質的に並列に行うこともできる。
【００５２】
＜基本ユニットによる読み出し手順＞
図１３に、上述したバッファからの読み出し処理のためにＣＰＵ１０により実行される処理手順を示す。図１３において、まずバッファリング関連設定（すなわちバッファリング設定）を行う（Ｓ１３０１）。バッファリング設定は、図９で説明した要領で例えば管理者等が入力した設定値を、たとえば共有メモリ７１３のバッファリング設定領域７１３１に書き込むことで実現される。なおステップＳ１３０１はラダープログラムに含まれ、スキャンの中で実行されてもよいが、ラダープログラムの実行に先立って予め実行されてもよい。これに対してステップＳ１３０３以降はスキャンの中で実行される。すなわち、１回のスキャンにつき１回実行される。ステップＳ１３０３ではバッファリング設定に従ったバッファリングの開始要求を行う。次にステップＳ１３０５で読み出し数に相当するデータがバッファリングされたか判定する。読み出し数とは、たとえばバッファ割当領域７１３２のサイズ相当のデータ量である。この判定は、上述のようにデータ収集制御部７１１からのバッファリング完了通知をテストし、バッファリング完了通知がセットされていれば満たされたものと判定する。バッファリングが完了していなければＳ１３０５を繰り返す。ラダープログラムでは条件不備の命令はスキップされるので、この繰り返しは次のスキャンで行われることになる。
【００５３】
一方、バッファリングが完了していれば、ステップＳ１３０７において指定したアドレスすなわちバッファ割当領域７１３２からデータを読み取って指定したアドレスへと複製する。このあと、バッファリング完了通知はリセットしておく。ステップＳ１３０９でバッファリング対象の全データを取得したか（読み取ったか）判定する。この判定は、図１０の命令１００２の２番目の条件「＃１００００＜＞Ｚ１」の判定に相当する。読み取っていればデータ取得は完了となる。これ以降は、ユーザプログラムに従って、再びステップＳ１３０１やＳ１３０３から処理を繰り返すか、あるいはそのまま何もしない、などとなる。ステップＳ１３０５〜ステップＳ１３０９は図１０のラダー命令１００２、１００３に相当する。
【００５４】
＜拡張ユニットによる読み出し手順＞
図１４は拡張ユニット４のデータ収集制御部７１１によるバッファリングおよびその読み出し時の手順を示す。図１４（Ａ）はバッファリング開始要求を基本ユニット３から受けた場合に実行する手順である。データ収集制御部７１１は、たとえば周期的に共有メモリ７１３に書き込まれるバッファリング開始要求をテストし、オンであれば図１４（Ａ）の手順を実行する。ステップＳ１４０１では、被制御装置１４から入力される信号等をサンプリングし、Ａ／Ｄ変換等必要な処理を施してＦＩＦＯ構成を有するバッファメモリ７１２に時系列に格納する。ステップＳ１４０３で全てのデータのバッファリングが完了したか判定し、完了したなら、ステップＳ１４０９でバッファリングを停止し、バッファリングの完了を共有メモリ７１３に書き込むことなどで基本ユニット３に通知する。なお、この通知は、基本ユニット３の処理によっては行わなくともよい。なお、バッファリングの終了条件は、バッファリング設定を参照することで充足されているか否かを判定できる。またバッファリングのトリガ条件がバッファリング設定で与えられている場合には、トリガ条件を満たすデータがサンプリングされ、バッファリングされる。一方、全てのデータのバッファリングが完了していない場合には、ステップＳ１４０５で、読み出し領域分のバッファリングが完了したか判定する。読み出し領域とは、本実施形態ではバッファ割当領域７１３２に相当する。すなわちステップＳ１４０５では、バッファ割当領域７１３２のサイズに相当する量のデータがバッファリングされたか判定する。本実施形態では、バッファ割当領域７１３２は固定的に割り当てられているため、そのサイズもまた固定値である。読み出し領域分のバッファリングが完了していなければ、ステップＳ１４０１に戻ってバッファリングを行う。一方、読み出し領域分のバッファリングが完了していれば、ステップＳ１４０７で、共有メモリ７１３を介してそのバッファリング完了通知を基本ユニット３に通知する。この通知が図１３のステップＳ１３０５でテストされる。なお図１４（Ａ）ではフローチャートの表現上の制約で、処理が逐次的に進むものとして説明しているが、ステップＳ１４０１、Ｓ１４０３、Ｓ１４０９の処理とは非同期に、ステップＳ１４０５、Ｓ１４０７を実行してもよい。また、読み出し領域について、本実施形態では、上述したようにバッファ割当領域７１３２に相当するとしているが、本発明はこれに限られない。例えば、バッファメモリ７１２のサイズ以下の所定データ量であれば、バッファ割当領域７１３２のサイズを超えていても構わない。更に、本実施形態では、バッファ割当領域７１３２のサイズに相当する量のデータがバッファリングされたか否かを判定しているが、例えば、バッファメモリ７１２内のデータ量が一定量以上になったか否かを判定してもよい。この点、従来のページ切替方式によるバッファリングの場合には、読み出すデータ量はページサイズ分（共有メモリのバッファ割り当て領域分）を読み出す必要があったが、ＦＩＦＯ方式によるバッファリングであれば、読出しデータ量とバッファ割り当て領域が同じである必要はない。ＦＩＦＯからは読出し要求のあったデータ数（データ量）分のみが共有メモリ７１３に即時出力されることになる。
【００５５】
なおＦＩＦＯへの書き込みと読み出しとは互いに非同期に実行され得るので、バッファリングしたデータが読み出されることがないままバッファリングが進行してステップＳ１４０７を複数回繰り返し実行することもあり得る。そのため、ステップ１４０７におけるバッファリング完了通知は、バッファリングの完了に応じた読み取りが行われないまま重複して発行され、前のバッファリング完了通知がオーバーライドされてしまう可能性がある。そこで、ステップＳ１４０７では、バッファリング完了通知が既にセットされたままであるかテストし、セットされていなければセットするが、セットされた（すなわちオン）のままであれば、たとえば別途ローカルに設けた重複カウンタに１加算し、バッファリング完了通知をオーバーライドした回数をカウントする。また、ステップＳ１４０７でバッファリング完了通知をセットした場合には、当該重複カウンタ値が１以上であれば重複カウンタから１減算する。さらにステップＳ１４０９ではさらに、バッファリング完了通知をテストし、オフであればセットして重複カウンタの値から１減算する動作を重複カウンタの値が初期値に戻るまで繰り返し行う。たとえばこのように構成することで、書き込みと読み出しとが非同期であってもバッファリングした全データの読み取りを保証できる。なおこの説明は、バッファリングした全データをユーザプログラムで読み取ることを前提としており、バッファリング設定に含まれたバッファリングするデータ数と、ラダープログラムにより読み取るデータ数とを一致させる必要がある。
【００５６】
図１４（Ｂ）は基本ユニット３によるバッファの読み出しが開始された際にデータ収集制御部７１１により実行される手順である。なお、ステップＳ１４０７における通知に応じて基本ユニット３は読み取りを開始するので、図１４（Ａ）のバッファリングと図１４（Ｂ）の読み出しとは並列で実行されることもあり得る。図１４（Ｂ）の実行のトリガは、たとえば基本ユニット３が、バッファ割当領域７１３２からの読み出しを開始する旨の通知を共有メモリ７１３にセットし、データ取集制御部７１１がその値をテストする構成であってもよいし、バスＩ／Ｆ７１５により信号をデコードし、実行する命令が読み出しであり、かつ対象データのアドレスがバッファ割当領域７１３２であれば、読み出しの実行と判断してデータ取集制御部７１１に通知して実行のトリガとしてもよい。拡張ユニット４でバッファリングされたデータの読み取り命令として例えばＵ＿ＲＤＢＦという専用の命令を用いれば、基本ユニット３は、実行する命令がバッファリングされたデータの読み取りであることを容易に知ることができるため、前者の方式の実装は容易である。
【００５７】
さて基本ユニット３による読み出しの開始を知ったデータ収集制御部７１１は、ステップＳ１４１１で、指定されたチャネルのバッファメモリ７１２の先頭からデータを出力し、出力したデータを転送して共有メモリ３の読み出し領域すなわちバッファ割当領域７１３２に出力順に格納する。チャネルがひとつの場合には、図１０に例示したラダー命令１００２のように、チャネル指定がなくともよい。チャネルの指定がある場合には、チャネルＩＤは共有メモリ７１３で基本ユニット３から拡張ユニット４へと引き渡せばよい。データの転送および格納が終了したなら、ステップＳ１４１３で、転送の完了すなわちバッファ割当領域７１３２からの読み出し準備が完了したことを基本ユニット３に通知する。この通知はラダー命令により明示的にテストされるのではなく、例えば図１３のステップＳ１３０７の読み出しに際してまずテストされる。そして、完了していれば読み出しが実行される。また、バッファ割当領域７１３２へのバッファ７１２からの書き込みが、基本ユニット３からの読み出しを追い越さないことを保証する機構を設ければ、ステップＳ１４１３の転送完了の通知前に、基本ユニット３からの読み出しを開始し、読み出しと書き込みを並行して行ってもよい。
【００５８】
以上のように、バッファ割当領域７１３２に取り出すべきデータがあることと、取り出すべきデータがもはやないこととを、拡張ユニット４のデータ収集制御部７１１と基本ユニット３との間で互いに通知し合うことで、データ収集制御部７１１はバッファ割当領域７１３２へとバッファリングしたデータを順次移動し、基本ユニットに順次読み取らせることができる。したがって、この通知の方法は上記例に限るものではなく、拡張ユニット４と基本ユニット３とが情報を共有できる方法であればどのような構成や方法を採用してもよい。
【００５９】
そしてこの構成により、本実施形態のＰＬＣにおいては、拡張ユニットのバッファ構造を考慮することなく、拡張ユニットでバッファリングされたデータを基本ユニットにより読み取るためのユーザプログラムを構築できる。このため、プログラム設計の負担が軽減され、大量のデータの読み出しを、込み入った制御のコーディングを行うことなく容易に実現できる。これは作業性や生産性の向上のみならず、ユーザプログラムの品質の向上につながる。さらに、共有メモリのバッファ割当領域の容量に相当するデータがバッファリングされる都度それを読み出すことから、バッファ割当領域のサイズを調整することで、１回のスキャンタイムに対するバッファの読み出し時間の影響を調整することができる。
【００６０】
また、拡張ユニットのバッファメモリとしてＦＩＦＯを採用しているため、バッファへの書き込みおよび読み出しのポインタ管理を拡張ユニット単独で行うことができ、ユーザプログラムによるポインタ管理が不要となり、プログラム設計が簡素化できる。
【００６１】
［本実施形態の変形例］
図１５に、共有メモリ７１３を介してＦＩＦＯバッファからデータを読み取るためのラダープログラムの他の例を示す。図１５（Ａ）は、ユニットＩＤおよびチャネル番号を指定した読み取り命令Ｕ＿ＦＩＦＯＲの例である。指定するパラメータはユニットＩＤ、チャネル番号、読み取ったデータの格納先アドレス、データ数（データ長）である。読み取るべきアドレスは固定的に割り当てられているバッファ割当領域７１３２であるので、パラメータとして指定する必要はない。またデータ数についても、バッファ割当領域７１３２のサイズに応じて固定された値を用いるなら指定しなくともよい。実行の条件は左端に記載した読み出し量分のデータの「バッファ完了」すなわちバッファリング完了通知である。図１５（Ｂ）は、チャネル番号の指定を省いたもので、先頭のチャネル番号を規定値として指定した図１５（Ａ）の命令を同じ意味を持つ。
【００６２】
図１５（Ｃ）は、読み取り命令を５回繰り返してバッファリングされたデータを読み取る例を示す。図１０の命令１００２および命令１００３は、１回のスキャンで１回実行され、それにより１０００ワードのデータが読み取られる。これに対して図１５（Ｃ）は、１回のスキャンで５つの読み取り命令が順次実行され、５０００ワードのデータが読み取られる。図１５（Ｃ）では、ラダー命令で明示的にテストされるのは最初の１回に読み出されるデータ（図１５（Ｃ）の例では１０００）のバッファリング完了であり、残りの４０００のデータについては明示的にバッファリングの完了のテストは行っていない。そこで、たとえば図１５（Ｃ）のＵ＿ＦＩＦＯＲ命令では、バッファ完了を、Ｕ＿ＦＩＦＯＲ命令を実行する過程でテストし、完了していればバッファ割当領域７１３２からデータを読み出すように構成する。こうすることで図１５（Ｃ）の命令列により５０００個のデータを時系列に読み出すことができる。また、バッファリング完了を、５つのＵ＿ＦＩＦＯＲ命令で読み出す総数すなわち５０００のデータのバッファリングが完了したときに通知するように構成してもよい。
【００６３】
このようにすることで、チャネル番号の明示的な指定とデフォルトの適用による暗黙裡の指定とを両立できる。また、パラメータを減らすことでより簡潔なプログラム設計が可能となる。また、図１５（Ｃ）のような記述をすることによって、共有メモリ７１３の割り当て領域サイズを超えるデータ量であっても、簡単に読み出しを行うことができるメリットがある。より具体的に説明すると、共有メモリ７１３のサイズは、バス通信のコマンドで指定できるアドレスサイズの影響を受けるので、ＰＬＣのインフラの制約を受けることになる。例えば、バスコマンドのアドレスがワードなら、０から６５５３５までの領域にしかアクセスできないので、この領域の中でデータの受け渡しを行う必要がある。バッファデータの受け渡し以外にも、様々なデータを受け渡す必要があるため、例えばバッファデータ受け渡し用の空間は１０００しかない、ということもあり得る。一方で、本実施形態のように、ＦＩＦＯ方式によるバッファリングであれば、このような制約を受けないため、例えば５０００点分のデータを蓄えられるだけのメモリを用意することができる。この場合、一度に読み出すデータ量は１０００（共有メモリのサイズ上限とする）であっても、命令を複数並べるだけで順次次のデータに切り替えることができるので、５０００点のデータを１スキャン内で簡易に読み出すことができる。つまり、ユーザは、ラダープログラムに、読み出しポインタ操作の記述やページ切り替え操作の記述を書く必要がないため、プログラム設計のユーザ負担を軽減することができる。
【００６４】
なお上記説明ではバッファ割当領域７１３２のアドレスを固定値としたが、バッファ割当領域７１３２のアドレスをバッファリング設定の一部として共有メモリ７１３に設定して間接アドレシングとすることで、そのアドレスをより柔軟に変更することができる。
【００６５】
［変形例その２］
図１６に、共有メモリ７１３を介した通信ではなく、割り込みによってバッファ完了の通知を行う構成例を示す。この構成では図１６（Ａ）に示すように、バッファ完了割り込み１５０１がデータ収集制御部７１１から出力され、バスＩ／Ｆ７１５に入力される。データ収集制御部７１１は、バッファ割当領域７１３２のサイズに相当する量のデータのバッファリングを完了する都度、完了通知を共有メモリ７１３に書き込む代わりに、バッファ完了割り込み１５０１を出力する。この割込はバスを介して基本ユニット３へと通知される。
【００６６】
図１６（Ｂ）は、図１６（Ａ）の構成に対応したユーザプログラムの一例である。命令１６０１は、ユニット番号１の拡張ユニットからの要因１６の割り込み、すなわちバッファ完了割り込みをトリガとして実行されるプログラムモジュールであることを示す。この割り込みをきっかけとして、命令１６０２、１６０３が実行される。これら命令は、条件としてバッファリングの完了が含まれていない点を除き、図１０の命令１００２，１００３と同じものである。そして図１６（Ｂ）の命令が実行されると、割り込み発生前のコンテキストに戻る。
【００６７】
以上のように、割り込みをバッファの読み出しのトリガとすることもできる。そのように構成することで、バッファ完了通知をテストする工程が不要となり、よりプログラム設計を簡素化できる。なお、バッファ完了割り込みを受信した基本ユニット３では、バッファ完了割り込みをキューイングしておき、先着順に例えば図１６（Ｂ）のような読み出し処理を行うことで、すべてのバッファ完了割り込みに対応した読み出し処理をすることができる。
【００６８】
［第２実施形態］
第２の実施形態として、バックアップ機能の付いたバッファ読み出し処理について説明する。なお第１実施形態の基本例と共通する構成及び処理については説明を省略し、相違点について説明する。なお説明の便宜のために図１８のフローチャートの対象となるコマンドはバッファ割当領域７１３２のデータの読み取りコマンドに限るものとする。その他のコマンドについては説明を省略する。また本実施形態では説明を省略するがデータ収集制御部７１１によるバッファの管理動作および基本ユニット３の動作については第１の実施形態と同様に実施される。
【００６９】
図１７は本実施形態の拡張ユニット４の構成を示す機能ブロック図である。図１１の拡張ユニット４と異なる点は、バスＩ／Ｆ７１５にバックアップメモリ１６０１が接続されている点にある。バッファメモリ７１２１はＦＩＦＯであるため、出力したデータはバッファから失われてしまい、読み出しの再試行ができない。その点を補うために、本実施形態の拡張ユニット４はバックアップメモリ１６０１を有しており、バッファ割当領域７１３２から読み出したデータはバックアップメモリ１６０１に複製され、再試行に備えている。読み出しの再試行が行われた際には、バックアップメモリ１６０１からデータが読み取られる。本実施形態のバックアップメモリ１６０１は、バッファ割当領域７１３２以上の容量を有している。またバックアップするデータは１回の読み出し相当のデータである。なお本実施形態では、バスには例えばパケットとしてコマンドおよびパラメータが送信され、各ユニットはそれを送受信するものとする。コマンドの解析および実行を行うためにバスＩ／Ｆ７１５はインテリジェントな構成であり、実質的に独立した処理ユニットおよびメモリを有する。コマンド、特に読み取りコマンドは図１０等に示したラダー命令と同様のパラメータを有していてよい。具体的には、読み取り／書き込みの別などを示すコマンド、ユニットＩＤ、チャネル番号、対象アドレス、データ長などである。またコマンドのＩＤも含む。これはたとえば図１０の左端に記載したラインのような場合などでよい。リトライのコマンドは、同一の命令の実行であることから元のコマンドＩＤと同一のコマンドＩＤを持つ。あるいはリトライであることを示すパラメータをもっていてもよい。
【００７０】
図１８にバスＩ／Ｆ７１５による処理手順を示す。まずバスを介して信号入力があると、それが自ユニットに対するものであるか判定する（Ｓ１８０１）。コマンドにはパラメータとしてユニットＩＤが含まれているので、自ユニットのユニットＩＤとバス上のユニットＩＤとを照合して判定できる。
【００７１】
自ユニットへの通信であれば、ステップＳ１８０３以下を実行する。ステップＳ１８０３では、コマンドが前回応答済みのコマンドのリトライであるか判定する。これはたとえばコマンドのＩＤやリトライであることを示すインジケータなどをパラメータに含めることで実現できる。コマンドのＩＤを用いる場合には、前回実行したコマンドのＩＤを記憶しておき、それと照合してリトライのであるか否かを判定する。リトライでないならば、共有メモリ７１３のバッファ割当領域７１３２からデータを読み出して（Ｓ１８１１）、そのデータを基本ユニット３に応答する（Ｓ１８０７）。そして、バッファ割当領域７１３２から読み出したデータをバックアップメモリ１６０１に保存する（Ｓ１８０９）。
【００７２】
一方、読み取りのリトライである場合には、バックアップメモリ１６０１からデータを読み取って（Ｓ１８０５）、基本ユニット３へと応答する（Ｓ１８０７）。この場合にはステップＳ１８０９では何もする必要は無い。なおステップＳ１８０５では、パラメータで指定されているアドレスは無視されてバックアップメモリ１６０１が読み取りの対象となる。
【００７３】
以上の構成により、共有メモリから読み出した最新のデータをバックアップすることで、リトライに対応することができる。また、リトライの制御をバスＩ／Ｆユニットで行うことで、他の機能ブロックの動作に影響を及ぼすことなく図１８に示したバックアップ及びリトライ手順を適用できる。
【００７４】
＜他の構成例＞
なおバックアップ及びリトライのためには他の構成であってもよい。たとえば、バックアップメモリ１６０１も基本ユニット３からアクセス可能に構成しておく。そして、基本ユニット３は読み取り命令の実行時に、それがリトライである場合には、当該命令の読み出し先のアドレスを、バッファ割当領域７１３２のアドレスからバックアップメモリのアドレスへと変更する。そして基本ユニット３は拡張ユニット４にアクセスする。メモリからのデータの読み出しは指定されたアドレスに従って実行する。ただし、バスＩ／Ｆユニット７１５またはデータ収集制御部７１１は、バッファ割当領域７１３２が読み取り先アドレスとして指定されている場合には、読み出したデータをバックアップメモリ１６０１に格納する。
【００７５】
以上の構成では、拡張ユニット４においてリトライであるか否かに応じた処理を行う必要がない。そのためパラレルバスなどの場合にも適用できる。ただしバックアップメモリのアドレスを基本ユニット３と拡張ユニット４とで共有する必要がある。
【００７６】
＜書き込み命令への対応＞
さて、上記実施形態すべてにおいては、データを拡張ユニット４から読み出す場合について説明した。しかしながら、これら実施形態の構成は基本ユニット３から拡張ユニット４へのデータの書き込みを行う場合にも有効である。図１９に書き込みの場合の模式図を示す。構成要素については図１１と同様である。
【００７７】
基本ユニット３において拡張ユニット４のバッファ割当領域７１３２を書き込み先アドレスとして指定した書き込み命令が実行されると、指定されたアドレスすなわちバッファ割当領域７１３２に指定されたデータが書き込まれる。書き込みはデータ収集制御部７１１に共有メモリ７１３を介して通知される。書き込みの通知を受けたデータ収集制御部７１１は、共有メモリ７１３の先頭から読み出されてバッファメモリ７１２へとその末尾から入力される。そしてバッファメモリ７１２の先頭からデータが取り出され、たとえば接続された被制御装置１６へと出力される。もちろんバッファメモリ７１２へと書き込まれたデータは、拡張ユニット４により使用されて破棄されてもよいし、別途設けられたメモリに移動されてもよい。
【００７８】
そして書き込みの場合にも、そのラダープログラムはたとえば、図１０のＵ＿ＲＤＢＦを書き込みのための命令に置き換えたものでよく、ページの切り替えやポインタの管理等をラダープログラムで行う必要は無い。上述した実施形態で説明したデータの読み取りの場合とデータの流れは逆となるが、バッファ割当領域７１３２に取り出すべきデータがあることと、取り出すべきデータがもはやないこととを、拡張ユニット４のデータ収集制御部７１１と基本ユニット３との間で通知し合うことで、データ収集制御部７１１はバッファ割当領域７１３２のデータを順次バッファリングすることができる。
【００７９】
＜まとめ＞
第１及び第２の実施形態によれば、ＰＬＣ２は、ユーザプログラムを繰り返し実行する基本ユニット３と、基本ユニット３によって制御される１つ以上の拡張ユニット４とを有している。拡張ユニット４は、基本ユニット３と拡張ユニット４の双方からアクセス可能な共有記憶領域を含む第１の記憶部として、バッファ割当領域７１３２を含む共有メモリ７１３を有している。さらに拡張ユニットはＦＩＦＯ記憶であるバッファメモリ７１２を第２の記憶部として有している。さらに拡張ユニット４は、被制御装置１６である外部機器から取得したデータをバッファメモリ７１２に時系列に入力し、基本ユニット３からの読み出し要求に応じてバッファメモリ７１２に格納したデータをバッファ割当領域７１３２に出力するデータ収集制御部７１１を有する。これにより、拡張ユニット４が内部的にバッファを管理することで、バッファは基本ユニット３から遮蔽され、ユーザプログラムにより管理する必要がなくなって、プログラム設計が簡素化できる。
【００８０】
また図１６で説明したように、データ収取制御部７１１からの読み出す量のバッファリングが完了した旨を、割り込みによって通知することもできる。これにより、共有メモリに書き込まれた通知を、ユーザプログラムによりテストすることなく、バッファリングの完了を基本ユニット３（すなわち実行されているユーザプログラム）では知ることができる。
【００８１】
また、図１７で説明したように、バックアップメモリ１６０１を拡張ユニット４に更に備え、読み出しのリトライに対してはバックアップしたデータを読ませている。こうすることで、出力したデータが失われてしまうというＦＩＦＯの特徴を補い、読み出しのリトライを可能としている。
【００８２】
また図１９のように、ＦＩＦＯに構成したバッファメモリ７１２を用いて読み込みのみならずバッファへの書き込みもサポートする。書き込みにおいても読み出しと同様、バッファメモリの管理を拡張ユニット４が行うことで、ユーザプログラムの簡素化を実現することができる。
【図１】
0006470955.tif 000002
【図２】
0006470955.tif 000003
【図３】
0006470955.tif 000004
【図４】
0006470955.tif 000005
【図５】
0006470955.tif 000006
【図６】
0006470955.tif 000007
【図７】
0006470955.tif 000008
【図８】
0006470955.tif 000009
【図９】
0006470955.tif 000010
【図１０】
0006470955.tif 000011
【図１１】
0006470955.tif 000012
【図１２】
0006470955.tif 000013
【図１３】
0006470955.tif 000014
【図１４】
0006470955.tif 000015
【図１５】
0006470955.tif 000016
【図１６】
0006470955.tif 000017
【図１７】
0006470955.tif 000018
【図１８】
0006470955.tif 000019
【図１９】
0006470955.tif 000020