(57)【要約】      （修正有）【課題】多重分岐をもつブロック線図の場合であってもプログラム命令数が不必要に多くならないようにプログラムを生成し、また、元のブロック線図の図としての視覚的な表現を維持して復元できるようにした、プログラム生成装置およびブロック線図生成装置を提供する。【解決手段】少なくとも２つの分岐点を有するブロック線図を読み出す手段と、各分岐点で前記ブロック線図を分割し複数のブロック線図片を生成する手段と、前記複数のブロック線図片の構造情報を生成する手段と、複数の第１のブロック線図片の処理を実現するプログラム命令を生成する手段と、各プログラム命令を配置し、各第１のブロック線図片の構造情報を各第１のブロック線図片に対応するプログラム命令のコメント行に記述し、第２のブロック線図片の構造情報を前記プログラム命令のいずれかのコメント行に記述することによりプログラムを生成するプログラム生成手段と、を備える。【選択図】図８
2010204855.tif 000002
【特許請求の範囲】
【請求項１】
入力ブロック要素と、演算ブロック要素と、出力ブロック要素と、前記入力ブロック要素、前記演算ブロック要素および前記出力ブロック要素間のデータの流れを示すデータ線と、前記データ線のうちの１つである第１のデータ線を3つ以上のデータ線に多重分岐する少なくとも２つの分岐点と、を有するブロック線図を読み出すブロック線図読出手段と、
各前記分岐点にそれぞれ一意の識別子を付与する識別子付与手段と、
各前記分岐点で前記ブロック線図を入力側片と１つ以上の出力片側へ分割し、さらに各前記分岐点にそれぞれ接続されていた複数のデータ線の一端に各前記分岐点のそれぞれの識別子をもつ分岐点ブロック要素を接続することにより複数のブロック線図片を生成するブロック線図分割手段と、
前記複数のブロック線図片の構造情報をそれぞれ生成する構造情報生成手段と、
前記複数のブロック線図片のうち、少なくとも入力ブロック要素と、演算ブロック要素と、出力ブロック要素のいずれかをもつブロック線図片である複数の第１のブロック線図片の処理を実現するプログラム命令を、前記複数の第１のブロック線図片において前記多重分岐をなす各前記分岐点から派生した前記分岐点ブロック要素がすべて同一の変数により表されるように生成するプログラム命令生成手段と、
前記多重分岐をなす前記分岐点のうち最も入力側の分岐点での分割により得られた前記入力側片を含む前記第１のブロック線図片から生成されたプログラム命令が、他の残りの前記第１のブロック線図片から生成されたプログラム命令よりも先に実行されるように各前記プログラム命令の実行順序を決定する実行順序決定手段と、
決定された実行順序に従って各前記プログラム命令を配置し、各前記第１のブロック線図片の構造情報を各前記第１のブロック線図片に対応するプログラム命令のコメント行に記述し、前記複数のブロック線図片のうち前記第１のブロック線図片以外の残りのすべてのブロック線図片である、複数の前記分岐点ブロック要素と前記データ線とのみを含む第２のブロック線図片の構造情報を前記プログラム命令のいずれかのコメント行または他の任意のコメント行に記述することにより、前記決定された実行順序に従って各前記プログラム命令を実行するプログラムを生成するプログラム生成手段と、
を備えたプログラム生成装置。
【請求項２】
前記ブロック線図において、前記入力ブロック要素、前記演算ブロック要素、前記出力ブロック要素および前記複数の分岐点にはそれぞれ座標情報が設定され、
前記ブロック線図分割手段は、各前記分岐点のそれぞれから派生した複数の分岐点ブロック要素のうちの少なくともいずれかに前記分岐点の座標情報を設定し、
各前記第１および第２のブロック図片の構造情報は、各前記第１および第２のブロック線図片に含まれる、前記入力ブロック要素、前記演算ブロック要素、前記出力ブロック要素および前記分岐点ブロック要素に設定された座標情報を含む
ことを特徴とする請求項１に記載のプログラム生成装置。
【請求項３】
少なくとも１つのデータ線は途中で屈曲されており、
前記ブロック線図は、前記少なくとも１つのデータ線の屈曲点の座標情報を含み、
前記ブロック線図分割手段は、前記屈曲点の座標情報を、前記少なくとも１つのデータ線の直前および直後のブロック要素のうちあらかじめ定められた一方のブロック要素に設定し、
前記構造情報生成手段は、前記一方のブロック要素に設定された屈曲点の座標情報を含むように、前記一方のブロック要素を含む第１または第２のブロック線図片の前記構造情報を生成する
ことを特徴とする請求項２に記載のプログラム生成装置。
【請求項４】
それぞれ入力ブロック要素、演算ブロック要素、出力ブロック要素および分岐点ブロック要素のうちのいずれかでありそれぞれ識別子が設定された複数のブロック要素の接続関係を記述した複数の構造情報をプログラムのコメント行から読み出すデータ読出手段と、
前記複数の構造情報のそれぞれに記述された前記接続関係に従って前記複数のブロック要素をデータ線で接続することにより複数のブロック線図片を生成するブロック線図片生成手段と、
各前記ブロック線図片間で同一の識別子を持つ複数の分岐点ブロック要素を１つの分岐点へ統合するように各前記ブロック線図片を合成してブロック線図を生成するブロック線図片合成手段と、を備え、
各前記構造情報において、前記入力ブロック要素と前記演算ブロック要素と前記出力ブロック要素にはそれぞれ座標情報が設定され、また、前記同一の識別子を持つ複数の分岐点ブロック要素のうちのいずれかには前記複数の分岐点ブロック要素が統合されるべき前記分岐点の座標情報が設定され、
前記ブロック線図片合成手段は、
各前記ブロック線図片における前記入力ブロック要素と前記演算ブロック要素と前記出力ブロック要素とをそれぞれの座標情報に応じた位置に配置し、
前記同一の識別子を持つ複数の分岐点ブロック要素を統合した前記分岐点を、前記複数の分岐点ブロック要素のうちのいずれかに設定されている座標情報に応じた位置に配置する
ことを特徴とするブロック線図生成装置。
【請求項５】
前記複数の構造情報はそれぞれ各前記ブロック要素の入力端子および出力端子の位置を記述し、
前記複数の構造情報のうちの１つの構造情報は、前記１つの構造情報における前記複数のブロック要素の少なくとも１つに関連づけられて設定された、データ線の屈曲点の座標情報を記述し、
前記ブロック線図片生成手段は、各前記ブロック要素の前記入力端子および出力端子間を接続し、
前記ブロック線図片合成手段は、前記屈曲点の座標情報が関連づけられたブロック要素の直前および直後のデータ線のうちの一方が、前記屈曲点の座標情報に応じた位置で屈曲するように、前記一方のデータ線を配置する
ことを特徴とする請求項４に記載のブロック線図生成装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はたとえばモデルベース開発ツールに利用可能なプログラム生成装置およびブロック線図生成装置に関する。
【背景技術】
【０００２】
ソフトウェアの開発においてモデルベース設計/開発と呼ばれる手法が存在する。モデルベース設計/開発とはモデルを用いてソフトウェアの設計を行い、そのモデルに基づいてソフトウェアの開発を行う方法のことである。
【０００３】
中でも、制御系ソフトウェアのモデルベース設計とはブロック線図を用いて制御系設計およびシミュレーションを行い、ソフトウェアの開発を行う方法をいう。制御ソフトウェアのモデルベース設計/開発を支援するためにブロック線図からソフトウェアのソースコードを生成するツールがいくつか知られている(たとえば非特許文献1、2を参照)。
【０００４】
制御系ソフトウェアの開発においてはソースコードの再利用が一般的に行われる。ブロック線図を用いたモデルベース設計/開発においてソースコードの再利用を行う場合，ソースコードとは別にモデル(ブロック線図)も管理しておく必要があった。
【先行技術文献】
【非特許文献】
【０００５】
【非特許文献１】http://www.cybernet.co.jp/matlab/products/product_listing/rtwembedded/
【非特許文献２】http://www.dspace.jp/ww/ja/jap/home/products/sw/pcgs/targetli.cfm
【発明の概要】
【発明が解決しようとする課題】
【０００６】
本件出願人により以前に出願された特願2008-021342号では、ブロック線図からソースコードを生成する際にブロック線図の構造情報をコメントとしてソースコードに付加するプログラム生成装置と、その構造情報を用いてブロック線図を生成（復元）するブロック線図生成装置とが示され、これによりモデルとソースコードの一元管理が実現されている。この方法においては、ブロック線図を分岐点で入力側片と出力側片とに分割し、各分割片（入力側片および出力側片）に対応してプログラム命令をそれぞれ生成し、各プログラム命令のコメント行に各分岐片の構造情報を記述し、これによりプログラムを生成する。構造情報は、分岐片に含まれるブロック要素およびその属性、ならびにブロック要素間のデータ線による接続関係を含む。ブロック線図生成の際は、プログラムのコメント行から、構造情報を読み出し、読み出した構造情報に基づきブロック線図を復元する。
【０００７】
しかし、上記方法では、2つ以上の連続した分岐点によってデータ線が3つ以上に分岐される多重分岐を含むブロック線図からプログラムを生成する場合、不必要にプログラム命令数が多くなる問題がある。すなわち、多重分岐を含むブロック線図の場合、２つの分岐点と、当該２つの分岐点間を接続するデータ線とを含む分岐片が生成されるが、この分岐片に対応するプログラム命令は、単に変数の入替えを行うのみであるため、処理効率の低下につながる。
【０００８】
また、上記方法では、多重分岐のブロック線図の場合、各ブロック要素の位置およびデータ線の折れ曲がる位置等の座標情報、ならびに連続した分岐点における分岐の順序等の情報は復元されない。そのため、構造情報から復元されたブロック線図は元のブロック線図と論理的には同一のモデルであっても、図としての表現（視覚的な表現）は異なるものであった。そのため、制御設計者にとって復元されたモデルを直感的に理解することが困難になる等の問題があった。
【０００９】
本発明は、多重分岐をもつブロック線図の場合であってもプログラム命令数が不必要に多くならないようにプログラムを生成し、また、元のブロック線図の図としての表現（視覚的な表現）を維持して復元できるようにした、プログラム生成装置およびブロック線図生成装置を提供する。
【課題を解決するための手段】
【００１０】
本発明の一態様としてのプログラム生成装置は、
入力ブロック要素と、演算ブロック要素と、出力ブロック要素と、前記入力ブロック要素、前記演算ブロック要素および前記出力ブロック要素間のデータの流れを示すデータ線と、前記データ線のうちの１つである第１のデータ線を3つ以上のデータ線に多重分岐する少なくとも２つの分岐点と、を有するブロック線図を読み出すブロック線図読出手段と、
各前記分岐点にそれぞれ一意の識別子を付与する識別子付与手段と、
各前記分岐点で前記ブロック線図を入力側片と１つ以上の出力片側へ分割し、さらに各前記分岐点にそれぞれ接続されていた複数のデータ線の一端に各前記分岐点のそれぞれの識別子をもつ分岐点ブロック要素を接続することにより複数のブロック線図片を生成するブロック線図分割手段と、
前記複数のブロック線図片の構造情報をそれぞれ生成する構造情報生成手段と、
前記複数のブロック線図片のうち、少なくとも入力ブロック要素と、演算ブロック要素と、出力ブロック要素のいずれかをもつブロック線図片である複数の第１のブロック線図片の処理を実現するプログラム命令を、前記複数の第１のブロック線図片において前記多重分岐をなす各前記分岐点から派生した前記分岐点ブロック要素がすべて同一の変数により表されるように生成するプログラム命令生成手段と、
前記多重分岐をなす前記分岐点のうち最も入力側の分岐点での分割により得られた前記入力側片を含む前記第１のブロック線図片から生成されたプログラム命令が、他の残りの前記第１のブロック線図片から生成されたプログラム命令よりも先に実行されるように各前記プログラム命令の実行順序を決定する実行順序決定手段と、
決定された実行順序に従って各前記プログラム命令を配置し、各前記第１のブロック線図片の構造情報を各前記第１のブロック線図片に対応するプログラム命令のコメント行に記述し、前記複数のブロック線図片のうち前記第１のブロック線図片以外の残りのすべてのブロック線図片である、複数の前記分岐点ブロック要素と前記データ線とのみを含む第２のブロック線図片の構造情報を前記プログラム命令のいずれかのコメント行または他の任意のコメント行に記述することにより、前記決定された実行順序に従って各前記プログラム命令を実行するプログラムを生成するプログラム生成手段と、
を備える。
【００１１】
本発明の一態様としてのブロック線図生成装置は、
それぞれ入力ブロック要素、演算ブロック要素、出力ブロック要素および分岐点ブロック要素のうちのいずれかでありそれぞれ識別子が設定された複数のブロック要素の接続関係を記述した複数の構造情報をプログラムのコメント行から読み出すデータ読出手段と、
前記複数の構造情報のそれぞれに記述された前記接続関係に従って前記複数のブロック要素をデータ線で接続することにより複数のブロック線図片を生成するブロック線図片生成手段と、
各前記ブロック線図片間で同一の識別子を持つ複数の分岐点ブロック要素を１つの分岐点へ統合するように各前記ブロック線図片を合成してブロック線図を生成するブロック線図片合成手段と、を備え、
各前記構造情報において、前記入力ブロック要素と前記演算ブロック要素と前記出力ブロック要素にはそれぞれ座標情報が設定され、また、前記同一の識別子を持つ複数の分岐点ブロック要素のうちのいずれかには前記複数の分岐点ブロック要素が統合されるべき前記分岐点の座標情報が設定され、
前記ブロック線図片合成手段は、
各前記ブロック線図片における前記入力ブロック要素と前記演算ブロック要素と前記出力ブロック要素とをそれぞれの座標情報に応じた位置に配置し、
前記同一の識別子を持つ複数の分岐点ブロック要素を統合した前記分岐点を、前記複数の分岐点ブロック要素のうちのいずれかに設定されている座標情報に応じた位置に配置する
ことを特徴とする。
【発明の効果】
【００１２】
本発明により、多重分岐をもつブロック線図の場合であってもプログラム命令数が不必要に多くならないようにプログラムを生成でき、また、元のブロック線図の図としての表現（視覚的な表現）を維持して復元できる。
【図面の簡単な説明】
【００１３】
【図１】実施例１によるブロック線図−プログラム相互変換システムの構成を示す図。
【図２】実施例１に係り、ブロック線図10の一例101を示す図。
【図３】実施例１に係り、ブロック線図101をプログラム生成装置20もしくはブロック線図生成装置40内で扱う際のデータ構造の一例102を示す図。
【図４】実施例１に係り、データ構造102を表すファイルの一例を示す図。
【図５】実施例１に係り、実行順生成処理部が備える識別子付与手段で行う処理の流れ図。
【図６】実施例１に係り、データ構造102`を示す図。
【図７】実施例１に係り、ブロック線図片の集合201を示す図。
【図８】実施例１に係り、ブロック線図片の集合201を圧縮して得たブロック線図片の集合202を示す図。
【図９】実施例１に係り、実行順情報の一例203を示す図。
【図１０】実施例１に係り、実行順生成処理部21が備えるブロック線図分割手段の処理の流れ図。
【図１１】実施例１に係り、プログラム生成処理部23の処理で出力されるプログラムの一例301を示す図。
【図１２】実施例１に係り、プログラム生成処理部23の処理の流れ図。
【図１３】実施例１に係り、プログラム生成処理部23の処理の最中のスタックの状態を示す図。
【図１４】実施例１に係り、実行順情報204をテキスト形式で表現した図。
【図１５】実施例１に係り、図11のプログラム301に図14の実行順情報204をコメントとして挿入したものの例302を示す図。
【図１６】実施例１に係り、ブロック線図生成処理部42により生成されるデータ構造102``の例を示す図。
【図１７】実施例１に係り、ブロック線図生成処理部42の処理の流れ図。
【図１８】実施例１に係り、プログラム生成処理部23の処理の流れ図。
【図１９】実施例１に係り、ブロック線図生成処理部42の処理の流れ図。
【図２０】実施例２に係る実行順生成処理部21が備えるブロック線図分割手段の処理の流れ図。
【図２１】実施例２に係り、ブロック線図生成処理部42の処理の流れ図（図１７に対応）。
【図２２】実施例２に係り、図20に示す処理を、図2のブロック線図101に対して行った際に生成されるブロック線図片の集合202`を示す図。
【図２３】実施例２に係り、図22に示すブロック線図片の集合202`を表すデータ構造203`を示す図。
【図２４】実施例３に係り、実施例1と同一のブロック線図から生成したブロック線図片の集合202``を示す図。
【図２５】実施例３に係り、図24のブロック線図片の集合202``を表すデータ構造203``を示す図。
【図２６】実施例３に係り、ブロック線図生成処理部42の処理の流れ図（図１８に対応）。
【図２７】実施例３に係り、ブロック線図生成処理部42の処理の流れ図（図１９に対応）。
【発明を実施するための形態】
【００１４】
以下、図面を参照しながら本発明の実施例を説明する．
（実施例1）
図1は本発明の実施例１によるブロック線図−プログラム相互変換システムの構成を示す図である。図1において10はプログラム生成装置20の入力となるブロック線図、20はプログラム生成装置、30はプログラム生成装置20によって生成されたプログラム（ソースコード）である。ブロック線図生成装置40はプログラム30を入力としてブロック線図10を生成し、生成したブロック線図10を出力する。プログラム生成装置20およびブロック線図生成装置40は例えばパーソナルコンピュータ（PC：Personal Computer）に実装されたCPU等の演算装置により実行されるプログラムとして実現される。このプログラムはコンピュータに内蔵あるいは外付けされたメモリ、ハードディスク、あるいは、ＣＤ−ＲＯＭ，ＣＤ−Ｒ等の記憶媒体に適宜格納してコンピュータにより読み出して実行することも可能である。
【００１５】
以下ではまず図1のブロック線図−プログラム相互変換システムの概要について説明し、その後、本システムの詳細を具体的に説明する。
【００１６】
プログラム生成装置20はブロック線図10から実行順情報22を生成する実行順生成処理部21と、実行順情報22からプログラム30を生成するプログラム生成処理部23からなる。
【００１７】
実行順生成処理部21は、図示しない記憶部からブロック線図10（後述する図2参照）を読み出す。すなわち、実行順生成処理部21は、ブロック線図を読み出す“ブロック線図読出手段”を備える。ブロック線図は、入力ブロック要素と、演算ブロック要素と、出力ブロック要素と、入力ブロック要素、演算ブロック要素および出力ブロック要素間のデータの流れを示すデータ線と、データ線のうちの１つである第１のデータ線を3つ以上のデータ線に段階分岐する少なくとも２つの分岐点とを有する。
【００１８】
入力ブロック要素はブロックの種類ごとに定められた処理を行い処理された信号を出力するブロック、出力ブロック要素は自身へ入力された信号に対してブロックの種類ごとに定められた処理を行うブロック、演算ブロック要素は、自身へ入力された信号に対してブロックの種類ごとに定められた処理を行い処理された信号を出力するブロックである。
【００１９】
ここで、読み出したブロック線図10において、入力ブロック要素、演算ブロック要素、出力ブロック要素および各分岐点にはそれぞれ座標情報が設定されている。データ線が屈曲しているときは屈曲点の座標情報がさらに設定されていてもよい。
【００２０】
実行順生成処理部21は、ブロック線図10において多重分岐を構成する各分岐点のそれぞれに一意の識別子を付与する。これは本発明の“識別子付与手段”の処理に相当し、実行順生成処理部21は識別子付与手段を含む。
【００２１】
実行順生成処理部21は、多重分岐をなす各分岐点でブロック線図を入力側片と出力側片へ分割し、各分岐点にそれぞれ接続されていた複数のデータ線の一端に各分岐点のそれぞれの識別子をもつ分岐点ブロック要素を接続する。これにより、複数のブロック線図片（後述する図7参照）を生成する。したがって、各ブロック線図片は、各分岐点の入力側片および出力側片のうちのいずれかと、少なくとも１つの分岐点ブロック要素を含む。実行生成処理部21は、分割の際、各分岐点のそれぞれから派生した複数の分岐点ブロック要素のうちの少なくともいずれかに各分岐点のそれぞれの座標情報を付与する。すなわち、同じ分岐点から派生した各分岐点ブロック要素のうちのいずれかには当該分岐点の座標情報を設定する。また実行順生成処理部21は、分割の際、分岐点から出力側への分岐が複数あり、かつこれらの分岐が再度結合しないときは各分岐に応じてそれぞれ出力側片を生成し、再度結合するときは各分岐に対応して１つの出力側片を生成する。本段落で述べた処理は、本発明の“ブロック線図分割手段”の処理に相当し、実行順生成処理部21は、ブロック線図分割手段を備える。
【００２２】
実行順生成処理部21のブロック線図分割手段によって生成されたブロック線図片のうち、少なくとも入力ブロック要素と、演算ブロック要素と、出力ブロック要素のいずれかをもつブロック線図片は、第１のブロック線図片と称される。また、複数のブロック線図片のうち第１のブロック線図片以外の残りのすべてのブロック線図片、すなわち、複数（たとえば２つ）の分岐点ブロック要素と分岐点ブロック要素間を接続するデータ線とのみを含むブロック線図片は、第２のブロック線図片と称される。
【００２３】
実行順生成処理部21は、ブロック線図分割手段によって生成されたブロック線図片（各第１および第２のブロック線図片）のそれぞれの構造情報を生成する。各構造情報は、それぞれ対応する対応するブロック線図片に含まれる各ブロック要素間の接続関係（各ブロック要素に備えられる入力端子／出力端子間の接続関係）、およびブロック要素の詳細情報を含む。実行順生成処理部21は、第２のブロック線図片の構造情報を、各第１のブロック線図片のうちいずれかに含まれる分岐点ブロック要素に、当該分岐点ブロック要素の属性として付加する（詳細は後述）。実行順生成処理部21は、ブロック線図分割手段によって生成されたブロック線図片（各第１および第２のブロック線図片）の構造情報をそれぞれ生成する“構造情報生成手段”を備える。
【００２４】
実行順生成処理部21は、各第１のブロック線図片の処理を実現するプログラム命令（後述のプログラム生成処理部23により生成される）の実行順序を決定する。より詳細には、多重分岐を形成する各分岐点の最初の分岐点の入力側に対応するプログラム命令が、当該最初の分岐点の出力側に対応するプログラム命令よりも先に実行されるように、各プログラム命令の実行順序を決定する。つまり、各分岐点のうち最も入力側の分岐点で分割された入力側片を含む第１のブロック線図片から生成されたプログラム命令が、他の残りの第１のブロック線図片から生成されたプログラム命令よりも先に実行されるように各プログラム命令の実行順序を決定する。このように実行順生成処理部21は、各プログラム命令の実行順序を決定する“実行順序決定手段”を備える。
【００２５】
ここでブロック線図10における少なくとも１つのデータ線が途中で屈曲している場合は、実行順生成処理部21は、上記で説明した処理に加えて、以下の処理を追加的に行ってもよい。すなわち、実行順生成処理部21が備えるブロック線図分割手段は、屈曲点の座標情報を、当該屈曲点を含むデータ線の直前または直後のブロック要素のうちの一方にその属性として設定する。そして実行順生成処理部21が備える構造情報生成手段は、当該一方のブロック要素に設定された屈曲点の座標情報を含むように、当該一方のブロック要素を含むブロック線図片（第１または第２のブロック線図片）の構造情報を生成する。
【００２６】
実行順生成処理部21が備える構造情報生成手段により生成された各ブロック線図片の構造情報と、実行順生成処理部21が備える実行順序決定手段により決定された各プログラム命令の実行順序とを併せ持った情報は実行順情報22に相当する。この実行順情報22が実行順生成処理部21の出力となる。後述するように本実施例では実行順情報22は木構造を有している。
【００２７】
プログラム生成処理部23は、各第１のブロック線図片の処理を実現するプログラム命令（後述する図11参照）を生成する。この際、各第１のブロック線図片に含まれるすべての分岐点ブロック要素を同一の変数により表すようにする。ただしプログラム生成処理部23は、分岐点ブロック要素とデータ線とのみを含む第２のブロック線図片の処理を実現するプログラム命令は生成しない。このようにして本実施例では不必要にプログラム命令数が多く生成されるのを阻止できる。
【００２８】
プログラム生成処理部23は、各プログラム命令を、実行順情報22に示される実行順序にしたがって配置し、さらに各第１ブロック線図片の構造情報をそれぞれ対応するプログラム命令のコメント行に記述することによりプログラム30（後述する図15参照）を生成する。ここでは、第２のブロック線図片の構造情報は、任意の第１のブロック線図片内の分岐点ブロック要素にその属性として付加することで、間接的にコメント行に記述されたが、第２のブロック線図片の構造情報を、上記分岐点ブロック要素の属性に付加せずに、各プログラム命令のいずれかに対応するコメント行に直接記述するようにしてもよい。あるいは、第２のブロック線図片の構造情報を、各プログラム命令に対応するコメント行と異なる他の任意のコメント行に記述してもよい。
【００２９】
このように、プログラム生成処理部23は、各第１のブロック線図片の処理を実現するプログラム命令を生成する “プログラム命令生成手段”を備える。またプログラム生成処理部23は、各生成されたプログラム命令を上記実行順情報22に示される実行順序に従って配置し、各第１のブロック線図片の構造情報をそれぞれ対応するプログラム命令のコメント行に記述し、第２のブロック線図片の構造情報を各プログラム命令のいずれかのコメント行または他の任意のコメント行に記述することによりプログラムを生成する“プログラム生成手段”を備える。
【００３０】
ブロック線図生成装置40はプログラム30から実行順情報22を抽出する実行順抽出処理部41と、実行順情報22からブロック線図10を生成するブロック線図生成処理部42からなる。
【００３１】
実行順抽出処理部41は、プログラム30から実行順情報22を抽出する。すなわち、プログラム30における各プログラム命令のコメント行から構造情報を、各プログラム命令の実行順序と関連づけて読み出す。構造情報は、それぞれ複数のブロック要素の接続関係を記述し、複数のブロック要素のそれぞれは入力ブロック要素、演算ブロック要素、出力ブロック要素または分岐点ブロック要素である。実行順抽出処理部41は、プログラム30における各プログラム命令のコメント行から構造情報を読み出す“データ読出手段”を備える。
【００３２】
ブロック線図生成処理部42は、実行順情報22に含まれる各構造情報のそれぞれに記述された接続関係に従って複数のブロック要素をデータ線で接続する（各ブロック要素の入力端子／出力端子間をデータ線で接続する）ことにより複数のブロック線図片を生成する。この際、生成されたブロック線図片における分岐点ブロック要素にその属性として、ブロック線図片（第２のブロック線図片）の構造情報が付加されているときは、この構造情報に対応するブロック線図片も生成する。これらの処理は、本発明の“ブロック線図片生成手段”の処理に相当し、ブロック線図生成処理部42は、ブロック線図片生成手段を含む。
【００３３】
さらに、ブロック線図生成処理部42は、各ブロック線図片（第１および第２のブロック線図片）間で同一の識別子を持つ分岐点ブロック要素を１つの分岐点へ統合するように各ブロック線図片を合成し、これによりブロック線図10を生成（復元）する。これは本発明の“ブロック線図片合成手段”の処理に相当し、ブロック線図生成処理部42はブロック線図片合成手段を含む。
【００３４】
ここで、プログラム生成装置20の説明で述べたように、入力ブロック要素と演算ブロック要素と出力ブロック要素にはそれぞれ座標情報が設定され、また、前記同一のブロック識別子を持つ複数の分岐点ブロック要素のうちのいずれかには、これら複数の分岐点ブロック要素が分岐された分岐点の座標情報が設定されている。
【００３５】
そこで、ブロック線図生成処理部42が備える上記ブロック線図合成手段は、各ブロック線図片における入力ブロック要素と演算ブロック要素と出力ブロック要素とをそれぞれの座標情報に応じた位置に配置し、また、同一のブロック識別子を持つ複数の分岐点ブロック要素が統合された分岐点をその座標情報に応じた位置に配置する。これにより元のブロック線図（プログラム生成装置20に入力されたブロック線図）の図としての表現（視覚的な表現）を損なわずに、元のブロック線図が復元される。ここでいずれかのブロック要素（入力ブロック要素、演算ブロック要素、出力ブロック要素、分岐点ブロック要素）にデータ線の屈曲点の座標情報が設定されているときは、当該ブロック要素の直前および直後のデータ線のうちあらかじめ定められた一方を、当該屈曲点の座標情報に応じた位置で屈曲（通過）するようにデータ線を配置する（詳細は後述）。これにより元のブロック線図の屈曲も含めて、元のブロック線図を復元できる。すなわち各ブロック要素の位置ならびに各ブロック要素の入力端子および出力端子の位置は定まっており、または上記分岐点の位置も上記のように定まっているため、上記屈曲点の位置を通過するようにデータ線を配置することで元の屈曲が復元できる。
【００３６】
以下、図1のブロック線図−プログラム相互変換システムについてさらに詳細に説明する。
【００３７】
図2にブロック線図10の一例101を示す。1001は入力ブロック要素in1、1002、1003、1004、1005は出力ブロック要素out1、out2、out3、out4、1006、1007、1008、1009、1010は演算ブロック要素a、b、c、d、eであり、1011〜1016は信号線（本発明のデータ線に相当する）、1017〜1019は分岐点であり、1017〜1019によって信号線1012が4つに多重分岐されている。図中のIn、Out、A、B、C、D、Eはブロック要素の種類であり、in1、a、b、c、d、e、out1、out2、out3、out4、はブロック要素を識別する名前であり、ア、ウ、オは分岐点の座標、イ、エ、カは信号線の屈曲点の座標である。ブロック線図101は、入力ブロック要素1001から入力された信号に処理Ａ、処理Bを順に施した信号を出力ブロック要素1002から出力し、入力ブロック要素1001から入力された信号に処理Ａ、処理Cを順に施した信号を出力ブロック要素1003から出力し、入力ブロック要素1001から入力された信号に処理Ａ、処理Dを順に施した信号を出力ブロック要素1004から出力し、入力ブロック要素1001から入力された信号に処理Ａ、処理Eを順に施した信号を出力ブロック要素1005から出力することを表している。図2の例では３つの分岐点によりデータ線が４つに分岐される例が示されるが、本発明はこれに限定されず、少なくとも２つの分岐点により３つ以上にデータ線が分岐されるブロック線図であれば適用可能である。
【００３８】
ブロック線図101をプログラム生成装置20もしくはブロック線図生成装置40内で扱う際のデータ構造の一例102を図3に示す。1101〜1110がブロック要素1001〜1010を表し、1111〜1116が信号線を表す。
【００３９】
ブロック要素は種類属性、名前属性、ブロック線図上におけるブロック要素の位置を表す座標属性を有し、さらに、ブロックの種類毎に定められた属性、およびブロック要素の持つ入力端子の数等の属性を持つ。ブロック要素の種類毎に定められた属性としては、定数倍する機能を持つブロック要素の場合における定数、正弦波を発生する機能を持つブロック要素の場合における振幅と振動数といったものがある。定数等のブロックの種類毎に定められた属性については実行順情報を生成する際には利用しないためここでは表示していない。また、ブロック要素の位置を表す座標属性に関してもここでは表記の簡単のため表示していない。更に、ブロック線図101では演算ブロック要素及び出力ブロック要素の入力端子はすべて1個(入力ブロック要素の入力端子は0個)であるのでここでは表示していない。
【００４０】
信号線は、始点と終点のブロック要素の名前および端子番号と、屈曲点の座標と、分岐点の座標とを属性として持つが、上述のようにここでは端子番号は省略する。またデータ線の分岐はたとえば1112,1112aの組のように、始点属性のみを持つ信号線要素と終点属性のみを持つ分岐線要素との組によって表現する。また分岐線の分岐（多重分岐）は、1118,1119の関係のように分岐線要素の子要素に分岐線要素を持たせることによって表現する。
【００４１】
ブロック線図101はたとえばデータ構造102を表すテキストファイルの形式でプログラム生成装置20に入力される。データ構造102を表すファイルの一例を図4に示す。
【００４２】
実行順生成処理部21の識別子付与手段は1118、1119の2つの分岐点（分岐線の分岐点）に識別子を付与する。データ構造102で表わした場合、分岐線要素(図中のBranch)のうち、子要素として分岐線要素を持つものに相当する。以下、実行順生成処理部21の識別子付与手段の処理の概要について、図5に示す流れ図を参照して説明する。識別子付与手段への入力がブロック線図101を表すデータ構造102、識別子付与手段の出力が、識別子が付与されたブロック線図のデータ構造102`(図6を参照)である例を元に説明を行う。
【００４３】
識別子付与手段ではブロック線図上のすべての信号線要素に対して図5に示す流れ図の処理を行う。データ構造102は1111〜1116の6個の信号線要素を有する。まず、1111に対して図5に示す処理4001を行うが、1111以下には分岐線要素は存在しないため、処理4001で作成される一覧は何も要素を含まず，処理は終了する。信号線要素1112以下には1112a、1118、1118a、1119、1119a、1119bの6つの分岐線要素が存在する。それらに対し、ループ4002内の処理を順次行う。1112a、1118a、1119a、1119bは、分岐線の子要素を持たないため判断4003がNoとなり処理が終了する。1118は、分岐線の子要素を持つため判断4003がYesとなる。分岐線要素に一意の名前を付ける方法として、処理4004では信号線名に番号を付加する方法をとる。ここでは、信号線1112には名前属性がないため、始点ブロック名に_outを付けたものを信号線名として用い、この信号線名に_b0、_b1…と順次番号を付加していくこととする。1118には処理4004によって名前属性a_out_b0が付加され1118`となる。同様に1119には処理4004によって名前属性a_out_b1が付加され1119`となる（図6参照）。
【００４４】
実行順生成処理部21の識別子付与手段の出力102`（図6参照）に、実行順生成処理部21が備えるブロック線図分割手段の処理を行った後のブロック線図片の集合201を図7に示す。分岐点1017から派生した分岐点ブロック要素は2020、2021、2022であり、分岐点1018から派生した分岐点ブロック要素は2027、2023、2024であり、分岐点1019から派生した分岐点ブロック要素は2028、2025、2026である。分岐点の座標ア、ウ、オは、当該分岐点から派生した分岐点ブロック要素のうちその分岐点の入力側のデータ線に接続された分岐点ブロック要素2020、2027、2028に当該分岐点ブロック要素の属性として付加され、屈曲点の座標イ、エ、カは、当該屈曲点を含むデータ線の出力に接続されるブロック要素2027、2028、2010に、当該ブロック要素の属性として付加される。
【００４５】
次に、実行順生成処理部21のブロック線図分割手段は、ブロック線図片の集合201において、分岐点ブロック要素とデータ線のみから構成される第２のブロック線図片の構造情報を、第１のブロック線図片の分岐点ブロック要素にその属性として付加し、当該第２のブロック線図片を削除する（圧縮処理）。この圧縮処理の後のブロック線図片の集合202を図8に示す。図7のブロック線図片2102、2104は分岐点ブロック要素とデータ線のみで構成されるため削除され、2102の情報は属性2020a、2104の情報は属性2020b、として2020`に付加される。ここで属性2020aおよび2020bを付加する分岐点ブロック要素は2021、2023、2025、2026のいずれかでも可能であるが、多重分岐の入力側である2020’に限定することにより、プログラム命令生成手段およびブロック線図生成処理部において、第２のブロック線図片の情報の付加されている分岐点ブロック要素を探索する処理が軽減可能となる。
【００４６】
実行順生成処理部21のブロック線図分割手段は、図8のブロック線図片の集合202から実行順情報22を生成する。生成された実行順情報のデータ構造の一例203を図9に示す。データ構造の一例203は木構造を有し、根2200に直接つながる各部分木が、図8の各ブロック線図片に対応する。データ構造の一例203は、実行順木とも称される。
【００４７】
以上に説明した実行順生成処理部21のブロック線図分割手段の処理は、実際には図10に示す流れ図の処理によって、一括して行われる。これらの処理を、図6のデータ構造102`を入力、図9のデータ構造203を出力として、図10の流れ図を参照して説明する。
【００４８】
本処理では、まず図6のデータ構造102`の有する各出力ブロック要素を、実行順木203の根に子要素として追加する処理を行い、次にその出力ブロック要素を現在のブロック要素として図10の流れ図に示す処理を行う、ことを繰り返すことにより、実行順情報22（データ構造203）を生成する。以下図10の流れ図の処理について詳細に説明する。
【００４９】
図6のデータ構造102’は1102〜1105の4つの出力ブロック要素を有する。そこでまず、out1出力ブロック要素1102をout1出力ブロック要素2202として実行順木203の根2200の直下に追加し、図10の流れ図の開始4101から処理を行う。out1出力ブロック要素1102を終点とする信号線要素1113は分岐線ではないため、判断4102はNoとなり、処理4113によってout1出力ブロック要素2202の子要素として信号線1113の始点であるブロック要素1107を表すブロック要素2207を登録する。信号線1113は座標属性を持たずまた始点である演算ブロック要素1107は入力ブロック要素ではないため、判断4110、4112ともにNoとなり、ループ4116にすすむ。
【００５０】
次にループ4116の処理を行う。この際、ブロック線図が入力端子が1個以下のブロック要素のみからなる場合、ループ端4116からループ端4119間の処理は、処理4118を1回実行することと等価となる（本実施例では上述のように入力端子の個数は１個以下であるためこれに相当する）。処理4118では信号線1113の始点である演算ブロック要素1107を現在ブロック要素として開始4101から始まる処理を再帰的に呼び出す。
【００５１】
ブロック要素1107を終点とする信号線は分岐線1112aであるため、判断4102はYesとなり判断4103に進む。分岐線1112aの親要素は信号線1112であり、親が分岐線でない分岐線の始点は、２個目以降の分岐点（多重分岐点）ではないため、判断4103はNoとなり、処理4105に進む。処理4105で現在ブロック要素2207の下に分岐点ブロック要素2221を登録し、判断4121に進む。この際に登録する分岐点ブロック要素の名前属性の決定法としては、ブロック線図上で該当する信号線112に名前がつけられている場合はその名前にする、なければ規則を設定しその規則に従って名前をつけるなどの方法をとることが可能である。ここではブロック線図上で信号線112はブロック要素a(ブロック要素1106)の出力に相当するためa_outという名前属性を設定することとする（a_outは後の説明において便宜上、信号線112の信号線名として扱われることもある）。分岐線1112aは座標属性を持たないため、判断4121はNoとなり判断4106に進む。
【００５２】
実行順木の根2200の子要素にa_outという名前属性を持つ分岐点ブロック要素は存在しないため判断4106はNoとなり、処理4108によって、分岐点ブロック要素2221と同じ名前をもつ（あるいは信号線と同じ名前をもつ）分岐点ブロック要素2220`が登録される（なお図中の座標属性(Position:ア)は後の処理で付与される）。更に処理4109によって、多重分岐を構成する分岐点間の接続情報が分岐点ブロック要素2220`の属性として付加される。
【００５３】
すなわち、処理4109では、図18に示す流れ図の処理によって多重分岐を表す信号線を表す部分木を探索し、子要素に分岐線要素を持つ分岐線要素と、その親要素である信号線要素もしくは分岐線要素間の接続を、多重分岐の入力側の分岐点要素の属性として付加する。具体的に、信号線1112は1112a、1118`、1118a、1119`、1119a、1119bの６つの分岐線要素を有する。それぞれに対してループ4403の処理を行う。信号線1112の有する6つの分岐線要素のうち子要素も分岐線であるものは1118`、1119`の2つであるので、これらに対してのみ処理4405、4406が行われる。まず、1118`に対して処理4405によって2220`の子要素として1118`の親要素である信号線1112の名前を持つ2220a1が追加され、処理4406によって2220a1の子要素として1118`を表す2220a2が追加される。同様に1119`に対して処理4405によって2220b1、処理4406によって2220b2が追加される。
【００５４】
図10の処理4113によって信号線1112の始点である演算ブロック要素1106が、ブロック要素2206として、実行順木の分岐点ブロック要素2220`の子要素に登録される。信号線1112は座標属性を有するので判断4110はYesとなり、処理4111によってブロック要素2206の実行順木上での親要素である分岐点ブロック要素2220`に座標属性(Position:ア)が付加される。また、演算ブロック要素2206は入力ブロック要素ではないため判断4112はNoとなり、ループ4116の処理に進む。
【００５５】
次に処理4118によってブロック要素1106を現在ブロック要素として開始4101から始まる処理が再帰的に呼び出される。ブロック要素1106を終点とする信号線1111は分岐線ではないため判断4102はNoとなり処理4113によって信号線1111の始点である入力ブロック要素1101を表す入力ブロック要素2201が2206の子要素として追加される。信号線1111は座標属性を持たないため判断4112はNoとなり、入力ブロック要素1111は入力ブロック要素であるため判断4112はYesとなり、終了4114によって処理は呼び出し元に戻る。
【００５６】
呼び出し元は4118であり、終了4120によって処理が呼び出し元に戻ることを2回繰り返し出力ブロック要素1102に対する処理は終了する。
【００５７】
次に、データ構造102が有する2つ目の出力ブロック要素である出力ブロック要素1103をout2出力ブロック要素2203として実行順木203の根2200の直下に追加し、図10の流れ図の開始4101から処理を行う。out2出力ブロック要素1103を終点とする信号線要素1114は分岐線ではないため、判断4102はNoとなる。処理4113に進み、信号線要素1114の始点である演算ブロック要素1108をout2出力ブロック要素2203の子要素2208として登録する。信号線1114は座標属性を持たず、またその始点である演算ブロック要素1108は入力ブロック要素ではない。このため判断4110、4112はNoとなり、ループ4116内の処理4118に進む。
【００５８】
次に処理4118では信号線1114の始点である演算ブロック要素1108を現在ブロック要素として開始4101から始まる処理を再帰的に呼び出す。
【００５９】
ブロック要素1108を終点とする信号線は分岐線1118aであるため、判断4102はYesとなり判断4103に進む。分岐線1118aの親要素は分岐線1118`であり、親が分岐線である分岐線の始点は、２個目以降の分岐点（多重分岐点）であるため、判断4103はYesとなり、処理4104 に進む。処理4104で現在のブロック要素2208の下に分岐点ブロック要素2223を登録し、判断4121に進む。この際、登録する分岐点名は、分岐線の始点のため、1118aの親要素である1118`の名前属性a_out_b0となる。分岐線1118aは座標属性を有していないため、判断4121はNoとなり判断4106に進む。判断4106では、分岐線名ではなく分岐線の属する信号線名と同じ名前の分岐点ブロック要素の有無を判定する。分岐線1118aの属する信号線名はa_outであり、すでにこの信号線名a_outをもつ分岐点ブロック要素2220’が登録されているため判断4106はYesとなる。このため、終了4107によって処理は呼び出し元に戻り、出力ブロック要素1103に対する処理は終了する。
【００６０】
データ構造102が有する残りの出力ブロック要素である出力ブロック要素1104，1105に対しても同様に図10の流れ図に従って処理を行うことでブロック要素2204、2209、2225およびブロック要素2205、2210、2226が登録される。ここで、分岐線要素1119bが座標属性を有しているため、分岐点ブロック要素2226を実行順木に加えた後、判断4121がYesとなり、ブロック要素2226の実行順木上での親要素であるブロック要素2210に座標属性(Position:カが付加される)。
【００６１】
上述のアルゴリズムによって実行順木（実行順情報）を生成する場合、ブロック線図片
が生成される順序に関しては、図9に示すように、まず2202、2207、2221からなるブロック線図片が生成され、次に2220’、2206、2201からなるブロック線図片が生成される。ただし実際のプログラム30を生成する際には、分岐点の入力側の演算である2220’、2206、2201からなるブロック線図片のプログラム命令を、分岐点の出力側の演算である残りのブロック線図片のプログラム命令よりも先に計算するようにする必要がある。そこで、実行順木の根2200に直接つながる各部分木（ブロック線図片）の実行順序が以下のようになるようにする。すなわち、根2200に直接つながるブロック要素として分岐点ブロック要素をもつ部分木（ブロック線図片）が、当該分岐点ブロック要素の名前に合致する名前（当該分岐点ブロック要素の派生元の分岐点の名前、または当該派生元の分岐点より後の分岐点の名前）をもつ分岐点ブロック要素を葉としてもつ部分木（ブロック線図片）よりも先に実行されるようにする。そして、このような実行順序の制約をデータ構造203に含める。図9のデータ構造203では先に計算するブロック線図片を左側に書くことでブロック線図片(部分木)間の実行順序を示している。
【００６２】
次に、プログラム生成処理部23の処理について図9のデータ構造203で表される図8の実行順情報202を入力として説明する。本処理で出力されるプログラムの一例301を図11に示す。実行順情報からプログラムを生成する際には、各ブロック線図片の最後のブロック要素(各部分木において実行順木の根に直接接続されるブロック要素)が、１文のプログラム（１つのプログラム命令）により代入される(数式表現の場合左辺に相当する)値となり、各ブロック線図片の最後のブロック要素の直前のブロック要素が１文のプログラム（１つのプログラム命令）において最後に行われる演算となる。また各ブロック線図片において、直前のブロック要素の出力が、次のブロック要素への入力となる。図8においてブロック要素2001、2006、2020`からなるブロック線図片の場合、ブロック要素2001の出力がブロック要素2006の入力となり、ブロック要素2006の出力がブロック要素2020`に代入される。これをプログラミング言語で表すと図11の3001となる。
【００６３】
プログラム生成処理部23の処理を図12に示す流れ図を参照して詳細に説明する。本処理では各ブロック線図片に相当する各部分木に対して図12の処理を行う。ここでは一例として、ブロック要素2201、2206、2220`からプログラム命令3001を生成する手順について説明する。以下の説明では、図12に加えて、図13に示すスタックの内容を参照する。処理4202によって部分木の内容をすべてスタックに格納する。この状態を図13の2390に示す。その後、処理4204によって被演算子in1と演算子(関数)Aをスタックから取り出しこれらを用いて処理4206によって式を作成する。作成された式を処理4207によって再びスタックに格納する。この状態を図13の2391に示す。処理4207の後再びループ4203を実行し、スタックの内容が被演算子のみになったら（No）、処理4209によってプログラム命令3001を生成して、処理を終了4210する。これによって１つの部分木に対する処理が終了する。
【００６４】
上記と同様にして、ブロック要素2221、2207、2202からなるブロック線図片からプログラム命令3002が生成される。
【００６５】
また、ブロック要素2223、2208、2203からなるブロック線図片からプログラム命令3003が生成される。ただし、ブロック要素2223は、分岐点の出力側に対応するため、処理4202においてブロック要素2223をスタックに格納する際には、ブロック要素2223を示すa_out_b0を格納するのではなく、ブロック要素2223の名前をBP要素（図9参照）として持つブロック要素2220`を示すa_outを格納する（なおブロック要素2221も分岐点の出力側であるがこれはブロック要素2220`と名前が一致するためこのような変換処理は不要である）。これにより、多重分岐をなす各分岐点から派生したすべて分岐点ブロック要素を同一の変数によって表すようにする。同様にして、ブロック要素2225、2209、2204からなるブロック線図片からプログラム命令3004、ブロック要素2226、2210、2205からなるブロック線図片からプログラム命令3005が生成される。
【００６６】
上記説明では実行順情報203を構文木の形式で示したが、実行順情報204はたとえば図14に示すようにテキスト形式で表現することも可能である。また、実行順情報203はプログラムの1文に対応する単位で区切られているため、プログラムの1文毎に実行順情報をテキスト形式でコメントとして付加することが可能となる。図11のプログラム301に図14の実行順情報204をコメントとして挿入したものの例302を図15に示す。尚、ここで行頭の#はプログラム301の記述言語におけるコメント文を示す。プログラム302においては、その他のコメント文と区別するための方法として実行順情報を表すコメント文については#を行頭に2文字続けることで表している。プログラム生成処理部23は、このようにプログラム301に実行順情報204をコメントとして挿入することによりプログラム302（図1のソースコード30に対応）を生成し、出力する。プログラムに対応するコメントはプログラミング言語におけるコメント文を用いて記述する方法以外に、プログラム命令の1文毎に識別情報をプログラミング言語におけるコメント文として付加するようにし、一方、対応する構造情報は同一の識別情報を付加した上、プログラム命令とは別のファイルに保存する方法によって管理することも可能である。
【００６７】
以上プログラム生成装置20について説明した。以下、ブロック線図生成装置40について説明する。
【００６８】
ブロック線図生成装置40には実行順情報を挿入されたプログラム（たとえば図15のプログラム302）が入力される。
【００６９】
実行順情報抽出部41においてはプログラム302からコメント部を抽出し、実行順情報204（図14参照）のような実行順情報ファイルを生成する。実行順情報抽出部41の処理は例えばプログラム302を1行ずつ読み込み、その中から行頭に#が2文字続いている行だけを出力ファイルに書き込むなどの方法によって行う。
【００７０】
ブロック線図生成処理部42では実行順情報204を入力としてブロック線図10を生成する。ブロック線図生成処理部42では、以下に説明する方法によって、本願発明のブロック線図片生成手段とブロック線図片合成手段との処理を一括して実施する。
【００７１】
ブロック線図生成処理部42の処理の流れを、実行順情報のデータ構造203（図9参照）から図16に示すブロック線図のデータ構造102``へ変換する例をもとに説明する。ブロック線図生成装置40ではまず、図19に示す流れ図の処理により、入力された図9の実行順情報203において分岐点ブロック要素を探索し、分岐を持つ信号線要素（図16の1112参照）と、当該信号線要素の分岐線要素のうち子要素として分岐線要素を持つもの（1118`、1119`参照）とを生成する。次に、入力された実行順情報（データ構造）203の根の子要素すべてに対して順に図17に示す流れ図の処理を行う。これにより、ブロック線図を生成する。以下、本処理について詳細に説明する。
【００７２】
まず、データ構造203（図9参照）に対して、図19に示す流れ図の処理を行う。データ構造203において分岐点の入力側を表す分岐点ブロック要素は2220`のみであるので、2220`に対してループ4503内の処理を1度行う。まず、処理4504により、データ構造102``上に信号線要素1112が生成される。この時点では、1112は名前属性のみを持ち、始点および座標属性は持たない(後ほど図17に示す流れ図の処理によって付加される)。次に、分岐点ブロック要素2220`は子要素としてBP要素を持つため、判断4505はYesとなる。分岐点ブロック要素2220`の直接の子要素であるBP要素は2220a1、2220b1の2個であるため、ループ4506の処理は2度繰り返される。1周目の処理では、処理4507によって現在のブロック要素である1112と同じ名前を持つBP要素である2220a1が発見される。次に、処理4508によって2220a1の子要素である2220a2が1112の子要素1118`としてブロック線図に追加される。ここでは、子要素の名前のみでなく座標属性もブロック線図に追加するため、1118`は座標属性を持つ。2周目の処理では処理4507によって1118`と同じ名前を持つBP要素である2220b1が発見され、処理4508によって1119`がブロック線図に追加される。
【００７３】
次に、次に入力された図9の実行順情報203 の根の子要素すべてに対して順に図17に示す流れ図の処理を行う。データ構造203の根2200は、2220`、2202、2203、2204、2205の5つの子要素を有する。
【００７４】
ここではまず、2220`から処理を行う。2220`は分岐点ブロック要素かつ実行順木の根2200の子要素であるので、分岐点の入力側の分岐点ブロック要素となり判断4302はYesとなる。処理4303によって現在のブロック要素の子要素であるブロック要素2206の名前と種類とを取得する。
【００７５】
処理4304によって現在のブロック要素と一致する名前(a_out)を持つ信号線1112の始点(src)属性として、子要素2206を示すaが付加される。ブロック要素2220`は座標属性（ここでは分岐点の位置を表す座標属性または屈曲点の位置を表す座標属性）を持つため、判断4305はYesとなり、処理4306によって信号線1112の属性として座標属性(<Position>ア)が付加される。次に、処理4317によってブロック要素2206を現在のブロック要素として用いて、4301から始まる処理を再帰的に呼び出す。
【００７６】
ブロック要素2206は演算ブロック要素であるため判断4302はNoとなり処理4307によってブロック要素2206がブロック要素1106としてデータ構造102``に追加される。ブロック要素2206は座標属性（ここでは分岐点の位置を表す座標属性または屈曲点の位置を表す座標属性）を持たないため判断4315はNo、演算ブロック要素であるため判断4308もNoとなりループ4310の処理に進む。実行順情報のデータ構造203におけるすべてのブロック要素の子要素はそれぞれ1個以下であるため、本実施例ではループ端4310と4318で挟まれるループはすべて1度ずつのみ実行する。
【００７７】
ブロック要素2206の子要素は入力ブロック要素2201であるため判断4311はNoとなり処理4314によってブロック要素2201を始点、ブロック要素2206を終点とする信号線1111が生成される。入力ブロック要素2201を現在ブロック要素として用いて4301からはじまる処理が再び呼び出される。
【００７８】
判断4302はNoとなるため処理4307によって入力ブロック要素2201が入力ブロック要素1101としてデータ構造102``に追加される。入力ブロック要素2201は座標属性（ここでは分岐点の位置を表す座標属性または屈曲点の位置を表す座標属性）を有していないため判断4315はNoとなり、また入力ブロック要素2201は入力ブロック要素であるため判断4308はYesとなり、処理は呼び出し元に戻る。
【００７９】
呼び出し元でも終了4319によって処理が終了され、データ構造の根の子要素（分岐点ブロック要素）2220`に対する処理は終了する。
【００８０】
次に、データ構造の根の子要素2202に対しても図17の流れ図の処理を行う。2202は出力ブロック要素であるため判断4302はNoとなり、処理4307によって出力ブロック要素1102がブロック線図に追加される。判断4315 、判断4308、判断4311のいずれもNoとなるため処理4314によりブロック要素2202を終点、その子要素2207を始点とする信号線1113がブロック線図に追加される。処理4317 によってブロック要素2207を現在のブロック要素として4301からはじまる処理が再び呼び出される。ブロック要素2207は演算ブロック要素であるため判断4302はNoとなり処理4307によってブロック要素1107としてブロック線図に追加される。判断4315、判断4308はNoとなり判断4311に進む。ブロック要素2207の子要素2221は分岐点でありかつ同子要素2221は分岐点の出力側となるため（すなわち子要素2221は実行順木の葉に相当するため分岐点の出力側になる）、判断4311はYesとなる。子要素の名前a_outは信号線1112の名前属性と一致するため、信号線1112の直下にブロック要素2207を終点とする分岐線1112aを追加する。処理4313により処理は呼び出し元に戻り、呼び出し元においても終了4319によって処理が終了される。
【００８１】
次に、データ構造の根の子要素2203に対しても図17の流れ図の処理を行う。2203は出力ブロック要素であるため判断4302はNoとなり、処理4307によって出力ブロック要素1103がブロック線図に追加される。判断4315、判断4308、判断4311のいずれもNoとなり、処理4314によってブロック要素2203を終点、その子要素2208を始点とする信号線1114がブロック線図に追加される。ブロック要素2208を現在のブロック要素として用いて4301からはじまる処理が再び呼び出される。
【００８２】
ブロック要素2208は演算ブロック要素であるため判断4302はNoとなり処理4307によってブロック要素1108としてブロック線図に追加される。
【００８３】
判断4315、判断4308はNoとなり判断4311に進む。ブロック要素2208の子要素2223は分岐点でありかつ分岐点の出力側となるため、判断4311はYesとなる。子要素の名前a_out_b0は信号線1112のもつ分岐線1118`の名前属性と一致するため、信号線1112のもつ分岐線1118`以下にブロック要素2208を終点とする分岐線1118aを追加する。処理4313により処理は呼び出し元に戻り、呼び出し元においても終了4319によって処理が終了される。
【００８４】
次にデータ構造の根の子要素2204に対しても図17の流れ図の処理を行う。要素2204に対する処理の流れは要素2203に対する処理の流れと同様になり、出力ブロック要素1104、信号線1115、演算ブロック要素1109、分岐線1119aの順でブロック線図の要素が生成される。
【００８５】
最後にデータ構造の根の子要素2205に対しても図17の流れ図の処理を行うことで同様に、出力ブロック要素1105、信号線1116、演算ブロック要素1110、分岐線1119ｂの順でブロック線図の要素が生成される。この際、ブロック要素2210が屈曲点の位置を表す座標属性を有するため、処理4307でブロック要素2210をブロック線図に追加した後の判断4315がYesとなり、処理4316が行われる。処理4316ではブロック要素2210を終点とする信号線もしくは分岐線要素に座標属性を付加するが、ブロック要素2210を終点とする分岐線要素1119ｂはこの時点ではまだ生成されていないため、終点ブロック要素名と座標属性を記憶装置に記憶しておき、分岐線要素1119bの生成後に座標属性を付加する処理を行う。
【００８６】
以上により図16に示すブロック線図102``が生成される。
【００８７】
以上のように本実施例によれば、ブロック線図を各分岐点で分割して得たブロック線図片（第１および第２のブロック線図片）の構造情報を分岐点の座標および屈曲点の座標も含めてプログラム内の対応するコメント行にコメント文として挿入したことにより、ブロック線図の復元時にプログラム内のコメント文として挿入した構造情報を利用することで、プログラムからブロック線図を図としての表現（多重分岐における分岐の順序、データ線の折れ曲がる位置等）を含めて復元することが可能となる。つまり、ソフトウェアの再利用の際にソースコード中にコメントとして挿入された構造情報からモデルをブロック線図として復元し、モデルベースで制御系の再設計を行うことが可能となる。
【００８８】
また、本実施例によれば、ブロック線図を各分岐点で分割して得たブロック線図片（第１および第２のブロック線図片）のうち、各第１のブロック線図片を表すプログラム命令を、分岐点ブロック要素をすべて同一変数で表すように生成するとともに、第２のブロック線図片についてはプログラム命令を生成しないようにしたため、全体のプログラム命令数を少なく抑えつつ、ブロック線図に対応するプログラムを生成することができる。
【００８９】
（実施例2）
本実施例では、実施例1と同一のブロック線図に対して処理を行うが、実施例1での図10の流れ図の処理を図20の流れ図、図17の流れ図の処理を図21の流れ図に置き換える。
【００９０】
図10と図20の相違点は、処理4122が4122`、4111が4111`に変わっている点である。これにより、信号線・分岐線が座標属性を有していた場合に、図10では登録したブロック要素の親要素の属性として当該座標属性が付加されていたが、図20では登録したブロック要素の属性として当該座標属性が付加される。これは、信号線または分岐線の屈曲点の座標を屈曲点の後ろ側のブロック要素ではなく前側のブロック要素に付加することに、また分岐点の座標を分岐点の入力側分岐点ブロック要素ではなく分岐点の前のブロック要素に付加することに相当する。この変更により、座標属性を付加する際に親要素を探索する必要がなくなり、処理が軽減される。このことにより、図20に示す処理を、図2のブロック線図101に対して行った際に生成されるブロック線図片の集合は、図22に示す202`になる。座標属性カの付加される位置が屈曲点の後側のブロック要素2010から前側のブロック要素2026に、座標属性アの付加される位置が入力側分岐点ブロック要素2020`から分岐点の前の位置するブロック要素2006に変わっている。図22に示すブロック線図片の集合202`を表すデータ構造203`を図23に示す。
【００９１】
図17と図21の相違点は、判断4305および処理4306が削除され判断4320および処理4321が付加された点、処理4316が4316`に変更された点である。
【００９２】
判断4305および処理4306が判断4320および処理4321に変更されたのは、図17の流れ図が図20に変更されたことに対応するものである。すなわち、変更後の図20においては、上述のように信号線または分岐線の屈曲点の座標を屈曲点の後ろ側のブロック要素ではなく前側のブロック要素に、また分岐点の座標を分岐点の入力側ブロック要素ではなく分岐点の前のブロック要素に付加される。このため、分岐点の入力側分岐点ブロック要素が座標属性を有している可能性がなくなり、代わりに分岐点の出力側分岐点ブロック要素が座標属性を有している可能性があることとなる。そこで、これに対応して判断4305および処理4306が、判断4320および処理4321に変更された。
【００９３】
また、処理4316から4316`への変更も同様に、図17から図20への変更により、屈曲点または分岐点の座標が後ろ側のブロック要素ではなく前側のブロック要素に付加されるようになったことによるものである。図17の処理では処理4316が行われる時点では、「そのブロック要素を終点とする信号線」は生成されていないため、「そのブロック要素を終点とする信号線」が生成されるまで座標属性を記憶しておく必要があった。一方図20では4316から4316`への変更により、「そのブロック要素を終点とする信号線」が「そのブロック要素を始点とする信号線」へ変更される。処理4316`の時点で「そのブロック要素を始点とする信号線」であれば座標情報が生成されているため、座標情報を記憶しておく必要がなくなり、記憶装置の容量および記憶処理の演算を削減することが可能となる。
【００９４】
（実施例3）
本実施例では、実施例1よりも実行順情報の情報量を削減する方法を提供する。
【００９５】
図24は、実施例1と同一のブロック線図に対して、実施例1と同一の方法で識別子付与、ブロック線図分割、座標情報付加を行ったものに、本実施例で説明する方法を用いて生成したブロック線図片の集合202``、図25は図24のブロック線図片の集合202``から生成したデータ構造203``を示す。
【００９６】
実施例1のブロック線図片202（図8参照）およびデータ構造203（図9参照）では多重分岐を構成する分岐点間の接続情報は、2つの分岐点間の接続関係を表す要素を複数個並列に並べることで表された。たとえば図8では<BP></BP>の組を２つ並べ（2020aと2020b参照）、図9では、２つの部分木を並列に並べた（2220a2と2220b2参照）。
【００９７】
これに対し本実施例では、図24の202``、図25の203``に示すように複数の分岐点間の接続関係を1つの木構造で表す。この方法を用いることにより、実行順情報の情報量を削減することが可能となる。
【００９８】
本実施例では、図18および図19の処理を、図26および図27の処理に変更する。
【００９９】
図26に示す流れ図に従い、データ構造102`（図6参照）中の信号線要素1112から、図25の203``に示すように分岐点情報を付加する方法について説明する。分岐点情報を付加する際には、信号線要素を現在の要素として、開始4601から処理を行う。
【０１００】
まず、処理4602によって信号線要素1112の子要素一覧を作成する。作成される子要素一覧は1112aと1118`を含む。判断4604で、各子要素が分岐線要素でありかつ子要素として分岐線要素を有するか否かを判断する。子要素1112aは子要素として分岐線要素を持たないため、Noとなり、1112aに対するループ4603内の処理として、処理4607へ進み、何も行われない。一方、子要素1118`は分岐線要素かつ子要素として分岐線要素(1118a、1119`)を有するので判断4604はYesとなり、ループ4604内の処理として、処理4605によって実行順木上の分岐点ブロック要素2220`の子要素としてBP要素2220a’を追加する。次に、処理4606によって1118`を現在のブロック要素として処理4602が再帰的に呼び出される。
【０１０１】
処理4602によって作成される子要素一覧は1118a、1119`を含む。1118aは子要素を持たないため、判断4604はNoとなり、1118aに対する処理は行われない(処理4607)。一方、子要素1119`は分岐線要素かつ子要素として分岐線要素(1119a、1119b)を有するので判断4604はYesとなり、処理4605によって実行順木上の分岐点ブロック要素2220a’の子要素としてBP要素2220b’が付加される。次に、処理4606によって1119`を現在のブロック要素として処理4602が再帰的に呼び出される。1119’は1119a、1119bの2つの子要素を有するがそれらはいずれも子要素を持たないため、判断4604がNoとなり、終了4609によって処理は終了する。
【０１０２】
図25のデータ構造203``から、図16に示すブロック線図のデータ構造102``を生成する際に、分岐点を持つ信号線要素と、多重分岐を表す信号線要素の分岐線要素のうち子要素として分岐線を持つものと、を予め生成する方法を図27に示す流れ図を用いて説明する。
【０１０３】
データ構造203``が有する分岐点の入力側ブロック要素は2220`のみであるため処理4702では2220’のみを含む一覧が作成され、ループ4703の処理は2220`に対してのみ行われる。まず、処理4704により、102``上に信号線要素1112が生成される。この時点では、1112は名前属性のみを持ち、始点および座標属性は持たない(上述したように後に図17に示す流れ図の処理によって付加される)。
【０１０４】
次に、処理4705により2220`の子要素の一覧を作成する。本例では2206と2220a’のみを含む一覧が作成される。ループ4706内に入り、2206はBP要素ではないため判断4707はNoとなり、何も行わない（処理4707）。一方、2220a’はBP要素であるため判断4707はYesとなり、処理4708によってブロック線図上の信号線要素1112の子要素1118`としてブロック線図に追加される。ここでは、子要素の名前のみでなく座標属性もブロック線図に追加するため、1118`は座標属性を持つ。次に、処理4709により、BP要素2220a`を現在のブロック要素として処理4705が再帰的に呼び出される。
【０１０５】
2220a`の持つ子要素は2220bのみであるため、ループ4706は2220b`に対してのみ実行される。2220b`はBP要素であるため判断4707はYesとなり、処理4708によってブロック線図上の分岐線要素1118`の子要素1119`としてブロック線図に追加される。ここでは、子要素の名前のみでなく座標属性もブロック線図に追加するため、1119`は座標属性を持つ。次に、処理4709により、BP要素2220b`を現在のブロック要素として処理4705が再帰的に呼び出されるが、2220b`は子要素を持たないため、ここで図27に示す流れ図の処理は終了する。
【０１０６】
また、木構造のデータを木構造のままコピー可能な処理系も存在する。
【０１０７】
たとえば、データ構造102`、データ構造203``等がXML(Extensible Markup Language)を用いて表わされている場合、木構造上の要素を指定することによってその要素以下の木構造を、その構造をすべて維持したまま複製することが容易に実現できる。
【０１０８】
Java（登録商標）言語を用いてXMLで表わされたデータ構造を扱う処理を記述する場合であれば、org.w3c.dom.DocumentインタフェースのcloneNodeメソッドを用い、引数としてtrueを指定することで木構造の複製が実現可能である。
【０１０９】
この場合、203``上の2220a`を指定して複製を行うだけで図27に示す処理が実現可能となるため、本実施例に示す方法を用いることにより、実施例1および実施例2と比較して、処理量を削減することが可能となる。
【０１１０】
本実施例によれば、実施例1よりも実行順情報の情報量を少なくすることが可能となる。したがって、ソフトウェアの再利用の際にソースコード中にコメントとして挿入されたより少ない実行順情報からモデルをブロック線図として復元し、モデルベースで制御系の再設計を行うことが可能となる。
【０１１１】
本実施例では実施例1をベースとして説明を行ったが本実施例の方法は、同様に実施例2に適用することも可能である。
【符号の説明】
【０１１２】
10：ブロック線図
20：プログラム生成装置
21：実行順生成処理部（ブロック線図読出手段、識別子付与手段、ブロック線図分割手段、構造情報生成手段）
22：実行順情報
23：プログラム生成処理部（プログラム命令生成手段、実行順序決定手段、プログラム生成手段）
30：プログラム
41：実行順抽出処理部（データ読出手段）
42：ブロック線図生成処理部（ブロック線図片生成手段、ブロック線図辺合成手段）
【図１】
2010204855.tif 000003
【図２】
2010204855.tif 000004
【図３】
2010204855.tif 000005
【図４】
2010204855.tif 000006
【図５】
2010204855.tif 000007
【図６】
2010204855.tif 000008
【図７】
2010204855.tif 000009
【図８】
2010204855.tif 000010
【図９】
2010204855.tif 000011
【図１０】
2010204855.tif 000012
【図１１】
2010204855.tif 000013
【図１２】
2010204855.tif 000014
【図１３】
2010204855.tif 000015
【図１４】
2010204855.tif 000016
【図１５】
2010204855.tif 000017
【図１６】
2010204855.tif 000018
【図１７】
2010204855.tif 000019
【図１８】
2010204855.tif 000020
【図１９】
2010204855.tif 000021
【図２０】
2010204855.tif 000022
【図２１】
2010204855.tif 000023
【図２２】
2010204855.tif 000024
【図２３】
2010204855.tif 000025
【図２４】
2010204855.tif 000026
【図２５】
2010204855.tif 000027
【図２６】
2010204855.tif 000028
【図２７】
2010204855.tif 000029