以下に本発明の一実施形態を示す。以下で説明される個別の実施形態は、本発明の上位概念、中位概念および下位概念など種々の概念を理解するために役立つであろう。また、本発明の技術的範囲は、特許請求の範囲によって確定されるのであって、以下の個別の実施形態によって限定されるわけではない。
はじめにプログラマブル・ロジック・コントローラ(PLC、単にプログラマブルコントローラと呼ばれてもよい)を当業者にとってよりよく理解できるようにするために、一般的なPLCの構成とその動作について説明する。
図1は、本発明の実施の形態によるプログラマブル・ロジック・コントローラシステムの一構成例を示す概念図である。図1に示すように、このシステムは、ラダープログラムなどのユーザプログラムの編集を行うためのプログラム作成支援装置1と、工場等に設置される各種制御装置を統括的に制御するためのPLC(プログラマブル・ロジック・コントローラ)2とを備えている。ユーザプログラムは、ラダー言語やモーションフローなどのグラフィカルプログラミング言語を用いて作成されてもよいし、C言語などの高級プログラミング言語を用いて作成されてもよい。以下では、説明の便宜上、ユーザプログラムはラダープログラムとする。PLC2は、CPUが内蔵された基本ユニット3と1つないし複数の拡張ユニット4を備えている。基本ユニット3に対して1つないし複数の拡張ユニット4が着脱可能となっている。基本ユニット3はCPUユニットと呼ばれることもある。
基本ユニット3には、表示部5及び操作部6が備えられている。表示部5には、基本ユニット3に取り付けられている各拡張ユニット4の動作状況などを表示することができ、表示部5の表示内容は、操作部6を操作することにより切り替えることができる。表示部5には、通常、PLC2内のデバイスの現在値(デバイス値)やPLC2内で生じたエラー情報などが表示される。なお、デバイスとは、デバイス値を格納するために設けられたメモリ上の領域を指す名称であり、デバイスメモリと呼ばれてもよい。デバイス値とは、入力機器からの入力状態、出力機器への出力状態およびユーザプログラム上で設定される内部リレー(補助リレー)、タイマー、カウンタ、データメモリ等の状態を示す情報である。
拡張ユニット4は、PLC2の機能を拡張するために用意されており、基本ユニット3に対して側方から取り付けられる。1つ目の拡張ユニット4は、基本ユニット3に対して側方から直接的に取り付けられる。2つ目以降の拡張ユニット4は、既に取り付けられている拡張ユニット4に対して、側方から直列的に取り付けられる。たとえば、基本ユニット3の右側面と拡張ユニット4の左側面とが連結面になっている。同様に、1つ目の拡張ユニット4の右側面の形状等は基本ユニット3の右側面とほぼ同じであるため、1つ目の拡張ユニット4の右側面に2つ目の拡張ユニット4の左側面が連結される。このような連結方式は、数珠つなぎ方式とかデイジーチェーン方式と呼ばれてもよい。各連結面にはコネクタが設けられており、通信や電力供給を行うためのバスもコネクタを介して連結される。このようにして、基本ユニット3と複数の拡張ユニット4が直列的に取り付けられると、各拡張ユニット4内に備えられた配線(例:バス)を介して、各拡張ユニット4が基本ユニット3に対して通信可能に接続される。各拡張ユニット4には、その拡張ユニット4の機能に対応する被制御装置16(図4)が接続され、これにより、各被制御装置16が拡張ユニット4を介して基本ユニット3に接続される。被制御装置16には、センサなどの入力装置や、アクチュエータなどの出力装置が含まれる。
プログラム作成支援装置1は、たとえば、携帯可能ないわゆるノートタイプやタブレットタイプのパーソナルコンピュータであって、表示部7及び操作部8を備えている。PLC2を制御するためのユーザプログラムの一例であるラダープログラムは、プログラム作成支援装置1を用いて作成され、その作成されたラダープログラムは、プログラム作成支援装置1内でニモニックコードに変換される。そして、プログラム作成支援装置1を、USB(Universal Serial Bus)などの通信ケーブル9を介してPLC2の基本ユニット3に接続し、ニモニックコードに変換されたラダープログラムをプログラム作成支援装置1から基本ユニット3に送ると、そのラダープログラムが基本ユニット3内でマシンコードに変換され、基本ユニット3に備えられたメモリ内に記憶される。なお、ここではニモニックコードを基本ユニット3に送信するようにしているが、本発明はこれに限られず、例えばニモニックコードを更に中間コードに変換し、中間コードを基本ユニット3に送信するようにしてもよい。
なお、図1では示していないが、プログラム作成支援装置1の操作部8には、プログラム作成支援装置1に接続されたマウスなどのポインティングデバイスが含まれていてもよい。また、プログラム作成支援装置1は、USB以外の他の通信ケーブル9を介して、PLC2の基本ユニット3に対して着脱可能に接続されるような構成であってもよい。
図2は、ラダープログラムの作成時にプログラム作成支援装置1の表示部7に表示されるラダー図17の一例を示す図である。図2に示すように、PLC2を制御するためのラダープログラムは、プログラム作成支援装置1の表示部7にマトリックス状に表示される複数のセル18内に仮想デバイスのシンボル19を適宜配置して、視覚的なリレー回路を表すラダー図17を構築することにより作成される。
ラダー図17には、たとえば、10列×N行(Nは任意の自然数)のセル18が配置されている。そして、各行のセル18内に、図2に示す左側から右側に向かって、時系列的に仮想デバイスのシンボル19を適宜配置することにより、視覚的なリレー回路を作成することができる。作成されるリレー回路は、1行で表される直列的なリレー回路であってもよいし、複数行に並列的に表されたリレー回路を互いに結合することにより作成された、並列的なリレー回路であってもよい。
図2に示すリレー回路は、入力装置からの入力信号に基づいてオン/オフされる3つの仮想デバイス(以下、「入力デバイス」と呼ぶ。)のシンボル19a,19b,19cと、出力装置の動作を制御するためにオン/オフされる仮想デバイス(以下、「出力デバイス」と呼ぶ。)のシンボル19dとが適宜結合されることにより構成されている。
各入力デバイスのシンボル19a,19b,19cの上方に表示されている文字(「R0001」、「R0002」及び「R0003」)は、その入力デバイスのデバイス名(アドレス名)21を表している。各入力デバイスのシンボル19a,19b,19cの下方に表示されている文字(「フラグ1」、「フラグ2」及び「フラグ3」)は、その入力デバイスに対応付けられたデバイスコメント22を表している。出力デバイスのシンボル19dの上方に表示されている文字(「原点復帰」)は、その出力デバイスの機能を表す文字列からなるラベル23である。
図2に示す例では、デバイス名「R0001」及び「R0002」にそれぞれ対応する2つの入力デバイスのシンボル19a,19bが直列的に結合されることにより、AND回路が構成されている。また、これらの2つの入力デバイスのシンボル19a,19bからなるAND回路に対して、デバイス名「R0003」に対応する入力デバイスのシンボル19cが並列的に結合されることにより、OR回路が構成されている。すなわち、このリレー回路では、2つのシンボル19a,19bに対応する入力デバイスがいずれもオンした場合、又は、シンボル19cに対応する入力デバイスがオンした場合にのみ、シンボル19dに対応する出力デバイスがオンされるようになっている。
図3は、図1のプログラム作成支援装置1の電気的構成について説明するためのブロック図である。図3に示すように、プログラム作成支援装置1には、CPU24、表示部7、操作部8、記憶装置25及び通信部26が備えられている。表示部7、操作部8、記憶装置25及び通信部26は、それぞれCPU24に対して電気的に接続されている。記憶装置25は、少なくともRAMを含む構成であり、ラダープログラム記憶部25aと、編集ソフト記憶部25bとを備えている。
ユーザは、編集ソフト記憶部25bに記憶されている編集ソフトをCPU24に実行させて、操作部8を通じてラダープログラムを編集する。ここで、ラダープログラムの編集には、ラダープログラムの作成及び変更が含まれる。編集ソフトを用いて作成されたラダープログラムは、ラダープログラム記憶部25aに記憶される。また、ユーザは、必要に応じてラダープログラム記憶部25aに記憶されているラダープログラムを読み出し、そのラダープログラムを、編集ソフトを用いて変更することができる。通信部26は、通信ケーブル9を介してプログラム作成支援装置1を基本ユニット3に通信可能に接続するためのものである。
図4は、PLC2の電気的構成について説明するためのブロック図である。図4に示すように、基本ユニット3には、CPU10、表示部5、操作部6、記憶装置12及び通信部14が備えられている。表示部5、操作部6、記憶装置12、及び通信部14は、それぞれCPU10に電気的に接続されている。記憶装置12は、RAMやROM、メモリカードなどを含んでもよく、ラダープログラムなどを記憶する。記憶装置12には、プログラム作成支援装置1から入力されたラダープログラムやユーザデータが上書きして記憶される。また、記憶装置12には基本ユニット用の制御プログラムも格納されている。図4が示すように基本ユニット3と拡張ユニット4とは拡張バスの一種であるユニット外部バス90を介して接続されている。なお、ユニット外部バス90に関する通信機能は通信部14の一部として実装されてもよい。
図5は、本発明の実施の形態に係るプログラマブルコントローラの基本ユニット3でのスキャンタイムの構成を示す模式図である。図5が示すように1つのスキャンタイムTは、入出力のリフレッシュを行うためのユニット間通信201、プログラム実行202、END処理204により構成されている。ユニット間通信201で、基本ユニット3は、ラダープログラムを実行して得られた出力データを基本ユニット3内の記憶装置12から外部機器などに送信するとともに、受信データを含めた入力データを基本ユニット3内の記憶装置12に取り込む。たとえば、基本ユニット3のデバイスに記憶されているデバイス値はリフレッシュによって拡張ユニット4のデバイスに反映される。同様に、拡張ユニット4のデバイスに記憶されているデバイス値はリフレッシュによって基本ユニット3のデバイスに反映される。なお、リフレッシュ以外のタイミングでデバイス値をユニット間で更新する仕組みが採用されてもよい。ただし、基本ユニット3のデバイスは基本ユニット3が随時書き換えており、同様に、拡張ユニット4のデバイスは拡張ユニット4が随時書き換えている。つまり、基本ユニット3のデバイスは基本ユニット3の内部の装置によって随時アクセス可能であり、同様に、拡張ユニット4のデバイスは拡張ユニット4の内部の装置によって随時アクセス可能になっている。基本ユニット3と拡張ユニット4との間では基本的にリフレッシュのタイミングにおいて相互にデバイス値を更新して同期する。プログラム実行202で、基本ユニット3は、更新された入力データを用いてプログラムを実行(演算)する。基本ユニット3はプログラムの実行によりデータを演算処理する。なお、END処理とは、プログラム作成支援装置1や基本ユニット3に接続された表示器(図示せず)等の外部機器とのデータ通信、システムのエラーチェック等の周辺サービスに関する処理全般を意味する。
このように、プログラム作成支援装置1はユーザの操作に応じたラダープログラムを作成し、作成したラダープログラムをPLC2に転送する。PLC2は、入出力リフレッシュ、ラダープログラムの実行およびEND処理を1サイクル(1スキャン)として、このサイクルを周期的、すなわちサイクリックに繰り返し実行する。これにより、各種入力機器(センサ等)からのタイミング信号に基づいて、各種出力機器(モータ等)を制御する。よって、PLC2は汎用のパーソナルコンピュータ(PC)とは全く異なる動きをする。
<基本ユニットの機能>
図6は基本ユニット3のCPU10が制御プログラムを実行することで実現する機能を中心に示している。CPU10において第1実行部30は、グラフィカルプログラミング言語で記述されるユーザプログラムである第1プログラムを実行する演算ユニットである。第1プログラムの一例としてラダープログラムを採用するが、他のグラフィカルプログラミング言語で記述されるユーザプログラムであってもよい。第1実行部30は、ラダープログラム(中間コード)43を実行形式のコードに変換する機能を備えていてもよい。第1実行部30の外部にこのような変換器が設けられていてもよい。第2実行部31は、高級プログラミング言語で記述されるユーザプログラムである第2プログラムを実行する演算ユニットである。第2プログラムの一例としてC言語プログラムを採用するが、他の高級プログラミング言語で記述されるユーザプログラムであってもよい。なお、CPU10は第1実行部30と第2実行部31に相当する演算部を異なる複数のCPUコアとして備えていてもよいし、一方はCPU10のCPUコアが担当し、他方はASICなどで実装されてもよい。特に、第1実行部30がラダープログラムを実行する際には高速処理が要求されるため、高速処理対応のASICで実装し、第2実行部31が通信処理などを実行する際には高速処理は要求されないため、高機能CPUなどで実装してもよい。この場合、第1実行部30と第2実行部31はユニット内部バス32によって接続され、通信する。
記憶装置12には、基本ユニット3のシステムプログラム(ファームウエア)である制御プログラム40と、プログラム作成支援装置1から転送されてきたプロジェクト41などが記憶される。プロジェクト41には、プロジェクトデータ42、ラダープログラム(中間コード)43およびC言語プログラム(オブジェクトコード)44などが含まれている。プロジェクト41には、ラダープログラムのソースコードやC言語プログラムのソースコードが含まれていてもよい。ラダープログラム(中間コード)43はプログラム作成支援装置1によりソースコードから生成された中間コード(ニーモニック)である。C言語プログラム(オブジェクトコード)44はプログラム作成支援装置1によりソースコードから生成された実行形式のコードである。
プロジェクト管理部33は、プログラム作成支援装置1から通信部14を介してプロジェクト41の書き込み要求を受信すると、プログラム作成支援装置1からプロジェクト41を受信して記憶装置12に格納する。また、プロジェクト管理部33は、プログラム作成支援装置1から読み出し要求を受信すると、読み出し対象として指定されたファイル(例:プロジェクト41の全体、ラダープログラム(中間コード)43のみ、C言語プログラム(オブジェクトコード)44のみ、C言語プログラムのソースファイルのみなど)を記憶装置12から読み出して、プログラム作成支援装置1に転送する。プロジェクト41の読み出し機能はプロジェクト41の再編集に有用である。
<プログラム作成支援装置1の機能>
図7はプログラム作成支援装置1が編集ソフトウエア60を実行することで実現するCPU24の機能を中心に記載している。編集ソフトウエア60は、記憶装置25の編集ソフト記憶部25bに記憶されている。とりわけ、編集ソフトウエア60は、グラフィカルプログラミング言語によるプログラミング環境と高級プログラミング言語によるプログラミング環境とを統合した開発環境を提供するものである。従来はグラフィカルプログラミング言語と高級プログラミング言語とでそれぞれ別々のプロジェクトが作成されて管理されていた。一方で、本実施例ではグラフィカルプログラミング言語と高級プログラミング言語とで1つのプロジェクトにより管理することが可能となる。つまり、1つのプロジェクトファイルによりC言語プログラムとラダープログラムとを管理できるようになる。また、従来は、グラフィカルプログラミング言語のプログラムについてはその開発環境内で整合性のチェックが実行されていた。同様に、従来は、高級プログラミング言語のプログラムについてはその開発環境内で整合性のチェックが実行されていた。つまり、整合性は個別にチェックされるにすぎず、両者の連携部の整合性についてはユーザが目視で行う必要があり、負担が大きかった。また、プロジェクトを転送してC言語プログラムをロードするにはPLC2の電源を一旦オフに切り替える必要があり、PLC2を稼働させたままプロジェクトを転送してC言語プログラムをロードすることができなかった。グラフィカルプログラミング言語のプログラムと高級プログラミング言語によるプログラムとの連携部をユーザが記述するには一方のプログラムの記述を参照しながらそれに対応する記述を他方のプログラムに追加する必要があった。しかし、一方の記述に対応する記述を示唆したり、自動入力したりするなどといった入力補助を提供できれば、ユーザの負担を軽減できるであろう。また、連携部における引数や戻り値を受け取るためのハンドシェイクプログラムを記述する手間を省くこともユーザにとっては便利であろう。そこで、編集ソフトウエア60はこれらの課題を解決する機能を有している。
ラダープログラム記憶部25aには、プロジェクト41、機能ルール65、テンプレート66など記憶されている。プログラム作成支援装置1が保持しているプロジェクト41とPLC2が保持しているプロジェクト41には、プロジェクトデータ42、ラダープログラム(ソース)61、ラダープログラム(中間コード)43、C言語プログラム(ソース)62、C言語プログラム(オブジェクトコード)44などが含まれる。プロジェクト41をPLC2に転送するときに一部のファイルが削除されてもよい。たとえば、PLC2にとってソースコードなどは必ずしも必要ではないため、これらは転送されなくてもよい。なお、ソースコードも転送しておくと、PLC2からソースコードを取得した別のプログラム作成支援装置1においてソースコードを再編集することが可能となる。プロジェクトデータ42はプロジェクト41を構成している複数のファイル名と、どのファイルがソースアファイルであり、どのファイルが実行ファイルであるかなどを管理するためのデータを有している。ラダープログラム(中間コード)43はラダープログラム(ソース)61を変換することで生成される中間コードである。C言語プログラム(オブジェクトコード)44は、C言語プログラム(ソース)62を変換することで生成される実行形式のファイルである。
プログラム編集部51は、たとえば、表示部7にラダープログラムの編集領域を表示し、操作部8から入力された指示にしたがってラダープログラム(ソース)61を作成する。さらに、プログラム編集部51は、たとえば、表示部7にC言語プログラムの編集領域を表示し、操作部8から入力された指示にしたがってソースコード(C言語プログラム(ソース)62)を作成する。なお、C言語プログラム(ソース)62は一般的なテキストエディタにより編集されてもよいが、プログラム編集部51はこの場合にも入力補助機能を提供してもよい。プロジェクト生成部52は、プロジェクト41の名称、プロジェクト41に含まれる各ファイルのファイル名を編集し、プロジェクトデータ42を作成する。また、プロジェクト生成部52は、ソースコードのコンパイラー(実行コードや中間コードへの変換器(複数の中間コードをリンクして実行コードを生成するリンカーなどが含まれてもよい))を有し、実行形式や中間形式のファイルを生成する。プロジェクト転送部53はプロジェクト41をPLC2に転送する(書き込み機能)。プロジェクト転送部53はPLC2が保持しているプロジェクト41をPLC2から受信してもよい(読み出し機能)。
判別部54は、主に、ラダープログラム(ソース)61とC言語プログラム(ソース)62との間の連携部の記述の整合性を判別する。ラダープログラム(ソース)61とC言語プログラム(ソース)62とは相互にデータを送受信することで連携して動作する。データは引数や戻り値として受け渡されるが、PLC2では上述したデバイスに引数や戻り値が割り当てられる。つまり、ラダープログラムとC言語プログラムとが相互にデバイスメモリにアクセスすることで引数や戻り値が受け渡される。この場合、判別部54は、ラダープログラム(ソース)61におけるデバイスの機能と、C言語プログラム(ソース)62における当該デバイスに対する処理の内容とに基づいて、ラダープログラム(ソース)61とC言語プログラム(ソース)62との整合性を判別する。たとえば、ラダープログラムにおいて、C言語プログラムへデータを出力するためのデバイスが記述されている場合に、C言語プログラムにおいて当該デバイスにデータを書き込む記述が存在した場合、判別部54は不整合と判別する。出力部50は判別結果を示すメッセージなどを表示部7に表示させる。たとえば、出力部50はこれらのプログラムのソースが整合していないときに表示部7に警告を出力する。
ラダープログラム内で複数のプログラムモジュールが定義されることがあり、C言語プログラムからこれらのプログラムモジュールが利用されることがある。この場合、判別部54は、C言語プログラム(ソース)62において記述されているモジュール名を取得し、当該モジュール名を付与されているプログラムモジュールがラダープログラム内で定義されているかどうかを判別してもよい。たとえば、C言語プログラム(ソース)62において“IsActive(“module_X”)”という記述が存在したとする。module_Xはモジュール名である。IsActive( )はラダープログラムで定義されているプロラムモジュールの実行状態を取得するために用意されているAPIである。この場合、判別部54は、ラダープログラム(ソース)61内をサーチしてモジュール名として“module_X”を有するプログラムモジュールが定義されているかどうかを判別する。“module_X”を有するプログラムモジュールが定義されていなければ、判別部54は不整合と判別する。
プログラム編集部51は入力補助部55を有していてもよい。一般に、ラダープログラムからC言語プログラムへ渡す引数などの記述や、C言語プログラムからラダープログラムへ渡す引数または戻り値などの記述をそれぞれのソースファイルに記述しなければならない。従来は、それぞれ個別にユーザが手作業で記述を行っていたため、ユーザの負担が大きかった。一方でこれらの引数の引き渡しに関する記述はひな形(テンプレートまたはスケルトン)化することが可能である。このようなひな形はテンプレート66として保持されていてもよい。たとえば、C言語プログラムにおける複数の関数と、各関数について必要となるラダープログラムとを対応付けてデータベース化して管理しておけば、ユーザが選択した関数に対応するラダープログラムのテンプレートをラダープログラムのソースファイルに追加することが可能となる。たとえば、入力補助部55の一覧部56はC言語プログラムのソースファイルであるC言語プログラム(ソース)62において定義された関数の一覧を表示部7に表示させてもよい。追加部57は表示部7に表示された一覧から操作部8を通じてユーザに選択された関数を呼び出すためのコードのひな形をラダープログラム(ソース)61に追加する。ユーザはひな形を必要に応じて修正することもあろうが、それでもユーザは大幅にプログラミングの手間を省けるようになろう。追加部57は、C言語プログラムの関数をラダープログラムから呼び出すためにラダープログラム(ソース)61に記述された当該関数の名称(シンボル名)および引数に基づき、当該関数を記述するコードのひな形をC言語プログラム(ソース)62に追加してもよい。このような入力補助を提供することで、ユーザは大幅にプログラミングの手間を省けるようになろう。
ソースファイルにはプログラマーがコメントを記述することがある。これは何のためのソースコードや関数であるかを、自分だけでなく、第三者にもわかりやすくし、再編集の効率を向上させるためである。本実施例のような統合開発環境では、C言語プログラム(ソース)62に記述したコメントがラダープログラム(ソース)61を編集する際に役に立つことがある。そこで、入力補助部55のコメント部58は、一覧から選択された関数に関連付けられているコメントをC言語プログラム(ソース)62から取得して表示部7に表示させてもよい。このようなコメントの表示もユーザの入力作業を補助するものとなろう。
入力補助部55はさらに定義部59や追加部57を有していてもよい。定義部59は、ラダープログラム(中間コード)43とC言語プログラム(オブジェクトコード)44との間のインタフェースを定義する機能である。追加部57は、定義部59によって定義されたインタフェースにしたがってラダープログラム(中間コード)43からC言語プログラム(オブジェクトコード)44を呼び出すためのハンドシェイクコードのひな形をラダープログラム(中間コード)43のソースファイルに追加してもよい。従来はこのようなハンドシェイクコードについてはユーザが手作業で記述していた。しかし、予めハンドシェイクコードのひな形を用意しておくことで、ユーザは大幅にプログラミングの手間を省けるようになろう。
記憶装置25には機能ルール65とテンプレート66とが記憶されている。機能ルール65は、複数のデバイスについて各デバイスの機能を示すルールである。たとえば、機能ルール65は、デバイスDM0は出力用、デバイスDM1は入力用、デバイスDM2は入出力用といったように、各デバイスごとに定義された機能を示す情報を保持していてもよい。判別部54は、ルール記憶部である記憶装置25に記憶されている機能ルール65を参照してラダープログラム(ソース)61とC言語プログラム(ソース)62の整合性を判別してもよい。
<ユーザインタフェース>
図8は統合開発環境のユーザインタフェースの一例を示す図である。プログラム編集部51はユーザインタフェース70を表示部7に表示する。ワークスペース71は、ラダープログラム(ソース)61の名称やC言語プログラム(ソース)62の名称などを設定するための設定エリアである。この例では、操作部8を通じて新規のC言語プログラム(ソース)62を追加するための指示が入力され、プログラム編集部51がダイアログ74を表示部7に表示させている。プロジェクト生成部52は、ワークスペース71を通じてユーザにより入力されたプロジェクト41の名称、ラダープログラム(ソース)61の名称、C言語プログラム(ソース)62の名称、各実行ファイルの名称などをプロジェクトデータ42に格納する。ラダータブ72はラダープログラムを編集するためのタブである。C言語タブ73はC言語プログラムを編集するためのタブである。ユーザは操作部8を通じて各プログラムのソースファイルを編集する。プロジェクト生成部52はプロジェクト41を1つの統合ファイルとしてまとめてもよいし、複数のファイルに分割して管理してもよい。後者の場合、プログラム編集部51はC言語プログラム(ソース)62をテキストファイルに保存してもよい。テキストファイルに保存されたC言語プログラム(ソース)62はユーザにとって使い慣れたテキストエディタによる編集を可能とする。
<整合性のチェック>
判別部54は、ラダープログラム(ソース)61に含まれる複数の記述間の整合性をチェックする第一チェック部と、C言語プログラム(ソース)62に含まれる複数の記述間の整合性をチェックする第二チェック部と、ラダープログラム(ソース)61とC言語プログラム(ソース)62との間の連携部における整合性をチェックする第三チェック部とを有している。整合性はプログラムミス(シンタックスエラーなど)によって失われる。よって、これらのチェック部はプログラムミスをチェックする機能である。判別部54は、ラダープログラム(ソース)61とC言語プログラム(ソース)62とでプログラムミスをチェックし、出力部50はチェック結果を表示部7に表示させる。ユーザは表示部7に表示されたチェック結果に応じて記述を修正する。判別部54は、各プログラム単体でのミスが無くなると、両プログラム間の連携部の整合性チェックを実行してもよい。これにより、連携部のプログラムミスをユーザに通知し、ユーザの修正を補助することが可能となる。
C言語プログラム内での記述の整合性のチェック機能やラダープログラム内での記述の整合性のチェック機能は既知であるため、ここではC言語プログラムとラダープログラムとの間の整合性のチェック(統合チェック)について詳細に説明する。
上述したように判別部54は機能ルール65にしたがって統合チェックを実行する。機能ルール65にはチェックの対象となる1つ以上のルールが含まれている。一方の言語のソースファイルに記述されているシンボルが他方の言語のソースファイルにも記述されているかどうかがチェックされる。たとえば、ラダープログラムからC言語プログラムのシンボル(関数)を呼び出す場合に、ラダープログラム(ソース)61には当該シンボルを呼び出すための記述が存在するが、C言語プログラム(ソース)62には当該シンボルが記述されていないことがある。この場合、判別部54は、当該シンボルがC言語プログラム(ソース)62に記述されていないことを検知し、出力部50にその旨を示す判別結果を渡す。出力部50は判別結果を示す警告メッセージを作成し、表示部7に表示させる。
また、機能ルール65には、ラダープログラムがC言語プログラムに渡す引数の個数と、C言語プログラムがラダープログラム43から受け取ろうとする引数の個数が一致していることが含まれている。判別部54は、ラダープログラム(ソース)61に記述されている、ある関数についての引数の個数と、C言語プログラム(ソース)62に記述されている当該関数についての引数の個数とが一致しているかどうかを判別する。両者が一致していないことを判別部54が検知すると、出力部50にその旨を示す判別結果を渡す。出力部50は判別結果を示す警告メッセージを作成し、表示部7に表示させる。なお、引数や戻り値にはそれぞれデータサイズが定められている。たとえば、呼び出し側となるプログラムのソースファイルにおいて2ワードのデータを引き渡すように記述されているのに、呼び出される側となるプログラムのソースファイルにおいて4ワードのデータを受け取るように記述されている場合、判別部54は不整合と判別する。また、引数や戻り値の入出力の方向が一致していることもルールの一つとなろう。たとえば、呼び出し側となるプログラムのソースファイルにおいてデータを引き渡す(出力する)ように記述されているのに、呼び出される側となるプログラムのソースファイルにおいて当該データを引き渡す(出力する)ように記述されている場合、判別部54は不整合と判別する。
図9は判別処理の一例を示すフローチャートである。操作部8を通じてチェックを指示されたり、オブジェクトコードや中間コードへの変換が指示されたりすると判別部54が判別処理を開始する。
S1で判別部54はラダープログラム(ソース)61内の記述の整合性をチェックする。S2で判別部54はC言語プログラム(ソース)62内の記述の整合性をチェックする。S3で判別部54はラダープログラム(ソース)61内の記述がいずれも整合しており、かつ、C言語プログラム(ソース)62内の記述もいずれも整合しているかどうかを判定する。いずれかの整合性に関するエラーが見つかると、判別部54はS4に進む。S4で判別部54は判別結果を出力部50に渡すことで、出力部50に不整合を示すメッセージを出力させる。S5でプログラム編集部51は操作部8を通じてソースファイルの修正を受け付ける。その後、操作部8を通じて再びチェックが指示されると、S1に戻り、判別部54がチェックを実行する。最終的に整合性のエラーが解消すると、判別部54はS6に進む。
S6で判別部54は、ラダープログラム(ソース)61とC言語プログラム(ソース)62との間の整合性をチェックする(統合チェック)。S7で判別部54はラダープログラム(ソース)61とC言語プログラム(ソース)62との間の整合性にエラーがないかどうかを判定する。整合性にエラーが見つかると、判別部54はS8に進む。S8で判別部54は判別結果を出力部50に渡すことで、出力部50に不整合を示すメッセージを出力させる。S9でプログラム編集部51は操作部8を通じてソースファイルの修正を受け付ける。その後、操作部8を通じて再びチェックが指示されると、S6に戻り、判別部54がチェックを実行する。最終的に整合性のエラーが解消するまで、S6ないしS9が実行される。
図9では、ラダープログラム(ソース)61内のプログラムミス(シンタックスエラー)がなくなり、かつ、C言語プログラム(ソース)62内のプログラムミスがなくなると、統合チェックに進んでいる。しかし、判別部54は、S1、S2、S6を連続して実行して、それぞれの判別結果をまとめて出力部50に出力させてもよい。また、S9の後で判別部54はS1に戻ってもよい。
図10は、整合性の判別結果を表示するユーザインタフェースの一例である。ユーザインタフェース70には、判別結果(チェック結果)を表示するための表示エリア75が設けられている。この例では、整合性のエラーが発生していることを示す警告メッセージ76が表示エリア75に表示されている。警告メッセージ76には、エラーが発生している位置(行番号)やエラーの内容(ラダープログラムから読み出されたC言語エントリーが存在しません)などが含まれている。
図11は、整合性の判別結果を表示するユーザインタフェースの一例である。この例は整合性のエラーが無い状態のものである。この例では、ソースコードの変換が指示されると、整合性のチェックが実行され、整合性のエラーがないと変換が実行される。表示エリア75には変換結果が表示される。なお、変換結果を示すダイアログ77が表示されてもよい。
統合チェックについてさらに具体例を用いて説明する。ラダープログラム(ソース)61において次のような記述があると仮定する。「CCALL “func” (DM0,DM1)」。ここで、CCALLはC言語プログラムを呼び出すためのラダー言語の命令である。“func”は呼び出される関数名(シンボル名)である。DM0はラダープログラムからC言語プログラムに引数を渡すためのデバイスである。DM1はC言語プログラムからラダープログラムに引数(戻り値)を渡すためのデバイスである。C言語プログラム(ソース)62には「Set Value(0,150)」という記述があったと仮定する。この命令は、0番目の引数に数値“150”を代入するという命令である。ラダープログラム(ソース)61における0番目の引数はDM0であり、これは引き渡し用のデバイスである。よって、C言語プログラムからデータを代入することはできない。なお、本来は「Set Value(1,150)」が正しい記述である(この命令は、1番目のデバイスであるDM1に150を代入する命令)。
このように、判別部54は、ラダープログラム(ソース)61に記述されているデバイスの種類や機能(引き渡し用デバイスDM0/受け取り用デバイスDM1)と、C言語プログラム(ソース)62に記述されている当該デバイスに対する命令の内容(引き渡し/受け取り)とに基づいて、ラダープログラム(ソース)61とC言語プログラム(ソース)62との間の整合性を判別してもよい。
<プロジェクトの転送>
上述したようにプログラム作成支援装置1はプロジェクト41をPLC2に転送するが、プロジェクト41に含まれるすべてのファイルを転送する必要がないこともある。たとえば、単一のプログラム作成支援装置1が用いられるケースでは、プログラム作成支援装置1がプロジェクト41のすべてを保持しているため、プロジェクト41を修正できる、一方で、プロジェクト41を保持していない別のプログラム作成支援装置1をPLC2に接続してC言語プログラム(オブジェクトコード)44を修正する場合にはC言語プログラム(ソース)62が必要になる。よって、このケースではPLC2はC言語プログラム(ソース)62も保持していなければならない。このように転送されるべきプロジェクト41に含まれるべきファイルはユーザによって異なることがある。そこで、本実施例はプロジェクト41に含まれるファイルやデータのうち転送対象とすべきものをユーザが選択できるようにする。
図12はプロジェクトの転送処理(書き込み処理)を示すフローチャートである。上述した統合開発環境におけるユーザインタフェース70において操作部8を通じて転送処理が指示されると、CPU24は転送処理を開始する。
S11でプロジェクト転送部53はプログラム作成支援装置1の記憶装置25に記憶されているプロジェクト41をサーチして転送項目のリストを作成する。プロジェクト41に含まれるファイルやデータに関する情報はプロジェクトデータ42に保持されている。よって、プロジェクト転送部53はプロジェクトデータ42を参照することで転送項目のリストを作成してもよい。あるいは、プロジェクトデータ42にリストが含まれている場合、プロジェクト転送部53はプロジェクトデータ42からリストを取得してもよい。このようにプロジェクト転送部53はリスト作成部またはリスト取得部を有している。
S12でプロジェクト転送部53は転送項目のリストを含む選択ユーザインタフェース(選択UI)を作成する。このようにプロジェクト転送部53はUI作成部を有している。たとえば、プロジェクト転送部53は選択UIのテンプレートを記憶装置25に保持しており、リストをテンプレートに挿入することで選択UIの表示データを作成する。S13でプロジェクト転送部53は選択UIを表示部7に表示させる。
図13は選択UIの一例を示す図である。選択UI78は選択項目のリスト79を有しており、リスト79には各選択項目の名称と、選択の有無を示すチェックボックスとが含まれている。ユーザは操作部8を通じてチェックボックスにチェックを入れたり、チェックを外したりすることで転送項目を選択する。なお、ラダープログラムだけが修正された場合は、ラダープログラムだけがチェックを付与される。これにより、転送項目を削減し、転送時間を短くすることが可能となろう。上述したようにプロジェクト41を保持していない別のプログラム作成支援装置1でプロジェクト41が編集される予定があれば、プロジェクト41の全体や再編集に必要な部分が転送対象として選択されてもよい。たとえば、C言語プログラム(オブジェクトコード)44について修正の必要があれば、C言語プログラム(ソース)62も転送対象として選択される。C言語プログラム(ソース)62において参照されているヘッダファイルなどは、選択UI78を通じてユーザが選択してもよいし、プロジェクト転送部53がC言語プログラム(ソース)62を解析し、参照されているヘッダファイルを発見し、当該ヘッダファイルを転送対象として選択してもよい。後者の場合は、ユーザの選択の手間を省けて便利であろう。たとえば、C言語プログラム(ソース)62において「#include <xxx/yyy.h>」と宣言されている場合、プロジェクト転送部53は、「xxx」という名称のフォルダ内を検索し、yyy.hという名称のヘッダファイルを発見し、転送対象として選択する。また、xxxという格納場所(パス名)に関する情報も転送対象とすることで、格納場所を含めたヘッダファイルの復元が容易になろう。このように、プロジェクト転送部53は、C言語プログラム(ソース)62を解析する解析部やその解析結果に基づいてC言語プログラム(ソース)62で参照されているヘッダファイルを転送対象として選択する選択部として機能してもよい。なお、解析部や選択部はプロジェクト転送部53から独立して実装されてもよい。
S14でプロジェクト転送部53は選択UI78を通じて項目の選択を受け付ける。ユーザは操作部8を通じて転送対象となるファイルやデータを選択する。
S15でプロジェクト転送部53は、操作部8を通じて転送開始を指示されると、ユーザにより選択された転送項目を記憶装置25から読み出し、通信部26を通じてPLC2に転送する。なお、基本ユニット3のプロジェクト管理部33は転送されてきた選択項目を受信して記憶装置12に記憶する。
図14はプロジェクトの転送処理(読み出し処理)を示すフローチャートである。上述した統合開発環境におけるユーザインタフェース70において操作部8を通じて転送処理(読み出し処理)が指示されると、CPU24は転送処理を開始する。
S21でプロジェクト転送部53は通信部26を通じて基本ユニット3のプロジェクト管理部33に対して転送項目のリストを要求する。プロジェクト管理部33は、記憶装置12に記憶されているプロジェクト41をサーチすることで、プロジェクト41に含まれているファイルやデータのリストを作成する。プロジェクト管理部33は、通信部26を通じてプログラム作成支援装置1へ作成したリストを送信する。
S22でプロジェクト転送部53は基本ユニット3のプロジェクト管理部33からリストを受信する。S23でプロジェクト転送部53は受信したリストを含む選択UI78の表示データを作成する。読み出し処理の選択UI78は、書き込み処理の選択UI78と基本的に同じものとなってもよい。S24でプロジェクト転送部53は選択UI78を表示部7に表示させる。S25でプロジェクト転送部53は選択UI78を通じて項目の選択を受け付ける。S26でプロジェクト転送部53は操作部8を通じてユーザにより選択された項目をプロジェクト管理部33に対して転送するよう要求する。プロジェクト管理部33は、要求された項目を記憶装置12から読み出し、通信部26を介してプログラム作成支援装置1に対して送信する。S27でプロジェクト転送部53は基本ユニット3から送信された項目を受信し、受信した項目を記憶装置25に記憶させる。
このような手順によりプログラム作成支援装置1はPLC2からプロジェクト41の全体や一部を読み出すことが可能となる。プログラム作成支援装置1は、読み出したファイルを修正し、再度、PLC2に対して転送してもよい。これにより、修正したファイルだけを基本ユニット3に転送するため、転送時間を短縮できるようになる。
プロジェクト41の書き込みと読み出しは、たとえば、ユーザプログラムが実行中であっても実行可能である。とりわけ、プロジェクト転送部53は、PLC2においてラダープログラム(中間コード)43が実行されている最中にC言語プログラム(オブジェクトコード)44をPLC2に転送してもよい。C言語プログラム(オブジェクトコード)44は実行メモリ(RAM)にロードされているため、記憶装置25に記憶されているC言語プログラム(オブジェクトコード)44が更新されても、実行中のC言語プログラム(オブジェクトコード)44には影響が及ばない。
<依存ファイルの転送>
図13を用いて説明したようにプログラム作成支援装置1からPLC2に転送するファイルやデータの一部をプロジェクト転送部53が自動で選択してくれればユーザにとって選択の負担が軽減されよう。とりわけ、C言語プログラムを別のプログラム作成支援装置1で編集して再コンパイルするためにはC言語プログラム(ソース)62だけでなく、C言語プログラム(ソース)62と依存関係にあるヘッダファイルやライブラリなどが必要となる。
たとえば、C言語プログラム(ソース)62が3つのファイル(xxx.c、yyy.c、zzz.c)で構成されているとする(拡張子“c”はC言語のソースファイルを表す拡張子である)。プロジェクト転送部53がxxx.cを解析した結果、xxx.cはヘッダファイルであるa.hをインクルードしていたと仮定する(拡張子“h”はC言語のヘッダファイルを表す拡張子である)。また、プロジェクト転送部53がyyy.cを解析した結果、yyy.cはヘッダファイルであるa.hとb.hをインクルードしていたと仮定する。また、また、プロジェクト転送部53がzzz.cを解析した結果、zzz.cはヘッダファイルであるd.hとe.hをインクルードしていたと仮定する。統合開発環境は、a.h、b.h、c.h、d.h、e.hを所定のフォルダに保持している。この場合、プロジェクト転送部53は、転送対象としてC言語プログラム(ソース)62と依存関係にあるa.h、b.h、d.h、e.hを転送対象として選択し、c.hについては選択しない。プロジェクト転送部53は、C言語プログラム(ソース)62と依存関係にあるファイル名を管理ファイルに保存して、プロジェクト41の一部としてPLC2に転送する。なお、プロジェクト転送部53は、複数のソースファイル(例:xxx.cとyyy.c)が同一のヘッダファイルをインクルードしている場合、同一のヘッダファイルを1つだけ転送する。別のプログラム作成支援装置1で再コンパイルを行う場合、ヘッダファイルを保存するフォルダの構造(ツリー構造)も復元される必要がある。そこで、フォルダの構造を示す情報も管理ファイルに格納される。また、ヘッダファイルに関するフォルダの構造は相対パスで記述されるものとする。ヘッダファイルの格納位置を相対パスで記述することで、PLC2におけるヘッダファイルの格納位置の自由度が増すであろう。別のプログラム作成支援装置1は図14にしたがった手順でPLC2からプロジェクト41や管理ファイルを読み出し、プログラム作成支援装置1の記憶装置25において管理ファイルで指定された相対パスにヘッダファイルを復元する。つまり、C言語プログラム(ソース)62におけるインクルードの記述を編集する手間を省けるようになる。
これによりPLC2が設置されている工場内で、つまり現場においてC言語プログラム(ソース)62を再編集してC言語プログラム(オブジェクトコード)44を再コンパイルし、PLC2に転送することも可能となる。つまり、最初にC言語プログラム(ソース)62を作成したコンピュータと、工場に設置されているPLC2に接続されたコンピュータとが異なっていてもC言語プログラム(オブジェクトコード)44を修正・更新することが可能となる。
<転送したプログラムの有効化>
PLC2ではユーザプログラムが更新されると、PLC2の電源スイッチをオフ/オンすることで、更新されたプログラムが有効になる。ユーザプログラムのタスクはリソースを確保して動作するが、動作中にユーザプログラムが切り替えられてしまうと、確保されていたリソースを回収できないため、システムリソースが枯渇してしまう。PLC2ではシステムリソースを解放するために、PLC2の電源スイッチをオフ/オンする必要があった。
上述したように、本実施例では、C言語などの高級プログラミング言語で記述されるユーザプログラムは、ユーザプログラムを実行中であっても転送可能であり、修正可能となる。しかし、修正されたユーザプログラムを有効化するために、PLC2の電源スイッチをオフ/オンするのはユーザにとって面倒であろう。そこで、本実施例では、電源スイッチをオフ/オンせずに、修正されたユーザプログラムを有効化する手法について説明する。
図15は高級プログラミング言語で記述されるユーザプログラムを実行する第2実行部31の機能を示す図である。操作部8からユーザプログラムの実行が指示されると、開始・停止制御部83は、ロード部81を制御し、記憶装置12に記憶されているC言語プログラム(オブジェクトコード)44を実行用メモリ82にロードさせる。また、開始・停止制御部83は、C言語プログラム(オブジェクトコード)44を実行させるための実行用タスク84を開始する。C言語プログラム(オブジェクトコード)44内に記述されているアプリケーションインタフェース(API)は、C言語プログラム(オブジェクトコード)44を停止可能な状態か、停止不可能な状態かを状態管理部85に通知する。たとえば、C言語プログラムのうち停止可能なプログラム区間には所定のAPIを呼び出すための命令が記述される。APIはC言語プログラム(オブジェクトコード)44から呼び出されるとC言語プログラム(オブジェクトコード)44が停止可能であることを示す。プログラマーはC言語プログラムのうち停止可能なプログラム区間を予め知っている。よって、その区間に停止可能な状態か、停止不可能な状態かを示すAPIを呼び出すための命令を記述しておくことで、状態管理部85はAPIを通じてC言語プログラムが停止可能か状態を認識できるようになる。
開始・停止制御部83は、C言語プログラム(オブジェクトコード)44が更新されたことをプロジェクト管理部33から通知されると、状態管理部85からC言語プログラム(オブジェクトコード)44の状態、つまり実行用タスク84の状態を取得する。実行用タスク84の状態が停止不可能な状態であれば、開始・停止制御部83は、所定のタイミング(例:定期的なタイミング)で状態管理部85から実行用タスク84の状態を取得し、実行用タスク84が停止可能な状態に遷移したかどうかを判定する。
実行用タスク84が停止可能な状態に遷移したことを検知すると、開始・停止制御部83は、実行用タスク84を停止させる。開始・停止制御部83は、ロード部81を制御し、記憶装置12に記憶されている更新済みのC言語プログラム(オブジェクトコード)44を実行用メモリ82にロードさせる。開始・停止制御部83は、実行用タスク84の開始アドレスを、C言語プログラム(オブジェクトコード)44がロードされたアドレスにセットして、実行用タスク84を再開する。
これにより、本実施例では、PLC2の電源スイッチをオフ/オンせずに、修正されたユーザプログラムを有効化することが可能となる。たとえば、ラダープログラム(中間コード)43が実行中であっても、古いC言語プログラム(オブジェクトコード)44を新しいC言語プログラム(オブジェクトコード)44に切り替えることが可能となる。つまり、PLC2においてC言語プログラム(オブジェクトコード)44が停止可能になると、プログラム編集部51により更新されたC言語プログラム(オブジェクトコード)44がPLC2の実行用メモリ82にロードされる。
<プログラム入力補助>
ラダープログラム(中間コード)43とC言語プログラム(オブジェクトコード)44とは演算結果や検知結果などを受け渡すことで連携して動作するようにプログラムされることがある。従来は、ラダープログラム(中間コード)43とC言語プログラム(オブジェクトコード)44の連携部をユーザが探し出して確認しながら入力していたため、プログラミング作業の負担が大きかった。したがって、一方の記述を参照して解析し、その記述に対応する記述を示唆できれば、ユーザは示唆された情報を見ながら連携部を入力できるようになるため、ユーザの負担を軽減できるであろう。また、対応する記述が自動で入力されればより一層便利であろう。
図16は入力補助を実現する機能を示すブロック図である。プログラム編集部51は入力補助を実現するためのいくつかの機能を有している。解析部91は、ラダープログラム(ソース)61やC言語プログラム(ソース)62を解析し、解析結果を解析結果保持部92に格納する。解析部91は、たとえば、ラダープログラム(ソース)61においてC言語プログラムを呼び出す命令である「CCALL」を検知すると、CCALLによって渡される引数などの情報を解析結果保持部92に格納する。同様に、解析部91は、C言語プログラム(ソース)62を解析し、関数を検知し、関数などの引数の情報などを解析結果保持部92に格納する。
入力受付部93は、操作部8を通じて入力された情報を受け付ける。入力補助部55は、ラダータブ72とC言語タブ73のうちどちらがアクティブ化を検知するとともに、アクティブになっているタブに基づきどちらの言語に対する入力かを判定する。たとえば、ラダータブ72がアクティブになっているときに、入力受付部93が「CCALL」というテキストを受け付けると、入力補助部55の一覧部56は、解析結果保持部92が保持している解析結果をサーチし、解析結果の一部である関数の一覧を表示部7に表示させる。
図17は関数の一覧を表示するUI(関数リスト95)の一例を示す図である。関数リスト95にはC言語プログラム(ソース)62から抽出された関数が列挙されている。ユーザは操作部8を通じていずれかの関数を選択する。入力補助部55のコメント部58は、選択された関数についてC言語プログラム(ソース)62内に記述されているコメントを読み出し、表示部7に表示させてもよい。これにより、ユーザは自己が意図している関数を選択したかどうかを確認できるようになろう。
入力受付部93が「CCALL “Function A”」というテキストを受け付けると、入力補助部55のコメント部58は、解析結果保持部92が保持している解析結果をサーチし、Function Aの引数の情報やコメントを表示部7に表示してもよい。これによりユーザはラダープログラム(ソース)61に記述すべき引数を容易に理解できるようになるため、プログラミングが容易になろう。
図18は入力補助の具体例を示す図である。図18(A)は2つの関数“Function A”、“Function B”が定義されているC言語プログラム(ソース)62の一例を示している。図18(A)はラダープログラム(ソース)61の入力インタフェース96の一例を示している。入力インタフェース96には操作部8および入力受付部93を通じて入力されたCCALLという命令と、入力受付部93から抽出された関数リスト95が含まれている。関数リスト95はプルダウンメニューなどによって実現されてもよい。関数リスト95には呼び出しシンボル名が列挙される。図18(C)は選択された関数についての引数97、98が自動入力された様子と、そのコメント99、100がツールチップ形式で表示された様子を示している。
図18(B)において入力補助部55は関数リスト95から“Function B”が選択されたことを認識し、解析結果保持部92が保持している解析結果をサーチし、Function Bの引数97、98やコメント99、100を抽出し、引数97、98に対応するデバイスのシンボルを入力する。さらに、入力補助部55は引数97に対応するコメント99を表示部7に表示させたり、引数98に対応するコメント100を表示部7に表示させたりする。入力補助部55はツールチップ表示のように操作部8を通じて表示を指示されたときにコメントを表示してもよい。
以上の具体例ではC言語プログラム(ソース)62を参照してラダープログラム(ソース)61の入力補助が提供されたが、ラダープログラム(ソース)61を参照してC言語プログラム(ソース)62の入力補助が提供されてもよい。たとえば、C言語タブ73内で“void”と入力されたことを検知すると、入力補助部55はラダープログラム(ソース)61の解析結果を参照し、CCALLにより呼び出されるシンボル名のリストを作成し、表示部7に表示させる。操作部8を通じてリストからいずれかのシンボル名が選択されると、入力補助部55は、選択されたシンボル名に対する引数のデバイスの個数や型などの情報を解析結果から取得する。入力補助部55は、取得された個数の引数をC言語プログラム(ソース)62に記述する。
以上の実施例ではC言語プログラム(ソース)62はC言語タブ73内で編集されるものとして説明したが、任意のテキストエディタで編集されてもよい。解析部91は、テキストエディタで編集されているC言語プログラム(ソース)62を解析し、解析結果を解析結果保持部92に格納する。これにより、上記と同様に、ラダープログラム(ソース)61への入力補助が提供される。また、入力補助部55は、ラダープログラム(ソース)61の解析結果と、テキストエディタで編集されているC言語プログラム(ソース)62への入力テキストとを比較し、入力テキストに応じた入力補助を提供してもよい。C言語プログラム(ソース)62への入力テキストが“void”であれば、ラダープログラム(ソース)61においてCCALLにより呼び出されるシンボル名をテキストエディタに渡してもよい。このように、任意のテキストエディタに対しても入力補助を提供できるようになる。
<ハンドシェイクプログラムの記述の自動化>
上述したようにプログラム編集部51は入力補助機能を有しているが引数や戻り値を受け渡すハンドシェイクプログラムの記述を自動化してもよい。とりわけ、ラダープログラム(中間コード)43からC言語プログラム(オブジェクトコード)44の関数を呼び出すためにラダープログラム(中間コード)43に記述されるハンドシェイクプログラムはひな形を予め用意することが可能である。このようなひな形はテンプレートとかスケルトンと呼ばれることもある。
入力補助部55は、インタフェースを定義する定義部59とハンドシェイクプログラムを生成する追加部57とをさらに有していてもよい。
図19はインタフェースを定義するための定義UI101と、ラダープログラム(ソース)61に挿入されるハンドシェイクプログラム110と、C言語プログラム(ソース)62に挿入されるハンドシェイクプログラム115の一例を示している。定義UI101は統合開発環境のユーザインタフェース70から呼び出される。
入力補助部55は、定義UI101を呼び出すための指示が操作部8を通じて入力されると、定義部59を起動し、表示部7に定義UI101を表示させる。定義UI101では、関数のシンボル名や、引数や戻り値のシンボル名、サイズ、種別を設定する設定部102が設けられている。この例では、シンボル名はシンボルを区別するための任意の名称である。サイズは、引き渡されるデータのサイズを示している。種別は、引数(IN)なのか戻り値(OUT)なのかを示している。IN/OUTはC言語プログラムから見たデータの引き渡し方向を示している。
入力補助部55は、予めラダープログラム(ソース)61に挿入されるハンドシェイクプログラム110と、C言語プログラム(ソース)62に挿入されるハンドシェイクプログラム115のスケルトンを有している。スケルトンはテンプレート66として記憶装置12に保持されている。入力補助部55の追加部57は、定義UI101を通じて入力されたシンボル名、サイズ、種別に応じてハンドシェイクプログラム110とハンドシェイクプログラム115を作成する。
一例として、ラダープログラム(ソース)61に挿入されるハンドシェイクプログラム110のスケルトン111について説明する。図19が示すように、スケルトン111には、引数を渡す命令であるCWRITE、関数を呼び出す命令であるCCALL、戻り値を受け取る命令であるCREAD、および、ハンドシェイク処理を終了する命令であるENDが記述されている。スケルトン111はテンプレート66に保持されている。入力補助部55の追加部57は、定義UI101で定義された情報をスケルトン111に入力することでハンドシェイクプログラム110を生成する。なお、CWRITEに続いて引数のシンボル名とそのデータサイズが入力されている。CREADに続いて戻り値のシンボル名とそのデータサイズが入力されている。
入力補助部55の追加部57は、定義UI101で定義された情報をスケルトンに入力することでC言語プログラム(ソース)62に挿入されるハンドシェイクプログラム115を生成する。図19が示すように、ハンドシェイクプログラム115には、定義UI101で定義された関数のシンボル名、引数や戻り値のシンボル名とデータサイズが定義されている。
このようにハンドシェイクプログラムの入力を自動化することでユーザのプログラミングに関する負担を軽減できるようになる。とりわけ、ハンドシェイクプログラム110には、引数のコピー部、関数の呼び出し部、戻り値のコピー部およびC言語プログラムの完了を待つ部分が含まれている。
<まとめ>
上述したようにプログラム編集部51は表示部7や操作部8を介して、グラフィカルプログラミング言語で記述されるユーザプログラムである第1プログラムと、高級プログラミング言語で記述されるユーザプログラムである第2プログラムとをユーザ入力にしたがって編集する。プロジェクト生成部52は第1プログラムと第2プログラムとを含むプロジェクト41を生成する。プロジェクト転送部53はプロジェクト41をPLC2に転送する。上記の実施例では基本ユニット3にプロジェクト41を転送しているが、モーションユニットなどの拡張ユニット4にプロジェクト41が転送されてもよい。基本ユニット3も拡張ユニット4もプログラマブル・ロジック・コントローラの一例である。判別部54は、第1プログラムの記述と第2プログラムの記述との間の整合性を判別する(統合チェック)。たとえば、判別部54は、第1プログラムにおけるデバイスに割り当てられた機能と、第2プログラムにおける当該デバイスに対する処理の内容とに基づいて、第1プログラムと第2プログラムとの整合性を判別してもよい。出力部50は第1プログラムと第2プログラムとが整合していないときに警告を出力する。このように判別部54が第1プログラムと第2プログラムとの間の整合性を判別するため、グラフィカルプログラミング言語により記述されるプログラムと高級プログラミング言語により記述されるプログラムを作成するユーザの負担が軽減される。
あるデバイスが、第1プログラムから第2プログラムに対してデータを渡すデバイスであるにもかかわらず、第2プログラムにおいて第2プログラムから第1プログラムに対してデータを渡すデバイスとして記述されていることを判別部54が発見してもよい。同様に、あるデバイスが、第2プログラムから第1プログラムに対してデータを渡すデバイスであるにもかかわらず、第2プログラムにおいて第1プログラムから第2プログラムに対してデータを渡すデバイスとして記述されていることを判別部54が発見してもよい。不整合が発見されると、出力部50は警告を出力してもよい。PLC2ではデバイスを通じて第1プログラムと第2プログラムとの間で引数などが渡される。よって、データの受け渡しの方向とデバイスに割り当てられている機能に着目することで、連携部の記述の誤りを発見することができる。
記憶装置25は複数のデバイスについて各デバイスの機能を示す機能ルール65を記憶したルール記憶部として機能してもよい。判別部54は、機能ルール65を参照して第1プログラムと第2プログラムとの整合性を判別してもよい。このように不整合を判別するのに役立つルールや基準情報を予め記憶装置25に記憶させておくことで、効率よく、整合性を判別できるようになろう。
判別部54は、第2プログラムの関数を呼び出すために、第1プログラムに記述されている当該関数に対する引数の数と、第2プログラムに記述されている当該関数の引数の数とが一致しているかどうかに基づいて第1プログラムと第2プログラムとの整合性を判別してもよい。このような引数の誤りは典型的な誤りであるため、これをユーザに報知することで、ユーザのプログラミングの負担が軽減されよう。
判別部54は、第1プログラムにおけるプログラムミスをチェックする第一チェック部と、第2プログラムにおけるプログラムミスをチェックする第二チェック部と、第1プログラムにおいてプログラムミスがなく、かつ、第2プログラムにおいてもプログラムミスがなくなると、第1プログラムと第2プログラムとの整合性をチェックする第三チェック部とを有していてもよい。第一チェック部は、第1プログラム単体での記述の整合性を判別する物であり、第二チェック部は第2プログラム単体での記述の整合性を判別する物であり、いずれも既知のものを採用できる。さらに、第三チェック部を設けることで、第1プログラムと第2プログラムとの間の整合性も検知できるようになる。
図12、図13を用いて説明したように、選択UI78は、第1プログラムと第2プログラムとのうちプロジェクト転送部53に転送させるプログラムを選択する選択部として機能する。また、プロジェクト転送部53は第2プログラムを解析し、その解析結果に基づいて、第2プログラムで参照されているヘッダファイルを転送対象として選択してもよい。このような選択部を設けることで、必要なファイルやデータだけを転送することが可能となる。つまり、プロジェクト転送部53は、PLC2において第1プログラムが実行されている最中に第2プログラムをPLC2に転送してもよい。たとえば、第1プログラムは更新されていないが、第2プログラムが更新されたときは第2プログラムだけを転送することで、転送時間を短縮することが可能となる。また、第1プログラムを実行中に第2プログラムを転送することも可能となる。つまり、第1プログラムを停止することなく、第2プログラムのみを更新することが可能となる。
図14を用いて説明したように、プロジェクト転送部53は、PLC2に転送されたプロジェクト41のすべてまたは一部を読み出す読出部として機能する。これにより、プロジェクト41を作成したプログラム作成支援装置1とは異なる別のプログラム作成支援装置1にプロジェクト41を保持させることが可能となる。さらに、この別のプログラム作成支援装置1においてプロジェクト41や第2プログラムを更新することが可能となる。プロジェクト転送部53は、この別のプログラム作成支援装置1のプログラム編集部51により更新された第2プログラムをPLC2に転送してもよい。たとえば、PLC2が設置されている工場内に小型のコンピュータ(ノートパソコンなど)を持ち込んで、その場でユーザプログラムを更新することも可能となろう。
図15を用いて説明したように、PLC2において第2プログラムが停止可能になると、プログラム編集部51により更新された第2プログラムがPLC2にロードされる。これにより、PLC2の電源スイッチをオフおよびオンすることなく、第2プログラムを有効化することが可能となる。なお、停止可能かどうか示すAPIが利用されてもよい。第2プログラムには停止可能なプログラム区間と停止可能ではないプログラム区間とが存在する。よって、停止可能なプログラム区間ではAPIを呼び出すための命令を記述しておくことで、停止可能なプログラム区間を明示的に宣言することが可能となろう。
図17や図18を用いて説明したように、第2プログラムにおいて定義された関数の一覧を表示部7に表示させる一覧部56が設けられてもよい。これにより入力すべき関数をユーザに示唆することが可能となる。さらに、一覧から選択された関数を呼び出すためのコードのひな形を第1プログラムに追加する追加部57が設けられてもよい。これによりユーザの入力作業を軽減することが可能となる。
図18を用いて説明したように、一覧から選択された関数に関連付けられているコメントを表示部7に表示させるコメント部58がさらに設けられてもよい。このコメントを参照することで、ユーザは入力すべき関数をより正確に選択することが可能となろう。なお、関数の引数などについてもコメントが表示されてもよい。これにより引数を正確に記述することが可能となろう。コメントは、コメント記号(C言語であれば、“/*”と“*/”)をもとに容易に抽出することが可能であろう。
図18や図19などを用いて説明したように、追加部57は、第2プログラムの関数を呼び出すために第1プログラムに記述された当該関数の名称および引数に基づき、当該関数を記述するコードのひな形を第2プログラムに追加してもよい。これによりユーザの入力作業を軽減することが可能となる。
図19などを用いて説明したように、第1プログラムと第2プログラムとの間のインタフェースを定義する定義部59が設けられてもよい。追加部57は、定義部59によって定義されたインタフェースにしたがって第1プログラムから第2プログラムを呼び出すためのハンドシェイクコードのひな形を第1プログラムに追加してもよい。これによりユーザの入力作業を軽減することが可能となる。追加部57は、定義部59によって定義されたインタフェースにしたがって第1プログラムから呼び出される関数のひな形を第2プログラムに追加してもよい。これによりユーザの入力作業を軽減することが可能となる。