最近では、プログラマブルコントローラの制御内容の一部が違っていても、既存のラダープログラムの一部を必要に応じて編集や修正等を施して、つまりラダープログラムを再利用して、プログラミング作業を効率化することが図られている。その際、プログラム部品管理ツールにて再利用の対象となるプログラムをデータベース化することも図られている。
ファンクションブロック呼び出し命令は、一組の入出力パラメータとしてデータを定義し、他のブロックや内部変数とソフトウェア接続でき、実行するたびに動作する1つのアルゴリズムを持った構成要素として定義されている。よって、ファンクションブロック呼び出し命令を利用する場合、まず、アルゴリズムを定義した型を予め作成し、実際にプログラムで利用する場合にインスタンス化してメモリを割り付けて使用するようになる。
そして、従来の方法では、上位のプログラム記述中にファンクションブロックのインスタンスを直接記述しているため、例えば図2(a)や図2(b)で示す特定のファンクションブロックを起点として呼び出し階層末端のファンクションブロックまでをまとめて再利用部品化することしかできず、呼び出し階層上位の、あるいは中間のファンクションブロックだけを再利用することができない。
その結果、例えば、搬送ロボット自体の制御ロジックはほぼ同一にも関わらず、ワーク把握部と上下アクチュエータのファンクションブロックが異なるため、“搬送ロボット_タイプA制御FB”と“搬送ロボット_タイプB制御FB”とは、別々に部品化する必要が生じ、管理すべき部品が増えて煩雑になる。
或いは、“搬送ロボット_タイプA制御FB”を再利用部品として保存しておき、タイプBに使用するときにファンクションブロックを編集してワーク把握部と上下アクチュエータのファンクションブロックを貼りかえる運用も考えられる。この場合には、使用前に部品を編集する手間が生じるとともに、その際に誤った編集を行ない不具合を作りこんでしまう危険がある。
個々のファンクションブロックは、その単位で別々の部品として管理することはできる。図2(a),(b)のように特定のファンクションブロックを起点とした呼び出し階層末端のファンクションブロックまでをひとまとめとして部品化された中に存在する各ファンクションブロックは、一連のプログラム中にインスタンスを直接書き込まれているため、個々のファンクションブロックを修正しても、それが反映されることはなく、それぞれが別々の部品として管理されることになる。よって、例えば、搬送ロボット_タイプA制御FB内で使用されるエア吸着器制御FBと、個別に部品として切り出されたエア吸着器制御FBとは、別々の部品として管理されるので、同一名称を持つファンクションブロックでありながら、別々に編集管理されることになる。その結果、片方に加えた重要な修正をもう片方に加え忘れるおそれがあると共に、どの部品のなかのファンクションブロックがマスター版(最新版)なのかの管理が非常に困難になる。
この発明は、ファンクションブロックを含む部品の管理が確実かつ容易に行なえると共に、例えば呼び出し階層上位のプログラム部分だけ、あるいは中間のファンクションブロックだけを抽出し、任意の単位で部品化することができ、再利用の利便性が高いPLC制御プログラム開発装置及びプログラムを提供することを目的とする。
この発明によるPLC制御プログラム開発装置は、(1)PLC制御プログラムを構成するファンクションブロックの入出力変数のセットをインタフェースとして管理する手段と、ファンクションブロックの代わりに前記インタフェースを型としたインスタンスを用いて制御プログラムの動作ロジック或いはファンクションブロックの内部プログラムの動作ロジックを作成する手段と、ファンクションブロックに対し、前記インタフェースの実装を宣言し、そのインタフェースに定義されたものと同一定義の入出力変数が当該ファンクションブロックの入出力変数として追加されるとともに、追加された入出力変数に当該インタフェースの構成要素である旨の情報を記録する実装宣言手段と、前記動作ロジック内に記述されたインタフェースのインスタンスのボディとして、そのインタフェースと同一定義のインタフェースが実装宣言されたファンクションブロックを関連付けることで、当該ファンクションブロックの内部を編集することなくPLC制御プログラムのコントローラインスタンス構成を作成するコントローラインスタンス構成設定手段と、を備えた。
インタフェースとして管理する手段は、たとえば、図8に示すように入出力変数のセットを設定したり、インタフェースの名称を指定したりするなど、インタフェース定義を設定する機能により実現することができ、また、このようにインタフェース定義を自ら設定するのではなく、予め作成されたインタフェース定義を記憶保持するものでもよい。また、異なるファンクションブロックが、同一のインタフェースを実装することはあり得る。たとえば、“製品を搬送する”などの同種の目的・機能を持った装置用のファンクションブロックの場合、入出力変数は同じになることがある。動作ロジックを作成する手段は、実施形態では、図13に示すフローチャートを実行する論理プログラム構成表示/編集部21に対応する。動作ロジックの記述は、たとえばラダー言語/ST言語/その他を用いて行なうことができる。
このように、ファンクションブロックの入出力変数の組を“インタフェース”として管理し、そのインタフェースのインスタンスを用いて動作ロジックを記述することができるので、たとえば、動作ロジックに記述されたインタフェースと同じ入出力変数のセットを持つインタフェースを持つファンクションブロックが複数存在する場合、いずれのファンクションブロックとも連携できる。そして、そのファンクションブロックを呼び出す上位のプログラム(ファンクションブロックの内部プログラムを含む)にとっては、命令を出力し、所望のレスポンスが返ってくればよく、ファンクションブロックの内部プログラムによってどのような制御が行なわれているかは問わない。よって、インタフェースを用いて記述されたプログラムは、異なるファンクションブロックに対応可能なものとなり、共通のプログラムの部品となるので、管理対象の部品の種類も削減できる。すなわち、同一の入出力変数のセットを備えた異なるファンクションブロックA,Bをそれぞれ実装するプログラム(呼び出し対象がファンクションA,Bと異なる以外はすべて同一)を想定した場合、従来は、別々のプログラム部品として切り出され、管理しなければならなかったが、本発明によれば、その同一の入出力変数のセットを定義したインタフェースを用いてプログラムを作成することで、1つのプログラム部品として管理できる。換言すると、インタフェース部分でファンクションブロックを切り離すことで、制御プログラムから重複なく“部品”を切り出すことができ、その管理を効率よく行うことがでる。
(2)ファンクションブロックに対し、前記インタフェースの実装を宣言し、そのインタフェースに定義されたものと同一定義の入出力変数が当該ファンクションブロックの入出力変数として追加されるとともに、追加された入出力変数に当該インタフェースの構成要素である旨の情報を記録する実装宣言手段と、前記動作ロジック内に記述されたインタフェースのインスタンスのボディとして、そのインタフェースと同一定義のインタフェースが実装宣言されたファンクションブロックを関連付けることで、当該ファンクションブロックの内部を編集することなくPLC制御プログラムのコントローラインスタンス構成を作成するコントローラインスタンス構成設定手段と、を備えるとよい。
実装宣言手段は、実施形態では、図10に示すフローチャートを実行する論理プログラム構成表示/編集部21に対応する。コントローラインスタンス構成設定手段は、実施形態では、図16に示すフローチャートを実行するコントローラインスタンス構成表示/編集部20に対応する。
このようにすると、ファンクションブロック内部を編集することなしに、部品を繋ぎ合わせて制御プログラムを作成することができる。また、動作ロジック内に直接ファンクションブロックを記述すると、そのファンクションブロックの内部プログラムに対して修正が発生すると、動作ロジック内に記述されたファンクションブロックも修正する必要がある。これに対し、本発明では、インタフェースを用いて記述された動作ロジックでは、そのインタフェース部分ではファンクションブロックが特定されないので、ファンクションブロックの内部プログラムに修正が入った場合でも動作ロジック側を修正する必要は生じない。よって、最新のプログラム内容のファンクションブロックの管理(マスター管理)が容易に行える。
(2)利用可能なファンクションブロックと、そのファンクションブロックに実装宣言されたインタフェースを関連付けたファンクションブロック定義情報を格納する記憶手段を持ち、前記コントローラインスタンス構成設定手段は、前記動作ロジック内に記述されたインタフェースを検出すると、前記記憶手段にアクセスし、そのインタフェースと同一定義が実装宣言されたファンクションブロックを特定する情報を抽出し、その情報の一覧を表示装置に表示し、ユーザの選択を促す機能を備えるとよい。
記憶手段は、実施形態では論理プログラム定義記憶部26に対応する。ファンクションブロックを特定する情報は、たとえば名称を用いることができる。このように、インタフェースに関連づけることができるファンクションブロックの一覧を表示するので、ユーザは、その表示された一覧の中から使用しようとするファンクションブロックを選択すればよく、該当するファンクションブロックの指定が、容易かつ間違いなく行なうことができる。
(3)前記実装宣言されてファンクションブロックに追加された入出力変数は、個別の編集が禁止されるようにするとよい。このようにすると、関連づけたファンクションブロックの入出力変数が編集されてしまいエラーとなることを防止できる。
(4)上記の(3)の発明を前提とし、実装宣言を解消する解消手段を備え、その解消手段によって実装宣言を解消したことを条件に前記ファンクションブロックに追加された入出力変数に対する個別の編集を許可するように構成するとよい。
(5)複数のプログラムやファンクションブロックのグループにインタフェースを定義し、内部が隠蔽された再利用コンポーネントを作成する手段を備えるとよい。
(6)複数の呼び出し関係をもつファンクションブロックをグループ化する第1グループ化手段と、その第1グループ化手段でグループ化されたグループ内の最上位のファンクションブロックが実装しているインタフェースと、そのグループ内部のファンクションブロックが保有しているインタフェースのインスタンス群とをグループの実装インタフェースと呼び出しインタフェースインスタンスとして定義する手段とを備え、その作成されたグループを再利用コンポーネントとして部品化するとよい。
(7)複数のプログラムとそれが呼び出すファンクションブロック群およびインタフェース群をグループ化する第2グループ化手段と、その第2グループ化手段でグループ化されたグループ内部のプログラムおよびファンクションブロックが保有しているインタフェースのインスタンス群をグループの呼び出しインタフェースインスタンスとして定義する手段とを備え、複数のプログラムのグループを再利用コンポーネントとして部品化するとよい。
(8)再利用コンポーネントに記述された呼び出しインタフェースのインスタンスに、合致するインタフェースを実装したファンクションブロックまたは再利用コンポーネントのインスタンスを関連付けることで、当該関連付けたファンションブロックまたは再利用コンポーネントを編集することなく、制御プログラムの構築を行なう機能を備えるとよい。
これらの発明によれば、呼び出されるファンクションブロックだけでなく、ファンクションブロックを呼び出す側のプログラム/ファンクションブロックも再利用部品とすることができる。それによって、制御プログラムから重複なく部品を切り出すことができる。また、製品シリーズを構成する制御プログラムからより多くの箇所を再利用部品化することができる。さらに、部品の利用にあたり、部品自体を編集することなく、部品を接続することで制御プログラムを構成することができる。
(9)さらに、本発明のプログラムは、コンピュータを、PLC制御プログラムを構成するファンクションブロックの入出力変数のセットをインタフェースとして管理する手段、ファンクションブロックの代わりに前記インタフェースを型としたインスタンスを用いて制御プログラムの動作ロジック或いはファンクションブロックの内部プログラムの動作ロジックを作成する手段、ファンクションブロックに対し、前記インタフェースの実装を宣言し、そのインタフェースに定義されたものと同一定義の入出力変数が当該ファンクションブロックの入出力変数として追加されるとともに、追加された入出力変数に当該インタフェースの構成要素である旨の情報を記録する実装宣言手段、前記動作ロジック内に記述されたインタフェースのインスタンスのボディとして、そのインタフェースと同一定義のインタフェースが実装宣言されたファンクションブロックを関連付けることで、当該ファンクションブロックの内部を編集することなくPLC制御プログラムのコントローラインスタンス構成を作成するコントローラインスタンス構成設定手段、として機能させるためのプログラムとするとよい。
本発明は、インタフェースを用いて論理ロジックを記述できるようにしたため、ファンクションブロックを含む部品の管理が確実かつ容易に行なえると共に、例えば呼び出し階層上位のプログラム部分だけ、あるいは中間のファンクションブロックだけを抽出し、任意の単位で部品化することができ、再利用の利便性が高くなる。
図3,図4は、本実施形態のPLC制御プログラム開発装置の一実施形態を示している。PLC制御プログラム開発装置10は、ハードウェアの観点からは一般的なパーソナル・コンピュータであり、Windows(登録商標)などのオペレーティング・システム上で稼動するアプリケーション・プログラムによって、本装置の各機能が実現されている。従って、図3に示すように、PLC制御プログラム開発装置10は、ハードウェア構成としては、装置本体10aと、その装置本体10aに接続されるディスプレイ等の表示装置17と、キーボード/マウス等の入力装置18と、を備える。装置本体10aは、各種の処理を実行するプロセッサ11と、作成したプログラムや部品その他の情報を格納するデータベースとしてのハードディスク(記憶部)12と、プロセッサ11が処理を実行する際にワークエリアとして使用するメモリ(RAM)13と、外部装置と接続するためのインタフェース(出力インタフェース14,入力インタフェース15,通信インタフェース16)と、を備える。出力インタフェース14は、表示装置17に接続され、プロセッサ11からの命令に従いその表示装置17に所定の情報等を表示する。入力インタフェース15は、入力装置18に接続され、入力装置18から与えられる情報を受け取り、プロセッサ11へ送る。通信インタフェース16は、PLC1と接続され、作成したプログラムをダウンロードする。
図4に示すように、PLC制御プログラム開発装置10のソフトウェア構成は、コントローラインスタンス構成表示/編集部20と、論理プログラム構成表示/編集部21と、変数リストエディタ22と、ラダー回路エディタ23、ST言語エディタ24と、プロジェクトデータファイル入出力部28と、オブジェクトコードビルド部29と、PLC通信部30と、を備え、更に、記憶装置として、コントローラインスタンス構成記憶部25と、論理プログラム定義記憶部26と、オブジェクトコード記憶部27と、を備える。各記憶部25〜27は、ハードディスク12の所定記憶エリアに構成される。
図5は、表示装置17に表示される表示画面の一例を示している。図示するように、表示画面の左上の領域はプロジェクトの内部構成一覧表示ウィンドウW1となり、左下の領域はプログラム部品定義一覧表示ウィンドウW2となり、下方の領域はビルド結果表示部W3となり、右上の領域は変数定義ウィンドウW4となり、右下の領域はロジック編集ウィンドウW5となる。
“プロジェクトの内部構成一覧表示ウィンドウW1”は、制御プログラムの構成をツリー構造で表示するエリアである。“プログラム部品一覧ウィンドウW2”は、再利用部品として登録された部品の一覧を表示するエリアである。“ビルド結果表示部W3”は、制御プログラムのビルド結果として各種警告やエラーメッセージが表示されるエリアである。 “変数定義ウィンドウW4”は、“プロジェクトの内部構成一覧”で選択されたプロジェクト構成要素に定義された変数情報が一覧表示するエリアである。このウィンドウW4を使用して、ユーザの編集操作(入出力変数の追加・変更・削除)を受け付ける。“ロジック編集ウィンドウW5”は、ラダー回路やST言語その他で記述された制御プログラムの動作ロジックを表示したり、その表示した動作ロジックを修正したりするエリアである。
プロジェクトの内部構成一覧表示ウィンドウW1に表示される制御プログラムのプロジェクトは、図6に示すように、大別して論理プログラム定義と、コントローラインスタンス構成とがある。
“論理プログラム定義”には、“ユーザ定義データ型”、“ファンクションブロック”、“プログラム”、“インタフェース”といった、構造化されたプログラム構成単位の型が定義される。
ファンクションブロック定義一覧には、PLC制御プログラムを記述する際に使用可能なファンクションブロックの型がリストアップされている。各ファンクションブロックの型は、“名称”と、“コメント”と、“実装インタフェース”と、“入出力変数リスト”と、“内部変数リスト”と、“保有インスタンスリスト”と、“ロジック記述”と、が関連付けて定義される。ここで、“名称”の欄には、当該ファンクションブロックの識別子となる名称が記述され、“コメント”の欄には、当該ファンクションブロックの簡単な説明が記述され、“実装インタフェース”の欄には、実装宣言しているインタフェース定義が存在する場合、そのインタフェース定義を参照するための情報が記述され、“入出力変数リスト”の欄には、当該ファンクションブロックの入出力変数のリストが“入出力変数定義”として記述され、“内部変数リスト”の欄には、当該ファンクションブロックの内部変数定義のリストが“変数定義”として記述され、“保有インスタンスリスト”の欄には、当該ファンクションブロックの保有インスタンスのリストが“FBインスタンス定義”または“I/Fインスタンス定義”として記述され、“ロジック記述”の欄には、ラダー回路もしくはST言語によるプログラム動作ロジックが記述される。入出力変数定義や、変数定義や、“FBインスタンス定義”または“I/Fインスタンス定義”は、それぞれ1または複数個記述される。
変数定義は、“名称”と、“型”と、“デフォルト値”と、“電断保持属性”と、“コメント”と、を関連付けて定義したものである。入出力変数定義は、係る変数定義の各項目に加えて“入出力属性”を更に加えて関連付けて定義したものである。ここで、“名称”の欄には、変数の識別子となる名称が記述され、“型”の欄には当該変数の型が記述され、“デフォルト値”の欄には、当該インタフェースを備えるファンクションブロックがインスタンス化されたときの当該変数の初期値が記述され、“電断保持属性”の欄には、電断保持を行うかどうかの設定が記述され、“コメント”の欄には、当該変数の簡単な説明が記述され、“入出力属性”の欄には、この変数の属性すなわち入力(Write Only)/出力(Read Only)/入出力(Read,Write)のいずれかが記述される。
“プログラム定義一覧”は、再利用部品として登録されたプログラムのプログラム定義がリストアップされている。各プログラム定義は、“名称”と、“コメント”と、“内部変数リスト”と、“保有インスタンスリスト”と、“ロジック記述”と、を関連付けて定義される。ここで、“名称”の欄には、当該プログラムの識別子となる名称が記述され、“コメント”の欄には、当該プログラムの簡単な説明が記述され、“内部変数リスト”の欄には、当該プログラムの内部変数定義のリストが“変数定義”として記述され、“保有インスタンスリスト”の欄には、当該プログラムの保有インスタンスのリストが“FBインスタンス定義”または“I/Fインスタンス定義”として記述され、“ロジック記述”の欄には、ラダー回路もしくはST言語によるプログラム動作ロジックが記述される。変数定義や、“FBインスタンス定義”または“I/Fインスタンス定義”は、それぞれ1または複数個記述される。
インタフェース定義一覧は、複数の入出力変数の組み合わせ(セット)からなる“インタフェース”の定義がリストアップされる。各インタフェースは、“名称”と、“コメント“と、“入出力変数リスト“と、を関連づけて定義される。ここで、“名称”の欄には、当該インタフェースの識別子となる名称が記述され、“コメント”の欄には、当該インタフェースの簡単な説明が記述され、“入出力変数リスト”の欄には、当該インタフェースの内容となる入出力変数のリストが“入出力変数定義”として記述される。
図7は、論理プログラム定義の各要素、すなわち、プログラム,ファンクションブロック,インタフェースの論理的な関係を示しており、この図7を用いて論理プログラム定義(特に、インタフェース)をさらに説明する。まず、インタフェースは、ファンクションブロックにおける入出力変数のセットであり、ファンクションブロックは自己が提供できるインタフェース(提供インタフェース)を1つ実装する。プログラムは、あるファンクションブロックを使用するに際し、ファンクションブロックを直接貼り付ける(記述する)のではなく、所望の入出力線数のセットとなるインタフェースを記述することができる。そして、このようにインタフェース(要求インタフェース)で記述したプログラムを実際に使用する場合には、同一の入出力変数のセットからなる提供インタフェースを備えたファンクションブロックを連結し、制御プログラムを構成する。
係る要求インタフェースを用いて記述するプログラムは、ファンクションブロックも含む。つまり、ファンクションブロックのプログラム中に、要求インタフェースを記述することもできる。このように、同一の入出力変数を持つ要求インタフェースと提供インタフェース(実装インタフェース)とを連結することで、実際に動作するプログラムが完成する。
本実施形態では、ファンクションブロックは、特定のインタフェース(提供インタフェース)を1つだけ備える(実装する)ことができ、図7の例では、ファンクションブロックAは、インタフェースX(提供インタフェース)を実装している。つまり、ファンクションブロックAは、インタフェースXに定義された入出力変数と同じ入出力変数を持っていることを表す。このとき、ファンクションブロックAは、このインタフェースXで定義される入出力変数以外の入出力変数を追加して備えることは妨げない。
ファンクションブロックは、他のファンクションブロックのインスタンスを1または複数保有し、動作ロジックの記述中でそのインスタンスを使用することができる。つまり、インタフェースを用いるのではなく、従来同様ファンクションブロックを直接記述することができる。図7の例では、ファンクションブロックAは、その動作記述中でファンクションブロックBのインスタンス1を使用している。
ファンクションブロックは、特定のインタフェース(要求インタフェース)のインスタンスを1または複数保有し、動作ロジックの記述中でそのインスタンスを使用することができる。図7の例では、ファンクションブロックAは、その動作記述中でインタフェースYのインスタンス1、およびインスタンス2を使用している。この論理プログラムに基づき、実際に動作プログラムを作成する場合には、このインタフェースYを実装インタフェースとして持つファンクションブロックを接続することになる。
プログラムは、タスク割付のために規定のプログラム共通インタフェースを備えている。さらに、プログラムは、ファンクションブロックのインスタンスを1または複数保有し、動作ロジックの記述中でそのインスタンスを使用することができる。図7の例では、プログラム2は、その動作記述中でファンクションブロックEのインスタンス1を使用している。
プログラムは、特定のインタフェースのインスタンスを1または複数保有し、動作ロジックの記述中でそのインスタンスを使用することができる。図7において、ファンクションブロックAは、その動作記述中でインタフェースYのインスタンス1、およびインスタンス2を使用している。つまり、制御プログラムを記述するに際し、ユーザは、インタフェースを用いて記述してもよいし、従来同様ファンクションブロックを直接記述してもよい。
上記の論理プログラム定義一覧にリスト表示される各定義は、論理プログラム定義記憶部26に格納されており、論理プログラム構成表示/編集部21がそれを読み出すとともに、読み出した各定義をツリー状にしてプロジェクトの内部構成一覧表示ウィンドウW1の所定エリアに表示する。つまり、論理プログラム構成表示/編集部21は、論理プログラム定義の構成を表示と編集を行わせるユーザーインタフェースとなる。論理プログラム構成表示/編集部21は、ツリー状に表示した各定義を修正したり、削除したり、新たな定義を追加したりすることができる。これら編集等の修正処理は、各エディタ22,23,24と連動して行なう。ここで、変数リストエディタ22は、内部変数や入出力変数のリストを編集するユーザーインタフェースである。ラダー回路エディタ23は、論理プログラムの動作ロジックを表現したラダー回路の編集を行うためのユーザーインタフェースである。ST言語エディタ24は、論理プログラムの動作ロジックを表現したST言語プログラム編集を行うためのユーザーインタフェースである。
“インタフェース”は、新規作成しユーザ操作によって入力変数と出力変数を1つ1つ追加して定義することができる。また、“インタフェース”は、既に定義されたファンクションブロックの入出力変数の組を元に作成することができる。これらの処理は、主として変数リストエディタ22が行なう。
図8に示すように、ユーザは、インタフェース定義画面において、インタフェース定義を編集しようとする処理対象の名称部分をクリック等して選択する。すると、論理プログラム構成表示/編集部21は、ツリー状にリスト表示されたインタフェース定義の中から、処理対象の定義の名称部分が選択されたことを認識し、該当するインタフェース定義も内容を、論理プログラム定義記憶部26から読み出すとともに、変数定義ウィンドウW4に出力表示する。変数リストエディタ22は、ユーザからの入力に従いこの変数定義ウィンドウW4に表示されたインタフェースについて、入出力変数の追加・削除等を行なう。そして、そのインタフェースとして定義すべき入出力変数の入力が完了したならば、ユーザは、コマンド入力或いは図示省力するメニューリストからの選択により、“保存”命令を入力する。これを受けて、論理プログラム構成表示/編集部21は、そのときの入出力変数のセットを、インタフェース定義として論理プログラム定義記憶部26に登録する。
なお、ここでは、インタフェース定義の所要な構成となる入出力変数のセットについて変数リストエディタ22を用いることを説明したが、名称や、コメントは、論理プログラム構成表示/編集部21が登録する。具体的な一例としては、論理プログラム定義記憶部26に入出力変数のセットを保存するに際し、その保存処理の処理画面として、ファイル名の入力欄や、コメントの入力欄を設けておき、ユーザが各入力欄に入力した情報を、それらの情報として入出力変数のセットと関連づけて格納することができる。もちろん、他の方法を採ることもできる。処理対象のインタフェース定義が、論理プログラム定義記憶部26から読み出したものの場合、保存時のファイル名を同一にすることで登録内容の更新が行なわれインタフェース定義の編集をすることになり、ファイル名を替えることで新たなインタフェース定義の作成をすることになる。
また、インタフェース定義を全く新規に作成する場合は、たとえば、ユーザが“プロジェクトの内部構成一覧ウィンドウW1”にツリー表示されたリスト中の“インタフェース”の箇所をクリック等して選択した状態で、ポインティングデバイスの右クリック等してメニューリストを表示させ、そのメニューリスト中の“新規作成”を選択することを契機として行なう。この“新規作成”が選択された場合、変数定義ウィンドウW4はブランク状態となるので、変数リストエディタ22を操作して入出力変数を記載する。名称やコメントの入力は、論理プログラム構成表示/編集部21を用いて行なうことは、上述の通りである。また、名称を付すまでは、新規に作成されたインタフェース定義は、例えば、“新しい項目”等の一般的な名称を付してツリー一覧の所定位置に表示することができる。
なお、変数リストエディタ22は、上述のインタフェース定義における入出力変数の登録処理以外に、通常のファンクションブロックや、プログラム(ラダー回路)における各種変数の入力・編集等にも使用される。
次に、インタフェース定義の実装宣言を説明する。ファンクションブロックは、特定のインタフェース(提供インタフェース)を1つだけ実装することができるが、このためには、以下に示すインタフェース定義の実装宣言を行なう必要がある。
つまり、ユーザは、プロジェクトワークスペースの“インタフェース”定義アイコンを、ファンクションブロックの変数定義ウィンドウへドラッグ&ドロップするなどの操作によって、そのファンクションブロックに対して、定義済みの“インタフェース”の実装を宣言する(図9参照)。この宣言を行なうことで、たとえば、図7に示すファンクションブロックAが、提供インタフェースXを備えることになる。
この実装宣言は、論理プログラム構成表示/編集部21が、図10に示すフローチャートを実行する機能を備えることで実現される。論理プログラム構成表示/編集部21は、ユーザ操作が行なわれるのを待ち(S1)、ユーザからファンクションブロックに実装するインタフェースの指定操作を受けたならば(S2)、当該ファンクションブロックの入出力変数リストと、指定されたインタフェースに定義された入出力変数リストをチェックする(S3)。上記の指定操作は、例えば、上述したドラッグ&ドロップなどの操作である。そこで、論理プログラム構成表示/編集部21は、ドラッグされたインタフェースとドロップ先のファンクションブロックを認識し、論理プログラム定義記憶部26にアクセスして該当するインタフェース定義並びにファンクションブロック定義に規定されるそれぞれの入出力変数定義を取得し、変数名が重複していないかをチェックする。
変数名の重複の有無を判断した結果、重複している場合(S4でYes)には、論理プログラム構成表示/編集部21は、表示装置17に向けてエラー表示をし(S5)、処理ステップ1に戻りユーザ操作を待つ。また、変数名に重複がない場合(S4でNo)、論理プログラム構成表示/編集部21は、論理プログラム定義記憶部26に格納されている当該ファンクションブロックの実装インタフェースリストに当該インタフェースの名称を追加する(S6)。
更に、論理プログラム構成表示/編集部21は、当該インタフェースに定義された入出力変数と同一の定義(名称、データ型、初期値、電断保持/非保持設定、コメント)を当該ファンクションブロックの入出力変数に追加する(S7)。
次いで、論理プログラム構成表示/編集部21は、ファンクションブロックに追加した入出力変数に当該インタフェースの構成要素である旨と編集禁止フラグを設定する(S8)。この編集禁止フラグが設定された場合、ユーザが実装宣言を解消しない限り、そのインタフェース定義で規定される入出力変数に対する個別の変更・削除等の編集処理が禁止される。
その後、ユーザ操作を待ち(S9)、ユーザの指示に従い、追加された入出力変数を利用してファンクションブロック内部をプログラミングする(S10)。このプログラミングは、ラダー回路エディタ23やST言語エディタ24を動作させ、ロジック編集ウィンドウW5のエリアを用いて行なうが、プログラミング処理自体は基本的に従来と同様である。
論理プログラム構成表示/編集部21は、図11に示すインタフェースの実装宣言解消フローチャートを実行する機能を備えている。すなわち、上述したように、実行宣言を行ない編集禁止フラグが設定された後は、ユーザはインタフェース定義で規定される入出力変数に対する個別の変更・削除等の編集処理が禁止されるので、係る編集処理を行なうためには、この解消機能を実行して編集禁止フラグを解消する必要がある。具体的には、論理プログラム構成表示/編集部21は、ユーザ操作を待ち(S11)、ユーザから、ファンクションブロックから取り外すインタフェースの指定操作を受け付けたならば、当該ファンクションブロックの入出力変数リストと、指定されたインタフェースに定義された入出力変数リストをチェックする(S12,S13)。この指定操作は、例えば、ユーザが、ファンクションブロック一覧にツリー状にリストアップされているものの中から、実装宣言を解消しようとするファンクションブロックをクリックなどして指定し、コマンド入力或いは図示省力するメニューリストからの選択により、“実装宣言解消”命令を入力することにより行なう。
論理プログラム構成表示/編集部21は、係る実装宣言の解消を受け付けると、当該インタフェースの構成要素である旨が記録されたファンクションブロックの入出力変数からその記録を削除するとともに編集禁止フラグを解消し(S14)、ファンクションブロックの実装インタフェースリストから当該インタフェースの名称を削除する(S15)。
なお、この実装宣言の解消が行なわれても、インタフェース定義と同じ入出力変数は削除されることなくそのまま残すようにしている。これは、提供インタフェースとして使用することを停止しても、その一部または全部の入出力変数を通常のファンクションブロックの入出力変数として使用する余地を残したためである。
その後、論理プログラム構成表示/編集部21は、ユーザ操作を待ち(S16)、ユーザから不要な入出力変数定義の削除操作を受けた場合には、当該入出力変数の削除を行なう(S17)。もちろん、この処理ステップ17は実行されずに、実装宣言が解消された入出力変数がそのまま残されることもある。
次に、図12,図13を用いてインタフェース定義を用いた制御プログラム(動作ロジック)の記述について説明する。図12は、インタフェースを用いて制御プログラムを記述する際の画面イメージを示しており、図13はそのフローチャートを示している。本実施形態では、ラダー回路エディタ23やST言語エディタ24を用いてプログラム、またはファンクションブロックの動作ロジックの記述(ラダー言語/ST言語/その他)をするに際し、ファンクションブロックのインスタンスのみならず、インタフェースのインスタンスを用いてロジックを記述できる。このインタフェースのインスタンスを用いてロジックを記述するには、図12に示すように、プログラムまたはファンクションブロックの編集画面において、プログラムワークスペースからインタフェースをあらわすシンボルSをラダー回路にドラッグ&ドロップするなどの操作により、ラダー回路中にインタフェースを型とするインスタンスが表示されるようになる。
係る処理は、具体的には、図13に示すフローチャートを実行することで行なわれる。すなわち、論理プログラム構成表示/編集部21は、ユーザ操作を待ち(S21)、ユーザから、上記のドラッグ&ドロップ処理によりファンクションブロック内部のプログラム中に、インタフェースのインスタンスの貼り付け操作を受け付けると(S22)、ユーザに対してインタフェースのインスタンスにインスタンス名の入力を促す(S23)。ユーザは、たとえば、表示画面にポップアップ表示されたインスタンス名の入力エリアに、入力装置を操作してそのインタフェースのインスタンスに付すべきインスタンス名を入力する。そこで、論理プログラム構成表示/編集部21は、当該ファンクションブロックの保有インスタンスリストに、その入力により指定されたインスタンス名で指定されたインタフェースを型とするインスタンスを追加する(S24)。
論理プログラム構成表示/編集部21は、指定されたインスタンス名が重複しているか否かを判断し(S25)、重複している場合には、エラー表示を出力し(S26)、処理ステップ21に戻り、次のユーザ操作を待つ。そして、インスタンス名が重複していない場合には、論理プログラム構成表示/編集部21は、指定されたインタフェースと入出力変数リストを参照しそのインスタンスのシンボルSを当該ファンクションブロックの編集画面W5上に表示する(S27)。このシンボルSを表示した状態が、図12に示す表示画面例である。インタフェースのインスタンスは、ファンクションブロックのインスタンスと同様に入出力変数を備えたブロックとしてラダー回路内で結線することができる。本実施形態では、インタフェースのインスタンスは、ボディとなるファンクションブロックが特定されておらず、具体的な内部プログラムは未定となることから、シンボルSは枠のみ(白抜き)を記載している。これに対し、ファンクションブロックのインスタンスのシンボルS′は、内部プログラムが記述されているとことから色つきとしている。
そこで、ラダー回路エディタ24は、ユーザ装置を待ち(S28)、ユーザからの入力に従い、インタフェースのインスタンスの入出力変数に当該ファンクションブロックの内部変数を結線する(S29)。
一方、“コントローラインスタンス構成”には、“論理プログラム定義”を用いて実際にPLCにダウンロードして動作させるプログラムのインスタンス構成が記述されるとともに、グローバル変数、I/O割付、ネットワーク変数のコネクション設定といったグローバルリソースへの割付設定が行われる。これらが一覧リストとなってツリー状に表記される。
図14は、PLCにダウンロードし実行させる制御プログラムを表す“コントローラインスタンス構成”の一例を示している。PLCを表すコントローラインスタンスは、グローバル変数リストと各種タスク(サイクリックタスク、割込実行タスク、電断実行タスクなど)を持っており、タスクには規定のプログラム共通インタフェースによってプログラムのインスタンスが割り付けられる。
プログラムのインスタンス化に伴い、それが保有するファンクションブロックのインスタンスもコントローラインスタンス構成上に表される。プログラムまたはファンクションブロックのインスタンス化に伴い、それが保有するインタフェースのインスタンスには、それと同一のインタフェースを実装したファンクションブロックのインスタンスが接続され、コントローラインスタンス構成上に表される。さらに、ファンクションブロックのインスタンス化に伴い、それが保有する他のファンクションブロックのインスタンスもコントローラインスタンス構成上に表される。
さらに、図14に示すように、インタフェース定義(要求インタフェース)を用いて記述された制御プログラムは、その要求インタフェースと同一のインタフェース定義からなる提供インタフェースを備えたファンクションブロックが接続される。
次に、図15,図16を参照しながら、制御プログラムを用いて、コントローラインスタンス構成を設定する処理機能を説明する。図15は、コントローラインスタンス構成設定画面の一例を示し、図16は、コントローラインスタンス構成を作成する機能を示すフローチャートである。このフローチャートを実行する機能は、コントローラインスタンス構成表示/編集部20が備えている。図15に示す例では、“UnitController”なる名称のファンクションブロック”の内部では、“搬入ユニットI/F”なる名称のインタフェースを用いてラダープログラムが記述されているものとする。また、この図15に示すコントローラインスタンス構成設定画面は、初期状態では、コントローラインスタンスは定義されておらず、ユーザがプログラムを動作させるPLCの機種にあわせて、プロジェクトの内部構成一覧画面内のツリービューにコントローラインスタンスを追加することになる。
コントローラインスタンス構成表示/編集部20は、ユーザ操作を待ち(S31)、ユーザのコントローラインスタンス作成操作を受け付ける(S32)と、コントローラインスタンスツリーのルートノードに指定された機種のコントローラインスタンスを追加し、その下に機種のもつタスクを追加する(S33)。このコントローラインスタンス作成操作は、例えば、論理プログラム定義一覧のプログラム定義一覧の中から、コントローラインスタンスを作成する対象のプログラムを選択し、所定のコマンド入力や、図示省略するメニューリストから作成命令を入力したり、コントローラインスタンスを作成する対象のプログラムをコントローラインスタンス構成の所定位置にドラッグ&ドロップをしたりすることで行なうことができる。
次いで、コントローラインスタンス構成表示/編集部20は、ユーザ操作を待ち(S34)、ユーザからプログラムのタスク割付の指示を受ける(S35)と、指定されたタスクに指定されたプログラムの割付を設定し(S36)、設定されたプログラムまたはファンクションブロックのプログラム記述中で呼び出されているインタフェースのインスタンスを検索する(S37)。つまり、コントローラインスタンス構成表示/編集部20は、コントローラインスタンスが追加されると、その機種で使用可能なタスクがそのサブノードに表示するので、ユーザはこのタスクに対し、論理プログラム定義で作成しておいたプログラムのインスタンスを割り付けていくことになる。また、プログラム内でファンクションブロックのインスタンスが使用されている場合には、コントローラインスタンス構成のツリービュー上で、そのプログラムを表すノードのサブノードにそのファンクションブロックのインスタンスが表示される。
コントローラインスタンス構成表示/編集部20は、検索したプログラムまたはファンクションブロック中のプログラム記述中にインタフェースの呼び出しがある場合(S38でYes)、ユーザに対し、当該インタフェースを実装宣言リストに持つファンクションブロックの一覧を表示する(S39)。図15の例をとって説明すると、“UnitController”ファンクションブロックがインスタンス化されると、そのファンクションブロックのプログラム中に要求インタフェースして“loader”なる名称の“搬入ユニットI/F”が存在するので、コントローラインスタンス構成表示/編集部20は、論理プログラム定義記憶部26をアクセスして、“搬入ユニットI/F”を提供インタフェースとして持つ全てのファンクションブロックを検出し、その検出したファンクションブロックの一覧をリスト表示する。図15では、“LoadingArm”と“LoadingTable”の2つのファンクションブロックがリストアップされ、搬送ユニットI/Fはいずれのファンクションブロックにも入れ替え可能になる。そして、コントローラインスタンス構成表示/編集部20は、ユーザからファンクションブロックの選択操作を受ける(S40)と、その指定されたファンクションブロックをインタフェースの実体インスタンスとして設定する(S41)。
すなわち、プログラムまたはファンクションブロックの内部でインタフェースのインスタンスが使用されている場合には、コントローラインスタンス構成のツリービュー上で、一旦インタフェースを表すアイコンでインスタンスが表示される。ただしこの状態でビルドを行うと、インタフェースインスタンスのボディとなるファンクションブロックが設定されていない旨のエラー表示がなされる。コントローラインスタンス構成ツリービュー上のインタフェースのアイコンをクリックすると、当該インタフェースを実装したファンクションブロックのリストが表示され、ユーザに選択が促される。ユーザが選択を行うと、選択されたファンクションブロックがインタフェースインスタンスのボディとして関連づけられる。
このようにして、プログラム中に存在する全てのインタフェースのインスタンスに対して、対応するファンクションブロックを関連付けたならば、処理ステップS38の分岐判断はNoとなるので、コントローラインスタンス構成表示/編集部20は、処理ステップS41で指定されたファンクションブロックのプログラム記述中で使用されているファンクションブロックのインスタンスを検索し(S43)、ファンクションブロック呼び出しがあるか否かを判断する(S43)。そして、呼び出しがある場合には、処理ステップ37に戻り、呼び出されたファンクションブロックについて、そのプログラム中にインタフェース定義で記述されているもの(要求インタフェース)が存在するか否かをチェックし(S37,S38)、存在する場合には、対応する提供インタフェースを持つファンクションブロックを関連付けるための処理(S39〜S41)を実行する。
上記の各処理を適宜実行することにより、コントローラインスタンス中に存在する全てのインタフェースインスタンスに対して、適切なファンクションブロックをボディとして関連付けることができたならば、処理ステップS43の分岐判断はNoとなり、ユーザ操作待ちとなる。なお、このユーザ操作待ちに続き、例えば、制御プログラムをビルド後、PLCへのダウンロード等が行なわれる。
また、上記の各処理を実行することで作成されたコントローラインスタンス構成は、コントローラインスタンス構成記憶部25に格納される。また、コントローラインスタンス構成表示/編集部20は、コントローラインスタンス構成記憶部25に格納されたコントローラインスタンス構成を呼び出して表示装置の所定エリアに表示したり、その内容を修正したり、修正した構成を当該機奥部25に格納する処理を実行する。
図4に示すように、本PLC制御プログラム開発装置は、通常の開発装置と同様に、作成したプログラムをPLCが実行できる状態にビルドし、ダウンロードする機能として、オブジェクトコード記憶部27と、プロジェクトデータファイル入出力部28と、オブジェクトコードビルド部29と、PLC通信部30と、備える。ここで、プロジェクトデータファイル入出力部28は、各記憶部26,25に格納された論理プログラム定義やコントローラインスタンス構成などのプロジェクトデータのファイルシステムへの保存/読み出しを行うサブシステムである。また、オブジェクトコードビルド部29は、論理プログラム定義とコントローラインスタンス構成を元に、実際にPLCファームウェアにダウンロードされ実行される、制御プログラムのバイナリーデータであるオブジェクトコードを生成するサブシステムである。このオブジェクトコードビルド部29で生成されたオブジェクトコードは、オブジェクトコード記憶部27に格納される。PLC通信部30は、PLC1のファームウェアと通信を行い、オブジェクトコード記憶部27に格納されたオブジェクトコードのダウンロードやアップロードを行なう。さらにPLC通信部30は、PLCの運転制御、モニタリングを行う機能も備える。
上述したように、本実施形態によれば、図17に示すように、プログラムを、インタフェースを介してファンクションブロックを呼び出すように記述することによって、要求インタフェースと提供インタフェースの連結部分を切り離すことができ、それにより、インタフェース部分で上位のプログラムと、それに呼び出されるファンクションブロックとを切り分けることができる。よって、図18に示すように各部分を再利用部品化することができる。
つまり、呼び出されるファンクションブロックだけでなく、ファンクションブロックを呼び出す側のプログラム/ファンクションブロックも再利用部品とすることができる。それによって、制御プログラムから重複なく部品を切り出すことができる。その結果、製品シリーズを構成する制御プログラムからより多くの箇所を再利用部品化することができ、部品の利用にあたり、部品自体を編集することなく、部品を接続することで制御プログラムを構成することができる。
これにより、例えば、製品を検査装置に供給するための製品ローダと、製品を検査装置から搬出する製品アンローダーは、共通の“搬送ロボット制御FB”にでき、管理しなければならない部品の数を低減できる。そして、管理しなければならない部品数を減らし、部品内に同名のファンクションブロックのコピーが重複して含まれることを防ぐことができる。また、プログラムやファンクションブロックを編集してファンクションブロックを貼り換えることなしに、部品をインタフェースに基づいて接続することによって、簡単に新しい制御プログラムが構成できる。
本実施形態では、図19に示すように、ファンクションブロック群の単位で部品化することができる。すなわち、呼び出し関係がある複数のファンクションブロック群をグループ化しそのインタフェースを明示的に定義することで、あたかも1つのファンクションブロックのように取り扱える“ファンクションブロックコンポーネント”として定義できる。これにより、ファンクションブロックのみならず、コンポーネントという大きな粒度での制御プログラムの再利用部品化が行える。
さらには、図20に示すように、プログラム群の部品化をすることもできる。つまり、複数の“プログラム”と、それと呼び出し関係がある複数のファンクションブロック群をグループ化しそれにインタフェースを明示的に定義することで、あたかも1つの“プログラム”のように取り扱える“プログラムコンポーネント”として定義できる。これにより、コンポーネントという大きな粒度での制御プログラムの再利用部品化が行える。
図19,図20に示すように、複数のファンクションブロックや複数のプログラムをグループ化して部品化するのは、たとえば、その前工程として、それら複数のファンクションブロックや複数のプログラムを用いてプログラムを作成し、プログラム一覧にリストアップされる。そして、そのリストアップされたプログラム単位で、部品化がなされる。このように鑑みた場合、第1,第2グループ化手段は、動作ロジックを作成する手段、つまり、図13に示すフローチャートを実行する論理プログラム構成表示/編集部21により実現されるともいえる。もちろん、動作ロジックとは別に、適宜のファンクションブロック等を指定し、グループ化してコンポーネントを作成するようにしてもよい。