(57)【特許請求の範囲】
【請求項１】
プログラマブル・ロジック・コントローラで実行されるユーザプログラムを作成するプログラム作成支援装置であって、
表示部と、
前記表示部を介して、グラフィカルプログラミング言語で記述されるユーザプログラムである第１プログラムと、高級プログラミング言語で記述されるユーザプログラムである第２プログラムとを編集する編集部と、
前記第１プログラムと前記第２プログラムとを含むプロジェクトを生成する生成部と、
前記プロジェクトを前記プログラマブル・ロジック・コントローラに転送する転送部と
を有しており、
前記プログラム作成支援装置は、さらに、
前記第１プログラムにおけるデバイスに割り当てられた機能と、前記第２プログラムにおける当該デバイスに対する処理の内容とに基づいて、前記第１プログラムと前記第２プログラムとの整合性を判別する判別部と、
前記第１プログラムと前記第２プログラムとが整合していないときに警告を出力する出力部と
をさらに有していることを特徴とするプログラム作成支援装置。
【請求項２】
前記デバイスが、前記第１プログラムから前記第２プログラムに対してデータを渡すデバイスであるにもかかわらず、前記第２プログラムにおいて前記第２プログラムから前記第１プログラムに対してデータを渡すデバイスとして記述されていることを前記判別部が発見すると、前記出力部は警告を出力することを特徴とする請求項１に記載のプログラム作成支援装置。
【請求項３】
前記デバイスが、前記第２プログラムから前記第１プログラムに対してデータを渡すデバイスであるにもかかわらず、前記第２プログラムにおいて前記第１プログラムから前記第２プログラムに対してデータを渡すデバイスとして記述されていることを前記判別部が発見すると、前記出力部は警告を出力することを特徴とする請求項１または２に記載のプログラム作成支援装置。
【請求項４】
複数のデバイスについて各デバイスの機能を示す機能ルールを記憶したルール記憶部をさらに有し、
前記判別部が、前記ルール記憶部に記憶されている機能ルールを参照して前記第１プログラムと前記第２プログラムとの整合性を判別することを特徴とする請求項１ないし３のいずれか１項に記載のプログラム作成支援装置。
【請求項５】
前記判別部は、前記第２プログラムの関数を呼び出すために、前記第１プログラムに記述されている当該関数に対する引数の数と、前記第２プログラムに記述されている当該関数の引数の数とが一致しているかどうかに基づいて前記第１プログラムと前記第２プログラムとの整合性を判別することを特徴とする請求項１ないし４のいずれか１項に記載のプログラム作成支援装置。
【請求項６】
前記判別部は、
前記第１プログラムにおけるプログラムミスをチェックする第一チェック部と、
前記第２プログラムにおけるプログラムミスをチェックする第二チェック部と、
前記第１プログラムにおいてプログラムミスがなく、かつ、前記第２プログラムにおいてもプログラムミスがなくなると、前記第１プログラムと前記第２プログラムとの整合性をチェックする第三チェック部と
をさらに有する請求項１ないし５のいずれか１項に記載のプログラム作成支援装置。
【請求項７】
前記第１プログラムと前記第２プログラムとのうち前記転送部に転送させるプログラムを選択する選択部をさらに有することを特徴とする請求項１ないし６のいずれか１項に記載のプログラム作成支援装置。
【請求項８】
前記選択部は、前記第２プログラムを前記転送部に転送させるプログラムとして選択すると、さらに前記第２プログラムを解析し、その解析結果に基づいて、前記第２プログラムで参照されているヘッダファイルも転送対象として選択することを特徴とする請求項７に記載のプログラム作成支援装置。
【請求項９】
前記プログラマブル・ロジック・コントローラに転送されたプロジェクトを読み出す読出部をさらに有し、
前記転送部は、前記読出部により読み出された前記プロジェクトに含まれる前記第２プログラムであって前記編集部により更新された前記第２プログラムを前記プログラマブル・ロジック・コントローラに転送することを特徴とする請求項１ないし８のいずれか１項に記載のプログラム作成支援装置。
【請求項１０】
前記転送部は、前記プログラマブル・ロジック・コントローラにおいて前記第１プログラムが実行されている最中に前記第２プログラムを前記プログラマブル・ロジック・コントローラに転送することを特徴とする請求項９に記載のプログラム作成支援装置。
【請求項１１】
前記プログラマブル・ロジック・コントローラにおいて前記第２プログラムが停止可能になると、前記編集部により更新された前記第２プログラムが前記プログラマブル・ロジック・コントローラにロードされることを特徴とする請求項９または１０に記載のプログラム作成支援装置。
【請求項１２】
前記第２プログラムのうち停止可能なプログラム区間には所定のアプリケーションインターフェースを呼び出すための命令が記述されており、当該アプリケーションインターフェースは当該第２プログラムから呼び出されると当該第２プログラムが停止可能であること
を示すことを特徴とする請求項１１に記載のプログラム作成支援装置。
【請求項１３】
前記第２プログラムにおいて定義された関数の一覧を前記表示部に表示させる一覧部と、
前記一覧から選択された関数を呼び出すためのコードのひな形を前記第１プログラムに追加する追加部と
をさらに有することを特徴とする請求項１ないし１２のいずれか１項に記載のプログラム作成支援装置。
【請求項１４】
前記第１プログラムと前記第２プログラムとの間のインタフェースを定義する定義部と、前記定義部によって定義されたインタフェースにしたがって前記第１プログラムから前記第２プログラムを呼び出すためのハンドシェイクコードのひな形を前記第１プログラムに追加する追加部と
をさらに有することを特徴とする請求項１ないし１２のいずれか１項に記載のプログラム作成支援装置。
【請求項１５】
前記判別部は、前記第２プログラムにおいて記述されている前記第１プログラムのプログラムモジュールのモジュール名をもとに、前記第１プログラムに当該モジュール名を付与されたプログラムモジュールが存在するかどうかを判別することを特徴とする請求項１ないし１４のいずれか１項に記載のプログラム作成支援装置。
【請求項１６】
プログラマブル・ロジック・コントローラで実行されるユーザプログラムを作成するプログラム作成支援装置で実行されるプログラムであって、
前記プログラム作成支援装置の表示部を介して、グラフィカルプログラミング言語で記述されるユーザプログラムである第１プログラムと、高級プログラミング言語で記述されるユーザプログラムである第２プログラムとを編集する編集部と、
前記第１プログラムと前記第２プログラムとを含むプロジェクトを生成する生成部と、
前記プロジェクトを前記プログラマブル・ロジック・コントローラに転送する転送部と、
前記第１プログラムにおけるデバイスに割り当てられた機能と、前記第２プログラムにおける当該デバイスに対する処理の内容とに基づいて、前記第１プログラムと前記第２プログラムとの整合性を判別する判別部と、
前記第１プログラムと前記第２プログラムとが整合していないときに警告を出力する出力部と
を前記プログラム作成支援装置に機能させるプログラム。
【請求項１７】
プログラマブル・ロジック・コントローラで実行される複数のユーザプログラム間の整合性を判別する判別方法であって、
プログラム作成支援装置において、グラフィカルプログラミング言語で記述されるユーザプログラムである第１プログラムと、高級プログラミング言語で記述されるユーザプログラムである第２プログラムとの編集を受け付ける工程と、
前記プログラム作成支援装置において、前記第１プログラムにおけるデバイスに割り当てられた機能と、前記第２プログラムにおける当該デバイスに対する処理の内容とに基づいて、前記第１プログラムと前記第２プログラムとの整合性を判別する工程と、
プログラム作成支援装置において、前記第１プログラムと前記第２プログラムとが整合していないときに警告を出力する工程と
を有することを特徴とする判別方法。
【請求項１８】
プログラマブル・ロジック・コントローラで実行されるユーザプログラムを作成するプログラム作成支援装置であって、
表示部と、
前記表示部を介して、グラフィカルプログラミング言語で記述されるユーザプログラムである第１プログラムと、高級プログラミング言語で記述されるユーザプログラムである第２プログラムとを編集する編集部と、
前記第１プログラムにおける記述と前記第２プログラムにおける記述との整合性を判別する判別部と、
前記第１プログラムの記述と前記第２プログラムの記述とが整合していないときに警告を出力する出力部と
を有していることを特徴とするプログラム作成支援装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラマブル・ロジック・コントローラ用のプログラムを作成するプログラム作成支援装置、プログラム作成支援装置で実行されるプログラムおよび判別方法に関する。
【背景技術】
【０００２】
特許文献１が示すようにラダープログラムとＣ言語プログラムとを実行するプログラマブル・ロジック・コントローラ（ＰＬＣ）が知られている。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２００６−１７８８１８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
ＰＬＣで実行されるラダープログラムとＣ言語プログラムとは連携して動作することがあるが、従来は、それぞれ専用の編集ソフトウエアを使用してプログラム作成支援装置で作成されていた。そのため、ラダープログラムの編集ソフトウエアではラダープログラムについてのデバッグを行えるが、Ｃ言語プログラムのデバッグを行えなかった。同様に、Ｃ言語プログラムの編集ソフトウエアではＣ言語プログラムについてのデバッグを行えるが、ラダープログラムのデバッグを行えなかった。このようにそれぞれの編集ソフトウエアではシンタックスエラーや各プログラム内での記述の整合性などを検知することはできても、言語の異なる複数のプログラム間での整合性などを検査することができず、ユーザビリティに欠けていた。たとえば、ラダープログラムからＣ言語プログラムに渡される引数を格納するデバイスの個数や型が双方のプログラム間で整合していなければならないが、その確認はユーザが目視で確認しなければならなかった。
【０００５】
そこで、本発明は、ラダープログラムのようなグラフィカルプログラミング言語により記述されるプログラムとＣ言語のような高級プログラミング言語により記述されるプログラムを作成するユーザの負担を軽減することを目的とする。
【課題を解決するための手段】
【０００６】
本発明は、たとえば、
プログラマブル・ロジック・コントローラで実行されるユーザプログラムを作成するプログラム作成支援装置であって、
表示部と、
前記表示部を介して、グラフィカルプログラミング言語で記述されるユーザプログラムである第１プログラムと、高級プログラミング言語で記述されるユーザプログラムである第２プログラムとを編集する編集部と、
前記第１プログラムと前記第２プログラムとを含むプロジェクトを生成する生成部と、
前記プロジェクトを前記プログラマブル・ロジック・コントローラに転送する転送部と
を有しており、
前記プログラム作成支援装置は、さらに、
前記第１プログラムにおけるデバイスに割り当てられた機能と、前記第２プログラムにおける当該デバイスに対する処理の内容とに基づいて、前記第１プログラムと前記第２プログラムとの整合性を判別する判別部と、
前記第１プログラムと前記第２プログラムとが整合していないときに警告を出力する出力部と
をさらに有していることを特徴とするプログラム作成支援装置を提供する。
【発明の効果】
【０００７】
本発明によれば、グラフィカルプログラミング言語により記述されるプログラムと高級プログラミング言語により記述されるプログラムを作成するユーザの負担を軽減することが可能となる。
【図面の簡単な説明】
【０００８】
【図１】ＰＬＣシステムの一例を示す図
【図２】ユーザプログラムの一例を示す図
【図３】プログラム作成支援装置の一例を示す図
【図４】ＰＬＣの一例を示す図
【図５】スキャンタイムを説明するための図
【図６】ＰＬＣの機能を示す図
【図７】プログラム作成支援装置の機能を示す図
【図８】統合開発環境のユーザインタフェースの一例を示す図
【図９】整合性判別処理を示す図
【図１０】判別結果の一例を示す図
【図１１】判別結果の一例を示す図
【図１２】転送処理（書き込み）の一例を示すフローチャート
【図１３】転送項目を選択するためのユーザインタフェースの一例を示す図
【図１４】転送処理（読み出し）の一例を示すフローチャート
【図１５】プログラムをロードするための機能を示す図
【図１６】入力補助機能を示す図
【図１７】関数リストの一例を示す図
【図１８】入力補助の概念を示す図
【図１９】ハンドシェイクプログラムの生成例を示す図
【発明を実施するための形態】
【０００９】
以下に本発明の一実施形態を示す。以下で説明される個別の実施形態は、本発明の上位概念、中位概念および下位概念など種々の概念を理解するために役立つであろう。また、本発明の技術的範囲は、特許請求の範囲によって確定されるのであって、以下の個別の実施形態によって限定されるわけではない。
【００１０】
はじめにプログラマブル・ロジック・コントローラ（ＰＬＣ、単にプログラマブルコントローラと呼ばれてもよい）を当業者にとってよりよく理解できるようにするために、一般的なＰＬＣの構成とその動作について説明する。
【００１１】
図１は、本発明の実施の形態によるプログラマブル・ロジック・コントローラシステムの一構成例を示す概念図である。図１に示すように、このシステムは、ラダープログラムなどのユーザプログラムの編集を行うためのプログラム作成支援装置１と、工場等に設置される各種制御装置を統括的に制御するためのＰＬＣ（プログラマブル・ロジック・コントローラ）２とを備えている。ユーザプログラムは、ラダー言語やモーションフローなどのグラフィカルプログラミング言語を用いて作成されてもよいし、Ｃ言語などの高級プログラミング言語を用いて作成されてもよい。以下では、説明の便宜上、ユーザプログラムはラダープログラムとする。ＰＬＣ２は、ＣＰＵが内蔵された基本ユニット３と１つないし複数の拡張ユニット４を備えている。基本ユニット３に対して１つないし複数の拡張ユニット４が着脱可能となっている。基本ユニット３はＣＰＵユニットと呼ばれることもある。
【００１２】
基本ユニット３には、表示部５及び操作部６が備えられている。表示部５には、基本ユニット３に取り付けられている各拡張ユニット４の動作状況などを表示することができ、表示部５の表示内容は、操作部６を操作することにより切り替えることができる。表示部５には、通常、ＰＬＣ２内のデバイスの現在値（デバイス値）やＰＬＣ２内で生じたエラー情報などが表示される。なお、デバイスとは、デバイス値を格納するために設けられたメモリ上の領域を指す名称であり、デバイスメモリと呼ばれてもよい。デバイス値とは、入力機器からの入力状態、出力機器への出力状態およびユーザプログラム上で設定される内部リレー（補助リレー）、タイマー、カウンタ、データメモリ等の状態を示す情報である。
【００１３】
拡張ユニット４は、ＰＬＣ２の機能を拡張するために用意されており、基本ユニット３に対して側方から取り付けられる。１つ目の拡張ユニット４は、基本ユニット３に対して側方から直接的に取り付けられる。２つ目以降の拡張ユニット４は、既に取り付けられている拡張ユニット４に対して、側方から直列的に取り付けられる。たとえば、基本ユニット３の右側面と拡張ユニット４の左側面とが連結面になっている。同様に、１つ目の拡張ユニット４の右側面の形状等は基本ユニット３の右側面とほぼ同じであるため、１つ目の拡張ユニット４の右側面に２つ目の拡張ユニット４の左側面が連結される。このような連結方式は、数珠つなぎ方式とかデイジーチェーン方式と呼ばれてもよい。各連結面にはコネクタが設けられており、通信や電力供給を行うためのバスもコネクタを介して連結される。このようにして、基本ユニット３と複数の拡張ユニット４が直列的に取り付けられると、各拡張ユニット４内に備えられた配線（例：バス）を介して、各拡張ユニット４が基本ユニット３に対して通信可能に接続される。各拡張ユニット４には、その拡張ユニット４の機能に対応する被制御装置１６（図４）が接続され、これにより、各被制御装置１６が拡張ユニット４を介して基本ユニット３に接続される。被制御装置１６には、センサなどの入力装置や、アクチュエータなどの出力装置が含まれる。
【００１４】
プログラム作成支援装置１は、たとえば、携帯可能ないわゆるノートタイプやタブレットタイプのパーソナルコンピュータであって、表示部７及び操作部８を備えている。ＰＬＣ２を制御するためのユーザプログラムの一例であるラダープログラムは、プログラム作成支援装置１を用いて作成され、その作成されたラダープログラムは、プログラム作成支援装置１内でニモニックコードに変換される。そして、プログラム作成支援装置１を、ＵＳＢ(Universal Serial Bus)などの通信ケーブル９を介してＰＬＣ２の基本ユニット３に接続し、ニモニックコードに変換されたラダープログラムをプログラム作成支援装置１から基本ユニット３に送ると、そのラダープログラムが基本ユニット３内でマシンコードに変換され、基本ユニット３に備えられたメモリ内に記憶される。なお、ここではニモニックコードを基本ユニット３に送信するようにしているが、本発明はこれに限られず、例えばニモニックコードを更に中間コードに変換し、中間コードを基本ユニット３に送信するようにしてもよい。
【００１５】
なお、図１では示していないが、プログラム作成支援装置１の操作部８には、プログラム作成支援装置１に接続されたマウスなどのポインティングデバイスが含まれていてもよい。また、プログラム作成支援装置１は、ＵＳＢ以外の他の通信ケーブル９を介して、ＰＬＣ２の基本ユニット３に対して着脱可能に接続されるような構成であってもよい。
【００１６】
図２は、ラダープログラムの作成時にプログラム作成支援装置１の表示部７に表示されるラダー図１７の一例を示す図である。図２に示すように、ＰＬＣ２を制御するためのラダープログラムは、プログラム作成支援装置１の表示部７にマトリックス状に表示される複数のセル１８内に仮想デバイスのシンボル１９を適宜配置して、視覚的なリレー回路を表すラダー図１７を構築することにより作成される。
【００１７】
ラダー図１７には、たとえば、１０列×Ｎ行（Ｎは任意の自然数）のセル１８が配置されている。そして、各行のセル１８内に、図２に示す左側から右側に向かって、時系列的に仮想デバイスのシンボル１９を適宜配置することにより、視覚的なリレー回路を作成することができる。作成されるリレー回路は、１行で表される直列的なリレー回路であってもよいし、複数行に並列的に表されたリレー回路を互いに結合することにより作成された、並列的なリレー回路であってもよい。
【００１８】
図２に示すリレー回路は、入力装置からの入力信号に基づいてオン／オフされる３つの仮想デバイス（以下、「入力デバイス」と呼ぶ。）のシンボル１９ａ，１９ｂ，１９ｃと、出力装置の動作を制御するためにオン／オフされる仮想デバイス（以下、「出力デバイス」と呼ぶ。）のシンボル１９ｄとが適宜結合されることにより構成されている。
【００１９】
各入力デバイスのシンボル１９ａ，１９ｂ，１９ｃの上方に表示されている文字（「Ｒ０００１」、「Ｒ０００２」及び「Ｒ０００３」）は、その入力デバイスのデバイス名（アドレス名）２１を表している。各入力デバイスのシンボル１９ａ，１９ｂ，１９ｃの下方に表示されている文字（「フラグ１」、「フラグ２」及び「フラグ３」）は、その入力デバイスに対応付けられたデバイスコメント２２を表している。出力デバイスのシンボル１９ｄの上方に表示されている文字（「原点復帰」）は、その出力デバイスの機能を表す文字列からなるラベル２３である。
【００２０】
図２に示す例では、デバイス名「Ｒ０００１」及び「Ｒ０００２」にそれぞれ対応する２つの入力デバイスのシンボル１９ａ，１９ｂが直列的に結合されることにより、ＡＮＤ回路が構成されている。また、これらの２つの入力デバイスのシンボル１９ａ，１９ｂからなるＡＮＤ回路に対して、デバイス名「Ｒ０００３」に対応する入力デバイスのシンボル１９ｃが並列的に結合されることにより、ＯＲ回路が構成されている。すなわち、このリレー回路では、２つのシンボル１９ａ，１９ｂに対応する入力デバイスがいずれもオンした場合、又は、シンボル１９ｃに対応する入力デバイスがオンした場合にのみ、シンボル１９ｄに対応する出力デバイスがオンされるようになっている。
【００２１】
図３は、図１のプログラム作成支援装置１の電気的構成について説明するためのブロック図である。図３に示すように、プログラム作成支援装置１には、ＣＰＵ２４、表示部７、操作部８、記憶装置２５及び通信部２６が備えられている。表示部７、操作部８、記憶装置２５及び通信部２６は、それぞれＣＰＵ２４に対して電気的に接続されている。記憶装置２５は、少なくともＲＡＭを含む構成であり、ラダープログラム記憶部２５ａと、編集ソフト記憶部２５ｂとを備えている。
【００２２】
ユーザは、編集ソフト記憶部２５ｂに記憶されている編集ソフトをＣＰＵ２４に実行させて、操作部８を通じてラダープログラムを編集する。ここで、ラダープログラムの編集には、ラダープログラムの作成及び変更が含まれる。編集ソフトを用いて作成されたラダープログラムは、ラダープログラム記憶部２５ａに記憶される。また、ユーザは、必要に応じてラダープログラム記憶部２５ａに記憶されているラダープログラムを読み出し、そのラダープログラムを、編集ソフトを用いて変更することができる。通信部２６は、通信ケーブル９を介してプログラム作成支援装置１を基本ユニット３に通信可能に接続するためのものである。
【００２３】
図４は、ＰＬＣ２の電気的構成について説明するためのブロック図である。図４に示すように、基本ユニット３には、ＣＰＵ１０、表示部５、操作部６、記憶装置１２及び通信部１４が備えられている。表示部５、操作部６、記憶装置１２、及び通信部１４は、それぞれＣＰＵ１０に電気的に接続されている。記憶装置１２は、ＲＡＭやＲＯＭ、メモリカードなどを含んでもよく、ラダープログラムなどを記憶する。記憶装置１２には、プログラム作成支援装置１から入力されたラダープログラムやユーザデータが上書きして記憶される。また、記憶装置１２には基本ユニット用の制御プログラムも格納されている。図４が示すように基本ユニット３と拡張ユニット４とは拡張バスの一種であるユニット外部バス９０を介して接続されている。なお、ユニット外部バス９０に関する通信機能は通信部１４の一部として実装されてもよい。
【００２４】
図５は、本発明の実施の形態に係るプログラマブルコントローラの基本ユニット３でのスキャンタイムの構成を示す模式図である。図５が示すように１つのスキャンタイムＴは、入出力のリフレッシュを行うためのユニット間通信２０１、プログラム実行２０２、ＥＮＤ処理２０４により構成されている。ユニット間通信２０１で、基本ユニット３は、ラダープログラムを実行して得られた出力データを基本ユニット３内の記憶装置１２から外部機器などに送信するとともに、受信データを含めた入力データを基本ユニット３内の記憶装置１２に取り込む。たとえば、基本ユニット３のデバイスに記憶されているデバイス値はリフレッシュによって拡張ユニット４のデバイスに反映される。同様に、拡張ユニット４のデバイスに記憶されているデバイス値はリフレッシュによって基本ユニット３のデバイスに反映される。なお、リフレッシュ以外のタイミングでデバイス値をユニット間で更新する仕組みが採用されてもよい。ただし、基本ユニット３のデバイスは基本ユニット３が随時書き換えており、同様に、拡張ユニット４のデバイスは拡張ユニット４が随時書き換えている。つまり、基本ユニット３のデバイスは基本ユニット３の内部の装置によって随時アクセス可能であり、同様に、拡張ユニット４のデバイスは拡張ユニット４の内部の装置によって随時アクセス可能になっている。基本ユニット３と拡張ユニット４との間では基本的にリフレッシュのタイミングにおいて相互にデバイス値を更新して同期する。プログラム実行２０２で、基本ユニット３は、更新された入力データを用いてプログラムを実行（演算）する。基本ユニット３はプログラムの実行によりデータを演算処理する。なお、ＥＮＤ処理とは、プログラム作成支援装置１や基本ユニット３に接続された表示器（図示せず）等の外部機器とのデータ通信、システムのエラーチェック等の周辺サービスに関する処理全般を意味する。
【００２５】
このように、プログラム作成支援装置１はユーザの操作に応じたラダープログラムを作成し、作成したラダープログラムをＰＬＣ２に転送する。ＰＬＣ２は、入出力リフレッシュ、ラダープログラムの実行およびＥＮＤ処理を１サイクル（１スキャン）として、このサイクルを周期的、すなわちサイクリックに繰り返し実行する。これにより、各種入力機器（センサ等）からのタイミング信号に基づいて、各種出力機器（モータ等）を制御する。よって、ＰＬＣ２は汎用のパーソナルコンピュータ（ＰＣ）とは全く異なる動きをする。
【００２６】
＜基本ユニットの機能＞
図６は基本ユニット３のＣＰＵ１０が制御プログラムを実行することで実現する機能を中心に示している。ＣＰＵ１０において第１実行部３０は、グラフィカルプログラミング言語で記述されるユーザプログラムである第１プログラムを実行する演算ユニットである。第１プログラムの一例としてラダープログラムを採用するが、他のグラフィカルプログラミング言語で記述されるユーザプログラムであってもよい。第１実行部３０は、ラダープログラム（中間コード）４３を実行形式のコードに変換する機能を備えていてもよい。第１実行部３０の外部にこのような変換器が設けられていてもよい。第２実行部３１は、高級プログラミング言語で記述されるユーザプログラムである第２プログラムを実行する演算ユニットである。第２プログラムの一例としてＣ言語プログラムを採用するが、他の高級プログラミング言語で記述されるユーザプログラムであってもよい。なお、ＣＰＵ１０は第１実行部３０と第２実行部３１に相当する演算部を異なる複数のＣＰＵコアとして備えていてもよいし、一方はＣＰＵ１０のＣＰＵコアが担当し、他方はＡＳＩＣなどで実装されてもよい。特に、第１実行部３０がラダープログラムを実行する際には高速処理が要求されるため、高速処理対応のＡＳＩＣで実装し、第２実行部３１が通信処理などを実行する際には高速処理は要求されないため、高機能ＣＰＵなどで実装してもよい。この場合、第１実行部３０と第２実行部３１はユニット内部バス３２によって接続され、通信する。
【００２７】
記憶装置１２には、基本ユニット３のシステムプログラム（ファームウエア）である制御プログラム４０と、プログラム作成支援装置１から転送されてきたプロジェクト４１などが記憶される。プロジェクト４１には、プロジェクトデータ４２、ラダープログラム（中間コード）４３およびＣ言語プログラム（オブジェクトコード）４４などが含まれている。プロジェクト４１には、ラダープログラムのソースコードやＣ言語プログラムのソースコードが含まれていてもよい。ラダープログラム（中間コード）４３はプログラム作成支援装置１によりソースコードから生成された中間コード（ニーモニック）である。Ｃ言語プログラム（オブジェクトコード）４４はプログラム作成支援装置１によりソースコードから生成された実行形式のコードである。
【００２８】
プロジェクト管理部３３は、プログラム作成支援装置１から通信部１４を介してプロジェクト４１の書き込み要求を受信すると、プログラム作成支援装置１からプロジェクト４１を受信して記憶装置１２に格納する。また、プロジェクト管理部３３は、プログラム作成支援装置１から読み出し要求を受信すると、読み出し対象として指定されたファイル（例：プロジェクト４１の全体、ラダープログラム（中間コード）４３のみ、Ｃ言語プログラム（オブジェクトコード）４４のみ、Ｃ言語プログラムのソースファイルのみなど）を記憶装置１２から読み出して、プログラム作成支援装置１に転送する。プロジェクト４１の読み出し機能はプロジェクト４１の再編集に有用である。
【００２９】
＜プログラム作成支援装置１の機能＞
図７はプログラム作成支援装置１が編集ソフトウエア６０を実行することで実現するＣＰＵ２４の機能を中心に記載している。編集ソフトウエア６０は、記憶装置２５の編集ソフト記憶部２５ｂに記憶されている。とりわけ、編集ソフトウエア６０は、グラフィカルプログラミング言語によるプログラミング環境と高級プログラミング言語によるプログラミング環境とを統合した開発環境を提供するものである。従来はグラフィカルプログラミング言語と高級プログラミング言語とでそれぞれ別々のプロジェクトが作成されて管理されていた。一方で、本実施例ではグラフィカルプログラミング言語と高級プログラミング言語とで１つのプロジェクトにより管理することが可能となる。つまり、１つのプロジェクトファイルによりＣ言語プログラムとラダープログラムとを管理できるようになる。また、従来は、グラフィカルプログラミング言語のプログラムについてはその開発環境内で整合性のチェックが実行されていた。同様に、従来は、高級プログラミング言語のプログラムについてはその開発環境内で整合性のチェックが実行されていた。つまり、整合性は個別にチェックされるにすぎず、両者の連携部の整合性についてはユーザが目視で行う必要があり、負担が大きかった。また、プロジェクトを転送してＣ言語プログラムをロードするにはＰＬＣ２の電源を一旦オフに切り替える必要があり、ＰＬＣ２を稼働させたままプロジェクトを転送してＣ言語プログラムをロードすることができなかった。グラフィカルプログラミング言語のプログラムと高級プログラミング言語によるプログラムとの連携部をユーザが記述するには一方のプログラムの記述を参照しながらそれに対応する記述を他方のプログラムに追加する必要があった。しかし、一方の記述に対応する記述を示唆したり、自動入力したりするなどといった入力補助を提供できれば、ユーザの負担を軽減できるであろう。また、連携部における引数や戻り値を受け取るためのハンドシェイクプログラムを記述する手間を省くこともユーザにとっては便利であろう。そこで、編集ソフトウエア６０はこれらの課題を解決する機能を有している。
【００３０】
ラダープログラム記憶部２５ａには、プロジェクト４１、機能ルール６５、テンプレート６６など記憶されている。プログラム作成支援装置１が保持しているプロジェクト４１とＰＬＣ２が保持しているプロジェクト４１には、プロジェクトデータ４２、ラダープログラム（ソース）６１、ラダープログラム（中間コード）４３、Ｃ言語プログラム（ソース）６２、Ｃ言語プログラム（オブジェクトコード）４４などが含まれる。プロジェクト４１をＰＬＣ２に転送するときに一部のファイルが削除されてもよい。たとえば、ＰＬＣ２にとってソースコードなどは必ずしも必要ではないため、これらは転送されなくてもよい。なお、ソースコードも転送しておくと、ＰＬＣ２からソースコードを取得した別のプログラム作成支援装置１においてソースコードを再編集することが可能となる。プロジェクトデータ４２はプロジェクト４１を構成している複数のファイル名と、どのファイルがソースアファイルであり、どのファイルが実行ファイルであるかなどを管理するためのデータを有している。ラダープログラム（中間コード）４３はラダープログラム（ソース）６１を変換することで生成される中間コードである。Ｃ言語プログラム（オブジェクトコード）４４は、Ｃ言語プログラム（ソース）６２を変換することで生成される実行形式のファイルである。
【００３１】
プログラム編集部５１は、たとえば、表示部７にラダープログラムの編集領域を表示し、操作部８から入力された指示にしたがってラダープログラム（ソース）６１を作成する。さらに、プログラム編集部５１は、たとえば、表示部７にＣ言語プログラムの編集領域を表示し、操作部８から入力された指示にしたがってソースコード（Ｃ言語プログラム（ソース）６２）を作成する。なお、Ｃ言語プログラム（ソース）６２は一般的なテキストエディタにより編集されてもよいが、プログラム編集部５１はこの場合にも入力補助機能を提供してもよい。プロジェクト生成部５２は、プロジェクト４１の名称、プロジェクト４１に含まれる各ファイルのファイル名を編集し、プロジェクトデータ４２を作成する。また、プロジェクト生成部５２は、ソースコードのコンパイラー（実行コードや中間コードへの変換器（複数の中間コードをリンクして実行コードを生成するリンカーなどが含まれてもよい））を有し、実行形式や中間形式のファイルを生成する。プロジェクト転送部５３はプロジェクト４１をＰＬＣ２に転送する（書き込み機能）。プロジェクト転送部５３はＰＬＣ２が保持しているプロジェクト４１をＰＬＣ２から受信してもよい（読み出し機能）。
【００３２】
判別部５４は、主に、ラダープログラム（ソース）６１とＣ言語プログラム（ソース）６２との間の連携部の記述の整合性を判別する。ラダープログラム（ソース）６１とＣ言語プログラム（ソース）６２とは相互にデータを送受信することで連携して動作する。データは引数や戻り値として受け渡されるが、ＰＬＣ２では上述したデバイスに引数や戻り値が割り当てられる。つまり、ラダープログラムとＣ言語プログラムとが相互にデバイスメモリにアクセスすることで引数や戻り値が受け渡される。この場合、判別部５４は、ラダープログラム（ソース）６１におけるデバイスの機能と、Ｃ言語プログラム（ソース）６２における当該デバイスに対する処理の内容とに基づいて、ラダープログラム（ソース）６１とＣ言語プログラム（ソース）６２との整合性を判別する。たとえば、ラダープログラムにおいて、Ｃ言語プログラムへデータを出力するためのデバイスが記述されている場合に、Ｃ言語プログラムにおいて当該デバイスにデータを書き込む記述が存在した場合、判別部５４は不整合と判別する。出力部５０は判別結果を示すメッセージなどを表示部７に表示させる。たとえば、出力部５０はこれらのプログラムのソースが整合していないときに表示部７に警告を出力する。
【００３３】
ラダープログラム内で複数のプログラムモジュールが定義されることがあり、Ｃ言語プログラムからこれらのプログラムモジュールが利用されることがある。この場合、判別部５４は、Ｃ言語プログラム（ソース）６２において記述されているモジュール名を取得し、当該モジュール名を付与されているプログラムモジュールがラダープログラム内で定義されているかどうかを判別してもよい。たとえば、Ｃ言語プログラム（ソース）６２において“ＩｓＡｃｔｉｖｅ（“module_X”）”という記述が存在したとする。module_Xはモジュール名である。ＩｓＡｃｔｉｖｅ（ ）はラダープログラムで定義されているプロラムモジュールの実行状態を取得するために用意されているＡＰＩである。この場合、判別部５４は、ラダープログラム（ソース）６１内をサーチしてモジュール名として“module_X”を有するプログラムモジュールが定義されているかどうかを判別する。“module_X”を有するプログラムモジュールが定義されていなければ、判別部５４は不整合と判別する。
【００３４】
プログラム編集部５１は入力補助部５５を有していてもよい。一般に、ラダープログラムからＣ言語プログラムへ渡す引数などの記述や、Ｃ言語プログラムからラダープログラムへ渡す引数または戻り値などの記述をそれぞれのソースファイルに記述しなければならない。従来は、それぞれ個別にユーザが手作業で記述を行っていたため、ユーザの負担が大きかった。一方でこれらの引数の引き渡しに関する記述はひな形（テンプレートまたはスケルトン）化することが可能である。このようなひな形はテンプレート６６として保持されていてもよい。たとえば、Ｃ言語プログラムにおける複数の関数と、各関数について必要となるラダープログラムとを対応付けてデータベース化して管理しておけば、ユーザが選択した関数に対応するラダープログラムのテンプレートをラダープログラムのソースファイルに追加することが可能となる。たとえば、入力補助部５５の一覧部５６はＣ言語プログラムのソースファイルであるＣ言語プログラム（ソース）６２において定義された関数の一覧を表示部７に表示させてもよい。追加部５７は表示部７に表示された一覧から操作部８を通じてユーザに選択された関数を呼び出すためのコードのひな形をラダープログラム（ソース）６１に追加する。ユーザはひな形を必要に応じて修正することもあろうが、それでもユーザは大幅にプログラミングの手間を省けるようになろう。追加部５７は、Ｃ言語プログラムの関数をラダープログラムから呼び出すためにラダープログラム（ソース）６１に記述された当該関数の名称（シンボル名）および引数に基づき、当該関数を記述するコードのひな形をＣ言語プログラム（ソース）６２に追加してもよい。このような入力補助を提供することで、ユーザは大幅にプログラミングの手間を省けるようになろう。
【００３５】
ソースファイルにはプログラマーがコメントを記述することがある。これは何のためのソースコードや関数であるかを、自分だけでなく、第三者にもわかりやすくし、再編集の効率を向上させるためである。本実施例のような統合開発環境では、Ｃ言語プログラム（ソース）６２に記述したコメントがラダープログラム（ソース）６１を編集する際に役に立つことがある。そこで、入力補助部５５のコメント部５８は、一覧から選択された関数に関連付けられているコメントをＣ言語プログラム（ソース）６２から取得して表示部７に表示させてもよい。このようなコメントの表示もユーザの入力作業を補助するものとなろう。
【００３６】
入力補助部５５はさらに定義部５９や追加部５７を有していてもよい。定義部５９は、ラダープログラム（中間コード）４３とＣ言語プログラム（オブジェクトコード）４４との間のインタフェースを定義する機能である。追加部５７は、定義部５９によって定義されたインタフェースにしたがってラダープログラム（中間コード）４３からＣ言語プログラム（オブジェクトコード）４４を呼び出すためのハンドシェイクコードのひな形をラダープログラム（中間コード）４３のソースファイルに追加してもよい。従来はこのようなハンドシェイクコードについてはユーザが手作業で記述していた。しかし、予めハンドシェイクコードのひな形を用意しておくことで、ユーザは大幅にプログラミングの手間を省けるようになろう。
【００３７】
記憶装置２５には機能ルール６５とテンプレート６６とが記憶されている。機能ルール６５は、複数のデバイスについて各デバイスの機能を示すルールである。たとえば、機能ルール６５は、デバイスＤＭ０は出力用、デバイスＤＭ１は入力用、デバイスＤＭ２は入出力用といったように、各デバイスごとに定義された機能を示す情報を保持していてもよい。判別部５４は、ルール記憶部である記憶装置２５に記憶されている機能ルール６５を参照してラダープログラム（ソース）６１とＣ言語プログラム（ソース）６２の整合性を判別してもよい。
【００３８】
＜ユーザインタフェース＞
図８は統合開発環境のユーザインタフェースの一例を示す図である。プログラム編集部５１はユーザインタフェース７０を表示部７に表示する。ワークスペース７１は、ラダープログラム（ソース）６１の名称やＣ言語プログラム（ソース）６２の名称などを設定するための設定エリアである。この例では、操作部８を通じて新規のＣ言語プログラム（ソース）６２を追加するための指示が入力され、プログラム編集部５１がダイアログ７４を表示部７に表示させている。プロジェクト生成部５２は、ワークスペース７１を通じてユーザにより入力されたプロジェクト４１の名称、ラダープログラム（ソース）６１の名称、Ｃ言語プログラム（ソース）６２の名称、各実行ファイルの名称などをプロジェクトデータ４２に格納する。ラダータブ７２はラダープログラムを編集するためのタブである。Ｃ言語タブ７３はＣ言語プログラムを編集するためのタブである。ユーザは操作部８を通じて各プログラムのソースファイルを編集する。プロジェクト生成部５２はプロジェクト４１を１つの統合ファイルとしてまとめてもよいし、複数のファイルに分割して管理してもよい。後者の場合、プログラム編集部５１はＣ言語プログラム（ソース）６２をテキストファイルに保存してもよい。テキストファイルに保存されたＣ言語プログラム（ソース）６２はユーザにとって使い慣れたテキストエディタによる編集を可能とする。
【００３９】
＜整合性のチェック＞
判別部５４は、ラダープログラム（ソース）６１に含まれる複数の記述間の整合性をチェックする第一チェック部と、Ｃ言語プログラム（ソース）６２に含まれる複数の記述間の整合性をチェックする第二チェック部と、ラダープログラム（ソース）６１とＣ言語プログラム（ソース）６２との間の連携部における整合性をチェックする第三チェック部とを有している。整合性はプログラムミス（シンタックスエラーなど）によって失われる。よって、これらのチェック部はプログラムミスをチェックする機能である。判別部５４は、ラダープログラム（ソース）６１とＣ言語プログラム（ソース）６２とでプログラムミスをチェックし、出力部５０はチェック結果を表示部７に表示させる。ユーザは表示部７に表示されたチェック結果に応じて記述を修正する。判別部５４は、各プログラム単体でのミスが無くなると、両プログラム間の連携部の整合性チェックを実行してもよい。これにより、連携部のプログラムミスをユーザに通知し、ユーザの修正を補助することが可能となる。
【００４０】
Ｃ言語プログラム内での記述の整合性のチェック機能やラダープログラム内での記述の整合性のチェック機能は既知であるため、ここではＣ言語プログラムとラダープログラムとの間の整合性のチェック（統合チェック）について詳細に説明する。
【００４１】
上述したように判別部５４は機能ルール６５にしたがって統合チェックを実行する。機能ルール６５にはチェックの対象となる１つ以上のルールが含まれている。一方の言語のソースファイルに記述されているシンボルが他方の言語のソースファイルにも記述されているかどうかがチェックされる。たとえば、ラダープログラムからＣ言語プログラムのシンボル（関数）を呼び出す場合に、ラダープログラム（ソース）６１には当該シンボルを呼び出すための記述が存在するが、Ｃ言語プログラム（ソース）６２には当該シンボルが記述されていないことがある。この場合、判別部５４は、当該シンボルがＣ言語プログラム（ソース）６２に記述されていないことを検知し、出力部５０にその旨を示す判別結果を渡す。出力部５０は判別結果を示す警告メッセージを作成し、表示部７に表示させる。
【００４２】
また、機能ルール６５には、ラダープログラムがＣ言語プログラムに渡す引数の個数と、Ｃ言語プログラムがラダープログラム４３から受け取ろうとする引数の個数が一致していることが含まれている。判別部５４は、ラダープログラム（ソース）６１に記述されている、ある関数についての引数の個数と、Ｃ言語プログラム（ソース）６２に記述されている当該関数についての引数の個数とが一致しているかどうかを判別する。両者が一致していないことを判別部５４が検知すると、出力部５０にその旨を示す判別結果を渡す。出力部５０は判別結果を示す警告メッセージを作成し、表示部７に表示させる。なお、引数や戻り値にはそれぞれデータサイズが定められている。たとえば、呼び出し側となるプログラムのソースファイルにおいて２ワードのデータを引き渡すように記述されているのに、呼び出される側となるプログラムのソースファイルにおいて４ワードのデータを受け取るように記述されている場合、判別部５４は不整合と判別する。また、引数や戻り値の入出力の方向が一致していることもルールの一つとなろう。たとえば、呼び出し側となるプログラムのソースファイルにおいてデータを引き渡す（出力する）ように記述されているのに、呼び出される側となるプログラムのソースファイルにおいて当該データを引き渡す（出力する）ように記述されている場合、判別部５４は不整合と判別する。
【００４３】
図９は判別処理の一例を示すフローチャートである。操作部８を通じてチェックを指示されたり、オブジェクトコードや中間コードへの変換が指示されたりすると判別部５４が判別処理を開始する。
【００４４】
Ｓ１で判別部５４はラダープログラム（ソース）６１内の記述の整合性をチェックする。Ｓ２で判別部５４はＣ言語プログラム（ソース）６２内の記述の整合性をチェックする。Ｓ３で判別部５４はラダープログラム（ソース）６１内の記述がいずれも整合しており、かつ、Ｃ言語プログラム（ソース）６２内の記述もいずれも整合しているかどうかを判定する。いずれかの整合性に関するエラーが見つかると、判別部５４はＳ４に進む。Ｓ４で判別部５４は判別結果を出力部５０に渡すことで、出力部５０に不整合を示すメッセージを出力させる。Ｓ５でプログラム編集部５１は操作部８を通じてソースファイルの修正を受け付ける。その後、操作部８を通じて再びチェックが指示されると、Ｓ１に戻り、判別部５４がチェックを実行する。最終的に整合性のエラーが解消すると、判別部５４はＳ６に進む。
【００４５】
Ｓ６で判別部５４は、ラダープログラム（ソース）６１とＣ言語プログラム（ソース）６２との間の整合性をチェックする（統合チェック）。Ｓ７で判別部５４はラダープログラム（ソース）６１とＣ言語プログラム（ソース）６２との間の整合性にエラーがないかどうかを判定する。整合性にエラーが見つかると、判別部５４はＳ８に進む。Ｓ８で判別部５４は判別結果を出力部５０に渡すことで、出力部５０に不整合を示すメッセージを出力させる。Ｓ９でプログラム編集部５１は操作部８を通じてソースファイルの修正を受け付ける。その後、操作部８を通じて再びチェックが指示されると、Ｓ６に戻り、判別部５４がチェックを実行する。最終的に整合性のエラーが解消するまで、Ｓ６ないしＳ９が実行される。
【００４６】
図９では、ラダープログラム（ソース）６１内のプログラムミス（シンタックスエラー）がなくなり、かつ、Ｃ言語プログラム（ソース）６２内のプログラムミスがなくなると、統合チェックに進んでいる。しかし、判別部５４は、Ｓ１、Ｓ２、Ｓ６を連続して実行して、それぞれの判別結果をまとめて出力部５０に出力させてもよい。また、Ｓ９の後で判別部５４はＳ１に戻ってもよい。
【００４７】
図１０は、整合性の判別結果を表示するユーザインタフェースの一例である。ユーザインタフェース７０には、判別結果（チェック結果）を表示するための表示エリア７５が設けられている。この例では、整合性のエラーが発生していることを示す警告メッセージ７６が表示エリア７５に表示されている。警告メッセージ７６には、エラーが発生している位置（行番号）やエラーの内容（ラダープログラムから読み出されたＣ言語エントリーが存在しません）などが含まれている。
【００４８】
図１１は、整合性の判別結果を表示するユーザインタフェースの一例である。この例は整合性のエラーが無い状態のものである。この例では、ソースコードの変換が指示されると、整合性のチェックが実行され、整合性のエラーがないと変換が実行される。表示エリア７５には変換結果が表示される。なお、変換結果を示すダイアログ７７が表示されてもよい。
【００４９】
統合チェックについてさらに具体例を用いて説明する。ラダープログラム（ソース）６１において次のような記述があると仮定する。「ＣＣＡＬＬ  “ｆｕｎｃ”  （ＤＭ０，ＤＭ１）」。ここで、ＣＣＡＬＬはＣ言語プログラムを呼び出すためのラダー言語の命令である。“ｆｕｎｃ”は呼び出される関数名（シンボル名）である。ＤＭ０はラダープログラムからＣ言語プログラムに引数を渡すためのデバイスである。ＤＭ１はＣ言語プログラムからラダープログラムに引数（戻り値）を渡すためのデバイスである。Ｃ言語プログラム（ソース）６２には「Ｓｅｔ  Ｖａｌｕｅ（０，１５０）」という記述があったと仮定する。この命令は、０番目の引数に数値“１５０”を代入するという命令である。ラダープログラム（ソース）６１における０番目の引数はＤＭ０であり、これは引き渡し用のデバイスである。よって、Ｃ言語プログラムからデータを代入することはできない。なお、本来は「Ｓｅｔ  Ｖａｌｕｅ（１，１５０）」が正しい記述である（この命令は、１番目のデバイスであるＤＭ１に１５０を代入する命令）。
【００５０】
このように、判別部５４は、ラダープログラム（ソース）６１に記述されているデバイスの種類や機能（引き渡し用デバイスＤＭ０／受け取り用デバイスＤＭ１）と、Ｃ言語プログラム（ソース）６２に記述されている当該デバイスに対する命令の内容（引き渡し／受け取り）とに基づいて、ラダープログラム（ソース）６１とＣ言語プログラム（ソース）６２との間の整合性を判別してもよい。
【００５１】
＜プロジェクトの転送＞
上述したようにプログラム作成支援装置１はプロジェクト４１をＰＬＣ２に転送するが、プロジェクト４１に含まれるすべてのファイルを転送する必要がないこともある。たとえば、単一のプログラム作成支援装置１が用いられるケースでは、プログラム作成支援装置１がプロジェクト４１のすべてを保持しているため、プロジェクト４１を修正できる、一方で、プロジェクト４１を保持していない別のプログラム作成支援装置１をＰＬＣ２に接続してＣ言語プログラム（オブジェクトコード）４４を修正する場合にはＣ言語プログラム（ソース）６２が必要になる。よって、このケースではＰＬＣ２はＣ言語プログラム（ソース）６２も保持していなければならない。このように転送されるべきプロジェクト４１に含まれるべきファイルはユーザによって異なることがある。そこで、本実施例はプロジェクト４１に含まれるファイルやデータのうち転送対象とすべきものをユーザが選択できるようにする。
【００５２】
図１２はプロジェクトの転送処理（書き込み処理）を示すフローチャートである。上述した統合開発環境におけるユーザインタフェース７０において操作部８を通じて転送処理が指示されると、ＣＰＵ２４は転送処理を開始する。
【００５３】
Ｓ１１でプロジェクト転送部５３はプログラム作成支援装置１の記憶装置２５に記憶されているプロジェクト４１をサーチして転送項目のリストを作成する。プロジェクト４１に含まれるファイルやデータに関する情報はプロジェクトデータ４２に保持されている。よって、プロジェクト転送部５３はプロジェクトデータ４２を参照することで転送項目のリストを作成してもよい。あるいは、プロジェクトデータ４２にリストが含まれている場合、プロジェクト転送部５３はプロジェクトデータ４２からリストを取得してもよい。このようにプロジェクト転送部５３はリスト作成部またはリスト取得部を有している。
【００５４】
Ｓ１２でプロジェクト転送部５３は転送項目のリストを含む選択ユーザインタフェース（選択ＵＩ）を作成する。このようにプロジェクト転送部５３はＵＩ作成部を有している。たとえば、プロジェクト転送部５３は選択ＵＩのテンプレートを記憶装置２５に保持しており、リストをテンプレートに挿入することで選択ＵＩの表示データを作成する。Ｓ１３でプロジェクト転送部５３は選択ＵＩを表示部７に表示させる。
【００５５】
図１３は選択ＵＩの一例を示す図である。選択ＵＩ７８は選択項目のリスト７９を有しており、リスト７９には各選択項目の名称と、選択の有無を示すチェックボックスとが含まれている。ユーザは操作部８を通じてチェックボックスにチェックを入れたり、チェックを外したりすることで転送項目を選択する。なお、ラダープログラムだけが修正された場合は、ラダープログラムだけがチェックを付与される。これにより、転送項目を削減し、転送時間を短くすることが可能となろう。上述したようにプロジェクト４１を保持していない別のプログラム作成支援装置１でプロジェクト４１が編集される予定があれば、プロジェクト４１の全体や再編集に必要な部分が転送対象として選択されてもよい。たとえば、Ｃ言語プログラム（オブジェクトコード）４４について修正の必要があれば、Ｃ言語プログラム（ソース）６２も転送対象として選択される。Ｃ言語プログラム（ソース）６２において参照されているヘッダファイルなどは、選択ＵＩ７８を通じてユーザが選択してもよいし、プロジェクト転送部５３がＣ言語プログラム（ソース）６２を解析し、参照されているヘッダファイルを発見し、当該ヘッダファイルを転送対象として選択してもよい。後者の場合は、ユーザの選択の手間を省けて便利であろう。たとえば、Ｃ言語プログラム（ソース）６２において「#include ＜xxx/yyy.h＞」と宣言されている場合、プロジェクト転送部５３は、「xxx」という名称のフォルダ内を検索し、yyy.hという名称のヘッダファイルを発見し、転送対象として選択する。また、xxxという格納場所（パス名）に関する情報も転送対象とすることで、格納場所を含めたヘッダファイルの復元が容易になろう。このように、プロジェクト転送部５３は、Ｃ言語プログラム（ソース）６２を解析する解析部やその解析結果に基づいてＣ言語プログラム（ソース）６２で参照されているヘッダファイルを転送対象として選択する選択部として機能してもよい。なお、解析部や選択部はプロジェクト転送部５３から独立して実装されてもよい。
【００５６】
Ｓ１４でプロジェクト転送部５３は選択ＵＩ７８を通じて項目の選択を受け付ける。ユーザは操作部８を通じて転送対象となるファイルやデータを選択する。
【００５７】
Ｓ１５でプロジェクト転送部５３は、操作部８を通じて転送開始を指示されると、ユーザにより選択された転送項目を記憶装置２５から読み出し、通信部２６を通じてＰＬＣ２に転送する。なお、基本ユニット３のプロジェクト管理部３３は転送されてきた選択項目を受信して記憶装置１２に記憶する。
【００５８】
図１４はプロジェクトの転送処理（読み出し処理）を示すフローチャートである。上述した統合開発環境におけるユーザインタフェース７０において操作部８を通じて転送処理（読み出し処理）が指示されると、ＣＰＵ２４は転送処理を開始する。
【００５９】
Ｓ２１でプロジェクト転送部５３は通信部２６を通じて基本ユニット３のプロジェクト管理部３３に対して転送項目のリストを要求する。プロジェクト管理部３３は、記憶装置１２に記憶されているプロジェクト４１をサーチすることで、プロジェクト４１に含まれているファイルやデータのリストを作成する。プロジェクト管理部３３は、通信部２６を通じてプログラム作成支援装置１へ作成したリストを送信する。
【００６０】
Ｓ２２でプロジェクト転送部５３は基本ユニット３のプロジェクト管理部３３からリストを受信する。Ｓ２３でプロジェクト転送部５３は受信したリストを含む選択ＵＩ７８の表示データを作成する。読み出し処理の選択ＵＩ７８は、書き込み処理の選択ＵＩ７８と基本的に同じものとなってもよい。Ｓ２４でプロジェクト転送部５３は選択ＵＩ７８を表示部７に表示させる。Ｓ２５でプロジェクト転送部５３は選択ＵＩ７８を通じて項目の選択を受け付ける。Ｓ２６でプロジェクト転送部５３は操作部８を通じてユーザにより選択された項目をプロジェクト管理部３３に対して転送するよう要求する。プロジェクト管理部３３は、要求された項目を記憶装置１２から読み出し、通信部２６を介してプログラム作成支援装置１に対して送信する。Ｓ２７でプロジェクト転送部５３は基本ユニット３から送信された項目を受信し、受信した項目を記憶装置２５に記憶させる。
【００６１】
このような手順によりプログラム作成支援装置１はＰＬＣ２からプロジェクト４１の全体や一部を読み出すことが可能となる。プログラム作成支援装置１は、読み出したファイルを修正し、再度、ＰＬＣ２に対して転送してもよい。これにより、修正したファイルだけを基本ユニット３に転送するため、転送時間を短縮できるようになる。
【００６２】
プロジェクト４１の書き込みと読み出しは、たとえば、ユーザプログラムが実行中であっても実行可能である。とりわけ、プロジェクト転送部５３は、ＰＬＣ２においてラダープログラム（中間コード）４３が実行されている最中にＣ言語プログラム（オブジェクトコード）４４をＰＬＣ２に転送してもよい。Ｃ言語プログラム（オブジェクトコード）４４は実行メモリ（ＲＡＭ）にロードされているため、記憶装置２５に記憶されているＣ言語プログラム（オブジェクトコード）４４が更新されても、実行中のＣ言語プログラム（オブジェクトコード）４４には影響が及ばない。
【００６３】
＜依存ファイルの転送＞
図１３を用いて説明したようにプログラム作成支援装置１からＰＬＣ２に転送するファイルやデータの一部をプロジェクト転送部５３が自動で選択してくれればユーザにとって選択の負担が軽減されよう。とりわけ、Ｃ言語プログラムを別のプログラム作成支援装置１で編集して再コンパイルするためにはＣ言語プログラム（ソース）６２だけでなく、Ｃ言語プログラム（ソース）６２と依存関係にあるヘッダファイルやライブラリなどが必要となる。
【００６４】
たとえば、Ｃ言語プログラム（ソース）６２が３つのファイル（ｘｘｘ．ｃ、ｙｙｙ．ｃ、ｚｚｚ．ｃ）で構成されているとする（拡張子“ｃ”はＣ言語のソースファイルを表す拡張子である）。プロジェクト転送部５３がｘｘｘ．ｃを解析した結果、ｘｘｘ．ｃはヘッダファイルであるａ．ｈをインクルードしていたと仮定する（拡張子“ｈ”はＣ言語のヘッダファイルを表す拡張子である）。また、プロジェクト転送部５３がｙｙｙ．ｃを解析した結果、ｙｙｙ．ｃはヘッダファイルであるａ．ｈとｂ．ｈをインクルードしていたと仮定する。また、また、プロジェクト転送部５３がｚｚｚ．ｃを解析した結果、ｚｚｚ．ｃはヘッダファイルであるｄ．ｈとｅ．ｈをインクルードしていたと仮定する。統合開発環境は、ａ．ｈ、ｂ．ｈ、ｃ．ｈ、ｄ．ｈ、ｅ．ｈを所定のフォルダに保持している。この場合、プロジェクト転送部５３は、転送対象としてＣ言語プログラム（ソース）６２と依存関係にあるａ．ｈ、ｂ．ｈ、ｄ．ｈ、ｅ．ｈを転送対象として選択し、ｃ．ｈについては選択しない。プロジェクト転送部５３は、Ｃ言語プログラム（ソース）６２と依存関係にあるファイル名を管理ファイルに保存して、プロジェクト４１の一部としてＰＬＣ２に転送する。なお、プロジェクト転送部５３は、複数のソースファイル（例：ｘｘｘ．ｃとｙｙｙ．ｃ）が同一のヘッダファイルをインクルードしている場合、同一のヘッダファイルを１つだけ転送する。別のプログラム作成支援装置１で再コンパイルを行う場合、ヘッダファイルを保存するフォルダの構造（ツリー構造）も復元される必要がある。そこで、フォルダの構造を示す情報も管理ファイルに格納される。また、ヘッダファイルに関するフォルダの構造は相対パスで記述されるものとする。ヘッダファイルの格納位置を相対パスで記述することで、ＰＬＣ２におけるヘッダファイルの格納位置の自由度が増すであろう。別のプログラム作成支援装置１は図１４にしたがった手順でＰＬＣ２からプロジェクト４１や管理ファイルを読み出し、プログラム作成支援装置１の記憶装置２５において管理ファイルで指定された相対パスにヘッダファイルを復元する。つまり、Ｃ言語プログラム（ソース）６２におけるインクルードの記述を編集する手間を省けるようになる。
【００６５】
これによりＰＬＣ２が設置されている工場内で、つまり現場においてＣ言語プログラム（ソース）６２を再編集してＣ言語プログラム（オブジェクトコード）４４を再コンパイルし、ＰＬＣ２に転送することも可能となる。つまり、最初にＣ言語プログラム（ソース）６２を作成したコンピュータと、工場に設置されているＰＬＣ２に接続されたコンピュータとが異なっていてもＣ言語プログラム（オブジェクトコード）４４を修正・更新することが可能となる。
【００６６】
＜転送したプログラムの有効化＞
ＰＬＣ２ではユーザプログラムが更新されると、ＰＬＣ２の電源スイッチをオフ／オンすることで、更新されたプログラムが有効になる。ユーザプログラムのタスクはリソースを確保して動作するが、動作中にユーザプログラムが切り替えられてしまうと、確保されていたリソースを回収できないため、システムリソースが枯渇してしまう。ＰＬＣ２ではシステムリソースを解放するために、ＰＬＣ２の電源スイッチをオフ／オンする必要があった。
【００６７】
上述したように、本実施例では、Ｃ言語などの高級プログラミング言語で記述されるユーザプログラムは、ユーザプログラムを実行中であっても転送可能であり、修正可能となる。しかし、修正されたユーザプログラムを有効化するために、ＰＬＣ２の電源スイッチをオフ／オンするのはユーザにとって面倒であろう。そこで、本実施例では、電源スイッチをオフ／オンせずに、修正されたユーザプログラムを有効化する手法について説明する。
【００６８】
図１５は高級プログラミング言語で記述されるユーザプログラムを実行する第２実行部３１の機能を示す図である。操作部８からユーザプログラムの実行が指示されると、開始・停止制御部８３は、ロード部８１を制御し、記憶装置１２に記憶されているＣ言語プログラム（オブジェクトコード）４４を実行用メモリ８２にロードさせる。また、開始・停止制御部８３は、Ｃ言語プログラム（オブジェクトコード）４４を実行させるための実行用タスク８４を開始する。Ｃ言語プログラム（オブジェクトコード）４４内に記述されているアプリケーションインタフェース（ＡＰＩ）は、Ｃ言語プログラム（オブジェクトコード）４４を停止可能な状態か、停止不可能な状態かを状態管理部８５に通知する。たとえば、Ｃ言語プログラムのうち停止可能なプログラム区間には所定のＡＰＩを呼び出すための命令が記述される。ＡＰＩはＣ言語プログラム（オブジェクトコード）４４から呼び出されるとＣ言語プログラム（オブジェクトコード）４４が停止可能であることを示す。プログラマーはＣ言語プログラムのうち停止可能なプログラム区間を予め知っている。よって、その区間に停止可能な状態か、停止不可能な状態かを示すＡＰＩを呼び出すための命令を記述しておくことで、状態管理部８５はＡＰＩを通じてＣ言語プログラムが停止可能か状態を認識できるようになる。
【００６９】
開始・停止制御部８３は、Ｃ言語プログラム（オブジェクトコード）４４が更新されたことをプロジェクト管理部３３から通知されると、状態管理部８５からＣ言語プログラム（オブジェクトコード）４４の状態、つまり実行用タスク８４の状態を取得する。実行用タスク８４の状態が停止不可能な状態であれば、開始・停止制御部８３は、所定のタイミング（例：定期的なタイミング）で状態管理部８５から実行用タスク８４の状態を取得し、実行用タスク８４が停止可能な状態に遷移したかどうかを判定する。
【００７０】
実行用タスク８４が停止可能な状態に遷移したことを検知すると、開始・停止制御部８３は、実行用タスク８４を停止させる。開始・停止制御部８３は、ロード部８１を制御し、記憶装置１２に記憶されている更新済みのＣ言語プログラム（オブジェクトコード）４４を実行用メモリ８２にロードさせる。開始・停止制御部８３は、実行用タスク８４の開始アドレスを、Ｃ言語プログラム（オブジェクトコード）４４がロードされたアドレスにセットして、実行用タスク８４を再開する。
【００７１】
これにより、本実施例では、ＰＬＣ２の電源スイッチをオフ／オンせずに、修正されたユーザプログラムを有効化することが可能となる。たとえば、ラダープログラム（中間コード）４３が実行中であっても、古いＣ言語プログラム（オブジェクトコード）４４を新しいＣ言語プログラム（オブジェクトコード）４４に切り替えることが可能となる。つまり、ＰＬＣ２においてＣ言語プログラム（オブジェクトコード）４４が停止可能になると、プログラム編集部５１により更新されたＣ言語プログラム（オブジェクトコード）４４がＰＬＣ２の実行用メモリ８２にロードされる。
【００７２】
＜プログラム入力補助＞
ラダープログラム（中間コード）４３とＣ言語プログラム（オブジェクトコード）４４とは演算結果や検知結果などを受け渡すことで連携して動作するようにプログラムされることがある。従来は、ラダープログラム（中間コード）４３とＣ言語プログラム（オブジェクトコード）４４の連携部をユーザが探し出して確認しながら入力していたため、プログラミング作業の負担が大きかった。したがって、一方の記述を参照して解析し、その記述に対応する記述を示唆できれば、ユーザは示唆された情報を見ながら連携部を入力できるようになるため、ユーザの負担を軽減できるであろう。また、対応する記述が自動で入力されればより一層便利であろう。
【００７３】
図１６は入力補助を実現する機能を示すブロック図である。プログラム編集部５１は入力補助を実現するためのいくつかの機能を有している。解析部９１は、ラダープログラム（ソース）６１やＣ言語プログラム（ソース）６２を解析し、解析結果を解析結果保持部９２に格納する。解析部９１は、たとえば、ラダープログラム（ソース）６１においてＣ言語プログラムを呼び出す命令である「ＣＣＡＬＬ」を検知すると、ＣＣＡＬＬによって渡される引数などの情報を解析結果保持部９２に格納する。同様に、解析部９１は、Ｃ言語プログラム（ソース）６２を解析し、関数を検知し、関数などの引数の情報などを解析結果保持部９２に格納する。
【００７４】
入力受付部９３は、操作部８を通じて入力された情報を受け付ける。入力補助部５５は、ラダータブ７２とＣ言語タブ７３のうちどちらがアクティブ化を検知するとともに、アクティブになっているタブに基づきどちらの言語に対する入力かを判定する。たとえば、ラダータブ７２がアクティブになっているときに、入力受付部９３が「ＣＣＡＬＬ」というテキストを受け付けると、入力補助部５５の一覧部５６は、解析結果保持部９２が保持している解析結果をサーチし、解析結果の一部である関数の一覧を表示部７に表示させる。
【００７５】
図１７は関数の一覧を表示するＵＩ（関数リスト９５）の一例を示す図である。関数リスト９５にはＣ言語プログラム（ソース）６２から抽出された関数が列挙されている。ユーザは操作部８を通じていずれかの関数を選択する。入力補助部５５のコメント部５８は、選択された関数についてＣ言語プログラム（ソース）６２内に記述されているコメントを読み出し、表示部７に表示させてもよい。これにより、ユーザは自己が意図している関数を選択したかどうかを確認できるようになろう。
【００７６】
入力受付部９３が「ＣＣＡＬＬ  “Ｆｕｎｃｔｉｏｎ  Ａ”」というテキストを受け付けると、入力補助部５５のコメント部５８は、解析結果保持部９２が保持している解析結果をサーチし、Ｆｕｎｃｔｉｏｎ  Ａの引数の情報やコメントを表示部７に表示してもよい。これによりユーザはラダープログラム（ソース）６１に記述すべき引数を容易に理解できるようになるため、プログラミングが容易になろう。
【００７７】
図１８は入力補助の具体例を示す図である。図１８（Ａ）は２つの関数“Ｆｕｎｃｔｉｏｎ  Ａ”、“Ｆｕｎｃｔｉｏｎ  Ｂ”が定義されているＣ言語プログラム（ソース）６２の一例を示している。図１８（Ａ）はラダープログラム（ソース）６１の入力インタフェース９６の一例を示している。入力インタフェース９６には操作部８および入力受付部９３を通じて入力されたＣＣＡＬＬという命令と、入力受付部９３から抽出された関数リスト９５が含まれている。関数リスト９５はプルダウンメニューなどによって実現されてもよい。関数リスト９５には呼び出しシンボル名が列挙される。図１８（Ｃ）は選択された関数についての引数９７、９８が自動入力された様子と、そのコメント９９、１００がツールチップ形式で表示された様子を示している。
【００７８】
図１８（Ｂ）において入力補助部５５は関数リスト９５から“Ｆｕｎｃｔｉｏｎ  Ｂ”が選択されたことを認識し、解析結果保持部９２が保持している解析結果をサーチし、Ｆｕｎｃｔｉｏｎ  Ｂの引数９７、９８やコメント９９、１００を抽出し、引数９７、９８に対応するデバイスのシンボルを入力する。さらに、入力補助部５５は引数９７に対応するコメント９９を表示部７に表示させたり、引数９８に対応するコメント１００を表示部７に表示させたりする。入力補助部５５はツールチップ表示のように操作部８を通じて表示を指示されたときにコメントを表示してもよい。
【００７９】
以上の具体例ではＣ言語プログラム（ソース）６２を参照してラダープログラム（ソース）６１の入力補助が提供されたが、ラダープログラム（ソース）６１を参照してＣ言語プログラム（ソース）６２の入力補助が提供されてもよい。たとえば、Ｃ言語タブ７３内で“ｖｏｉｄ”と入力されたことを検知すると、入力補助部５５はラダープログラム（ソース）６１の解析結果を参照し、ＣＣＡＬＬにより呼び出されるシンボル名のリストを作成し、表示部７に表示させる。操作部８を通じてリストからいずれかのシンボル名が選択されると、入力補助部５５は、選択されたシンボル名に対する引数のデバイスの個数や型などの情報を解析結果から取得する。入力補助部５５は、取得された個数の引数をＣ言語プログラム（ソース）６２に記述する。
【００８０】
以上の実施例ではＣ言語プログラム（ソース）６２はＣ言語タブ７３内で編集されるものとして説明したが、任意のテキストエディタで編集されてもよい。解析部９１は、テキストエディタで編集されているＣ言語プログラム（ソース）６２を解析し、解析結果を解析結果保持部９２に格納する。これにより、上記と同様に、ラダープログラム（ソース）６１への入力補助が提供される。また、入力補助部５５は、ラダープログラム（ソース）６１の解析結果と、テキストエディタで編集されているＣ言語プログラム（ソース）６２への入力テキストとを比較し、入力テキストに応じた入力補助を提供してもよい。Ｃ言語プログラム（ソース）６２への入力テキストが“ｖｏｉｄ”であれば、ラダープログラム（ソース）６１においてＣＣＡＬＬにより呼び出されるシンボル名をテキストエディタに渡してもよい。このように、任意のテキストエディタに対しても入力補助を提供できるようになる。
【００８１】
＜ハンドシェイクプログラムの記述の自動化＞
上述したようにプログラム編集部５１は入力補助機能を有しているが引数や戻り値を受け渡すハンドシェイクプログラムの記述を自動化してもよい。とりわけ、ラダープログラム（中間コード）４３からＣ言語プログラム（オブジェクトコード）４４の関数を呼び出すためにラダープログラム（中間コード）４３に記述されるハンドシェイクプログラムはひな形を予め用意することが可能である。このようなひな形はテンプレートとかスケルトンと呼ばれることもある。
【００８２】
入力補助部５５は、インタフェースを定義する定義部５９とハンドシェイクプログラムを生成する追加部５７とをさらに有していてもよい。
【００８３】
図１９はインタフェースを定義するための定義ＵＩ１０１と、ラダープログラム（ソース）６１に挿入されるハンドシェイクプログラム１１０と、Ｃ言語プログラム（ソース）６２に挿入されるハンドシェイクプログラム１１５の一例を示している。定義ＵＩ１０１は統合開発環境のユーザインタフェース７０から呼び出される。
【００８４】
入力補助部５５は、定義ＵＩ１０１を呼び出すための指示が操作部８を通じて入力されると、定義部５９を起動し、表示部７に定義ＵＩ１０１を表示させる。定義ＵＩ１０１では、関数のシンボル名や、引数や戻り値のシンボル名、サイズ、種別を設定する設定部１０２が設けられている。この例では、シンボル名はシンボルを区別するための任意の名称である。サイズは、引き渡されるデータのサイズを示している。種別は、引数（ＩＮ）なのか戻り値（ＯＵＴ）なのかを示している。ＩＮ／ＯＵＴはＣ言語プログラムから見たデータの引き渡し方向を示している。
【００８５】
入力補助部５５は、予めラダープログラム（ソース）６１に挿入されるハンドシェイクプログラム１１０と、Ｃ言語プログラム（ソース）６２に挿入されるハンドシェイクプログラム１１５のスケルトンを有している。スケルトンはテンプレート６６として記憶装置１２に保持されている。入力補助部５５の追加部５７は、定義ＵＩ１０１を通じて入力されたシンボル名、サイズ、種別に応じてハンドシェイクプログラム１１０とハンドシェイクプログラム１１５を作成する。
【００８６】
一例として、ラダープログラム（ソース）６１に挿入されるハンドシェイクプログラム１１０のスケルトン１１１について説明する。図１９が示すように、スケルトン１１１には、引数を渡す命令であるＣＷＲＩＴＥ、関数を呼び出す命令であるＣＣＡＬＬ、戻り値を受け取る命令であるＣＲＥＡＤ、および、ハンドシェイク処理を終了する命令であるＥＮＤが記述されている。スケルトン１１１はテンプレート６６に保持されている。入力補助部５５の追加部５７は、定義ＵＩ１０１で定義された情報をスケルトン１１１に入力することでハンドシェイクプログラム１１０を生成する。なお、ＣＷＲＩＴＥに続いて引数のシンボル名とそのデータサイズが入力されている。ＣＲＥＡＤに続いて戻り値のシンボル名とそのデータサイズが入力されている。
【００８７】
入力補助部５５の追加部５７は、定義ＵＩ１０１で定義された情報をスケルトンに入力することでＣ言語プログラム（ソース）６２に挿入されるハンドシェイクプログラム１１５を生成する。図１９が示すように、ハンドシェイクプログラム１１５には、定義ＵＩ１０１で定義された関数のシンボル名、引数や戻り値のシンボル名とデータサイズが定義されている。
【００８８】
このようにハンドシェイクプログラムの入力を自動化することでユーザのプログラミングに関する負担を軽減できるようになる。とりわけ、ハンドシェイクプログラム１１０には、引数のコピー部、関数の呼び出し部、戻り値のコピー部およびＣ言語プログラムの完了を待つ部分が含まれている。
【００８９】
＜まとめ＞
上述したようにプログラム編集部５１は表示部７や操作部８を介して、グラフィカルプログラミング言語で記述されるユーザプログラムである第１プログラムと、高級プログラミング言語で記述されるユーザプログラムである第２プログラムとをユーザ入力にしたがって編集する。プロジェクト生成部５２は第１プログラムと第２プログラムとを含むプロジェクト４１を生成する。プロジェクト転送部５３はプロジェクト４１をＰＬＣ２に転送する。上記の実施例では基本ユニット３にプロジェクト４１を転送しているが、モーションユニットなどの拡張ユニット４にプロジェクト４１が転送されてもよい。基本ユニット３も拡張ユニット４もプログラマブル・ロジック・コントローラの一例である。判別部５４は、第１プログラムの記述と第２プログラムの記述との間の整合性を判別する（統合チェック）。たとえば、判別部５４は、第１プログラムにおけるデバイスに割り当てられた機能と、第２プログラムにおける当該デバイスに対する処理の内容とに基づいて、第１プログラムと第２プログラムとの整合性を判別してもよい。出力部５０は第１プログラムと第２プログラムとが整合していないときに警告を出力する。このように判別部５４が第１プログラムと第２プログラムとの間の整合性を判別するため、グラフィカルプログラミング言語により記述されるプログラムと高級プログラミング言語により記述されるプログラムを作成するユーザの負担が軽減される。
【００９０】
あるデバイスが、第１プログラムから第２プログラムに対してデータを渡すデバイスであるにもかかわらず、第２プログラムにおいて第２プログラムから第１プログラムに対してデータを渡すデバイスとして記述されていることを判別部５４が発見してもよい。同様に、あるデバイスが、第２プログラムから第１プログラムに対してデータを渡すデバイスであるにもかかわらず、第２プログラムにおいて第１プログラムから第２プログラムに対してデータを渡すデバイスとして記述されていることを判別部５４が発見してもよい。不整合が発見されると、出力部５０は警告を出力してもよい。ＰＬＣ２ではデバイスを通じて第１プログラムと第２プログラムとの間で引数などが渡される。よって、データの受け渡しの方向とデバイスに割り当てられている機能に着目することで、連携部の記述の誤りを発見することができる。
【００９１】
記憶装置２５は複数のデバイスについて各デバイスの機能を示す機能ルール６５を記憶したルール記憶部として機能してもよい。判別部５４は、機能ルール６５を参照して第１プログラムと第２プログラムとの整合性を判別してもよい。このように不整合を判別するのに役立つルールや基準情報を予め記憶装置２５に記憶させておくことで、効率よく、整合性を判別できるようになろう。
【００９２】
判別部５４は、第２プログラムの関数を呼び出すために、第１プログラムに記述されている当該関数に対する引数の数と、第２プログラムに記述されている当該関数の引数の数とが一致しているかどうかに基づいて第１プログラムと第２プログラムとの整合性を判別してもよい。このような引数の誤りは典型的な誤りであるため、これをユーザに報知することで、ユーザのプログラミングの負担が軽減されよう。
【００９３】
判別部５４は、第１プログラムにおけるプログラムミスをチェックする第一チェック部と、第２プログラムにおけるプログラムミスをチェックする第二チェック部と、第１プログラムにおいてプログラムミスがなく、かつ、第２プログラムにおいてもプログラムミスがなくなると、第１プログラムと第２プログラムとの整合性をチェックする第三チェック部とを有していてもよい。第一チェック部は、第１プログラム単体での記述の整合性を判別する物であり、第二チェック部は第２プログラム単体での記述の整合性を判別する物であり、いずれも既知のものを採用できる。さらに、第三チェック部を設けることで、第１プログラムと第２プログラムとの間の整合性も検知できるようになる。
【００９４】
図１２、図１３を用いて説明したように、選択ＵＩ７８は、第１プログラムと第２プログラムとのうちプロジェクト転送部５３に転送させるプログラムを選択する選択部として機能する。また、プロジェクト転送部５３は第２プログラムを解析し、その解析結果に基づいて、第２プログラムで参照されているヘッダファイルを転送対象として選択してもよい。このような選択部を設けることで、必要なファイルやデータだけを転送することが可能となる。つまり、プロジェクト転送部５３は、ＰＬＣ２において第１プログラムが実行されている最中に第２プログラムをＰＬＣ２に転送してもよい。たとえば、第１プログラムは更新されていないが、第２プログラムが更新されたときは第２プログラムだけを転送することで、転送時間を短縮することが可能となる。また、第１プログラムを実行中に第２プログラムを転送することも可能となる。つまり、第１プログラムを停止することなく、第２プログラムのみを更新することが可能となる。
【００９５】
図１４を用いて説明したように、プロジェクト転送部５３は、ＰＬＣ２に転送されたプロジェクト４１のすべてまたは一部を読み出す読出部として機能する。これにより、プロジェクト４１を作成したプログラム作成支援装置１とは異なる別のプログラム作成支援装置１にプロジェクト４１を保持させることが可能となる。さらに、この別のプログラム作成支援装置１においてプロジェクト４１や第２プログラムを更新することが可能となる。プロジェクト転送部５３は、この別のプログラム作成支援装置１のプログラム編集部５１により更新された第２プログラムをＰＬＣ２に転送してもよい。たとえば、ＰＬＣ２が設置されている工場内に小型のコンピュータ（ノートパソコンなど）を持ち込んで、その場でユーザプログラムを更新することも可能となろう。
【００９６】
図１５を用いて説明したように、ＰＬＣ２において第２プログラムが停止可能になると、プログラム編集部５１により更新された第２プログラムがＰＬＣ２にロードされる。これにより、ＰＬＣ２の電源スイッチをオフおよびオンすることなく、第２プログラムを有効化することが可能となる。なお、停止可能かどうか示すＡＰＩが利用されてもよい。第２プログラムには停止可能なプログラム区間と停止可能ではないプログラム区間とが存在する。よって、停止可能なプログラム区間ではＡＰＩを呼び出すための命令を記述しておくことで、停止可能なプログラム区間を明示的に宣言することが可能となろう。
【００９７】
図１７や図１８を用いて説明したように、第２プログラムにおいて定義された関数の一覧を表示部７に表示させる一覧部５６が設けられてもよい。これにより入力すべき関数をユーザに示唆することが可能となる。さらに、一覧から選択された関数を呼び出すためのコードのひな形を第１プログラムに追加する追加部５７が設けられてもよい。これによりユーザの入力作業を軽減することが可能となる。
【００９８】
図１８を用いて説明したように、一覧から選択された関数に関連付けられているコメントを表示部７に表示させるコメント部５８がさらに設けられてもよい。このコメントを参照することで、ユーザは入力すべき関数をより正確に選択することが可能となろう。なお、関数の引数などについてもコメントが表示されてもよい。これにより引数を正確に記述することが可能となろう。コメントは、コメント記号（Ｃ言語であれば、“/*”と“*/”）をもとに容易に抽出することが可能であろう。
【００９９】
図１８や図１９などを用いて説明したように、追加部５７は、第２プログラムの関数を呼び出すために第１プログラムに記述された当該関数の名称および引数に基づき、当該関数を記述するコードのひな形を第２プログラムに追加してもよい。これによりユーザの入力作業を軽減することが可能となる。
【０１００】
図１９などを用いて説明したように、第１プログラムと第２プログラムとの間のインタフェースを定義する定義部５９が設けられてもよい。追加部５７は、定義部５９によって定義されたインタフェースにしたがって第１プログラムから第２プログラムを呼び出すためのハンドシェイクコードのひな形を第１プログラムに追加してもよい。これによりユーザの入力作業を軽減することが可能となる。追加部５７は、定義部５９によって定義されたインタフェースにしたがって第１プログラムから呼び出される関数のひな形を第２プログラムに追加してもよい。これによりユーザの入力作業を軽減することが可能となる。
【図１】
0006550268.tif 000002
【図２】
0006550268.tif 000003
【図３】
0006550268.tif 000004
【図４】
0006550268.tif 000005
【図５】
0006550268.tif 000006
【図６】
0006550268.tif 000007
【図７】
0006550268.tif 000008
【図８】
0006550268.tif 000009
【図９】
0006550268.tif 000010
【図１０】
0006550268.tif 000011
【図１１】
0006550268.tif 000012
【図１２】
0006550268.tif 000013
【図１３】
0006550268.tif 000014
【図１４】
0006550268.tif 000015
【図１５】
0006550268.tif 000016
【図１６】
0006550268.tif 000017
【図１７】
0006550268.tif 000018
【図１８】
0006550268.tif 000019
【図１９】
0006550268.tif 000020