以下に本発明の一実施形態を示す。以下で説明される個別の実施形態は、本発明の上位概念、中位概念および下位概念など種々の概念を理解するために役立つであろう。また、本発明の技術的範囲は、特許請求の範囲によって確定されるのであって、以下の個別の実施形態によって限定されるわけではない。
<システム構成>
はじめにプログラマブルロジックコントローラ(PLC、単にプログラマブルコントローラと呼ばれてもよい)を当業者にとってよりよく理解できるようにするために、一般的なPLCの構成とその動作について説明する。
図1は、本発明の実施の形態によるプログラマブル・ロジック・コントローラシステムの一構成例を示す概念図である。図1が示すように、このシステムは、ラダープログラムなどのユーザプログラムの編集を行うためのPC2と、工場等に設置される各種制御装置を統括的に制御するためのPLC(プログラマブルロジックコントローラ)1とを備えている。PCはパーソナルコンピュータの略称である。ユーザプログラムは、ラダー言語やSFC(シーケンシャルファンクションチャート)などのフローチャート形式のモーションプログラムなどのグラフィカルプログラミング言語を用いて作成されてもよいし、C言語などの高級プログラミング言語を用いて作成されてもよい。以下では、説明の便宜上、ユーザプログラムはラダープログラムとする。PLC1は、CPUが内蔵された基本ユニット3と、1つないし複数の拡張ユニット4を備えている。基本ユニット3に対して1つないし複数の拡張ユニット4が着脱可能となっている。たとえば、拡張ユニット4aはモータ(フィールドデバイス10a)を駆動してワークの位置決めする位置決めユニットであり、拡張ユニット4bはカウンタユニットであってもよい。カウンタユニットは手動パルサなどのエンコーダ(フィールドデバイス10b)からの信号をカウントする。なお、参照符号の末尾に付与されているa、b、c・・・の文字は省略されることがある。基本ユニット3はCPUユニットと呼ばれることもある。なお、PLC1とPC2とを含むシステムはプログラマブルロジックコントローラシステムと呼ばれてもよい。
基本ユニット3には、表示部5および操作部6が備えられている。表示部5は、基本ユニット3に取り付けられている各拡張ユニット4の動作状況などを表示することができる。操作部6の操作内容に応じて表示部5は表示内容を切り替える。表示部5は、通常、PLC1内のデバイスの現在値(デバイス値)やPLC1内で生じたエラー情報などを表示する。デバイスとは、デバイス値(デバイスデータ)を格納するために設けられたメモリ上の領域を指す名称であり、デバイスメモリと呼ばれてもよい。デバイス値とは、入力機器からの入力状態、出力機器への出力状態およびユーザプログラム上で設定される内部リレー(補助リレー)、タイマー、カウンタ、データメモリ等の状態を示す情報である。デバイス値の型にはビット型とワード型がある。ビットデバイスは1ビットのデバイス値を記憶する。ワードデバイスは1ワードのデバイス値を記憶する。
拡張ユニット4は、PLC1の機能を拡張するために用意されている。各拡張ユニット4には、その拡張ユニット4の機能に対応するフィールドデバイス(被制御装置)10が接続され、これにより、各フィールドデバイス10が拡張ユニット4を介して基本ユニット3に接続される。フィールドデバイス10は、センサやカメラなどの入力機器であってもよいし、アクチュエータなどの出力機器であってもよい。また、一つの拡張ユニット4に対して複数のフィールドデバイスが接続されてもよい。
PC2はプログラム作成支援装置と呼ばれてもよい。PC2は、たとえば、携帯可能なノートタイプやタブレットタイプのパーソナルコンピュータであって、表示部7および操作部8を備えている。PLC1を制御するためのユーザプログラムの一例であるラダープログラムは、PC2を用いて作成される。その作成されたラダープログラムは、PC2内でニモニックコードに変換される。PC2は、USB(Universal Serial Bus)などの通信ケーブル9を介してPLC1の基本ユニット3に接続され、ニモニックコードに変換されたラダープログラムを基本ユニット3に送る。基本ユニット3はラダープログラムをマシンコードに変換し、基本ユニット3に備えられたメモリ内に記憶する。なお、ここではニモニックコードが基本ユニット3に送信されているが、本発明はこれに限られない。たとえば、PC2は、ニモニックコードを中間コードに変換し、中間コードを基本ユニット3に送信してもよい。
なお、図1は示していないが、PC2の操作部8には、PC2に接続されたマウスなどのポインティングデバイスが含まれていてもよい。また、PC2は、USB以外の他の通信ケーブル9を介して、PLC1の基本ユニット3に対して着脱可能に接続されるような構成であってもよい。また、通信ケーブル9を介さず、PLC1の基本ユニット3に対して無線によって接続されるような構成であってもよい。
<ラダープログラム>
図2は、ラダープログラムの作成時にPC2の表示部7に表示されるラダー図Ldの一例を示す図である。PC2はマトリックス状に配置された複数のセルを表示部7に表示する。各セルには仮想デバイスのシンボルが配置される。シンボルは入力リレーや出力リレーなどを示している。複数のシンボルによってリレー回路が形成される。ラダー図Ldには、たとえば、10列×N行(Nは任意の自然数)のセルが配置されている。そして、各行のセル内には仮想デバイスのシンボルが適宜配置される。
図2が示すリレー回路は、入力装置からの入力信号に基づいてオン/オフされる3つの仮想デバイス(以下、「入力デバイス」と呼ぶ。)のシンボルと、出力装置の動作を制御するためにオン/オフされる仮想デバイス(以下、「出力デバイス」と呼ぶ。)のシンボルと、が適宜結合されることにより構成されている。
各入力デバイスのシンボルの上方に表示されている文字(「R0001」、「R0002」および「R0003」)は、その入力デバイスのデバイス名(アドレス名)を表している。各入力デバイスのシンボルの下方に表示されている文字(「フラグ1」、「フラグ2」および「フラグ3」)は、その入力デバイスに対応付けられたデバイスコメントを表している。出力デバイスのシンボルの上方に表示されている文字(「原点復帰」)は、その出力デバイスの機能を表す文字列からなるラベルである。
図2が示す例では、デバイス名「R0001」および「R0002」にそれぞれ対応する2つの入力デバイスのシンボルが直列的に結合されることにより、AND回路が構成されている。また、これらの2つの入力デバイスのシンボルからなるAND回路に対して、デバイス名「R0003」に対応する入力デバイスのシンボルが並列的に結合されることにより、OR回路が構成されている。すなわち、このリレー回路では、一行目の2つのシンボルに対応する入力デバイスがいずれもオンした場合、または、二行目のシンボルに対応する入力デバイスがオンした場合にのみ、一行目のシンボルに対応する出力デバイスがオンになる。
<プログラム作成支援装置>
図3は、PC2の電気的構成について説明するためのブロック図である。図3が示すように、PC2は、CPU21、表示部7、操作部8、記憶装置22および通信部23を備えている。表示部7、操作部8、記憶装置22および通信部23は、それぞれCPU21に対して電気的に接続されている。記憶装置22はRAMやROMを含み、さらに着脱可能なメモリカードを含んでもよい。CPUは中央演算処理装置の略称である。ROMはリードオンリーメモリの略称である。RAMはランダムアクセスメモリの略称である。
ユーザは、記憶装置22に記憶されているコンピュータプログラム(編集ソフトウエア)をCPU21に実行させて、操作部8を通じてプロジェクトデータを編集する。プロジェクトデータは、一つ以上のユーザープログラム(例:ラダープログラム)と、基本ユニット3や拡張ユニット4の構成情報などを含む。構成情報は、基本ユニット3に対する複数の拡張ユニット4の接続位置や、基本ユニット3に備えられた機能(例:通信機能や位置決め機能)を示す情報、拡張ユニット4の機能(例:撮影機能)などを示す情報である。ここで、プロジェクトデータの編集には、プロジェクトデータの作成および変更が含まれる。編集ソフトウエアを用いて作成されたプロジェクトデータは、記憶装置22に記憶される。また、ユーザは、必要に応じて記憶装置22に記憶されているプロジェクトデータを読み出し、そのプロジェクトデータを、編集ソフトウエアを用いて変更することができる。通信部23は、通信ケーブル9を介してPC2を基本ユニット3に通信可能に接続するためのものである。CPU21は通信部23を介してプロジェクトデータを基本ユニット3に転送する。
<PLC>
図4はPLC1の電気的構成について説明するためのブロック図である。図4が示すように、基本ユニット3は、CPU31、表示部5、操作部6、記憶装置32および通信部33を備えている。表示部5、操作部6、記憶装置32、および通信部33は、それぞれCPU31に電気的に接続されている。記憶装置32は、RAMやROM、メモリカードなどを含んでもよい。記憶装置32はデバイス部34やプロジェクト記憶部35、着脱可能なメモリカード36などの複数の記憶領域を有している。デバイス部34はビットデバイスやワードデバイスなどを有し、各デバイスはデバイス値を記憶する。プロジェクト記憶部35は、PC2から入力されたプロジェクトデータを記憶する。記憶装置32は基本ユニット3用の制御プログラムも記憶する。図4が示すように基本ユニット3と拡張ユニット4とは拡張バスの一種であるユニット内部バス90を介して接続されている。なお、ユニット内部バス90に関する通信機能は通信部33の一部として実装されてもよい。通信部33は、ネットワーク通信回路を有してもよい。CPU31は、通信部33を介してログデータなどをPC2やクラウドなどに送信してもよい。
ここで、ユニット内部バス90について、補足説明する。このユニット内部バス90は、次に説明する入出力リフレッシュ等が行われるバスであって、ユニット内部バス90における通信制御は、いわゆるバスマスタ38によって実現される(なお、通信部33の一部としてバスマスタを設けてもよいし、CPU31の一部としてバスマスタ38を設けてもよい)。バスマスタ38は、ユニット内部バス90での通信を制御するための制御回路であって、CPU31からの通信要求を受けて、拡張ユニット4との間で、後述する入出力リフレッシュ等の通信を行う。
拡張ユニット4はCPU41とメモリ42を備えている。CPU41は、デバイスに格納された基本ユニット3からの指示(デバイス値)にしたがってフィールドデバイス10を制御する。また、CPU41は、フィールドデバイス10の制御結果をバッファメモリとよばれるデバイスに格納する。デバイスに格納された制御結果は入出力リフレッシュによって基本ユニット3に転送される。また、デバイスに格納されている制御結果は、基本ユニット3からの読み出し命令にしたがって、入出力リフレッシュとは異なるタイミングであっても、基本ユニット3に転送される。メモリ42はRAMやROMなどを含む。とりわけ、RAMにはバッファメモリとして使用される記憶領域が確保されている。メモリ42は、フィールドデバイス10によって取得されたデータ(例:静止画データや動画データ)を一時的に保持するバッファを有してもよい。
図5は基本ユニット3のスキャンタイムを示す模式図である。図5が示すように1つのスキャンタイムTは、入出力のリフレッシュを行うためのユニット間通信201、プログラム実行202、END処理204により構成されている。ユニット間通信201で、基本ユニット3は、ラダープログラムを実行して得られた出力データを基本ユニット3内の記憶装置32から拡張ユニット4などの外部機器に送信する。さらに、基本ユニット3は、拡張ユニット4などの外部機器から受信した入力データを基本ユニット3内の記憶装置32に取り込む。つまり、基本ユニット3のデバイスに記憶されているデバイス値は出力リフレッシュによって拡張ユニット4のデバイスに反映される。同様に、拡張ユニット4のデバイスに記憶されているデバイス値は入力リフレッシュによって基本ユニット3のデバイスに反映される。このように入出力リフレッシュによって基本ユニット3のデバイスと拡張ユニット4のデバイスが同期する。なお、リフレッシュ以外のタイミングでデバイス値をユニット間で更新する仕組み(ユニット間同期)が採用されてもよい。ただし、基本ユニット3のデバイスは基本ユニット3が随時書き換えており、同様に、拡張ユニット4のデバイスは拡張ユニット4が随時書き換えている。つまり、基本ユニット3のデバイスは基本ユニット3の内部の装置によって随時アクセス可能である。同様に、拡張ユニット4のデバイスは拡張ユニット4の内部の装置によって随時アクセス可能になっている。基本ユニット3と拡張ユニット4との間では基本的にリフレッシュのタイミングにおいて相互にデバイス値を更新して同期する。プログラム実行202で、基本ユニット3は、更新された入力データを用いてプログラムを実行(演算)する。図5が示すようにプログラム実行202においては複数のプログラムモジュールまたはラダープログラムがプロジェクトデータにしたがって順番に実行されてもよい。基本ユニット3はプログラムの実行によりデータを演算処理する。なお、END処理とは、PC2や基本ユニット3に接続された表示器(図示せず)等の外部機器とのデータ通信、システムのエラーチェック等の周辺サービスに関する処理全般を意味する。
このように、PC2はユーザの操作に応じたラダープログラムを作成し、作成したラダープログラムをPLC1に転送する。PLC1は、入出力リフレッシュ、ラダープログラムの実行およびEND処理を1サイクル(1スキャン)として、このサイクルを周期的、すなわちサイクリックに繰り返し実行する。これにより、各種の入力機器(センサ等)からのタイミング信号に基づいて、各種の出力機器(モータ等)を制御する。なお、スキャン周期とは別に、基本ユニット3や拡張ユニット4はそれぞれ内部制御周期を有している。基本ユニット3や拡張ユニット4は内部制御周期を基準としてフィールドデバイス10などの機能を制御する。
<ロギング>
ユーザがユーザプログラムを改良したり、修正したりする際に、PLC1がユーザプログラムを実行している際に取得されたデバイス値が役に立つことがある。そこで、PLC1は予め指定されたデバイス値を取得し、ログデータを作成する。ここで、PLC1が管理するデバイスには、ユーザプログラムによって利用されるものだけでなく、ユーザプログラムによって利用されないものも存在する。また、ユーザプログラムを改良したり、修正したりする際に役立つデバイスもあれば、役に立たないデバイスもある。一般にデバイスの数は数千個に及ぶため、ユーザが必要なデバイスを指定することは大きな負担となっていた。そこで、PC2は、ユーザプログラムを解析し、ユーザプログラムに使用または記述されているデバイスをロギング対象として抽出する。これにより、ユーザの負担が軽減される。
PLC1が管理するすべてのデバイスをロギングの対象とすると、スキャンタイムが長くなってしまう。なぜなら、ロギングは、ユーザプログラムの一つとして実行されたり、入出力リフレッシュの際に実行されたりするからである。時には、ロギングのもたらす遅延によって、ユーザプログラムがユーザの希望通りに動作しないこともありうる。したがって、ロギング対象のデバイスの数は適切に維持されるべきであろう。
ユーザプログラムは、複数のプログラム部品(例:プログラムモジュール(メインのラダープログラムとサブのラダープログラム)、ファンクションブロック)から構成されることがある。このうち、ユーザが修正を希望するプログラム部品に関連したデバイスがロギングされれば、ユーザにとって十分な場合がある。また、複数のプログラム部品のうちで、ユーザは特定のプログラム部品を抽出対象から除外したり、特定のプログラム部品を抽出対象に追加したりすることを希望することもあろう。よって、プログラム部品を単位として、ロギング対象からデバイスを追加または削除できればユーザにとって便利であろう。
上述したように基本ユニット3や拡張ユニット4は一つ以上の機能を有している。各機能には様々なデバイスが割り付けられている。よって、これらの機能を単位として、ロギング対象からデバイスを追加または削除できればユーザにとって便利であろう。たとえば、基本ユニット3の通信機能に関する望ましくないイベントが発生した場合、ユーザは、基本ユニット3の通信機能に関するデバイスのデバイス値を参照することで、このイベントを解消することが容易になろう。
●ロギングの設定(自動抽出と加除)
図6はPC2のCPU21が記憶装置22に記憶されている編集ソフトウエアを実行することで実現される機能を示している。これらの機能の一部またはすべてはASICやFPGAなどのハードウエア回路により実現されてもよい。ASICは特定用途集積回路の略称である。FPGAはフィールドプログラマブルゲートアレイの略称である。
なお、本実施形態では、図6に示す機能をPC2上で実現することとしたが、本発明はこれに限られず、PLC1上で実現しても構わない。
プロジェクト作成部50は、表示部7にプロジェクトデータ71を作成するためのUIを表示し、操作部8から入力されたユーザ指示にしたがってプロジェクトデータ71を作成し、記憶装置22に記憶する。UIはユーザーインターフェースの略称である。プロジェクトデータ71には、ユーザプログラムと、PLC1の構成情報などが含まれている。プログラム作成部63は、UIを介したユーザ操作に基づいて、ユーザプログラムを構成する複数のプログラム部品(各モジュール)を作成する。機能設定部62は、基本ユニット3の機能や拡張ユニット4の機能に関する設定を実行する。たとえば、機能設定部62は、基本ユニット3に設けられた機能に対していずれかのデバイスを割り付けたり、拡張ユニット4に設けられた機能に対していずれかのデバイスを割り付けたりし、機能とデバイスとの関係を示す割付情報を構成情報に書き込む。なお、プロジェクト作成部50は、ユーザプログラムがどのようなプログラム部品から構成されているかを示すプログラム構成情報も、プロジェクトデータ71として記憶させる。PLC1全体がどのようなユニットから構成されるかを示すユニット構成情報も、プロジェクトデータ71として記憶させる。
ログ設定部51は、プロジェクトデータ71を解析することでプロジェクトデータ71に記述されているデバイスを抽出し、抽出されたデバイスをロギング対象として設定するためのログ設定データ72を作成する。ログ設定部51は各種の機能を有している。部品指定部52は、操作部8から入力されるユーザ指示にしたがって、デバイスの抽出対象となるプログラム部品を指定する。また、部品指定部52は、操作部8から入力されるユーザ指示にしたがって、デバイスの抽出対象から除外されるプログラム部品を指定する。
デバイス抽出部53は、プロジェクトデータ71を解析することでプロジェクトデータ71に記述されているデバイスを抽出し、ログ設定データ72を作成する。追加部54は、部品指定部52により抽出対象として指定されたプログラム部品を解析し、プログラム部品に記述されているデバイスを抽出し、抽出リストに追加する。 削除部55は、部品指定部52により除外対象として指定されたプログラム部品を解析し、プログラム部品に記述されているデバイスを抽出し、抽出されたデバイスを抽出リストから削除する。あるいは、削除部55は、抽出されたデバイスを除外リストに追加する。マージ部56は、複数のプログラム部品からそれぞれ抽出されたデバイスのうち、重複して抽出されたデバイスを抽出リストから削除する。特定部57は、プロジェクトデータ71においてメモリカードに対する命令語を検知し、当該命令語の対象となっているデバイスを特定し、特定されたデバイスを抽出リストに追加する。
本実施形態では、部品指定部52がプログラム部品を指定した後、追加部54が、その指定されたプログラム部品を解析することにより、ロギング対象となるデバイスを抽出・追加することとしたが、本発明はこれに限られない。例えば、追加部54は、プロジェクトデータ71に含まれる一又は複数のプログラム部品を先に解析することでデバイスを抽出し、抽出されたデバイスを抽出リストに追加した後で、部品指定部52によって指定されたプログラム部品に記述されたデバイスを抽出し、これを抽出リストへ追加するようにしてもよい。
同様にして、削除部55は、プロジェクトデータ71に含まれる一又は複数のプログラム部品を先に解析することで抽出リストを作成した後で、部品指定部52によって指定されたプログラム部品に記述されたデバイスを抽出し、これを抽出リストから削除するようにしてもよい。
なお、本実施形態では、説明の便宜上、追加部54と削除部55を分けているが、一つの機能ブロックであってもよいことは言うまでもない。
手動設定部58は、操作部8を通じて入力されるユーザ指示に従って一つのデバイスや、関連した一連のデバイスを抽出リストに追加する。推定部59は、デバイス抽出部53により記録対象として抽出されたデバイスの数に基づきPLC1によるデバイス値の記録がユーザプログラムの実行に与える影響を推定する。ロギングによってデバイス値の数に相関した遅延時間がスキャンタイムに加算される。よって、推定部59は、デバイス値の数に所定係数を乗算することで遅延時間を求め、遅延時間を推定結果として表示部7に表示してもよい。この遅延時間はスキャンタイムの伸びと呼ばれてもよい。
機能指定部60は、操作部8から入力されるユーザ指示にしたがって、デバイスの抽出対象となる基本ユニット3の機能や拡張ユニット4の機能を指定する。また、機能指定部60は、操作部8から入力されるユーザ指示にしたがって、デバイスの抽出対象から除外される基本ユニット3の機能や拡張ユニット4の機能を指定する。追加部54は、機能指定部60により抽出対象として指定された機能の構成情報を解析し、構成情報により当該機能に割り付けられたデバイスを抽出し、抽出リストに追加する。 削除部55は、機能指定部60により除外対象として指定された機能の構成情報を解析し、構成情報により当該機能に割り付けられているデバイスを抽出し、抽出されたデバイスを抽出リストから削除する。マージ部56は、複数の機能のそれぞれについて抽出されたデバイスのうち、重複して抽出されたデバイスを抽出リストから削除する。特定部57は、プロジェクトデータ71においてメモリカードに対する命令語を検知し、当該命令語の対象となっているデバイスを特定し、特定されたデバイスを抽出リストに追加する。
ログ表示部61は、PLC1において生成されたログデータ73を、メモリカード36を介して読み出し、表示部7にログデータ73を表示する。たとえば、ログ表示部61は、ログデータ73に記録されているデバイス値と、プロジェクトデータ71のプログラム部品とを関連付けて表示部7に表示してもよい。ログ表示部61は、プログラマブルロジックコントローラ用のエンジニアリングツールの中核をなす。
図7はロギングの設定方法を示すフローチャートである。ここでは、すでにユーザプログラムを含むプロジェクトデータ71は完成しているものとする。
S1でCPU21(部品指定部52)はデバイスの抽出対象となるプログラム部品の指定を受け付ける。
図8はデバイスを抽出されるプログラム部品の選択を受け付けるためのUI100を示している。ログ設定部51は、ロギングの設定プログラムが起動されると、表示部7にUI100を表示する。UI100において、複数のプログラム部品はそれぞれの分類(モジュール/ファンクションブロック/マクロ)に基づいてツリー状に示されている。また、各プログラム部品にはチェックボックス102が関連付けて表示されている。操作部8の操作に応じてポインタ101がチェックボックス102にチェックを付与すると、追加部54は、チェックを付与されたチェックボックス102に対応するプログラム部品を抽出リストに追加する。一方、操作部8の操作に応じてポインタ101がチェックボックス102のチェックを外すと、削除部55は、チェックを外れたチェックボックス102に対応するプログラム部品を抽出リストから削除(除外)する。
なお、図8において毎スキャンモジュールとは、ユーザプログラムが一スキャンされるたびに一回実行されるプログラム部品である。この例では、毎スキャンモジュールは、メインプログラムとサブモジュールとを有している。定周期モジュールは、一定の周期ごとに実行されるプログラム部品である。ユニット間同期モジュールは、ユニット間同期が実行されるたびに実行されるプログラム部品である。初期化モジュールは図示されていないが、初期化モジュールはユーザプログラムを起動すると最初に実行されるモジュールである。そのため、初期化モジュールはトラブルの原因となりにくいため、デバイスの抽出対象から除外されてもよい。
ファンクションブロック(FB)は、ユーザプログラムにより呼び出されて使用される。ファンクションブロックは複数のモジュールから呼び出されるため、それぞれ個別のインスタンスを生成する。この場合、複数のインスタンスがそれぞれデバイスの抽出対象として選択されてもよいし、元のファンクションブロックを選択することでそのファンクションブロックに関連して生成されるすべてインスタンスがデバイスの抽出対象として選択されてもよい。
マクロは、プログラムの一種であり、データ整形のためのマクロなどがある。
S2でCPU21(機能指定部60)はデバイスの抽出対象となる機能の指定を受け付ける。
図9はデバイスを抽出される機能の選択を受け付けるためのUI110を示している。ログ設定部51は、ロギングの設定プログラムが起動されると、表示部7にUI110を表示する。なお、UI100とUI110は同時に表示されてもよいし、ユーザ操作にしたがって選択的に表示されてもよい。UI110において、複数の機能はそれぞれが属するユニットに基づいてツリー状に示されている。また、各機能にはチェックボックス102が関連付けて表示されている。操作部8の操作に応じてポインタ101がチェックボックス102にチェックを付与すると、追加部54は、チェックを付与されたチェックボックス102に対応する機能を抽出リストに追加する。一方、操作部8の操作に応じてポインタ101がチェックボックス102のチェックを外すと、削除部55は、チェックを外れたチェックボックス102に対応する機能を抽出リストから削除(除外)する。
図9において基本ユニット3の機能である通信エラーモニタは通信部33の通信エラーを監視する機能である。センサI/Oモニタはセンサの入出力を監視する機能である。モーションユニットは位置決めユニットとも呼ばれ、軸とよばれる制御対象の位置を制御する。一般に軸ごとにモータなどの駆動源が存在する。アナログ入力ユニットは、入力されるアナログ信号をサンプリングしてデジタル信号に変換するユニットである。ユニットモニタはモーションユニットやアナログ入力ユニットなどの拡張ユニット4の動作を監視する機能である。
ここで、ユニットモニタの一例として、モーションユニットのユニットモニタについて、更に詳述する。図10Aは、モーションユニットの軸1についてのユニットモニタ440の画面の模式図である。図10Bは、ユニットモニタ440による監視の対象を変更するための設定画面441の模式図である。
図10Aに示すように、ユニットモニタ440による監視対象として、現在座標、指令座標、現在速度、指令速度、帰還トルク、負荷率、ピーク電流といった各項目が設定されている。各項目には、バッファメモリ(UG)が割り当てられている。例えば、現在座標には、UG4とUG5が割り当てられている。本実施形態では、1個のUGに16ビットを確保しており、現在座標を32ビット表現するために、2個のUGを確保している。UGのデバイス値としては、例えば、0PLS(パルス)のような数値となる。また、指令座標には、UG8とUG9が割り当てられている。2個のUGを確保しているのは、上述と同様の理由である(32ビット表現の確保のため)。UGの割り当ては、ユニット設計者が自由に行うことができるので、未使用のUG(UG6やUG7)も幾つか存在している。同様にして、現在速度にはUG10,UG11が、指令速度にはUG12,UG13が、それぞれ割り当てられている。その他、図10Aでは、帰還トルク、負荷率、ピーク電流などの各項目に対してUGが割り当てられている。
図10Bに示すように、どの項目をユニットモニタ440による監視対象とするかは、ユーザが自由に選択(設定)できる。例えば、図10Bに示す「非表示」の欄442から1項目を選択し、右矢印ボタン443をクリックすることで、その1項目が「表示」の欄444へ移動し、ユニットモニタ440による監視対象となる。OKボタン445をクリックすることで、「表示」の欄444に列挙された項目が監視対象として確定する。なお、図10A及び図10Bでは、モーションユニットの軸1についてのみ説明したが、軸2,軸3と複数ある場合にも、同様である。各軸について、ユーザにより選択された項目が監視対象となる。
一般に、モーションユニット(拡張ユニット4a)を使って、モータ(フィールドデバイス10a)を駆動してワークの位置決めを行う場合、基本ユニット3は、モータの位置決め開始トリガーを示すリレーデバイスをONすることにより、拡張ユニット4aに対して動作開始指令を送る。そして、動作開始指令を送った後は、拡張ユニット4aにおける具体的な処理動作(ワークの位置決め)に関与しない。言い換えると、基本ユニット3は、モータの現在位置や現在速度をリアルタイムに逐一認識しておらず、逐一認識する必要もない。その後、拡張ユニット4aにおける処理動作が完了した場合、基本ユニット3は、モータの位置決め完了トリガーを示すリレーデバイスがONされたことを通じて、モータの位置決め完了を認識する。このようなことから、モータの現在座標や現在速度に対応するデバイス(UG)は、基本的に、ラダープログラムには記述されない(但し、ユーザは、ごく一部のUGを読み出すための特別な命令語をラダープログラムに記述することは可能である)。
しかし、PLCの運用時にトラブルが生じた場合に、その原因究明の為、トラブルが生じた時点でのモータの現在座標や現在速度を把握したいことがある。このようなときに、上述したようにモータの現在座標や現在速度は、基本的にはラダープログラムに記述されるものではないため、ロギング対象としての抽出リストに挙がっていないことが多く、その原因究明が容易でなかった。
そこで、本実施形態では、ユーザは、図9に示すUI110を通じて、モーションユニットのユニットモニタを選択できるようにしている。これにより、追加部54は、図10Bを用いて説明したように、モーションユニットのユニットモニタ440による監視の対象となっているUGを抽出リストに自動追加することができる。なお、基本ユニット3の通信エラーモニタ・センサI/Oモニタ、アナログ入力ユニットのユニットモニタについても、同様である。各モニタによる監視の対象となっているデバイス又はパラメータを抽出リストに自動追加することができる。
なお、その他のモニタについて図示は省略するが、簡単に説明する。基本ユニット3の機能である通信エラーモニタは、例えば、サイクリック通信の開設タイムアウトエラーに割り付けられたデバイスを監視する。センサの入出力を監視するセンサI/Oモニタは、例えば、一又は複数のセンサの出力やエラー有無に割り付けられたデバイスを監視する。アナログ入力ユニットのユニットモニタは、例えば、AD変換データ、特殊データ、オフセット値、ゼロシフト、ピーク値、ボトム値などの各種パラメータに割り付けられたデバイス(DM又はR)を監視する。これらのデバイスは、ユニット設計者によって、予めデフォルト(初期設定)として割り付けられたものであるが、上述したモーションユニットのユニットモニタのように、ユーザによって監視対象が変更されてもよい。要するに、図9に示すUI110は、ユーザから機能の選択入力を受け付け可能な設定画面となっている。そして、選択入力される機能ごとに、表示部(モニタ)に表示させる監視項目を定めたテンプレート(設定情報)が対応付けられている(テンプレートはメモリに保存されている)。そのテンプレートによって特定されるデバイスは、上述したように予めデフォルトで割り付けられたものであってもよいし、ユーザが設定画面を介して加除(編集)した後のものであってもよい。機能指定部60は、ユーザ操作に基づいて一又は複数の機能を選択すると、その機能に対応付けられたテンプレートに従って、監視対象となるデバイスを抽出リストに追加する。
S3でデバイス抽出部53は部品指定部52により指定されたプログラム部品を解析し、指定されたプログラム部品において記述されているデバイスを抽出する。
図10Cはプロジェクトデータ71に含まれる複数のプログラム部品のうち指定されたプログラム部品から抽出されたデバイスの一例を示している。図10Cによれば、デバイスを抽出されたプログラム部品の名称と、先頭デバイスの名称(デバイス番号)と、先頭デバイスを基準として抽出されるデバイスの個数と、実際にロギング対象として抽出されたデバイス名とが示されている。一般に、先頭デバイスを基準として指定個数に相当する数のデバイスが抽出される。しかし、指定個数を超えた数のデバイスが抽出されることもある。R34000はリレーデバイスであり、1ビットの情報を保持するデバイスであるが、R34000からR34015までの一連の16個のデバイスが抽出されている。これは、16ビット分のデバイスをまとめてロギングしたほうが、データ処理速度の観点で有利だからである。なお、図10Cにおいて、R34000の個数は「1」となっているが、これは1ワード(16ビット)を示している。また、CR4001の個数も「1」となっているが、これも1ワード(CR4001,CR4002,・・・,CR4015,CR4100の16ビット)を示している。グローバルとは、複数のプログラム部品から共通に使用されるデバイスである。Mainはメインプログラムを示している。first_operationはファンクションブロックの名称である。Subはサブプログラム(サブモジュール)を示している。
S4でデバイス抽出部53は機能指定部60により指定された機能の構成情報を解析し、構成情報において機能と関連付けられているデバイスを抽出する。
図11はPLC1に備えられた複数の機能(基本ユニット3および拡張ユニット4)のうち指定された機能(ユニット)から抽出されたデバイスの一例を示している。この例では、機能指定部60により指定されたモーションユニットからいくつかのバッファメモリ(UG)が抽出されている。図11によれば、デバイスを抽出された機能の名称と、先頭デバイスの名称(デバイス番号)と、先頭デバイスを基準として抽出されるデバイスの個数と、実際にロギング対象として抽出されたデバイス名とが示されている。ここでは、モーションユニットのユニットモニタにより監視可能なデバイスが抽出されている。すなわち、図10Aを用いて上述したように、UG4−UG5はモータの現在座標を示しており、UG8−UG9はモータの指令座標を示しており、UG10−UG11はモータの現在速度を示しており、UG12−UG13はモータの指令速度を示している。その他のUGについては、説明を省略する。
S5で手動設定部58は操作部8を通じてユーザにより手動で指定されたデバイスを抽出リストに追加する。たとえば、手動設定部58は、デバイス番号などを直接入力可能なUIを表示部7に表示し、ユーザによるデバイスの指定を補助してもよい。
S6でマージ部56は、プログラム部品から抽出されたデバイス、機能から抽出されたデバイスおよび手動で追加されたデバイスをマージしてロギング対象リストを作成する。ロギング対象リストはデバイスリストと呼ばれてもよい。
図12はマージ処理の概念を説明する図である。デバイス抽出部53はプログラム部品から抽出されたデバイスを記述した抽出リストL1を作成する。デバイス抽出部53は機能から抽出されたデバイスを記述した抽出リストL2を作成する。デバイス抽出部53はユーザにより手動で追加されたデバイスを記述した抽出リストL3を作成する。マージ部56は、抽出リストL1〜L3をマージしてロギング対象リストL0を作成する。抽出リストL1〜L3は、重複して抽出されたデバイスが存在する可能性がある。同一のデバイスが複数回にわたりロギングされると、ログデータが肥大化する。よって、同一のデバイスの重複したロギングを回避するために、マージ処理が実行される。たとえば、抽出リストL1ではデバイスの一種であるデータメモリDM0−DM100が登録されている。また、抽出リストL3ではデータメモリDM50−DM200が登録されている。つまり、DM50−DM100は重複している。マージ部56は、DM0−DM100とDM50−DM200をマージしてDM0−DM200をロギング対象リストL0に記述する。
S7で推定部59はロギング対象リストL0を解析し、スキャンタイムへの影響を推定し、推定結果を表示部7に表示する。
図13は推定結果を表示するためのUI140を示している。UI140はデバイスサイズとスキャンタイムの伸びとを表示する。デバイスサイズとは、ロギング対象リストL0に記述されているデバイスのトータルサイズを示している。スキャンタイムの伸びとは、ロギングによって発生する遅延時間である。推定部59はロギング対象リストL0を解析し、デバイスサイズとスキャンタイムの伸びとを演算する。操作部8を通じてリストボタン141が操作されると、推定部59はロギング対象リストL0を表示部7に表示してもよい。ユーザは、推定結果を考慮し、ロギング対象リストL0を確定するか、調整するかを判断する。ロギング対象リストL0を確定する場合、ユーザは、確定の意思を示すボタンをポインタ101により操作してもよい。
S8でログ設定部51はロギング対象を確定するかどうかを判定する。たとえば、ロギング対象リストL0を確定するためのボタンが操作されると、ログ設定部51はロギング対象を確定すると判定する。一方で、ロギング対象リストL0を修正するためのボタンが操作されると、ログ設定部51はロギング対象を修正すると判定する。ロギング対象を修正する場合、ログ設定部51はS3ないしS8を繰り返すことで、デバイスの抽出対象となるプログラム部品および機能の追加や削除を受け付け、ロギング対象リストL0を修正する。たとえば、スキャンタイムの伸びが許容閾値を超えると、いくつかのデバイスが削除される。スキャンタイムの伸びが許容閾値未満であれば、いくつかのデバイスが追加されてもよい。ロギング対象が確定すると、CPU21はS9に進む。
S9でログ設定部51はロギング対象リストL0を含むログ設定データ72を作成し、記憶装置22に格納する。なお、CPU21は、プロジェクトデータ71とともにログ設定データ72を基本ユニット3に送信するよう通信部23を制御する。
ここでは、主にデータメモリやバッファメモリなどのデバイスがロギング対象とされているが、各機能の動作状態や機能設定状態(例:IPアドレスなど)もロギング対象として追加されてもよい。
図14はデバイスの抽出処理で使用されるフィルタの設定UI120を示している。PLC1に関連したデバイスとしては複数の種別のデバイスが存在する。ユーザは特定の種別のデバイスに着目し、他の種別のデバイスについては無視したいと考えることもある。そこで、ログ設定部51は、フィルタの設定UI120を表示部7に表示し、抽出対象とするデバイス種別と、除外対象とするデバイス種別とをチェックボックス102を通じて受け付けてもよい。たとえば、デバイス抽出部53は、チェックボックス102にチェックを付与されたデバイス種別をプログラム部品や機能から抽出する。デバイス抽出部53は、チェックボックス102からチェックを外されたデバイス種別をプログラム部品や機能から抽出しない。これにより、ユーザの意図に沿って用意にロギング対象となるデバイスを取捨選択することが可能となる。
ところで、CPU21は、プロジェクト作成部50によってプロジェクトデータ71が変更されると、デバイスの抽出処理を再度実行してもよい。これは、ユーザプログラムにおけるデバイスの記述が変更されている可能性があるからである。CPU21は、プロジェクト作成部50がプロジェクトデータ71の転送を実行する際に、デバイスの抽出処理を実行してもよい。プロジェクトデータ71は最終的にPLC1に書き込まれるため、この書き込みをトリガーとしてデバイスの抽出処理を実行することで、デバイスの抽出処理の実行回数が削減されよう。
デバイス抽出部53はPC2に実装されているが、基本ユニット3に実装されてもよい。CPU31は、プロジェクトデータ71のうちPC2により指定されたプログラム部品や機能からデバイスを抽出し、ログ設定データ72を作成する。この場合、推定部59も基本ユニット3に実装されることになろう
●デバイスの抽出処理
図15はデバイス抽出部53が実行するプログラム部品からのデバイスの抽出処理を示すフローチャートである。図16はラダープログラムの一例を示している。このラダープログラムは拡張ユニット4として4軸を駆動するモーションユニットを制御するためのものである。
S11でデバイス抽出部53は、抽出対象として指定されたプログラム部品のi番目のステップの記述からデバイス番号を取得する。iの初期値は001である。図16が示すように、ラダープログラムの左端にはステップ番号が付与されている。001番のステップには、MR000というリレーデバイスがオンになると、モーションユニットに動作許可を与えるR34000というリレーデバイスがオンにし、かつ、モーションユニットの1番目の軸のサーボを稼動させるためのR34305というリレーデバイスをオンにすることが記述されている。よって、デバイス抽出部53は、デバイス番号としてMR000、R34000およびR34305を抽出する。なお、デバイス番号が間接参照やインデックス参照により記述されていることもある。この場合、デバイス抽出部53は、間接参照先やインデックス値を代入しているプログラムを検索し、実際のデバイス番号を特定する。なお、デバイス抽出部53は、実際のデバイス番号の抽出に失敗すると、抽出失敗を示すメッセージを表示部7に表示してもよい。さらに、デバイス抽出部53は、実際のデバイス番号をユーザに入力させるためのUIを表示部7に表示し、ユーザ入力を受け付けてもよい。さらにまた、上述した間接参照やインデックス参照を考慮すれば、デバイス抽出部53は、プログラムに直接記述されている特定のデバイスを抽出するだけでなく、プログラムに使用される特定のデバイス(間接参照やインデックス参照により特定されるデバイス等)をも抽出する。
S12でデバイス抽出部53は、命令語のアクセス範囲からデバイス範囲を取得する。命令語によっては、先頭デバイスのデバイス番号と、先頭デバイスを基準としたデバイスの個数とを引数とするものがある。たとえば、003番のステップにはリレーデバイスMR000がオンになると、FMOVという命令語を実行することが記述されている。この例では、FMOVは、指定された値(0)を、先頭デバイス(@EM0)を基準とした指定個数(10個)のデバイスに代入するための命令語(関連デバイスの初期化をするための命令語)である。つまり、アクセス範囲は、先頭アドレスと指定個数とによって定義されている。デバイス抽出部53は、@EM0から@EM9までの範囲をデバイス範囲に決定する。なお、アクセス範囲が間接参照やインデックス参照により記述されていることもある。この場合、デバイス抽出部53は、間接参照先やインデックス値を代入しているプログラムを検索し、実際のアクセス範囲を特定する。なお、デバイス抽出部53は、実際のアクセス範囲の抽出に失敗すると、抽出失敗を示すメッセージを表示部7に表示してもよい。さらに、デバイス抽出部53は、実際のアクセス範囲をユーザに入力させるためのUIを表示部7に表示し、ユーザ入力を受け付けてもよい。
S13でデバイス抽出部53は、先頭デバイス番号とデバイス範囲に基づきデバイスを抽出し、抽出したデバイスを抽出リストに追加する。たとえば、001番のステップからはMR000、R34000およびR34005が抽出され、抽出リストに追加される。003番のステップからは@EM0から@EM9が抽出され、抽出リストに追加される。
S14でデバイス抽出部53は、指定されたプログラム部品についてプログラム終端までデバイスの解析を終了したかどうかを判定する。プログラム終端までデバイスの解析を終了していなければ、デバイス抽出部53はS15に進む。S15でデバイス抽出部53は変数iに1を加算して、S11に戻る。プログラム終端までデバイスの解析を終了したのであれば、デバイス抽出部53はデバイスの抽出処理を終了する。
なお、図16に示すラダープログラムにおいて、004番のステップ以降から抽出されるデバイスについて、以下、簡単に説明する。
004,005番のステップは、モータの原点復帰(動作)要求であり、R34310は、モータの原点復帰開始トリガーを示すリレーデバイスである。本ステップからは、MR001、R34310、R40905,R40910,R34310の各デバイスが抽出される。
006〜008番のステップは、モータの原点復帰が完了した場合に、モーションユニットから原点復帰完了コードを読み出して、原点復帰が正しく完了しているか否かを判断する処理である。より具体的に説明すると、R40910は、モータの原点復帰完了トリガーを示すリレーデバイスである。基本ユニット3は、モーションユニットにおける原点復帰の具体的処理動作をリアルタイムに逐一認識しておらず、このフラグR40910がONしたか否かを監視することで、原点復帰が完了したか否かを判断する。このフラグR40910がONすると、バッファメモリをダイレクトに読み出すUREAD命令を実行する。図16に示すUREAD命令は、ユニット番号1のユニットにおける4060番のバッファメモリを読み出し、デバイス@EM0に1ワード分を代入する、という命令である。ここでは、4060番のバッファメモリには、原点復帰完了コードが格納されており、原点復帰が正常に終了した場合には0、原点復帰が異常終了した場合には0以外の数値(1や2等)が格納されるようになっている。そして、007番のステップに示すように、@EM0のデバイス値が0以外の場合には、基本ユニット3は、デバイスMR000をセットし、原点復帰が異常終了したことを認識する。一方、008番のステップに示すように、@EM0のデバイス値が0の場合には、基本ユニット3は、デバイスMR001をセットし、原点復帰が正常に終了したことを認識する。本ステップからは、R40910,@EM0,@MR000,@MR001の各デバイスが抽出される。
009番のステップは、原点復帰が正常に終了した場合に、1秒間だけ待機する処理である。デバイスT0は、設定値として10(100ms単位であるため1秒に相当)、現在のカウント値を有しており、カウント値が設定値になったらONするものである。本ステップからは、MR001,T0の各デバイスが抽出される。
最後に、010〜011番のステップは、デバイスT0がONすると、ユニット番号1のユニットに対し、ファンクションブロック「First_operation」が実行される。そして、その実行結果が@MR002に格納され、完了コードが@EM1に格納される。本ステップから、@MR002,@EM1の各デバイスが抽出される。
以上、図16を用いて詳述したように、一般的なラダープログラムでは、軸のサーボONや原点復帰要求、ファンクションブロックの起動や結果など、動作開始に応じたデバイスや、動作完了に応じたデバイスしか記述されない。しかし、トラブル発生時には、動作途中の状態(モータの現在座標や現在位置など)の情報があれば、原因究明に役立つので、上述したようにユニットモニタによる監視の対象となっているUGも、抽出リストに自動追加するようにしている。
指定されたプログラム部品のそれぞれについてこの抽出処理は実行される。
●ロギングの実行
図17は基本ユニット3のCPU31の機能を示している。これらの機能の一部またはすべてはASICやFPGAなどのハードウエア回路により実現されてもよい。ASICは特定用途集積回路の略称である。FPGAはフィールドプログラマブルゲートアレイの略称である。
CPU31は、PC2から受信したプロジェクトデータ71とログ設定データ72を記憶装置32に記憶しているものとする。実行部80は、ユーザプログラムを繰り返し実行するラダー実行エンジン80aと、このラダー実行エンジン80aを制御したり、拡張ユニット4との入出力リフレッシュを実行したりするユニット制御部80bと、を有している。実行部80のラダー実行エンジン80aは、プロジェクトデータ71に含まれるユーザプログラムを繰り返し実行し、ユーザプログラムにしたがって拡張ユニット4を制御する。なお、実行部80のラダー実行エンジン80aは、ユーザプログラムにしたがって、デバイス部34の基本ユニットデバイス部34aに保持されている出力系のデバイスにデバイス値を書き込んだり、基本ユニットデバイス部34aに保持されている入力系のデバイスからデバイス値を読み込んだりする。
一方で、実行部80のユニット制御部80bは、入出力リフレッシュにより取得した拡張ユニットに関するデバイス値を、拡張ユニットデバイス部34bに読み書きする。また、基本ユニットと拡張ユニットは、ユニット内部バスによって電気的に接続されており、ユニット制御部80bは、このユニット内部バスにおける通信制御を行う機能、いわゆるバスマスタとしての機能を有している。ユニット制御部80bがバスマスタとして機能する場合には、図6を用いて説明したユニット構成情報、すなわち、PLC1全体がどのようなユニットから構成されるかを示す情報に基づいて、各拡張ユニットとリフレッシュ通信を行う。
記録部81は、ログ設定データ72にしたがってデバイス部34(基本ユニットデバイス部34a又は拡張ユニットデバイス部34b)からデバイス値を取得したり、拡張ユニット4のバッファメモリからデバイス値を取得したりして、ログデータ73としてメモリ(例えばリングバッファ)に書き込む。上述されたように、記録部81は、END処理の際などに、ロギング処理を実行する。
END処理におけるロギング処理について、更に詳細に説明する。ログ設定データ72には、図10Cや図11を用いて説明したように、部品指定部52によって指定されたプログラム部品に記述されたデバイスや、機能指定部60によって指定された機能(例えばユニットモニタによる監視の対象)に割り付けられたデバイスが、ロギング対象として含まれている。前者のデバイスについては、END処理の際に、ログデータ73に書き込む一方で、後者のデバイスについては、END処理の際に、拡張ユニット4から対象となるデバイス(UG)のデバイス値を読み出して、ログデータ73に書き込む。
ここで、モータの現在座標や指令座標の更新周期(いわゆる制御周期)は、ラダープログラムのスキャン周期と比べて格段に短い。したがって、本実施形態では、スキャン周期と同期してUGのデバイス値を読み出すようにしているので、全ての現在座標や指令座標がログデータ73に書き込まれるわけではない。しかし、本発明はこれに限られず、例えば、拡張ユニット4のメモリに、制御周期ごとに現在座標や指令座標を格納していき、スキャン周期のタイミングで、それまで格納した複数の現在座標や指令座標等を読み出すように構成することも可能である。
また、記録部81は、時刻管理部83により保持されている時刻情報をログデータ73の各レコードに付与する。これによりログデータ73には時系列にデバイス値が並べられる。
ロギング対象となるデバイスは、基本的に、ログ設定データ72のロギング対象リストL0によって指定されるが、検知部82によって追加のデバイスが指定されてもよい。検知部82は、たとえば、デバイス部34に含まれているいずれかのデバイスに対する外部機器からのデバイス値の書き換えを検知してもよい。一般にデバイス値はユーザプログラムに従って書き換えられる場合と、外部機器によって書き換えられることがある。このような書き換えはユーザプログラムを解析するだけでは事前に把握することができない。記録部81は、検知部82によりデバイス値の書き換えが検知されたデバイスをロギング対象に追加してもよい。一般に外部機器からのデバイス値の書き換えは、ユーザにとって想定外の事象の原因となりやすい。よって、記録部81は、外部機器により書き換えられたデバイス値をロギングすることで、ユーザによるプログラムの改良に役立つであろう。
ところで、END処理において、ユーザプログラムとは無関係に発行されるUG読み出し命令が発行されることがある。UGはバッファメモリを示すデバイス種別である。検知部82は、ユーザプログラムとは無関係に発行されるUG読み出し命令を検知してもよい。記録部81は、検知部82により検知されたUG読み出し命令の対象となっているバッファメモリを特定し、特定したバッファメモリを記録対象として追加してもよい。この拡張ユニット4がモーションユニットである場合、このようなバッファメモリには、トルク値や現在座標位置などが記憶されている。
検知部82はFPGAなどにより実現されてもよい。実行部80はASICにより実現されてもよい。この場合、実行部80は記憶装置32に対してアドレス線を用いて読み出し/書き込み対象となっているデバイスのアドレスを指定する。よって、検知部82はこのアドレス線を監視することで、動的に、デバイス値を更新されたデバイスを検知してもよい。これはユーザプログラムに記述されていないデバイスを記録対象として追加する際に有用であろう。
検知部82は実行部80に設けられてもよい。この場合、実行部80は、デバイス部34の特定のデバイスに対してデバイス値を書き込むとともに、このデバイス値とデバイス名(デバイス番号)をログデータ73に書き込んでもよい。この手法は、ユーザプログラムに記述されていないデバイスであって、動的に割り付け割れるデバイスを記録対象として追加する際に有用であろう。
このように記録部81はログ設定データ72に含まれているデバイスリストとは無関係にデバイスを記録してもよい。極端な場合、ユーザはログ設定データ72を作成せずに、ログデータ73を取得可能となる。たとえば、実行部80が起動すると、実行部80は、デバイス部34におけるすべてのデバイスからデバイス値を取得する。検知部82は、デバイスを監視しているため、実行部80がデバイス値を読み出したことを検知し、記録部81にデバイス値を読み出されたデバイスの情報(アドレス情報)を伝達する。記録部81は、検知部82により伝達されたアドレス情報に基づきデバイス部34に含まれているすべてのデバイスからデバイス値を読み出してログデータ73に書き込む。それ以降もデバイス部34へのアクセスを検知部82が検知するたびに、記録部81はデバイス値をロギングする。
ところで、記録部81はスキャン周期ごと、または、所定の収集周期ごとにデバイス値をログデータ73に書き込んでもよい。たとえば、一周期内で検知部82が複数回にわたるデバイスへのアクセスを検知したとしても、記録部81は、最後のアクセスが検知されたときのデバイス値だけでログデータ73に書き込んでもよい。これにより、ログデータ73のデータサイズを削減することが可能となる。
実行部80はデバイスを保持するキャッシュを有していてもよい。この場合、検知部82はキャッシュを監視することで、デバイスの書き込みを検知してもよい。
ログ設定データ72には記録対象となるデバイスを示すデバイスリストが含まれているが、記録の除外対象となるデバイスを示すデバイスリストが含まれていてもよい。この場合、記録部81は、除外対象となるデバイスへのアクセスを検知部82が検知すると、そのデバイスについてのデバイス値の記録をスキップする。
検知部82は実行部80による拡張ユニット4のバッファメモリへのアクセスを検知してもよい。この場合、実行部80は、拡張ユニット4のバッファメモリから読み出したデバイス値を記憶装置32内に確保されたバッファ等に書き込む。記録部81はバッファからデバイス値を読み出してログデータ73に書き込む。
実行部80はユーザプログラムを繰り返し実行し、ユーザプログラムにしたがってデバイス値を書き換える。検知部82が実行部80に実装されている場合、実行部80はデバイス値を書き換える命令語を検知すると、その命令語とともにデバイス値を記録部81に出力する。記録部81は、命令語、デバイス値およびタイムスタンプ(デバイス値を取得した時刻)をログデータ73に書き込んでもよい。
ところで、ログ設定データ72には、ログデータ73のデータ形式(例:バイナリー形式やテキスト形式)が含まれてもよい。データ形式としては、10進数16ビット、10進数32ビット、±10進数16ビット、±10進数32ビット、16進数16ビット、16進数32ビット、文字列、Float、DoubleFloatなどが、デバイスごとに設定されてもよい。このようなデータ形式はプログラム部品における命令語を解析することで判別可能である。
出力部84は、ユーザプログラムの実行が終了したとき、或いは、メモリカードへの保存トリガリレーがONした場合など、所定の出力条件が満たされると、プロジェクトデータ71、ログデータ73、画像データをメモリカード36に書き込む。所定の出力条件が満たされるまでは、ログデータ73がメモリ(例えばリングバッファ)に記録されていき、容量が一杯になると、一番古いログデータ73が消去され、新しいログデータ73が追加記録されていく(いわゆるFIFO形式で記録する)。このメモリカード36は基本ユニット3から取り外されて、PC2の装着部に装着される。これにより、PC2の表示部7にログデータ73が表示されるようになる。なお、出力部84は、通信部33を介してPC2やクラウドなどにログデータ73を送信してもよい。
なお、本実施形態では、所定の出力条件が満たされたときに、ログデータ73等をメモリカード36に書き込むこととしたが、本発明はこれに限られず、例えば、内部メモリ37(フラッシュメモリやハードディスクなどの不揮発性メモリ)に保存しても構わない。また、少なくともログデータ73については、所定の出力条件が満たされたときにメモリカード36又は内部メモリ37に保存される必要がある一方、プロジェクトデータ71については、所定の出力条件が満たされたときに限られない。例えば、PLC1が設定モード(PROGRAMモード)から運転モード(RUNモード)になったタイミングで、予めメモリカード36や内部メモリ37に保存しておいてもよい。
●構成情報の作成
図18は機能設定部62が実行する構成情報の作成処理(ユニット設定)を説明する図である。機能設定部62はユニットエディタと呼ばれてもよい。機能設定部62はユニットエディタの起動を支持されると、ユニット設定UI150を表示部7に表示する。名称欄151は各ユニットの名称(例:型番など)を表示する欄である。なお、各ユニットには自動的にユニット番号が付与される。この例では、基本ユニット3にユニット番号として“0”が付与されている。入力領域欄152は入力系のデバイスを割り付けるための欄である。この例では、基本ユニット3に入力系のデバイスとしてR000からR015までのデバイスが割り付けられている。出力領域欄153は出力系のデバイスを割り付けるための欄である。この例では、基本ユニット3に出力系のデバイスとしてR500からR507までのデバイスが割り付けられている。占有領域欄154は、入出力混合系のデバイスを割り付けるための欄である。エンドユニットは、いわゆる終端ユニットである。ユーザは操作部8を通じて拡張ユニット4の種類、接続順番、割り付けられるデバイスを設定する。機能設定部62は、拡張ユニット4の種類、接続順番(ユニット番号)、基本ユニット3と拡張ユニット4とのそれぞれに割り付けられるデバイスを示す情報を構成情報に格納する。構成情報はユニット設定情報と呼ばれてもよい。ここでは、ユニットごとにデバイスが割り付けられているが、各ユニットの機能ごとにデバイスが割り付けられてもよい。機能設定部62は構成情報をプロジェクトデータ71の一部として管理している。
このように構成情報には各ユニットに割り付けられているデバイスを示す情報や各機能に割り付けられているデバイスを示す情報が含まれている。そのため、デバイス抽出部53は構成情報を参照することで、各ユニットに割り付けられているデバイスや各機能に割り付けられているデバイスを抽出することができる。
<大容量データのロギング>
フィールドデバイス10としてカメラが存在する。ユーザはワークや制御対象の状態をカメラにより取得し、画像とデバイス値とを対比しながら、ユーザプログラムを改良することを望むことがある。したがって、相互に関連した画像とデバイス値とをどのように管理するかが問題となる。なぜなら、画像は拡張ユニット4により取得され、デバイス値は基本ユニット3によって取得されることが一般的だからである。さらに、画像の取得周期と、デバイス値の取得周期とは異なることが一般的である。このような事情から画像などの大容量データと、デバイス値のような比較的に小容量のデータとをどのように紐付けて管理するかが問題となる。
図19は基本ユニット3のCPU31の機能を示している。すでに説明された箇所には同一の参照符号が付与されている。この例では記録部81は収集部92aを有している。収集部92aは、所定の収集開始条件が満たされると、デバイス部34に保持されているデバイス値のうち、ログ設定データ72により指定されたデバイス値をデバイス部から読み出すとともに、時刻管理部83aから時刻情報を取得する。収集部92aはデバイス値と時刻情報とを関連付けてリングバッファ91aに格納する。なお、収集部92aは、ログ設定データ72により指定された収集周期(例:スキャン周期)ごとにデバイス値と時刻情報とを取得してリングバッファ91aに格納する。リングバッファ91aが採用されている理由は、リングバッファ91aに記憶されているすべてのデータがログデータ73としてメモリカード36に保存されるわけではないからである。たとえば、保存部93は、所定の保存条件が満たされたときに、リングバッファ91aからデバイス値と時刻情報とを読み出し、ログデータ73を作成してメモリカード36に保存してもよい。同様に、保存部93は、所定の保存条件が満たされたときに、拡張ユニット4から大容量データと時刻情報とを読み出し、ログデータ73を作成してメモリカード36に保存してもよい。保存部93は、上述したデバイス値及び時刻情報と、上述した大容量データ及び時刻情報とを、対応付けて保存する。ここで、「対応付けて」保存とは、PC2にて再生しやすい形で保存されていればよく、例えば、複数のファイルを対応付けたファイル管理がなされていてもよい。具体的に説明すると、メモリカード36において、特定のフォルダの下に、デバイス値及び時刻情報が格納された第1サブフォルダと、大容量データ及び時刻情報が格納された第2サブフォルダとが置かれている場合には、特定のフォルダまでのパス(ディレクトリパス)が共通フラグとなり、この共通フラグを使って、第1サブフォルダ内のファイルと第2サブフォルダ内のファイルを「対応付けて」保存することが可能になる。また、上述した特定のフォルダと同じレベル(ディレクトリ)に置かれた別フォルダがある場合、その別フォルダは、他のタイミングで保存されたデータパッケージを意味する。もちろん、この別フォルダの下にも上述同様のサブフォルダが置かれている。このように、保存部93は、上述したデバイス値及び時刻情報と、上述したデータ(大容量データ)及び時刻情報とを、共通フラグ(所定のディレクトリパス)により識別される複数のファイルに格納し、それら複数のファイルを保存してもよい。その他、例えば、共通フラグとしてファイル名を採用し、同一又は対応するファイル名をもつファイルを生成することで、「対応付けて」保存することも可能である。他にも例えば、時刻情報をキーとして、デバイス値とデータ(大容量データ)を対応付けてリスト化し、これを1つのファイルに纏めることによっても、「対応付けて」保存することが可能である。なお、本実施形態では、監視機器からのデータの一例として大容量データを考えたが、他にも例えば、モーションデータや通信データ、音声データなどの連続データであってもよいことは言うまでもない。送信部94は、PC2やクラウドなどにログデータ73を送信してもよい。リングバッファ91aが満杯になると、収集部92aは、リングバッファ91aに保持されている最も古い情報に対して、最も新しい情報を上書きする。
ここではバッファの一例としてリングバッファ91aが採用されているが、これは一例にすぎない。バッファとしては、FIFO形式のバッファが採用されれば十分であろう。
図20はカメラ入力機能を有した拡張ユニット4のCPU41の機能を説明する図である。時刻管理部83bの時計は、基本ユニット3の時刻管理部83aの時計と同期している。たとえば、時刻管理部83aは、END処理の際に時刻情報を時刻管理部83bに送信する。時刻管理部83bは、受信した時刻情報に基づき、時刻管理部83bの時計を時刻管理部83aの時計に同期させる。時計は、時刻情報に基づき時間をカウントするカウンタにより実現されてもよい。収集部92bは、所定の収集条件(例:所定のリレーデバイスがオンになったこと)が満たされると、例えば周期的にトリガー信号を出力する。時刻管理部83bはトリガー信号が入力されたときの時刻情報を時計から取得し、時刻情報バッファ95に格納する。メモリ42は時刻情報バッファ95とリングバッファ91aを有している。接続ポート97はカメラ98を拡張ユニット4に接続するためのインタフェースである。接続ポート97は、収集部92bにより発行されたトリガー信号をカメラ98に周期的に出力したり、カメラ98が出力する画像データを画像受信部96aに出力したりする。画像データは大容量データの一例である。接続ポート97は、カメラ98等の監視機器と接続され、その監視機器からデータ(画像データ)が入力される第二の外部インタフェースの一例である。画像受信部96aは、接続ポート97を介してカメラ98からの画像データの入力を伴う撮像機能を実行する機能実行部96の全部又は一部となる。本実施形態では、機能実行部96(画像受信部96a)は、露光時間、ゲイン、ホワイトバランス、コントラストなどの撮像パラメータ(設定情報の一例)に基づいて、カメラ98の制御を実行する。このような撮像パラメータは、PC2において、所望のパラメータ値が設定され、図4に示す基本ユニット3の通信部33及びCPU31を介して、機能実行部96に送られる。そのため、図4に示す通信部33は、PC2や表示器などの外部設定機器から設定情報を受け付ける第一の外部インタフェースの一例である。なお、第一の外部インタフェースとしての通信部33は、上述したようにPC2にて作成されたユーザプログラムも受け付ける。カメラ98は、トリガー信号にしたがって撮像を実行し、画像データを出力する。画像受信部96aは、画像データを収集部92bに転送する。収集部92bは、時刻情報バッファ95に保持されている時刻情報と、画像受信部96aから出力された画像データとを関連付けてリングバッファ91aに格納する。リングバッファ91bが満杯になると、収集部92bは、リングバッファ91bに保持されている最も古い情報に対して、最も新しい情報を上書きする。なお、本実施形態では、収集部92bが自動的かつ周期的に撮像トリガー信号をカメラ98に出力することとしたが、本発明はこれに限られず、収集部92bは、例えばユーザプログラムからの指令に基づいて撮像トリガー信号をカメラ98に出力してもよい。
ところで、基本ユニット3は毎スキャンごとに実行するリフレッシュ通信と、いつでも実行可能なダイレクト通信と、イベント的に実行されるメッセージ通信とのいずれかを用いて拡張ユニット4と通信する。保存部93は、たとえば、ダイレクト通信を使用して拡張ユニット4のリングバッファ91bから画像データと時刻情報とを読み出して、ログデータ73に追記する。なお、ダイレクト通信として、優先度つきの複数のダイレクト通信が実装されてもよい。この場合、ユーザプログラムに関連して実行されるダイレクト通信の優先度は相対的に高く設定され、ロギングのためのダイレクト通信の優先度は相対的に低く設定されてもよい。これにより、ロギングがユーザプログラムの実行に与える影響を小さくすることが可能となる。
<リングバッファを用いたロギング>
図21は基本ユニット3のリングバッファ91aに保持されたデバイス値と時刻情報とを示している。一つのレコードは、取得されたデバイス値と、このデバイス値が取得された時刻を示す時刻情報とを有している。
図21はさらに拡張ユニット4のリングバッファ91bに保持された画像データと時刻情報とを示している。一つのレコードは、取得された画像データと、この画像データが取得された時刻を示す時刻情報とを有している。
図22は基本ユニット3におけるリングバッファ91aを用いたロギングを示している。
S21でCPU31(収集部92a)はデバイス値の取得条件が満たされたかどうかを判定する。取得条件はリングバッファ91aに対するデバイス値と時刻情報の格納を開始するための条件である。取得条件は、ユーザプログラム中に記述されてもよいし(例:開始リレーがオンになったこと)、ログ設定データ72において記述されていてもよい。取得条件が満たされると、CPU31はS22に進む。
S22でCPU31(収集部92a)は取得リレーをONにする。取得リレーは一ビットデバイスであり、拡張ユニット4に対してリングバッファ91bへのデータの格納を指示するためのリレーである。
S23でCPU31(収集部92a)はデバイス値の取得タイミングが到来したかどうかを判定する。取得タイミングは、たとえば、スキャン周期ごとなどであり(例えば毎スキャンにおけるEND処理において取得する等)、ログ設定データ72により定義されている。取得タイミングが到来すると、CPU31はS24に進む。
S24でCPU31(収集部92a)は、ログ設定データ72により指定されたデバイス値をデバイス部34から取得するとともに、時刻管理部83aから時刻情報を取得し、これらをリングバッファ91aに書き込む。
S25でCPU31(収集部92a)は、保存タイミングが到来したかどうかを判定する。保存タイミングとは、リングバッファ91aに保持されている情報をログデータ73に保存するタイミングである。保存タイミングは、たとえば、所定のイベント(例:保存トリガ)が発生したことなどであってもよい。保存タイミングもログ設定データ72により定義されている。保存タイミングが到来していなければ、CPU31はS23に戻る。保存タイミングが到来していれば、CPU31はS26に進む。
S26でCPU31(収集部92a)は、リングバッファ91aに保持されている情報をログデータ73に保存する。なお、リングバッファ91aに保持されている情報のうち、保存対象となる情報がログ設定データ72により定義されていてもよい。たとえば、保存対象は、あるイベントが発生したタイミングから所定時間が経過するまでに取得された情報であってもよい。また、保存対象は、あるイベントが発生したタイミングよりも所定時間前の時刻である開始時刻から、当該イベントが発生したタイミングから所定時間が経過した時刻である終了時刻までに取得された情報であってもよい。
S27で(収集部92a)は、拡張ユニット4のリングバッファ91bに保持されている情報をログデータ73に保存する。収集部92aは、ダイレクト通信を利用して、拡張ユニット4のリングバッファ91bに保持されている情報を読み出してもよい。より具体的には、収集部92aは、バッファメモリから情報を読み出すための命令を発行してもよい。なお、リングバッファ91bに保持されている情報のうち、保存対象となる情報も、ログ設定データ72により定義されていてもよい。たとえば、保存対象は、あるイベントが発生したタイミングから所定時間が経過するまでに取得された情報であってもよい。また、保存対象は、あるイベントが発生したタイミングよりも所定時間前の時刻である開始時刻から、当該イベントが発生したタイミングから所定時間が経過した時刻である終了時刻までに取得された情報であってもよい。
S28で(収集部92a)は、終了条件が満たされたかどうかを判定する。終了条件は、ロギングの終了条件である。終了条件もログ設定データ72により定義されていてもよい。終了条件が満たされていなければ、CPU31はS23に戻る。終了条件が満たされていれば、CPU31はロギング処理を終了する。
図23は拡張ユニット4におけるリングバッファ91bを用いたロギングを示している。
S31でCPU41(収集部92b)は画像データの取得条件(例:取得リレーがONになったこと)が満たされたかどうかを判定する。取得リレーがONになると、CPU41はS32に進む。なお、本実施形態では取得リレーがONになったときに、画像データの取得条件が満たされたと判定するようにしたが、これは一例に過ぎない。他にも例えば、PLC1のモードが運転モードに切り替えられたときに、画像データの取得条件が満たされたと判定されてもよい。より具体的には、PLC1には、各種設定を行うための設定モード(プログラムモード)と、ラダープログラムを繰り返し実行して実際の運転を行う運転モード(RUNモード)とを切り替えるモード切替スイッチが設けられてもよい。この場合、ユーザによって、このモード切替スイッチがプログラムモードからRUNモードに切り替えられたら、画像データの取得条件が満たされたと判定されてもよい。
S32でCPU41(収集部92b)は画像データの取得タイミングが到来したかどうかを判定する。取得タイミングは、たとえば、拡張ユニット4の内部制御周期(撮像周期)ごとなどである。取得タイミングが到来すると、CPU41はS33に進む。
S33でCPU41(収集部92b)は、大容量データと時刻情報を取得してリングバッファ91bに格納する。たとえば、収集部92bは、トリガー信号を発行し、カメラ98と時刻管理部83bに出力する。時刻管理部83bはトリガー信号を受信すると、内部時計から時刻情報を読み出して、時刻情報バッファ95に書き込む。カメラ98は、予め指定された撮像条件にしがって撮像を実行し、画像データを出力する。画像受信部96aは画像データを収集部92bに出力する。画像受信部96aは画像データをリングバッファ91bに直接的に書き込んでもよい。収集部92bは時刻情報バッファ95から読み出した時刻情報と、カメラ98により取得された画像データとを関連づけてリングバッファ91bに書き込む。
S34でCPU41(収集部92b)は、基本ユニット3からリングバッファ91bに対する読み出し要求(読み出し命令)が発行されたかどうかを判定する。読み出し要求を受信したのであれば、CPU41はS35に進む。読み出し要求が発行されていなければ、CPU41はS32に戻る。
S35でCPU41(収集部92b)は、リングバッファ91bから大容量データである画像データと時刻情報とを取得して基本ユニット3に送信する。
S36でCPU41(収集部92b)は、終了条件が満たされたかどうかを判定する。たとえば、収集部92bは取得リレーがOFFになったかどうかを判定する。終了条件が満たされていなければ、CPU41はS32に戻る。終了条件が満たされていれば、CPU41はロギング処理を終了する。
<接続形態>
図24はビルディングブロックタイプのPLC1の接続形態を示している。基本ユニット3の右側面には、拡張ユニット4と接続して通信するためのIF99aが設けられている。IFはインタフェースの略称である。この例では、基本ユニット3には拡張ユニット4aが接続されており、拡張ユニット4aには拡張ユニット4bが接続されている。拡張ユニット4は右側面と左側面との両方にIF99を有している。基本ユニット3の右側面は拡張ユニット4aの左側面と対向している。よって、基本ユニット3のIF99aは拡張ユニット4aの左側面に設けられたIF99bと接続する。拡張ユニット4aの右側面は拡張ユニット4bの左側面と対向している。よって、拡張ユニット4aのIF99cは拡張ユニット4bの左側面に設けられたIF99dと接続する。なお、拡張ユニット4bの右側面に設けられた99eはエンドユニットに接続されてもよい。このように、IF99aからIF99eはユニット内部バス90を形成している。たとえば、拡張ユニット4aに接続されたカメラ98aにより取得された画像データはユニット内部バス90を介して基本ユニット3へ転送されうる。拡張ユニット4bに接続されたカメラ98bにより取得された画像データはユニット内部バス90を介して基本ユニット3へ転送されうる。
このようにビルディングブロックタイプのPLC1では各ユニットの側面が接続面(連結面)となる。ユニット内部バス90の一部を形成するためのIF99も各ユニットの側面に設けられる。なお、上述したように、ユニット内部バス90での通信は、図4に示すバスマスタ38によって制御される。
図25はバックプレーン200を有するPLC1の接続形態を示している。バックプレーン200は、基本ユニット3の底面および拡張ユニット4の底面に接続されるか、基本ユニット3の背面および拡張ユニット4の背面に接続される。バックプレーン200は基本ユニット3および拡張ユニット4を支持する支持プレート(ベースプレート)として機能する。ここでは一例として背面が接続面として説明される。基本ユニット3の背面はバックプレーン200の正面と対向している。よって、基本ユニット3の背面に設けられたIF99fはバックプレーン200の正面に設けられたIF99gと接続する。拡張ユニット4の背面はバックプレーン200の正面と対向している。拡張ユニット4aの背面に設けられたIF99hはバックプレーン200の正面に設けられたIF99iに接続される。拡張ユニット4bの背面に設けられたIF99jはバックプレーン200の正面に設けられたIF99kに接続される。IF99fないしIF99kはユニット内部バス90を形成している。
なお、バックプレーン200は、ユニット内部バス90を介したバス通信を制御するための通信制御部213を有していてもよい。また、バックプレーン200は、CPU211やメモリ212を有していてもよい。メモリ212はRAMやROMに加え、メモリカード36を有していてもよい。この場合、CPU211は収集部92aや保存部93して機能してもよい。また、メモリ212にはリングバッファ91aが設けられてもよい。あるいは、CPU211は時刻管理部83bおよび収集部92を有していてもよい。この場合、メモリ212はリングバッファ91bを有する。
<ログの表示例>
図26はログデータ73の一例を示している。この例では、デバイス値d1〜d10と、カメラ98aにより取得されたワーク画像i1〜i3と、カメラ98bにより取得された他の画像j1〜j3の取得タイミングが示されている。デバイス値d1〜d10はスキャン周期ごとに取得されている。ワーク画像i1〜i3はトリガー信号が発生したタイミングに取得されている。ワーク画像j1〜j3はトリガー信号が発生したタイミングに取得されている。各データの位置はそれぞれの時刻情報を示している。図26が示すように、各データの取得時刻や取得周期は一致していない。そのため、ログ表示部61は、各データの時刻情報に基づき各データの表示タイミングを調整する。
図27はログデータ73の表示タイミングと表示継続時間とを説明する図である。ログ表示部61は、各デバイス値の時刻情報にしたがって各デバイス値を表示部7に表示する。たとえば、ログ表示部61は、デバイス値d1の時刻情報とデバイス値d2の時刻情報との差分時間をデバイス値d1の表示継続時間に決定する。ログ表示部61は、デバイス値d1の表示を開始してから表示継続時間が経過すると、デバイス値d2の表示を開始する。以下、同様に表示継続時間が求められ、表示されるデバイス値が時刻情報や表示継続時間にしたがって切り替えられて行く。
すでに図26が示したように、デバイス値d1の取得時刻と、ワーク画像i1の取得時刻とは一致していない。そこで、ログ表示部61は、ワーク画像i1の取得時刻をデバイス値d1ないしd10の取得時刻と比較し、ワーク画像i1の取得時刻に最も近いデバイス値dxの取得時刻を求める。この例では、ワーク画像i1の取得時刻に最も近いのは、デバイス値d1の取得時刻である。よって、ログ表示部61は、デバイス値d1の表示を開始するとともに、ワーク画像i1の表示を開始する。次に、ログ表示部61は、ワーク画像i2の取得時刻に最も近いデバイス値dxの取得時刻を求める。この例では、デバイス値d4の取得時刻が、ワーク画像i2の取得時刻が最も近い。そこで、ログ表示部61は、デバイス値d4の表示タイミングが到来すると、デバイス値d4とワーク画像i2の表示を開始する。ログ表示部61は、他の画像j1の取得時刻に最も近いデバイス値dxの取得時刻を求める。この例では、他の画像j1の取得時刻に最も近いのは、デバイス値d2の取得時刻である。よって、ログ表示部61は、デバイス値d2の表示タイミングが到来すると、デバイス値d2の表示を開始するとともに、他の画像j1の表示を開始する。
このようにログデータ73に含まれる複数のデータのうち、ロギングの周期がもっとも短いデータを基準として、各データの表示タイミングが調整されてもよい。
図28はログデータ73の表示方法を説明する図である。この例では、デバイス値dxとしてリレーデバイスR000とデータメモリDM100が取得されている(xは1から10までの値をとる)。このように、一つのワーク画像ixに対して複数のデバイス値が時刻情報にしたがって紐付けられる。ログ表示部61は、デバイス値dx、ワーク画像ix、他の画像jxを一つのウインドウ内に表示してもよいし、それぞれ個別のウインドウに表示してもよい。また、ログ表示部61は、プロジェクトデータ71からユーザプログラムを読み出し、ユーザプログラムに対してデバイス値dxをマッピングして表示してもよい。たとえば、ログ表示部61は、表示対象のデバイス値dxに関連する命令語を含むステップを検索し、見つかったステップを表示するとともに、当該ステップにおける命令語の下にデバイス値を表示してもよい。なお、表示対象デバイスがリレーデバイスであることもある。ログ表示部61は、リレーデバイスのオン/オフに応じて命令語の表示色またはアイコン画像(例:矢印)を変更してもよい。アイコン画像としてはオンを示すものと、オフを示すものとがある。また、ログ表示部61はデバイス値をグラフ化して表示してもよい。この場合に、ログ表示部61は、一つのウインドウにデバイス値d1〜d10を常に表示し、他のウインドウにワーク画像を表示する。ログ表示部61は、時間の経過とともにワーク画像を切り替える。ここで、ログ表示部61は時間軸方向に移動可能なバー103を表示してもよい。バー103はタイムラインバーと呼ばれてもよい。ログ表示部61は、時間の経過とともに左から右へ移動するようにバー103を表示してもよい。バー103はユーザによって移動されてもよい。この場合、ログ表示部61は操作部8を通じてバー103の移動操作(例:ポインタ101によるドラッグ操作)を受け付け、移動操作に応じて表示時刻を更新する。ログ表示部61はバー103により指定された表示時刻に対して取得時刻が最も近いデバイス値、ワーク画像および他の画像をログデータ73から抽出し、表示部7に表示してもよい。
なお、本実施形態では、監視機器の一例として、カメラ98を例示するとともに、機能実行部96の機能としては、カメラ98の撮像機能を例示した。本発明はこれに限られず、機能実行部96の機能として、モーション機能や通信機能であってもよい。まず、前者のモーション機能について詳述すると、基本ユニット3に、拡張ユニット4としてモーションユニットが連結されている場合を考える。この場合、PC2において、モーションユニットの動作を規定するプログラム(モーションフロープログラム)やパラメータ(軸構成や軸制御の設定パラメータなど)の設定がなされ、いわゆる設定情報が作成される。そして、第一の外部インタフェース(通信部33)を介して、設定情報がモーションユニットの機能実行部に送られ、モーションユニットに反映される。モーションユニットの機能実行部は、設定情報に従って、外部に接続されたモータアンプに対して目標座標や目標速度などの動作指令値を送信する。モータアンプからは、エンコーダを介して、現在座標や現在速度などのモーションデータを受信する。現在座標や現在速度などのモーションデータを受信する制御周期は、ラダープログラムのスキャン周期よりも短く、ラダープログラムのスキャン周期と非同期である。そこで、モーションユニットの収集部は、所定の周期でモーションデータを収集し、モーションデータを受信した受信時刻に関する情報と該モーションデータとを関連付けてリングバッファ91bに記憶する。その後、図22を用いて説明した処理と同様に、保存タイミングになると(図22のステップS25と同様)、リングバッファ91bからモーションデータ(現在座標や現在速度など)と時刻情報を取得して、ログデータに追記する。これにより、どのデバイス値と、どのモーションデータとが関連しているかを容易に特定することができる。一方で、後者の通信制御について詳述すると、基本ユニット3に、拡張ユニット4として通信ユニットが連結されている場合を考える。この場合、PC2において、通信ユニットの動作を規定するプログラム(通信フロープログラム)やパラメータ(通信周期や転送速度など)の設定がなされ、設定情報が作成される。そして、上述したモーション制御と同様に、通信部33を介して、設定情報が通信ユニットに反映される。そして、通信ユニットの機能実行部は、設定情報に従って、外部に接続されたセンサ群(複数の光電センサが連結されたもの等)から、複数のセンサ値などの通信データを受信する。このような通信データの受信周期(サイクリック通信周期)は、ラダープログラムのスキャン周期と非同期である。なお、センサ群を構成するセンサ数が多い場合には、通信データ自体が大容量データを構成する場合もある。通信ユニットの収集部は、所定の周期(いわゆるサイクリック通信周期)で通信データを収集し、通信データを受信した受信時刻に関する情報と通信データとを関連付けてリングバッファ91bに記憶する。あとは、図22を用いて説明した処理と同様に、保存タイミングになると(図22のステップS25と同様)、リングバッファ91bから通信データ(センサ値など)と時刻情報を取得して、ログデータに追記する。
<収集期間の設定>
ログ設定部51はログデータ73の収集期間の設定を受け付けてもよい。
図29は収集期間を設定するためのUI160を示している。なお、UI160、UI110、およびUI100はそれぞれに対応したタブをポインタ101で選択することで切り替えられてもよい。UI160は収集方法を指定するためのプルダウンメニュー161を有している。収集方法とはログデータ73の収集方法である。この例では、保存トリガー前後と呼ばれる収集方法と、開始リレーと呼ばれる収集方法とが説明される。保存トリガー前後とは、保存トリガーがオンになったタイミングよりも前の収集時間Taと保存トリガーがオンになったタイミングよりも後の収集時間Tbとにおいてログデータ73を収集する方法である。テキストボックス162は収集時間Tの入力を受け付ける。収集時間Tは、収集時間Taと収集時間Tbとの合計値である。テキストボックス163はトリガー後の収集時間Tbの入力を受け付ける。保存トリガーの設定部164は、保存トリガーとして利用されるリレーデバイスのデバイス名と、条件(例:オフからオンに切り替わったこと)との設定を受け付ける。上矢印は、保存トリガーとして指定されたリレーデバイスがオフからオンに切り替わったことを意味する。ガイダンス部165は、収集期間を説明するためのUIである。この例では、保存トリガーを境として、ログデータ73が収集されることが示されている。ログ設定部51は、上述されたデバイスサイズやスキャンタイムの伸びに関する情報もUI160に表示してもよい。
保存トリガー前後と呼ばれる収集方法では、リングバッファ91にはデバイス値や画像データが常時格納される。保存部93は、保存トリガーであるリレーデバイスR200がオンになると、収集時間として指定された20秒のログデータ73を作成する。保存部93は、リレーデバイスR200がオンになったタイミングから18秒前に記録されたデータから、当該タイミングから2秒後までに記録されたデータをリングバッファ91から読み出してログデータ73を作成する。
図30は収集期間を設定するためのUI160を示している。この例ではポインタ101によってプルダウンメニュー161から収集方法として開始リレーが選択されている。ログ設定部51は、ユーザにより選択された収集方法にしたがってUI160を変更する。テキストボックス166は開始リレーとして使用されるリレーデバイスのデバイス名を受け付ける。ガイダンス部165が示すように、開始リレーと呼ばれる収集方法では、開始リレーがオンになったタイミングが収集時間の起点(開始点)となる。たとえば、製造ラインを流れてくる1個のワークをプレス処理するのに30秒かかると仮定する。また、トラブルが発生しうる時間は、30秒間の処理時間のうち最初の20秒間であると仮定する。リレーデバイスR000はプレス処理を開始するタイミングを規定するリレーである。収集部92は、リレーデバイスR000がオンになると、20秒間にわたりデバイス値や画像データをリングバッファ91に格納する。次のワークが到着することで、リレーデバイスR000が再びオンになると、収集部92は、20秒間にわたりデバイス値や画像データをリングバッファ91に格納する。保存トリガーであるリレーデバイスR200がオンになると、保存部93は、リングバッファ91に格納されている最新の20秒間にわたるデバイス値や画像データを取得してログデータ73を作成する。保存トリガーであるリレーデバイスR200は、トラブルが発生したときにオンとなるリレーデバイスである。
ログ設定部51はUI160を通じて設定された情報をログ設定データ72に格納し、プロジェクトデータ71とともに基本ユニット3に転送する。
<デバッグ>
図31はユーザにより実行されるユーザプログラムのデバッグ処理の概要を示すフローチャートである。
S41でユーザはPC2を操作し、複数のプログラム部品から構成されるユーザプログラムを作成し、ユーザプログラムを含むプロジェクトデータ71を作成する。プログラム作成部63はユーザ入力にしたがってユーザプログラムを作成し、記憶装置22に格納する。プロジェクト作成部50はユーザ入力にしたがってプロジェクトデータ71を作成し、記憶装置22に格納する。プロジェクトデータ71は、プロジェクトデータ71またはユーザプログラムを識別するための識別情報を含む。プロジェクト作成部50は、プロジェクトデータ71またはユーザプログラムに対して演算を実行してハッシュ値または誤り検出符号などを求め、これらを識別情報としてプロジェクトデータ71に付加してもよい。なお、識別情報はGUID(グローバル一意識別子)などであってもよい。
S42でユーザはPC2を操作し、プロジェクトデータ71をPLC1に転送する。プロジェクト作成部50はプロジェクトデータ71を記憶装置22から読み出し、通信部23を介してPLC1へ送信する。PLC1の基本ユニット3はプロジェクトデータ71を受信すると、記憶装置32に書き込む。
S43でユーザは基本ユニット3の操作部6を操作し(例えば、PROGRAMモードからRUNモードに切り替えるモード切替スイッチを操作することにより)、プロジェクトの実行を指示する。実行部80はプロジェクトデータ71に含まれているユーザプログラムを実行する。記録部81はデバイス値などをロギングし、ロギングしたデバイス値をリングバッファ91aに格納(記録)する。出力部84のうちの保存部93は、所定の出力条件が満たされると、リングバッファ91aに記録されているデバイス値や、上述した画像データを、メモリカード36又は内部メモリ37に保存することで、ログデータ73を作成する。
また、保存部93は、図19に示すように、ログデータ73に加えて、プロジェクトデータ71をメモリに保存する。これにより、PC2において、トラブル発生時のプロジェクトデータ71を使って、トラブル発生時の動きをモニタ上で再現できるようになる。詳細については後述する。
また、保存部93は、プロジェクトデータ71に加えて、プロジェクトデータ71の識別情報(ハッシュ値など)をメモリに保存する。これにより、PC2は、その識別情報を使って、現在の(リプレイ対象にしようとしている)プロジェクトデータが、実際のトラブル発生時のプロジェクトデータ71と一致するか否かを検証できるようになる。詳細については後述する。
なお、本実施形態では、所定の出力条件が満たされたタイミングで、ログデータ73に加えて、プロジェクトデータ71及びその識別情報をメモリに保存することとしたが、本発明はこれに限られない。例えば、PLC1の運転開始前、運転開始時、または運転中に、プロジェクトデータ71及びその識別情報をメモリに保存しておき、所定の出力条件が満たされたタイミングで、ログデータ73のみをメモリに保存するようにしてもよい。要するに、所定の出力条件が満たされた時点で、ログデータ73と、プロジェクトデータ71と、その識別情報とが対応付けられた状態で、メモリに保存されていればよい。
また、本実施形態では、プロジェクトデータ71をメモリに保存しているが、本発明はこれに限られず、例えば、プロジェクトデータ71に代えて、プロジェクトデータ71の識別情報のみをメモリに保存するようにしてもよい。この場合、PC2における現在のプロジェクトデータは、実際のトラブル発生時のプロジェクトデータ71と一致することを前提としている。すなわち、プロジェクトデータをPLC1に転送した後、現在のプロジェクトデータは編集・改変されていないことを前提としている。仮に、両データが不一致と判定された場合には、ユーザは、現在のプロジェクトデータが、実際のトラブル発生時のプロジェクトデータ71とは異なることを認識した上でリプレイを行えばよいので、ユーザがこれを認識しない状態でリプレイ(不正確なトラブルシューティング)が行われるのを防ぐことができる。
S44でユーザは基本ユニット3の操作部6を操作し、プロジェクトデータ71とログデータ73をPC2へ転送するよう指示する。或いは、PC2の操作部8を操作して、メモリカード36に書き込まれたプロジェクトデータ71、プロジェクトデータ71の識別情報、およびログデータ73を読み出してもよい。出力部84はプロジェクトデータ71とログデータ73をPC2へ送信する。なお、出力部84はプロジェクトデータ71の転送が禁止されていると判定した場合に、プロジェクトデータ71の識別情報をログデータ73に付加する構成を採用してもよい。プロジェクトデータ71の識別情報とログデータ73とは別々に送信されてもよい。出力部84は、メモリカード36に書き込むための所定の条件が成立したタイミングで、プロジェクトデータ71またはユーザプログラムに対して(例えばハッシュ関数を用いた)演算を実行してハッシュ値または誤り検出符号などを求め、これらを識別情報としてログデータ73に付加してもよい。なお、PC2が実行する識別情報の作成ルールと、基本ユニット3が実行する識別情報の作成ルールとが一致していれば、どのようなルールが採用されてもよい。
S45でユーザはPC2を操作し、ログデータ73を再生(リプレイ)しつつトラブルの原因究明を行って、プロジェクトデータ71を構成するユーザプログラムのデバッグを実行する。ログデータ73の再生は、ログデータ73に含まれている時系列のデバイス値を波形として表示部7に表示することや、デバイス値をユーザプログラムに関連付けて表示することや、ログデータ73に含まれている時系列の画像データを表示部7に表示することを含む。ログ表示部61は、仮想的な時刻を計時する内部時計を有しており、内部時計に同期してログデータ73からデバイス値を取得して表示部7に表示する。プロジェクトデータ71がPLC1から送信されないこともある。この場合、ログ表示部61は、記憶装置22に保持されているプロジェクトデータ71(マスタデータ)のユーザプログラムを使用して、デバイス値をユーザプログラムに関連付けて表示してもよい。ログデータ73を再生することによるトラブルの原因究明の詳細については、後述する。
ここで注意すべき点としては、ログデータ73を取得するために使用されたプロジェクトデータ71のバージョンと、PC2に保持されているプロジェクトデータ71のバージョンとが異なることがある。この場合、デバイス値をユーザプログラムに関連付けて表示することが不可能となるか、または、ユーザプログラムとデバイス値との関連付が誤ってしまうことも考えられる。この場合、ログ表示部61は、プロジェクトデータの識別情報を使って、ログデータ73を取得するために使用されたプロジェクトデータ71のバージョンと、PC2に保持されているプロジェクトデータ71のバージョンとが異なることを示す警告を表示部7に表示してもよい。なお、ログ表示部61は、第一のバージョンのプロジェクトデータ71を使用して取得されたログデータ73を、PC2に保持されている第2のバージョンのプロジェクトデータ71に関連付けて表示するかどうかをユーザに問い合わせもよい。ユーザがこのような表示を希望する場合、ログ表示部61は、第一のバージョンのプロジェクトデータ71を使用して取得されたログデータ73を、PC2に保持されている第2のバージョンのプロジェクトデータ71に関連付けて表示部7に表示する。なお、バージョンは識別情報によって管理される。ユーザがログデータ73に問題がないことを確認すると、デバッグは不要であり、後続のS46やS47も不要である。ユーザはログデータ73を分析し、ユーザプログラムのバグなどを発見し、ユーザプログラムを修正する。プロジェクト作成部50はユーザ入力にしたがってプロジェクトデータ71を修正(更新)し、記憶装置22に格納する。
S46でユーザはPC2を操作し、プロジェクトデータ71をPLC1に転送する。なお、プロジェクトデータ71内のユーザプログラムが変更されると、識別情報が更新される。これにより、修正前のプロジェクトデータ71と修正後のプロジェクトデータ71とが区別可能となる。
S47でユーザは基本ユニット3を操作し、プロジェクトデータ71に含まれるユーザプログラムの実行を指示することで、プロジェクトデータ71を検証する。実行部80はプロジェクトデータ71に含まれているユーザプログラムを実行する。PLC1がユーザの想定通りに稼働していれば、ユーザはプロジェクトデータ71のデバッグに成功したと判断する。なお、PLC1がユーザの想定通りに稼働していなければ、記録部81によって再びデバイス値などをロギングし、保存部93によってログデータ73を作成する。そして、ユーザはS44ないしS47を再び実行する。
このようにユーザはログデータ73を参照しながらプロジェクトデータ71をデバッグできる。そのため、デバッグの効率が向上すると考えられる。
なお、プロジェクトデータ71の転送はメモリカード36を介して実行されてもよい。つまり、PC2はメモリカード36に書き込む。ユーザはメモリカード36をPC2から取り外し、基本ユニット3にメモリカード36を取り付ける。基本ユニット3はメモリカード36からプロジェクトデータ71を読み出して記憶装置32に書き込む。同様に、ログデータ73の転送もメモリカード36を介して実行されてもよい。
<出力部>
図32は基本ユニット3に実装される出力部84を示している。出力部84は、ログデータ73に加えて、ログデータ73を取得する際に使用されたプロジェクトデータ71をPC2に転送してもよい。しかし、プロジェクトデータ71の情報漏洩を防ぐために、プロジェクトデータ71にはメモリカード36への書き出しや、PC2への送信を禁止するアクセス権限(プロテクト)が設定されることがある。そこで、判定部301は、プロジェクトデータ71に付与されているアクセス権限を参照し、プロジェクトデータ71の出力が禁止されているかどうかを判定する。プロジェクトデータ71の出力が禁止されている場合、出力部84はログデータ73を出力するが、プロジェクトデータ71を出力しない。一方、プロジェクトデータ71の出力が禁止されていない場合、出力部84はログデータ73とプロジェクトデータ71とを出力する。プロジェクトデータ71の出力が禁止されている場合、付加部302は、記憶装置32に保持されているプロジェクトデータ71の識別情報をログデータ73とともに出力してもよい。この識別情報はプロジェクトデータ71の一部であってもよいし、演算部303がプロジェクトデータ71またはユーザプログラムに対して所定の演算を実行することで識別情報を求めてもよい。所定の演算は、たとえば、ハッシュ演算であってもよいし、誤り検出符号の演算であってもよい。リアルタイム送信部304は、デバイス部34に保持されているデバイス値をリアルタイムで送信する。これは、PC2やHMI(ヒューマンインタフェース)などの表示装置にリアルタイムでデバイス値を表示する際に役立つ。
<プロジェクト作成部50>
図33はプロジェクト作成部50の詳細を示している。機能設定部62は操作部8から入力される情報に基づき拡張ユニット4の構成情報、基本ユニット3の機能および拡張ユニット4の機能を設定し、設定内容を示す構成情報を作成する。基本ユニット3の機能の設定としては、IPアドレスの設定、FTPクライアントに関する設定、プロジェクトデータ71のアクセス権限の設定などがある。拡張ユニット4の機能の設定としては、入力チャネルの設定やPLC同士の通信に関する設定などがある。構成情報はプロジェクトデータ71の一部である。編集部311(図6に示すプログラム作成部63を兼ねてもよい)は、表示部7にユーザプログラムの編集UIを表示し、操作部8から入力される情報に基づきユーザプログラムを編集する。デバッグ部314はプロジェクトデータ71を使用してユーザプログラムをデバッグする。付加部312はプロジェクトデータ71に識別情報を付加する。演算部313は識別情報(例:ハッシュ値や誤り検出符号)を演算により求める。なお、この演算部313による識別情報の演算(算出)機能については、出力部84が、同機能を発揮するようにしてもよい。
<ログ表示部61>
図34はログ表示部61の詳細を示している。プログラム表示モジュール321はプロジェクトデータ71に含まれるユーザプログラムとともに、ログデータ73に含まれるデバイス値を表示部7に表示するモジュールである。また、プログラム表示モジュール321は、ユーザプログラムのみならず、プロジェクトデータ71に含まれるプログラム構成情報、複数のプログラム部品、ユニット構成、ユニット毎の機能設定など、ユーザがプロジェクトデータ71の設定内容を視認するための各種情報を表示可能となっている。画像表示モジュール323は、ログデータ73に含まれる時系列の画像データを表示部7に表示する。波形表示モジュール322は、ログデータ73に含まれる時系列のデバイス値を波形化して表示部7に表示するモジュールである。再生制御モジュール324は、プログラム表示モジュール321によって表示される情報と波形表示モジュール322によって表示される情報とを時間的に同期させる。これらのモジュールはエンジニアリングソフトウエアと呼ばれてもよい。なお、画像表示モジュール323は、プログラム表示モジュール321の一機能(画像表示部)として具現化されてもよいし、波形表示モジュール322の一機能(画像表示部)として具現化されてもよい。
●プログラム表示モジュール
図35Aはプログラム表示モジュール321の詳細を示している。時刻UI330aは、ユーザプログラムとともに表示されるデバイスの取得時刻(表示時刻)を操作するためのUI(例:スライドバーやカーソルなど)を提供する。表示時刻制御部331aは時刻UI330aにより指定された表示時刻を再生制御モジュール324に送出したり、再生制御モジュール324から通知された表示時刻を時刻UI330aに設定したりする。プログラム表示部332は、プロジェクトデータ71を表示部7に表示したり、識別情報に対応したプロジェクトデータ71を記憶装置22から読み出して表示部7に表示したりする。また、プログラム表示部332はデバイス値取得部333aにより取得されたデバイス値を、ユーザプログラムに使用または記述されているデバイスと関連付けて表示する。デバイス値取得部333aは、リアルタイム再生モードとログ再生モードとを有している。デバイス値取得部333aは、リアルタイム再生モードにおいて、PLC1のリアルタイム送信部304にアクセスし、デバイス値を取得し、プログラム表示部332に渡す。デバイス値取得部333aは、ログ再生モードにおいて、再生制御モジュール324にアクセスし、表示時刻とデバイス値を取得し、プログラム表示部332に渡す。
図35Bは、プログラム表示部332等によって表示部7に表示されるGUIの一例を示す模式図である。
図35Bにおいて、左欄のプロジェクト表示領域420には、プロジェクトデータ71を構成する様々な情報が表示されている。上から順に、ユニット構成(基本ユニット、モーションユニット、アナログ入力ユニット、カメラユニット)、プログラム構成(毎スキャンモジュール、定周期モジュール、ユニット間同期モジュール、ファンクションブロック、マクロ)が表示されている。モーションユニットについては、機能設定として軸構成や軸制御の設定パラメータが表示されている。ユーザは、図35Bに示すGUI上において、軸構成や軸制御をダブルクリックすることで、これらの設定パラメータについて、どのような設定内容になっているかを確認することができる。また、プロジェクト表示領域420において、毎スキャンモジュールに対してMainとSubが表示されているところ、ユーザがMainをクリックすると、中央のラダーモニタ450のプログラム表示領域410に、Mainプログラムが表示される。このように、図34に示すプログラム表示モジュール321は、メモリカード36からプロジェクトデータ71を読み出して、プロジェクト表示領域420に各種情報を表示したり、プログラム表示領域410に所望プログラムを表示したりする。
ここで、プログラム表示領域410は、いわゆるラダーモニタ450の一部であり、リアルタイム再生モードにおいて単独で動作させることができるものである。×印をクリックすることで、ラダーモニタ450のみを非表示にすることも可能である。一方で、ログ再生モードでは、プログラム表示部332によって、運転記録を保存した際のプロジェクトに含まれるラダープログラムを再現することができるようになっている。また、プログラム表示部332は、ログ再生モードにおいて、デバイス値取得部333aを介してログデータ73に含まれるデバイス値を、Mainプログラムに記述されているデバイスと関連付けて表示する。表示対象となるデバイス値は、時刻指定カーソル404によって指定された時刻に対応するデバイス値となる(より詳細は、後述する図38を用いて説明する)。
図35Bでいえば、時刻表示領域409に表示されている20XX/10/01の18:52:54と対応付けられたデバイス値が、Mainプログラムに記述されているデバイスと関連付けて表示される。この日付の右側に表示された[35000/74286]は、全スキャン回数74286に対する現在のスキャン回数35000を示している。ユーザは、時刻指定カーソル404をドラッグして移動させることで、表示時刻及びスキャン回数の更新とともに、デバイス値の表示も更新される。例えば、更新後の表示時刻において、ONしているリレーデバイスの箇所にはON表示(例えば色で塗潰す等)がなされ、OFFしているリレーデバイスの箇所にはOFF表示(例えば色抜き等)がなされる。再生ボタン406の機能等の詳細については、図38を用いて後述する。
図35Bにおいて、右上欄には、カメラモニタ430の画像表示領域が設けられている。画像表示モジュール323は、プログラム表示モジュール321によってラダーモニタ450に表示された表示時刻と同期して、ログデータ73から画像データを読み出してカメラモニタ430の画像表示領域に表示する。図35Bでは、表示時刻である20XX/10/01の18:52:54と対応付けられた画像データが、カメラモニタ430に表示されている。また、この表示時刻の右側には、282/601と表示されているが、これは、全撮像枚数601に対する現在の画像データの順番(282枚目)を表している。ユーザは、カメラモニタ430において、時刻指定カーソル404aをドラッグして移動させることで、表示時刻及び現在の画像データの順番を更新させることができる。
このとき、時刻指定カーソル404aの移動に伴って、上述したラダーモニタ450における時刻指定カーソル404も連動して移動する。例えば、時刻指定カーソル404aを、表示時刻20XX/10/01の19:00:00に合わせた場合には、ラダーモニタ450における時刻指定カーソル404も、表示時刻20XX/10/01の19:00:00の位置に追従して移動する。そして、時刻指定カーソル404の移動に伴って、ラダーモニタ450におけるデバイス値も更新される。ここでは時刻指定カーソル404aを移動させたが、逆も同様である。例えば、ラダーモニタ450における時刻指定カーソル404を移動させると、それに応じて、カメラモニタ430における時刻指定カーソル404aも移動する。このような処理動作が可能になるのは、プログラム表示モジュール321と、画像表示モジュール323とが、再生制御モジュール324を介して表示時刻に関する同期制御を実行しているからである。
また、図35Bにおいて、右下欄には、ユニットモニタ440が表示されている。例えば、図10Aを用いて説明したように、ユニットモニタ440は、モーションユニットにおけるバッファメモリ(UG)のデバイス値を表示する。より具体的には、ログ表示部61のユニット表示モジュール325は、再生制御モジュール324から現在再生すべき表示時刻を受け取ると、その時刻と対応付けられたデバイス値をメモリカード36から読み出して、ユニットモニタ440に表示させる。したがって、例えば図35Bでいえば、表示時刻20XX/10/01の18:52:54と対応付けられたデバイス値の一覧が、ユニットモニタ440に表示される。
図35Cは、ログ再生モードにおけるGUIを表示するためのデータソースを模式化した図である。図35Cに示すように、プロジェクト表示領域420は、プロジェクトデータ71に含まれるユニット構成、機能設定、プログラム構成、プログラム部品をメモリから読み出して、これらをツリー形式で表示する。ラダーモニタ450は、プログラム構成(どのようなプログラム部品からなるか)、プログラム部品をメモリから読み出して、ユーザによって指定されたプログラム部品を表示するとともに、ログデータ73から表示時刻に対応するデバイス値を読み出して表示する。カメラモニタ430は、ユニット構成(カメラモニタがあるか否か)と機能設定(カメラモニタの機能。例えば複数ポートある場合にはポート番号、撮像周期やゲイン設定など)などの情報に基づいて、ログデータ73から表示時刻に対応する画像データを読み出して表示する。ユニットモニタ440は、ユニット構成(どのようなユニットがあるか)と機能設定(モーションユニットであれば軸構成や軸制御など)などの情報に基づいて、ログデータ73から表示時刻に対応するデバイス値を読み出して表示する。
図35Bや図35Cから分かるように、再生制御モジュール324の機能によって、プログラム表示モジュール321、画像表示モジュール323、ユニット表示モジュール325を同期制御して、連携させることができる。なお、波形表示モジュール322の連携の詳細については後述する。
ここで、本実施形態では、現在のプロジェクトデータが、実際のトラブル発生時のプロジェクトデータ71と一致するか否かを検証できるようにしている。より具体的には、図35に示すプログラム表示モジュール321のうちの照合部334は、PLC1から出力されるプロジェクトデータ71(ユーザプログラム)の識別情報と、記憶装置22に記憶されているプロジェクトデータ71(ユーザプログラム)の識別情報とを照合し、照合結果を警告部335に出力する。警告部335は、PLC1から出力される、運転記録を保存した時のプロジェクトデータ71(ユーザプログラム)の識別情報と、記憶装置22に記憶されているプロジェクトデータ(ユーザプログラム)の識別情報とが不一致である場合に、警告を表示部7に表示させる。
例えば、警告部335は、図35Dに示すような警告画面470を表示部7に表示させる。具体例を挙げると、運転記録を保存した時のプロジェクトデータ71の識別情報と、現在の(リプレイ対象にしようとしている)プロジェクトデータの識別情報とは、不一致であると仮定する。例えば、プロジェクトデータをPLC1に転送した後、ユーザがそのプロジェクトデータ(プログラムや機能設定など)を編集したような場合である。この場合に、ユーザ操作に基づいて、リアルタイム再生モードからログ再生モードに移行したとき、図35Dに示す警告画面470が表示される。
図35Dに示す警告画面470では、ユーザに対し、現在のプロジェクトデータをそのまま使用してログ再生を行うか、或いは、運転記録のプロジェクトを使用してログ再生を行うか、を選択させる。前者の場合には、ユーザは、現在のプロジェクトデータが、実際のトラブル発生時のプロジェクトデータ71とは異なることを認識した上で、ログ再生を行う。一方、後者の場合には、例えばユーザは、運転記録のプロジェクトが格納されている記憶装置22内のパス(フォルダやディレクトリ)を指定することで、運転記録のプロジェクトを使用してログ再生を行うことができる。
なお、本実施形態では、2つのプロジェクトデータの識別情報を比較して、一致・不一致を検証することとした。より詳細には、プロジェクトデータに含まれるプログラム構成、複数のプログラム部品、ユニット構成、ユニット毎に機能設定に対し、それぞれ識別情報が付加されており、それら全てが一致するか否かにより検証することとした。しかし、本発明はこれに限られず、少なくとも、複数のプログラム部品から構成されるユーザプログラムの識別情報を比較して、一致・不一致を検証すればよい。
●波形表示モジュール
図36Aは波形表示モジュール322の詳細を示している。時刻UI330bは、ユーザプログラムとともに表示されるデバイスの取得時刻(表示時刻)を操作するためのUI(例:スライドバーなど)を提供する。図28に示されているように、時刻UI330bは、基本的に、再生制御モジュール324から提供される表示時刻にしたがってバー103を左から右へ移動させる。ただし、時刻UI330bは、操作部8を通じたバー103の操作を受け付け、表示時刻制御部331bを通じて再生制御モジュール324にバー103の操作量を渡す。表示時刻制御部331bは時刻UI330bにより指定された表示時刻を再生制御モジュール324に送出したり、再生制御モジュール324から通知された表示時刻を時刻UI330bに設定したりする。デバイス値取得部333bは、リアルタイム再生モードとログ再生モードとを有している。デバイス値取得部333bは、リアルタイム再生モードにおいて、PLC1のリアルタイム送信部304にアクセスし、デバイス値を取得し、波形表示部336に渡す。デバイス値取得部333bは、ログ再生モードにおいて、再生制御モジュール324にアクセスし、表示時刻とデバイス値を取得し、波形表示部336に渡す。図28に示したように、波形表示部336は、デバイス値取得部333bにより取得されたデバイス値を波形化して表示部7に表示する。デバイス値を波形化は必須ではなく、デバイス値は数値のまま表示されてもよい。図28に示したように、画像表示モジュール323は再生制御モジュール324から出力される画像データを表示部7に表示する。なお、上述したように、画像表示モジュール323は、波形表示モジュール322の一機能として実現されてもよいが、図34に示すように、画像表示モジュール323(カメラモニタ)として別機能であってもよい。
図36Bは、波形表示モジュール322等によって表示部7に表示されるGUIの一例を示す模式図である。特に、波形表示モジュール322によって表示されるGUIは、右下のポップアップウィンドウで表示された、いわゆるリアルタイムチャートモニタ460である。
図36Bにおいて、左欄のプロジェクト表示領域420、中央のプログラム表示領域410(ラダーモニタ450)、右上欄の画像表示領域(カメラモニタ430)は、図35Bに示したものと同様である。つまり、プログラム表示モジュール321や画像表示モジュール323によって、これらの表示がなされる。なお、図36Bでは、ユニット表示モジュール325によるユニットモニタ440は表示を省略しているが、これが表示されていてもよい。
図36Bに示すリアルタイムチャートモニタ460について、その概要は、図28を用いて説明したとおりである。図36Bでは、リレーデバイスR000の波形データと、データメモリDM100の波形データとがメモリから読みだされ、表示されている。リアルタイムチャートモニタ460に表示させるべきデバイスは、図示しない設定画面を通じて、ユーザは自由に加減させることができる。
リアルタイムチャートモニタ460の下方には、時刻指定カーソル404b(図28に示すバー103に相当。再生位置カーソルと呼んでもよい)が表示されており、ユーザは、この時刻指定カーソル404bの位置をクリックして移動させることができるようになっている。このとき、時刻指定カーソル404bの位置が移動すると、再生制御モジュール324の機能によって、ラダーモニタ450における時刻指定カーソル404、カメラモニタ430における時刻指定カーソル404aが、連動して移動するようになっている。具体的には、図36Bにおいて、リアルタイムチャートモニタ460の波形表示領域における横軸はスキャン回数(時刻に切り替え表示してもよい)を示しているが、ユーザが時刻指定カーソル404bをクリックして所定のスキャン回数の位置へスライド移動させると、ラダーモニタ450における時刻指定カーソル404及びカメラモニタ430における時刻指定カーソル404aは、それぞれ、そのスキャン回数に対応する表示時刻の位置へ移動する。そして、移動後の表示位置に対応するデバイス値や画像データが表示される。もちろん、逆も同様である。すなわち、ラダーモニタ450における時刻指定カーソル404又はカメラモニタ430における時刻指定カーソル404aをクリックして所望位置へスライドさせると、時刻指定カーソル404bも、その所望位置に対応するスキャン回数の位置へと移動する。このとき、時刻指定カーソル404又は時刻指定カーソル404aを一定量以上動かすと、時刻指定カーソル404bが示す位置が、現在のリアルタイムチャートモニタ460の表示範囲外となるが、本実施形態では、この位置が常に表示範囲内になるよう、表示範囲が追従していく。
ここで、図36Bに示すように、リアルタイムチャートモニタ460においては、時刻指定カーソル404bは、波形表示エリアに重畳表示された縦線と、その縦線の下端に付加された三角印の図形と、から構成されているが、さらに、この時刻指定カーソル404bの下方には、表示エリアバー404cが表示されている。表示エリアバー404cの中央には、現在位置を示す四角のインジケータが表示されている。ユーザは、このインジケータをドラッグして左右に動かすことで、リアルタイムチャートモニタ460に表示される範囲を変更することができる。そして、ユーザは、この表示エリアバー404cを上手く活用することで、トラブル原因を追究するトラブルシューティングを行うことができる。この点につき、図36Cを用いてより詳細に説明する。
図36Cは、リアルタイムチャートモニタ460で表示される表示範囲と時刻指定カーソル404bとの関係性を説明するための説明図である。
図36Cでは、リアルタイムチャートモニタ460には、リレーデバイスR000及びR001、データメモリDM100及びDM101が表示されるものとする。図36Cでは、説明の便宜上、各デバイスについて15個分(黒丸)のデバイス値がリアルタイムチャートモニタ460に表示されているものとする。また、これらのデバイス値のうち、各デバイスについて特定の一時刻に対応するデバイス値が、時刻指定カーソル404bによって指定されたデバイス値となる。図36Cでは、リアルタイムチャートモニタ460で表示される範囲の中央の時刻に対応するデバイス値となっている。ユーザは、時刻指定カーソル404bをドラッグして、例えば右方向へ移動させると、上述した時刻指定カーソル404や時刻指定カーソル404aと同様に、時刻指定カーソル404bが表示範囲内に収まるように、表示範囲が追従していく。一方で、ユーザは、表示エリアバー404cの四角インジケータをドラッグして、例えば右方向へ移動させると、リアルタイムチャートモニタの表示範囲が右方向に移っていき、一定量だけ移ると(デバイス値8個分だけ右へ移ると)、時刻指定カーソル404bが非表示となる。しかし、本実施形態では、時刻指定カーソル404bが非表示になっても、トラブルシューティングしやすいように、波形表示領域の所望位置をダブルクリックすることで、時刻指定カーソル404bが、その所望位置にジャンプするようになっている。言い換えると、図36Aに示す波形表示部336は、波形表示領域においてユーザから所望位置の指定を受け付けて、受け付けた指定位置に時刻指定カーソル404bを移動させる機能を有している。
図36Cに示すGUIを使ったトラブルシューティングの手順(一例)について、より具体的に説明する。
(1)ユーザは、まず、リアルタイムチャートモニタ460の表示エリアバー404cにおいて、四角インジケータをドラッグして左右に移動させることで、波形表示領域に表示されたデバイス波形を視認しながら、トラブルの原因究明に役立ちそうな時刻を探す。このとき、上述したように、時刻指定カーソル404bは、リアルタイムチャートモニタ460の表示範囲から非表示になってもよい。
(2)デバイス波形のうち、異常なデバイス値をとる時刻が見つかったら、波形表示領域において、その時刻をダブルクリックする。そうすると、時刻指定カーソル404bがその時刻にジャンプするとともに、ラダーモニタ450における時刻指定カーソル404、及び、カメラモニタ430における時刻指定カーソル404aが、いずれもその時刻にジャンプする。
(3)その結果、再生制御モジュール324によって、ラダーモニタ450では、その時刻に対応するデバイス値が表示され、カメラモニタ430では、その時刻に対応する画像データが表示される。したがって、ユーザは、これらのデバイス値や画像データを視認しながら、トラブルの原因を究明していくことができる。
●再生制御モジュール324
図37は再生制御モジュール324の詳細を示している。デバイス値提供部341は、ログデータ取得部344によりログデータ73から取得されたデバイス値をプログラム表示モジュール321と波形表示モジュール322とに提供する。また、デバイス値提供部341は、ユニット表示モジュール325にも、ログデータ73から取得されたデバイス値を提供する。なお、ログデータ73から取得されたデバイス値は一時的にログデバイス345に格納されてもよい。プログラム表示モジュール321と波形表示モジュール322のデバイス値取得部333はデバイス値提供部341にデバイス値を要求する。デバイス値取得部333はログデバイス345からデバイス値を取得し、デバイス値取得部333に送信する。時刻デバイス342は再生制御部343により設定された表示時刻を保持するデバイスである。時刻デバイス342に保持されているデバイス値(時刻情報)もデバイス値提供部341がデバイス値取得部333へ送信してもよい。あるいは、再生制御部343が表示時刻制御部331a、331bに時刻情報を提供してもよい。再生制御部343は、表示時刻を計時するための仮想的な内部時計を有し、この内部時計にしたがって時刻デバイス342に保持されている時刻情報を更新する。再生制御部343は、表示時刻制御部331a、331bに時刻デバイス342に保持されている時刻情報を送信する。再生制御部343は、表示時刻制御部331a、331bから表示時刻の指定を受信すると、受信した表示時刻を内部時計に設定する(時刻合わせ)。よって、表示時刻制御部331aから表示時刻が指定されると、この表示時刻は再生制御部343を介して表示時刻制御部331bに伝達される。同様に、表示時刻制御部331bから表示時刻が指定されると、この表示時刻は再生制御部343を介して表示時刻制御部331aに伝達される。これによりプログラム表示モジュール321の表示時刻と波形表示モジュール322の表示時刻とが同期する。スロー再生、早送り再生、巻き戻し再生などを実現するために、再生制御部343は、操作部8からのユーザ入力にしたがって内部時計の更新速度を変更する。再生制御部343は、ログデータ73に含まれている最も古いレコードの時刻情報を内部時計の初期値に設定してもよい。ログデータ取得部344は時刻デバイス342に保持されている表示時刻に関連付けられているデバイス値をログデータ73から取得して、デバイス値提供部341に渡す。
同様にして、再生制御部343は、プログラム表示モジュール321の表示時刻と波形表示モジュール322の表示時刻に加えて、画像表示モジュール323やユニット表示モジュール325の時刻を同期させるようにしてもよい。
なお、本実施形態では、ログ再生モードにおいて、プログラム表示モジュール321、波形表示モジュール322、画像表示モジュール323、ユニット表示モジュール325の各表示時刻を常に同期させることとしたが、本発明はこれに限られず、例えば、同期させるか否かをユーザが選択できるようにしてもよい。例えば、各モニタ画面上に同期有無のチェックボックスを設け、デフォルトでチェック有の状態にしてもよい。そして、ユーザは、同期したくないモジュールについて、チェックを外すことにより、そのモジュールについてだけ同期させないことも可能である。このように、ログ表示部61は、再生制御モジュールによって同期制御(追従制御)されるモジュールを選択する、選択機能を有していてもよい。
<プログラムの表示UI>
図38はプログラム表示モジュール321によって提供される表示UI400を示している。図35Bや図36Aで説明した表示UI400を別の観点から、更に詳述する。プログラム表示領域410は、プロジェクトデータ71のユーザプログラムを表示する領域である。この例ではプログラム表示領域410はラダープログラム(ラダー図)を表示している。プログラム表示部332は、ユーザプログラムに使用または記述されているデバイスのデバイス値をデバイス値取得部333aにより取得し、ユーザプログラムとともに表示する。たとえば、プログラム表示部332は、リレーデバイスがONであればONを示すアイコン401aをユーザプログラム上に重ねて表示してもよい。プログラム表示部332は、リレーデバイスがOFFであればOFFを示すアイコン401bをユーザプログラム上に重ねて表示してもよい。プログラム表示部332は、出力系のデバイスであるDM100のデバイス値をデバイス値取得部333aにより取得し、ユーザプログラムにおけるDM100の記述と重ねて表示してもよい。この例では、DM100の記述の下にデバイス値の表示領域403が設けられている。プログラム表示部332は表示領域403にデバイス値を表示する。なお、再生制御モジュール324は表示時刻の更新とともにデバイス値も更新するため、プログラム表示部332は、ユーザプログラムとともに表示されているデバイス値を更新する。時刻UI330aは時刻デバイス342から取得した表示時刻に応じて時刻指定カーソル404を右から左へ移動させる。時刻指定カーソル404はポインタ101によりドラッグ可能である。時刻指定カーソル404がポインタ101によりドラッグされたことを時刻UI330aが検知すると、表示時刻制御部331aは再生制御部343に表示時刻の更新を停止させ、時刻指定カーソル404のドラッグ量を再生制御部343に通知する。再生制御部343は、ドラッグ量に応じて内部時計のカウント値(表示時刻)を調整する。時刻UI330aは、表示時刻の更新速度(例:・・・、2.0倍、1.0倍、0.5倍、0.1倍、・・・)を速度指定部405に表示してもよい。なお、速度指定部405は、複数の更新速度のリストを表示し、そのうちの一つの更新速度を選択可能なプルダウメニューによって実現されてもよい。時刻UI330aは、速度指定部405に対するポインタ101によるクリックを検知すると、このようなプルダウメニューを表示し、更新速度の選択を受け付けてもよい。再生ボタン406はデバイス値の時系列的な表示を指示するためのボタンである。時刻UI330aは再生ボタン406がポインタ101によりクリックされたことを検知すると、表示時刻制御部331aに表示時刻の更新を開始するよう再生制御部343に指示する。この指示はデバイス値の表示の開始の指示または表示の再開の指示に相当する。ワンステップ逆再生ボタン407は、表示時刻をワンステップずつ更新(巻き戻し)しながらデバイス値を時系列的に表示することを指示するためのボタンである。時刻UI330aはワンステップ逆再生ボタン407がポインタ101によりクリックされたことを検知すると、表示時刻制御部331aに表示時刻を一ステップ戻すように指示する。ワンステップ再生ボタン408は、表示時刻をワンステップずつ更新しながらデバイス値を時系列的に表示することを指示するためのボタンである。時刻UI330aはワンステップ再生ボタン408がポインタ101によりクリックされたことを検知すると、表示時刻制御部331aに表示時刻を一ステップ進めるように指示する。なお、ワンステップ再生が実行されているときは、ワンステップ逆再生ボタン407またはワンステップ再生ボタン408が操作されない限り、再生制御部343は表示時刻を更新しない。ワンステップ再生が実行されているときに、再生ボタン406が操作されると、再生制御部343は速度指定部405により指定された更新速度で表示時刻の更新を再開する。時刻表示領域409は時刻デバイス342に保持されている表示時刻を表示する領域である。表示時刻制御部331aは、時刻デバイス342から取得された表示時刻を時刻表示領域409に表示する。
<HMIのエミュレータ>
PLC1はHMIと呼ばれる外付けの表示装置を接続可能である。HMIはタッチパネル式の入力装置を有していてもよい。HMIはPLC1のデバイス部34に保持されているデバイス値を読み出して表示装置に表示する。プロジェクト作成部50はHMIに表示されるUIと、UIに表示されるデバイス値を設定し、プロジェクトデータ71に保存する。デバッグ部314は、HMIのエミュータを有しており、プロジェクトデータ71にしたがってエミュータを動作させることで、HMIの動作を確認する。ログ表示部61は、HMIのエミュレータに対してログデータ73のデバイス値を供給する。HMIのエミュレータは、時系列的に提供されたデバイス値をUIに表示する。
図39はHMIのエミュレータのUI490を示している。この例では、HMIのエミュレータはプログラム表示モジュール321に含まれている。プログラム表示部332は、再生制御部343により提供されるデバイス値をUI490の表示領域に反映させる。UI490は、時刻指定カーソル404や再生ボタン406など、UI400に含まれている再生制御に関連した時刻制御オブジェクトを有していてもよい。UI490における時刻制御オブジェクトの操作は再生制御部343を通じてUI400や図28に示されたUIに反映される。たとえば、UI490において時刻指定カーソル404が左に操作されると、再生制御部343から提供される表示時刻に連動して、UI400の時刻指定カーソル404も左に移動し、図28に示されたバー103も左に移動する。また、図28に示されたバー103が左に操作されれば、再生制御部343から提供される表示時刻に連動して、UI400、450の時刻指定カーソル404も左に移動する。これらはいずれも時刻デバイス342に保持されている同一の表示時刻に同期しているからである。
<ログ表示に関するフローチャート>
●プログラム表示モジュール
図40はプログラム表示モジュール321によって実行される表示処理を示している。なお、S50、S51およびS60はPLC1からプロジェクトデータ71を取得できない場合にのみ実行されてもよい。PLC1からプロジェクトデータ71を取得できる場合、PLC1からプロジェクトデータ71が使用される。PLC1からプロジェクトデータ71を取得できない場合、PC2に保持されているプロジェクトデータ71が使用される。
S50でCPU21(照合部334)はPLC1に保持されているプロジェクトデータ71の識別情報と、PC2に保持されているプロジェクトデータ71の識別情報とを取得する。
S51でCPU21(照合部334)はPLC1に保持されているプロジェクトデータ71の識別情報と、PC2に保持されているプロジェクトデータ71の識別情報とが一致するかどうかを判定する。両者が一致しなければ、CPU21はS60に進む。S60でCPU21(警告部335)はPLC1に保持されているプロジェクトデータ71の識別情報と、PC2に保持されているプロジェクトデータ71の識別情報とが一致しないことを示す警告を表示部7に表示する。両者が一致する場合、CPU21はS52に進む。
S52でCPU21(プログラム表示部332)はPLC1または記憶装置22からプロジェクトデータ71を取得する。
S53でCPU21(プログラム表示部332)は操作部8から入力された情報に基づきログ再生モードが選択されているのか、それともリアルタイム再生モードが選択されているのかを判定する。リアルタイム再生モードが選択されていれば、CPU21はS58に進む。S58でCPU21(デバイス値取得部333a)は再生制御モジュール324を介さずにPLC1のリアルタイム送信部304からデバイス値を取得する。S59でCPU21(プログラム表示部332)はプロジェクトデータ71に含まれるユーザプログラムとともにデバイス値を表示部7に表示する。ログ再生モードが選択されていれば、CPU21はS54に進む。
S54でCPU21(デバイス値取得部333a)は再生制御モジュール324を起動し、再生制御モジュール324から表示時刻とログデータ73のデバイス値と取得する。
S55でCPU21(プログラム表示部332)はプロジェクトデータ71に含まれるユーザプログラムとともにデバイス値と表示時刻を表示部7に表示する。
S56でCPU21(表示時刻制御部331a)は時刻UI330aにより時刻指定が検知されたかどうかを判定する。上述したように時刻指定は時刻指定カーソル404の操作によって実行される。時刻指定が検知されていなければ、CPU21はS54に戻る。時刻指定が検知されていれば、CPU21はS57に進む。
S57でCPU21(表示時刻制御部331a)は再生制御モジュール324の再生制御部343に、時刻指定カーソル404により入力された指定時刻を通知する。CPU21はS54に戻る。
●波形表示モジュール
図41は波形表示モジュール322によって実行される表示処理を示している。
S61でCPU21(波形表示部336)は操作部8から入力された情報に基づきログ再生モードが選択されているのか、それともリアルタイム再生モードが選択されているのかを判定する。リアルタイム再生モードが選択されていれば、CPU21はS66に進む。S66でCPU21(デバイス値取得部333b)は再生制御モジュール324を介さずにPLC1のリアルタイム送信部304からデバイス値を取得する。S67でCPU21(波形表示部336)はデバイス値を表示部7に表示する。ログ再生モードが選択されていれば、CPU21はS62に進む。
S62でCPU21(デバイス値取得部333b)は再生制御モジュール324を起動し、再生制御モジュール324からデバイス値と表示時刻を取得する。
S63でCPU21(波形表示部336)はデバイス値と表示時刻を表示部7に表示する。
S64でCPU21(表示時刻制御部331b)は時刻UI330bにより時刻指定が検知されたかどうかを判定する。上述したように時刻指定はバー103によって実行される。時刻指定が検知されていなければ、CPU21はS62に戻る。時刻指定が検知されていれば、CPU21はS65に進む。
S65でCPU21(表示時刻制御部331b)は再生制御モジュール324の再生制御部343に、バー103により入力された指定時刻を通知する。CPU21はS62に戻る。
●再生制御モジュール
図42は再生制御モジュール324によって実行される再生制御を示している。
S71でCPU21(ログデータ取得部344)はPLC1からログデータ73を取得し、記憶装置22に格納する。
S72でCPU21(再生制御部343)は内部時計の時刻を初期化する。
S73でCPU21(再生制御部343)は内部時計の時刻を取得し、時刻を時刻デバイス342に格納する。
S74でCPU21(再生制御部343)は時刻デバイス342に保持されている表示時刻に対応するデバイス値をログデータ73から取得し、ログデバイス345に格納する。これにより、デバイス値提供部341はプログラム表示モジュール321や波形表示モジュール322に対してデバイス値と表示時刻とを提供可能となる。
S75でCPU21(再生制御部343)は表示時刻制御部331から時刻指定を受信したかどうかを判定する。時刻指定を受信していれば、CPU21はS76に進む。時刻指定を受信していなければ、CPU21はS77に進む。
S76でCPU21(再生制御部343)は表示時刻制御部331からの時刻指定にしたがって内部時計の時刻を変更する。
S77でCPU21(再生制御部343)は表示時刻制御部331から更新速度の変更指示を受信したかどうかを判定する。変更指示を受信していれば、CPU21はS78に進む。変更指示を受信していなければ、CPU21はS73に進む。
S78でCPU21(再生制御部343)は表示時刻制御部331から指定された更新速度にしたがって内部時計の更新速度を変更する。その後、CPU21はS73に進む。
<プログラム部品の絞り込み>
PC2はログ設定に際してロギング対象となるデバイスを抽出したり、ログを表示する際に特定のデバイスに関連した他のデバイスを抽出したりする。この抽出処理を説明するために、以下のような例が採用される。
図43はラダープログラムを構成する複数のモジュールを示している。この例では、次のようなPLC1が想定されている。ワークが搬送ベルトにより搬送される。ワーク検知センサがワークを検知すると、高さセンサがワークの高さを計測し、奥行センサがワークの奥行を計測する。ワークの高さが所定範囲内になければ、測定NGと判定される。同様に、ワークの奥行が所定範囲内になければ、測定NGと判定される。図43にはこれらの一連の処理を実現するためのプログラムモジュールが記載されている。各モジュールは接点系命令(入力系命令)と出力系命令とを含む。接点系命令は、出力系命令を実行するための条件である。
ワーク検知モジュールB1においてデバイスMR000はワークを検知するとONとなるリレーデバイスである。デバイスMR0002PLC1が自動運転中である場合にONとなるリレーデバイスである。デバイスMR001は、拡張ユニット4に測定開始を指示するためのリレーデバイスである。デバイスMR000は、自動運転中にワークが検知されると、ONとなる。
測定モジュールB2において接点系命令にはMR001がONになると、出力系命令を実行することが記述されている。この例では、拡張ユニット4により取得された高さの計測値がデバイスEM0に格納されており、これをデバイスTM100にコピーすることが記述されている。同様に、拡張ユニット4により取得された奥行の計測値がデバイスEM2に格納されており、これをデバイスTM101にコピーすることが記述されている。さらに、測定完了を管理するためのデバイスMR003がONに設定される。
判定モジュールB3は、デバイスMR003がONになると、つまり測定が完了されると実行されるモジュールである。ここでは、測定結果が合格条件を満たさなければ、デバイスMR010がONになる。これは測定NGを意味する。より具体的には、デバイスTM100に格納されている高さの計測値が95未満であれば、MR010がONになる。デバイスTM100に格納されている高さの計測値が105を超えていれば、MR010がONになる。デバイスTM101に格納されている奥行の計測値が35未満であれば、MR010がONになる。デバイスTM100に格納されている奥行の計測値が45を超えていれば、MR010がONになる。
エラー処理モジュールB4は何らかのエラーが発生すると、搬送ベルトの搬送を停止するためのモジュールである。この例では、MR010がON(測定NG)になるか、または、MR012がON(強制停止)になるか、または、MR013がON(搬送NG)になると、MR011がオン(搬送停止)になる。
図43からわかるように、あるモジュールの接点系命令に記述されているデバイスは、他のモジュールの出力系命令に記述されている。逆に、あるモジュールの出力系命令に記述されているデバイスは、他のモジュールの接点系命令に記述されている。たとえば、ワーク検知モジュールB1の出力系命令に記述されているデバイスMR001は、測定モジュールB2の接点系命令に記述されている。よって、ワーク検知モジュールB1と測定モジュールB2とは相互に関連したモジュールとして抽出される。次に、測定モジュールB2の出力系命令に記述されているデバイスMR003に着目すると、MR003は判定モジュールB3の接点系命令に記述されていることがわかる。よって、測定モジュールB2と判定モジュールB3とは相互に関連したモジュールとして抽出される。次に、判定モジュールB3の出力系命令に記述されているデバイスMR010に着目すると、MR010はエラー処理モジュールB4の接点系命令に記述されていることがわかる。よって、判定モジュールB3とエラー処理モジュールB4とは相互に関連したモジュールとして抽出される。このようにある特定処理に関与する複数のモジュールと、複数のモジュールの内部に記述されている複数のデバイスが抽出される。これらの抽出処理はデバイス抽出部53によって実行される。デバイス抽出部53は、ログ表示部61に実装されてもよい。つまり、ログ表示部61は、相互に関連した複数のモジュールを抽出し、さらに、抽出された複数のモジュールに記述されている複数のデバイスを抽出し、抽出された複数のデバイスの各デバイス値をログデータ73から取得して、表示部7に表示してもよい。
図44は抽出結果を表示するUI500を示している。ログ表示部61やデバイス抽出部53は、ユーザプログラムから抽出されたデバイスとブロック(プログラム部品)とを表示するUI500を作成し、表示部7に表示してもよい。UI500はデバイスとプログラム部品の抽出結果を簡易に表示することができる。よって、ユーザは、抽出結果の全体像を把握しやすいであろう。ログ表示部61やデバイス抽出部53は、UI500に含まれているいずれかブロックがポインタ101によりクリックされると、クリックされたブロックの詳細をUI501に表示してもよい。これにより、ユーザは抽出されたブロックの詳細に迅速にアクセスできるようになろう。ログ表示部61やデバイス抽出部53は、図43に例示されたUIを使用して抽出結果を表示してもよい。
<ブロックおよびデバイスの抽出処理>
図45はデバイス抽出部53が実行するブロックおよびデバイスの抽出処理を示している。ここではプロジェクトデータ71には、複数のブロック(プログラム部品)が含まれている。よって、デバイス抽出部53はプロジェクトデータ71を参照し、ブロックやデバイスを抽出する。
S81でCPU21(デバイス抽出部53)は操作部8を通じたブロックの選択を受け付ける。なお、デバイス抽出部53は操作部8を通じたデバイスの指定を受け付けてもよい。この場合、デバイス抽出部53は、指定されたデバイスを記述している一つ以上のブロックを抽出してもよい。複数のブロックが抽出された場合、デバイス抽出部53は、複数のブロックから一つのブロックについてのユーザ選択を受け付けてもよい。このようなデバイスとしては、たとえば、デバッグにおいてユーザが着目するデバイスであろう。ユーザはログ設定部51を通じて、PLC1の出力部84にログデータ73を出力するための条件(例:保存トリガ)を設定する。より具体的には、特定のリレーデバイスがオンになったことなどを条件として設定する。よって、デバイス抽出部53は、保存トリガーとして設定されたリレーデバイスを指定してもよい。
S82でCPU21(デバイス抽出部53)は選択されたブロックの接点系命令に記述されているデバイスを抽出する。
S83でCPU21(デバイス抽出部53)は抽出されたデバイスを出力系命令に記述されている他のブロックを検索する。
S84でCPU21(デバイス抽出部53)は抽出されたデバイスを出力系命令に記述されている他のブロックが発見されたかどうかを判定する。他のブロックが発見されなければ、CPU21は抽出処理を終了する。他のブロックが発見されると、CPU21はS85に進む。
S85でCPU21(デバイス抽出部53)は発見されたブロックを関連ブロックとして抽出する。たとえば、デバイス抽出部53は、関連ブロックを管理するためのリストに、発見されたブロックの識別情報(例:名称やファイル名など)を登録する。
S86でCPU21(デバイス抽出部53)はデバイスを抽出されるブロックとして関連ブロックを選択する。その後、新たに選択されたブロックについて抽出処理を実行するために、CPU21はS82に戻る。S86で、選択される関連ブロックは、まだデバイス抽出対象として選択されたことがないブロックである。リストに登録されているすべてのブロックについてデバイス抽出処理が完了していれば、デバイス抽出部53は抽出処理を終了する。CPU21(デバイス抽出部53)は、抽出したデバイスと、当該デバイスを抽出されたブロックとの関係を示すリストを作成してもよい。デバイス抽出部53またはログ表示部61はこれらのリストを参照し、図43に示されたUIや、図44に示されたUI500、501を作成してもよい。
<デバッグの具体例>
図46はユーザが実行するデバッグ処理を示している。
S91でユーザはログ設定部51を通じてログデータ73の保存条件としてNG判定を設定する。図43によれば、NG判定を管理するデバイスMR010がONになったことがログデータ73の保存条件に決定される。ユーザはプロジェクトデータ71とログ設定データ72をPLC1に転送する。
S92でユーザはPLC1を稼働させる。PLC1はプロジェクトデータ71を実行し、ログ設定データ72における保存条件が満たされるとログデータ73をメモリカード36に保存する。図43に示された例ではNG判定が発生すると、搬送ベルトが停止するため、ユーザは何らかのエラーが発生したことを知る。
S93でユーザはワークを確認し、NG判定が誤検知かどうかを判断する。たとえば、ユーザはワークの高さや奥行を実測し、合格条件を満たしているかどうかを判断する。ワークが合格条件を満たしていなければ、ユーザはNG判定を誤検知と判断する。
S94でユーザはPLC1からメモリカード36を取り外し、メモリカード36をPC2に接続し、メモリカード36に保存されているログデータ73を再生する。プログラム表示モジュール321はログデータ73に含まれているデバイス値をユーザプログラムと関連付けて表示する。より具体的には、プログラム表示モジュール321は、保存条件として採用されたデバイスMR010を指定し、デバイス抽出部53にブロックとデバイスの抽出処理を実行させ、図43に示されたUIや、図44に示されたUI500、501を表示する。さらに、波形表示モジュール322は、プログラム表示モジュール321により表示されているデバイス値を波形化して表示する。たとえば、EM0に保持されているワークの高さの計測値やEM2に保持されているワークの奥行が波形化されて表示部7に表示される。また、ワーク検知を管理するデバイスMR000のデバイス値も波形化されて表示される。ユーザはこれらの波形を観察し、ワーク検知センサのチャタリングが誤検知の原因であることを突き止める。ユーザは、チャタリング対策のために編集部311を操作し、図47が示すようにワーク検知モジュールB1を修正する。この修正によれば、ワーク検知センサにより1秒以上にわたり連続してワークが検知されたときに、測定開始のためのデバイスMR001がオンになる。ユーザは、更新されたプロジェクトデータ71をPLC1に転送し、PLC1を稼働させ、チャタリング対策が成功したかどうかを判断する。
このようにユーザプログラムとデバイス値の波形とを同期して表示することで、誤検知の原因の特定と、原因を解消するためのユーザプログラムのデバッグとをユーザは効率よく実行できるようになる。
<まとめ>
図17に示したように実行部80はユーザプログラムを繰り返し実行するプログラム実行部の一例である。デバイス部34はプログラム実行部により参照される記憶領域である複数のデバイスを有するデバイス記憶部の一例である。記録部81は複数のデバイスのいずれかに記憶されているデバイス値を時系列に記録するデバイス記録部の一例である。PC2はプログラマブルロジックコントローラに接続され、ユーザプログラムの作成を支援するプログラム作成支援装置の一例である。
図6に示したようにプロジェクト作成部50は、表示部7を介したユーザ入力に基づいて、ユーザプログラムを構成する複数のプログラム部品であって複数のデバイスのいずれかに関する命令語を含むプログラム部品を作成するプログラム作成部の一例である。部品指定部52は、複数のプログラム部品のうちデバイス記録部による記録対象となる特定のデバイスを抽出されるプログラム部品を指定するプログラム部品指定部の一例である。デバイス抽出部53はプログラム部品指定部により指定されたプログラム部品を解析して当該プログラム部品に記述されているデバイスを抽出するデバイス抽出部の一例である。基本ユニット3の記録部81は、デバイス抽出部により記録対象として抽出された特定のデバイスに記憶されているデバイス値を時系列に記録するように構成されている。
このようにユーザはプログラム部品を指定することで、指定されたプログラム部品からデバイスが抽出される。また、ユーザは、特定のプログラム部品を、デバイスの抽出対象から除外することもできる。よって、PLCにおいてロギングの対象となるデバイスのユーザによる登録負担が軽減される。
なお、抽出部53はプログラム作成部63により作成されたプログラム部品を解析して、当該プログラム部品に記述されているデバイスを抽出してもよい。部品指定部52は、プログラム作成部63により作成された複数のプログラム部品のうち、記録部81の記録対象となる特定のデバイスが使用または記述されたプログラム部品を、プログラム部品を単位として(プログラム部品ごとに)指定してもよい。この場合、記録部81は、抽出部53により抽出されたデバイスであって、かつ、部品指定部52により指定されたプログラム部品に使用または記述される特定のデバイスに記憶されているデバイス値を時系列に記録する。
抽出部53は、プログラム作成部63により作成された複数のプログラム部品を解析して、各プログラム部品ごとに使用または記述されているデバイスを抽出してもよい。部品指定部52は、プログラム作成部63により作成された複数のプログラム部品のうち少なくとも一つのプログラム部品を指定してもよい。記録部81は、抽出部53により解析された複数のプログラム部品のうち、部品指定部52により指定されたプログラム部品に使用または記述されるデバイスに記憶されているデバイス値を時系列に記録する。たとえば、予め複数のプログラム部品が解析されて、複数のデバイスが抽出されてもよい。つまり、各プログラム部品ごとに、抽出されたデバイスを示すリストが作成されてもよい。さらにユーザがいずれかのプログラム部品を指定すると、指定されたプログラム部品についてのリストが読み出され、そのリストに掲載されているデバイスが記録対象として選択されてもよい。
部品指定部52は、プログラム作成部63により作成された複数のプログラム部品のうち少なくとも一つのプログラム部品を指定するように構成されていてもよい。抽出部53は、部品指定部52により指定されたプログラム部品を解析して、当該プログラム部品ごとに使用または記述されるデバイスを抽出してもよい。記録部81は、抽出部53により抽出された特定のデバイスに記憶されているデバイス値を時系列に記録する。このように、プログラム部品が指定された後でデバイスの抽出が実行されてもよい。これにより抽出処理が軽くなろう。
抽出部53は、プログラム作成部63により作成された複数のプログラム部品を解析して、各プログラム部品ごとに使用又は記述されるデバイスを抽出してもよい。部品指定部52は、プログラム作成部63により作成された複数のプログラム部品のうち記録対象または除外対象となる少なくとも一つのプログラム部品を指定してもよい。記録部81は、抽出部53により複数のプログラム部品から抽出されたデバイスのうち、部品指定部52により記録対象として指定されたプログラム部品に使用または記述されている特定のデバイスに記憶されているデバイス値を時系列に記録し、部品指定部52により除外対象として指定されたプログラム部品以外のプログラム部品に使用されているデバイスを記録するように構成されていてもよい。たとえば、モジュールAがデバイスメモリDM0、DM1を使用し、モジュールBがデバイスメモリDM1、DM2を使用する場合、モジュールA、BからデバイスメモリDM0、DM1、DM2が抽出される。ここで、モジュールBが除外対象として指定されると、DM2が除外されるものの、DM1はモジュールAでも使用されるため、DM1は記録対象として残る。このようにプログラム部品を単位として(つまりプログラム部品ごとに)、デバイスの加除が実行されてもよい。また、すべてのプログラム部品からデバイスが抽出された後で記録対象となるプログラム部品や除外対象となるプログラム部品が指定されてもよい。
部品指定部52は、複数のプログラム部品のうち、特定のデバイスを抽出されないプログラム部品を除外対象として指定するように構成されていてもよい。デバイス抽出部53は、部品指定部52によりデバイスの抽出対象として指定されたプログラム部品を解析して当該プログラム部品に使用または記述されるデバイスを抽出し、除外対象として指定されたプログラム部品からデバイスを抽出しないように構成されてもよい。つまり、削除部55や追加部54はデバイス抽出部により抽出された特定のデバイスのうち一部の特定のデバイスを、プログラム部品ごとに削除するか、または、デバイス抽出部により抽出されなかったデバイスをプログラム部品ごとに追加するデバイス加除部として機能してもよい。
プログラム部品は、たとえば、再利用可能なプログラムモジュールであってもよい。複数のプログラム部品は、それぞれ個別のファイルに格納されていてもよい。複数のプログラム部品は、それぞれ個別にアクセス権限(編集権限)が設定されてもよい。
ユーザプログラムは、たとえば、ラダープログラムであってもよい。この場合、複数のプログラム部品は、ラダープログラム内で使用または記述される複数のファンクションブロックであってもよい。
検知部82は、複数のデバイスのうちのいずれかのデバイスに対する外部機器からのデバイス値の書き換えを検知する検知部の一例である。記録部81は、検知部82によりデバイス値の書き換えが検知されたデバイスを記録対象に追加してもよい。
PLC1は、着脱可能なメモリカード36と、メモリカード36に対する命令を検知し、当該命令の対象となっているデバイスを特定する特定部57とをさらに有してもよい。図6においては特定部57がPC2に設けられているが、基本ユニット3のCPU31に実装されてもよい。記録部81は、特定部57により特定されたデバイスを記録対象に追加してもよい。
PLC1の拡張ユニット4は位置決め機能を有するモーションユニット(位置決めユニット)であってもよい。記録部81またはデバイス抽出部53は、位置決め機能に利用されるデバイスであってユーザプログラムにおいて記述されていないデバイス(例:モーションユニット内のバッファメモリなど)を記録対象に追加してもよい。
推定部59は、デバイス抽出部53により記録対象として抽出されたデバイスの数に基づき記録部81によるデバイス値の記録がユーザプログラムの実行に与える影響を推定する推定部の一例である。表示部7は、この影響を表示するように構成されていてもよい。これにより、ユーザは、スキャンタイムへの影響を加味しつつ、デバイスを加除することが可能となる。
図7においては、選択されたプログラム部品からのデバイスの抽出と、選択された機能からのデバイスの抽出と、ユーザによるデバイスの手動追加とが記載されている。しかし、これらのすべてが必須というわけではない。これらのうち二つ以上が採用されれば十分であろう。あるいは、選択されたプログラム部品からのデバイスの抽出だけが採用されてもよいし、選択された機能からのデバイスの抽出だけが採用されてもよい。
CPU31や実行部80は、ユーザプログラムを繰り返し実行するプログラム実行エンジンの一例である。CPU31や実行部80、CPU41は、ユーザプログラムからの指令に基づいて、各々がユーザプログラムに関する異なる機能(例:機能プログラム)を実行する複数の機能実行エンジンの一例である。これは、基本ユニット3が拡張ユニット4の機能を内包してもよいことを示唆している。機能プログラムは、たとえば、モーション制御プログラムである。プログラム実行エンジンや複数の機能実行エンジンは、単一のCPUにより実行されてもよいし、複数のCPUにより実行されてもよいし、ASICまたはFPGAにより実現されてもよい。また、単一のCPUがマルチコアを搭載しており、各コアがそれぞれ異なる機能を担当していてもよい。
デバイス部34はログラム実行エンジンと複数の機能実行エンジンにより参照される記憶領域である複数のデバイスを有するデバイス記憶部の一例である。記録部81は、複数のデバイスのいずれかに記憶されているデバイス値を時系列に記録するデバイス記録部の一例である。機能設定部62は、複数の機能実行エンジンの各々にて使用される複数のデバイスを割り付ける割付部として機能してもよい。機能指定部60は、複数の機能実行エンジンに対応する複数の機能のうち一つ以上の機能を指定する指定部として機能してもよい。デバイス抽出部53は、割付部により割り付けられた複数のデバイスから、指定部により指定された一つ以上の機能のために使用されるデバイスをデバイス記録部の記録対象として抽出してもよい。
プログラム実行エンジンは、メインユニットに設けられてもよい。複数の機能実行エンジンのうちの少なくとも一つは、メインユニットの機能を拡張するために該メインユニットと電気的に接続される機能拡張ユニットに設けられていてもよい。複数の機能実行エンジンのすべてがメインユニットに設けられてもよい。
基本ユニット3は、プログラム実行部と、デバイス記憶部と、デバイス記録部とを有するメインユニットの一例である。拡張ユニット4は、メインユニットの機能を拡張するために該メインユニットと電気的に接続される機能拡張ユニットの一例である。
機能設定部62は、表示部7を介したユーザ入力に基づいて、メインユニットの機能のために使用されるデバイスと、機能拡張ユニットの機能のために使用されるデバイスとを割り付ける割付部として機能する。機能設定部62は、機能に対してデバイスを割り付けるためのUIを表示部7に表示してもよい。
機能指定部60は、メインユニットに設けられた機能と機能拡張ユニットに設けられた機能とを含む複数の機能のうち一つ以上の機能を指定する指定部の一例である。デバイス抽出部53の追加部54は、指定部により指定された機能のために使用されるデバイスをデバイス記録部の記録対象として抽出する。デバイス抽出部53の削除部55は、指定部により指定された機能のために使用されるデバイスをデバイス記録部の記録対象から除外する。通信部23は、記録対象として抽出された特定のデバイスに記憶されているデバイス値を時系列にデバイス記録部に記録させるための設定データをPLC1に送信する送信部として機能する。記録部81は、デバイス抽出部53により記録対象として抽出されたデバイスに記憶されているデバイス値を時系列に記録するように構成されている。
プロジェクト作成部50は、表示部7を介したユーザ入力に基づいて、複数のデバイスのいずれかに関する命令語を含むユーザプログラムを作成するプログラム作成部として機能する。デバイス抽出部53は、ユーザプログラムを解析し、ユーザプログラムに使用または記述されているデバイスを抽出し、抽出されたデバイスを含むデバイスリスト(抽出リスト)を作成してもよい。さらに、デバイス抽出部53は、機能指定部60により記録対象(抽出対象)として指定された機能のために使用されるデバイスをデバイスリストに追加してもよい。また、削除部55は、機能指定部60により除外対象として指定された機能のために使用されるデバイスをデバイスリストから削除するように構成されていてもよい。デバイスリストはログ設定データ72に含まれている。記録部81は、デバイスリストに登録されているデバイスに記憶されているデバイス値を時系列に記録するように構成されている。
機能指定部60は、さらに、メインユニットと機能拡張ユニットとのうちのいずれかユニットを指定するように構成されていてもよい。つまり、機能が選択されてもよいし、ユニットが選択されてもよい。一つのユニットが複数の機能を有している場合、ユーザは一つの機能を選択することで、そのユニットに含まれているすべての機能がデバイスの抽出対象として選択される。デバイス抽出部53は、機能指定部60により記録対象(抽出対象)として指定されたユニットのために使用されるデバイスをデバイス記録部の記録対象として抽出してもよい。また、デバイス抽出部53は、機能指定部60により除外対象として指定されたユニットのために使用されるデバイスをデバイス記録部の記録対象から除外するように構成されてもよい。このようにメインユニットと機能拡張ユニットを単位として抽出対象や除外対象が指定されてもよい。
図14が示すように、機能指定部60は、さらに、記録対象となるデバイスのデバイス種別または除外対象となるデバイスのデバイス種別を指定するように構成されていてもよい。デバイス抽出部53は、機能指定部60により記録対象として指定されたデバイス種別のデバイスをデバイス記録部の記録対象として抽出する。デバイス抽出部53は、指定部により除外対象として指定されたデバイス種別のデバイスをデバイス記録部の記録対象から除外するように構成されていてもよい。
図19を用いて説明されたように、収集部92aは複数のデバイスのいずれかに記憶されているデバイス値を収集し、当該デバイス値の収集時刻に関する情報と当該デバイス値とを関連付けて第一バッファに記憶する第一収集部の一例である。なお、収集対象のデバイス値は、ログ設定データ72によって予め設定されてもよい。リングバッファ91aは第一バッファの一例である。収集時刻に関する情報は、たとえば、時刻管理部83aから供給される時刻情報であってもよい。IF99a、99fは拡張ユニット4と通信する第一インタフェースの一例である。通信部33は外部設定機器からユーザプログラムと設定情報とを受け付ける第一の外部インタフェースの一例である。
IF99b、99d、99h、99jなどは、メインユニットと通信する第二インタフェースの一例である。画像受信部96aや接続ポート97は二次元データを取得する監視機器に接続され、当該監視機器から当該二次元データを受信する第三インタフェース(二次元データ受信部)の一例である。接続ポート97は、監視機器と接続され、当該監視機器からデータが入力される第二の外部インタフェースとして機能してもよい。カメラ98は監視機器の一例である。監視機器はバーコードリーダであってもよい。この場合、バーコードの読み取り結果は二次元データの一例である。監視機器は、ワークの高さ画像や距離画像を生成する画像処理装置であってもよい。高さ画像や距離画像は二次元データの一例である。二次元データは動画データであってもよい。また、デバイス値と比較してサイズの大きな大容量データも二次元データの一例である。たとえば、高速アナログ入力ユニットによって取得される数値データも二次元データの一例である。機能実行部96は第二の外部インタフェースを介して監視機器からのデータの入力を伴う機能を、受け付けた設定情報に基づいて実行する機能実行部として機能してもよい。
収集部92bは第三インタフェースを介して受信した二次元データを収集し、当該二次元データが取得された取得時刻に関する情報と当該二次元データとを関連付けて第二バッファに記憶する第二収集部の一例である。時刻管理部83が提供する時刻情報は取得時刻に関する情報の一例である。リングバッファ91bは第二バッファの一例である。
保存部93は所定の保存条件が満たされると、第一バッファに記憶されているデバイス値と収集時刻に関する情報と、第二バッファに記憶されている二次元データと取得時刻に関する情報とを保存する保存部の一例である。
このようにデバイス値および二次元データにはそれぞれ取得時刻に関する情報が紐付けられている。そのため、二次元データなどの比較的に大容量のデータとデバイス値との時間的な関係を特定しやすくなる。
監視機器は、静止画又は動画の画像データを取得するカメラで98あってもよい。機能実行部96は、カメラ98から画像データの入力を伴う機能を実行する。第二収集部である収集部92bは、画像データが取得された取得時刻に関する情報と当該画像データとを関連付けて第二バッファに記憶する。保存部93は、デバイス値と、収集時刻に関する情報と、第二バッファに記憶されている画像データと、取得時刻に関する情報とを対応付けて保存してもよい。機能実行部96は、ユーザプログラムの実行周期とは非同期で、監視機器からのデータの入力を伴う機能を実行してもよい。保存部93は、ユーザプログラム及び設定情報を含むプロジェクトデータを併せて保存してもよい。保存部93は、デバイス値、収集時刻に関する情報と、第二バッファに記憶されているデータと、取得時刻に関する情報とを、共通フラグにより識別される複数のファイルに格納し、当該複数のファイルを保存してもよい。
収集時刻に関する情報は、時系列に収集された複数のデバイス値の各々について収集時刻を特定可能な情報であればよい。複数のデバイス値の各々について収集時刻が関連付けられていてもよい。あるいは、たとえば、最初のデバイス値についてのみ収集時刻が関連付けられていてもよい。後者の場合、他の情報(スキャン回数やスキャンタイム等)に基づいて、最初のデバイス値以外のデバイス値についての収集時刻が算出されてもよい。デバイス値は、スキャン回数と同じ数だけ記録されることから、それぞれのスキャンにおける処理時間(スキャンタイム)を記憶しておくことで、任意のデバイス値の収集時刻が特定可能となる。例えば、100回目のスキャンで記録されたデバイス値の収集時刻を特定しようとするとき、1回目のスキャンで記録されたデバイス値の収集時刻が10時10分00秒であり、2〜100回目の各スキャンは全て100マイクロ秒かかったと仮定する。この場合、10時10分00秒から、100マイクロ秒×99を経過した時刻が、100回目のスキャンで記録されたデバイス値の収集時刻として算出される。このように、全てのデバイス値に収集時刻を関連付けて記録することは必須ではない。
取得時刻に関する情報は、時系列に取得された複数の二次元データの各々について取得時刻を特定するための情報であればよい。複数の二次元データの各々について取得時刻が関連付けられていてもよい。あるいは、例えば、最初の二次元データについてのみ取得時刻が関連付けられていてもよい。後者の場合、他の情報(撮像回数や撮像周期等)に基づいて、最初の二次元データ以外の二次元データについての取得時刻を算出することができる。具体的には、複数の二次元データのうち、最初の二次元データのみに、取得時刻を関連付けられる。二次元データを取得する周期(撮像周期)は、ほぼ一定である。したがって、任意の二次元データの取得時刻を特定できる。例えば、10回目の撮像で記録された画像データの取得時刻を特定しようとするとき、1回目の撮像で記録された画像データの取得時刻が10時10分00秒であり、2〜10回目の各撮像は全て100ミリ秒掛かったと仮定する。この場合、10回目の撮像で記録された画像データの取得時刻は、10時10分00秒から、100ミリ秒×9を経過した時刻である。このように、全ての二次元データに取得時刻を関連付けて記録することは必須ではない。
保存部93はメインユニットから着脱可能なメモリカード36を含んでもよい。保存部93は第一バッファに記憶されているデバイス値と収集時刻に関する情報と、第二バッファに記憶されている二次元データと取得時刻に関する情報とをメモリカード36に保存してもよい。これにより、ログデータ73をPC2へ搬送しやすくなる。図19が示すように、第一バッファはメインユニットに設けられていてもよい。図20が示すように、第二バッファは拡張ユニットに設けられていてもよい。
図24が示すように、第一インタフェースはメインユニットの側面であって、拡張ユニットの側面に対して対向する側面に配置されていてもよい。第二インタフェースは第一インタフェースと接続されるように拡張ユニットの側面に設けられていてもよい。
図25が示すようにバックプレーン200はメインユニットと拡張ユニットとを支持する支持プレートの一例である。この場合、第一バッファ、第二バッファおよび保存部のうちの少なくとも一つが支持プレートに設けられていてもよい。
送信部94は、記憶装置32に保存されているデバイス値、収集時刻に関する情報、二次元データ、および取得時刻に関する情報を外部機器に送信する送信部の一例である。外部機器はクラウドであってもよいし、PC2であってもよい。PC2は、ログデータ73をリアルタイムで受信して表示部7にログデータ73を表示してもよい。
第一バッファまたは第二バッファは、ユーザプログラムの実行周期(例:スキャン周期)よりも短い周期で発生する情報をさらに記憶するように構成されていてもよい。
保存部93は、メインユニットにおいてユーザプログラムに関するエンド処理(END処理)が実行されている期間において、第二バッファから二次元データと取得時刻に関する情報を読み出して保存するように構成されていてもよい。
時刻管理部83a、83bに関して説明されたように、収集時刻を計時するメインユニットの時計と取得時刻を計時する拡張ユニットの時計とは同期している。この同期は、たとえば、ユニット間同期によって実現されてもよい。
図29が示すように、保存部93は、予め設定された保存トリガーの前後にわたる所定の収集時間に収集されたデバイス値、収集時刻に関する情報、二次元データ、および取得時刻に関する情報をメモリカード36に保存するように構成されていてもよい。
図30が示すように、保存部93は、予め設定された開始リレーがオンになったタイミングを起点とした所定の収集時間に収集されたデバイス値、収集時刻に関する情報、二次元データ、および取得時刻に関する情報をメモリカード36に保存するように構成されていてもよい。
図32に関連して説明したように、保存部93は、所定の保存条件が満たされると、デバイス記録部に記録されているデバイス値と、プログラム記憶部に記憶されているユーザプログラムまたはユーザプログラムの識別情報とを対応付けてメモリ(例:メモリカード36や内部メモリ37)に保存してもよい。また、出力部84は所定の出力条件が満たされると、デバイス記録部に記録されているデバイス値と、プログラム記憶部に記憶されているユーザプログラムまたは当該ユーザプログラムの識別情報とを外部メモリ(例:メモリカード36)に出力してもよい。上述したように、ログデータ73がどのプロジェクトデータ71を使用することで取得されたかは重要である。したがって、ログデータ73を取得するため使用されたプロジェクトデータ71そのもの、または、その識別情報を出力部84が出力する。つまり、ログデータ73と、プロジェクトデータ71またはその識別情報を出力することで、ログデータ73とプロジェクトデータ71と関係を特定しやすくなる。これにより、ユーザは、プロジェクトデータ71のデバッグを効率よく進めることが可能となる。
ユーザプログラムは複数のプログラム部品から構成されている。また、プロジェクトデータは複数のプログラム部品を管理している。記憶装置32はプロジェクトデータ71の一部としてユーザプログラムを記憶するプログラム記憶部として機能する。出力部84は、ユーザプログラムを含むプロジェクトデータ71を出力するとともに、ユーザプログラムの識別情報としてプロジェクトデータ71の識別情報を出力するように構成されていてもよい。これにより、PC2に記憶されているプロジェクトデータ71(マスタデータ)と、PLC1に記憶されているプロジェクトデータ71とが一致しているかどうかを判定しやすくなる。
プロジェクトデータ71は、拡張ユニット4の設定情報を含んでもよい。これは、プロジェクトデータ71をデバッグする際に拡張ユニット4の設定情報が必要になることがあるからである。たとえば、複数の拡張ユニット4が基本ユニット3に接続されている場合、複数の拡張ユニット4の接続順番が拡張ユニット4の設定情報に含まれている。この接続順番に関する情報がデバッグの際に必要となることがある。
判定部301はユーザプログラム(プロジェクトデータ71)の出力が禁止されているかどうかを判定する判定部として機能する。出力部84は、判定部301によりユーザプログラムの出力が禁止されていると判定された場合、デバイス記録部に記録されているデバイス値と、プログラム記憶部に記憶されているユーザプログラムの識別情報とを外部メモリに出力してもよい。これにより、ユーザプログラムをプロテクトしつつ、識別情報に基づきPC2のマスタデータが利用可能となる。
付加部312に関連して説明されたように、ユーザプログラムの識別情報は、ユーザプログラムが変更されると更新される識別情報である。よって、PLC1に保持されているプロジェクトデータ71と異なる他のバージョンのプロジェクトデータ71が誤ってデバッグに利用されないようになろう。
演算部313に関連して説明されたように、ユーザプログラムの識別情報は、ユーザプログラムから演算される誤り検出符号またはハッシュ値であってもよい。このように、プロジェクトデータ71が更新されると、識別情報も更新されるような識別情報の演算方法が採用されてもよい。識別情報はタイムスタンプなどであってもよい。
PC2の記憶装置22はユーザプログラムと当該ユーザプログラムの識別情報を記憶するプログラムメモリの一例である。照合部334はプログラマブルロジックコントローラから出力されるユーザプログラムの識別情報と、プログラムメモリに記憶されているユーザプログラムの識別情報とを照合し、照合結果を表示部に表示させる照合部の一例である。警告部335は両者が不一致であった場合に警告を出力するが、両者が一致していた場合には一致していることを示すメッセージまたは画像を表示部7に表示してもよい。
図38が示すように、表示部7は、プログラマブルロジックコントローラから出力されたデバイス値を、ユーザプログラムのうち当該デバイス値に関連した命令語が記述されている部分と関連付けて表示してもよい。これにより、ユーザは、デバイス値の変化とユーザプログラムとの関係を理解しやすくなる。これはデバッグの効率を向上させるであろう。
記憶装置22やメモリカード36はプログラマブルロジックコントローラにおいて収集された時系列の複数のデバイス値と、各デバイス値の収集時刻を示す時刻データとを保存する保存手段の一例である。プログラム表示モジュール321はデバイス値をラダー図上に表示する第一エンジニアリングソフトウェアモジュールの一例である。波形表示モジュール322はデバイス値を時系列波形として表示する第二エンジニアリングソフトウェアモジュールの一例である。再生制御モジュール324は第一エンジニアリングソフトウェアモジュールにおける表示対象時刻と第二エンジニアリングソフトウェアモジュールにおける表示対象時刻とを同期させる同期ソフトウエアモジュールの一例である。これにより、ユーザは、特定のデバイス値の変化とプログラムの関係とを理解しやすくなろう。
第一エンジニアリングソフトウェアモジュールは、リアルタイム再生モードにおいてプログラマブルロジックコントローラからデバイス値を取得してラダー図上に当該デバイス値を表示し、履歴再生モードにおいて時刻データに基づき表示対象時刻に対応するデバイス値を保存手段から取得してラダー図上に表示する第一表示制御手段を有してもよい。プログラム表示部332、表示時刻制御部331およびデバイス値取得部333は第一表示制御手段として機能する。ログ再生モードは履歴再生モードの一例である。
第二エンジニアリングソフトウェアモジュールは、リアルタイム再生モードにおいてプログラマブルロジックコントローラからデバイス値を取得して時系列波形を表示し、履歴再生モードにおいて時刻データに基づき表示対象時刻に対応するデバイス値を保存手段から取得して時系列波形を表示する第二表示制御手段を有してもよい。波形表示部336、表示時刻制御部331およびデバイス値取得部333は第二表示制御手段の一例である。
同期ソフトウエアモジュールは、履歴再生モードにおいて第一エンジニアリングソフトウェアモジュールにおける表示対象時刻と第二エンジニアリングソフトウェアモジュールにおける表示対象時刻とを同期させる同期手段を有してもよい。再生制御部343は同期手段の一例である。
第一エンジニアリングソフトウェアモジュールは、さらに、履歴再生モードにおいて表示対象時刻を更新する第一更新手段をさらに有してもよい。時刻指定カーソル404、時刻UI330および表示時刻制御部331は第一更新手段の一例である。同期手段である再生制御部343は、第一更新手段により更新された表示対象時刻を第二エンジニアリングソフトウェアモジュールの表示対象時刻へ反映させる。
第二エンジニアリングソフトウェアモジュールは、履歴再生モードにおいて表示対象時刻を更新する第二更新手段をさらに有してもよい。バー103、時刻UI330および表示時刻制御部331は第二更新手段の一例である。同期手段である再生制御部343は、第二更新手段により更新された表示対象時刻を第一エンジニアリングソフトウェアモジュールの表示対象時刻へ反映させる。
図43が示すように、第一表示制御手段は、プログラマブルロジックコントローラにおいて参照される複数のデバイスのうち第二エンジニアリングソフトウェアモジュールにおいて表示対象とされているデバイスに関連する命令語を、ラダー図において検索してもよい。たとえば、図28に示されているデバイス(例:R000やDM100など)をポインタ101により指定することで、デバイスが指定されてもよい。図38が示すように、第一表示制御手段は、ラダー図において見つかった命令語とともに当該デバイスのデバイス値を表示するように構成されていてもよい。また、ポインタ101は、任意のデバイスを指定する指定手段の一例である。第一表示制御手段は、プログラマブルロジックコントローラにおいて参照される複数のデバイスのうち指定手段により指定されたデバイスに関連する命令語を、ラダー図において検索し、ラダー図において見つかった命令語とともに当該デバイスのデバイス値を表示してもよい。
図43が示すように、プログラマブルロジックコントローラにおいてラダープログラムは複数のプログラム部品から構成されていてもよい。第一表示制御手段(例:ログ表示部61やデバイス抽出部53)は、デバイスに関連する命令語を含む一つ以上のブロックを複数のプログラム部品の中から検索し、見つかったブロックをラダー図として表示するように構成されていてもよい。
図43が示すように、第一表示制御手段は、デバイスに関連する命令語を含む複数のブロックを見つけると、当該複数のブロックに対応するラダー図を並べて表示してもよい。
図43が示すように、第一表示制御手段は、ラダープログラムにおいて、第一ブロック(例:測定モジュールB2)において第一デバイス(例:MR001)に関連する命令語が入力系の命令語である場合に、当該入力系の命令語に対応して記述されている出力系の命令語の対象とされている第二デバイス(例:MR003)を特定し、当該第二デバイスを対象とする入力系の命令語を記述された第二ブロック(例:判定モジュールB3)を特定してもよい。
第一表示制御手段は、ラダープログラムにおいて、第一ブロック(例:判定モジュールB3)において第一デバイス(例:MR010)に関連する命令語が出力系の命令語である場合に、当該出力系の命令語に対応して記述されている入力系の命令語の対象とされている第二デバイス(例:MR001)を特定し、当該第二デバイスを対象とする出力系の命令語を記述された第二ブロック(例:測定モジュールB2)を特定してもよい。
同期手段は、表示対象時刻の更新速度を設定する設定手段を有してもよい。速度指定部405は設定手段の一例である。これによりスロー再生や早送り再生などが実現されてもよい。
第一表示制御手段および第二表示制御手段は、プログラマブルロジックコントローラに関する情報を表示するヒューマンインタフェース(HMI)から入力されたユーザ入力に基づき設定されたデバイス値をさらに表示するように構成されていてもよい。HMIはエミュレータにより実現されてもよい。図39に関連して説明されたようにUI490は複数のデバイス値を表示している。いずれのデバイス値がポインタ101によりクリックされると、ログ表示部61は、クリックされたデバイス値をプログラム表示部332の表示対象として追加したり、波形表示部336の表示対象として追加したりしてもよい。これにより、HMI、ユーザプログラムおよびデバイス値の波形を連携および同期させて表示することが可能となる。
保存手段は、カメラユニットより取得された時系列の複数の画像データと、各画像データの取得時刻を示す時刻データとをさらに保存していてもよい。図28が示すように、第二エンジニアリングソフトウェアモジュールは、リアルタイム再生モードにおいてプログラマブルロジックコントローラからデバイス値を取得して時系列波形を表示するとともにカメラユニットから取得された画像データを表示してもよい。同様に、第二エンジニアリングソフトウェアモジュールは、履歴再生モードにおいて保存手段から表示対象時刻に対応するデバイス値と画像データとを取得して表示してもよい。画像データは数値よりも多くの情報を有している。そのため、画像データを表示することで、ユーザは、問題点を早期に見つけることが可能となろう。
また、第一エンジニアリングソフトウェアモジュールは、リアルタイム再生モードにおいてプログラマブルロジックコントローラからデバイス値を取得してラダー図上に当該デバイス値を表示するとともにカメラユニットから取得された画像データを表示してもよい。第一エンジニアリングソフトウェアモジュールは、履歴再生モードにおいて保存手段から表示対象時刻に対応するデバイス値と画像データとを取得してラダー図上に表示してもよい。
複数の拡張ユニット4のそれぞれ異なる内部制御周期にしたがって動作している。よって、複数の拡張ユニット4から取得されるデバイス値の取得時刻や画像データの取得時刻が一致しないことが多い。そこで、図26〜図28に関連して説明されたように、第一表示制御手段および第二表示制御手段は、履歴再生モードにおいて、表示対象時刻に最も近い時刻データに関連付けられているデバイス値を読み出すように構成されていてもよい。