(57)【要約】【課題】ログデータと、プロジェクトデータまたはその識別情報を出力することで、ログデータとプロジェクトデータとの関係を特定しやすくすること。【解決手段】ＰＬＣは、ユーザプログラムを記憶するプログラム記憶部と、ユーザプログラムを繰り返し実行するプログラム実行部と、プログラム実行部により参照される記憶領域である複数のデバイスを有するデバイス記憶部と、複数のデバイスのいずれかに記憶されているデバイス値を時系列に記録するデバイス記録部と、所定の保存条件が満たされると、デバイス記録部に記録されているデバイス値と、プログラム記憶部に記憶されているユーザプログラムまたはユーザプログラムの識別情報とを対応付けてメモリに保存する保存部とを有する。【選択図】図３２
2020177713.tif 000002
【特許請求の範囲】
【請求項１】
ユーザプログラムを記憶するプログラム記憶部と、
前記ユーザプログラムを繰り返し実行するプログラム実行部と、
前記プログラム実行部により参照される記憶領域である複数のデバイスを有するデバイス記憶部と、
前記複数のデバイスのいずれかに記憶されているデバイス値を時系列に記録するデバイス記録部と、
所定の保存条件が満たされると、前記デバイス記録部に記録されているデバイス値と、前記プログラム記憶部に記憶されている前記ユーザプログラムまたは当該ユーザプログラムの識別情報とを対応付けてメモリに保存する保存部と
を有することを特徴とするプログラマブルロジックコントローラ。
【請求項２】
前記ユーザプログラムは複数のプログラム部品から構成されており、
前記複数のプログラム部品を管理するプロジェクトデータの一部として前記ユーザプログラムは前記プログラム記憶部に記憶されており、
前記保存部は、前記ユーザプログラムを含む前記プロジェクトデータを出力するとともに、前記ユーザプログラムの識別情報として前記プロジェクトデータの識別情報を保存するように構成されていることを特徴とする請求項１に記載のプログラマブルロジックコントローラ。
【請求項３】
前記プログラマブルロジックコントローラは、メインユニットと拡張ユニットとを有し、
前記プロジェクトデータは、前記拡張ユニットの設定情報を含むことを特徴とする請求項２に記載のプログラマブルロジックコントローラ。
【請求項４】
前記ユーザプログラムの出力が禁止されているかどうかを判定する判定部をさらに有し、
前記保存部は、前記判定部により前記ユーザプログラムの出力が禁止されていると判定された場合、前記デバイス記録部に記録されているデバイス値と、前記ユーザプログラムの識別情報とを前記メモリに保存するように構成されていることを特徴とする請求項１に記載のプログラマブルロジックコントローラ。
【請求項５】
前記ユーザプログラムの識別情報は、前記ユーザプログラムが変更されると更新される識別情報であることを特徴とする請求項１ないし４のいずれか一項に記載のプログラマブルロジックコントローラ。
【請求項６】
前記ユーザプログラムの識別情報は、前記ユーザプログラムから演算される誤り検出符号またはハッシュ値であることを特徴とする請求項５に記載のプログラマブルロジックコントローラ。
【請求項７】
請求項１ないし６のいずれか一項に記載のプログラマブルロジックコントローラと接続されるプログラム作成支援装置であって、
表示部と、
前記表示部を介したユーザ入力に基づいて、前記ユーザプログラムを作成するプログラム作成部と、
前記ユーザプログラムと当該ユーザプログラムの識別情報を記憶するプログラムメモリと、
前記プログラマブルロジックコントローラから出力されるユーザプログラムの識別情報と、前記プログラムメモリに記憶されている前記ユーザプログラムの識別情報とを照合し、照合結果を前記表示部に表示させる照合部と、
を有することを特徴とするプログラム作成支援装置。
【請求項８】
前記表示部は、前記プログラマブルロジックコントローラから出力されるユーザプログラムの識別情報と、前記プログラムメモリに記憶されている前記ユーザプログラムの識別情報とが不一致である場合に、警告を表示するように構成されていることを特徴とする請求項７に記載のプログラム作成支援装置。
【請求項９】
前記表示部は、前記プログラマブルロジックコントローラから出力されたデバイス値を、前記ユーザプログラムのうち当該デバイス値に関連した命令語が記述されている部分と関連付けて表示するように構成されていることを特徴とする請求項７に記載のプログラム作成支援装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラマブルロジックコントローラおよびプログラム作成支援装置に関する。
【背景技術】
【０００２】
プログラマブル・ロジック・コントローラ（ＰＬＣ）はファクトリーオートメーションにおいて製造機器や搬送装置、検査装置を制御するコントローラである。ＰＬＣはユーザによって作成されるラダープログラムなどのユーザプログラムを実行することで様々な拡張ユニットや被制御機器を制御する。ユーザプログラムを実際にＰＬＣ上で実行してみて、ユーザプログラムの作成時には想定していなかった事象が見つかり、ユーザプログラムの修正が必要となることがある。ユーザは修正箇所を特定するためにユーザプログラムを見直すだけでなく、ＰＬＣが生成したログデータを参照する。ログデータにはユーザプログラムを実行しているときに収集されたデバイスの値（デバイス値）が記憶される。ＰＬＣの分野においてデバイスとは情報を記憶する記憶領域を意味する。デバイスとしては、１ビットの情報を保持するリレーデバイスや１ワードの情報を保持するワードデバイスなどがある。特許文献１によれば、デバイス値をロギングすることが提案されている。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開平１０−０１１１１８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
ところで、ユーザプログラムやＰＬＣの構成情報などはプロジェクトデータとして管理される。プログラム作成支援装置で作成されたプロジェクトデータはＰＬＣに転送されて、ＰＬＣで使用される。一方で、プログラム作成支援装置は、自在にプロジェクトデータを修正できる。その結果、ＰＬＣで使用されているプロジェクトデータと、プログラム作成支援装置に保持されているプロジェクトデータとの不一致が発生する。ログデータとプロジェクトデータとを並列に表示することで、ユーザによるプログラムの修正作業を補助するモニターソフトウエアがあればユーザにとって便利であろう。しかし、ログデータを取得したＰＬＣのプロジェクトデータのバージョンと、モニターソフトウエアが参照するプロジェクトデータとが一致していない場合、ユーザは正しい情報を得られない。したがって、ログデータをプロジェクトデータのバージョンと関連付けて取得することが必要となろう。
【０００５】
そこで、本発明は、ログデータと、プロジェクトデータまたはその識別情報を出力することで、ログデータとプロジェクトデータと関係を特定しやすくすることを目的とする。
【課題を解決するための手段】
【０００６】
本発明は、たとえば、
ユーザプログラムを記憶するプログラム記憶部と、
前記ユーザプログラムを繰り返し実行するプログラム実行部と、
前記プログラム実行部により参照される記憶領域である複数のデバイスを有するデバイス記憶部と、
前記複数のデバイスのいずれかに記憶されているデバイス値を時系列に記録するデバイス記録部と、
所定の保存条件が満たされると、前記デバイス記録部に記録されているデバイス値と、前記プログラム記憶部に記憶されている前記ユーザプログラムまたは当該ユーザプログラムの識別情報とを対応付けてメモリに保存する保存部と
を有することを特徴とするプログラマブルロジックコントローラを提供する。
【発明の効果】
【０００７】
本発明によればログデータと、プロジェクトデータまたはその識別情報を出力することで、ログデータとプロジェクトデータと関係を特定しやすくなる。
【図面の簡単な説明】
【０００８】
【図１】プログラマブルロジックコントローラシステムを示す図
【図２】ラダープログラムを説明する図
【図３】プログラム作成支援装置を説明する図
【図４】ＰＬＣを説明する図
【図５】ラダープログラムのスキャンを説明する図
【図６】プログラム作成支援装置の機能を説明する図
【図７】ロギングの設定方法を説明するフローチャート
【図８】プログラム部品の選択方法を説明する図
【図９】機能の選択方法を説明する図
【図１０Ａ】ユニットモニタを説明する図
【図１０Ｂ】ユニットモニタの設定を説明する図
【図１０Ｃ】抽出リストを説明する図
【図１１】抽出リストを説明する図
【図１２】抽出リストのマージを説明する図
【図１３】スキャンタイムへの影響の推定結果を説明する図
【図１４】デバイス種別の選択ＵＩを説明する図
【図１５】デバイスの抽出方法を示すフローチャート
【図１６】ユーザプログラムの一例を示す図
【図１７】基本ユニットの機能を説明する図
【図１８】構成情報の作成処理を説明する図
【図１９】基本ユニットのＣＰＵの機能を説明する図
【図２０】拡張ユニットのＣＰＵの機能を説明する図
【図２１】ログデータの一例を示す図
【図２２】基本ユニットにおけるロギング処理を示すフローチャート
【図２３】拡張ユニットにおけるロギング処理を示すフローチャート
【図２４】ＰＬＣの接続形態を示す図
【図２５】ＰＬＣの接続形態を示す図
【図２６】ロギングのタイミングを説明する図
【図２７】ログデータの表示を説明する図
【図２８】ログデータの表示ＵＩを説明する図
【図２９】収集時間の設定方法を説明する図
【図３０】収集時間の設定方法を説明する図
【図３１】デバッグ処理の概要を示すフローチャート
【図３２】出力部を説明する図
【図３３】プロジェクト作成部を説明する図
【図３４】ログ表示部を説明する図
【図３５Ａ】プログラム表示モジュールを説明する図
【図３５Ｂ】ユーザーインターフェースを説明する図
【図３５Ｃ】プロジェクトデータとログデータの表示モジュールを説明する図
【図３５Ｄ】警告画面を説明する図
【図３６Ａ】波形表示モジュールを説明する図
【図３６Ｂ】ユーザーインターフェースを説明する図
【図３６Ｃ】リアルタイムチャートモニタを説明する図
【図３７】再生制御モジュールを説明する図
【図３８】ユーザプログラムとデバイス値とを表示するＵＩを説明する図
【図３９】ＨＭＩのエミュレータを説明する図
【図４０】ユーザプログラムとデバイス値とを表示する処理を示すフローチャート
【図４１】デバイス値の波形を表示する処理を示すフローチャート
【図４２】再生制御を示すフローチャート
【図４３】相互に関連した複数のプログラム部品を説明する図
【図４４】プログラム部品とデバイスの抽出結果を表示するＵＩを説明する図
【図４５】プログラム部品とデバイスの抽出処理を示すフローチャート
【図４６】デバッグの流れを説明するフローチャート
【図４７】修正されたプログラム部品を説明する図
【発明を実施するための形態】
【０００９】
以下に本発明の一実施形態を示す。以下で説明される個別の実施形態は、本発明の上位概念、中位概念および下位概念など種々の概念を理解するために役立つであろう。また、本発明の技術的範囲は、特許請求の範囲によって確定されるのであって、以下の個別の実施形態によって限定されるわけではない。
【００１０】
＜システム構成＞
はじめにプログラマブルロジックコントローラ（ＰＬＣ、単にプログラマブルコントローラと呼ばれてもよい）を当業者にとってよりよく理解できるようにするために、一般的なＰＬＣの構成とその動作について説明する。
【００１１】
図１は、本発明の実施の形態によるプログラマブル・ロジック・コントローラシステムの一構成例を示す概念図である。図１が示すように、このシステムは、ラダープログラムなどのユーザプログラムの編集を行うためのＰＣ２と、工場等に設置される各種制御装置を統括的に制御するためのＰＬＣ（プログラマブルロジックコントローラ）１とを備えている。ＰＣはパーソナルコンピュータの略称である。ユーザプログラムは、ラダー言語やＳＦＣ（シーケンシャルファンクションチャート）などのフローチャート形式のモーションプログラムなどのグラフィカルプログラミング言語を用いて作成されてもよいし、Ｃ言語などの高級プログラミング言語を用いて作成されてもよい。以下では、説明の便宜上、ユーザプログラムはラダープログラムとする。ＰＬＣ１は、ＣＰＵが内蔵された基本ユニット３と、１つないし複数の拡張ユニット４を備えている。基本ユニット３に対して１つないし複数の拡張ユニット４が着脱可能となっている。たとえば、拡張ユニット４ａはモータ（フィールドデバイス１０ａ）を駆動してワークの位置決めする位置決めユニットであり、拡張ユニット４ｂはカウンタユニットであってもよい。カウンタユニットは手動パルサなどのエンコーダ（フィールドデバイス１０ｂ）からの信号をカウントする。なお、参照符号の末尾に付与されているａ、ｂ、ｃ・・・の文字は省略されることがある。基本ユニット３はＣＰＵユニットと呼ばれることもある。なお、ＰＬＣ１とＰＣ２とを含むシステムはプログラマブルロジックコントローラシステムと呼ばれてもよい。
【００１２】
基本ユニット３には、表示部５および操作部６が備えられている。表示部５は、基本ユニット３に取り付けられている各拡張ユニット４の動作状況などを表示することができる。操作部６の操作内容に応じて表示部５は表示内容を切り替える。表示部５は、通常、ＰＬＣ１内のデバイスの現在値（デバイス値）やＰＬＣ１内で生じたエラー情報などを表示する。デバイスとは、デバイス値（デバイスデータ）を格納するために設けられたメモリ上の領域を指す名称であり、デバイスメモリと呼ばれてもよい。デバイス値とは、入力機器からの入力状態、出力機器への出力状態およびユーザプログラム上で設定される内部リレー（補助リレー）、タイマー、カウンタ、データメモリ等の状態を示す情報である。デバイス値の型にはビット型とワード型がある。ビットデバイスは１ビットのデバイス値を記憶する。ワードデバイスは１ワードのデバイス値を記憶する。
【００１３】
拡張ユニット４は、ＰＬＣ１の機能を拡張するために用意されている。各拡張ユニット４には、その拡張ユニット４の機能に対応するフィールドデバイス（被制御装置）１０が接続され、これにより、各フィールドデバイス１０が拡張ユニット４を介して基本ユニット３に接続される。フィールドデバイス１０は、センサやカメラなどの入力機器であってもよいし、アクチュエータなどの出力機器であってもよい。また、一つの拡張ユニット４に対して複数のフィールドデバイスが接続されてもよい。
【００１４】
ＰＣ２はプログラム作成支援装置と呼ばれてもよい。ＰＣ２は、たとえば、携帯可能なノートタイプやタブレットタイプのパーソナルコンピュータであって、表示部７および操作部８を備えている。ＰＬＣ１を制御するためのユーザプログラムの一例であるラダープログラムは、ＰＣ２を用いて作成される。その作成されたラダープログラムは、ＰＣ２内でニモニックコードに変換される。ＰＣ２は、ＵＳＢ（Ｕｎｉｖｅｒｓａｌ  Ｓｅｒｉａｌ  Ｂｕｓ）などの通信ケーブル９を介してＰＬＣ１の基本ユニット３に接続され、ニモニックコードに変換されたラダープログラムを基本ユニット３に送る。基本ユニット３はラダープログラムをマシンコードに変換し、基本ユニット３に備えられたメモリ内に記憶する。なお、ここではニモニックコードが基本ユニット３に送信されているが、本発明はこれに限られない。たとえば、ＰＣ２は、ニモニックコードを中間コードに変換し、中間コードを基本ユニット３に送信してもよい。
【００１５】
なお、図１は示していないが、ＰＣ２の操作部８には、ＰＣ２に接続されたマウスなどのポインティングデバイスが含まれていてもよい。また、ＰＣ２は、ＵＳＢ以外の他の通信ケーブル９を介して、ＰＬＣ１の基本ユニット３に対して着脱可能に接続されるような構成であってもよい。また、通信ケーブル９を介さず、ＰＬＣ１の基本ユニット３に対して無線によって接続されるような構成であってもよい。
【００１６】
＜ラダープログラム＞
図２は、ラダープログラムの作成時にＰＣ２の表示部７に表示されるラダー図Ｌｄの一例を示す図である。ＰＣ２はマトリックス状に配置された複数のセルを表示部７に表示する。各セルには仮想デバイスのシンボルが配置される。シンボルは入力リレーや出力リレーなどを示している。複数のシンボルによってリレー回路が形成される。ラダー図Ｌｄには、たとえば、１０列×Ｎ行（Ｎは任意の自然数）のセルが配置されている。そして、各行のセル内には仮想デバイスのシンボルが適宜配置される。
【００１７】
図２が示すリレー回路は、入力装置からの入力信号に基づいてオン／オフされる３つの仮想デバイス（以下、「入力デバイス」と呼ぶ。）のシンボルと、出力装置の動作を制御するためにオン／オフされる仮想デバイス（以下、「出力デバイス」と呼ぶ。）のシンボルと、が適宜結合されることにより構成されている。
【００１８】
各入力デバイスのシンボルの上方に表示されている文字（「Ｒ０００１」、「Ｒ０００２」および「Ｒ０００３」）は、その入力デバイスのデバイス名（アドレス名）を表している。各入力デバイスのシンボルの下方に表示されている文字（「フラグ１」、「フラグ２」および「フラグ３」）は、その入力デバイスに対応付けられたデバイスコメントを表している。出力デバイスのシンボルの上方に表示されている文字（「原点復帰」）は、その出力デバイスの機能を表す文字列からなるラベルである。
【００１９】
図２が示す例では、デバイス名「Ｒ０００１」および「Ｒ０００２」にそれぞれ対応する２つの入力デバイスのシンボルが直列的に結合されることにより、ＡＮＤ回路が構成されている。また、これらの２つの入力デバイスのシンボルからなるＡＮＤ回路に対して、デバイス名「Ｒ０００３」に対応する入力デバイスのシンボルが並列的に結合されることにより、ＯＲ回路が構成されている。すなわち、このリレー回路では、一行目の２つのシンボルに対応する入力デバイスがいずれもオンした場合、または、二行目のシンボルに対応する入力デバイスがオンした場合にのみ、一行目のシンボルに対応する出力デバイスがオンになる。
【００２０】
＜プログラム作成支援装置＞
図３は、ＰＣ２の電気的構成について説明するためのブロック図である。図３が示すように、ＰＣ２は、ＣＰＵ２１、表示部７、操作部８、記憶装置２２および通信部２３を備えている。表示部７、操作部８、記憶装置２２および通信部２３は、それぞれＣＰＵ２１に対して電気的に接続されている。記憶装置２２はＲＡＭやＲＯＭを含み、さらに着脱可能なメモリカードを含んでもよい。ＣＰＵは中央演算処理装置の略称である。ＲＯＭはリードオンリーメモリの略称である。ＲＡＭはランダムアクセスメモリの略称である。
【００２１】
ユーザは、記憶装置２２に記憶されているコンピュータプログラム（編集ソフトウエア）をＣＰＵ２１に実行させて、操作部８を通じてプロジェクトデータを編集する。プロジェクトデータは、一つ以上のユーザープログラム（例：ラダープログラム）と、基本ユニット３や拡張ユニット４の構成情報などを含む。構成情報は、基本ユニット３に対する複数の拡張ユニット４の接続位置や、基本ユニット３に備えられた機能（例：通信機能や位置決め機能）を示す情報、拡張ユニット４の機能（例：撮影機能）などを示す情報である。ここで、プロジェクトデータの編集には、プロジェクトデータの作成および変更が含まれる。編集ソフトウエアを用いて作成されたプロジェクトデータは、記憶装置２２に記憶される。また、ユーザは、必要に応じて記憶装置２２に記憶されているプロジェクトデータを読み出し、そのプロジェクトデータを、編集ソフトウエアを用いて変更することができる。通信部２３は、通信ケーブル９を介してＰＣ２を基本ユニット３に通信可能に接続するためのものである。ＣＰＵ２１は通信部２３を介してプロジェクトデータを基本ユニット３に転送する。
【００２２】
＜ＰＬＣ＞
図４はＰＬＣ１の電気的構成について説明するためのブロック図である。図４が示すように、基本ユニット３は、ＣＰＵ３１、表示部５、操作部６、記憶装置３２および通信部３３を備えている。表示部５、操作部６、記憶装置３２、および通信部３３は、それぞれＣＰＵ３１に電気的に接続されている。記憶装置３２は、ＲＡＭやＲＯＭ、メモリカードなどを含んでもよい。記憶装置３２はデバイス部３４やプロジェクト記憶部３５、着脱可能なメモリカード３６などの複数の記憶領域を有している。デバイス部３４はビットデバイスやワードデバイスなどを有し、各デバイスはデバイス値を記憶する。プロジェクト記憶部３５は、ＰＣ２から入力されたプロジェクトデータを記憶する。記憶装置３２は基本ユニット３用の制御プログラムも記憶する。図４が示すように基本ユニット３と拡張ユニット４とは拡張バスの一種であるユニット内部バス９０を介して接続されている。なお、ユニット内部バス９０に関する通信機能は通信部３３の一部として実装されてもよい。通信部３３は、ネットワーク通信回路を有してもよい。ＣＰＵ３１は、通信部３３を介してログデータなどをＰＣ２やクラウドなどに送信してもよい。
【００２３】
ここで、ユニット内部バス９０について、補足説明する。このユニット内部バス９０は、次に説明する入出力リフレッシュ等が行われるバスであって、ユニット内部バス９０における通信制御は、いわゆるバスマスタ３８によって実現される（なお、通信部３３の一部としてバスマスタを設けてもよいし、ＣＰＵ３１の一部としてバスマスタ３８を設けてもよい）。バスマスタ３８は、ユニット内部バス９０での通信を制御するための制御回路であって、ＣＰＵ３１からの通信要求を受けて、拡張ユニット４との間で、後述する入出力リフレッシュ等の通信を行う。
【００２４】
拡張ユニット４はＣＰＵ４１とメモリ４２を備えている。ＣＰＵ４１は、デバイスに格納された基本ユニット３からの指示（デバイス値）にしたがってフィールドデバイス１０を制御する。また、ＣＰＵ４１は、フィールドデバイス１０の制御結果をバッファメモリとよばれるデバイスに格納する。デバイスに格納された制御結果は入出力リフレッシュによって基本ユニット３に転送される。また、デバイスに格納されている制御結果は、基本ユニット３からの読み出し命令にしたがって、入出力リフレッシュとは異なるタイミングであっても、基本ユニット３に転送される。メモリ４２はＲＡＭやＲＯＭなどを含む。とりわけ、ＲＡＭにはバッファメモリとして使用される記憶領域が確保されている。メモリ４２は、フィールドデバイス１０によって取得されたデータ（例：静止画データや動画データ）を一時的に保持するバッファを有してもよい。
【００２５】
図５は基本ユニット３のスキャンタイムを示す模式図である。図５が示すように１つのスキャンタイムＴは、入出力のリフレッシュを行うためのユニット間通信２０１、プログラム実行２０２、ＥＮＤ処理２０４により構成されている。ユニット間通信２０１で、基本ユニット３は、ラダープログラムを実行して得られた出力データを基本ユニット３内の記憶装置３２から拡張ユニット４などの外部機器に送信する。さらに、基本ユニット３は、拡張ユニット４などの外部機器から受信した入力データを基本ユニット３内の記憶装置３２に取り込む。つまり、基本ユニット３のデバイスに記憶されているデバイス値は出力リフレッシュによって拡張ユニット４のデバイスに反映される。同様に、拡張ユニット４のデバイスに記憶されているデバイス値は入力リフレッシュによって基本ユニット３のデバイスに反映される。このように入出力リフレッシュによって基本ユニット３のデバイスと拡張ユニット４のデバイスが同期する。なお、リフレッシュ以外のタイミングでデバイス値をユニット間で更新する仕組み（ユニット間同期）が採用されてもよい。ただし、基本ユニット３のデバイスは基本ユニット３が随時書き換えており、同様に、拡張ユニット４のデバイスは拡張ユニット４が随時書き換えている。つまり、基本ユニット３のデバイスは基本ユニット３の内部の装置によって随時アクセス可能である。同様に、拡張ユニット４のデバイスは拡張ユニット４の内部の装置によって随時アクセス可能になっている。基本ユニット３と拡張ユニット４との間では基本的にリフレッシュのタイミングにおいて相互にデバイス値を更新して同期する。プログラム実行２０２で、基本ユニット３は、更新された入力データを用いてプログラムを実行（演算）する。図５が示すようにプログラム実行２０２においては複数のプログラムモジュールまたはラダープログラムがプロジェクトデータにしたがって順番に実行されてもよい。基本ユニット３はプログラムの実行によりデータを演算処理する。なお、ＥＮＤ処理とは、ＰＣ２や基本ユニット３に接続された表示器（図示せず）等の外部機器とのデータ通信、システムのエラーチェック等の周辺サービスに関する処理全般を意味する。
【００２６】
このように、ＰＣ２はユーザの操作に応じたラダープログラムを作成し、作成したラダープログラムをＰＬＣ１に転送する。ＰＬＣ１は、入出力リフレッシュ、ラダープログラムの実行およびＥＮＤ処理を１サイクル（１スキャン）として、このサイクルを周期的、すなわちサイクリックに繰り返し実行する。これにより、各種の入力機器（センサ等）からのタイミング信号に基づいて、各種の出力機器（モータ等）を制御する。なお、スキャン周期とは別に、基本ユニット３や拡張ユニット４はそれぞれ内部制御周期を有している。基本ユニット３や拡張ユニット４は内部制御周期を基準としてフィールドデバイス１０などの機能を制御する。
【００２７】
＜ロギング＞
ユーザがユーザプログラムを改良したり、修正したりする際に、ＰＬＣ１がユーザプログラムを実行している際に取得されたデバイス値が役に立つことがある。そこで、ＰＬＣ１は予め指定されたデバイス値を取得し、ログデータを作成する。ここで、ＰＬＣ１が管理するデバイスには、ユーザプログラムによって利用されるものだけでなく、ユーザプログラムによって利用されないものも存在する。また、ユーザプログラムを改良したり、修正したりする際に役立つデバイスもあれば、役に立たないデバイスもある。一般にデバイスの数は数千個に及ぶため、ユーザが必要なデバイスを指定することは大きな負担となっていた。そこで、ＰＣ２は、ユーザプログラムを解析し、ユーザプログラムに使用または記述されているデバイスをロギング対象として抽出する。これにより、ユーザの負担が軽減される。
【００２８】
ＰＬＣ１が管理するすべてのデバイスをロギングの対象とすると、スキャンタイムが長くなってしまう。なぜなら、ロギングは、ユーザプログラムの一つとして実行されたり、入出力リフレッシュの際に実行されたりするからである。時には、ロギングのもたらす遅延によって、ユーザプログラムがユーザの希望通りに動作しないこともありうる。したがって、ロギング対象のデバイスの数は適切に維持されるべきであろう。
【００２９】
ユーザプログラムは、複数のプログラム部品（例：プログラムモジュール（メインのラダープログラムとサブのラダープログラム）、ファンクションブロック）から構成されることがある。このうち、ユーザが修正を希望するプログラム部品に関連したデバイスがロギングされれば、ユーザにとって十分な場合がある。また、複数のプログラム部品のうちで、ユーザは特定のプログラム部品を抽出対象から除外したり、特定のプログラム部品を抽出対象に追加したりすることを希望することもあろう。よって、プログラム部品を単位として、ロギング対象からデバイスを追加または削除できればユーザにとって便利であろう。
【００３０】
上述したように基本ユニット３や拡張ユニット４は一つ以上の機能を有している。各機能には様々なデバイスが割り付けられている。よって、これらの機能を単位として、ロギング対象からデバイスを追加または削除できればユーザにとって便利であろう。たとえば、基本ユニット３の通信機能に関する望ましくないイベントが発生した場合、ユーザは、基本ユニット３の通信機能に関するデバイスのデバイス値を参照することで、このイベントを解消することが容易になろう。
【００３１】
●ロギングの設定（自動抽出と加除）
図６はＰＣ２のＣＰＵ２１が記憶装置２２に記憶されている編集ソフトウエアを実行することで実現される機能を示している。これらの機能の一部またはすべてはＡＳＩＣやＦＰＧＡなどのハードウエア回路により実現されてもよい。ＡＳＩＣは特定用途集積回路の略称である。ＦＰＧＡはフィールドプログラマブルゲートアレイの略称である。
【００３２】
なお、本実施形態では、図６に示す機能をＰＣ２上で実現することとしたが、本発明はこれに限られず、ＰＬＣ１上で実現しても構わない。
【００３３】
プロジェクト作成部５０は、表示部７にプロジェクトデータ７１を作成するためのＵＩを表示し、操作部８から入力されたユーザ指示にしたがってプロジェクトデータ７１を作成し、記憶装置２２に記憶する。ＵＩはユーザーインターフェースの略称である。プロジェクトデータ７１には、ユーザプログラムと、ＰＬＣ１の構成情報などが含まれている。プログラム作成部６３は、ＵＩを介したユーザ操作に基づいて、ユーザプログラムを構成する複数のプログラム部品（各モジュール）を作成する。機能設定部６２は、基本ユニット３の機能や拡張ユニット４の機能に関する設定を実行する。たとえば、機能設定部６２は、基本ユニット３に設けられた機能に対していずれかのデバイスを割り付けたり、拡張ユニット４に設けられた機能に対していずれかのデバイスを割り付けたりし、機能とデバイスとの関係を示す割付情報を構成情報に書き込む。なお、プロジェクト作成部５０は、ユーザプログラムがどのようなプログラム部品から構成されているかを示すプログラム構成情報も、プロジェクトデータ７１として記憶させる。ＰＬＣ１全体がどのようなユニットから構成されるかを示すユニット構成情報も、プロジェクトデータ７１として記憶させる。
【００３４】
ログ設定部５１は、プロジェクトデータ７１を解析することでプロジェクトデータ７１に記述されているデバイスを抽出し、抽出されたデバイスをロギング対象として設定するためのログ設定データ７２を作成する。ログ設定部５１は各種の機能を有している。部品指定部５２は、操作部８から入力されるユーザ指示にしたがって、デバイスの抽出対象となるプログラム部品を指定する。また、部品指定部５２は、操作部８から入力されるユーザ指示にしたがって、デバイスの抽出対象から除外されるプログラム部品を指定する。
【００３５】
デバイス抽出部５３は、プロジェクトデータ７１を解析することでプロジェクトデータ７１に記述されているデバイスを抽出し、ログ設定データ７２を作成する。追加部５４は、部品指定部５２により抽出対象として指定されたプログラム部品を解析し、プログラム部品に記述されているデバイスを抽出し、抽出リストに追加する。  削除部５５は、部品指定部５２により除外対象として指定されたプログラム部品を解析し、プログラム部品に記述されているデバイスを抽出し、抽出されたデバイスを抽出リストから削除する。あるいは、削除部５５は、抽出されたデバイスを除外リストに追加する。マージ部５６は、複数のプログラム部品からそれぞれ抽出されたデバイスのうち、重複して抽出されたデバイスを抽出リストから削除する。特定部５７は、プロジェクトデータ７１においてメモリカードに対する命令語を検知し、当該命令語の対象となっているデバイスを特定し、特定されたデバイスを抽出リストに追加する。
【００３６】
本実施形態では、部品指定部５２がプログラム部品を指定した後、追加部５４が、その指定されたプログラム部品を解析することにより、ロギング対象となるデバイスを抽出・追加することとしたが、本発明はこれに限られない。例えば、追加部５４は、プロジェクトデータ７１に含まれる一又は複数のプログラム部品を先に解析することでデバイスを抽出し、抽出されたデバイスを抽出リストに追加した後で、部品指定部５２によって指定されたプログラム部品に記述されたデバイスを抽出し、これを抽出リストへ追加するようにしてもよい。
【００３７】
同様にして、削除部５５は、プロジェクトデータ７１に含まれる一又は複数のプログラム部品を先に解析することで抽出リストを作成した後で、部品指定部５２によって指定されたプログラム部品に記述されたデバイスを抽出し、これを抽出リストから削除するようにしてもよい。
【００３８】
なお、本実施形態では、説明の便宜上、追加部５４と削除部５５を分けているが、一つの機能ブロックであってもよいことは言うまでもない。
【００３９】
手動設定部５８は、操作部８を通じて入力されるユーザ指示に従って一つのデバイスや、関連した一連のデバイスを抽出リストに追加する。推定部５９は、デバイス抽出部５３により記録対象として抽出されたデバイスの数に基づきＰＬＣ１によるデバイス値の記録がユーザプログラムの実行に与える影響を推定する。ロギングによってデバイス値の数に相関した遅延時間がスキャンタイムに加算される。よって、推定部５９は、デバイス値の数に所定係数を乗算することで遅延時間を求め、遅延時間を推定結果として表示部７に表示してもよい。この遅延時間はスキャンタイムの伸びと呼ばれてもよい。
【００４０】
機能指定部６０は、操作部８から入力されるユーザ指示にしたがって、デバイスの抽出対象となる基本ユニット３の機能や拡張ユニット４の機能を指定する。また、機能指定部６０は、操作部８から入力されるユーザ指示にしたがって、デバイスの抽出対象から除外される基本ユニット３の機能や拡張ユニット４の機能を指定する。追加部５４は、機能指定部６０により抽出対象として指定された機能の構成情報を解析し、構成情報により当該機能に割り付けられたデバイスを抽出し、抽出リストに追加する。  削除部５５は、機能指定部６０により除外対象として指定された機能の構成情報を解析し、構成情報により当該機能に割り付けられているデバイスを抽出し、抽出されたデバイスを抽出リストから削除する。マージ部５６は、複数の機能のそれぞれについて抽出されたデバイスのうち、重複して抽出されたデバイスを抽出リストから削除する。特定部５７は、プロジェクトデータ７１においてメモリカードに対する命令語を検知し、当該命令語の対象となっているデバイスを特定し、特定されたデバイスを抽出リストに追加する。
【００４１】
ログ表示部６１は、ＰＬＣ１において生成されたログデータ７３を、メモリカード３６を介して読み出し、表示部７にログデータ７３を表示する。たとえば、ログ表示部６１は、ログデータ７３に記録されているデバイス値と、プロジェクトデータ７１のプログラム部品とを関連付けて表示部７に表示してもよい。ログ表示部６１は、プログラマブルロジックコントローラ用のエンジニアリングツールの中核をなす。
【００４２】
図７はロギングの設定方法を示すフローチャートである。ここでは、すでにユーザプログラムを含むプロジェクトデータ７１は完成しているものとする。
【００４３】
Ｓ１でＣＰＵ２１（部品指定部５２）はデバイスの抽出対象となるプログラム部品の指定を受け付ける。
【００４４】
図８はデバイスを抽出されるプログラム部品の選択を受け付けるためのＵＩ１００を示している。ログ設定部５１は、ロギングの設定プログラムが起動されると、表示部７にＵＩ１００を表示する。ＵＩ１００において、複数のプログラム部品はそれぞれの分類（モジュール／ファンクションブロック／マクロ）に基づいてツリー状に示されている。また、各プログラム部品にはチェックボックス１０２が関連付けて表示されている。操作部８の操作に応じてポインタ１０１がチェックボックス１０２にチェックを付与すると、追加部５４は、チェックを付与されたチェックボックス１０２に対応するプログラム部品を抽出リストに追加する。一方、操作部８の操作に応じてポインタ１０１がチェックボックス１０２のチェックを外すと、削除部５５は、チェックを外れたチェックボックス１０２に対応するプログラム部品を抽出リストから削除（除外）する。
【００４５】
なお、図８において毎スキャンモジュールとは、ユーザプログラムが一スキャンされるたびに一回実行されるプログラム部品である。この例では、毎スキャンモジュールは、メインプログラムとサブモジュールとを有している。定周期モジュールは、一定の周期ごとに実行されるプログラム部品である。ユニット間同期モジュールは、ユニット間同期が実行されるたびに実行されるプログラム部品である。初期化モジュールは図示されていないが、初期化モジュールはユーザプログラムを起動すると最初に実行されるモジュールである。そのため、初期化モジュールはトラブルの原因となりにくいため、デバイスの抽出対象から除外されてもよい。
【００４６】
ファンクションブロック（ＦＢ）は、ユーザプログラムにより呼び出されて使用される。ファンクションブロックは複数のモジュールから呼び出されるため、それぞれ個別のインスタンスを生成する。この場合、複数のインスタンスがそれぞれデバイスの抽出対象として選択されてもよいし、元のファンクションブロックを選択することでそのファンクションブロックに関連して生成されるすべてインスタンスがデバイスの抽出対象として選択されてもよい。
【００４７】
マクロは、プログラムの一種であり、データ整形のためのマクロなどがある。
【００４８】
Ｓ２でＣＰＵ２１（機能指定部６０）はデバイスの抽出対象となる機能の指定を受け付ける。
【００４９】
図９はデバイスを抽出される機能の選択を受け付けるためのＵＩ１１０を示している。ログ設定部５１は、ロギングの設定プログラムが起動されると、表示部７にＵＩ１１０を表示する。なお、ＵＩ１００とＵＩ１１０は同時に表示されてもよいし、ユーザ操作にしたがって選択的に表示されてもよい。ＵＩ１１０において、複数の機能はそれぞれが属するユニットに基づいてツリー状に示されている。また、各機能にはチェックボックス１０２が関連付けて表示されている。操作部８の操作に応じてポインタ１０１がチェックボックス１０２にチェックを付与すると、追加部５４は、チェックを付与されたチェックボックス１０２に対応する機能を抽出リストに追加する。一方、操作部８の操作に応じてポインタ１０１がチェックボックス１０２のチェックを外すと、削除部５５は、チェックを外れたチェックボックス１０２に対応する機能を抽出リストから削除（除外）する。
【００５０】
図９において基本ユニット３の機能である通信エラーモニタは通信部３３の通信エラーを監視する機能である。センサＩ／Ｏモニタはセンサの入出力を監視する機能である。モーションユニットは位置決めユニットとも呼ばれ、軸とよばれる制御対象の位置を制御する。一般に軸ごとにモータなどの駆動源が存在する。アナログ入力ユニットは、入力されるアナログ信号をサンプリングしてデジタル信号に変換するユニットである。ユニットモニタはモーションユニットやアナログ入力ユニットなどの拡張ユニット４の動作を監視する機能である。
【００５１】
ここで、ユニットモニタの一例として、モーションユニットのユニットモニタについて、更に詳述する。図１０Ａは、モーションユニットの軸１についてのユニットモニタ４４０の画面の模式図である。図１０Ｂは、ユニットモニタ４４０による監視の対象を変更するための設定画面４４１の模式図である。
【００５２】
図１０Ａに示すように、ユニットモニタ４４０による監視対象として、現在座標、指令座標、現在速度、指令速度、帰還トルク、負荷率、ピーク電流といった各項目が設定されている。各項目には、バッファメモリ（ＵＧ）が割り当てられている。例えば、現在座標には、ＵＧ４とＵＧ５が割り当てられている。本実施形態では、１個のＵＧに１６ビットを確保しており、現在座標を３２ビット表現するために、２個のＵＧを確保している。ＵＧのデバイス値としては、例えば、０ＰＬＳ（パルス）のような数値となる。また、指令座標には、ＵＧ８とＵＧ９が割り当てられている。２個のＵＧを確保しているのは、上述と同様の理由である（３２ビット表現の確保のため）。ＵＧの割り当ては、ユニット設計者が自由に行うことができるので、未使用のＵＧ（ＵＧ６やＵＧ７）も幾つか存在している。同様にして、現在速度にはＵＧ１０，ＵＧ１１が、指令速度にはＵＧ１２，ＵＧ１３が、それぞれ割り当てられている。その他、図１０Ａでは、帰還トルク、負荷率、ピーク電流などの各項目に対してＵＧが割り当てられている。
【００５３】
図１０Ｂに示すように、どの項目をユニットモニタ４４０による監視対象とするかは、ユーザが自由に選択（設定）できる。例えば、図１０Ｂに示す「非表示」の欄４４２から１項目を選択し、右矢印ボタン４４３をクリックすることで、その１項目が「表示」の欄４４４へ移動し、ユニットモニタ４４０による監視対象となる。ＯＫボタン４４５をクリックすることで、「表示」の欄４４４に列挙された項目が監視対象として確定する。なお、図１０Ａ及び図１０Ｂでは、モーションユニットの軸１についてのみ説明したが、軸２，軸３と複数ある場合にも、同様である。各軸について、ユーザにより選択された項目が監視対象となる。
【００５４】
一般に、モーションユニット（拡張ユニット４ａ）を使って、モータ（フィールドデバイス１０ａ）を駆動してワークの位置決めを行う場合、基本ユニット３は、モータの位置決め開始トリガーを示すリレーデバイスをＯＮすることにより、拡張ユニット４ａに対して動作開始指令を送る。そして、動作開始指令を送った後は、拡張ユニット４ａにおける具体的な処理動作（ワークの位置決め）に関与しない。言い換えると、基本ユニット３は、モータの現在位置や現在速度をリアルタイムに逐一認識しておらず、逐一認識する必要もない。その後、拡張ユニット４ａにおける処理動作が完了した場合、基本ユニット３は、モータの位置決め完了トリガーを示すリレーデバイスがＯＮされたことを通じて、モータの位置決め完了を認識する。このようなことから、モータの現在座標や現在速度に対応するデバイス（ＵＧ）は、基本的に、ラダープログラムには記述されない（但し、ユーザは、ごく一部のＵＧを読み出すための特別な命令語をラダープログラムに記述することは可能である）。
【００５５】
しかし、ＰＬＣの運用時にトラブルが生じた場合に、その原因究明の為、トラブルが生じた時点でのモータの現在座標や現在速度を把握したいことがある。このようなときに、上述したようにモータの現在座標や現在速度は、基本的にはラダープログラムに記述されるものではないため、ロギング対象としての抽出リストに挙がっていないことが多く、その原因究明が容易でなかった。
【００５６】
そこで、本実施形態では、ユーザは、図９に示すＵＩ１１０を通じて、モーションユニットのユニットモニタを選択できるようにしている。これにより、追加部５４は、図１０Ｂを用いて説明したように、モーションユニットのユニットモニタ４４０による監視の対象となっているＵＧを抽出リストに自動追加することができる。なお、基本ユニット３の通信エラーモニタ・センサＩ／Ｏモニタ、アナログ入力ユニットのユニットモニタについても、同様である。各モニタによる監視の対象となっているデバイス又はパラメータを抽出リストに自動追加することができる。
【００５７】
なお、その他のモニタについて図示は省略するが、簡単に説明する。基本ユニット３の機能である通信エラーモニタは、例えば、サイクリック通信の開設タイムアウトエラーに割り付けられたデバイスを監視する。センサの入出力を監視するセンサＩ／Ｏモニタは、例えば、一又は複数のセンサの出力やエラー有無に割り付けられたデバイスを監視する。アナログ入力ユニットのユニットモニタは、例えば、ＡＤ変換データ、特殊データ、オフセット値、ゼロシフト、ピーク値、ボトム値などの各種パラメータに割り付けられたデバイス（ＤＭ又はＲ）を監視する。これらのデバイスは、ユニット設計者によって、予めデフォルト（初期設定）として割り付けられたものであるが、上述したモーションユニットのユニットモニタのように、ユーザによって監視対象が変更されてもよい。要するに、図９に示すＵＩ１１０は、ユーザから機能の選択入力を受け付け可能な設定画面となっている。そして、選択入力される機能ごとに、表示部（モニタ）に表示させる監視項目を定めたテンプレート（設定情報）が対応付けられている（テンプレートはメモリに保存されている）。そのテンプレートによって特定されるデバイスは、上述したように予めデフォルトで割り付けられたものであってもよいし、ユーザが設定画面を介して加除（編集）した後のものであってもよい。機能指定部６０は、ユーザ操作に基づいて一又は複数の機能を選択すると、その機能に対応付けられたテンプレートに従って、監視対象となるデバイスを抽出リストに追加する。
【００５８】
Ｓ３でデバイス抽出部５３は部品指定部５２により指定されたプログラム部品を解析し、指定されたプログラム部品において記述されているデバイスを抽出する。
【００５９】
図１０Ｃはプロジェクトデータ７１に含まれる複数のプログラム部品のうち指定されたプログラム部品から抽出されたデバイスの一例を示している。図１０Ｃによれば、デバイスを抽出されたプログラム部品の名称と、先頭デバイスの名称（デバイス番号）と、先頭デバイスを基準として抽出されるデバイスの個数と、実際にロギング対象として抽出されたデバイス名とが示されている。一般に、先頭デバイスを基準として指定個数に相当する数のデバイスが抽出される。しかし、指定個数を超えた数のデバイスが抽出されることもある。Ｒ３４０００はリレーデバイスであり、１ビットの情報を保持するデバイスであるが、Ｒ３４０００からＲ３４０１５までの一連の１６個のデバイスが抽出されている。これは、１６ビット分のデバイスをまとめてロギングしたほうが、データ処理速度の観点で有利だからである。なお、図１０Ｃにおいて、Ｒ３４０００の個数は「１」となっているが、これは１ワード（１６ビット）を示している。また、ＣＲ４００１の個数も「１」となっているが、これも１ワード（ＣＲ４００１，ＣＲ４００２，・・・，ＣＲ４０１５，ＣＲ４１００の１６ビット）を示している。グローバルとは、複数のプログラム部品から共通に使用されるデバイスである。Ｍａｉｎはメインプログラムを示している。ｆｉｒｓｔ＿ｏｐｅｒａｔｉｏｎはファンクションブロックの名称である。Ｓｕｂはサブプログラム（サブモジュール）を示している。
【００６０】
Ｓ４でデバイス抽出部５３は機能指定部６０により指定された機能の構成情報を解析し、構成情報において機能と関連付けられているデバイスを抽出する。
【００６１】
図１１はＰＬＣ１に備えられた複数の機能（基本ユニット３および拡張ユニット４）のうち指定された機能（ユニット）から抽出されたデバイスの一例を示している。この例では、機能指定部６０により指定されたモーションユニットからいくつかのバッファメモリ（ＵＧ）が抽出されている。図１１によれば、デバイスを抽出された機能の名称と、先頭デバイスの名称（デバイス番号）と、先頭デバイスを基準として抽出されるデバイスの個数と、実際にロギング対象として抽出されたデバイス名とが示されている。ここでは、モーションユニットのユニットモニタにより監視可能なデバイスが抽出されている。すなわち、図１０Ａを用いて上述したように、ＵＧ４−ＵＧ５はモータの現在座標を示しており、ＵＧ８−ＵＧ９はモータの指令座標を示しており、ＵＧ１０−ＵＧ１１はモータの現在速度を示しており、ＵＧ１２−ＵＧ１３はモータの指令速度を示している。その他のＵＧについては、説明を省略する。
【００６２】
Ｓ５で手動設定部５８は操作部８を通じてユーザにより手動で指定されたデバイスを抽出リストに追加する。たとえば、手動設定部５８は、デバイス番号などを直接入力可能なＵＩを表示部７に表示し、ユーザによるデバイスの指定を補助してもよい。
【００６３】
Ｓ６でマージ部５６は、プログラム部品から抽出されたデバイス、機能から抽出されたデバイスおよび手動で追加されたデバイスをマージしてロギング対象リストを作成する。ロギング対象リストはデバイスリストと呼ばれてもよい。
【００６４】
図１２はマージ処理の概念を説明する図である。デバイス抽出部５３はプログラム部品から抽出されたデバイスを記述した抽出リストＬ１を作成する。デバイス抽出部５３は機能から抽出されたデバイスを記述した抽出リストＬ２を作成する。デバイス抽出部５３はユーザにより手動で追加されたデバイスを記述した抽出リストＬ３を作成する。マージ部５６は、抽出リストＬ１〜Ｌ３をマージしてロギング対象リストＬ０を作成する。抽出リストＬ１〜Ｌ３は、重複して抽出されたデバイスが存在する可能性がある。同一のデバイスが複数回にわたりロギングされると、ログデータが肥大化する。よって、同一のデバイスの重複したロギングを回避するために、マージ処理が実行される。たとえば、抽出リストＬ１ではデバイスの一種であるデータメモリＤＭ０−ＤＭ１００が登録されている。また、抽出リストＬ３ではデータメモリＤＭ５０−ＤＭ２００が登録されている。つまり、ＤＭ５０−ＤＭ１００は重複している。マージ部５６は、ＤＭ０−ＤＭ１００とＤＭ５０−ＤＭ２００をマージしてＤＭ０−ＤＭ２００をロギング対象リストＬ０に記述する。
【００６５】
Ｓ７で推定部５９はロギング対象リストＬ０を解析し、スキャンタイムへの影響を推定し、推定結果を表示部７に表示する。
【００６６】
図１３は推定結果を表示するためのＵＩ１４０を示している。ＵＩ１４０はデバイスサイズとスキャンタイムの伸びとを表示する。デバイスサイズとは、ロギング対象リストＬ０に記述されているデバイスのトータルサイズを示している。スキャンタイムの伸びとは、ロギングによって発生する遅延時間である。推定部５９はロギング対象リストＬ０を解析し、デバイスサイズとスキャンタイムの伸びとを演算する。操作部８を通じてリストボタン１４１が操作されると、推定部５９はロギング対象リストＬ０を表示部７に表示してもよい。ユーザは、推定結果を考慮し、ロギング対象リストＬ０を確定するか、調整するかを判断する。ロギング対象リストＬ０を確定する場合、ユーザは、確定の意思を示すボタンをポインタ１０１により操作してもよい。
【００６７】
Ｓ８でログ設定部５１はロギング対象を確定するかどうかを判定する。たとえば、ロギング対象リストＬ０を確定するためのボタンが操作されると、ログ設定部５１はロギング対象を確定すると判定する。一方で、ロギング対象リストＬ０を修正するためのボタンが操作されると、ログ設定部５１はロギング対象を修正すると判定する。ロギング対象を修正する場合、ログ設定部５１はＳ３ないしＳ８を繰り返すことで、デバイスの抽出対象となるプログラム部品および機能の追加や削除を受け付け、ロギング対象リストＬ０を修正する。たとえば、スキャンタイムの伸びが許容閾値を超えると、いくつかのデバイスが削除される。スキャンタイムの伸びが許容閾値未満であれば、いくつかのデバイスが追加されてもよい。ロギング対象が確定すると、ＣＰＵ２１はＳ９に進む。
【００６８】
Ｓ９でログ設定部５１はロギング対象リストＬ０を含むログ設定データ７２を作成し、記憶装置２２に格納する。なお、ＣＰＵ２１は、プロジェクトデータ７１とともにログ設定データ７２を基本ユニット３に送信するよう通信部２３を制御する。
【００６９】
ここでは、主にデータメモリやバッファメモリなどのデバイスがロギング対象とされているが、各機能の動作状態や機能設定状態（例：ＩＰアドレスなど）もロギング対象として追加されてもよい。
【００７０】
図１４はデバイスの抽出処理で使用されるフィルタの設定ＵＩ１２０を示している。ＰＬＣ１に関連したデバイスとしては複数の種別のデバイスが存在する。ユーザは特定の種別のデバイスに着目し、他の種別のデバイスについては無視したいと考えることもある。そこで、ログ設定部５１は、フィルタの設定ＵＩ１２０を表示部７に表示し、抽出対象とするデバイス種別と、除外対象とするデバイス種別とをチェックボックス１０２を通じて受け付けてもよい。たとえば、デバイス抽出部５３は、チェックボックス１０２にチェックを付与されたデバイス種別をプログラム部品や機能から抽出する。デバイス抽出部５３は、チェックボックス１０２からチェックを外されたデバイス種別をプログラム部品や機能から抽出しない。これにより、ユーザの意図に沿って用意にロギング対象となるデバイスを取捨選択することが可能となる。
【００７１】
ところで、ＣＰＵ２１は、プロジェクト作成部５０によってプロジェクトデータ７１が変更されると、デバイスの抽出処理を再度実行してもよい。これは、ユーザプログラムにおけるデバイスの記述が変更されている可能性があるからである。ＣＰＵ２１は、プロジェクト作成部５０がプロジェクトデータ７１の転送を実行する際に、デバイスの抽出処理を実行してもよい。プロジェクトデータ７１は最終的にＰＬＣ１に書き込まれるため、この書き込みをトリガーとしてデバイスの抽出処理を実行することで、デバイスの抽出処理の実行回数が削減されよう。
【００７２】
デバイス抽出部５３はＰＣ２に実装されているが、基本ユニット３に実装されてもよい。ＣＰＵ３１は、プロジェクトデータ７１のうちＰＣ２により指定されたプログラム部品や機能からデバイスを抽出し、ログ設定データ７２を作成する。この場合、推定部５９も基本ユニット３に実装されることになろう
●デバイスの抽出処理
図１５はデバイス抽出部５３が実行するプログラム部品からのデバイスの抽出処理を示すフローチャートである。図１６はラダープログラムの一例を示している。このラダープログラムは拡張ユニット４として４軸を駆動するモーションユニットを制御するためのものである。
【００７３】
Ｓ１１でデバイス抽出部５３は、抽出対象として指定されたプログラム部品のｉ番目のステップの記述からデバイス番号を取得する。ｉの初期値は００１である。図１６が示すように、ラダープログラムの左端にはステップ番号が付与されている。００１番のステップには、ＭＲ０００というリレーデバイスがオンになると、モーションユニットに動作許可を与えるＲ３４０００というリレーデバイスがオンにし、かつ、モーションユニットの１番目の軸のサーボを稼動させるためのＲ３４３０５というリレーデバイスをオンにすることが記述されている。よって、デバイス抽出部５３は、デバイス番号としてＭＲ０００、Ｒ３４０００およびＲ３４３０５を抽出する。なお、デバイス番号が間接参照やインデックス参照により記述されていることもある。この場合、デバイス抽出部５３は、間接参照先やインデックス値を代入しているプログラムを検索し、実際のデバイス番号を特定する。なお、デバイス抽出部５３は、実際のデバイス番号の抽出に失敗すると、抽出失敗を示すメッセージを表示部７に表示してもよい。さらに、デバイス抽出部５３は、実際のデバイス番号をユーザに入力させるためのＵＩを表示部７に表示し、ユーザ入力を受け付けてもよい。さらにまた、上述した間接参照やインデックス参照を考慮すれば、デバイス抽出部５３は、プログラムに直接記述されている特定のデバイスを抽出するだけでなく、プログラムに使用される特定のデバイス（間接参照やインデックス参照により特定されるデバイス等）をも抽出する。
【００７４】
Ｓ１２でデバイス抽出部５３は、命令語のアクセス範囲からデバイス範囲を取得する。命令語によっては、先頭デバイスのデバイス番号と、先頭デバイスを基準としたデバイスの個数とを引数とするものがある。たとえば、００３番のステップにはリレーデバイスＭＲ０００がオンになると、ＦＭＯＶという命令語を実行することが記述されている。この例では、ＦＭＯＶは、指定された値（０）を、先頭デバイス（＠ＥＭ０）を基準とした指定個数（１０個）のデバイスに代入するための命令語（関連デバイスの初期化をするための命令語）である。つまり、アクセス範囲は、先頭アドレスと指定個数とによって定義されている。デバイス抽出部５３は、＠ＥＭ０から＠ＥＭ９までの範囲をデバイス範囲に決定する。なお、アクセス範囲が間接参照やインデックス参照により記述されていることもある。この場合、デバイス抽出部５３は、間接参照先やインデックス値を代入しているプログラムを検索し、実際のアクセス範囲を特定する。なお、デバイス抽出部５３は、実際のアクセス範囲の抽出に失敗すると、抽出失敗を示すメッセージを表示部７に表示してもよい。さらに、デバイス抽出部５３は、実際のアクセス範囲をユーザに入力させるためのＵＩを表示部７に表示し、ユーザ入力を受け付けてもよい。
【００７５】
Ｓ１３でデバイス抽出部５３は、先頭デバイス番号とデバイス範囲に基づきデバイスを抽出し、抽出したデバイスを抽出リストに追加する。たとえば、００１番のステップからはＭＲ０００、Ｒ３４０００およびＲ３４００５が抽出され、抽出リストに追加される。００３番のステップからは＠ＥＭ０から＠ＥＭ９が抽出され、抽出リストに追加される。
【００７６】
Ｓ１４でデバイス抽出部５３は、指定されたプログラム部品についてプログラム終端までデバイスの解析を終了したかどうかを判定する。プログラム終端までデバイスの解析を終了していなければ、デバイス抽出部５３はＳ１５に進む。Ｓ１５でデバイス抽出部５３は変数ｉに１を加算して、Ｓ１１に戻る。プログラム終端までデバイスの解析を終了したのであれば、デバイス抽出部５３はデバイスの抽出処理を終了する。
【００７７】
なお、図１６に示すラダープログラムにおいて、００４番のステップ以降から抽出されるデバイスについて、以下、簡単に説明する。
【００７８】
００４，００５番のステップは、モータの原点復帰（動作）要求であり、Ｒ３４３１０は、モータの原点復帰開始トリガーを示すリレーデバイスである。本ステップからは、ＭＲ００１、Ｒ３４３１０、Ｒ４０９０５，Ｒ４０９１０，Ｒ３４３１０の各デバイスが抽出される。
【００７９】
００６〜００８番のステップは、モータの原点復帰が完了した場合に、モーションユニットから原点復帰完了コードを読み出して、原点復帰が正しく完了しているか否かを判断する処理である。より具体的に説明すると、Ｒ４０９１０は、モータの原点復帰完了トリガーを示すリレーデバイスである。基本ユニット３は、モーションユニットにおける原点復帰の具体的処理動作をリアルタイムに逐一認識しておらず、このフラグＲ４０９１０がＯＮしたか否かを監視することで、原点復帰が完了したか否かを判断する。このフラグＲ４０９１０がＯＮすると、バッファメモリをダイレクトに読み出すＵＲＥＡＤ命令を実行する。図１６に示すＵＲＥＡＤ命令は、ユニット番号１のユニットにおける４０６０番のバッファメモリを読み出し、デバイス＠ＥＭ０に１ワード分を代入する、という命令である。ここでは、４０６０番のバッファメモリには、原点復帰完了コードが格納されており、原点復帰が正常に終了した場合には０、原点復帰が異常終了した場合には０以外の数値（１や２等）が格納されるようになっている。そして、００７番のステップに示すように、＠ＥＭ０のデバイス値が０以外の場合には、基本ユニット３は、デバイスＭＲ０００をセットし、原点復帰が異常終了したことを認識する。一方、００８番のステップに示すように、＠ＥＭ０のデバイス値が０の場合には、基本ユニット３は、デバイスＭＲ００１をセットし、原点復帰が正常に終了したことを認識する。本ステップからは、Ｒ４０９１０，＠ＥＭ０，＠ＭＲ０００，＠ＭＲ００１の各デバイスが抽出される。
【００８０】
００９番のステップは、原点復帰が正常に終了した場合に、１秒間だけ待機する処理である。デバイスＴ０は、設定値として１０（１００ｍｓ単位であるため１秒に相当）、現在のカウント値を有しており、カウント値が設定値になったらＯＮするものである。本ステップからは、ＭＲ００１，Ｔ０の各デバイスが抽出される。
【００８１】
最後に、０１０〜０１１番のステップは、デバイスＴ０がＯＮすると、ユニット番号１のユニットに対し、ファンクションブロック「Ｆｉｒｓｔ＿ｏｐｅｒａｔｉｏｎ」が実行される。そして、その実行結果が＠ＭＲ００２に格納され、完了コードが＠ＥＭ１に格納される。本ステップから、＠ＭＲ００２，＠ＥＭ１の各デバイスが抽出される。
【００８２】
以上、図１６を用いて詳述したように、一般的なラダープログラムでは、軸のサーボＯＮや原点復帰要求、ファンクションブロックの起動や結果など、動作開始に応じたデバイスや、動作完了に応じたデバイスしか記述されない。しかし、トラブル発生時には、動作途中の状態（モータの現在座標や現在位置など）の情報があれば、原因究明に役立つので、上述したようにユニットモニタによる監視の対象となっているＵＧも、抽出リストに自動追加するようにしている。
【００８３】
指定されたプログラム部品のそれぞれについてこの抽出処理は実行される。
【００８４】
●ロギングの実行
図１７は基本ユニット３のＣＰＵ３１の機能を示している。これらの機能の一部またはすべてはＡＳＩＣやＦＰＧＡなどのハードウエア回路により実現されてもよい。ＡＳＩＣは特定用途集積回路の略称である。ＦＰＧＡはフィールドプログラマブルゲートアレイの略称である。
【００８５】
ＣＰＵ３１は、ＰＣ２から受信したプロジェクトデータ７１とログ設定データ７２を記憶装置３２に記憶しているものとする。実行部８０は、ユーザプログラムを繰り返し実行するラダー実行エンジン８０ａと、このラダー実行エンジン８０ａを制御したり、拡張ユニット４との入出力リフレッシュを実行したりするユニット制御部８０ｂと、を有している。実行部８０のラダー実行エンジン８０ａは、プロジェクトデータ７１に含まれるユーザプログラムを繰り返し実行し、ユーザプログラムにしたがって拡張ユニット４を制御する。なお、実行部８０のラダー実行エンジン８０ａは、ユーザプログラムにしたがって、デバイス部３４の基本ユニットデバイス部３４ａに保持されている出力系のデバイスにデバイス値を書き込んだり、基本ユニットデバイス部３４ａに保持されている入力系のデバイスからデバイス値を読み込んだりする。
【００８６】
一方で、実行部８０のユニット制御部８０ｂは、入出力リフレッシュにより取得した拡張ユニットに関するデバイス値を、拡張ユニットデバイス部３４ｂに読み書きする。また、基本ユニットと拡張ユニットは、ユニット内部バスによって電気的に接続されており、ユニット制御部８０ｂは、このユニット内部バスにおける通信制御を行う機能、いわゆるバスマスタとしての機能を有している。ユニット制御部８０ｂがバスマスタとして機能する場合には、図６を用いて説明したユニット構成情報、すなわち、ＰＬＣ１全体がどのようなユニットから構成されるかを示す情報に基づいて、各拡張ユニットとリフレッシュ通信を行う。
【００８７】
記録部８１は、ログ設定データ７２にしたがってデバイス部３４（基本ユニットデバイス部３４ａ又は拡張ユニットデバイス部３４ｂ）からデバイス値を取得したり、拡張ユニット４のバッファメモリからデバイス値を取得したりして、ログデータ７３としてメモリ（例えばリングバッファ）に書き込む。上述されたように、記録部８１は、ＥＮＤ処理の際などに、ロギング処理を実行する。
【００８８】
ＥＮＤ処理におけるロギング処理について、更に詳細に説明する。ログ設定データ７２には、図１０Ｃや図１１を用いて説明したように、部品指定部５２によって指定されたプログラム部品に記述されたデバイスや、機能指定部６０によって指定された機能（例えばユニットモニタによる監視の対象）に割り付けられたデバイスが、ロギング対象として含まれている。前者のデバイスについては、ＥＮＤ処理の際に、ログデータ７３に書き込む一方で、後者のデバイスについては、ＥＮＤ処理の際に、拡張ユニット４から対象となるデバイス（ＵＧ）のデバイス値を読み出して、ログデータ７３に書き込む。
【００８９】
ここで、モータの現在座標や指令座標の更新周期（いわゆる制御周期）は、ラダープログラムのスキャン周期と比べて格段に短い。したがって、本実施形態では、スキャン周期と同期してＵＧのデバイス値を読み出すようにしているので、全ての現在座標や指令座標がログデータ７３に書き込まれるわけではない。しかし、本発明はこれに限られず、例えば、拡張ユニット４のメモリに、制御周期ごとに現在座標や指令座標を格納していき、スキャン周期のタイミングで、それまで格納した複数の現在座標や指令座標等を読み出すように構成することも可能である。
【００９０】
また、記録部８１は、時刻管理部８３により保持されている時刻情報をログデータ７３の各レコードに付与する。これによりログデータ７３には時系列にデバイス値が並べられる。
【００９１】
ロギング対象となるデバイスは、基本的に、ログ設定データ７２のロギング対象リストＬ０によって指定されるが、検知部８２によって追加のデバイスが指定されてもよい。検知部８２は、たとえば、デバイス部３４に含まれているいずれかのデバイスに対する外部機器からのデバイス値の書き換えを検知してもよい。一般にデバイス値はユーザプログラムに従って書き換えられる場合と、外部機器によって書き換えられることがある。このような書き換えはユーザプログラムを解析するだけでは事前に把握することができない。記録部８１は、検知部８２によりデバイス値の書き換えが検知されたデバイスをロギング対象に追加してもよい。一般に外部機器からのデバイス値の書き換えは、ユーザにとって想定外の事象の原因となりやすい。よって、記録部８１は、外部機器により書き換えられたデバイス値をロギングすることで、ユーザによるプログラムの改良に役立つであろう。
【００９２】
ところで、ＥＮＤ処理において、ユーザプログラムとは無関係に発行されるＵＧ読み出し命令が発行されることがある。ＵＧはバッファメモリを示すデバイス種別である。検知部８２は、ユーザプログラムとは無関係に発行されるＵＧ読み出し命令を検知してもよい。記録部８１は、検知部８２により検知されたＵＧ読み出し命令の対象となっているバッファメモリを特定し、特定したバッファメモリを記録対象として追加してもよい。この拡張ユニット４がモーションユニットである場合、このようなバッファメモリには、トルク値や現在座標位置などが記憶されている。
【００９３】
検知部８２はＦＰＧＡなどにより実現されてもよい。実行部８０はＡＳＩＣにより実現されてもよい。この場合、実行部８０は記憶装置３２に対してアドレス線を用いて読み出し／書き込み対象となっているデバイスのアドレスを指定する。よって、検知部８２はこのアドレス線を監視することで、動的に、デバイス値を更新されたデバイスを検知してもよい。これはユーザプログラムに記述されていないデバイスを記録対象として追加する際に有用であろう。
【００９４】
検知部８２は実行部８０に設けられてもよい。この場合、実行部８０は、デバイス部３４の特定のデバイスに対してデバイス値を書き込むとともに、このデバイス値とデバイス名（デバイス番号）をログデータ７３に書き込んでもよい。この手法は、ユーザプログラムに記述されていないデバイスであって、動的に割り付け割れるデバイスを記録対象として追加する際に有用であろう。
【００９５】
このように記録部８１はログ設定データ７２に含まれているデバイスリストとは無関係にデバイスを記録してもよい。極端な場合、ユーザはログ設定データ７２を作成せずに、ログデータ７３を取得可能となる。たとえば、実行部８０が起動すると、実行部８０は、デバイス部３４におけるすべてのデバイスからデバイス値を取得する。検知部８２は、デバイスを監視しているため、実行部８０がデバイス値を読み出したことを検知し、記録部８１にデバイス値を読み出されたデバイスの情報（アドレス情報）を伝達する。記録部８１は、検知部８２により伝達されたアドレス情報に基づきデバイス部３４に含まれているすべてのデバイスからデバイス値を読み出してログデータ７３に書き込む。それ以降もデバイス部３４へのアクセスを検知部８２が検知するたびに、記録部８１はデバイス値をロギングする。
【００９６】
ところで、記録部８１はスキャン周期ごと、または、所定の収集周期ごとにデバイス値をログデータ７３に書き込んでもよい。たとえば、一周期内で検知部８２が複数回にわたるデバイスへのアクセスを検知したとしても、記録部８１は、最後のアクセスが検知されたときのデバイス値だけでログデータ７３に書き込んでもよい。これにより、ログデータ７３のデータサイズを削減することが可能となる。
【００９７】
実行部８０はデバイスを保持するキャッシュを有していてもよい。この場合、検知部８２はキャッシュを監視することで、デバイスの書き込みを検知してもよい。
【００９８】
ログ設定データ７２には記録対象となるデバイスを示すデバイスリストが含まれているが、記録の除外対象となるデバイスを示すデバイスリストが含まれていてもよい。この場合、記録部８１は、除外対象となるデバイスへのアクセスを検知部８２が検知すると、そのデバイスについてのデバイス値の記録をスキップする。
【００９９】
検知部８２は実行部８０による拡張ユニット４のバッファメモリへのアクセスを検知してもよい。この場合、実行部８０は、拡張ユニット４のバッファメモリから読み出したデバイス値を記憶装置３２内に確保されたバッファ等に書き込む。記録部８１はバッファからデバイス値を読み出してログデータ７３に書き込む。
【０１００】
実行部８０はユーザプログラムを繰り返し実行し、ユーザプログラムにしたがってデバイス値を書き換える。検知部８２が実行部８０に実装されている場合、実行部８０はデバイス値を書き換える命令語を検知すると、その命令語とともにデバイス値を記録部８１に出力する。記録部８１は、命令語、デバイス値およびタイムスタンプ（デバイス値を取得した時刻）をログデータ７３に書き込んでもよい。
【０１０１】
ところで、ログ設定データ７２には、ログデータ７３のデータ形式（例：バイナリー形式やテキスト形式）が含まれてもよい。データ形式としては、１０進数１６ビット、１０進数３２ビット、±１０進数１６ビット、±１０進数３２ビット、１６進数１６ビット、１６進数３２ビット、文字列、Ｆｌｏａｔ、ＤｏｕｂｌｅＦｌｏａｔなどが、デバイスごとに設定されてもよい。このようなデータ形式はプログラム部品における命令語を解析することで判別可能である。
【０１０２】
出力部８４は、ユーザプログラムの実行が終了したとき、或いは、メモリカードへの保存トリガリレーがＯＮした場合など、所定の出力条件が満たされると、プロジェクトデータ７１、ログデータ７３、画像データをメモリカード３６に書き込む。所定の出力条件が満たされるまでは、ログデータ７３がメモリ（例えばリングバッファ）に記録されていき、容量が一杯になると、一番古いログデータ７３が消去され、新しいログデータ７３が追加記録されていく（いわゆるＦＩＦＯ形式で記録する）。このメモリカード３６は基本ユニット３から取り外されて、ＰＣ２の装着部に装着される。これにより、ＰＣ２の表示部７にログデータ７３が表示されるようになる。なお、出力部８４は、通信部３３を介してＰＣ２やクラウドなどにログデータ７３を送信してもよい。
【０１０３】
なお、本実施形態では、所定の出力条件が満たされたときに、ログデータ７３等をメモリカード３６に書き込むこととしたが、本発明はこれに限られず、例えば、内部メモリ３７（フラッシュメモリやハードディスクなどの不揮発性メモリ）に保存しても構わない。また、少なくともログデータ７３については、所定の出力条件が満たされたときにメモリカード３６又は内部メモリ３７に保存される必要がある一方、プロジェクトデータ７１については、所定の出力条件が満たされたときに限られない。例えば、ＰＬＣ１が設定モード（ＰＲＯＧＲＡＭモード）から運転モード（ＲＵＮモード）になったタイミングで、予めメモリカード３６や内部メモリ３７に保存しておいてもよい。
【０１０４】
●構成情報の作成
図１８は機能設定部６２が実行する構成情報の作成処理（ユニット設定）を説明する図である。機能設定部６２はユニットエディタと呼ばれてもよい。機能設定部６２はユニットエディタの起動を支持されると、ユニット設定ＵＩ１５０を表示部７に表示する。名称欄１５１は各ユニットの名称（例：型番など）を表示する欄である。なお、各ユニットには自動的にユニット番号が付与される。この例では、基本ユニット３にユニット番号として“０”が付与されている。入力領域欄１５２は入力系のデバイスを割り付けるための欄である。この例では、基本ユニット３に入力系のデバイスとしてＲ０００からＲ０１５までのデバイスが割り付けられている。出力領域欄１５３は出力系のデバイスを割り付けるための欄である。この例では、基本ユニット３に出力系のデバイスとしてＲ５００からＲ５０７までのデバイスが割り付けられている。占有領域欄１５４は、入出力混合系のデバイスを割り付けるための欄である。エンドユニットは、いわゆる終端ユニットである。ユーザは操作部８を通じて拡張ユニット４の種類、接続順番、割り付けられるデバイスを設定する。機能設定部６２は、拡張ユニット４の種類、接続順番（ユニット番号）、基本ユニット３と拡張ユニット４とのそれぞれに割り付けられるデバイスを示す情報を構成情報に格納する。構成情報はユニット設定情報と呼ばれてもよい。ここでは、ユニットごとにデバイスが割り付けられているが、各ユニットの機能ごとにデバイスが割り付けられてもよい。機能設定部６２は構成情報をプロジェクトデータ７１の一部として管理している。
【０１０５】
このように構成情報には各ユニットに割り付けられているデバイスを示す情報や各機能に割り付けられているデバイスを示す情報が含まれている。そのため、デバイス抽出部５３は構成情報を参照することで、各ユニットに割り付けられているデバイスや各機能に割り付けられているデバイスを抽出することができる。
【０１０６】
＜大容量データのロギング＞
フィールドデバイス１０としてカメラが存在する。ユーザはワークや制御対象の状態をカメラにより取得し、画像とデバイス値とを対比しながら、ユーザプログラムを改良することを望むことがある。したがって、相互に関連した画像とデバイス値とをどのように管理するかが問題となる。なぜなら、画像は拡張ユニット４により取得され、デバイス値は基本ユニット３によって取得されることが一般的だからである。さらに、画像の取得周期と、デバイス値の取得周期とは異なることが一般的である。このような事情から画像などの大容量データと、デバイス値のような比較的に小容量のデータとをどのように紐付けて管理するかが問題となる。
【０１０７】
図１９は基本ユニット３のＣＰＵ３１の機能を示している。すでに説明された箇所には同一の参照符号が付与されている。この例では記録部８１は収集部９２ａを有している。収集部９２ａは、所定の収集開始条件が満たされると、デバイス部３４に保持されているデバイス値のうち、ログ設定データ７２により指定されたデバイス値をデバイス部から読み出すとともに、時刻管理部８３ａから時刻情報を取得する。収集部９２ａはデバイス値と時刻情報とを関連付けてリングバッファ９１ａに格納する。なお、収集部９２ａは、ログ設定データ７２により指定された収集周期（例：スキャン周期）ごとにデバイス値と時刻情報とを取得してリングバッファ９１ａに格納する。リングバッファ９１ａが採用されている理由は、リングバッファ９１ａに記憶されているすべてのデータがログデータ７３としてメモリカード３６に保存されるわけではないからである。たとえば、保存部９３は、所定の保存条件が満たされたときに、リングバッファ９１ａからデバイス値と時刻情報とを読み出し、ログデータ７３を作成してメモリカード３６に保存してもよい。同様に、保存部９３は、所定の保存条件が満たされたときに、拡張ユニット４から大容量データと時刻情報とを読み出し、ログデータ７３を作成してメモリカード３６に保存してもよい。保存部９３は、上述したデバイス値及び時刻情報と、上述した大容量データ及び時刻情報とを、対応付けて保存する。ここで、「対応付けて」保存とは、ＰＣ２にて再生しやすい形で保存されていればよく、例えば、複数のファイルを対応付けたファイル管理がなされていてもよい。具体的に説明すると、メモリカード３６において、特定のフォルダの下に、デバイス値及び時刻情報が格納された第１サブフォルダと、大容量データ及び時刻情報が格納された第２サブフォルダとが置かれている場合には、特定のフォルダまでのパス（ディレクトリパス）が共通フラグとなり、この共通フラグを使って、第１サブフォルダ内のファイルと第２サブフォルダ内のファイルを「対応付けて」保存することが可能になる。また、上述した特定のフォルダと同じレベル（ディレクトリ）に置かれた別フォルダがある場合、その別フォルダは、他のタイミングで保存されたデータパッケージを意味する。もちろん、この別フォルダの下にも上述同様のサブフォルダが置かれている。このように、保存部９３は、上述したデバイス値及び時刻情報と、上述したデータ（大容量データ）及び時刻情報とを、共通フラグ（所定のディレクトリパス）により識別される複数のファイルに格納し、それら複数のファイルを保存してもよい。その他、例えば、共通フラグとしてファイル名を採用し、同一又は対応するファイル名をもつファイルを生成することで、「対応付けて」保存することも可能である。他にも例えば、時刻情報をキーとして、デバイス値とデータ（大容量データ）を対応付けてリスト化し、これを１つのファイルに纏めることによっても、「対応付けて」保存することが可能である。なお、本実施形態では、監視機器からのデータの一例として大容量データを考えたが、他にも例えば、モーションデータや通信データ、音声データなどの連続データであってもよいことは言うまでもない。送信部９４は、ＰＣ２やクラウドなどにログデータ７３を送信してもよい。リングバッファ９１ａが満杯になると、収集部９２ａは、リングバッファ９１ａに保持されている最も古い情報に対して、最も新しい情報を上書きする。
【０１０８】
ここではバッファの一例としてリングバッファ９１ａが採用されているが、これは一例にすぎない。バッファとしては、ＦＩＦＯ形式のバッファが採用されれば十分であろう。
【０１０９】
図２０はカメラ入力機能を有した拡張ユニット４のＣＰＵ４１の機能を説明する図である。時刻管理部８３ｂの時計は、基本ユニット３の時刻管理部８３ａの時計と同期している。たとえば、時刻管理部８３ａは、ＥＮＤ処理の際に時刻情報を時刻管理部８３ｂに送信する。時刻管理部８３ｂは、受信した時刻情報に基づき、時刻管理部８３ｂの時計を時刻管理部８３ａの時計に同期させる。時計は、時刻情報に基づき時間をカウントするカウンタにより実現されてもよい。収集部９２ｂは、所定の収集条件（例：所定のリレーデバイスがオンになったこと）が満たされると、例えば周期的にトリガー信号を出力する。時刻管理部８３ｂはトリガー信号が入力されたときの時刻情報を時計から取得し、時刻情報バッファ９５に格納する。メモリ４２は時刻情報バッファ９５とリングバッファ９１ａを有している。接続ポート９７はカメラ９８を拡張ユニット４に接続するためのインタフェースである。接続ポート９７は、収集部９２ｂにより発行されたトリガー信号をカメラ９８に周期的に出力したり、カメラ９８が出力する画像データを画像受信部９６ａに出力したりする。画像データは大容量データの一例である。接続ポート９７は、カメラ９８等の監視機器と接続され、その監視機器からデータ（画像データ）が入力される第二の外部インタフェースの一例である。画像受信部９６ａは、接続ポート９７を介してカメラ９８からの画像データの入力を伴う撮像機能を実行する機能実行部９６の全部又は一部となる。本実施形態では、機能実行部９６（画像受信部９６ａ）は、露光時間、ゲイン、ホワイトバランス、コントラストなどの撮像パラメータ（設定情報の一例）に基づいて、カメラ９８の制御を実行する。このような撮像パラメータは、ＰＣ２において、所望のパラメータ値が設定され、図４に示す基本ユニット３の通信部３３及びＣＰＵ３１を介して、機能実行部９６に送られる。そのため、図４に示す通信部３３は、ＰＣ２や表示器などの外部設定機器から設定情報を受け付ける第一の外部インタフェースの一例である。なお、第一の外部インタフェースとしての通信部３３は、上述したようにＰＣ２にて作成されたユーザプログラムも受け付ける。カメラ９８は、トリガー信号にしたがって撮像を実行し、画像データを出力する。画像受信部９６ａは、画像データを収集部９２ｂに転送する。収集部９２ｂは、時刻情報バッファ９５に保持されている時刻情報と、画像受信部９６ａから出力された画像データとを関連付けてリングバッファ９１ａに格納する。リングバッファ９１ｂが満杯になると、収集部９２ｂは、リングバッファ９１ｂに保持されている最も古い情報に対して、最も新しい情報を上書きする。なお、本実施形態では、収集部９２ｂが自動的かつ周期的に撮像トリガー信号をカメラ９８に出力することとしたが、本発明はこれに限られず、収集部９２ｂは、例えばユーザプログラムからの指令に基づいて撮像トリガー信号をカメラ９８に出力してもよい。
【０１１０】
ところで、基本ユニット３は毎スキャンごとに実行するリフレッシュ通信と、いつでも実行可能なダイレクト通信と、イベント的に実行されるメッセージ通信とのいずれかを用いて拡張ユニット４と通信する。保存部９３は、たとえば、ダイレクト通信を使用して拡張ユニット４のリングバッファ９１ｂから画像データと時刻情報とを読み出して、ログデータ７３に追記する。なお、ダイレクト通信として、優先度つきの複数のダイレクト通信が実装されてもよい。この場合、ユーザプログラムに関連して実行されるダイレクト通信の優先度は相対的に高く設定され、ロギングのためのダイレクト通信の優先度は相対的に低く設定されてもよい。これにより、ロギングがユーザプログラムの実行に与える影響を小さくすることが可能となる。
【０１１１】
＜リングバッファを用いたロギング＞
図２１は基本ユニット３のリングバッファ９１ａに保持されたデバイス値と時刻情報とを示している。一つのレコードは、取得されたデバイス値と、このデバイス値が取得された時刻を示す時刻情報とを有している。
【０１１２】
図２１はさらに拡張ユニット４のリングバッファ９１ｂに保持された画像データと時刻情報とを示している。一つのレコードは、取得された画像データと、この画像データが取得された時刻を示す時刻情報とを有している。
【０１１３】
図２２は基本ユニット３におけるリングバッファ９１ａを用いたロギングを示している。
【０１１４】
Ｓ２１でＣＰＵ３１（収集部９２ａ）はデバイス値の取得条件が満たされたかどうかを判定する。取得条件はリングバッファ９１ａに対するデバイス値と時刻情報の格納を開始するための条件である。取得条件は、ユーザプログラム中に記述されてもよいし（例：開始リレーがオンになったこと）、ログ設定データ７２において記述されていてもよい。取得条件が満たされると、ＣＰＵ３１はＳ２２に進む。
【０１１５】
Ｓ２２でＣＰＵ３１（収集部９２ａ）は取得リレーをＯＮにする。取得リレーは一ビットデバイスであり、拡張ユニット４に対してリングバッファ９１ｂへのデータの格納を指示するためのリレーである。
【０１１６】
Ｓ２３でＣＰＵ３１（収集部９２ａ）はデバイス値の取得タイミングが到来したかどうかを判定する。取得タイミングは、たとえば、スキャン周期ごとなどであり（例えば毎スキャンにおけるＥＮＤ処理において取得する等）、ログ設定データ７２により定義されている。取得タイミングが到来すると、ＣＰＵ３１はＳ２４に進む。
【０１１７】
Ｓ２４でＣＰＵ３１（収集部９２ａ）は、ログ設定データ７２により指定されたデバイス値をデバイス部３４から取得するとともに、時刻管理部８３ａから時刻情報を取得し、これらをリングバッファ９１ａに書き込む。
【０１１８】
Ｓ２５でＣＰＵ３１（収集部９２ａ）は、保存タイミングが到来したかどうかを判定する。保存タイミングとは、リングバッファ９１ａに保持されている情報をログデータ７３に保存するタイミングである。保存タイミングは、たとえば、所定のイベント（例：保存トリガ）が発生したことなどであってもよい。保存タイミングもログ設定データ７２により定義されている。保存タイミングが到来していなければ、ＣＰＵ３１はＳ２３に戻る。保存タイミングが到来していれば、ＣＰＵ３１はＳ２６に進む。
【０１１９】
Ｓ２６でＣＰＵ３１（収集部９２ａ）は、リングバッファ９１ａに保持されている情報をログデータ７３に保存する。なお、リングバッファ９１ａに保持されている情報のうち、保存対象となる情報がログ設定データ７２により定義されていてもよい。たとえば、保存対象は、あるイベントが発生したタイミングから所定時間が経過するまでに取得された情報であってもよい。また、保存対象は、あるイベントが発生したタイミングよりも所定時間前の時刻である開始時刻から、当該イベントが発生したタイミングから所定時間が経過した時刻である終了時刻までに取得された情報であってもよい。
【０１２０】
Ｓ２７で（収集部９２ａ）は、拡張ユニット４のリングバッファ９１ｂに保持されている情報をログデータ７３に保存する。収集部９２ａは、ダイレクト通信を利用して、拡張ユニット４のリングバッファ９１ｂに保持されている情報を読み出してもよい。より具体的には、収集部９２ａは、バッファメモリから情報を読み出すための命令を発行してもよい。なお、リングバッファ９１ｂに保持されている情報のうち、保存対象となる情報も、ログ設定データ７２により定義されていてもよい。たとえば、保存対象は、あるイベントが発生したタイミングから所定時間が経過するまでに取得された情報であってもよい。また、保存対象は、あるイベントが発生したタイミングよりも所定時間前の時刻である開始時刻から、当該イベントが発生したタイミングから所定時間が経過した時刻である終了時刻までに取得された情報であってもよい。
【０１２１】
Ｓ２８で（収集部９２ａ）は、終了条件が満たされたかどうかを判定する。終了条件は、ロギングの終了条件である。終了条件もログ設定データ７２により定義されていてもよい。終了条件が満たされていなければ、ＣＰＵ３１はＳ２３に戻る。終了条件が満たされていれば、ＣＰＵ３１はロギング処理を終了する。
【０１２２】
図２３は拡張ユニット４におけるリングバッファ９１ｂを用いたロギングを示している。
【０１２３】
Ｓ３１でＣＰＵ４１（収集部９２ｂ）は画像データの取得条件（例：取得リレーがＯＮになったこと）が満たされたかどうかを判定する。取得リレーがＯＮになると、ＣＰＵ４１はＳ３２に進む。なお、本実施形態では取得リレーがＯＮになったときに、画像データの取得条件が満たされたと判定するようにしたが、これは一例に過ぎない。他にも例えば、ＰＬＣ１のモードが運転モードに切り替えられたときに、画像データの取得条件が満たされたと判定されてもよい。より具体的には、ＰＬＣ１には、各種設定を行うための設定モード（プログラムモード）と、ラダープログラムを繰り返し実行して実際の運転を行う運転モード（ＲＵＮモード）とを切り替えるモード切替スイッチが設けられてもよい。この場合、ユーザによって、このモード切替スイッチがプログラムモードからＲＵＮモードに切り替えられたら、画像データの取得条件が満たされたと判定されてもよい。
【０１２４】
Ｓ３２でＣＰＵ４１（収集部９２ｂ）は画像データの取得タイミングが到来したかどうかを判定する。取得タイミングは、たとえば、拡張ユニット４の内部制御周期（撮像周期）ごとなどである。取得タイミングが到来すると、ＣＰＵ４１はＳ３３に進む。
【０１２５】
Ｓ３３でＣＰＵ４１（収集部９２ｂ）は、大容量データと時刻情報を取得してリングバッファ９１ｂに格納する。たとえば、収集部９２ｂは、トリガー信号を発行し、カメラ９８と時刻管理部８３ｂに出力する。時刻管理部８３ｂはトリガー信号を受信すると、内部時計から時刻情報を読み出して、時刻情報バッファ９５に書き込む。カメラ９８は、予め指定された撮像条件にしがって撮像を実行し、画像データを出力する。画像受信部９６ａは画像データを収集部９２ｂに出力する。画像受信部９６ａは画像データをリングバッファ９１ｂに直接的に書き込んでもよい。収集部９２ｂは時刻情報バッファ９５から読み出した時刻情報と、カメラ９８により取得された画像データとを関連づけてリングバッファ９１ｂに書き込む。
【０１２６】
Ｓ３４でＣＰＵ４１（収集部９２ｂ）は、基本ユニット３からリングバッファ９１ｂに対する読み出し要求（読み出し命令）が発行されたかどうかを判定する。読み出し要求を受信したのであれば、ＣＰＵ４１はＳ３５に進む。読み出し要求が発行されていなければ、ＣＰＵ４１はＳ３２に戻る。
【０１２７】
Ｓ３５でＣＰＵ４１（収集部９２ｂ）は、リングバッファ９１ｂから大容量データである画像データと時刻情報とを取得して基本ユニット３に送信する。
【０１２８】
Ｓ３６でＣＰＵ４１（収集部９２ｂ）は、終了条件が満たされたかどうかを判定する。たとえば、収集部９２ｂは取得リレーがＯＦＦになったかどうかを判定する。終了条件が満たされていなければ、ＣＰＵ４１はＳ３２に戻る。終了条件が満たされていれば、ＣＰＵ４１はロギング処理を終了する。
【０１２９】
＜接続形態＞
図２４はビルディングブロックタイプのＰＬＣ１の接続形態を示している。基本ユニット３の右側面には、拡張ユニット４と接続して通信するためのＩＦ９９ａが設けられている。ＩＦはインタフェースの略称である。この例では、基本ユニット３には拡張ユニット４ａが接続されており、拡張ユニット４ａには拡張ユニット４ｂが接続されている。拡張ユニット４は右側面と左側面との両方にＩＦ９９を有している。基本ユニット３の右側面は拡張ユニット４ａの左側面と対向している。よって、基本ユニット３のＩＦ９９ａは拡張ユニット４ａの左側面に設けられたＩＦ９９ｂと接続する。拡張ユニット４ａの右側面は拡張ユニット４ｂの左側面と対向している。よって、拡張ユニット４ａのＩＦ９９ｃは拡張ユニット４ｂの左側面に設けられたＩＦ９９ｄと接続する。なお、拡張ユニット４ｂの右側面に設けられた９９ｅはエンドユニットに接続されてもよい。このように、ＩＦ９９ａからＩＦ９９ｅはユニット内部バス９０を形成している。たとえば、拡張ユニット４ａに接続されたカメラ９８ａにより取得された画像データはユニット内部バス９０を介して基本ユニット３へ転送されうる。拡張ユニット４ｂに接続されたカメラ９８ｂにより取得された画像データはユニット内部バス９０を介して基本ユニット３へ転送されうる。
【０１３０】
このようにビルディングブロックタイプのＰＬＣ１では各ユニットの側面が接続面（連結面）となる。ユニット内部バス９０の一部を形成するためのＩＦ９９も各ユニットの側面に設けられる。なお、上述したように、ユニット内部バス９０での通信は、図４に示すバスマスタ３８によって制御される。
【０１３１】
図２５はバックプレーン２００を有するＰＬＣ１の接続形態を示している。バックプレーン２００は、基本ユニット３の底面および拡張ユニット４の底面に接続されるか、基本ユニット３の背面および拡張ユニット４の背面に接続される。バックプレーン２００は基本ユニット３および拡張ユニット４を支持する支持プレート（ベースプレート）として機能する。ここでは一例として背面が接続面として説明される。基本ユニット３の背面はバックプレーン２００の正面と対向している。よって、基本ユニット３の背面に設けられたＩＦ９９ｆはバックプレーン２００の正面に設けられたＩＦ９９ｇと接続する。拡張ユニット４の背面はバックプレーン２００の正面と対向している。拡張ユニット４ａの背面に設けられたＩＦ９９ｈはバックプレーン２００の正面に設けられたＩＦ９９ｉに接続される。拡張ユニット４ｂの背面に設けられたＩＦ９９ｊはバックプレーン２００の正面に設けられたＩＦ９９ｋに接続される。ＩＦ９９ｆないしＩＦ９９ｋはユニット内部バス９０を形成している。
【０１３２】
なお、バックプレーン２００は、ユニット内部バス９０を介したバス通信を制御するための通信制御部２１３を有していてもよい。また、バックプレーン２００は、ＣＰＵ２１１やメモリ２１２を有していてもよい。メモリ２１２はＲＡＭやＲＯＭに加え、メモリカード３６を有していてもよい。この場合、ＣＰＵ２１１は収集部９２ａや保存部９３して機能してもよい。また、メモリ２１２にはリングバッファ９１ａが設けられてもよい。あるいは、ＣＰＵ２１１は時刻管理部８３ｂおよび収集部９２を有していてもよい。この場合、メモリ２１２はリングバッファ９１ｂを有する。
【０１３３】
＜ログの表示例＞
図２６はログデータ７３の一例を示している。この例では、デバイス値ｄ１〜ｄ１０と、カメラ９８ａにより取得されたワーク画像ｉ１〜ｉ３と、カメラ９８ｂにより取得された他の画像ｊ１〜ｊ３の取得タイミングが示されている。デバイス値ｄ１〜ｄ１０はスキャン周期ごとに取得されている。ワーク画像ｉ１〜ｉ３はトリガー信号が発生したタイミングに取得されている。ワーク画像ｊ１〜ｊ３はトリガー信号が発生したタイミングに取得されている。各データの位置はそれぞれの時刻情報を示している。図２６が示すように、各データの取得時刻や取得周期は一致していない。そのため、ログ表示部６１は、各データの時刻情報に基づき各データの表示タイミングを調整する。
【０１３４】
図２７はログデータ７３の表示タイミングと表示継続時間とを説明する図である。ログ表示部６１は、各デバイス値の時刻情報にしたがって各デバイス値を表示部７に表示する。たとえば、ログ表示部６１は、デバイス値ｄ１の時刻情報とデバイス値ｄ２の時刻情報との差分時間をデバイス値ｄ１の表示継続時間に決定する。ログ表示部６１は、デバイス値ｄ１の表示を開始してから表示継続時間が経過すると、デバイス値ｄ２の表示を開始する。以下、同様に表示継続時間が求められ、表示されるデバイス値が時刻情報や表示継続時間にしたがって切り替えられて行く。
【０１３５】
すでに図２６が示したように、デバイス値ｄ１の取得時刻と、ワーク画像ｉ１の取得時刻とは一致していない。そこで、ログ表示部６１は、ワーク画像ｉ１の取得時刻をデバイス値ｄ１ないしｄ１０の取得時刻と比較し、ワーク画像ｉ１の取得時刻に最も近いデバイス値ｄｘの取得時刻を求める。この例では、ワーク画像ｉ１の取得時刻に最も近いのは、デバイス値ｄ１の取得時刻である。よって、ログ表示部６１は、デバイス値ｄ１の表示を開始するとともに、ワーク画像ｉ１の表示を開始する。次に、ログ表示部６１は、ワーク画像ｉ２の取得時刻に最も近いデバイス値ｄｘの取得時刻を求める。この例では、デバイス値ｄ４の取得時刻が、ワーク画像ｉ２の取得時刻が最も近い。そこで、ログ表示部６１は、デバイス値ｄ４の表示タイミングが到来すると、デバイス値ｄ４とワーク画像ｉ２の表示を開始する。ログ表示部６１は、他の画像ｊ１の取得時刻に最も近いデバイス値ｄｘの取得時刻を求める。この例では、他の画像ｊ１の取得時刻に最も近いのは、デバイス値ｄ２の取得時刻である。よって、ログ表示部６１は、デバイス値ｄ２の表示タイミングが到来すると、デバイス値ｄ２の表示を開始するとともに、他の画像ｊ１の表示を開始する。
【０１３６】
このようにログデータ７３に含まれる複数のデータのうち、ロギングの周期がもっとも短いデータを基準として、各データの表示タイミングが調整されてもよい。
【０１３７】
図２８はログデータ７３の表示方法を説明する図である。この例では、デバイス値ｄｘとしてリレーデバイスＲ０００とデータメモリＤＭ１００が取得されている（ｘは１から１０までの値をとる）。このように、一つのワーク画像ｉｘに対して複数のデバイス値が時刻情報にしたがって紐付けられる。ログ表示部６１は、デバイス値ｄｘ、ワーク画像ｉｘ、他の画像ｊｘを一つのウインドウ内に表示してもよいし、それぞれ個別のウインドウに表示してもよい。また、ログ表示部６１は、プロジェクトデータ７１からユーザプログラムを読み出し、ユーザプログラムに対してデバイス値ｄｘをマッピングして表示してもよい。たとえば、ログ表示部６１は、表示対象のデバイス値ｄｘに関連する命令語を含むステップを検索し、見つかったステップを表示するとともに、当該ステップにおける命令語の下にデバイス値を表示してもよい。なお、表示対象デバイスがリレーデバイスであることもある。ログ表示部６１は、リレーデバイスのオン／オフに応じて命令語の表示色またはアイコン画像（例：矢印）を変更してもよい。アイコン画像としてはオンを示すものと、オフを示すものとがある。また、ログ表示部６１はデバイス値をグラフ化して表示してもよい。この場合に、ログ表示部６１は、一つのウインドウにデバイス値ｄ１〜ｄ１０を常に表示し、他のウインドウにワーク画像を表示する。ログ表示部６１は、時間の経過とともにワーク画像を切り替える。ここで、ログ表示部６１は時間軸方向に移動可能なバー１０３を表示してもよい。バー１０３はタイムラインバーと呼ばれてもよい。ログ表示部６１は、時間の経過とともに左から右へ移動するようにバー１０３を表示してもよい。バー１０３はユーザによって移動されてもよい。この場合、ログ表示部６１は操作部８を通じてバー１０３の移動操作（例：ポインタ１０１によるドラッグ操作）を受け付け、移動操作に応じて表示時刻を更新する。ログ表示部６１はバー１０３により指定された表示時刻に対して取得時刻が最も近いデバイス値、ワーク画像および他の画像をログデータ７３から抽出し、表示部７に表示してもよい。
【０１３８】
なお、本実施形態では、監視機器の一例として、カメラ９８を例示するとともに、機能実行部９６の機能としては、カメラ９８の撮像機能を例示した。本発明はこれに限られず、機能実行部９６の機能として、モーション機能や通信機能であってもよい。まず、前者のモーション機能について詳述すると、基本ユニット３に、拡張ユニット４としてモーションユニットが連結されている場合を考える。この場合、ＰＣ２において、モーションユニットの動作を規定するプログラム（モーションフロープログラム）やパラメータ（軸構成や軸制御の設定パラメータなど）の設定がなされ、いわゆる設定情報が作成される。そして、第一の外部インタフェース（通信部３３）を介して、設定情報がモーションユニットの機能実行部に送られ、モーションユニットに反映される。モーションユニットの機能実行部は、設定情報に従って、外部に接続されたモータアンプに対して目標座標や目標速度などの動作指令値を送信する。モータアンプからは、エンコーダを介して、現在座標や現在速度などのモーションデータを受信する。現在座標や現在速度などのモーションデータを受信する制御周期は、ラダープログラムのスキャン周期よりも短く、ラダープログラムのスキャン周期と非同期である。そこで、モーションユニットの収集部は、所定の周期でモーションデータを収集し、モーションデータを受信した受信時刻に関する情報と該モーションデータとを関連付けてリングバッファ９１ｂに記憶する。その後、図２２を用いて説明した処理と同様に、保存タイミングになると（図２２のステップＳ２５と同様）、リングバッファ９１ｂからモーションデータ（現在座標や現在速度など）と時刻情報を取得して、ログデータに追記する。これにより、どのデバイス値と、どのモーションデータとが関連しているかを容易に特定することができる。一方で、後者の通信制御について詳述すると、基本ユニット３に、拡張ユニット４として通信ユニットが連結されている場合を考える。この場合、ＰＣ２において、通信ユニットの動作を規定するプログラム（通信フロープログラム）やパラメータ（通信周期や転送速度など）の設定がなされ、設定情報が作成される。そして、上述したモーション制御と同様に、通信部３３を介して、設定情報が通信ユニットに反映される。そして、通信ユニットの機能実行部は、設定情報に従って、外部に接続されたセンサ群（複数の光電センサが連結されたもの等）から、複数のセンサ値などの通信データを受信する。このような通信データの受信周期（サイクリック通信周期）は、ラダープログラムのスキャン周期と非同期である。なお、センサ群を構成するセンサ数が多い場合には、通信データ自体が大容量データを構成する場合もある。通信ユニットの収集部は、所定の周期（いわゆるサイクリック通信周期）で通信データを収集し、通信データを受信した受信時刻に関する情報と通信データとを関連付けてリングバッファ９１ｂに記憶する。あとは、図２２を用いて説明した処理と同様に、保存タイミングになると（図２２のステップＳ２５と同様）、リングバッファ９１ｂから通信データ（センサ値など）と時刻情報を取得して、ログデータに追記する。
【０１３９】
＜収集期間の設定＞
ログ設定部５１はログデータ７３の収集期間の設定を受け付けてもよい。
【０１４０】
図２９は収集期間を設定するためのＵＩ１６０を示している。なお、ＵＩ１６０、ＵＩ１１０、およびＵＩ１００はそれぞれに対応したタブをポインタ１０１で選択することで切り替えられてもよい。ＵＩ１６０は収集方法を指定するためのプルダウンメニュー１６１を有している。収集方法とはログデータ７３の収集方法である。この例では、保存トリガー前後と呼ばれる収集方法と、開始リレーと呼ばれる収集方法とが説明される。保存トリガー前後とは、保存トリガーがオンになったタイミングよりも前の収集時間Ｔａと保存トリガーがオンになったタイミングよりも後の収集時間Ｔｂとにおいてログデータ７３を収集する方法である。テキストボックス１６２は収集時間Ｔの入力を受け付ける。収集時間Ｔは、収集時間Ｔａと収集時間Ｔｂとの合計値である。テキストボックス１６３はトリガー後の収集時間Ｔｂの入力を受け付ける。保存トリガーの設定部１６４は、保存トリガーとして利用されるリレーデバイスのデバイス名と、条件（例：オフからオンに切り替わったこと）との設定を受け付ける。上矢印は、保存トリガーとして指定されたリレーデバイスがオフからオンに切り替わったことを意味する。ガイダンス部１６５は、収集期間を説明するためのＵＩである。この例では、保存トリガーを境として、ログデータ７３が収集されることが示されている。ログ設定部５１は、上述されたデバイスサイズやスキャンタイムの伸びに関する情報もＵＩ１６０に表示してもよい。
【０１４１】
保存トリガー前後と呼ばれる収集方法では、リングバッファ９１にはデバイス値や画像データが常時格納される。保存部９３は、保存トリガーであるリレーデバイスＲ２００がオンになると、収集時間として指定された２０秒のログデータ７３を作成する。保存部９３は、リレーデバイスＲ２００がオンになったタイミングから１８秒前に記録されたデータから、当該タイミングから２秒後までに記録されたデータをリングバッファ９１から読み出してログデータ７３を作成する。
【０１４２】
図３０は収集期間を設定するためのＵＩ１６０を示している。この例ではポインタ１０１によってプルダウンメニュー１６１から収集方法として開始リレーが選択されている。ログ設定部５１は、ユーザにより選択された収集方法にしたがってＵＩ１６０を変更する。テキストボックス１６６は開始リレーとして使用されるリレーデバイスのデバイス名を受け付ける。ガイダンス部１６５が示すように、開始リレーと呼ばれる収集方法では、開始リレーがオンになったタイミングが収集時間の起点（開始点）となる。たとえば、製造ラインを流れてくる１個のワークをプレス処理するのに３０秒かかると仮定する。また、トラブルが発生しうる時間は、３０秒間の処理時間のうち最初の２０秒間であると仮定する。リレーデバイスＲ０００はプレス処理を開始するタイミングを規定するリレーである。収集部９２は、リレーデバイスＲ０００がオンになると、２０秒間にわたりデバイス値や画像データをリングバッファ９１に格納する。次のワークが到着することで、リレーデバイスＲ０００が再びオンになると、収集部９２は、２０秒間にわたりデバイス値や画像データをリングバッファ９１に格納する。保存トリガーであるリレーデバイスＲ２００がオンになると、保存部９３は、リングバッファ９１に格納されている最新の２０秒間にわたるデバイス値や画像データを取得してログデータ７３を作成する。保存トリガーであるリレーデバイスＲ２００は、トラブルが発生したときにオンとなるリレーデバイスである。
【０１４３】
ログ設定部５１はＵＩ１６０を通じて設定された情報をログ設定データ７２に格納し、プロジェクトデータ７１とともに基本ユニット３に転送する。
【０１４４】
＜デバッグ＞
図３１はユーザにより実行されるユーザプログラムのデバッグ処理の概要を示すフローチャートである。
【０１４５】
Ｓ４１でユーザはＰＣ２を操作し、複数のプログラム部品から構成されるユーザプログラムを作成し、ユーザプログラムを含むプロジェクトデータ７１を作成する。プログラム作成部６３はユーザ入力にしたがってユーザプログラムを作成し、記憶装置２２に格納する。プロジェクト作成部５０はユーザ入力にしたがってプロジェクトデータ７１を作成し、記憶装置２２に格納する。プロジェクトデータ７１は、プロジェクトデータ７１またはユーザプログラムを識別するための識別情報を含む。プロジェクト作成部５０は、プロジェクトデータ７１またはユーザプログラムに対して演算を実行してハッシュ値または誤り検出符号などを求め、これらを識別情報としてプロジェクトデータ７１に付加してもよい。なお、識別情報はＧＵＩＤ（グローバル一意識別子）などであってもよい。
【０１４６】
Ｓ４２でユーザはＰＣ２を操作し、プロジェクトデータ７１をＰＬＣ１に転送する。プロジェクト作成部５０はプロジェクトデータ７１を記憶装置２２から読み出し、通信部２３を介してＰＬＣ１へ送信する。ＰＬＣ１の基本ユニット３はプロジェクトデータ７１を受信すると、記憶装置３２に書き込む。
【０１４７】
Ｓ４３でユーザは基本ユニット３の操作部６を操作し（例えば、ＰＲＯＧＲＡＭモードからＲＵＮモードに切り替えるモード切替スイッチを操作することにより）、プロジェクトの実行を指示する。実行部８０はプロジェクトデータ７１に含まれているユーザプログラムを実行する。記録部８１はデバイス値などをロギングし、ロギングしたデバイス値をリングバッファ９１ａに格納（記録）する。出力部８４のうちの保存部９３は、所定の出力条件が満たされると、リングバッファ９１ａに記録されているデバイス値や、上述した画像データを、メモリカード３６又は内部メモリ３７に保存することで、ログデータ７３を作成する。
【０１４８】
また、保存部９３は、図１９に示すように、ログデータ７３に加えて、プロジェクトデータ７１をメモリに保存する。これにより、ＰＣ２において、トラブル発生時のプロジェクトデータ７１を使って、トラブル発生時の動きをモニタ上で再現できるようになる。詳細については後述する。
【０１４９】
また、保存部９３は、プロジェクトデータ７１に加えて、プロジェクトデータ７１の識別情報（ハッシュ値など）をメモリに保存する。これにより、ＰＣ２は、その識別情報を使って、現在の（リプレイ対象にしようとしている）プロジェクトデータが、実際のトラブル発生時のプロジェクトデータ７１と一致するか否かを検証できるようになる。詳細については後述する。
【０１５０】
なお、本実施形態では、所定の出力条件が満たされたタイミングで、ログデータ７３に加えて、プロジェクトデータ７１及びその識別情報をメモリに保存することとしたが、本発明はこれに限られない。例えば、ＰＬＣ１の運転開始前、運転開始時、または運転中に、プロジェクトデータ７１及びその識別情報をメモリに保存しておき、所定の出力条件が満たされたタイミングで、ログデータ７３のみをメモリに保存するようにしてもよい。要するに、所定の出力条件が満たされた時点で、ログデータ７３と、プロジェクトデータ７１と、その識別情報とが対応付けられた状態で、メモリに保存されていればよい。
【０１５１】
また、本実施形態では、プロジェクトデータ７１をメモリに保存しているが、本発明はこれに限られず、例えば、プロジェクトデータ７１に代えて、プロジェクトデータ７１の識別情報のみをメモリに保存するようにしてもよい。この場合、ＰＣ２における現在のプロジェクトデータは、実際のトラブル発生時のプロジェクトデータ７１と一致することを前提としている。すなわち、プロジェクトデータをＰＬＣ１に転送した後、現在のプロジェクトデータは編集・改変されていないことを前提としている。仮に、両データが不一致と判定された場合には、ユーザは、現在のプロジェクトデータが、実際のトラブル発生時のプロジェクトデータ７１とは異なることを認識した上でリプレイを行えばよいので、ユーザがこれを認識しない状態でリプレイ（不正確なトラブルシューティング）が行われるのを防ぐことができる。
【０１５２】
Ｓ４４でユーザは基本ユニット３の操作部６を操作し、プロジェクトデータ７１とログデータ７３をＰＣ２へ転送するよう指示する。或いは、ＰＣ２の操作部８を操作して、メモリカード３６に書き込まれたプロジェクトデータ７１、プロジェクトデータ７１の識別情報、およびログデータ７３を読み出してもよい。出力部８４はプロジェクトデータ７１とログデータ７３をＰＣ２へ送信する。なお、出力部８４はプロジェクトデータ７１の転送が禁止されていると判定した場合に、プロジェクトデータ７１の識別情報をログデータ７３に付加する構成を採用してもよい。プロジェクトデータ７１の識別情報とログデータ７３とは別々に送信されてもよい。出力部８４は、メモリカード３６に書き込むための所定の条件が成立したタイミングで、プロジェクトデータ７１またはユーザプログラムに対して（例えばハッシュ関数を用いた）演算を実行してハッシュ値または誤り検出符号などを求め、これらを識別情報としてログデータ７３に付加してもよい。なお、ＰＣ２が実行する識別情報の作成ルールと、基本ユニット３が実行する識別情報の作成ルールとが一致していれば、どのようなルールが採用されてもよい。
【０１５３】
Ｓ４５でユーザはＰＣ２を操作し、ログデータ７３を再生（リプレイ）しつつトラブルの原因究明を行って、プロジェクトデータ７１を構成するユーザプログラムのデバッグを実行する。ログデータ７３の再生は、ログデータ７３に含まれている時系列のデバイス値を波形として表示部７に表示することや、デバイス値をユーザプログラムに関連付けて表示することや、ログデータ７３に含まれている時系列の画像データを表示部７に表示することを含む。ログ表示部６１は、仮想的な時刻を計時する内部時計を有しており、内部時計に同期してログデータ７３からデバイス値を取得して表示部７に表示する。プロジェクトデータ７１がＰＬＣ１から送信されないこともある。この場合、ログ表示部６１は、記憶装置２２に保持されているプロジェクトデータ７１（マスタデータ）のユーザプログラムを使用して、デバイス値をユーザプログラムに関連付けて表示してもよい。ログデータ７３を再生することによるトラブルの原因究明の詳細については、後述する。
【０１５４】
ここで注意すべき点としては、ログデータ７３を取得するために使用されたプロジェクトデータ７１のバージョンと、ＰＣ２に保持されているプロジェクトデータ７１のバージョンとが異なることがある。この場合、デバイス値をユーザプログラムに関連付けて表示することが不可能となるか、または、ユーザプログラムとデバイス値との関連付が誤ってしまうことも考えられる。この場合、ログ表示部６１は、プロジェクトデータの識別情報を使って、ログデータ７３を取得するために使用されたプロジェクトデータ７１のバージョンと、ＰＣ２に保持されているプロジェクトデータ７１のバージョンとが異なることを示す警告を表示部７に表示してもよい。なお、ログ表示部６１は、第一のバージョンのプロジェクトデータ７１を使用して取得されたログデータ７３を、ＰＣ２に保持されている第２のバージョンのプロジェクトデータ７１に関連付けて表示するかどうかをユーザに問い合わせもよい。ユーザがこのような表示を希望する場合、ログ表示部６１は、第一のバージョンのプロジェクトデータ７１を使用して取得されたログデータ７３を、ＰＣ２に保持されている第２のバージョンのプロジェクトデータ７１に関連付けて表示部７に表示する。なお、バージョンは識別情報によって管理される。ユーザがログデータ７３に問題がないことを確認すると、デバッグは不要であり、後続のＳ４６やＳ４７も不要である。ユーザはログデータ７３を分析し、ユーザプログラムのバグなどを発見し、ユーザプログラムを修正する。プロジェクト作成部５０はユーザ入力にしたがってプロジェクトデータ７１を修正（更新）し、記憶装置２２に格納する。
【０１５５】
Ｓ４６でユーザはＰＣ２を操作し、プロジェクトデータ７１をＰＬＣ１に転送する。なお、プロジェクトデータ７１内のユーザプログラムが変更されると、識別情報が更新される。これにより、修正前のプロジェクトデータ７１と修正後のプロジェクトデータ７１とが区別可能となる。
【０１５６】
Ｓ４７でユーザは基本ユニット３を操作し、プロジェクトデータ７１に含まれるユーザプログラムの実行を指示することで、プロジェクトデータ７１を検証する。実行部８０はプロジェクトデータ７１に含まれているユーザプログラムを実行する。ＰＬＣ１がユーザの想定通りに稼働していれば、ユーザはプロジェクトデータ７１のデバッグに成功したと判断する。なお、ＰＬＣ１がユーザの想定通りに稼働していなければ、記録部８１によって再びデバイス値などをロギングし、保存部９３によってログデータ７３を作成する。そして、ユーザはＳ４４ないしＳ４７を再び実行する。
【０１５７】
このようにユーザはログデータ７３を参照しながらプロジェクトデータ７１をデバッグできる。そのため、デバッグの効率が向上すると考えられる。
【０１５８】
なお、プロジェクトデータ７１の転送はメモリカード３６を介して実行されてもよい。つまり、ＰＣ２はメモリカード３６に書き込む。ユーザはメモリカード３６をＰＣ２から取り外し、基本ユニット３にメモリカード３６を取り付ける。基本ユニット３はメモリカード３６からプロジェクトデータ７１を読み出して記憶装置３２に書き込む。同様に、ログデータ７３の転送もメモリカード３６を介して実行されてもよい。
【０１５９】
＜出力部＞
図３２は基本ユニット３に実装される出力部８４を示している。出力部８４は、ログデータ７３に加えて、ログデータ７３を取得する際に使用されたプロジェクトデータ７１をＰＣ２に転送してもよい。しかし、プロジェクトデータ７１の情報漏洩を防ぐために、プロジェクトデータ７１にはメモリカード３６への書き出しや、ＰＣ２への送信を禁止するアクセス権限（プロテクト）が設定されることがある。そこで、判定部３０１は、プロジェクトデータ７１に付与されているアクセス権限を参照し、プロジェクトデータ７１の出力が禁止されているかどうかを判定する。プロジェクトデータ７１の出力が禁止されている場合、出力部８４はログデータ７３を出力するが、プロジェクトデータ７１を出力しない。一方、プロジェクトデータ７１の出力が禁止されていない場合、出力部８４はログデータ７３とプロジェクトデータ７１とを出力する。プロジェクトデータ７１の出力が禁止されている場合、付加部３０２は、記憶装置３２に保持されているプロジェクトデータ７１の識別情報をログデータ７３とともに出力してもよい。この識別情報はプロジェクトデータ７１の一部であってもよいし、演算部３０３がプロジェクトデータ７１またはユーザプログラムに対して所定の演算を実行することで識別情報を求めてもよい。所定の演算は、たとえば、ハッシュ演算であってもよいし、誤り検出符号の演算であってもよい。リアルタイム送信部３０４は、デバイス部３４に保持されているデバイス値をリアルタイムで送信する。これは、ＰＣ２やＨＭＩ（ヒューマンインタフェース）などの表示装置にリアルタイムでデバイス値を表示する際に役立つ。
【０１６０】
＜プロジェクト作成部５０＞
図３３はプロジェクト作成部５０の詳細を示している。機能設定部６２は操作部８から入力される情報に基づき拡張ユニット４の構成情報、基本ユニット３の機能および拡張ユニット４の機能を設定し、設定内容を示す構成情報を作成する。基本ユニット３の機能の設定としては、ＩＰアドレスの設定、ＦＴＰクライアントに関する設定、プロジェクトデータ７１のアクセス権限の設定などがある。拡張ユニット４の機能の設定としては、入力チャネルの設定やＰＬＣ同士の通信に関する設定などがある。構成情報はプロジェクトデータ７１の一部である。編集部３１１（図６に示すプログラム作成部６３を兼ねてもよい）は、表示部７にユーザプログラムの編集ＵＩを表示し、操作部８から入力される情報に基づきユーザプログラムを編集する。デバッグ部３１４はプロジェクトデータ７１を使用してユーザプログラムをデバッグする。付加部３１２はプロジェクトデータ７１に識別情報を付加する。演算部３１３は識別情報（例：ハッシュ値や誤り検出符号）を演算により求める。なお、この演算部３１３による識別情報の演算（算出）機能については、出力部８４が、同機能を発揮するようにしてもよい。
【０１６１】
＜ログ表示部６１＞
図３４はログ表示部６１の詳細を示している。プログラム表示モジュール３２１はプロジェクトデータ７１に含まれるユーザプログラムとともに、ログデータ７３に含まれるデバイス値を表示部７に表示するモジュールである。また、プログラム表示モジュール３２１は、ユーザプログラムのみならず、プロジェクトデータ７１に含まれるプログラム構成情報、複数のプログラム部品、ユニット構成、ユニット毎の機能設定など、ユーザがプロジェクトデータ７１の設定内容を視認するための各種情報を表示可能となっている。画像表示モジュール３２３は、ログデータ７３に含まれる時系列の画像データを表示部７に表示する。波形表示モジュール３２２は、ログデータ７３に含まれる時系列のデバイス値を波形化して表示部７に表示するモジュールである。再生制御モジュール３２４は、プログラム表示モジュール３２１によって表示される情報と波形表示モジュール３２２によって表示される情報とを時間的に同期させる。これらのモジュールはエンジニアリングソフトウエアと呼ばれてもよい。なお、画像表示モジュール３２３は、プログラム表示モジュール３２１の一機能（画像表示部）として具現化されてもよいし、波形表示モジュール３２２の一機能（画像表示部）として具現化されてもよい。
【０１６２】
●プログラム表示モジュール
図３５Ａはプログラム表示モジュール３２１の詳細を示している。時刻ＵＩ３３０ａは、ユーザプログラムとともに表示されるデバイスの取得時刻（表示時刻）を操作するためのＵＩ（例：スライドバーやカーソルなど）を提供する。表示時刻制御部３３１ａは時刻ＵＩ３３０ａにより指定された表示時刻を再生制御モジュール３２４に送出したり、再生制御モジュール３２４から通知された表示時刻を時刻ＵＩ３３０ａに設定したりする。プログラム表示部３３２は、プロジェクトデータ７１を表示部７に表示したり、識別情報に対応したプロジェクトデータ７１を記憶装置２２から読み出して表示部７に表示したりする。また、プログラム表示部３３２はデバイス値取得部３３３ａにより取得されたデバイス値を、ユーザプログラムに使用または記述されているデバイスと関連付けて表示する。デバイス値取得部３３３ａは、リアルタイム再生モードとログ再生モードとを有している。デバイス値取得部３３３ａは、リアルタイム再生モードにおいて、ＰＬＣ１のリアルタイム送信部３０４にアクセスし、デバイス値を取得し、プログラム表示部３３２に渡す。デバイス値取得部３３３ａは、ログ再生モードにおいて、再生制御モジュール３２４にアクセスし、表示時刻とデバイス値を取得し、プログラム表示部３３２に渡す。
【０１６３】
図３５Ｂは、プログラム表示部３３２等によって表示部７に表示されるＧＵＩの一例を示す模式図である。
【０１６４】
図３５Ｂにおいて、左欄のプロジェクト表示領域４２０には、プロジェクトデータ７１を構成する様々な情報が表示されている。上から順に、ユニット構成（基本ユニット、モーションユニット、アナログ入力ユニット、カメラユニット）、プログラム構成（毎スキャンモジュール、定周期モジュール、ユニット間同期モジュール、ファンクションブロック、マクロ）が表示されている。モーションユニットについては、機能設定として軸構成や軸制御の設定パラメータが表示されている。ユーザは、図３５Ｂに示すＧＵＩ上において、軸構成や軸制御をダブルクリックすることで、これらの設定パラメータについて、どのような設定内容になっているかを確認することができる。また、プロジェクト表示領域４２０において、毎スキャンモジュールに対してＭａｉｎとＳｕｂが表示されているところ、ユーザがＭａｉｎをクリックすると、中央のラダーモニタ４５０のプログラム表示領域４１０に、Ｍａｉｎプログラムが表示される。このように、図３４に示すプログラム表示モジュール３２１は、メモリカード３６からプロジェクトデータ７１を読み出して、プロジェクト表示領域４２０に各種情報を表示したり、プログラム表示領域４１０に所望プログラムを表示したりする。
【０１６５】
ここで、プログラム表示領域４１０は、いわゆるラダーモニタ４５０の一部であり、リアルタイム再生モードにおいて単独で動作させることができるものである。×印をクリックすることで、ラダーモニタ４５０のみを非表示にすることも可能である。一方で、ログ再生モードでは、プログラム表示部３３２によって、運転記録を保存した際のプロジェクトに含まれるラダープログラムを再現することができるようになっている。また、プログラム表示部３３２は、ログ再生モードにおいて、デバイス値取得部３３３ａを介してログデータ７３に含まれるデバイス値を、Ｍａｉｎプログラムに記述されているデバイスと関連付けて表示する。表示対象となるデバイス値は、時刻指定カーソル４０４によって指定された時刻に対応するデバイス値となる（より詳細は、後述する図３８を用いて説明する）。
【０１６６】
図３５Ｂでいえば、時刻表示領域４０９に表示されている２０ＸＸ／１０／０１の１８：５２：５４と対応付けられたデバイス値が、Ｍａｉｎプログラムに記述されているデバイスと関連付けて表示される。この日付の右側に表示された［３５０００／７４２８６］は、全スキャン回数７４２８６に対する現在のスキャン回数３５０００を示している。ユーザは、時刻指定カーソル４０４をドラッグして移動させることで、表示時刻及びスキャン回数の更新とともに、デバイス値の表示も更新される。例えば、更新後の表示時刻において、ＯＮしているリレーデバイスの箇所にはＯＮ表示（例えば色で塗潰す等）がなされ、ＯＦＦしているリレーデバイスの箇所にはＯＦＦ表示（例えば色抜き等）がなされる。再生ボタン４０６の機能等の詳細については、図３８を用いて後述する。
【０１６７】
図３５Ｂにおいて、右上欄には、カメラモニタ４３０の画像表示領域が設けられている。画像表示モジュール３２３は、プログラム表示モジュール３２１によってラダーモニタ４５０に表示された表示時刻と同期して、ログデータ７３から画像データを読み出してカメラモニタ４３０の画像表示領域に表示する。図３５Ｂでは、表示時刻である２０ＸＸ／１０／０１の１８：５２：５４と対応付けられた画像データが、カメラモニタ４３０に表示されている。また、この表示時刻の右側には、２８２／６０１と表示されているが、これは、全撮像枚数６０１に対する現在の画像データの順番（２８２枚目）を表している。ユーザは、カメラモニタ４３０において、時刻指定カーソル４０４ａをドラッグして移動させることで、表示時刻及び現在の画像データの順番を更新させることができる。
【０１６８】
このとき、時刻指定カーソル４０４ａの移動に伴って、上述したラダーモニタ４５０における時刻指定カーソル４０４も連動して移動する。例えば、時刻指定カーソル４０４ａを、表示時刻２０ＸＸ／１０／０１の１９：００：００に合わせた場合には、ラダーモニタ４５０における時刻指定カーソル４０４も、表示時刻２０ＸＸ／１０／０１の１９：００：００の位置に追従して移動する。そして、時刻指定カーソル４０４の移動に伴って、ラダーモニタ４５０におけるデバイス値も更新される。ここでは時刻指定カーソル４０４ａを移動させたが、逆も同様である。例えば、ラダーモニタ４５０における時刻指定カーソル４０４を移動させると、それに応じて、カメラモニタ４３０における時刻指定カーソル４０４ａも移動する。このような処理動作が可能になるのは、プログラム表示モジュール３２１と、画像表示モジュール３２３とが、再生制御モジュール３２４を介して表示時刻に関する同期制御を実行しているからである。
【０１６９】
また、図３５Ｂにおいて、右下欄には、ユニットモニタ４４０が表示されている。例えば、図１０Ａを用いて説明したように、ユニットモニタ４４０は、モーションユニットにおけるバッファメモリ（ＵＧ）のデバイス値を表示する。より具体的には、ログ表示部６１のユニット表示モジュール３２５は、再生制御モジュール３２４から現在再生すべき表示時刻を受け取ると、その時刻と対応付けられたデバイス値をメモリカード３６から読み出して、ユニットモニタ４４０に表示させる。したがって、例えば図３５Ｂでいえば、表示時刻２０ＸＸ／１０／０１の１８：５２：５４と対応付けられたデバイス値の一覧が、ユニットモニタ４４０に表示される。
【０１７０】
図３５Ｃは、ログ再生モードにおけるＧＵＩを表示するためのデータソースを模式化した図である。図３５Ｃに示すように、プロジェクト表示領域４２０は、プロジェクトデータ７１に含まれるユニット構成、機能設定、プログラム構成、プログラム部品をメモリから読み出して、これらをツリー形式で表示する。ラダーモニタ４５０は、プログラム構成（どのようなプログラム部品からなるか）、プログラム部品をメモリから読み出して、ユーザによって指定されたプログラム部品を表示するとともに、ログデータ７３から表示時刻に対応するデバイス値を読み出して表示する。カメラモニタ４３０は、ユニット構成（カメラモニタがあるか否か）と機能設定（カメラモニタの機能。例えば複数ポートある場合にはポート番号、撮像周期やゲイン設定など）などの情報に基づいて、ログデータ７３から表示時刻に対応する画像データを読み出して表示する。ユニットモニタ４４０は、ユニット構成（どのようなユニットがあるか）と機能設定（モーションユニットであれば軸構成や軸制御など）などの情報に基づいて、ログデータ７３から表示時刻に対応するデバイス値を読み出して表示する。
【０１７１】
図３５Ｂや図３５Ｃから分かるように、再生制御モジュール３２４の機能によって、プログラム表示モジュール３２１、画像表示モジュール３２３、ユニット表示モジュール３２５を同期制御して、連携させることができる。なお、波形表示モジュール３２２の連携の詳細については後述する。
【０１７２】
ここで、本実施形態では、現在のプロジェクトデータが、実際のトラブル発生時のプロジェクトデータ７１と一致するか否かを検証できるようにしている。より具体的には、図３５に示すプログラム表示モジュール３２１のうちの照合部３３４は、ＰＬＣ１から出力されるプロジェクトデータ７１（ユーザプログラム）の識別情報と、記憶装置２２に記憶されているプロジェクトデータ７１（ユーザプログラム）の識別情報とを照合し、照合結果を警告部３３５に出力する。警告部３３５は、ＰＬＣ１から出力される、運転記録を保存した時のプロジェクトデータ７１（ユーザプログラム）の識別情報と、記憶装置２２に記憶されているプロジェクトデータ（ユーザプログラム）の識別情報とが不一致である場合に、警告を表示部７に表示させる。
【０１７３】
例えば、警告部３３５は、図３５Ｄに示すような警告画面４７０を表示部７に表示させる。具体例を挙げると、運転記録を保存した時のプロジェクトデータ７１の識別情報と、現在の（リプレイ対象にしようとしている）プロジェクトデータの識別情報とは、不一致であると仮定する。例えば、プロジェクトデータをＰＬＣ１に転送した後、ユーザがそのプロジェクトデータ（プログラムや機能設定など）を編集したような場合である。この場合に、ユーザ操作に基づいて、リアルタイム再生モードからログ再生モードに移行したとき、図３５Ｄに示す警告画面４７０が表示される。
【０１７４】
図３５Ｄに示す警告画面４７０では、ユーザに対し、現在のプロジェクトデータをそのまま使用してログ再生を行うか、或いは、運転記録のプロジェクトを使用してログ再生を行うか、を選択させる。前者の場合には、ユーザは、現在のプロジェクトデータが、実際のトラブル発生時のプロジェクトデータ７１とは異なることを認識した上で、ログ再生を行う。一方、後者の場合には、例えばユーザは、運転記録のプロジェクトが格納されている記憶装置２２内のパス（フォルダやディレクトリ）を指定することで、運転記録のプロジェクトを使用してログ再生を行うことができる。
【０１７５】
なお、本実施形態では、２つのプロジェクトデータの識別情報を比較して、一致・不一致を検証することとした。より詳細には、プロジェクトデータに含まれるプログラム構成、複数のプログラム部品、ユニット構成、ユニット毎に機能設定に対し、それぞれ識別情報が付加されており、それら全てが一致するか否かにより検証することとした。しかし、本発明はこれに限られず、少なくとも、複数のプログラム部品から構成されるユーザプログラムの識別情報を比較して、一致・不一致を検証すればよい。
【０１７６】
●波形表示モジュール
図３６Ａは波形表示モジュール３２２の詳細を示している。時刻ＵＩ３３０ｂは、ユーザプログラムとともに表示されるデバイスの取得時刻（表示時刻）を操作するためのＵＩ（例：スライドバーなど）を提供する。図２８に示されているように、時刻ＵＩ３３０ｂは、基本的に、再生制御モジュール３２４から提供される表示時刻にしたがってバー１０３を左から右へ移動させる。ただし、時刻ＵＩ３３０ｂは、操作部８を通じたバー１０３の操作を受け付け、表示時刻制御部３３１ｂを通じて再生制御モジュール３２４にバー１０３の操作量を渡す。表示時刻制御部３３１ｂは時刻ＵＩ３３０ｂにより指定された表示時刻を再生制御モジュール３２４に送出したり、再生制御モジュール３２４から通知された表示時刻を時刻ＵＩ３３０ｂに設定したりする。デバイス値取得部３３３ｂは、リアルタイム再生モードとログ再生モードとを有している。デバイス値取得部３３３ｂは、リアルタイム再生モードにおいて、ＰＬＣ１のリアルタイム送信部３０４にアクセスし、デバイス値を取得し、波形表示部３３６に渡す。デバイス値取得部３３３ｂは、ログ再生モードにおいて、再生制御モジュール３２４にアクセスし、表示時刻とデバイス値を取得し、波形表示部３３６に渡す。図２８に示したように、波形表示部３３６は、デバイス値取得部３３３ｂにより取得されたデバイス値を波形化して表示部７に表示する。デバイス値を波形化は必須ではなく、デバイス値は数値のまま表示されてもよい。図２８に示したように、画像表示モジュール３２３は再生制御モジュール３２４から出力される画像データを表示部７に表示する。なお、上述したように、画像表示モジュール３２３は、波形表示モジュール３２２の一機能として実現されてもよいが、図３４に示すように、画像表示モジュール３２３（カメラモニタ）として別機能であってもよい。
【０１７７】
図３６Ｂは、波形表示モジュール３２２等によって表示部７に表示されるＧＵＩの一例を示す模式図である。特に、波形表示モジュール３２２によって表示されるＧＵＩは、右下のポップアップウィンドウで表示された、いわゆるリアルタイムチャートモニタ４６０である。
【０１７８】
図３６Ｂにおいて、左欄のプロジェクト表示領域４２０、中央のプログラム表示領域４１０（ラダーモニタ４５０）、右上欄の画像表示領域（カメラモニタ４３０）は、図３５Ｂに示したものと同様である。つまり、プログラム表示モジュール３２１や画像表示モジュール３２３によって、これらの表示がなされる。なお、図３６Ｂでは、ユニット表示モジュール３２５によるユニットモニタ４４０は表示を省略しているが、これが表示されていてもよい。
【０１７９】
図３６Ｂに示すリアルタイムチャートモニタ４６０について、その概要は、図２８を用いて説明したとおりである。図３６Ｂでは、リレーデバイスＲ０００の波形データと、データメモリＤＭ１００の波形データとがメモリから読みだされ、表示されている。リアルタイムチャートモニタ４６０に表示させるべきデバイスは、図示しない設定画面を通じて、ユーザは自由に加減させることができる。
【０１８０】
リアルタイムチャートモニタ４６０の下方には、時刻指定カーソル４０４ｂ（図２８に示すバー１０３に相当。再生位置カーソルと呼んでもよい）が表示されており、ユーザは、この時刻指定カーソル４０４ｂの位置をクリックして移動させることができるようになっている。このとき、時刻指定カーソル４０４ｂの位置が移動すると、再生制御モジュール３２４の機能によって、ラダーモニタ４５０における時刻指定カーソル４０４、カメラモニタ４３０における時刻指定カーソル４０４ａが、連動して移動するようになっている。具体的には、図３６Ｂにおいて、リアルタイムチャートモニタ４６０の波形表示領域における横軸はスキャン回数（時刻に切り替え表示してもよい）を示しているが、ユーザが時刻指定カーソル４０４ｂをクリックして所定のスキャン回数の位置へスライド移動させると、ラダーモニタ４５０における時刻指定カーソル４０４及びカメラモニタ４３０における時刻指定カーソル４０４ａは、それぞれ、そのスキャン回数に対応する表示時刻の位置へ移動する。そして、移動後の表示位置に対応するデバイス値や画像データが表示される。もちろん、逆も同様である。すなわち、ラダーモニタ４５０における時刻指定カーソル４０４又はカメラモニタ４３０における時刻指定カーソル４０４ａをクリックして所望位置へスライドさせると、時刻指定カーソル４０４ｂも、その所望位置に対応するスキャン回数の位置へと移動する。このとき、時刻指定カーソル４０４又は時刻指定カーソル４０４ａを一定量以上動かすと、時刻指定カーソル４０４ｂが示す位置が、現在のリアルタイムチャートモニタ４６０の表示範囲外となるが、本実施形態では、この位置が常に表示範囲内になるよう、表示範囲が追従していく。
【０１８１】
ここで、図３６Ｂに示すように、リアルタイムチャートモニタ４６０においては、時刻指定カーソル４０４ｂは、波形表示エリアに重畳表示された縦線と、その縦線の下端に付加された三角印の図形と、から構成されているが、さらに、この時刻指定カーソル４０４ｂの下方には、表示エリアバー４０４ｃが表示されている。表示エリアバー４０４ｃの中央には、現在位置を示す四角のインジケータが表示されている。ユーザは、このインジケータをドラッグして左右に動かすことで、リアルタイムチャートモニタ４６０に表示される範囲を変更することができる。そして、ユーザは、この表示エリアバー４０４ｃを上手く活用することで、トラブル原因を追究するトラブルシューティングを行うことができる。この点につき、図３６Ｃを用いてより詳細に説明する。
【０１８２】
図３６Ｃは、リアルタイムチャートモニタ４６０で表示される表示範囲と時刻指定カーソル４０４ｂとの関係性を説明するための説明図である。
【０１８３】
図３６Ｃでは、リアルタイムチャートモニタ４６０には、リレーデバイスＲ０００及びＲ００１、データメモリＤＭ１００及びＤＭ１０１が表示されるものとする。図３６Ｃでは、説明の便宜上、各デバイスについて１５個分（黒丸）のデバイス値がリアルタイムチャートモニタ４６０に表示されているものとする。また、これらのデバイス値のうち、各デバイスについて特定の一時刻に対応するデバイス値が、時刻指定カーソル４０４ｂによって指定されたデバイス値となる。図３６Ｃでは、リアルタイムチャートモニタ４６０で表示される範囲の中央の時刻に対応するデバイス値となっている。ユーザは、時刻指定カーソル４０４ｂをドラッグして、例えば右方向へ移動させると、上述した時刻指定カーソル４０４や時刻指定カーソル４０４ａと同様に、時刻指定カーソル４０４ｂが表示範囲内に収まるように、表示範囲が追従していく。一方で、ユーザは、表示エリアバー４０４ｃの四角インジケータをドラッグして、例えば右方向へ移動させると、リアルタイムチャートモニタの表示範囲が右方向に移っていき、一定量だけ移ると（デバイス値８個分だけ右へ移ると）、時刻指定カーソル４０４ｂが非表示となる。しかし、本実施形態では、時刻指定カーソル４０４ｂが非表示になっても、トラブルシューティングしやすいように、波形表示領域の所望位置をダブルクリックすることで、時刻指定カーソル４０４ｂが、その所望位置にジャンプするようになっている。言い換えると、図３６Ａに示す波形表示部３３６は、波形表示領域においてユーザから所望位置の指定を受け付けて、受け付けた指定位置に時刻指定カーソル４０４ｂを移動させる機能を有している。
【０１８４】
図３６Ｃに示すＧＵＩを使ったトラブルシューティングの手順（一例）について、より具体的に説明する。
【０１８５】
（１）ユーザは、まず、リアルタイムチャートモニタ４６０の表示エリアバー４０４ｃにおいて、四角インジケータをドラッグして左右に移動させることで、波形表示領域に表示されたデバイス波形を視認しながら、トラブルの原因究明に役立ちそうな時刻を探す。このとき、上述したように、時刻指定カーソル４０４ｂは、リアルタイムチャートモニタ４６０の表示範囲から非表示になってもよい。
【０１８６】
（２）デバイス波形のうち、異常なデバイス値をとる時刻が見つかったら、波形表示領域において、その時刻をダブルクリックする。そうすると、時刻指定カーソル４０４ｂがその時刻にジャンプするとともに、ラダーモニタ４５０における時刻指定カーソル４０４、及び、カメラモニタ４３０における時刻指定カーソル４０４ａが、いずれもその時刻にジャンプする。
【０１８７】
（３）その結果、再生制御モジュール３２４によって、ラダーモニタ４５０では、その時刻に対応するデバイス値が表示され、カメラモニタ４３０では、その時刻に対応する画像データが表示される。したがって、ユーザは、これらのデバイス値や画像データを視認しながら、トラブルの原因を究明していくことができる。
【０１８８】
●再生制御モジュール３２４
図３７は再生制御モジュール３２４の詳細を示している。デバイス値提供部３４１は、ログデータ取得部３４４によりログデータ７３から取得されたデバイス値をプログラム表示モジュール３２１と波形表示モジュール３２２とに提供する。また、デバイス値提供部３４１は、ユニット表示モジュール３２５にも、ログデータ７３から取得されたデバイス値を提供する。なお、ログデータ７３から取得されたデバイス値は一時的にログデバイス３４５に格納されてもよい。プログラム表示モジュール３２１と波形表示モジュール３２２のデバイス値取得部３３３はデバイス値提供部３４１にデバイス値を要求する。デバイス値取得部３３３はログデバイス３４５からデバイス値を取得し、デバイス値取得部３３３に送信する。時刻デバイス３４２は再生制御部３４３により設定された表示時刻を保持するデバイスである。時刻デバイス３４２に保持されているデバイス値（時刻情報）もデバイス値提供部３４１がデバイス値取得部３３３へ送信してもよい。あるいは、再生制御部３４３が表示時刻制御部３３１ａ、３３１ｂに時刻情報を提供してもよい。再生制御部３４３は、表示時刻を計時するための仮想的な内部時計を有し、この内部時計にしたがって時刻デバイス３４２に保持されている時刻情報を更新する。再生制御部３４３は、表示時刻制御部３３１ａ、３３１ｂに時刻デバイス３４２に保持されている時刻情報を送信する。再生制御部３４３は、表示時刻制御部３３１ａ、３３１ｂから表示時刻の指定を受信すると、受信した表示時刻を内部時計に設定する（時刻合わせ）。よって、表示時刻制御部３３１ａから表示時刻が指定されると、この表示時刻は再生制御部３４３を介して表示時刻制御部３３１ｂに伝達される。同様に、表示時刻制御部３３１ｂから表示時刻が指定されると、この表示時刻は再生制御部３４３を介して表示時刻制御部３３１ａに伝達される。これによりプログラム表示モジュール３２１の表示時刻と波形表示モジュール３２２の表示時刻とが同期する。スロー再生、早送り再生、巻き戻し再生などを実現するために、再生制御部３４３は、操作部８からのユーザ入力にしたがって内部時計の更新速度を変更する。再生制御部３４３は、ログデータ７３に含まれている最も古いレコードの時刻情報を内部時計の初期値に設定してもよい。ログデータ取得部３４４は時刻デバイス３４２に保持されている表示時刻に関連付けられているデバイス値をログデータ７３から取得して、デバイス値提供部３４１に渡す。
【０１８９】
同様にして、再生制御部３４３は、プログラム表示モジュール３２１の表示時刻と波形表示モジュール３２２の表示時刻に加えて、画像表示モジュール３２３やユニット表示モジュール３２５の時刻を同期させるようにしてもよい。
【０１９０】
なお、本実施形態では、ログ再生モードにおいて、プログラム表示モジュール３２１、波形表示モジュール３２２、画像表示モジュール３２３、ユニット表示モジュール３２５の各表示時刻を常に同期させることとしたが、本発明はこれに限られず、例えば、同期させるか否かをユーザが選択できるようにしてもよい。例えば、各モニタ画面上に同期有無のチェックボックスを設け、デフォルトでチェック有の状態にしてもよい。そして、ユーザは、同期したくないモジュールについて、チェックを外すことにより、そのモジュールについてだけ同期させないことも可能である。このように、ログ表示部６１は、再生制御モジュールによって同期制御（追従制御）されるモジュールを選択する、選択機能を有していてもよい。
【０１９１】
＜プログラムの表示ＵＩ＞
図３８はプログラム表示モジュール３２１によって提供される表示ＵＩ４００を示している。図３５Ｂや図３６Ａで説明した表示ＵＩ４００を別の観点から、更に詳述する。プログラム表示領域４１０は、プロジェクトデータ７１のユーザプログラムを表示する領域である。この例ではプログラム表示領域４１０はラダープログラム（ラダー図）を表示している。プログラム表示部３３２は、ユーザプログラムに使用または記述されているデバイスのデバイス値をデバイス値取得部３３３ａにより取得し、ユーザプログラムとともに表示する。たとえば、プログラム表示部３３２は、リレーデバイスがＯＮであればＯＮを示すアイコン４０１ａをユーザプログラム上に重ねて表示してもよい。プログラム表示部３３２は、リレーデバイスがＯＦＦであればＯＦＦを示すアイコン４０１ｂをユーザプログラム上に重ねて表示してもよい。プログラム表示部３３２は、出力系のデバイスであるＤＭ１００のデバイス値をデバイス値取得部３３３ａにより取得し、ユーザプログラムにおけるＤＭ１００の記述と重ねて表示してもよい。この例では、ＤＭ１００の記述の下にデバイス値の表示領域４０３が設けられている。プログラム表示部３３２は表示領域４０３にデバイス値を表示する。なお、再生制御モジュール３２４は表示時刻の更新とともにデバイス値も更新するため、プログラム表示部３３２は、ユーザプログラムとともに表示されているデバイス値を更新する。時刻ＵＩ３３０ａは時刻デバイス３４２から取得した表示時刻に応じて時刻指定カーソル４０４を右から左へ移動させる。時刻指定カーソル４０４はポインタ１０１によりドラッグ可能である。時刻指定カーソル４０４がポインタ１０１によりドラッグされたことを時刻ＵＩ３３０ａが検知すると、表示時刻制御部３３１ａは再生制御部３４３に表示時刻の更新を停止させ、時刻指定カーソル４０４のドラッグ量を再生制御部３４３に通知する。再生制御部３４３は、ドラッグ量に応じて内部時計のカウント値（表示時刻）を調整する。時刻ＵＩ３３０ａは、表示時刻の更新速度（例：・・・、２．０倍、１．０倍、０．５倍、０．１倍、・・・）を速度指定部４０５に表示してもよい。なお、速度指定部４０５は、複数の更新速度のリストを表示し、そのうちの一つの更新速度を選択可能なプルダウメニューによって実現されてもよい。時刻ＵＩ３３０ａは、速度指定部４０５に対するポインタ１０１によるクリックを検知すると、このようなプルダウメニューを表示し、更新速度の選択を受け付けてもよい。再生ボタン４０６はデバイス値の時系列的な表示を指示するためのボタンである。時刻ＵＩ３３０ａは再生ボタン４０６がポインタ１０１によりクリックされたことを検知すると、表示時刻制御部３３１ａに表示時刻の更新を開始するよう再生制御部３４３に指示する。この指示はデバイス値の表示の開始の指示または表示の再開の指示に相当する。ワンステップ逆再生ボタン４０７は、表示時刻をワンステップずつ更新（巻き戻し）しながらデバイス値を時系列的に表示することを指示するためのボタンである。時刻ＵＩ３３０ａはワンステップ逆再生ボタン４０７がポインタ１０１によりクリックされたことを検知すると、表示時刻制御部３３１ａに表示時刻を一ステップ戻すように指示する。ワンステップ再生ボタン４０８は、表示時刻をワンステップずつ更新しながらデバイス値を時系列的に表示することを指示するためのボタンである。時刻ＵＩ３３０ａはワンステップ再生ボタン４０８がポインタ１０１によりクリックされたことを検知すると、表示時刻制御部３３１ａに表示時刻を一ステップ進めるように指示する。なお、ワンステップ再生が実行されているときは、ワンステップ逆再生ボタン４０７またはワンステップ再生ボタン４０８が操作されない限り、再生制御部３４３は表示時刻を更新しない。ワンステップ再生が実行されているときに、再生ボタン４０６が操作されると、再生制御部３４３は速度指定部４０５により指定された更新速度で表示時刻の更新を再開する。時刻表示領域４０９は時刻デバイス３４２に保持されている表示時刻を表示する領域である。表示時刻制御部３３１ａは、時刻デバイス３４２から取得された表示時刻を時刻表示領域４０９に表示する。
【０１９２】
＜ＨＭＩのエミュレータ＞
ＰＬＣ１はＨＭＩと呼ばれる外付けの表示装置を接続可能である。ＨＭＩはタッチパネル式の入力装置を有していてもよい。ＨＭＩはＰＬＣ１のデバイス部３４に保持されているデバイス値を読み出して表示装置に表示する。プロジェクト作成部５０はＨＭＩに表示されるＵＩと、ＵＩに表示されるデバイス値を設定し、プロジェクトデータ７１に保存する。デバッグ部３１４は、ＨＭＩのエミュータを有しており、プロジェクトデータ７１にしたがってエミュータを動作させることで、ＨＭＩの動作を確認する。ログ表示部６１は、ＨＭＩのエミュレータに対してログデータ７３のデバイス値を供給する。ＨＭＩのエミュレータは、時系列的に提供されたデバイス値をＵＩに表示する。
【０１９３】
図３９はＨＭＩのエミュレータのＵＩ４９０を示している。この例では、ＨＭＩのエミュレータはプログラム表示モジュール３２１に含まれている。プログラム表示部３３２は、再生制御部３４３により提供されるデバイス値をＵＩ４９０の表示領域に反映させる。ＵＩ４９０は、時刻指定カーソル４０４や再生ボタン４０６など、ＵＩ４００に含まれている再生制御に関連した時刻制御オブジェクトを有していてもよい。ＵＩ４９０における時刻制御オブジェクトの操作は再生制御部３４３を通じてＵＩ４００や図２８に示されたＵＩに反映される。たとえば、ＵＩ４９０において時刻指定カーソル４０４が左に操作されると、再生制御部３４３から提供される表示時刻に連動して、ＵＩ４００の時刻指定カーソル４０４も左に移動し、図２８に示されたバー１０３も左に移動する。また、図２８に示されたバー１０３が左に操作されれば、再生制御部３４３から提供される表示時刻に連動して、ＵＩ４００、４５０の時刻指定カーソル４０４も左に移動する。これらはいずれも時刻デバイス３４２に保持されている同一の表示時刻に同期しているからである。
【０１９４】
＜ログ表示に関するフローチャート＞
●プログラム表示モジュール
図４０はプログラム表示モジュール３２１によって実行される表示処理を示している。なお、Ｓ５０、Ｓ５１およびＳ６０はＰＬＣ１からプロジェクトデータ７１を取得できない場合にのみ実行されてもよい。ＰＬＣ１からプロジェクトデータ７１を取得できる場合、ＰＬＣ１からプロジェクトデータ７１が使用される。ＰＬＣ１からプロジェクトデータ７１を取得できない場合、ＰＣ２に保持されているプロジェクトデータ７１が使用される。
【０１９５】
Ｓ５０でＣＰＵ２１（照合部３３４）はＰＬＣ１に保持されているプロジェクトデータ７１の識別情報と、ＰＣ２に保持されているプロジェクトデータ７１の識別情報とを取得する。
【０１９６】
Ｓ５１でＣＰＵ２１（照合部３３４）はＰＬＣ１に保持されているプロジェクトデータ７１の識別情報と、ＰＣ２に保持されているプロジェクトデータ７１の識別情報とが一致するかどうかを判定する。両者が一致しなければ、ＣＰＵ２１はＳ６０に進む。Ｓ６０でＣＰＵ２１（警告部３３５）はＰＬＣ１に保持されているプロジェクトデータ７１の識別情報と、ＰＣ２に保持されているプロジェクトデータ７１の識別情報とが一致しないことを示す警告を表示部７に表示する。両者が一致する場合、ＣＰＵ２１はＳ５２に進む。
【０１９７】
Ｓ５２でＣＰＵ２１（プログラム表示部３３２）はＰＬＣ１または記憶装置２２からプロジェクトデータ７１を取得する。
【０１９８】
Ｓ５３でＣＰＵ２１（プログラム表示部３３２）は操作部８から入力された情報に基づきログ再生モードが選択されているのか、それともリアルタイム再生モードが選択されているのかを判定する。リアルタイム再生モードが選択されていれば、ＣＰＵ２１はＳ５８に進む。Ｓ５８でＣＰＵ２１（デバイス値取得部３３３ａ）は再生制御モジュール３２４を介さずにＰＬＣ１のリアルタイム送信部３０４からデバイス値を取得する。Ｓ５９でＣＰＵ２１（プログラム表示部３３２）はプロジェクトデータ７１に含まれるユーザプログラムとともにデバイス値を表示部７に表示する。ログ再生モードが選択されていれば、ＣＰＵ２１はＳ５４に進む。
【０１９９】
Ｓ５４でＣＰＵ２１（デバイス値取得部３３３ａ）は再生制御モジュール３２４を起動し、再生制御モジュール３２４から表示時刻とログデータ７３のデバイス値と取得する。
【０２００】
Ｓ５５でＣＰＵ２１（プログラム表示部３３２）はプロジェクトデータ７１に含まれるユーザプログラムとともにデバイス値と表示時刻を表示部７に表示する。
【０２０１】
Ｓ５６でＣＰＵ２１（表示時刻制御部３３１ａ）は時刻ＵＩ３３０ａにより時刻指定が検知されたかどうかを判定する。上述したように時刻指定は時刻指定カーソル４０４の操作によって実行される。時刻指定が検知されていなければ、ＣＰＵ２１はＳ５４に戻る。時刻指定が検知されていれば、ＣＰＵ２１はＳ５７に進む。
【０２０２】
Ｓ５７でＣＰＵ２１（表示時刻制御部３３１ａ）は再生制御モジュール３２４の再生制御部３４３に、時刻指定カーソル４０４により入力された指定時刻を通知する。ＣＰＵ２１はＳ５４に戻る。
【０２０３】
●波形表示モジュール
図４１は波形表示モジュール３２２によって実行される表示処理を示している。
【０２０４】
Ｓ６１でＣＰＵ２１（波形表示部３３６）は操作部８から入力された情報に基づきログ再生モードが選択されているのか、それともリアルタイム再生モードが選択されているのかを判定する。リアルタイム再生モードが選択されていれば、ＣＰＵ２１はＳ６６に進む。Ｓ６６でＣＰＵ２１（デバイス値取得部３３３ｂ）は再生制御モジュール３２４を介さずにＰＬＣ１のリアルタイム送信部３０４からデバイス値を取得する。Ｓ６７でＣＰＵ２１（波形表示部３３６）はデバイス値を表示部７に表示する。ログ再生モードが選択されていれば、ＣＰＵ２１はＳ６２に進む。
【０２０５】
Ｓ６２でＣＰＵ２１（デバイス値取得部３３３ｂ）は再生制御モジュール３２４を起動し、再生制御モジュール３２４からデバイス値と表示時刻を取得する。
【０２０６】
Ｓ６３でＣＰＵ２１（波形表示部３３６）はデバイス値と表示時刻を表示部７に表示する。
【０２０７】
Ｓ６４でＣＰＵ２１（表示時刻制御部３３１ｂ）は時刻ＵＩ３３０ｂにより時刻指定が検知されたかどうかを判定する。上述したように時刻指定はバー１０３によって実行される。時刻指定が検知されていなければ、ＣＰＵ２１はＳ６２に戻る。時刻指定が検知されていれば、ＣＰＵ２１はＳ６５に進む。
【０２０８】
Ｓ６５でＣＰＵ２１（表示時刻制御部３３１ｂ）は再生制御モジュール３２４の再生制御部３４３に、バー１０３により入力された指定時刻を通知する。ＣＰＵ２１はＳ６２に戻る。
【０２０９】
●再生制御モジュール
図４２は再生制御モジュール３２４によって実行される再生制御を示している。
【０２１０】
Ｓ７１でＣＰＵ２１（ログデータ取得部３４４）はＰＬＣ１からログデータ７３を取得し、記憶装置２２に格納する。
【０２１１】
Ｓ７２でＣＰＵ２１（再生制御部３４３）は内部時計の時刻を初期化する。
【０２１２】
Ｓ７３でＣＰＵ２１（再生制御部３４３）は内部時計の時刻を取得し、時刻を時刻デバイス３４２に格納する。
【０２１３】
Ｓ７４でＣＰＵ２１（再生制御部３４３）は時刻デバイス３４２に保持されている表示時刻に対応するデバイス値をログデータ７３から取得し、ログデバイス３４５に格納する。これにより、デバイス値提供部３４１はプログラム表示モジュール３２１や波形表示モジュール３２２に対してデバイス値と表示時刻とを提供可能となる。
【０２１４】
Ｓ７５でＣＰＵ２１（再生制御部３４３）は表示時刻制御部３３１から時刻指定を受信したかどうかを判定する。時刻指定を受信していれば、ＣＰＵ２１はＳ７６に進む。時刻指定を受信していなければ、ＣＰＵ２１はＳ７７に進む。
【０２１５】
Ｓ７６でＣＰＵ２１（再生制御部３４３）は表示時刻制御部３３１からの時刻指定にしたがって内部時計の時刻を変更する。
【０２１６】
Ｓ７７でＣＰＵ２１（再生制御部３４３）は表示時刻制御部３３１から更新速度の変更指示を受信したかどうかを判定する。変更指示を受信していれば、ＣＰＵ２１はＳ７８に進む。変更指示を受信していなければ、ＣＰＵ２１はＳ７３に進む。
【０２１７】
Ｓ７８でＣＰＵ２１（再生制御部３４３）は表示時刻制御部３３１から指定された更新速度にしたがって内部時計の更新速度を変更する。その後、ＣＰＵ２１はＳ７３に進む。
【０２１８】
＜プログラム部品の絞り込み＞
ＰＣ２はログ設定に際してロギング対象となるデバイスを抽出したり、ログを表示する際に特定のデバイスに関連した他のデバイスを抽出したりする。この抽出処理を説明するために、以下のような例が採用される。
【０２１９】
図４３はラダープログラムを構成する複数のモジュールを示している。この例では、次のようなＰＬＣ１が想定されている。ワークが搬送ベルトにより搬送される。ワーク検知センサがワークを検知すると、高さセンサがワークの高さを計測し、奥行センサがワークの奥行を計測する。ワークの高さが所定範囲内になければ、測定ＮＧと判定される。同様に、ワークの奥行が所定範囲内になければ、測定ＮＧと判定される。図４３にはこれらの一連の処理を実現するためのプログラムモジュールが記載されている。各モジュールは接点系命令（入力系命令）と出力系命令とを含む。接点系命令は、出力系命令を実行するための条件である。
【０２２０】
ワーク検知モジュールＢ１においてデバイスＭＲ０００はワークを検知するとＯＮとなるリレーデバイスである。デバイスＭＲ０００２ＰＬＣ１が自動運転中である場合にＯＮとなるリレーデバイスである。デバイスＭＲ００１は、拡張ユニット４に測定開始を指示するためのリレーデバイスである。デバイスＭＲ０００は、自動運転中にワークが検知されると、ＯＮとなる。
【０２２１】
測定モジュールＢ２において接点系命令にはＭＲ００１がＯＮになると、出力系命令を実行することが記述されている。この例では、拡張ユニット４により取得された高さの計測値がデバイスＥＭ０に格納されており、これをデバイスＴＭ１００にコピーすることが記述されている。同様に、拡張ユニット４により取得された奥行の計測値がデバイスＥＭ２に格納されており、これをデバイスＴＭ１０１にコピーすることが記述されている。さらに、測定完了を管理するためのデバイスＭＲ００３がＯＮに設定される。
【０２２２】
判定モジュールＢ３は、デバイスＭＲ００３がＯＮになると、つまり測定が完了されると実行されるモジュールである。ここでは、測定結果が合格条件を満たさなければ、デバイスＭＲ０１０がＯＮになる。これは測定ＮＧを意味する。より具体的には、デバイスＴＭ１００に格納されている高さの計測値が９５未満であれば、ＭＲ０１０がＯＮになる。デバイスＴＭ１００に格納されている高さの計測値が１０５を超えていれば、ＭＲ０１０がＯＮになる。デバイスＴＭ１０１に格納されている奥行の計測値が３５未満であれば、ＭＲ０１０がＯＮになる。デバイスＴＭ１００に格納されている奥行の計測値が４５を超えていれば、ＭＲ０１０がＯＮになる。
【０２２３】
エラー処理モジュールＢ４は何らかのエラーが発生すると、搬送ベルトの搬送を停止するためのモジュールである。この例では、ＭＲ０１０がＯＮ（測定ＮＧ）になるか、または、ＭＲ０１２がＯＮ（強制停止）になるか、または、ＭＲ０１３がＯＮ（搬送ＮＧ）になると、ＭＲ０１１がオン（搬送停止）になる。
【０２２４】
図４３からわかるように、あるモジュールの接点系命令に記述されているデバイスは、他のモジュールの出力系命令に記述されている。逆に、あるモジュールの出力系命令に記述されているデバイスは、他のモジュールの接点系命令に記述されている。たとえば、ワーク検知モジュールＢ１の出力系命令に記述されているデバイスＭＲ００１は、測定モジュールＢ２の接点系命令に記述されている。よって、ワーク検知モジュールＢ１と測定モジュールＢ２とは相互に関連したモジュールとして抽出される。次に、測定モジュールＢ２の出力系命令に記述されているデバイスＭＲ００３に着目すると、ＭＲ００３は判定モジュールＢ３の接点系命令に記述されていることがわかる。よって、測定モジュールＢ２と判定モジュールＢ３とは相互に関連したモジュールとして抽出される。次に、判定モジュールＢ３の出力系命令に記述されているデバイスＭＲ０１０に着目すると、ＭＲ０１０はエラー処理モジュールＢ４の接点系命令に記述されていることがわかる。よって、判定モジュールＢ３とエラー処理モジュールＢ４とは相互に関連したモジュールとして抽出される。このようにある特定処理に関与する複数のモジュールと、複数のモジュールの内部に記述されている複数のデバイスが抽出される。これらの抽出処理はデバイス抽出部５３によって実行される。デバイス抽出部５３は、ログ表示部６１に実装されてもよい。つまり、ログ表示部６１は、相互に関連した複数のモジュールを抽出し、さらに、抽出された複数のモジュールに記述されている複数のデバイスを抽出し、抽出された複数のデバイスの各デバイス値をログデータ７３から取得して、表示部７に表示してもよい。
【０２２５】
図４４は抽出結果を表示するＵＩ５００を示している。ログ表示部６１やデバイス抽出部５３は、ユーザプログラムから抽出されたデバイスとブロック（プログラム部品）とを表示するＵＩ５００を作成し、表示部７に表示してもよい。ＵＩ５００はデバイスとプログラム部品の抽出結果を簡易に表示することができる。よって、ユーザは、抽出結果の全体像を把握しやすいであろう。ログ表示部６１やデバイス抽出部５３は、ＵＩ５００に含まれているいずれかブロックがポインタ１０１によりクリックされると、クリックされたブロックの詳細をＵＩ５０１に表示してもよい。これにより、ユーザは抽出されたブロックの詳細に迅速にアクセスできるようになろう。ログ表示部６１やデバイス抽出部５３は、図４３に例示されたＵＩを使用して抽出結果を表示してもよい。
【０２２６】
＜ブロックおよびデバイスの抽出処理＞
図４５はデバイス抽出部５３が実行するブロックおよびデバイスの抽出処理を示している。ここではプロジェクトデータ７１には、複数のブロック（プログラム部品）が含まれている。よって、デバイス抽出部５３はプロジェクトデータ７１を参照し、ブロックやデバイスを抽出する。
【０２２７】
Ｓ８１でＣＰＵ２１（デバイス抽出部５３）は操作部８を通じたブロックの選択を受け付ける。なお、デバイス抽出部５３は操作部８を通じたデバイスの指定を受け付けてもよい。この場合、デバイス抽出部５３は、指定されたデバイスを記述している一つ以上のブロックを抽出してもよい。複数のブロックが抽出された場合、デバイス抽出部５３は、複数のブロックから一つのブロックについてのユーザ選択を受け付けてもよい。このようなデバイスとしては、たとえば、デバッグにおいてユーザが着目するデバイスであろう。ユーザはログ設定部５１を通じて、ＰＬＣ１の出力部８４にログデータ７３を出力するための条件（例：保存トリガ）を設定する。より具体的には、特定のリレーデバイスがオンになったことなどを条件として設定する。よって、デバイス抽出部５３は、保存トリガーとして設定されたリレーデバイスを指定してもよい。
【０２２８】
Ｓ８２でＣＰＵ２１（デバイス抽出部５３）は選択されたブロックの接点系命令に記述されているデバイスを抽出する。
【０２２９】
Ｓ８３でＣＰＵ２１（デバイス抽出部５３）は抽出されたデバイスを出力系命令に記述されている他のブロックを検索する。
【０２３０】
Ｓ８４でＣＰＵ２１（デバイス抽出部５３）は抽出されたデバイスを出力系命令に記述されている他のブロックが発見されたかどうかを判定する。他のブロックが発見されなければ、ＣＰＵ２１は抽出処理を終了する。他のブロックが発見されると、ＣＰＵ２１はＳ８５に進む。
【０２３１】
Ｓ８５でＣＰＵ２１（デバイス抽出部５３）は発見されたブロックを関連ブロックとして抽出する。たとえば、デバイス抽出部５３は、関連ブロックを管理するためのリストに、発見されたブロックの識別情報（例：名称やファイル名など）を登録する。
【０２３２】
Ｓ８６でＣＰＵ２１（デバイス抽出部５３）はデバイスを抽出されるブロックとして関連ブロックを選択する。その後、新たに選択されたブロックについて抽出処理を実行するために、ＣＰＵ２１はＳ８２に戻る。Ｓ８６で、選択される関連ブロックは、まだデバイス抽出対象として選択されたことがないブロックである。リストに登録されているすべてのブロックについてデバイス抽出処理が完了していれば、デバイス抽出部５３は抽出処理を終了する。ＣＰＵ２１（デバイス抽出部５３）は、抽出したデバイスと、当該デバイスを抽出されたブロックとの関係を示すリストを作成してもよい。デバイス抽出部５３またはログ表示部６１はこれらのリストを参照し、図４３に示されたＵＩや、図４４に示されたＵＩ５００、５０１を作成してもよい。
【０２３３】
＜デバッグの具体例＞
図４６はユーザが実行するデバッグ処理を示している。
【０２３４】
Ｓ９１でユーザはログ設定部５１を通じてログデータ７３の保存条件としてＮＧ判定を設定する。図４３によれば、ＮＧ判定を管理するデバイスＭＲ０１０がＯＮになったことがログデータ７３の保存条件に決定される。ユーザはプロジェクトデータ７１とログ設定データ７２をＰＬＣ１に転送する。
【０２３５】
Ｓ９２でユーザはＰＬＣ１を稼働させる。ＰＬＣ１はプロジェクトデータ７１を実行し、ログ設定データ７２における保存条件が満たされるとログデータ７３をメモリカード３６に保存する。図４３に示された例ではＮＧ判定が発生すると、搬送ベルトが停止するため、ユーザは何らかのエラーが発生したことを知る。
【０２３６】
Ｓ９３でユーザはワークを確認し、ＮＧ判定が誤検知かどうかを判断する。たとえば、ユーザはワークの高さや奥行を実測し、合格条件を満たしているかどうかを判断する。ワークが合格条件を満たしていなければ、ユーザはＮＧ判定を誤検知と判断する。
【０２３７】
Ｓ９４でユーザはＰＬＣ１からメモリカード３６を取り外し、メモリカード３６をＰＣ２に接続し、メモリカード３６に保存されているログデータ７３を再生する。プログラム表示モジュール３２１はログデータ７３に含まれているデバイス値をユーザプログラムと関連付けて表示する。より具体的には、プログラム表示モジュール３２１は、保存条件として採用されたデバイスＭＲ０１０を指定し、デバイス抽出部５３にブロックとデバイスの抽出処理を実行させ、図４３に示されたＵＩや、図４４に示されたＵＩ５００、５０１を表示する。さらに、波形表示モジュール３２２は、プログラム表示モジュール３２１により表示されているデバイス値を波形化して表示する。たとえば、ＥＭ０に保持されているワークの高さの計測値やＥＭ２に保持されているワークの奥行が波形化されて表示部７に表示される。また、ワーク検知を管理するデバイスＭＲ０００のデバイス値も波形化されて表示される。ユーザはこれらの波形を観察し、ワーク検知センサのチャタリングが誤検知の原因であることを突き止める。ユーザは、チャタリング対策のために編集部３１１を操作し、図４７が示すようにワーク検知モジュールＢ１を修正する。この修正によれば、ワーク検知センサにより１秒以上にわたり連続してワークが検知されたときに、測定開始のためのデバイスＭＲ００１がオンになる。ユーザは、更新されたプロジェクトデータ７１をＰＬＣ１に転送し、ＰＬＣ１を稼働させ、チャタリング対策が成功したかどうかを判断する。
【０２３８】
このようにユーザプログラムとデバイス値の波形とを同期して表示することで、誤検知の原因の特定と、原因を解消するためのユーザプログラムのデバッグとをユーザは効率よく実行できるようになる。
【０２３９】
＜まとめ＞
図１７に示したように実行部８０はユーザプログラムを繰り返し実行するプログラム実行部の一例である。デバイス部３４はプログラム実行部により参照される記憶領域である複数のデバイスを有するデバイス記憶部の一例である。記録部８１は複数のデバイスのいずれかに記憶されているデバイス値を時系列に記録するデバイス記録部の一例である。ＰＣ２はプログラマブルロジックコントローラに接続され、ユーザプログラムの作成を支援するプログラム作成支援装置の一例である。
【０２４０】
図６に示したようにプロジェクト作成部５０は、表示部７を介したユーザ入力に基づいて、ユーザプログラムを構成する複数のプログラム部品であって複数のデバイスのいずれかに関する命令語を含むプログラム部品を作成するプログラム作成部の一例である。部品指定部５２は、複数のプログラム部品のうちデバイス記録部による記録対象となる特定のデバイスを抽出されるプログラム部品を指定するプログラム部品指定部の一例である。デバイス抽出部５３はプログラム部品指定部により指定されたプログラム部品を解析して当該プログラム部品に記述されているデバイスを抽出するデバイス抽出部の一例である。基本ユニット３の記録部８１は、デバイス抽出部により記録対象として抽出された特定のデバイスに記憶されているデバイス値を時系列に記録するように構成されている。
【０２４１】
このようにユーザはプログラム部品を指定することで、指定されたプログラム部品からデバイスが抽出される。また、ユーザは、特定のプログラム部品を、デバイスの抽出対象から除外することもできる。よって、ＰＬＣにおいてロギングの対象となるデバイスのユーザによる登録負担が軽減される。
【０２４２】
なお、抽出部５３はプログラム作成部６３により作成されたプログラム部品を解析して、当該プログラム部品に記述されているデバイスを抽出してもよい。部品指定部５２は、プログラム作成部６３により作成された複数のプログラム部品のうち、記録部８１の記録対象となる特定のデバイスが使用または記述されたプログラム部品を、プログラム部品を単位として（プログラム部品ごとに）指定してもよい。この場合、記録部８１は、抽出部５３により抽出されたデバイスであって、かつ、部品指定部５２により指定されたプログラム部品に使用または記述される特定のデバイスに記憶されているデバイス値を時系列に記録する。
【０２４３】
抽出部５３は、プログラム作成部６３により作成された複数のプログラム部品を解析して、各プログラム部品ごとに使用または記述されているデバイスを抽出してもよい。部品指定部５２は、プログラム作成部６３により作成された複数のプログラム部品のうち少なくとも一つのプログラム部品を指定してもよい。記録部８１は、抽出部５３により解析された複数のプログラム部品のうち、部品指定部５２により指定されたプログラム部品に使用または記述されるデバイスに記憶されているデバイス値を時系列に記録する。たとえば、予め複数のプログラム部品が解析されて、複数のデバイスが抽出されてもよい。つまり、各プログラム部品ごとに、抽出されたデバイスを示すリストが作成されてもよい。さらにユーザがいずれかのプログラム部品を指定すると、指定されたプログラム部品についてのリストが読み出され、そのリストに掲載されているデバイスが記録対象として選択されてもよい。
【０２４４】
部品指定部５２は、プログラム作成部６３により作成された複数のプログラム部品のうち少なくとも一つのプログラム部品を指定するように構成されていてもよい。抽出部５３は、部品指定部５２により指定されたプログラム部品を解析して、当該プログラム部品ごとに使用または記述されるデバイスを抽出してもよい。記録部８１は、抽出部５３により抽出された特定のデバイスに記憶されているデバイス値を時系列に記録する。このように、プログラム部品が指定された後でデバイスの抽出が実行されてもよい。これにより抽出処理が軽くなろう。
【０２４５】
抽出部５３は、プログラム作成部６３により作成された複数のプログラム部品を解析して、各プログラム部品ごとに使用又は記述されるデバイスを抽出してもよい。部品指定部５２は、プログラム作成部６３により作成された複数のプログラム部品のうち記録対象または除外対象となる少なくとも一つのプログラム部品を指定してもよい。記録部８１は、抽出部５３により複数のプログラム部品から抽出されたデバイスのうち、部品指定部５２により記録対象として指定されたプログラム部品に使用または記述されている特定のデバイスに記憶されているデバイス値を時系列に記録し、部品指定部５２により除外対象として指定されたプログラム部品以外のプログラム部品に使用されているデバイスを記録するように構成されていてもよい。たとえば、モジュールＡがデバイスメモリＤＭ０、ＤＭ１を使用し、モジュールＢがデバイスメモリＤＭ１、ＤＭ２を使用する場合、モジュールＡ、ＢからデバイスメモリＤＭ０、ＤＭ１、ＤＭ２が抽出される。ここで、モジュールＢが除外対象として指定されると、ＤＭ２が除外されるものの、ＤＭ１はモジュールＡでも使用されるため、ＤＭ１は記録対象として残る。このようにプログラム部品を単位として（つまりプログラム部品ごとに）、デバイスの加除が実行されてもよい。また、すべてのプログラム部品からデバイスが抽出された後で記録対象となるプログラム部品や除外対象となるプログラム部品が指定されてもよい。
【０２４６】
部品指定部５２は、複数のプログラム部品のうち、特定のデバイスを抽出されないプログラム部品を除外対象として指定するように構成されていてもよい。デバイス抽出部５３は、部品指定部５２によりデバイスの抽出対象として指定されたプログラム部品を解析して当該プログラム部品に使用または記述されるデバイスを抽出し、除外対象として指定されたプログラム部品からデバイスを抽出しないように構成されてもよい。つまり、削除部５５や追加部５４はデバイス抽出部により抽出された特定のデバイスのうち一部の特定のデバイスを、プログラム部品ごとに削除するか、または、デバイス抽出部により抽出されなかったデバイスをプログラム部品ごとに追加するデバイス加除部として機能してもよい。
【０２４７】
プログラム部品は、たとえば、再利用可能なプログラムモジュールであってもよい。複数のプログラム部品は、それぞれ個別のファイルに格納されていてもよい。複数のプログラム部品は、それぞれ個別にアクセス権限（編集権限）が設定されてもよい。
【０２４８】
ユーザプログラムは、たとえば、ラダープログラムであってもよい。この場合、複数のプログラム部品は、ラダープログラム内で使用または記述される複数のファンクションブロックであってもよい。
【０２４９】
検知部８２は、複数のデバイスのうちのいずれかのデバイスに対する外部機器からのデバイス値の書き換えを検知する検知部の一例である。記録部８１は、検知部８２によりデバイス値の書き換えが検知されたデバイスを記録対象に追加してもよい。
【０２５０】
ＰＬＣ１は、着脱可能なメモリカード３６と、メモリカード３６に対する命令を検知し、当該命令の対象となっているデバイスを特定する特定部５７とをさらに有してもよい。図６においては特定部５７がＰＣ２に設けられているが、基本ユニット３のＣＰＵ３１に実装されてもよい。記録部８１は、特定部５７により特定されたデバイスを記録対象に追加してもよい。
【０２５１】
ＰＬＣ１の拡張ユニット４は位置決め機能を有するモーションユニット（位置決めユニット）であってもよい。記録部８１またはデバイス抽出部５３は、位置決め機能に利用されるデバイスであってユーザプログラムにおいて記述されていないデバイス（例：モーションユニット内のバッファメモリなど）を記録対象に追加してもよい。
【０２５２】
推定部５９は、デバイス抽出部５３により記録対象として抽出されたデバイスの数に基づき記録部８１によるデバイス値の記録がユーザプログラムの実行に与える影響を推定する推定部の一例である。表示部７は、この影響を表示するように構成されていてもよい。これにより、ユーザは、スキャンタイムへの影響を加味しつつ、デバイスを加除することが可能となる。
【０２５３】
図７においては、選択されたプログラム部品からのデバイスの抽出と、選択された機能からのデバイスの抽出と、ユーザによるデバイスの手動追加とが記載されている。しかし、これらのすべてが必須というわけではない。これらのうち二つ以上が採用されれば十分であろう。あるいは、選択されたプログラム部品からのデバイスの抽出だけが採用されてもよいし、選択された機能からのデバイスの抽出だけが採用されてもよい。
【０２５４】
ＣＰＵ３１や実行部８０は、ユーザプログラムを繰り返し実行するプログラム実行エンジンの一例である。ＣＰＵ３１や実行部８０、ＣＰＵ４１は、ユーザプログラムからの指令に基づいて、各々がユーザプログラムに関する異なる機能（例：機能プログラム）を実行する複数の機能実行エンジンの一例である。これは、基本ユニット３が拡張ユニット４の機能を内包してもよいことを示唆している。機能プログラムは、たとえば、モーション制御プログラムである。プログラム実行エンジンや複数の機能実行エンジンは、単一のＣＰＵにより実行されてもよいし、複数のＣＰＵにより実行されてもよいし、ＡＳＩＣまたはＦＰＧＡにより実現されてもよい。また、単一のＣＰＵがマルチコアを搭載しており、各コアがそれぞれ異なる機能を担当していてもよい。
【０２５５】
デバイス部３４はログラム実行エンジンと複数の機能実行エンジンにより参照される記憶領域である複数のデバイスを有するデバイス記憶部の一例である。記録部８１は、複数のデバイスのいずれかに記憶されているデバイス値を時系列に記録するデバイス記録部の一例である。機能設定部６２は、複数の機能実行エンジンの各々にて使用される複数のデバイスを割り付ける割付部として機能してもよい。機能指定部６０は、複数の機能実行エンジンに対応する複数の機能のうち一つ以上の機能を指定する指定部として機能してもよい。デバイス抽出部５３は、割付部により割り付けられた複数のデバイスから、指定部により指定された一つ以上の機能のために使用されるデバイスをデバイス記録部の記録対象として抽出してもよい。
【０２５６】
プログラム実行エンジンは、メインユニットに設けられてもよい。複数の機能実行エンジンのうちの少なくとも一つは、メインユニットの機能を拡張するために該メインユニットと電気的に接続される機能拡張ユニットに設けられていてもよい。複数の機能実行エンジンのすべてがメインユニットに設けられてもよい。
【０２５７】
基本ユニット３は、プログラム実行部と、デバイス記憶部と、デバイス記録部とを有するメインユニットの一例である。拡張ユニット４は、メインユニットの機能を拡張するために該メインユニットと電気的に接続される機能拡張ユニットの一例である。
【０２５８】
機能設定部６２は、表示部７を介したユーザ入力に基づいて、メインユニットの機能のために使用されるデバイスと、機能拡張ユニットの機能のために使用されるデバイスとを割り付ける割付部として機能する。機能設定部６２は、機能に対してデバイスを割り付けるためのＵＩを表示部７に表示してもよい。
【０２５９】
機能指定部６０は、メインユニットに設けられた機能と機能拡張ユニットに設けられた機能とを含む複数の機能のうち一つ以上の機能を指定する指定部の一例である。デバイス抽出部５３の追加部５４は、指定部により指定された機能のために使用されるデバイスをデバイス記録部の記録対象として抽出する。デバイス抽出部５３の削除部５５は、指定部により指定された機能のために使用されるデバイスをデバイス記録部の記録対象から除外する。通信部２３は、記録対象として抽出された特定のデバイスに記憶されているデバイス値を時系列にデバイス記録部に記録させるための設定データをＰＬＣ１に送信する送信部として機能する。記録部８１は、デバイス抽出部５３により記録対象として抽出されたデバイスに記憶されているデバイス値を時系列に記録するように構成されている。
【０２６０】
プロジェクト作成部５０は、表示部７を介したユーザ入力に基づいて、複数のデバイスのいずれかに関する命令語を含むユーザプログラムを作成するプログラム作成部として機能する。デバイス抽出部５３は、ユーザプログラムを解析し、ユーザプログラムに使用または記述されているデバイスを抽出し、抽出されたデバイスを含むデバイスリスト（抽出リスト）を作成してもよい。さらに、デバイス抽出部５３は、機能指定部６０により記録対象（抽出対象）として指定された機能のために使用されるデバイスをデバイスリストに追加してもよい。また、削除部５５は、機能指定部６０により除外対象として指定された機能のために使用されるデバイスをデバイスリストから削除するように構成されていてもよい。デバイスリストはログ設定データ７２に含まれている。記録部８１は、デバイスリストに登録されているデバイスに記憶されているデバイス値を時系列に記録するように構成されている。
【０２６１】
機能指定部６０は、さらに、メインユニットと機能拡張ユニットとのうちのいずれかユニットを指定するように構成されていてもよい。つまり、機能が選択されてもよいし、ユニットが選択されてもよい。一つのユニットが複数の機能を有している場合、ユーザは一つの機能を選択することで、そのユニットに含まれているすべての機能がデバイスの抽出対象として選択される。デバイス抽出部５３は、機能指定部６０により記録対象（抽出対象）として指定されたユニットのために使用されるデバイスをデバイス記録部の記録対象として抽出してもよい。また、デバイス抽出部５３は、機能指定部６０により除外対象として指定されたユニットのために使用されるデバイスをデバイス記録部の記録対象から除外するように構成されてもよい。このようにメインユニットと機能拡張ユニットを単位として抽出対象や除外対象が指定されてもよい。
【０２６２】
図１４が示すように、機能指定部６０は、さらに、記録対象となるデバイスのデバイス種別または除外対象となるデバイスのデバイス種別を指定するように構成されていてもよい。デバイス抽出部５３は、機能指定部６０により記録対象として指定されたデバイス種別のデバイスをデバイス記録部の記録対象として抽出する。デバイス抽出部５３は、指定部により除外対象として指定されたデバイス種別のデバイスをデバイス記録部の記録対象から除外するように構成されていてもよい。
【０２６３】
図１９を用いて説明されたように、収集部９２ａは複数のデバイスのいずれかに記憶されているデバイス値を収集し、当該デバイス値の収集時刻に関する情報と当該デバイス値とを関連付けて第一バッファに記憶する第一収集部の一例である。なお、収集対象のデバイス値は、ログ設定データ７２によって予め設定されてもよい。リングバッファ９１ａは第一バッファの一例である。収集時刻に関する情報は、たとえば、時刻管理部８３ａから供給される時刻情報であってもよい。ＩＦ９９ａ、９９ｆは拡張ユニット４と通信する第一インタフェースの一例である。通信部３３は外部設定機器からユーザプログラムと設定情報とを受け付ける第一の外部インタフェースの一例である。
【０２６４】
ＩＦ９９ｂ、９９ｄ、９９ｈ、９９ｊなどは、メインユニットと通信する第二インタフェースの一例である。画像受信部９６ａや接続ポート９７は二次元データを取得する監視機器に接続され、当該監視機器から当該二次元データを受信する第三インタフェース（二次元データ受信部）の一例である。接続ポート９７は、監視機器と接続され、当該監視機器からデータが入力される第二の外部インタフェースとして機能してもよい。カメラ９８は監視機器の一例である。監視機器はバーコードリーダであってもよい。この場合、バーコードの読み取り結果は二次元データの一例である。監視機器は、ワークの高さ画像や距離画像を生成する画像処理装置であってもよい。高さ画像や距離画像は二次元データの一例である。二次元データは動画データであってもよい。また、デバイス値と比較してサイズの大きな大容量データも二次元データの一例である。たとえば、高速アナログ入力ユニットによって取得される数値データも二次元データの一例である。機能実行部９６は第二の外部インタフェースを介して監視機器からのデータの入力を伴う機能を、受け付けた設定情報に基づいて実行する機能実行部として機能してもよい。
【０２６５】
収集部９２ｂは第三インタフェースを介して受信した二次元データを収集し、当該二次元データが取得された取得時刻に関する情報と当該二次元データとを関連付けて第二バッファに記憶する第二収集部の一例である。時刻管理部８３が提供する時刻情報は取得時刻に関する情報の一例である。リングバッファ９１ｂは第二バッファの一例である。
【０２６６】
保存部９３は所定の保存条件が満たされると、第一バッファに記憶されているデバイス値と収集時刻に関する情報と、第二バッファに記憶されている二次元データと取得時刻に関する情報とを保存する保存部の一例である。
【０２６７】
このようにデバイス値および二次元データにはそれぞれ取得時刻に関する情報が紐付けられている。そのため、二次元データなどの比較的に大容量のデータとデバイス値との時間的な関係を特定しやすくなる。
【０２６８】
監視機器は、静止画又は動画の画像データを取得するカメラで９８あってもよい。機能実行部９６は、カメラ９８から画像データの入力を伴う機能を実行する。第二収集部である収集部９２ｂは、画像データが取得された取得時刻に関する情報と当該画像データとを関連付けて第二バッファに記憶する。保存部９３は、デバイス値と、収集時刻に関する情報と、第二バッファに記憶されている画像データと、取得時刻に関する情報とを対応付けて保存してもよい。機能実行部９６は、ユーザプログラムの実行周期とは非同期で、監視機器からのデータの入力を伴う機能を実行してもよい。保存部９３は、ユーザプログラム及び設定情報を含むプロジェクトデータを併せて保存してもよい。保存部９３は、デバイス値、収集時刻に関する情報と、第二バッファに記憶されているデータと、取得時刻に関する情報とを、共通フラグにより識別される複数のファイルに格納し、当該複数のファイルを保存してもよい。
【０２６９】
収集時刻に関する情報は、時系列に収集された複数のデバイス値の各々について収集時刻を特定可能な情報であればよい。複数のデバイス値の各々について収集時刻が関連付けられていてもよい。あるいは、たとえば、最初のデバイス値についてのみ収集時刻が関連付けられていてもよい。後者の場合、他の情報（スキャン回数やスキャンタイム等）に基づいて、最初のデバイス値以外のデバイス値についての収集時刻が算出されてもよい。デバイス値は、スキャン回数と同じ数だけ記録されることから、それぞれのスキャンにおける処理時間（スキャンタイム）を記憶しておくことで、任意のデバイス値の収集時刻が特定可能となる。例えば、１００回目のスキャンで記録されたデバイス値の収集時刻を特定しようとするとき、１回目のスキャンで記録されたデバイス値の収集時刻が１０時１０分００秒であり、２〜１００回目の各スキャンは全て１００マイクロ秒かかったと仮定する。この場合、１０時１０分００秒から、１００マイクロ秒×９９を経過した時刻が、１００回目のスキャンで記録されたデバイス値の収集時刻として算出される。このように、全てのデバイス値に収集時刻を関連付けて記録することは必須ではない。
【０２７０】
取得時刻に関する情報は、時系列に取得された複数の二次元データの各々について取得時刻を特定するための情報であればよい。複数の二次元データの各々について取得時刻が関連付けられていてもよい。あるいは、例えば、最初の二次元データについてのみ取得時刻が関連付けられていてもよい。後者の場合、他の情報（撮像回数や撮像周期等）に基づいて、最初の二次元データ以外の二次元データについての取得時刻を算出することができる。具体的には、複数の二次元データのうち、最初の二次元データのみに、取得時刻を関連付けられる。二次元データを取得する周期（撮像周期）は、ほぼ一定である。したがって、任意の二次元データの取得時刻を特定できる。例えば、１０回目の撮像で記録された画像データの取得時刻を特定しようとするとき、１回目の撮像で記録された画像データの取得時刻が１０時１０分００秒であり、２〜１０回目の各撮像は全て１００ミリ秒掛かったと仮定する。この場合、１０回目の撮像で記録された画像データの取得時刻は、１０時１０分００秒から、１００ミリ秒×９を経過した時刻である。このように、全ての二次元データに取得時刻を関連付けて記録することは必須ではない。
【０２７１】
保存部９３はメインユニットから着脱可能なメモリカード３６を含んでもよい。保存部９３は第一バッファに記憶されているデバイス値と収集時刻に関する情報と、第二バッファに記憶されている二次元データと取得時刻に関する情報とをメモリカード３６に保存してもよい。これにより、ログデータ７３をＰＣ２へ搬送しやすくなる。図１９が示すように、第一バッファはメインユニットに設けられていてもよい。図２０が示すように、第二バッファは拡張ユニットに設けられていてもよい。
【０２７２】
図２４が示すように、第一インタフェースはメインユニットの側面であって、拡張ユニットの側面に対して対向する側面に配置されていてもよい。第二インタフェースは第一インタフェースと接続されるように拡張ユニットの側面に設けられていてもよい。
【０２７３】
図２５が示すようにバックプレーン２００はメインユニットと拡張ユニットとを支持する支持プレートの一例である。この場合、第一バッファ、第二バッファおよび保存部のうちの少なくとも一つが支持プレートに設けられていてもよい。
【０２７４】
送信部９４は、記憶装置３２に保存されているデバイス値、収集時刻に関する情報、二次元データ、および取得時刻に関する情報を外部機器に送信する送信部の一例である。外部機器はクラウドであってもよいし、ＰＣ２であってもよい。ＰＣ２は、ログデータ７３をリアルタイムで受信して表示部７にログデータ７３を表示してもよい。
【０２７５】
第一バッファまたは第二バッファは、ユーザプログラムの実行周期（例：スキャン周期）よりも短い周期で発生する情報をさらに記憶するように構成されていてもよい。
【０２７６】
保存部９３は、メインユニットにおいてユーザプログラムに関するエンド処理（ＥＮＤ処理）が実行されている期間において、第二バッファから二次元データと取得時刻に関する情報を読み出して保存するように構成されていてもよい。
【０２７７】
時刻管理部８３ａ、８３ｂに関して説明されたように、収集時刻を計時するメインユニットの時計と取得時刻を計時する拡張ユニットの時計とは同期している。この同期は、たとえば、ユニット間同期によって実現されてもよい。
【０２７８】
図２９が示すように、保存部９３は、予め設定された保存トリガーの前後にわたる所定の収集時間に収集されたデバイス値、収集時刻に関する情報、二次元データ、および取得時刻に関する情報をメモリカード３６に保存するように構成されていてもよい。
【０２７９】
図３０が示すように、保存部９３は、予め設定された開始リレーがオンになったタイミングを起点とした所定の収集時間に収集されたデバイス値、収集時刻に関する情報、二次元データ、および取得時刻に関する情報をメモリカード３６に保存するように構成されていてもよい。
【０２８０】
図３２に関連して説明したように、保存部９３は、所定の保存条件が満たされると、デバイス記録部に記録されているデバイス値と、プログラム記憶部に記憶されているユーザプログラムまたはユーザプログラムの識別情報とを対応付けてメモリ（例：メモリカード３６や内部メモリ３７）に保存してもよい。また、出力部８４は所定の出力条件が満たされると、デバイス記録部に記録されているデバイス値と、プログラム記憶部に記憶されているユーザプログラムまたは当該ユーザプログラムの識別情報とを外部メモリ（例：メモリカード３６）に出力してもよい。上述したように、ログデータ７３がどのプロジェクトデータ７１を使用することで取得されたかは重要である。したがって、ログデータ７３を取得するため使用されたプロジェクトデータ７１そのもの、または、その識別情報を出力部８４が出力する。つまり、ログデータ７３と、プロジェクトデータ７１またはその識別情報を出力することで、ログデータ７３とプロジェクトデータ７１と関係を特定しやすくなる。これにより、ユーザは、プロジェクトデータ７１のデバッグを効率よく進めることが可能となる。
【０２８１】
ユーザプログラムは複数のプログラム部品から構成されている。また、プロジェクトデータは複数のプログラム部品を管理している。記憶装置３２はプロジェクトデータ７１の一部としてユーザプログラムを記憶するプログラム記憶部として機能する。出力部８４は、ユーザプログラムを含むプロジェクトデータ７１を出力するとともに、ユーザプログラムの識別情報としてプロジェクトデータ７１の識別情報を出力するように構成されていてもよい。これにより、ＰＣ２に記憶されているプロジェクトデータ７１（マスタデータ）と、ＰＬＣ１に記憶されているプロジェクトデータ７１とが一致しているかどうかを判定しやすくなる。
【０２８２】
プロジェクトデータ７１は、拡張ユニット４の設定情報を含んでもよい。これは、プロジェクトデータ７１をデバッグする際に拡張ユニット４の設定情報が必要になることがあるからである。たとえば、複数の拡張ユニット４が基本ユニット３に接続されている場合、複数の拡張ユニット４の接続順番が拡張ユニット４の設定情報に含まれている。この接続順番に関する情報がデバッグの際に必要となることがある。
【０２８３】
判定部３０１はユーザプログラム（プロジェクトデータ７１）の出力が禁止されているかどうかを判定する判定部として機能する。出力部８４は、判定部３０１によりユーザプログラムの出力が禁止されていると判定された場合、デバイス記録部に記録されているデバイス値と、プログラム記憶部に記憶されているユーザプログラムの識別情報とを外部メモリに出力してもよい。これにより、ユーザプログラムをプロテクトしつつ、識別情報に基づきＰＣ２のマスタデータが利用可能となる。
【０２８４】
付加部３１２に関連して説明されたように、ユーザプログラムの識別情報は、ユーザプログラムが変更されると更新される識別情報である。よって、ＰＬＣ１に保持されているプロジェクトデータ７１と異なる他のバージョンのプロジェクトデータ７１が誤ってデバッグに利用されないようになろう。
【０２８５】
演算部３１３に関連して説明されたように、ユーザプログラムの識別情報は、ユーザプログラムから演算される誤り検出符号またはハッシュ値であってもよい。このように、プロジェクトデータ７１が更新されると、識別情報も更新されるような識別情報の演算方法が採用されてもよい。識別情報はタイムスタンプなどであってもよい。
【０２８６】
ＰＣ２の記憶装置２２はユーザプログラムと当該ユーザプログラムの識別情報を記憶するプログラムメモリの一例である。照合部３３４はプログラマブルロジックコントローラから出力されるユーザプログラムの識別情報と、プログラムメモリに記憶されているユーザプログラムの識別情報とを照合し、照合結果を表示部に表示させる照合部の一例である。警告部３３５は両者が不一致であった場合に警告を出力するが、両者が一致していた場合には一致していることを示すメッセージまたは画像を表示部７に表示してもよい。
【０２８７】
図３８が示すように、表示部７は、プログラマブルロジックコントローラから出力されたデバイス値を、ユーザプログラムのうち当該デバイス値に関連した命令語が記述されている部分と関連付けて表示してもよい。これにより、ユーザは、デバイス値の変化とユーザプログラムとの関係を理解しやすくなる。これはデバッグの効率を向上させるであろう。
【０２８８】
記憶装置２２やメモリカード３６はプログラマブルロジックコントローラにおいて収集された時系列の複数のデバイス値と、各デバイス値の収集時刻を示す時刻データとを保存する保存手段の一例である。プログラム表示モジュール３２１はデバイス値をラダー図上に表示する第一エンジニアリングソフトウェアモジュールの一例である。波形表示モジュール３２２はデバイス値を時系列波形として表示する第二エンジニアリングソフトウェアモジュールの一例である。再生制御モジュール３２４は第一エンジニアリングソフトウェアモジュールにおける表示対象時刻と第二エンジニアリングソフトウェアモジュールにおける表示対象時刻とを同期させる同期ソフトウエアモジュールの一例である。これにより、ユーザは、特定のデバイス値の変化とプログラムの関係とを理解しやすくなろう。
【０２８９】
第一エンジニアリングソフトウェアモジュールは、リアルタイム再生モードにおいてプログラマブルロジックコントローラからデバイス値を取得してラダー図上に当該デバイス値を表示し、履歴再生モードにおいて時刻データに基づき表示対象時刻に対応するデバイス値を保存手段から取得してラダー図上に表示する第一表示制御手段を有してもよい。プログラム表示部３３２、表示時刻制御部３３１およびデバイス値取得部３３３は第一表示制御手段として機能する。ログ再生モードは履歴再生モードの一例である。
【０２９０】
第二エンジニアリングソフトウェアモジュールは、リアルタイム再生モードにおいてプログラマブルロジックコントローラからデバイス値を取得して時系列波形を表示し、履歴再生モードにおいて時刻データに基づき表示対象時刻に対応するデバイス値を保存手段から取得して時系列波形を表示する第二表示制御手段を有してもよい。波形表示部３３６、表示時刻制御部３３１およびデバイス値取得部３３３は第二表示制御手段の一例である。
【０２９１】
同期ソフトウエアモジュールは、履歴再生モードにおいて第一エンジニアリングソフトウェアモジュールにおける表示対象時刻と第二エンジニアリングソフトウェアモジュールにおける表示対象時刻とを同期させる同期手段を有してもよい。再生制御部３４３は同期手段の一例である。
【０２９２】
第一エンジニアリングソフトウェアモジュールは、さらに、履歴再生モードにおいて表示対象時刻を更新する第一更新手段をさらに有してもよい。時刻指定カーソル４０４、時刻ＵＩ３３０および表示時刻制御部３３１は第一更新手段の一例である。同期手段である再生制御部３４３は、第一更新手段により更新された表示対象時刻を第二エンジニアリングソフトウェアモジュールの表示対象時刻へ反映させる。
【０２９３】
第二エンジニアリングソフトウェアモジュールは、履歴再生モードにおいて表示対象時刻を更新する第二更新手段をさらに有してもよい。バー１０３、時刻ＵＩ３３０および表示時刻制御部３３１は第二更新手段の一例である。同期手段である再生制御部３４３は、第二更新手段により更新された表示対象時刻を第一エンジニアリングソフトウェアモジュールの表示対象時刻へ反映させる。
【０２９４】
図４３が示すように、第一表示制御手段は、プログラマブルロジックコントローラにおいて参照される複数のデバイスのうち第二エンジニアリングソフトウェアモジュールにおいて表示対象とされているデバイスに関連する命令語を、ラダー図において検索してもよい。たとえば、図２８に示されているデバイス（例：Ｒ０００やＤＭ１００など）をポインタ１０１により指定することで、デバイスが指定されてもよい。図３８が示すように、第一表示制御手段は、ラダー図において見つかった命令語とともに当該デバイスのデバイス値を表示するように構成されていてもよい。また、ポインタ１０１は、任意のデバイスを指定する指定手段の一例である。第一表示制御手段は、プログラマブルロジックコントローラにおいて参照される複数のデバイスのうち指定手段により指定されたデバイスに関連する命令語を、ラダー図において検索し、ラダー図において見つかった命令語とともに当該デバイスのデバイス値を表示してもよい。
【０２９５】
図４３が示すように、プログラマブルロジックコントローラにおいてラダープログラムは複数のプログラム部品から構成されていてもよい。第一表示制御手段（例：ログ表示部６１やデバイス抽出部５３）は、デバイスに関連する命令語を含む一つ以上のブロックを複数のプログラム部品の中から検索し、見つかったブロックをラダー図として表示するように構成されていてもよい。
【０２９６】
図４３が示すように、第一表示制御手段は、デバイスに関連する命令語を含む複数のブロックを見つけると、当該複数のブロックに対応するラダー図を並べて表示してもよい。
【０２９７】
図４３が示すように、第一表示制御手段は、ラダープログラムにおいて、第一ブロック（例：測定モジュールＢ２）において第一デバイス（例：ＭＲ００１）に関連する命令語が入力系の命令語である場合に、当該入力系の命令語に対応して記述されている出力系の命令語の対象とされている第二デバイス（例：ＭＲ００３）を特定し、当該第二デバイスを対象とする入力系の命令語を記述された第二ブロック（例：判定モジュールＢ３）を特定してもよい。
【０２９８】
第一表示制御手段は、ラダープログラムにおいて、第一ブロック（例：判定モジュールＢ３）において第一デバイス（例：ＭＲ０１０）に関連する命令語が出力系の命令語である場合に、当該出力系の命令語に対応して記述されている入力系の命令語の対象とされている第二デバイス（例：ＭＲ００１）を特定し、当該第二デバイスを対象とする出力系の命令語を記述された第二ブロック（例：測定モジュールＢ２）を特定してもよい。
【０２９９】
同期手段は、表示対象時刻の更新速度を設定する設定手段を有してもよい。速度指定部４０５は設定手段の一例である。これによりスロー再生や早送り再生などが実現されてもよい。
【０３００】
第一表示制御手段および第二表示制御手段は、プログラマブルロジックコントローラに関する情報を表示するヒューマンインタフェース（ＨＭＩ）から入力されたユーザ入力に基づき設定されたデバイス値をさらに表示するように構成されていてもよい。ＨＭＩはエミュレータにより実現されてもよい。図３９に関連して説明されたようにＵＩ４９０は複数のデバイス値を表示している。いずれのデバイス値がポインタ１０１によりクリックされると、ログ表示部６１は、クリックされたデバイス値をプログラム表示部３３２の表示対象として追加したり、波形表示部３３６の表示対象として追加したりしてもよい。これにより、ＨＭＩ、ユーザプログラムおよびデバイス値の波形を連携および同期させて表示することが可能となる。
【０３０１】
保存手段は、カメラユニットより取得された時系列の複数の画像データと、各画像データの取得時刻を示す時刻データとをさらに保存していてもよい。図２８が示すように、第二エンジニアリングソフトウェアモジュールは、リアルタイム再生モードにおいてプログラマブルロジックコントローラからデバイス値を取得して時系列波形を表示するとともにカメラユニットから取得された画像データを表示してもよい。同様に、第二エンジニアリングソフトウェアモジュールは、履歴再生モードにおいて保存手段から表示対象時刻に対応するデバイス値と画像データとを取得して表示してもよい。画像データは数値よりも多くの情報を有している。そのため、画像データを表示することで、ユーザは、問題点を早期に見つけることが可能となろう。
【０３０２】
また、第一エンジニアリングソフトウェアモジュールは、リアルタイム再生モードにおいてプログラマブルロジックコントローラからデバイス値を取得してラダー図上に当該デバイス値を表示するとともにカメラユニットから取得された画像データを表示してもよい。第一エンジニアリングソフトウェアモジュールは、履歴再生モードにおいて保存手段から表示対象時刻に対応するデバイス値と画像データとを取得してラダー図上に表示してもよい。
【０３０３】
複数の拡張ユニット４のそれぞれ異なる内部制御周期にしたがって動作している。よって、複数の拡張ユニット４から取得されるデバイス値の取得時刻や画像データの取得時刻が一致しないことが多い。そこで、図２６〜図２８に関連して説明されたように、第一表示制御手段および第二表示制御手段は、履歴再生モードにおいて、表示対象時刻に最も近い時刻データに関連付けられているデバイス値を読み出すように構成されていてもよい。
【図１】
2020177713.tif 000003
【図２】
2020177713.tif 000004
【図３】
2020177713.tif 000005
【図４】
2020177713.tif 000006
【図５】
2020177713.tif 000007
【図６】
2020177713.tif 000008
【図７】
2020177713.tif 000009
【図８】
2020177713.tif 000010
【図９】
2020177713.tif 000011
【図１０Ａ】
2020177713.tif 000012
【図１０Ｂ】
2020177713.tif 000013
【図１０Ｃ】
2020177713.tif 000014
【図１１】
2020177713.tif 000015
【図１２】
2020177713.tif 000016
【図１３】
2020177713.tif 000017
【図１４】
2020177713.tif 000018
【図１５】
2020177713.tif 000019
【図１６】
2020177713.tif 000020
【図１７】
2020177713.tif 000021
【図１８】
2020177713.tif 000022
【図１９】
2020177713.tif 000023
【図２０】
2020177713.tif 000024
【図２１】
2020177713.tif 000025
【図２２】
2020177713.tif 000026
【図２３】
2020177713.tif 000027
【図２４】
2020177713.tif 000028
【図２５】
2020177713.tif 000029
【図２６】
2020177713.tif 000030
【図２７】
2020177713.tif 000031
【図２８】
2020177713.tif 000032
【図２９】
2020177713.tif 000033
【図３０】
2020177713.tif 000034
【図３１】
2020177713.tif 000035
【図３２】
2020177713.tif 000036
【図３３】
2020177713.tif 000037
【図３４】
2020177713.tif 000038
【図３５Ａ】
2020177713.tif 000039
【図３５Ｂ】
2020177713.tif 000040
【図３５Ｃ】
2020177713.tif 000041
【図３５Ｄ】
2020177713.tif 000042
【図３６Ａ】
2020177713.tif 000043
【図３６Ｂ】
2020177713.tif 000044
【図３６Ｃ】
2020177713.tif 000045
【図３７】
2020177713.tif 000046
【図３８】
2020177713.tif 000047
【図３９】
2020177713.tif 000048
【図４０】
2020177713.tif 000049
【図４１】
2020177713.tif 000050
【図４２】
2020177713.tif 000051
【図４３】
2020177713.tif 000052
【図４４】
2020177713.tif 000053
【図４５】
2020177713.tif 000054
【図４６】
2020177713.tif 000055
【図４７】
2020177713.tif 000056
【手続補正書】
【提出日】令和2年9月4日(2020.9.4)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
電気的に接続された複数のユニットの各々を制御するためのユーザプログラムを実行するプログラマブルロジックコントローラであって、
外部設定機器から、前記ユーザプログラム、前記複数のユニットの構成に関するユニット構成情報、および、当該ユーザプログラムに基づき作成されたログ設定データを受け付ける外部インタフェースと、
前記外部インタフェースにて受け付けられた前記ユニット構成情報に基づいて前記複数のユニット間でユニット間通信を行うとともに、前記外部インタフェースにて受け付けられた前記ユーザプログラムを実行する実行部と、
前記外部インタフェースにて受け付けられた前記ログ設定データに基づいて、前記実行部により実行される前記ユーザプログラムにて使用される記憶領域である複数のデバイスに記憶されているデバイス値を、時刻に関する情報とともに記録する記録部と、
所定の出力条件が満たされると、前記記録部により記録され、前記時刻に関する情報と対応付けられた前記デバイス値を、前記外部インタフェースにて受け付けられた前記ユーザプログラムとともに、前記外部設定機器にて当該ユーザプログラムに関連付けて再生される形式で出力する出力部と、
を備えることを特徴とするプログラマブルロジックコントローラ。
【請求項２】
前記複数のユニットは、前記実行部を備える基本ユニットと、当該基本ユニットとの間でユニット間通信を行うとともに、前記ユーザプログラムのスキャン周期とは異なる周期で所定機能を実行する拡張ユニットとを有し、
前記記録部は、前記基本ユニットに対応するデバイスに記憶されている第１のデバイス値と、前記ユニット間通信により取得され、前記拡張ユニットに対応するデバイスに記憶されている第２のデバイス値とを、時刻に関する情報とともに記録し、
前記出力部は、前記時刻に関する情報と対応付けられた前記第１のデバイス値および前記第２のデバイス値を、前記ユーザプログラムとともに出力することを特徴とする請求項１に記載のプログラマブルロジックコントローラ。
【請求項３】
前記拡張ユニットは、前記所定機能が実行される際に使用される記憶領域であるバッファメモリを備え、
前記ユーザプログラムは、前記ユニット間通信を介さずに前記バッファメモリに記憶される値を直接読み出すための命令語を含み、
前記記録部は、さらに、前記命令語の実行により前記バッファメモリから読み出された値を記録し、
前記出力部は、前記記録部により記録され、前記バッファメモリから読み出された値を、前記ユーザプログラムとともに出力することを特徴とする請求項２に記載のプログラマブルロジックコントローラ。
【請求項４】
前記拡張ユニットは、前記所定機能として、入力されるアナログ信号をサンプリングしてデジタル信号に変換する機能を実行し、
前記記録部は、前記変換する機能におけるピーク値とボトム値にそれぞれ割り付けられたデバイスに記憶されているデバイス値を、時刻に関する情報とともに記録することを特徴とする請求項２に記載のプログラマブルロジックコントローラ。）
【請求項５】
前記実行部により前記ユーザプログラムが実行される際に、当該ユーザプログラムに使用されるデバイスのデバイス値を記憶するデバイス記憶部をさらに備え、
前記出力部は、前記記録部により記録された所定期間分のデバイス値を前記ユーザプログラムとともに出力する第１の出力機能と、前記デバイス記憶部に記憶されているデバイス値をリアルタイムで出力する第２の出力機能とを有することを特徴とする請求項１に記載のプログラマブルロジックコントローラ。
【請求項６】
所定の保存タイミングが到来すると、前記記録部により記録されているデバイス値を前記時刻に関する情報とともに保存する保存部をさらに備え、
前記出力部は、前記保存部により保存されたデバイス値を、前記ユーザプログラムとともに前記外部設定機器に出力することを特徴とする請求項１に記載のプログラマブルロジックコントローラ。
【請求項７】
前記保存部は、前記記録部により記録されているデバイス値が格納されたファイルを生成し、
前記出力部は、前記ファイルを前記外部設定機器に出力するときに、前記ユーザプログラムを読み出して当該ファイルとともに前記外部設定機器に出力することを特徴とする請求項６に記載のプログラマブルロジックコントローラ。
【請求項８】
前記出力部は、前記外部設定機器からの転送指示に基づいて、前記ユーザプログラムを読み出して前記デバイス値とともに前記外部設定機器に出力することを特徴とする請求項７に記載のプログラマブルロジックコントローラ。
【請求項９】
前記保存部は、前記ログ設定データに基づき定められる保存タイミングが到来するたびに、前記記録部により記録されているデバイス値を保存することを特徴とする請求項６ないし８のいずれか一項に記載のプログラマブルロジックコントローラ。
【請求項１０】
前記保存部は、前記ログ設定データに基づき同一の保存タイミングで保存されるデバイス値を、同一フォルダ内のファイルとしてメモリに保存することを特徴とする請求項６ないし９のいずれか一項に記載のプログラマブルロジックコントローラ。
【請求項１１】
前記保存部は、予め設定された保存トリガの前後にわたる所定の収集時間に収取されたデバイス値を保存することを特徴とする請求項６ないし１０のいずれか一項に記載のプログラマブルロジックコントローラ。
【請求項１２】
前記保存部は、予め設定された開始リレーがオンになったタイミングを起点とした所定の収集時間に収集されたデバイス値を保存することを特徴とする請求項６ないし１０のいずれか一項に記載のプログラマブルロジックコントローラ。
【手続補正２】
【補正対象書類名】明細書
【補正対象項目名】０００６
【補正方法】変更
【補正の内容】
【０００６】
本発明は、たとえば、
電気的に接続された複数のユニットの各々を制御するためのユーザプログラムを実行するプログラマブルロジックコントローラであって、
外部設定機器から、前記ユーザプログラム、前記複数のユニットの構成に関するユニット構成情報、および、当該ユーザプログラムに基づき作成されたログ設定データを受け付ける外部インタフェースと、
前記外部インタフェースにて受け付けられた前記ユニット構成情報に基づいて前記複数のユニット間でユニット間通信を行うとともに、前記外部インタフェースにて受け付けられた前記ユーザプログラムを実行する実行部と、
前記外部インタフェースにて受け付けられた前記ログ設定データに基づいて、前記実行部により実行される前記ユーザプログラムにて使用される記憶領域である複数のデバイスに記憶されているデバイス値を、時刻に関する情報とともに記録する記録部と、
所定の出力条件が満たされると、前記記録部により記録され、前記時刻に関する情報と対応付けられた前記デバイス値を、前記外部インタフェースにて受け付けられた前記ユーザプログラムとともに、前記外部設定機器にて当該ユーザプログラムに関連付けて再生される形式で出力する出力部と、
を備えることを特徴とするプログラマブルロジックコントローラを提供する。