(57)【要約】【課題】プログラム（ソースコード）からブロック線図への復元を可能にするとともに、ソースコード内の各命令とブロック線図の各部分とを対応づけを可能とする。【解決手段】本発明の装置は、ブロック線図を分岐点で複数に分割し、各分割片において分岐点に接続されていたデータ線の一端に分岐ブロック要素を接続することにより、複数のブロック線図片を生成するブロック線図分割手段と、各ブロック線図片の処理を実現するプログラム命令をそれぞれ生成するプログラム命令生成手段と、各プログラム命令の実行順序を決定する実行順序決定手段と、ブロック線図片毎にブロック線図片の構造情報を生成する構造情報生成手段と、実行順序に従って各プログラム命令を配置し、各ブロック線図片の構造情報を各プログラム命令に対応するコメント行に記述することによりプログラムを生成するプログラム生成手段と、を備える。【選択図】図１
2009181446.tif 000002
【特許請求の範囲】
【請求項１】
入力ブロック要素と、演算ブロック要素と、出力ブロック要素と、前記入力ブロック要素、前記演算ブロック要素および前記出力ブロック要素間のデータの流れを示すデータ線と、前記データ線を分岐する分岐点と、を有するブロック線図を読み出すブロック線図読出手段と、
前記分岐点で前記ブロック線図を入力側および出力側に分割することにより入力側片と１つ以上の出力側片とを生成し、
前記入力側片および前記１つ以上の出力側片において前記分岐点に接続されていたデータ線端に分岐ブロック要素を接続することにより、前記入力側片および前記１つ以上の出力側片に対応して、複数のブロック線図片を生成するブロック線図分割手段と、
各前記ブロック線図片の処理を実現するプログラム命令をそれぞれ生成するプログラム命令生成手段と、
前記入力側片に対応するプログラム命令が前記出力側片に対応するプログラム命令よりも先に実行されるように、各前記プログラム命令の実行順序を決定する実行順序決定手段と、
前記ブロック線図片毎に前記ブロック線図片の構造情報を生成する構造情報生成手段と、
前記実行順序に従って各前記プログラム命令を配置し、
各前記ブロック線図片の構造情報を各前記プログラム命令に対応するコメント行に記述することにより、
プログラムを生成するプログラム生成手段と、を備え、
前記構造情報生成手段は、
各前記ブロック線図片における末尾のブロック要素が木構造の根ノードの子ノードに割り当てられ、
前記根ノードと異なる各親ノードの子ノードには、前記各親ノードに割り当てられたブロック要素の直前の処理を行うブロック要素が割り当てられるように、
各前記ブロック線図片の構造情報を生成する、
ことを特徴とするプログラム生成装置。
【請求項２】
少なくとも１つの前記演算ブロック要素は、
（１）  接続元のブロック要素から受けたデータと、前記接続元のブロック要素から過
去に受けたデータに基づく記憶データとのうち少なくとも後者を用いて、演算
を行うことにより演算データを生成し、
前記接続元のブロック要素から受けたデータを少なくとも用いて前記記憶デー
タを更新し、
（２）  前記演算データを接続先のブロック要素に送出する、
記憶演算ブロック要素であり、
前記ブロック線図分割手段は、
前記記憶演算ブロック要素を、（１）の処理を行う第１の演算ブロック要素と、（２）の処理を行う第２の演算ブロック要素とに分割し、
前記第１の演算ブロック要素および前記第２の演算ブロック要素の間で前記ブロック線図を分割し、前記第１の演算ブロック要素は前記ブロック線図片における末尾のブロック要素であり、前記第２の演算ブロック要素は前記第１の演算ブロック要素と異なる前記ブロック線図片の先頭のブロック要素である
ことを特徴とする請求項１に記載のプログラム生成装置。
【請求項３】
入力ブロック要素、演算ブロック要素および出力ブロック要素のうち少なくとも前記入力ブロック要素および前記出力ブロック要素と、
サブシステムブロックと、
入力ブロック要素、演算ブロック要素、出力ブロック要素および前記サブシステムブロックのうち少なくとも前記入力ブロック要素、前記出力ブロック要素および前記サブシステムブロック間のデータの流れを示すデータ線と、
入力サブブロック要素と、演算サブブロック要素と、出力サブブロック要素と、前記入力サブブロック要素、前記演算サブブロック要素および前記出力サブブロック要素間のデータの流れを示すデータ線とを含む、前記サブシステムブロックのサブブロック線図と
を含む多段階層ブロック線図を読み出すブロック線図読出手段と、
前記多段階層ブロック線図における前記サブシステムブロックを前記サブブロック線図に置換し、前記サブシステムブロックの入力に接続されていたデータ線を前記入力サブブロック要素の入力に接続し、前記サブシステムブロックの出力に接続されていたデータ線を前記出力サブブロック要素の出力に接続することにより、単階層ブロック線図を生成する単階層ブロック線図生成手段と、
前記単階層ブロック線図の構造情報を生成する構造情報生成手段と、
前記単階層ブロック線図の処理を実現するプログラム命令を生成するプログラム命令生成手段と、
前記プログラム命令を配置し、
前記プログラム命令に対応するコメント行に前記単階層ブロック線図の構造情報を記述することにより、
プログラムを生成するプログラム生成手段と、
を備えたプログラム生成装置。
【請求項４】
前記単階層ブロック線図における前記入力サブブロック要素を、前記入力サブブロック要素の接続元要素からデータを受ける第１の入力サブブロック要素と、前記第１の入力サブブロック要素で受けたデータを前記入力サブブロック要素の接続先要素に送出する第２の入力サブブロック要素とに分割し、
また前記単階層ブロック線図における前記出力サブブロック要素を、前記出力サブブロック要素の接続元要素からデータを受ける第１の出力サブブロック要素と、前記第１の出力サブブロック要素で受けたデータを前記出力サブブロック要素の接続先要素に出力する第２の出力サブブロック要素とに分割し、
前記単階層ブロック線図を前記第１および第２の入力サブブロック要素間、ならびに前記第１および第２の出力サブブロック要素間で分割することにより複数のブロック線図片を生成する
ブロック線図分割手段と、
プログラム命令の実行順序を決定する実行順序決定手段と、をさらに備え、
前記構造情報生成手段は、
各前記ブロック線図片における末尾のブロック要素が木構造の根ノードの子ノードに割り当てられ、
前記根ノードと異なる各親ノードの子ノードには、前記各親ノードに割り当てられたブロック要素の直前の処理を行うブロック要素が割り当てられるように、
各前記ブロック線図片の構造情報を生成し、
前記プログラム命令生成手段は、各前記ブロック線図片の処理を実現するプログラム命令をそれぞれ生成し、
前記実行順序決定手段は、前記第１の入力サブブロック要素を含む前記ブロック線図片に対応する前記プログラム命令が前記第２の入力サブブロック要素を含む前記ブロック線図片に対応する前記プログラム命令よりも先に実行され、前記第１の出力サブブロック要素を含む前記ブロック線図片に対応する前記プログラム命令が前記第２の出力サブブロック要素を含む前記ブロック線図片に対応する前記プログラム命令よりも先に実行されるように、各生成されたプログラム命令の実行順序を決定し、
前記プログラム生成手段は、前記実行順序に従って各前記生成されたプログラム命令を配置し、各前記ブロック線図片の構造情報を各前記生成されたプログラム命令に対応するコメント行に記述することにより前記プログラムを生成する、
ことを特徴とする請求項３に記載のプログラム生成装置。
【請求項５】
各々ブロック識別子を有する、入力ブロック要素と、演算ブロック要素と、出力ブロック要素と、データ線の分岐を表す分岐点ブロック要素とを、根ノードと異なる各ノードに割り当てた木構造のデータを、プログラムのコメント行から読み出すデータ読出手段と、
子ノードに割り当てられたブロック要素から、前記子ノードの親ノードに割り当てられたブロック要素へ向けてデータ線を接続することを、前記根ノードの各子ノードから開始して、前記木構造の各葉ノードまで順次行うことにより、複数のブロック線図片を生成するブロック線図片生成手段と、
各前記ブロック線図片間で同一のブロック識別子を持つ分岐点ブロック要素を統合して前記分岐点を形成することにより各前記ブロック線図片を合成したブロック線図を生成する合成手段と、
を備えたブロック線図生成装置。
【請求項６】
前記木構造は、
データを受け取り、受け取ったデータと過去に受け取ったデータに基づいて生成された記憶データとのうち少なくとも後者を用いて、演算を行うことにより演算データを生成し、また前記受け取ったデータを用いて前記記憶データを生成する第１の演算ブロック要素と、
前記第１の演算ブロック要素により生成された演算データを送出する第２の演算ブロック要素と、
を前記根ノードと異なるノードに割り当て、
前記合成手段は、各前記ブロック線図片間で、同一の識別子をもつ、前記第１の演算ブロック要素と前記第２の演算ブロック要素とを統合することにより記憶演算ブロック要素を生成する
ことを特徴とする請求項５に記載のブロック線図生成装置。
【請求項７】
入力ブロック要素と、出力ブロック要素と、演算ブロック要素とのうち少なくとも前記入力ブロック要素および出力ブロック要素と、
演算サブブロック要素と、データを受ける第１の入力サブブロック要素と、前記第１の入力サブブロック要素で受けたデータを送出する第２の入力サブブロック要素と、データを受ける第１の出力サブブロック要素と、前記第１の出力サブブロック要素で受けたデータを出力する第２の出力ブロック要素とを、
前記根ノードと異なる前記各ノードに割り当てた木構造のデータをプログラムのコメント行から読み出す木構造読出手段と、
子ノードに割り当てられた要素から、前記子ノードの親ノードに割り当てられた要素へ向けてデータ線により接続することを、各葉ノードを起点として前記根ノードの各子ノードまで順次行うことにより、複数のブロック線図片を生成するブロック線図片生成手段と、
第１および第２の入力サブブロック要素同士を単一の入力サブブロック要素に統合し、第１および第２の出力サブブロック要素同士を単一の出力サブブロック要素に統合することにより、各前記ブロック線図片を合成した単階層ブロック線図を生成する単階層ブロック線図生成手段と、
前記単階層ブロック線図において、前記単一の入力サブブロック要素、前記演算サブブロック要素および前記出力サブブロック要素と、これらの要素間を接続するデータ線とを含むサブブロック線図を特定し、
前記サブブロック線図をサブシステムブロックによって置換し、前記単一の入力サブブロック要素の入力に接続されていたデータ線を前記サブシステムブロックの入力に接続し、前記単一の出力サブブロック要素の出力に接続されていたデータ線を前記サブシステムブロックの出力に接続することによりブロック線図を生成し、
前記サブブロック線図と前記ブロック線図とを含む多段階層ブロック線図を出力する多段階層ブロック線図生成手段と、
を備えたブロック線図生成装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はたとえばモデルベース開発ツールに利用可能なプログラム生成装置およびブロック線図生成装置に関する。
【背景技術】
【０００２】
ソフトウェアの開発においてモデルベース設計/開発と呼ばれる手法が存在する。モデルベース設計/開発とはモデルを用いてソフトウェアの設計を行い、そのモデルに基づいてソフトウェアの開発を行う方法のことである。
【０００３】
中でも、制御系ソフトウェアのモデルベース設計とはブロック線図を用いて制御系設計およびシミュレーションを行い、ソフトウェアの開発を行う方法をいう。制御ソフトウェアのモデルベース設計/開発を支援するためにブロック線図からソフトウェアのソースコードを生成するツールがいくつか知られている(たとえば非特許文献1、2を参照)。
【０００４】
ブロック線図からのソースコードの生成に関していくつかの技術が知られている。特許文献1では複数のブロックに対応する処理をまとめて1つのソースコードとするグルーピング機能について述べられている。特許文献2ではコード生成対象のブロックとシミュレーションでのみ用いるブロックを命名規則によって区別することで1つのブロック線図内の必要な部分のみコード生成を行う技術に関連して、ブロック線図のシリアライズ(閉路除去)手段としてブロック線図上の矢印をすべて反対向きにして後退弧を切断する方法について述べられている。非特許文献3ではブロック線図をプログラム化する際にhistory block(記憶ブロックに相当)を前側と後側に分割する方法が示されている。
【０００５】
また、プログラムからモデルを抽出する技術として、オブジェクト指向言語で記述されたプログラムからUML(Unified Modeling Language)のクラス図を生成する技術(たとえば特許文献3を参照)などが知られている。
【特許文献１】特開2000-20291号公報
【特許文献２】特開2005-222221号公報
【特許文献３】特開平11-95990号公報
【非特許文献１】http://www.cybernet.co.jp/matlab/products/product_listing/rtwembedded/
【非特許文献２】http://www.dspace.jp/ww/ja/jap/home/products/sw/pcgs/targetli.cfm
【非特許文献３】T. Callenkamp, “Implementation of aReal0Time Simulator for Modelling the Dynamics of Closely Coupled Drive Systems”, ISIE’93 IEEE International Symposium on Industrial Electronics, pp.341-346
【発明の開示】
【発明が解決しようとする課題】
【０００６】
ブロック線図モデルに関するモデルベース開発ツールではソースコードからモデル(ブロック線図)への変換は実現されていない。一方制御系ソフトウェアの開発においては既存のソフトウェアの再利用が一般的に行われている。この際に、従来のモデルベース開発ツールではソフトウェアからのモデルの復元が出来ないため、ソフトウェアとは別にモデル情報を管理しておく必要があったが、ソフトウェアとモデル情報とを別々に管理することは労力が大きい等、種々の問題があった。またソースコード内の各命令とブロック線図の各部分との対応が分かると、ソフトウェアの再利用に便利である。
【０００７】
本発明は、プログラム（ソースコード）からブロック線図への復元を可能にするとともに、ソースコード内の各命令とブロック線図の各部分とを対応づけを可能としたプログラム生成装置およびブロック線図生成装置ならびにこれらの方法を提供する。
【課題を解決するための手段】
【０００８】
本発明の一態様としてのプログラム生成装置は、
入力ブロック要素と、演算ブロック要素と、出力ブロック要素と、前記入力ブロック要素、前記演算ブロック要素および前記出力ブロック要素間のデータの流れを示すデータ線と、前記データ線を分岐する分岐点と、を有するブロック線図を読み出すブロック線図読出手段と、
前記分岐点で前記ブロック線図を入力側および出力側に分割することにより入力側片と１つ以上の出力側片とを生成し、
前記入力側片および前記１つ以上の出力側片において前記分岐点に接続されていたデータ線端に分岐ブロック要素を接続することにより、
前記入力側片および前記１つ以上の出力側片に対応して、複数のブロック線図片を生成するブロック線図分割手段と、
各前記ブロック線図片の処理を実現するプログラム命令をそれぞれ生成するプログラム命令生成手段と、
前記入力側片に対応するプログラム命令が前記出力側片に対応するプログラム命令よりも先に実行されるように、各前記プログラム命令の実行順序を決定する実行順序決定手段と、
前記ブロック線図片毎に前記ブロック線図片の構造情報を生成する構造情報生成手段と、
前記実行順序に従って各前記プログラム命令を配置し、
各前記ブロック線図片の構造情報を各前記プログラム命令に対応するコメント行に記述することにより
プログラムを生成するプログラム生成手段と、を備え、
前記構造情報生成手段は、
各前記ブロック線図片における末尾のブロック要素が木構造の根ノードの子ノードに割り当てられ、
前記根ノードと異なる各親ノードの子ノードには、前記各親ノードに割り当てられたブロック要素の直前の処理を行うブロック要素が割り当てられるように、
各前記ブロック線図片の構造情報を生成する、ことを特徴とする。
【０００９】
本発明の一態様としてのプログラム生成装置は、
入力ブロック要素、演算ブロック要素および出力ブロック要素のうち少なくとも前記入力ブロック要素および前記出力ブロック要素と、
サブシステムブロックと、
入力ブロック要素、演算ブロック要素、出力ブロック要素および前記サブシステムブロックのうち少なくとも前記入力ブロック要素、前記出力ブロック要素および前記サブシステムブロック間のデータの流れを示すデータ線と、
入力サブブロック要素と、演算サブブロック要素と、出力サブブロック要素と、前記入力サブブロック要素、前記演算サブブロック要素および前記出力サブブロック要素間のデータの流れを示すデータ線とを含む、前記サブシステムブロックのサブブロック線図と
を含む多段階層ブロック線図を読み出すブロック線図読出手段と、
前記多段階層ブロック線図における前記サブシステムブロックを前記サブブロック線図に置換し、前記サブシステムブロックの入力に接続されていたデータ線を前記入力サブブロック要素の入力に接続し、前記サブシステムブロックの出力に接続されていたデータ線を前記出力サブブロック要素の出力に接続することにより、単階層ブロック線図を生成する単階層ブロック線図生成手段と、
前記単階層ブロック線図の構造情報を生成する構造情報生成手段と、
前記単階層ブロック線図の処理を実現するプログラム命令を生成するプログラム命令生成手段と、
前記プログラム命令を配置し、
前記プログラム命令に対応するコメント行に前記単階層ブロック線図の構造情報を記述することにより、
プログラムを生成するプログラム生成手段と、を備える。
【００１０】
本発明の一態様としてのブロック線図生成装置は、
各々ブロック識別子を有する、入力ブロック要素と、演算ブロック要素と、出力ブロック要素と、データ線の分岐を表す分岐点ブロック要素とを、根ノードと異なる各ノードに割り当てた木構造のデータを、プログラムのコメント行から読み出すデータ読出手段と、
子ノードに割り当てられたブロック要素から、前記子ノードの親ノードに割り当てられたブロック要素へ向けてデータ線を接続することを、前記根ノードの各子ノードから開始して、前記木構造の各葉ノードまで順次行うことにより、複数のブロック線図片を生成するブロック線図片生成手段と、
各前記ブロック線図片間で同一のブロック識別子を持つ分岐点ブロック要素を統合して前記分岐点を形成することにより各前記ブロック線図片を合成したブロック線図を生成する合成手段と、
を備える。
【００１１】
本発明の一態様としてのブロック線図生成装置は、
入力ブロック要素と、出力ブロック要素と、演算ブロック要素とのうち少なくとも前記入力ブロック要素および出力ブロック要素と、
演算サブブロック要素と、データを受ける第１の入力サブブロック要素と、前記第１の入力サブブロック要素で受けたデータを送出する第２の入力サブブロック要素と、データを受ける第１の出力サブブロック要素と、前記第１の出力サブブロック要素で受けたデータを出力する第２の出力ブロック要素とを、
前記根ノードと異なる前記各ノードに割り当てた木構造のデータをプログラムのコメント行から読み出す木構造読出手段と、
子ノードに割り当てられた要素から、前記子ノードの親ノードに割り当てられた要素へ向けてデータ線により接続することを、各葉ノードを起点として前記根ノードの各子ノードまで順次行うことにより、複数のブロック線図片を生成するブロック線図片生成手段と、
第１および第２の入力サブブロック要素同士を単一の入力サブブロック要素に統合し、第１および第２の出力サブブロック要素同士を単一の出力サブブロック要素に統合することにより、各前記ブロック線図片を合成した単階層ブロック線図を生成する単階層ブロック線図生成手段と、
前記単階層ブロック線図において、前記単一の入力サブブロック要素、前記演算サブブロック要素および前記出力サブブロック要素と、これらの要素間を接続するデータ線とを含むサブブロック線図を特定し、
前記サブブロック線図をサブシステムブロックによって置換し、前記単一の入力サブブロック要素の入力に接続されていたデータ線を前記サブシステムブロックの入力に接続し、前記単一の出力サブブロック要素の出力に接続されていたデータ線を前記サブシステムブロックの出力に接続することによりブロック線図を生成し、
前記サブブロック線図と前記ブロック線図とを含む多段階層ブロック線図を出力する多段階層ブロック線図生成手段と、を備える。
【発明の効果】
【００１２】
本発明により、プログラム（ソースコード）からブロック線図への復元を可能にするとともに、ソースコード内の各命令とブロック線図の各部分とを対応づけが可能となる。
【発明を実施するための最良の形態】
【００１３】
以下、図面を参照しながら、本発明の実施の形態を説明する。
【実施例１】
【００１４】
図1は本発明の一実施形態によるブロック線図−プログラム相互変換システムの構成を示す図である。図1において10はプログラム生成装置の入力となるブロック線図、20はプログラム生成装置、30はプログラム生成装置によって生成されるプログラム（ソースコード）である。ブロック線図生成装置40はプログラム30を入力としてブロック線図10を生成し、生成したブロック線図10を出力する。プログラム生成装置20およびブロック線図生成装置40は例えばパーソナルコンピュータ（PC：Personal Computer）上などで実行される。
【００１５】
以下ではまず図1のブロック線図−プログラム相互変換システムの概要について説明し、その後、本システムの詳細を具体的に説明する。
【００１６】
プログラム生成装置20はブロック線図10から実行順情報22を生成する実行順生成処理部21と、実行順情報22からプログラム30を生成するプログラム生成処理部23からなる。
【００１７】
実行順生成処理部21は、図示しない記憶部からブロック線図（後述する図2参照）を読み出す。すなわち、実行順生成処理部21は、ブロック線図を読み出すブロック線図読出手段を備える。ブロック線図は、入力ブロック要素と、演算ブロック要素と、出力ブロック要素と、入力ブロック要素、演算ブロック要素および出力ブロック要素間のデータの流れを示すデータ線と、データ線を分岐する分岐点と、を有する。入力ブロック要素はブロックの種類ごとに定められた処理を行い、処理された信号を出力するブロック、出力ブロック要素は自身へ入力された信号に対してブロックの種類ごとに定められた処理を行うブロック、演算ブロック要素は、自身へ入力された信号に対してブロックの種類ごとに定められた処理を行い、処理された信号を出力するブロックである。
【００１８】
実行順生成処理部21は、ブロック線図を分岐点で入力側と出力側とに分割することにより入力側片と１つ以上の出力側片とを生成する。たとえば分岐点から出力側への分岐が複数あり、かつこれらの分岐が再度結合しないときは各分岐に応じてそれぞれ出力側片を生成し、再度結合するときは１つの出力側片を生成するようにする。実行順生成処理部21は、入力側片および各出力側片において分岐点に接続されていたデータ線端に分岐ブロック要素を接続することにより、複数のブロック線図片（後述する図5参照）を生成する。本段落で述べた処理は、ブロック線図分割手段の処理に相当し、実行順生成処理部21は、ブロック線図分割手段を備える。
【００１９】
実行順生成処理部21は、ブロック線図片毎にブロック線図片の構造情報を生成する。すなわち実行順生成処理部21は、各ブロック線図片の構造情報をそれぞれ生成する構造情報生成手段を備える。各ブロック線図片の構造情報は、各ブロック線図片における末尾のブロック要素が木構造の根ノードの子ノードに割り当てられ、根ノードと異なる各親ノードの子ノードには、各親ノードに割り当てられたブロック要素の直前の処理を行うブロック要素が割り当てられるように生成される（後述する図6、図11参照）。
【００２０】
実行順生成処理部21は、各ブロック線図片の処理を実現するプログラム命令の実行順序を決定する。より詳細には、上記入力側片に対応するプログラム命令が上記出力側片に対応するプログラム命令よりも先に実行されるように、各プログラム命令の実行順序を決定する。このように実行順生成処理部21は、各プログラム命令の実行順序を決定する実行順序決定手段を備える。
【００２１】
構造情報生成手段により生成された各ブロック線図片の構造情報と、実行順序決定手段により決定された各プログラム命令の実行順序とを併せ持った情報は実行順情報22に相当し、この実行順情報22は実行順生成処理部21の出力となる。実行順情報22の一例を図6に示す。図中左側にあるブロック線図片に対応するプログラム命令ほど先に実行される意味を含んでいる。図6の詳細は後述する。
【００２２】
プログラム生成処理部23は、各ブロック線図片の処理を実現するプログラム命令（後述する図8参照）を生成する。そして、各生成したプログラム命令を実行順序決定手段により決定された実行順序にしたがって配置し、各ブロック線図片の構造情報を各プログラム命令に対応するコメント行に記述することによりプログラム30（後述する図12参照）を生成する。プログラム生成処理部23は、各ブロック線図片の処理を実現するプログラム命令を生成するプログラム命令生成手段と、各生成されたプログラム命令と各ブロック線図片の構造情報とから実行順序に従ってプログラムを生成するプログラム生成手段とを備える。
【００２３】
ブロック線図生成装置40はプログラム30から実行順情報22を抽出する実行順抽出処理部41と、実行順情報22からブロック線図10を生成するブロック線図生成処理部42からなる。
【００２４】
実行順抽出処理部41は、プログラム30のコメント行からブロック線図片の構造情報を読み出す。読み出したブロック線図片の構造情報の集合は木構造を有し、この木構造のデータは実行順情報22に相当する。この木構造では、入力ブロック要素と、演算ブロック要素と、出力ブロック要素と、データ線の分岐を表す分岐点ブロック要素とが、根ノードと異なる各ノードに割り当てられている。実行順抽出処理部41は、プログラム30のコメント行から木構造のデータすなわち実行順情報22を読み出すデータ読出手段を備える。
【００２５】
ブロック線図生成処理部42は、子ノードに割り当てられたブロック要素から、子ノードの親ノードに割り当てられたブロック要素へ向けてデータ線を接続することを、根ノードの各子ノードから、木構造の各葉ノードまで順次行うことにより、複数のブロック線図片を生成する。そして、各ブロック線図片間で同一のブロック識別子を持つ分岐点ブロック要素を統合して分岐点を形成することにより各ブロック線図片を合成したブロック線図を生成する。このようにブロック線図生成処理部42は、上記実行順情報22から複数のブロック線図片を生成するブロック線図片生成手段と、複数のブロック線図片を合成してブロック線図を生成する合成手段とを備える。
【００２６】
以下、図1のブロック線図−プログラム相互変換システムについてさらに詳細に説明する。
【００２７】
図2にブロック線図10の一例101を示す。1001は入力ブロック要素in1、1002、1003は出力ブロック要素out1、out2、1004、1005、1006は演算ブロック要素a、b、cであり、1007〜1010は信号線（本発明のデータ線に相当する）、1011は分岐点である。図中のIn、Out、A、B、Cはブロック要素の種類であり、in1、a、b、c、out1、out2はブロック要素を識別する名前である。ブロック線図101は、入力ブロック要素1001から入力された信号に処理Ａ、処理Bを順に施した信号を出力ブロック1002から出力し、入力ブロック要素1001から入力された信号に処理Ａ、処理Ｃを順に施した信号を出力ブロック1003から出力することを表している。
【００２８】
ブロック線図101をプログラム生成装置20もしくはブロック線図生成装置40内で扱う際のデータ構造の一例102を図3に示す。1101〜1106がブロック要素1001〜1006を表し、1107〜1110が信号線を表す。
【００２９】
ブロック要素は種類属性、名前属性の他に、ブロックの種類毎に定められた属性、およびブロックの持つ入力端子の数等の属性を持つ。ブロックの種類毎に定められた属性としては、定数倍する機能を持つブロックの場合における定数、正弦波を発生する機能を持つブロックの場合における振幅と振動数といったものがある。定数等のブロックの種類毎に定められた属性については実行順情報を生成する際には利用しないためここでは表示していない。また、ブロック線図101では演算ブロック要素及び出力ブロック要素の入力端子はすべて1個(入力ブロック要素の入力端子は0個)であるのでここでは表示していない。入力端子が複数あるブロックを持つブロック線図については実施例2で説明する。
【００３０】
信号線は始点と終点のブロック要素の名前および端子番号を属性として持つが、上述のようにここでは端子番号は省略する。また分岐点は1108、1111a〜1111bのように、始点属性のみを持つ信号線要素と終点属性のみを持つ分岐線要素との組み合わせによって表現する。
【００３１】
ブロック線図101はたとえばデータ構造102を表すテキストファイルの形式でプログラム生成装置20に入力される。データ構造102を表すファイルの一例を図4に示す。
【００３２】
図２のブロック線図101から実行順生成処理部21によって生成されるブロック線図片の集合（実行順情報22）の一例221を図5に示す。2201〜2206はブロック要素1001〜1006に対応するブロック要素である。2221〜2223は分岐点ブロックであり、分岐点1011を入力側と出力側に分割したものである。同一の分岐点から分割された分岐点ブロックであるということは分岐点ブロックの名前属性が同一(a_out)であることから判断可能である。
【００３３】
ブロック線図片の集合221を表す実行順情報のデータ構造の一例222を図６に示す。データ構造の一例222は木構造を有し、根の子要素2220を根とする各部分木が、図５の各ブロック線図片に対応する。データ構造の一例222は、実行順木とも称される。
【００３４】
実行順生成処理部21の処理の概要について、入力をデータ構造102で示されるブロック線図101、出力をデータ構造222で示される実行順情報221とし、図7に示す流れ図を参照して説明する。
【００３５】
実行順生成処理部21においてはデータ構造102の有する各出力ブロック要素に対し、まず実行順木222の根に子要素として出力ブロック要素を追加する処理を行い、次にその出力ブロック要素を現在のブロックとして図7の流れ図に示す処理を行う、ということを繰り返すことにより、実行順情報を生成する。
【００３６】
データ構造102は1102と1103の2つの出力ブロックを有する。そこでまず、out1出力ブロック要素1102をout1出力ブロック要素2202として実行順木222の根の直下に追加し、図7の流れ図の開始2101から処理を行う。out1出力ブロック要素1002を終点とする信号線要素1109は分岐線ではないため、判断2102はNoとなり、判断2107に進む。信号線1109の始点である演算ブロック要素1105は記憶ブロックではないため判断2107はNoとなり判断2109に進む。信号線1109の始点である演算ブロック要素1105は入力ブロックでもないため、判断2109もNoとなり処理2112に進み、out1出力ブロック要素2202の子要素としてブロック要素2205(=ブロック要素1105)を登録する。
【００３７】
次にループ2113の処理を行うが、ブロック線図が入力端子が1個以下のブロック要素のみからなる場合、ループ端2113からループ端2116間の処理は処理2115を1回実行することと等価となる。処理2115では信号線1109の始点である演算ブロック要素1105を現在ブロックとして開始2101から始まる処理を再帰的に呼び出す。
【００３８】
ブロック要素1105を終点とする信号線は分岐線1111aであるため、判断2102はYesとなり処理2103に進む。処理2103で現在ブロック2205の下に分岐点ブロック2222を登録し、判断2104に進む。この際に登録する分岐点ブロックの名前属性の決定法はブロック線図上で該当する信号線に名前がつけられている場合はその名前にする、なければ規則を設定しその規則に従って名前をつけるなどの方法をとることが可能である。ここではブロック線図上でブロックa(ブロック要素1004)の出力に相当する信号であるのでa_outという名前属性を設定することとする。
【００３９】
実行順木の根2200の子要素にa_outという名前属性を持つ分岐点ブロックは存在しないため判断2104はNoとなり、処理2106によって分岐点ブロック2221が登録される。信号線1108の始点である演算ブロック1104は記憶ブロック、入力ブロックのいずれでもないため判断2107、2109はNoとなり、処理2112によってブロック要素2204(=ブロック要素1104)が分岐点ブロック2221の子要素として登録される。
【００４０】
次に処理2115によってブロック要素1104を現在ブロックとして始点2101から始まる処理が再帰的に呼び出される。ブロック要素1104を終点とする信号線1107は分岐線ではないため判断2102はNo、信号線1107の始点である入力ブロック要素1101は記憶ブロックではなく入力ブロックであるので判断2107はNo、判断2109はYesとなり処理2110によって入力ブロック要素2201が2204の子要素として追加され、終了2111によって処理は呼び出し元に戻る。
【００４１】
呼び出し元は2115であり、終了2117によって処理が呼び出し元に戻ることを2回繰り返し出力ブロック要素1002に対する処理は終了する。
【００４２】
データ構造102が有するもう1つの出力ブロック要素である出力ブロック要素1103（1003）に対しても同様に図7の流れ図に従って処理を行うことでブロック要素2203、2206、2223が登録される。ここで処理2103においてブロック要素2223を登録した後の判断2104でa_outという名前を持つ分岐点ブロックが実行順木の根の子要素として存在する(ブロック要素2221)ため、Yesとなり終了2105によって処理が終了となる。
【００４３】
上述のアルゴリズムによって実行順木（実行順情報）を生成する場合、ブロック線図片が生成される順序に関しては、まず2222、2205、2202からなるブロック線図片（図５参照）が生成され、次に2201、2204、2221からなるブロック線図片が生成され、最後に2223、2206、2203からなるブロック線図片が生成される。しかし実際のプログラム30を生成する際には分岐点ブロックの入力側の演算である2201、2204、2221からなるブロック線図片を分岐点ブロックの出力側の演算である残り2つのブロック線図片よりも先に計算するようにする必要がある。そこで、実行順木の根2200の直接の子要素を根とする部分木のうち部分木の根が分岐点ブロックであるものが、葉として同じ名前の分岐点ブロックを持つものよりも先に計算されるというブロック線図片(部分木)間の実行順序の情報を付加する。図６のデータ構造222では先に演算するブロック線図片を左側に書くことでブロック線図片(部分木)間の実行順序を示している。
【００４４】
プログラム生成処理部23の処理についてデータ構造222で表される実行順情報221（図５参照）を入力として説明する。その際に出力されるプログラムの一例301を図8に示す。実行順情報からプログラムを生成する際には各ブロック線図片の最後の要素(実行順木における各部分木の根に相当)がプログラムの1文で代入される(数式表現の場合左辺に相当する)値となり、最後の要素の直前の要素がプログラムの1文で最後に行われる演算となり、各ブロックの入力は直前のブロックの出力となる。図5においてブロック要素2201、2204、2221からなるブロック線図片の場合、ブロック2201の出力がブロック要素2204の入力となり、ブロック要素2204の出力が2221に代入される。これをプログラミング言語で表すと図8の3001となる。
【００４５】
プログラム生成処理部23の処理の一例としてブロック線図片に相当する各部分木に対して図9に示す流れ図の処理を行う方法がある。ブロック要素2201、2204、2221からプログラム3001を生成する手順について図9の流れ図、および図10に示すスタックの内容を参照して説明する。処理2302によって部分木の内容をすべてスタックに格納した状態が2390である。その後、処理2304によって被演算子in1と演算子(関数)Aが取り出され、処理2306によって作成された式が処理2307によって再びスタックに格納された状態が2391である。処理2307の後再びループ2303を実行し、スタックの内容が被演算子のみであるので処理2309によってプログラム命令3001を生成して終了2310によって部分木に対する処理が終了する。
【００４６】
同様にして、ブロック要素2222、2205、2202からなるブロック線図片からプログラム命令3002、ブロック要素2223、2206、2203からなるブロック線図片からプログラム命令3003が生成される。
【００４７】
ここで実行順情報222はたとえば図11に示す実行順情報223のようにテキスト形式で表現することも可能である。また、実行順情報222はプログラムの1文に対応する単位で区切られているため、プログラムの1文毎に実行順情報をテキスト形式でコメントとして付加することが可能となる。図8のプログラム301に図11の実行順情報223をコメントとして挿入したものの例302を図12に示す。尚、ここで行頭の#はプログラム301の記述言語におけるコメント文を示す。プログラム302においては、その他のコメント文と区別するための方法として実行順情報を表すコメント文については#を行頭に2文字続けることで表している。プログラム生成処理部23は、このようにプログラム301に実行順情報223をコメントとして挿入することによりプログラム302（図1のソースコード30に対応）を生成し、出力する。プログラムに対応するコメントはプログラミング言語におけるコメント文を用いて記述する方法以外に、プログラム命令の1文毎に識別情報をプログラミング言語におけるコメント文として付加するようにし、一方、対応する構造情報は同一の識別情報を付加した上、プログラム命令とは別のファイルに保存する方法によって管理することも可能である。
【００４８】
以上プログラム生成装置20について説明した。以下、ブロック線図生成装置40について説明する。
【００４９】
ブロック線図生成装置40にはたとえば図12のプログラム302のような実行順情報を挿入されたプログラムが入力される。
【００５０】
実行順情報抽出部41においてはプログラム302からコメント部を抽出し、実行順情報223（図11参照）のような実行順情報ファイルを生成する。実行順情報抽出部41の処理は例えばプログラム302を1行ずつ読み込み、その中から行頭に#が2文字続いている行だけを出力ファイルに書き込むなどの方法によって実現する。
【００５１】
ブロック線図生成部42では実行順情報223を入力としてブロック線図10を生成する。
【００５２】
ブロック線図生成部42の処理の流れを実行順情報のデータ構造222（図6参照）から図14に示すブロック線図のデータ構造102`への変換を行う例をもとに説明する。ブロック線図生成装置40では入力された実行順情報223の根の子要素すべてに対して順に図13に示す流れ図の処理を行う。
【００５３】
データ構造222の根2200は2221、2202、2203の3つの子要素を有する。
【００５４】
ここではまず、2221から処理を行う。2221は分岐点ブロックかつ実行順木の根2200の子要素であるので分岐点ブロックの入力側となり判断4202はYesとなる。処理4203によって取得される現在のブロックの子要素はブロック要素2204である。現在のブロックと一致する名前(a_out)を持つ信号線はまだ生成されていないため、判断4204はNoとなり処理4206によって信号線1108`が生成される。現在のブロックの子要素であるブロック要素2204は記憶ブロックの出力側ではないため判断4207はNoとなり、処理4218によってブロック要素2204を現在のブロックとして4201から始まる処理を再帰的に呼び出す。ブロック要素2204は演算ブロックであるため判断4202はNoとなり処理4209によってブロック要素2004がブロック要素1104としてデータ構造102`に追加される。ブロック要素2204は演算ブロックであるため判断4210はNoとなりループ4212の処理に進む。ここで実行順情報のデータ構造222上のブロックはすべて子要素が1個以下であるためループ端4212と4222で挟まれるループはすべて1度ずつしか実行されない。子要素が2個以上ある例については実施例2で示す。
【００５５】
ブロック要素2204の子要素は入力ブロック要素2201であるため判断4213はNoとなり処理4219によってブロック要素2201を始点、ブロック要素2204を終点とする信号線1107が生成される。判断4220はNoとなるため入力ブロック要素2201を現在ブロックとして4201からはじまる処理が再び呼び出される。判断4202はNoとなるため処理4209によって入力ブロック要素2201が入力ブロック要素1101としてデータ構造102`に追加される。現在のブロックは入力ブロック要素2201であるため判断4210はYesとなり処理は呼び出し元に戻る。呼び出し元でも終了4223によって処理が終了されることを2度繰り返し、2221に対する処理は終了する。
【００５６】
次にデータ構造の根の子要素2202に対しても図13の流れ図の処理を行う。2202は出力ブロック要素であるため判断4202はNoとなり、処理4209によって出力ブロック要素1102がブロック線図に追加される。判断4210、判断4213のいずれもNoとなるためブロック2202を終点、その子要素2205を始点とする信号線1109がブロック線図に追加される。子要素2205は演算ブロックであるため判断4220はNoとなり処理4218 によってブロック2205を現在のブロックとして4201からはじまる処理が再び呼び出される。ブロック2205は演算ブロックであるため判断4202はNoとなり処理4209によってブロック1105としてブロック線図に追加される。判断4210もNoとなり判断4213に進む。ブロック2205の子要素2222は分岐点でありかつ実行順木の葉であるため分岐点の出力側となり判断4213はYesとなる。子要素の名前a_outと同じ名前を持つ信号線1108`が既に存在するため、判断4214はYesとなり信号線1108`にブロック2205を終点とする分岐線1111aを追加する。処理4217により処理は呼び出し元に戻り、呼び出し元においても終了4223によって処理が終了される。
【００５７】
最後にデータ構造の根の子要素2203に対しても421の処理を行う。要素2203に対する処理の流れは要素2202に対する処理の流れと同様になり、出力ブロック要素1103、信号線1110、演算ブロック要素1106、分岐線1111bの順でブロック線図の要素が生成され、ブロック線図102`が生成される。
【００５８】
本実施例によれば、実行順情報はたとえばプログラムの1文に対応する単位に分割可能であるため、プログラム中に対応する実行順情報をコメントとして挿入することが容易である。このようにプログラム内にコメント文として挿入した実行順情報を利用することで、プログラムからブロック線図を復元することが可能となり、プログラムとモデル情報の一元管理が実現される。つまり、ソフトウェアの再利用の際にソースコード中にコメントとして挿入された実行順情報からモデルを生成し、モデルベースで制御系の再設計を行うことが可能となり、モデル情報を別途管理する必要がなくなる。
【実施例２】
【００５９】
本発明の第2の実施例として図1のブロック線図−プログラム相互変換システムにおいて図15に示すブロック線図103をプログラム生成装置20の入力とした場合の例を示す。ブロック線図103が、図2のブロック線図101と異なる点は入力端子を2個有する演算ブロック1032と、記憶ブロック（記憶演算ブロック）1033を有する点、および信号線（データ線）1037に名前(res)がつけられている点である。記憶ブロックは演算ブロックの一種であるが、ブロックの出力がその瞬間の入力のみでなくブロックの内部状態(一般的にはその瞬間までの過去の入力に依存する)によって決定するため、ブロックの処理が内部状態データの記録および読み出しを含むものである。記憶ブロックの例としては積分器、単位時間遅れ、伝達関数などのブロック要素が挙げられる。
【００６０】
記憶ブロック（記憶演算ブロック）は、（１）接続元のブロックから受けたデータと、当該接続元のブロック要素から過去に受けたデータに基づく記憶データとのうち少なくとも後者を用いて、演算を行うことにより演算データを生成し、当該接続元のブロック要素から受けたデータを少なくとも用いて記憶データを更新し、（２）演算データを接続先のブロック要素に送出する。本実施例では、記憶演算ブロック要素は、（１）の処理を行う第１の演算ブロック要素と、（２）の処理を行う第２の演算ブロック要素とに分割（すなわち入力側と出力側に分割）して扱うことを特徴としている。
【００６１】
ブロック線図103をプログラム生成装置内で扱う際のデータ構造の一例104を図16に示す。
【００６２】
2個の入力端子を有する演算ブロック要素1032を表すブロック要素1132は入力端子数を表すInports属性を有している。なお、入力端子が1つのブロックに関してはInports属性は省略してある。信号線要素、分岐線要素も始点ブロック終点ブロック属性のみでなく始点端子、終点端子属性を有する。分岐点1038と演算ブロック1032の2番目の端子を結ぶ信号線を表す分岐線要素1138bの終点端子は2となる。更に、演算ブロック要素1032はsign属性を有する。演算ブロック要素1032の種類属性はSumであり、Sumブロックの機能はsign属性の符号に応じて各入力端子の値を加減算することである。ブロック要素1032の場合sign属性は+-（プラスマイナス）であり、これは入力端子1の入力から入力端子2の入力を減じた値を出力端子から出力することを意味する。また、信号線1037を表す信号線要素1137は名前属性を有する。
【００６３】
図16のデータ構造104を実施例1に示した実行順生成処理部21に入力した際に出力される実行順情報のデータ構造223を図17に示す。実行順情報はデータ構造104の有する唯一の出力ブロック要素である出力ブロック要素2234をデータ構造223の実行順木の根2230の直下に追加し、ブロック要素2234を現在のブロックとして図7に示した流れ図の処理を行うことによって生成する。処理2103、2106によってブロック2242、2241を生成する処理は実施例1の場合と同様であるが、このとき分岐点要素の名前属性として信号線1137の名前を利用する。次にブロック要素1033は記憶ブロックであるため、処理2108によって2233a、2233bが生成される。演算ブロック2232を生成する処理も実施例1と同様であるが、演算ブロック2232は入力端子を2個有しているためループ端2113と2116に挟まれるループが2回実行され、1周目でブロック2231、2周目でブロック2243が生成される。
【００６４】
実施例1の場合と同様に分岐点前後の依存関係を評価してブロック線図片間の実行順序を決定し、実行順木223を完成する。
【００６５】
実行順情報のデータ構造223をプログラム生成処理部23に入力し、図18に示すプログラム303を生成する。
【００６６】
その際プログラム生成処理部23では記憶ブロックに対しては、記憶ブロックの入力側に値を代入する処理3013と記憶ブロックの出力側の値を参照する処理3011の他に記憶ブロックの出力側の値を更新する処理を生成する必要がある。3014は連続時間系の積分器をEuler法(矩形則)で近似する場合の例である。
【００６７】
積分器をEuler法で近似する場合、
出力変数 = 出力変数 + 入力変数 * サンプリング周期
となるので出力変数に2233a、入力変数に2233bを当てはめ、3014を生成する。尚、3014においてstはサンプリング周期である。
【００６８】
積分器をEuler法ではなくHuen法(台形則)で近似する場合の更新処理は以下の2行で表わされる。
出力 = 入力 * サンプリング周期 / 2 + 状態
状態 = 入力 * サンプリング周期 / 2 + 出力
ここで、状態とは、記憶ブロックの内部演算のために用いる変数である。
【００６９】
また、Huen法(台形則)を用いた積分の近似は以下の2行で表わすことも可能である。
出力 = 出力 + (入力 + 状態) * サンプリング周期 / 2
状態 = 入力
【００７０】
記憶ブロックには積分器の他に遅延要素、伝達関数、離散時間伝達関数等の種類が存在する。
【００７１】
単位時間遅れ(遅延要素)の場合、更新処理は
出力 = 入力
となる。
【００７２】
伝達関数ブロックは伝達関数の次数および近似の方法によって多数の組み合わせが存在するが一例として
【数１】
2009181446.tif 000003
で表わされる1次の伝達関数をEuler法で近似する場合、更新処理は以下の3行で表わされる。
出力 = b0 * 状態1
状態0 = 入力 + a0 * 状態1
状態1 = 状態1 + 状態0 * サンプリング周期
【００７３】
別の例として伝達関数
【数２】
2009181446.tif 000004
で表わされる3次の伝達関数をEuler法で近似する場合、更新処理は以下の5行で表わされる。
出力 = b2 * 状態1 + b1 * 状態2 + b0 * 状態3
状態0 = 入力 + a2 * 状態1 + a1 * 状態2 + a0 * 状態3
状態1 = 状態1 + 状態0 * サンプリング周期
状態2 = 状態2 + 状態1 * サンプリング周期
状態3 = 状態3 + 状態2 * サンプリング周期
【００７４】
また、離散時間伝達関数の一例として伝達関数
【数３】
2009181446.tif 000005
で表わされる2次の伝達関数の更新処理は以下の4行であらわされる。
出力 = b1* 状態1 + b0 * 状態2
状態0 = 入力 + a1 * 状態1 + a0 * 状態2
状態2 = 状態1
状態1 = 状態0
【００７５】
記憶ブロックをプログラムで表す場合、図18のプログラム303のように、記憶ブロックの入力側と出力側を分割し、出力側を更新する処理を別途記述するのが一般的である。これは、記憶ブロックが高次の伝達関数ブロックであったり、連続時間系で表された記憶ブロックのプログラム化の際に高次の近似を用いたりした場合にプログラムが複雑化するのを防止するためである。このように記憶ブロックを入力側と出力側に分割してプログラム化する場合、実行順情報を記憶ブロックの部分で分割することにより、実行順情報とプログラムの1文の対応付けが容易かつ明確になるという効果がある。
【００７６】
一方、図18のプログラム303の例のように記憶ブロックに対して次数の低い処理を用いる場合などは記憶ブロックの入力側と出力側を分割せずに処理を記述することも可能である。記憶ブロックの部分でプログラムを分割しない場合のプログラムの例404を図19に示す。記憶ブロックにおいてプログラムを分割しない場合の実行順情報は図7の流れ図に表す処理において記憶ブロックを一般の演算ブロックに対する処理と同一とすることで生成可能である。
【００７７】
図18のブロック要素3013のように、多入力ブロックを有する実行順情報をプログラムに変換する例を図9の流れ図、および図20に示すスタックの内容を参照して説明する。まず、要素2233b、2232、2231、2243からなる部分木の内容を処理2302によってすべてスタックに格納した状態が2392である。この際演算ブロック2232の処理は演算子“-”で表される。このような処理を実現するためにプログラム生成処理部23ではブロックの種類と演算の内容との対応情報を有している。次に処理2304によって被演算子res、被演算子in1と演算子-が取り出され、処理2306によって作られた式”in1-res”が処理2307によって再びスタックに格納された状態が2393である。最後に処理2307の後再びループ2303を実行し、スタックの内容が被演算子のみであるので処理2309によってプログラム3013を生成して終了2310によって部分木に対する処理が終了する。
【００７８】
記憶ブロックを前後に分割した情報は図17の実行順情報223に保存されている。図13の流れ図には記憶ブロックの入力側と出力側を結合する処理も含まれているため、図17の実行順情報223に対しても図13の流れ図の処理を用いることでブロック線図の生成(復元)が実現される。
【実施例３】
【００７９】
第3の実施例として図１のブロック線図−プログラム相互変換システムにおいて図21に示すブロック線図（多段階層ブロック線図）105を入力とした場合の例を示す。
【００８０】
ブロック線図105が図1のブロック線図101および図15のブロック線図103と異なる点はサブシステムブロック1052を有し、階層化されている点である。サブシステムブロック1052のブロック線図は105bである。
【００８１】
サブシステムブロックのブロック線図は、入力サブブロック要素（サブシステム入力ブロック）と、演算サブブロック要素（サブシステム演算ブロック）と、出力サブブロック要素（サブシステム出力ブロック）と、これらの間のデータの流れを示すデータ線とを含む。
【００８２】
また本実施例での入力となる多段階層ブロック線図は、入力ブロック要素、演算ブロック要素および出力ブロック要素のうち少なくとも入力ブロック要素および出力ブロック要素と、上記サブシステムブロックと、これらの間のデータの流れを示すデータ線と、を含む。
【００８３】
ブロック線図105をプログラム生成装置20内で扱う際のデータ構造の一例106を図22に示す。ここでブロック要素1057は定数を乗じる働きをもつGainブロックであり、ブロック要素1057を表すブロック要素1157が持つGain属性は乗じる定数の値を表す。即ち、ブロック要素1057は入力を5倍した値を出力することを意味する。
【００８４】
階層化されたブロック線図に対してコード生成を行う場合には単階層のブロック線図に変換した後に、実施例1に示した実行順生成処理部21の処理によって実行順情報を生成する。階層化されたブロック線図の単階層への変換は、（１）サブシステム内の演算ブロック要素および信号線（データ線）は名前の先頭にサブシステム名を付加し1階層上位のシステムの演算ブロック要素もしくは信号線とし、（２）サブシステムの入出力ブロックは1階層上位のシステムのサブシステム入力ブロックおよびサブシステム出力ブロックとし、（３）1階層上位のシステム内の信号線のうちサブシステムを始点もしくは終点とするものをサブシステム入力ブロックおよびサブシステム出力ブロックを始点もしくは終点とする、ように変更する処理を階層の段数に応じて繰り返すことによって行う。
【００８５】
データ構造106のサブシステムを単階層のブロック線図に変換したもののデータ構造107を図23に示す。データ構造106に対し、サブシステム内の入力ブロック要素である1156をサブシステム入力ブロック1256、 サブシステム内の出力ポートである1158をサブシステム出力ポート1258として1階層上のブロック線図の要素としている。また、サブシステム内のブロック要素および信号線である1157、1159、1160 の名前属性の先頭にサブシステムブロックの名前(sub1)を付加したものである1257、1259、1260を1階層上のブロック線図の要素としている。また、1階層上のブロック線図の信号線で始点もしくは終点がサブシステムブロックであった1154、1155の始点もしくは終点をサブシステム入力ブロックおよびサブシステム出力ブロックに置き換えた1254、1255としている。これらによってデータ構造107への変換が実現される。
【００８６】
データ構造107に対して実施例1および実施例2で示した実行順生成処理部21およびプログラム生成処理部23の処理を行う。その際にサブシステム入力ブロックとサブシステム出力ブロックの取り扱い方は複数存在する。サブシステム入力ブロックおよびサブシステム出力ブロックをプログラム中に明示する場合の実行順情報224およびプログラム305の例を図24および図25に、サブシステムの入出力ブロックの情報をプログラム中に明示しない場合の実行順情報225およびプログラムの例306を図26および図27に示す。
【００８７】
ここで演算ブロック要素2257は定数の乗算である。そのため、実行順情報からプログラムを生成する際、図9の流れ図の処理2302において、演算ブロック要素2257に対しては、演算子“*”、被演算子の定数（=5）の順で1ブロックに対して2要素をスタックに格納する。
【００８８】
実行順情報224を生成する処理においては、サブシステム入力ブロックおよびサブシステム出力ブロックを実施例2における記憶ブロックと同様に扱い、入力側と出力側に分割し、別のブロック線図片とする(2256aと2256bおよび2258aと2258b)。
【００８９】
すなわちサブシステム入力ブロックを入力側の第１の入力サブブロック要素（あるいは第１のサブシステム入力ブロック）と第２の入力サブブロック要素（あるいは第２のサブシステム出力ブロック）として表しこれらの間で分割する。またサブシステム出力ブロックを入力側の第１の出力サブブロック要素（あるいは第１のサブシステム出力ブロック）と第２の出力サブブロック要素（あるいは第２のサブシステム出力ブロック）とで表しこれらの間で分割する。これによって複数のブロック線図片を生成する。そして、プログラム命令の実行順を決定する際、第１の入力サブブロック要素を含むブロック線図片に対応するプログラム命令が、第２の入力サブブロック要素を含むブロック線図片に対応するプログラム命令よりも先に実行され、第１の出力サブブロック要素を含むブロック線図片に対応するプログラム命令が第２の出力サブブロック要素を含むブロック線図片に対応するプログラム命令よりも先に実行されるように決定する。仮に分岐点が存在する場合は、実施例1で説明した制約（分岐点より入力側に位置するブロック線図片に対応するプログラム命令が分岐点より出力側に位置するブロック線図片に対応するプログラム命令よりも先に実行される）も加えて、実行順を決定する。
【００９０】
プログラム生成処理部23においてはサブシステム入力ブロックおよびサブシステム出力ブロックを分岐点と同様に扱うことで、サブシステム入力ブロックおよびサブシステム出力ブロックが変数(sub_in、 sub_out)としてプログラム305上に保存される。
【００９１】
サブシステムの入出力ブロックの情報をプログラム中に明示しない場合においても実行順情報225にはサブシステム入力ブロックおよびサブシステム出力ブロックの情報は保存するが、サブシステム入力ブロックおよびサブシステム出力ブロックの部分ではプログラムの文を分割しないため、ブロック線図片も分割しない。この場合、実行順生成処理部21においてはサブシステム入力ブロックおよびサブシステム出力ブロックを一般の演算ブロックと同様に扱い、プログラム生成処理部23においてサブシステム入力ブロックおよびサブシステム出力ブロックに対してはプログラムを生成しない(図9の流れ図の処理2302においてサブシステム入力ブロックおよびサブシステム出力ブロックはスタックに格納しない)方法をとる。
【００９２】
実行順情報224、実行順情報225ともにサブシステム入力ブロックおよびサブシステム出力ブロックの情報を保存している。そのため、図13の流れ図の処理を用い、実行順情報224に対する場合はサブシステム入力ブロックおよびサブシステム出力ブロックを記憶ブロックと同様に扱い、実行順情報225に対する場合はサブシステム入力ブロックおよびサブシステム出力ブロックを一般の演算ブロックと同様に扱うことにより、図23に示した単階層化されたブロック線図107を復元することが可能である。
【００９３】
図23の単層化されたデータ構造107から図22の階層化されたデータ構造106への復元を図28の流れ図を参照して説明する。図23のデータ構造107においてサブシステム入力ブロックおよびサブシステム出力ブロックは1256、1258であり、いずれも名前属性の先頭に付加されたサブシステム名はsub1であるので処理4232によって作成されるサブシステム名一覧の要素はsub1のみとなる。従って、処理4234によって図22のデータ構造106上の根1150以下に生成されるサブシステムブロックは1152のみとなる。
【００９４】
図23のデータ構造107に存在するブロック要素(サブシステム入力ブロックおよびサブシステム出力ブロックを除く)は1151、1257、1153である。1151、1153は名前属性にサブシステム名を含まないため、処理4239によってそのまま根1150以下に登録する。1257は名前の先頭に“sub1/”を含むため、処理4238によって“sub1/”を削除し1152以下に1157として登録する。
【００９５】
図23のデータ構造107に存在するサブシステム入力ブロックおよびサブシステム出力ブロックは1256、1258であり、いずれも名前の先頭にサブシステム名は“sub1” 1階層分しか付加されていないため処理4243によって1152以下に1156、1158として登録する。
【００９６】
図23のデータ構造107に存在する信号線要素は1154、1155、1259、1260である。このうち1259、1260は始点ブロック、終点ブロックすべてが同一サブシステム下にある信号線であるため、処理4250によってサブシステム名を削除し、1152以下に1159、1160として登録する。1154、1155に関しては始点ブロック、終点ブロックのいずれか一方がサブシステム“sub1”以下のブロック(サブシステム入力ブロックおよびサブシステム出力ブロック)で、残りの一方が現在のブロック下のブロックである。このため、処理4251によってサブシステム以下のブロックを指している方をサブシステム名に変更し、1154、1155として1150以下に登録する。
【００９７】
図22および図23のデータ構造106、107の表すブロック線図は一階層分のサブシステムしか含まない例であるため、判断4254がNoとなり4256によって処理が終了するが、サブシステムが複数階層の入れ子状になっている場合においても判断4242によってサブシステム入力ブロックおよびサブシステム出力ブロックの処理を区別していることおよび処理4255によって再帰することにより対応可能である。
【００９８】
このようにして図24の実行順情報224もしくは図26の実行順情報225から、階層化されたブロック線図のデータ構造106の生成(復元)が実現される。
【００９９】
本実施例では、階層化されたブロック線図とプログラムとの相互変換について説明した。
【０１００】
本実施例はサブシステムが分岐点や記憶ブロックを持たないものであるが、本実施例で説明した方法はサブシステムのブロック線図が、図2の101または図15の103に示したような、分岐点または記憶ブロックを持つものであっても適用可能である。
【０１０１】
なぜならば、階層化されたブロック線図から単階層ブロック線図を生成する処理、および、単層化されたブロック線図から階層化されたブロック線図を復元する処理においては、サブシステム内の記憶ブロックはブロック要素、サブシステム内の分岐点を持つ信号線は分岐点を持たない信号線と同様に扱うことが可能であり、単階層ブロック線図からプログラムを生成する方法、およびプログラムから単階層のブロック線図を合成する方法は実施例1および実施例2で説明した方法と同一であり、よって、本実施例は、分岐点や記憶ブロックを含むブロック線図にも適用可能であるためである。
【０１０２】
また、本実施例(図21)では最上位システムは入力ブロック、サブシステムブロック、出力ブロックしか有していないが、単階層ブロック線図からプログラムを生成する方法およびプログラムから単階層のブロック線図を合成する方法が実施例1、2で説明した方法と同一であることから、本実施例で説明した方法は最上位システムが分岐点や演算ブロックを含むブロック線図に対しても適用可能である。
【図面の簡単な説明】
【０１０３】
【図１】ブロック線図‐プログラム相互変換システムの構成を示すブロック図
【図２】分岐点を含むブロック線図101
【図３】ブロック線図の計算機上でのデータ構造102を示す図
【図４】プログラム生成装置への入力となるブロック線図情報ファイルを示す図
【図５】実行順情報の一部であるブロック線図片の集合221を示す図
【図６】ブロック線図片の集合のデータ構造222を示す図
【図７】実行順情報生成部の処理の流れ図
【図８】プログラムの一例301を示す図
【図９】プログラム生成処理部の処理の流れ図
【図１０】スタックの内容を示す図
【図１１】実行順情報ファイル223を示す図
【図１２】実行順情報をコメントとして挿入されたプログラム302を示す図
【図１３】ブロック線図生成装置の処理の流れを示す図
【図１４】ブロック線図生成システムによって生成されたブロック線図の計算機上でのデータ構造102`を示す図
【図１５】記憶ブロックおよび多入力ブロックを含むブロック線図103
【図１６】ブロック線図103の計算機上でのデータ構造104を示す図
【図１７】実行順情報のデータ構造223を示す図
【図１８】プログラムの一例303を示す図
【図１９】プログラムの一例304を示す図
【図２０】スタックの内容を示す図
【図２１】サブシステムブロックを含むブロック線図105
【図２２】ブロック線図105の計算機上でのデータ構造106を示す図
【図２３】データ構造106を単階層に変換したデータ構造107を示す図
【図２４】実行順情報224を示す図
【図２５】プログラム例305を示す図
【図２６】実行順情報225を示す図
【図２７】プログラム例306を示す図
【図２８】単層化されたデータ構造107から階層化されたデータ構造106への復元の流れを示す図
【符号の説明】
【０１０４】
10  ブロック線図
20  プログラム生成装置
21  実行順生成処理部
22  実行順情報
23  プログラム生成処理部
30  ソースコード
40  ブロック線図生成装置
41  実行順抽出処理部
42  ブロック線図生成処理部
101  ブロック線図
1001  入力ブロック要素
1002  出力ブロック要素
1003  出力ブロック要素
1004  演算ブロック要素
1005  演算ブロック要素
1006  演算ブロック要素
1007  信号線
1008  信号線
1009  信号線
1010  信号線
1011  分岐点
102  ブロック線図のデータ構造
1101  入力ブロック要素
1102  出力ブロック要素
1103  出力ブロック要素
1104  演算ブロック要素
1105  演算ブロック要素
1106  演算ブロック要素
1107  信号線
1108  信号線
1109  信号線
1110  信号線
1111a  分岐線
1111b  分岐線
221   実行順情報
2200  実行順情報木の根
2201  入力ブロック要素
2202  出力ブロック要素
2203  出力ブロック要素
2204  演算ブロック要素
2205  演算ブロック要素
2206  演算ブロック要素
2221  分岐点ブロック
2222  分岐点ブロック
2223  分岐点ブロック
222  実行順情報
2101  開始
2102  判断
2103  処理
2104  判断
2105  終了
2106  処理
2107  判断
2108  処理
2109  判断
2110  処理
2111  終了
2112  処理
2113  ループ端
2114  処理
2115  処理
2116  ループ端
2117  終了
301  プログラム
3001  プログラム命令
3002  プログラム命令
3003  プログラム命令
2301  開始
2302  処理
2303  ループ端
2304  処理
2305  判断
2306  処理
2307  処理
2308  ループ端
2309  処理
2310  終了
2390  スタックの内容
2391  スタックの内容
223  実行順情報のテキスト表現
302  プログラム
102`  ブロック線図のデータ構造
1108`  信号線
4201  開始
4202  判断
4203  処理
4204  判断
4205  処理
4206  処理
4207  判断
4208  終了
4209  処理
4210  判断
4211  終了
4212  ループ端
4213  判断
4214  判断
4215  処理
4216  処理
4217  終了
4218  処理
4219  処理
4220  判断
4221  終了
4222  ループ端
4223  終了
103  ブロック線図
1031  入力ブロック要素
1032  演算ブロック要素
1033  演算ブロック要素(記憶ブロック)
1034  出力ブロック要素
1035  信号線
1036  信号線
1037  信号線
1038  分岐点
104  ブロック線図のデータ構造
1131  入力ブロック要素
1132  演算ブロック要素
1133  演算ブロック要素(記憶ブロック)
1134  出力ブロック要素
1135  信号線
1136  信号線
1137  信号線
1138a  分岐線
1138b  分岐線
223  実行順情報
2230  実行順情報木の根
2231  入力ブロック要素
2232  演算ブロック要素
2233a  記憶ブロック(出力側)
2233b  記憶ブロック(入力側)
2234  出力ブロック要素
2241  分岐点ブロック(入力側)
2242  分岐点ブロック(出力側)
2243  分岐点ブロック(出力側)
303  プログラム
3011  プログラム命令
3012  プログラム命令
3013  プログラム命令
3014  プログラム命令
304  プログラム
3021  プログラム命令
3022  プログラム命令
2392  スタックの内容
2393  スタックの内容
105  ブロック線図
105b  サブシステムのブロック線図
1051  入力ブロック要素
1052  サブシステムブロック
1053  出力ブロック要素
1054  信号線
1055  信号線
1056  入力ブロック要素
1057  演算ブロック
1058  出力ブロック要素
1059  信号線
1060  信号線
106  ブロック線図のデータ構造
1151  入力ブロック要素
1152  サブシステムブロック
1153  出力ブロック要素
1154  信号線
1155  信号線
1156  入力ブロック要素
1157  演算ブロック要素
1158  出力ブロック要素
1159  信号線
1160  信号線
107  単階層化したブロック線図のデータ構造
1256  サブシステム入力ブロック要素
1257  演算ブロック要素
1258  サブシステム出力ブロック要素
1259  信号線
1260  信号線
224 実行順情報
2251  入力ブロック要素
2253  出力ブロック要素
2256a  サブシステム入力ブロック要素(出力側)
2256b  サブシステム入力ブロック要素(入力側)
2257  演算ブロック要素
2258a  サブシステム出力ブロック要素(出力側)
2258b  サブシステム出力ブロック要素(入力側)
305  プログラム
3031  プログラム
3032  プログラム
3033  プログラム
225  実行順情報
306  プログラム
4231  開始
4232  処理
4233  ループ端
4234  処理
4235  ループ端
4236  ループ端
4237  判断
4238  処理
4239  処理
4240  ループ端
4241  ループ端
4242  判断
4243  処理
4244  処理
4245  ループ端
4246  ループ端
4247  判断
4248  処理
4249  判断
4250  処理
4251  処理
4252  ループ端
4253  ループ端
4254  判断
4255  処理
4256  終了
4257  ループ端
4258  終了
【図１】
2009181446.tif 000006
【図２】
2009181446.tif 000007
【図３】
2009181446.tif 000008
【図４】
2009181446.tif 000009
【図５】
2009181446.tif 000010
【図６】
2009181446.tif 000011
【図７】
2009181446.tif 000012
【図８】
2009181446.tif 000013
【図９】
2009181446.tif 000014
【図１０】
2009181446.tif 000015
【図１１】
2009181446.tif 000016
【図１２】
2009181446.tif 000017
【図１３】
2009181446.tif 000018
【図１４】
2009181446.tif 000019
【図１５】
2009181446.tif 000020
【図１６】
2009181446.tif 000021
【図１７】
2009181446.tif 000022
【図１８】
2009181446.tif 000023
【図１９】
2009181446.tif 000024
【図２０】
2009181446.tif 000025
【図２１】
2009181446.tif 000026
【図２２】
2009181446.tif 000027
【図２３】
2009181446.tif 000028
【図２４】
2009181446.tif 000029
【図２５】
2009181446.tif 000030
【図２６】
2009181446.tif 000031
【図２７】
2009181446.tif 000032
【図２８】
2009181446.tif 000033