(57)【要約】【課題】開発者が、他のタスクや割り込みルーチン等によるグローバル変数の更新を考慮することなくモデルを作成することを可能としたコード生成装置を提供する。【解決手段】コード生成装置として動作するＰＣは、制御モデルにおける関数ブロックのうち、同一グローバル変数の読み出しを行うブロックセットが複数含まれているものを対象に、予め定められた異常パターンに対応する異常ブロック群を検出する（Ｓ６２０）。そして、対応する正常パターンにより、該異常ブロック群を、同様の処理を実現しつつ、グローバル変数の値をローカル変数に退避させるラッチブロックの追加により他のタスク等による該グローバル変数の更新の影響を排除した正常ブロック群に変換し（Ｓ６２５）、該異常ブロック群を正常ブロック群に置き換えた制御モデルから、ソースコードを生成する（Ｓ６４０）。【選択図】図６
2013161219.tif 000002
【特許請求の範囲】
【請求項１】
予め定められた処理手順を示すブロック同士を該ブロック間のデータの入出力を表す結線により繋ぐことでプログラムを記述した制御モデルを読み込む読込手段（Ｓ６０５）と、
前記制御モデルを構成する前記ブロックと前記結線との集まりであるブロック群のうち、当該ブロック群により記述された処理を中断して行われる他の処理により更新される同一のグローバル変数にアクセスする箇所を少なくとも二つ有し、該グローバル変数への前記アクセスの間隙に前記他の処理により該グローバル変数が更新されると、記述された処理に異常をきたすおそれがあるものを異常ブロック群とし、該異常ブロック群をなす前記ブロックと前記結線との組合せのパターン（２００，３００，４００，５００）を登録しているパターン登録手段（２０）と、
前記パターン登録手段に登録されている前記パターンに対応する前記異常ブロック群を、該異常ブロック群と同様の処理を実現しつつ、前記グローバル変数の値を退避させるラッチブロック（２４３，３４２，４４２，５５２）を加えることで前記異常の発生を防止可能となる正常ブロック群に変換するための変換方法（２４０，３４０，４４０，５４０）を登録している変換方法登録手段（２０）と、
前記読込手段により読み込まれた前記制御モデルから、前記パターン登録手段に登録されている前記パターンに対応する前記異常ブロック群を検出する検出手段（Ｓ６１５，Ｓ６２０）と、
前記検出手段により検出された前記異常ブロック群に対応する前記パターンについての前記変換方法により、該異常ブロック群を前記正常ブロック群に変換する変換手段（Ｓ６２５）と、
前記異常ブロック群が、前記変換手段により該異常ブロック群から変換された前記正常ブロック群に置き換えられた前記制御モデルに基づき、ソースコードを生成する生成手段（Ｓ６４０）と、
を備えることを特徴とするコード生成装置。
【請求項２】
請求項１に記載のコード生成装置において、
前記結線により直接的或いは間接的に互いにつなぎ合わされた前記ブロックの集まりをブロックセットとし、
前記パターン登録手段に登録されている前記パターンとは、複数の前記ブロックセットから構成され、これらのうちの少なくとも二つは、同一の前記グローバル変数への前記アクセスがなされるアクセスブロックセットである前記異常ブロック群に対応するものであること、
を特徴とするコード生成装置。
【請求項３】
請求項２に記載のコード生成装置において、
前記制御モデルでは、当該制御モデルを構成する前記各ブロックセットにより記述された処理の優先度が定められており、
前記変換方法登録手段に登録されている前記変換方法とは、前記異常ブロック群を構成する前記ブロックセットの前記優先度と、前記結線により表された該ブロックセットを構成する前記ブロック同士の繋がりとから特定される、該異常ブロック群を構成する前記各ブロックが示す前記処理手順の実行順序を変えることなく、該異常ブロック群を前記正常ブロック群に変換する方法（２４０，３４０，４４０）であること、
を特徴とするコード生成装置。
【請求項４】
請求項２または請求項３に記載のコード生成装置において、
前記制御モデルでは、当該制御モデルを構成する前記各ブロックセットにより記述された処理の優先度が定められており、
前記パターン登録手段に登録されている前記パターンとは、前記アクセスブロックセットではない通常ブロックセットを含む３以上の前記ブロックセットから構成され、前記通常ブロックセットとして、いずれかの前記アクセスブロックセットよりも前記優先度が高く、且つ、他の前記アクセスブロックセットよりも前記優先度が低いものを有する前記異常ブロック群に対応するもの（５００）であること、
を特徴とするコード生成装置。
【請求項５】
請求項１から請求項４のうちのいずれか１項に記載のコード生成装置において、
前記異常ブロック群における前記グローバル変数への前記アクセスとは、該グローバル変数の読み出しであること、
を特徴とするコード生成装置。
【請求項６】
請求項５に記載のコード生成装置において、
前記検出手段は、前記読込手段により読み込まれた前記制御モデルを構成する前記ブロック群の中から、同一の前記グローバル変数への前記アクセスを行う箇所を少なくとも二つ有するものを判別し（Ｓ６１５）、判別した前記ブロック群の中から、前記パターン登録手段に登録されている前記パターンに対応する前記異常ブロック群を検出すること（Ｓ６２０）、
を特徴とするコード生成装置。
【請求項７】
請求項１から請求項６のうちのいずれか１項に記載のコード生成装置において、
前記制御モデルは、マルチタスクの前記プログラムを記述したものであり、
前記パターン登録手段に登録されている前記パターンに対応する前記異常ブロック群により記述された処理とは、一のタスクにおける処理であり、該異常ブロック群により記述された処理を中断して行われる前記他の処理とは、該タスクとは別のタスクにおける処理であること、
を特徴とするコード生成装置。
【請求項８】
請求項１から請求項７のうちのいずれか１項に記載のコード生成装置において、
前記変換手段は、前記読込手段により読み込まれた前記制御モデルを構成する前記異常ブロック群を、該異常ブロック群に対応する前記パターンについての前記変換方法により前記正常ブロック群に変換し、該制御モデルを構成する前記異常ブロック群を該正常ブロックに置き換えた新たな前記制御モデルである変換モデルを生成し、
前記生成手段は、前記変換手段により生成された新たな前記変換モデルに基づき、ソースコードを生成すること、
を特徴とするコード生成装置。
【請求項９】
請求項１から請求項８のうちのいずれか１項に記載のコード生成装置において、
前記異常ブロック群が、前記変換手段により該異常ブロック群から変換された前記正常ブロック群に置き換えられた前記制御モデルについて、シミュレーションを行うシミュレーション手段（Ｓ６３５）をさらに備えること、
を特徴とするコード生成装置。
【請求項１０】
予め定められた処理手順を示すブロック同士を該ブロック間のデータの入出力を表す結線により繋ぐことでプログラムを記述した制御モデルを読み込む読込手段（Ｓ６０５）と、
前記制御モデルを構成する前記ブロックと前記結線との集まりであるブロック群のうち、当該ブロック群により記述された処理を中断して行われる他の処理により更新される同一のグローバル変数にアクセスする箇所を少なくとも二つ有し、該グローバル変数への前記アクセスの間隙に前記他の処理により該グローバル変数が更新されると、記述された処理に異常をきたすおそれがあるものを異常ブロック群とし、該異常ブロック群をなす前記ブロックと前記結線との組合せのパターン（２００，３００，４００，５００）を記憶媒体から読み出すパターン読出し手段（Ｓ６２０）と、
前記パターンに対応する前記異常ブロック群を、該異常ブロック群と同様の処理を実現しつつ、前記グローバル変数の値を退避させるラッチブロック（２４３，３４２，４４２，５５２）を加えることで前記異常の発生を防止可能となる正常ブロック群に変換するための変換方法（２４０，３４０，４４０，５４０）を記憶媒体から読み出す変換方法読出し手段（Ｓ６２５）と、
前記読込手段により読み込まれた前記制御モデルから、前記パターン読出し手段により読み出された前記パターンに対応する前記異常ブロック群を検出する検出手段（Ｓ６１５，Ｓ６２０）と、
前記変換方法読出し手段により読み出された、前記検出手段により検出された前記異常ブロック群に対応する前記パターンについての前記変換方法により、該異常ブロック群を前記正常ブロック群に変換する変換手段（Ｓ６２５）と、
前記異常ブロック群が、前記変換手段により該異常ブロック群から変換された前記正常ブロック群に置き換えられた前記制御モデルに基づき、ソースコードを生成する生成手段（Ｓ６４０）と、
してコンピュータを動作させることを特徴とするコード生成プログラム（１００）。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、モデルに基づきソースコードを生成するコード生成装置等に関する。
【背景技術】
【０００２】
従来、例えば車両のエンジンＥＣＵのプログラムの開発においては、開発者が直接ソースコードを記述せず、目的とするプログラムの機能を、より作成が簡易で視認性の良い「モデル」という形態で記述する場合がある。開発者は、このモデルに対応したプログラム開発環境がインストールされたワークステーション，パーソナルコンピュータ等を用い、そのモデルにて定義された演算処理等のシミュレーションを行うと共に、該モデルからソースコードを自動生成する。
【０００３】
このようにしてモデルに基づきソースコードを自動生成するプログラム開発は、モデルベース開発と呼ばれており、モデルベース開発を行うためのプログラム開発環境としてＭａｔｌａｂ（登録商標）が知られている。Ｍａｔｌａｂ（登録商標）においては、開発者は、当該プログラム開発環境の付加機能を提供するＳｉｍｕｌｉｎｋ（登録商標）を用いてモデルを記述する。
【０００４】
そして、Ｓｉｍｕｌｉｎｋ（登録商標）においては、モデルは、各種演算やファイルからのデータの読み出し等を行う機能単位であるブロックや、ブロック間のデータの入出力を示す結線等の組合せとして記述される。すなわち、複数のブロックが結線によってつなぎ合わされることにより、エンジン制御におけるデータの入出力や、各種演算処理等を表現する集合体がモデルである。
【０００５】
特許文献１には、このようなモデルベース開発に用いられるソースコードの生成装置について記載されている。特許文献１に記載のコード生成装置によれば、複数の種別（例えば、装置の仕向け地や機種等）の機能が記述された一つのモデルから特定の種別に対応するソースコードを生成する際、対応しない種別についての機能の記述がモデルから除去される。これにより、不要なソースコードが生成されることを防ぐことができ、ＲＯＭ容量の小さいソースコードを生成することが可能となる。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２００４−２２７５００号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
ところで、プログラムでは、当該プログラム全域でアクセス可能なグローバル変数が用いられる場合があるが、グローバル変数に基づく処理の途中で優先度のより高い他のタスクや割込みルーチンにより該グローバル変数が更新されると、異常をきたす場合ある。このため、従来のコード生成装置では、グローバル変数の値がレジスタやスタック領域等に退避されるようにソースコードが生成され、他のタスク等によるグローバル変数の更新の影響を排除する処置が施されていた。
【０００８】
これに対し、例えば、一のタスクが複数のブロックセット（結線により直接的或いは間接的につなぎ合わされたブロックの集まり）により記述され、２以上のブロックセットで同一のグローバル変数が読み出される場合等が想定される。このような場合には、上記処置により、グローバル変数を読み出す個々のブロックセットに対応する処理の実行期間にわたり上記影響を排除できたとしても、これらのブロックセットに対応する一連の処理の実行期間にわたり、断続的に上記影響を排除することはできなかった。
【０００９】
このため、タスク内の同一グローバル変数への複数の読み出し箇所で該グローバル変数の一致性が保証されず、これにより異常をきたす場合があり、開発者は、モデルを作成する際にグローバル変数をローカル変数に退避させる等の措置を講ずる必要があった。
【００１０】
本願発明は上記課題に鑑みてなされたものであり、開発者が、他のタスクや割り込みルーチン等によるグローバル変数の更新を考慮することなくモデルを作成することを可能としたコード生成装置等を提供することを目的とする。
【課題を解決するための手段】
【００１１】
上記課題に鑑みてなされた請求項１に記載のコード生成装置は、予め定められた処理手順を示すブロック同士を該ブロック間のデータの入出力を表す結線により繋ぐことでプログラムを記述した制御モデルを読み込む読込手段と、制御モデルを構成するブロックと結線との集まりであるブロック群のうち、当該ブロック群により記述された処理を中断して行われる他の処理により更新される同一のグローバル変数にアクセスする箇所を少なくとも二つ有し、該グローバル変数へのアクセスの間隙に他の処理により該グローバル変数が更新されると、記述された処理に異常をきたすおそれがあるものを異常ブロック群とし、該異常ブロック群をなすブロックと結線との組合せのパターンを登録しているパターン登録手段と、を備える。
【００１２】
また、パターン登録手段に登録されているパターンに対応する異常ブロック群を、該異常ブロック群と同様の処理を実現しつつ、グローバル変数の値を退避させるラッチブロックを加えることで異常の発生を防止可能となる正常ブロック群に変換するための変換方法を登録している変換方法登録手段と、読込手段により読み込まれた制御モデルから、パターン登録手段に登録されているパターンに対応する異常ブロック群を検出する検出手段と、を備える。
【００１３】
また、検出手段により検出された異常ブロック群に対応するパターンについての変換方法により、該異常ブロック群を正常ブロック群に変換する変換手段と、異常ブロック群が、変換手段により該異常ブロック群から変換された正常ブロック群に置き換えられた制御モデルに基づき、ソースコードを生成する生成手段と、を備える。
【００１４】
例えば、マルチタスクのプログラムにて、同一タスクの２箇所以上で同一グローバル変数の読み出しが行われる場合や、マルチタスクでないプログラムにて、所定条件の成立によりコールされる関数内の２箇所以上で同一グローバル変数の読み出しが行われる場合等が想定される。このような場合には、グローバル変数の値をローカル変数に退避させ、グローバル変数に替えてローカル変数の値を読み出すようプログラムを改変することで、他のタスクや割り込みルーチン等によるグローバル変数の更新の影響を排除することができる。
【００１５】
これに対し、請求項１に記載のコード生成装置は、読み込まれた制御モデルから、２箇所以上で同一グローバル変数にアクセスする異常ブロック群を検出することができる。そして、検出した異常ブロック群を、同様の処理を実現しつつ、グローバル変数の値をローカル変数に退避させるラッチブロックの追加により優先度のより高い他の処理によるグローバル変数の更新の影響を排除した正常ブロック群に変換する。さらに、コード生成装置は、異常ブロック群を正常ブロック群に置き換えた制御モデルからソースコードを生成する。
【００１６】
すなわち、仮に制御モデルに異常ブロック群が含まれていたとしても、該制御モデルから生成されるソースコードでは、該異常ブロック群により記述された処理は、グローバル変数の値が退避されたローカル変数にアクセスする処理に改変される。このため、他のタスク等によりグローバル変数が更新されたとしても、該グローバル変数にアクセスする異常ブロック群により記述された処理を正常に実行することができ、該処理への影響を防ぐことができる。
【００１７】
したがって、開発者は、他のタスクや割り込みルーチン等によるグローバル変数の更新を考慮することなく制御モデルを作成することが可能となり、制御モデルの作成を容易化することができる。
【００１８】
また、従来は、開発者が制御モデルを作成する段階で異常ブロックを正常ブロックに書き換えることが必要であったが、これを行うためには、ラッチブロックという実現される処理とは直接関係無いブロックを設ける必要があり、これにより制御モデルが複雑化してしまうという問題があった。
【００１９】
これに対し、請求項１に記載のコード生成装置を用いた場合には、開発者が異常ブロックを正常ブロックに書き換える必要が無くなるため、制御モデルの複雑化を抑えることができ、よりわかり易い制御モデルの作成が可能となる。
【００２０】
また、タスク等が複数のブロックセットにより記述される場合が想定される。
そこで、請求項２に記載のコード生成装置では、結線により直接的或いは間接的に互いにつなぎ合わされたブロックの集まりをブロックセットとし、パターン登録手段に登録されているパターンとは、複数のブロックセットから構成され、これらのうちの少なくとも二つは、同一のグローバル変数へのアクセスがなされるアクセスブロックセットである異常ブロック群に対応する。
【００２１】
こうすることにより、タスク等が複数のブロックセットにより構成され、２以上のブロックセットで同一のグローバル変数にアクセスされる場合であっても、該グローバル変数に基づき行われる一連の処理の実行期間にわたり、他のタスク等による該グローバル変数の更新の影響を排除することができる。
【００２２】
また、同一のグローバル変数が２箇所以上で読み出されるブロック群では、該グローバル変数の読み出しタイミングの間隙に、他のタスク等により該グローバル変数が更新される場合がある。このような場合には、先に読み出されたグローバル変数の値に基づく処理と、後に読み出されたグローバル変数の値に基づく処理との間に不整合が生じ、異常が発生するおそれがある。
【００２３】
そこで、請求項５に記載のコード生成装置は、異常ブロック群におけるグローバル変数へのアクセスとは、該グローバル変数の読み出しであることを特徴とする。
このような構成によれば、同一のグローバル変数が２箇所以上で読み出されるブロック群を異常ブロック群として検出し、正常ブロック群に変換することが可能となり、他のタスク等によるグローバル変数の更新の影響を排除することができる。
【図面の簡単な説明】
【００２４】
【図１】コード生成装置をなすＰＣや、ＰＣにインストールされたコード生成ツールの構成を示すブロック図である。
【図２】第１異常パターン，第１正常パターンについての説明図である。
【図３】第２異常パターン，第２正常パターンについての説明図である。
【図４】第３異常パターン，第３正常パターンについての説明図である。
【図５】第４異常パターン，第４正常パターンについての説明図である。
【図６】コード生成処理についてのフローチャートである。
【発明を実施するための形態】
【００２５】
以下、本発明の実施形態について図面を用いて説明する。なお、本発明の実施の形態は、下記の実施形態に何ら限定されることはなく、本発明の技術的範囲に属する限り種々の形態を採りうる。
【００２６】
［構成の説明］
図１（ａ）には、本実施形態におけるコード生成装置として作動する周知のパーソナルコンピュータ（ＰＣ）１の構成を示すブロック図が記載されている。このＰＣ１は、ディスプレイ１０，ＨＤＤ（ハードディスクドライブ）２０，ＣＰＵ（演算装置）３０，ＲＯＭ４０，ＲＡＭ５０，入力装置６０等を備える。
【００２７】
ディスプレイ１０は、ＣＰＵ３０から受けた映像信号を、ユーザに対して映像として表示する。
入力装置６０は、キーボード、マウス等から構成され、ユーザが操作することにより、その操作に応じた信号をＣＰＵ３０に出力する。
【００２８】
ＲＡＭ５０は読み出し、書き込み可能な揮発性メモリであり、ＲＯＭ４０は読み出し専用の不揮発性メモリであり、ＨＤＤ２０は読み出し、書き込み可能な不揮発性メモリである。ＲＯＭ４０、ＨＤＤ２０には、ＣＰＵ３０が読み出して実行するプログラム等が予め記憶されている。
【００２９】
ＲＡＭ５０は、ＣＰＵ３０がＲＯＭ４０，ＨＤＤ２０に記憶されたプログラムを実行する際に、そのプログラムを一時的に保存するための記憶領域、及び作業用のデータを一時的に保存するための記憶領域として用いられる。
【００３０】
ＣＰＵ３０は、オペレーティングシステム（ＯＳ）をＨＤＤ２０から読み出して実行し、ＨＤＤ２０に記録されている各種プログラムをＯＳ上のプロセスとして実行する。また、このプロセスにおいて、ＣＰＵ３０は必要に応じて入力装置６０から信号の入力を受け付け、ディスプレイ１０に映像信号を出力し、ＲＡＭ５０，ＨＤＤ２０に対してデータの読み出し／書き込みの制御を行う。
【００３１】
次に、ＰＣ１にインストールされている本実施形態のコード生成ツール１００について、図１（ｂ）に記載のブロック図を用いて説明する。コード生成ツール１００は、ＨＤＤ２０に保存され、ＯＳ上のプロセスとして実行されるアプリケーションの１つであり、ＰＣ１は、コード生成ツール１００を動作させることで、モデルベース開発を行うためのコード生成装置として稼動する。なお、このコード生成装置は、車載装置等といった組み込みシステム向けのプログラム開発に用いられることが考えられるが、これに限定されることは無く、あらゆる用途のプログラム開発に用いることができる。
【００３２】
コード生成ツール１００は、入力装置６０（キーボード６１，マウス６２）の操作によって起動し、その後ユーザの入力装置６０の操作に基づいて作成された制御モデル１５０や、該操作により設定された詳細条件１５１からソースコードを生成する。
【００３３】
ソースコードとは、例えばＣ＋＋等のプログラミング言語の仕様に則ってプログラム開発者が作成するプログラムの一表現形態である。ソースコードはコンパイラ、リンカ等に入力されることで、ＣＰＵ等が直接実行できるオブジェクトコードに変換される。なお、オブジェクトコードもプログラムの一表現形態である。
【００３４】
また、制御モデル１５０とは、ソースコードよりも記述が簡易になり、かつ人による可読性を高くする目的で定められたモデル言語仕様に基づいて作成されるプログラムの一表現形態である。制御モデルとしては、例えばＳｉｍｕｌｉｎｋ（登録商標）によって作成されるＳｉｍｕｌｉｎｋモデルがある。Ｓｉｍｕｌｉｎｋ（登録商標）モデルが、Ｍａｔｌａｂ（登録商標）上で動作するＲｅａｌ  Ｔｉｍｅ  Ｗｏｒｋｓｈｏｐ（登録商標：以下ＲＴＷと記す）に入力されることにより、このＲＴＷが当該Ｓｉｍｕｌｉｎｋ（登録商標）モデルに対応するソースコードを生成する。
【００３５】
Ｓｉｍｕｌｉｎｋ（登録商標）モデルは、特定の処理手順を示すブロックと呼ばれる機能単位の組合せとして記述され、モデルを構成するブロックは、ブロック間のデータの入出力、及び、対応する処理手順の順序を示す結線により繋ぎ合わされている。
【００３６】
また、複数のブロックの集合体を、関数ブロックというブロックの一種として定義することもできる。この関数ブロックは、プログラミングにおける関数に相当し、ブロックの中にブロックが含まれるような入れ子構造のブロックの作成も許されており、関数ブロックを有する制御モデルに基づき生成されたソースコードでは、関数ブロックでの処理はサブルーチンとして記述される。
【００３７】
また、Ｓｉｍｕｌｉｎｋ（登録商標）モデル中の各ブロックは、それぞれ属性情報を有することができる。属性情報としては、例えば当該ブロックの名称、入出力するデータの型や値域定義等がある（なお、図２（ｂ）では、属性情報等を詳細条件１５１として表している）。
【００３８】
本実施形態における制御モデル１５０も、Ｓｉｍｕｌｉｎｋ（登録商標）モデルと同様にブロックから成り、関数ブロックの記述やブロックの入れ子構造が許され、各ブロックが属性情報を有することができる。
【００３９】
また、本実施形態のコード生成ツール１００では、制御モデル１５０等からソースコードを生成することに加え、制御モデル１５０の一部を改変する機能を有している。
すなわち、制御モデル１５０では、グローバル変数（プログラム全域でアクセス可能な変数）が用いられる場合があるが、グローバル変数を読み出して行われる処理の途中で他のタスクや割り込みルーチン等により該グローバル変数が更新されると、異常をきたすおそれがある。
【００４０】
これに対し、従来のコード生成ツールでは、グローバル変数の値がレジスタやスタック領域等に退避されるようにソースコードが生成され、このような処置により、グローバル変数の個々の読み出し箇所では、他のタスク等による更新の影響を排除することができた（本実施形態のコード生成ツール１００も、この点においては従来のものと同様となっている）。しかしながら、例えば、タスクが複数のブロックセットから構成され、複数のブロックセットにて同一のグローバル変数が読み出される場合等が想定される。このような場合には、上記処置を施したとしても、これらのブロックセットに対応する一連の処理の実行期間にわたり、断続的に上記影響を排除することはできなかった。
【００４１】
なお、ブロックセットとは、結線により直接的或いは間接的に互いに繋ぎ合わされたブロックの集まりである。このブロックセットを構成する各ブロックは、全ての他のブロックに対し、他のブロックから出力されたデータが当該ブロックの処理手順に影響を及ぼすか、或いは、当該ブロックから出力されたデータが該他のブロックの処理手順に影響を及ぼす関係にある。
【００４２】
これに対し、本実施形態のコード生成ツール１００は、制御モデル１５０に含まれるブロック群（ブロックセットの集まり）から、他のタスク等によるグローバル変数の更新により異常をきたすおそれがある異常ブロック群を検出する検出部１０１を有する。さらに、検出部１０１により検出された異常ブロック群を書き換える変換部１０２を有し、他のタスク等によるグローバル変数の更新の影響を排除する構成となっている。
【００４３】
［動作の説明］
次に、本実施形態のコード生成ツール１００の動作について、上述した制御モデル１５０の改変機能を中心に説明する。
【００４４】
コード生成ツール１００は、異常ブロック群の類型である異常パターンを示す異常パターンデータを有しており、この異常パターンに基づき、制御モデル１５０に含まれている異常ブロック群を検出する。
【００４５】
さらに、コード生成ツール１００は、各異常パターンに対応する異常ブロック群を、同様の処理を実現可能としつつ、他のタスク等によるグローバル変数の更新の影響を排除することができる正常ブロック群に変換する変換方法を示す変換方法データを有している。そして、検出した異常ブロック群を、対応する異常パターンについての変換方法に従い正常ブロック群に変換し、異常ブロック群を正常ブロック群に置き換えた状態で、制御モデルからソースコードを生成する。
【００４６】
なお、異常パターンデータや変換方法データは、コード生成ツール１００の一部を構成しており、これらのデータは、コード生成ツール１００がインストールされているＰＣ１のＨＤＤ２０に保存されていることは、言うまでも無い。
【００４７】
図２（ａ）〜５（ａ）には、一例として、第１〜４異常パターン２００，３００，４００，５００が記載されている。各異常パターンは、複数のブロックセットのパターン（ブロックセットパターン）の組合せとして構成されており、これらのブロックセットのうちの少なくとも二つは、同一のグローバル変数の読み出しを行うブロックを有するアクセスブロックセットをなしている。
【００４８】
また、図２（ｂ）〜５（ｂ）には、第１〜４異常パターン２００，３００，４００，５００に対応する異常ブロック群から変換される正常ブロック群の類型である第１〜４正常パターン２４０，３４０，４４０，５４０が記載されている。これらの正常パターンを示す各データは、それぞれ、変換方法データとして第１〜４異常パターン２００〜５００に対応付けられており、各異常パターンに対応する異常ブロック群は、対応する変換方法データに基づき正常ブロック群に変換される。
【００４９】
また、これらの正常パターンは、１または複数のブロックセットパターンの組合せとして構成されており、少なくとも一つのブロックセットパターンは、アクセスブロックセットで読み出されるグローバル変数をローカル変数に保存するラッチブロックを有するものとなっている。なお、ローカル変数とは、正常パターンに対応する正常ブロック群により記述された処理が実行される際に、レジスタやスタック領域に一時的に割り当てられるテンポラリ変数であっても良い。また、ＲＡＭに静的に割り当てられ、正常ブロック群に対応するタスク等で局所的にアクセス可能な変数であっても良い。
【００５０】
なお、図２〜５における処理Ａ，Ｂのブロックは、どのような処理手順に対応するブロックであっても良く、関数ブロックであっても良いし、ブロックセットとして構成されていても良い。また、各パターンにおけるグローバル変数Ｘ，Ｙは、任意のグローバル変数を示す。
【００５１】
また、ブロックセットパターンには、処理優先度Ａ１〜Ａ３，Ｂ１，Ｂ２のいずれかが設定されており、Ａ１〜Ａ３とＢ１，Ｂ２は、それぞれ、Ａ１＞Ａ２＞Ａ３，Ｂ１＞Ｂ２という処理優先度の大小関係を満たす任意の値となっている。そして、ソースコード上では、処理優先度の高いブロックセットから順に対応する処理が記述される。
【００５２】
次に、具体例として挙げた第１〜４異常パターン２００〜５００と、対応する第１〜４正常パターン２４０〜５４０について詳しく説明する。
図２（ａ）に記載の第１異常パターン２００は、処理優先度Ａ１，Ａ２のブロックセットパターン２１０，２２０から構成されている。
【００５３】
このブロックセットパターン２１０は、ブロック２１１，２１３，２１５と、矢印として記載された結線２１２，２１４から構成されており、ブロック２１１は、グローバル変数Ｘから値を読み出して出力値とする。また、ブロック２１３は、ブロック２１１の出力値を入力（引数）として処理Ａを実行すると共に、実行結果（返り値）を出力値とし、ブロック２１５は、ブロック２１３の出力値をグローバル変数Ｘに書き込む。なお、各結線は、当該結線が示す矢印の根元にあるブロックの出力値を、該矢印の先にあるブロックの入力値とすることを示している。
【００５４】
また、ブロックセットパターン２２０は、ブロック２２１，２２３と、結線２２２から構成されており、ブロック２２１は、グローバル変数Ｘから値を読み出して出力値とし、ブロック２２３は、ブロック２２１の出力値を入力（引数）として処理Ｂを実行する。
【００５５】
なお、図２（ａ）には、コード生成ツール１００により、第１異常パターン２００に対応する異常ブロック群に基づき生成されたソースコード２３０の一例が記載されている。このソースコード２３０では、グローバル変数Ｘは変数ｇ＿ｖａｒｉとして表され、ブロックセットパターン２１０で記述された処理を表すステップ２３１と、ブロックセットパターン２２０で記述された処理を表すステップ２３２から構成される関数が記述されている。
【００５６】
このソースコード２３０から、ステップ２３１の処理とステップ２３２の処理の間隙に、他のタスク等により変数ｇ＿ｖａｒｉが更新されると、関数ｆｕｎｃ＿ｓｕｂ＿Ａ（処理Ａ）の実行結果が関数ｆｕｎｃ＿ｓｕｂ＿Ｂ（処理Ｂ）に正常に反映されず、異常が発生する場合があることがわかる。
【００５７】
そして、コード生成ツール１００では、第１異常パターン２００に対応する異常ブロック群がこれに対応する変換方法データに基づき変換され、第１正常パターン２４０に対応する正常ブロック群が生成される（図２（ｂ））。
【００５８】
この第１正常パターン２４０は、処理優先度Ｂ１のブロックセットパターン２４０として構成されており、第１異常パターン２００におけるブロック２１１，２１３，２１５，２２３と、入力値（処理Ａの実行結果）をローカル変数に保存すると共に、該値を出力値とするラッチブロック２４３から構成されている。
【００５９】
また、図３（ａ）に記載の第２異常パターン３００は、処理優先度Ａ１，Ａ２のブロックセットパターン３１０，３２０から構成されている。このブロックセットパターン３１０，３２０は、第１異常パターン２００におけるブロックセットパターン２２０，２１０と同様の構成を有している。
【００６０】
さらに、図３（ａ）には、第２異常パターン３００に対応する異常ブロック群に基づき生成されたソースコード３３０の一例が記載されている。このソースコード３３０では、グローバル変数Ｘは変数ｇ＿ｖａｒｉとして表され、ブロックセットパターン３１０で記述された処理を表すステップ３３１と、ブロックセットパターン３２０で記述された処理を表すステップ３３２から構成される関数が記述されている。
【００６１】
なお、ソースコード３３０からも、ステップ３３１の処理とステップ３３２の処理の間隙に他のタスク等により変数ｇ＿ｖａｒｉが更新されると、同様の異常が発生する場合があることがわかる。
【００６２】
そして、コード生成ツール１００では、第２異常パターン３００に対応する異常ブロック群がこれに対応する変換方法データに基づき変換され、第２正常パターン３４０に対応する正常ブロック群が生成される（図３（ｂ））。
【００６３】
この第２正常パターン３４０は、処理優先度Ｂ１のブロックセットパターン３４０として構成されており、第２異常パターン３００におけるブロック３１１，３１３，３２３，３２５と、入力値（グローバル変数Ｘの値）をローカル変数に保存すると共に、該値を出力値とするラッチブロック３４２から構成されている。
【００６４】
また、図４（ａ）に記載の第３異常パターン４００は、第２異常パターン３００におけるブロックセット３１０，３２０と同様のブロックセット４１０，４２０から構成されているが、これらのブロックセットの処理優先度として、共にＡ１が設定されている。
【００６５】
さらに、図４（ａ）には、第３異常パターン４００に対応する異常ブロック群に基づき生成されたソースコード４３０の一例が記載されており、このソースコード４３０は、第２異常パターン３００に基づき生成されたソースコード３３０と同一となっている。
【００６６】
そして、コード生成ツール１００では、第３異常パターン４００に対応する異常ブロック群がこれに対応する変換方法データに基づき変換され、第３正常パターン４４０に対応する正常ブロック群が生成される（図４（ｂ））。この第３正常パターン４４０は、第２正常パターン３４０と同一となっている。
【００６７】
また、図５（ａ）に記載の第４異常パターン５００は、処理優先度Ａ１〜Ａ３のブロックセットパターン５１０〜５３０から構成されている。
このブロックセットパターン５１０は、第１異常パターン２００におけるブロックセットパターン２２０等と同様の構成を有している。
【００６８】
また、ブロックセットパターン５３０は、ブロック５３１，５３３，５３５，５３７と、結線５３２，５３４，５３６から構成されており、ブロック５３１は、グローバル変数Ｘから値を読み出して出力値とする。また、ブロック５３３は、ローカル変数ｔｍｐから値（処理Ｂの実行結果）を読み出して出力値とすると共に、ブロック５３１の出力値（グローバル変数Ｘの値）を出力値とする。また、ブロック５３５は、ブロック５３３の二つの出力値を加算してグローバル変数Ｘの更新値とすると共に、該更新値を出力値とし、ブロック５３７は、ブロック５３５の出力値をグローバル変数Ｘに書き込む。
【００６９】
一方、ブロックセットパターン５２０は、ブロックセットパターン５１０，５３０にて読み出されるグローバル変数の読み出しが行われない通常ブロックセットに対応するものとなっている。このブロックセットパターン５２０は、ブロック５２１，５２３，５２５と、結線５２２，５２４から構成されており、ブロック５２１は、グローバル変数Ｙから値を読み出して出力値とする。また、ブロック５２３は、ブロック５２１の出力値を入力（引数）として処理Ｂを実行すると共に、実行結果を出力値とし、ブロック５２５は、ブロック５２３の出力値をローカル変数ｔｍｐに書き込む。
【００７０】
そして、コード生成ツール１００では、第４異常パターン５００に対応する異常ブロック群がこれに対応する変換方法データに基づき変換され、第４正常パターン５４０に対応する正常ブロック群が生成される（図５（ｂ））。
【００７１】
この第４正常パターン５４０は、処理優先度Ｂ１のブロックセットパターン５２０ａと、処理優先度Ｂ２のブロックセットパターン５５０とから構成されており、ブロックセットパターン５２０ａは、第４異常パターン５００におけるブロックセットパターン５２０と同様に構成されている。
【００７２】
また、ブロックセットパターン５５０は、第４正常パターン５４０におけるブロック５１１，５１３，５３３，５３５，５３７と、入力値（グローバル変数Ｘの値）をローカル変数に保存すると共に、該値を出力値とするラッチブロック５５２から構成されている。
【００７３】
図２（ｂ）〜５（ｂ）に記載されているように、第１〜４正常パターン２４０〜５４０に対応する正常ブロック群では、それぞれ、第１〜４異常パターン２００〜５００に対応する異常ブロック群と同様の処理が実現される。また、これらの正常ブロック群では、グローバル変数Ｘの値（或いは、グローバル変数に保存される値）をローカル変数に保存するラッチブロックが新たに加えられているため、他のタスク等によるグローバル変数Ｘの更新により異常が発生することは無い。
【００７４】
なお、図２（ｂ）〜４（ｂ）には、コード生成ツール１００により、第１〜３正常パターン２４０〜４４０に対応する正常ブロック群に基づき生成されたソースコード２５０〜４５０が記載されている。これらのソースコードから、各異常パターンに対応する変換方法の適用により、対応する異常ブロック群と同様の処理を実現可能としつつ、他のタスク等によるグローバル変数Ｘの更新の影響が排除されることがわかる。
【００７５】
また、第１〜３異常パターン２００〜４００に対応する異常ブロック群は、該異常ブロック群を構成する各ブロックが示す処理手順の実行順序を維持したまま、正常ブロック群に変換される。このことは、異常ブロック群から生成されたソースコードと、対応する正常ブロック群から生成されたソースコードを比較しても明らかである。
【００７６】
このため、異常ブロック群により実現される処理と、該異常ブロック群を変換して得られる正常ブロック群により実現される処理との間に相違が生じることを、極力防ぐことができる。
【００７７】
また、第４異常パターン５００では、同一グローバル変数Ｘの読み出しが行われる２つのブロックセットパターン５１０，５３０の処理優先度がＡ１，Ａ３、該グローバル変数Ｘの読み出しが行われないブロックセットパターン５２０の処理優先度はＡ２となっている。このため、ブロックセットパターン５１０，５３０により記述された処理の合間に、ブロックセットパターン５２０により記述された処理が実行される。
【００７８】
このように、本実施形態のコード生成ツール１００によれば、同一グローバル変数の読み出しが行われる複数のブロックセットパターンに対応する各処理が連続的に実行される場合に限らず、間隔を空けて実行される場合であっても、他のタスク等によるグローバル変数の更新の影響を排除することができる。
【００７９】
なお、上述した第１〜４異常パターン２００〜５００や第１〜４正常パターン２４０〜５４０は、あくまでも一例であり、これらに限定されること無く、様々な構成の異常パターンや正常パターンを用いることができる。
【００８０】
次に、コード生成装置として動作するＰＣ１が、制御モデル１５０から異常ブロック群を検出し、正常ブロック群に置き換えるコード生成処理について、図６に記載のフローチャートを用いて説明する。なお、本処理は、入力装置６０を介して受け付けた操作に応じて実行される。
【００８１】
Ｓ６０５では、ＰＣ１のＣＰＵ３０は、開発者により作成され、ＨＤＤ２０やＲＡＭ５０に保存されている制御モデル１５０を読み込むと共に、読み込んだ制御モデル１５０をコピーし、変換モデルとしてＲＡＭ５０に保存し、Ｓ６１０に処理を移行する。なお、この制御モデル１５０は、ＯＳにより制御されるマルチタスクのプログラムにおける各タスクの動作を記述したものとなっており、各タスクの動作は、１または複数の関数ブロック（ブロックセットの集合体）として記述されている。
【００８２】
Ｓ６１０では、ＣＰＵ３０は、変換モデルにおけるいずれかの関数ブロックを読み出し、該関数ブロックにて同一のグローバル変数の読み出しが２箇所以上で行われ、且つ、グローバル変数の読み出し箇所が異なるブロックセットであるか否かを判定する（換言すれば、同一グローバル変数の読み出しを行うブロックを有するアクセスブロックセットが、関数ブロックに複数含まれているか否かを判定する）。そして、肯定判定が得られた場合には（Ｓ６１５：Ｙｅｓ）、Ｓ６２０に処理を移行し、否定判定が得られた場合には（Ｓ６１５：Ｎｏ）、Ｓ６３０に処理を移行する。
【００８３】
Ｓ６２０では、ＣＰＵ３０は、ＨＤＤ２０に保存されている異常パターンデータを読み出し、関数ブロックから該異常パターンデータが示す異常パターンに対応する異常ブロック群を検出する。具体的には、関数ブロックを構成するブロック群を抽出すると共に、該ブロック群と異常パターンデータが示す各異常パターンと比較し、該ブロック群が異常パターンに対応するものである場合には、該ブロック群を異常ブロック群として検出する。
【００８４】
続くＳ６２５では、異常ブロック群が検出された場合には、ＣＰＵ３０は、ＨＤＤ２０に保存されている変換方法データを読み出し、該異常ブロック群に対応する正常パターンを特定する。そして、検出された異常ブロック群を、該正常パターンに基づき正常ブロック群に変換すると共に、変換モデルにおける該異常ブロック群を正常ブロック群に置き換え、Ｓ６３０に処理を移行する。なお、Ｓ６２０で異常ブロック群が検出されなかった場合には、ＣＰＵ３０は、Ｓ６２５の処理を省略してＳ６３０に処理を移行する。
【００８５】
Ｓ６３０では、ＣＰＵ３０は、変換モデルにおける全ての関数ブロックについての異常ブロック群の検出が完了したか否かを判定する。そして、肯定判定が得られた場合には（Ｓ６３０：Ｙｅｓ）、Ｓ６３５に処理を移行し、否定判定が得られた場合には（Ｓ６３０：Ｎｏ）、Ｓ６１０に処理を移行する。
【００８６】
Ｓ６３５では、ＣＰＵ３０は、変換モデルのシミュレーションを行うと共に、実行結果をディスプレイ１０に表示し、Ｓ６４０に処理を移行する。
Ｓ６４０では、ＣＰＵ３０は、変換モデルからソースコードを生成し、本処理を終了する。
【００８７】
このように、コード生成処理では、タスクを構成する関数ブロック単位で異常ブロック群の検出が行われ、検出された異常ブロック群が正常ブロック群に置き換えられる。このため、タスクの複数箇所で同一グローバル変数の読み出しが行われる場合であっても、他のタスク等による該グローバル変数の更新による異常の発生を防ぐことができる。
【００８８】
また、コード生成処理では、同一グローバル変数の読み出しを行うアクセスブロックセットを複数含む関数ブロックを対象として異常ブロック群の検出が行われ、検出された異常ブロック群が正常ブロック群に置き換えられる。このため、全ての関数ブロックを対象として異常ブロック群の検出を行う場合に比べ、処理負荷を低減させることができる。
【００８９】
また、正常ブロックには、実現される処理とは直接関係無いラッチブロックが含まれており、正常ブロックは、変換元の異常ブロックに比べ複雑な構造を有している。このため、制御モデルに含まれる異常ブロック群を正常ブロック群に置き換えた場合には、制御モデルの構造が複雑化し、記述されている内容がわかり難くなるおそれがある。
【００９０】
これに対し、コード生成処理では、制御モデル１５０をコピーして得られた変換モデルにおける異常ブロック群が正常ブロック群に置き換えられ、制御モデル１５０は元の記述のままに維持される。このため、制御モデル１５０がわかり難い構造に書き換えられてしまうことを防ぐことができる。
【００９１】
また、コード生成処理では、異常ブロック群が正常ブロック群に置き換えられた変換モデルのシミュレーションが行われる。このため、制御モデル１５０から生成されたソースコードを実装する前に、制御モデル１５０の問題点や、異常ブロック群を正常ブロック群に置き換えたことの影響を調べることができ、制御モデルの検証作業をより容易にすることができる。
【００９２】
［他の実施形態］
（１）本実施形態のコード生成処理では、ＯＳにより制御されるマルチタスクのプログラムにおける各タスクの動作を記述した制御モデル１５０が読み込まれ、該制御モデルにおける異常ブロック群が正常ブロック群に変換される。
【００９３】
しかしながら、これに限定されることは無く、ＯＳにより制御されていないプログラムの動作を記述した制御モデル１５０に対し同様の処理を行っても良い。このような場合には、いわゆるメインループ等から周期的にコールされる処理や、外部からの信号の入力をトリガとして実行される処理等、モジュール化された各処理を記述した複数の関数ブロックを対象として、Ｓ６１０〜Ｓ６３０の処理を実行することが考えられる。
【００９４】
このような制御モデル１５０を対象としてコード生成処理を実行した場合であっても、同様の効果を得ることができる。
（２）また、本実施形態のコード生成処理では、開発者により作成された制御モデル１５０を改変せず、該制御モデル１５０をコピーした変換モデルに含まれる異常ブロック群を正常ブロック群に置き換えている。しかしながら、該制御モデル１５０に含まれる異常ブロック群を正常ブロック群に置き換えても良く、このような場合であっても、変換モデルを改変する場合と同様に、制御モデル１５０の作成を容易化する等の効果が得られる。
【００９５】
（３）また、本実施形態のコード生成処理では、異常ブロック群が正常ブロック群に置き換えられた変換モデルについてのシミュレーションを行った後に、該変換モデルからソースコードが生成される。
【００９６】
しかしながら、シミュレーションを行うことなく変換モデルからソースコードを生成する構成としても良い。このような場合であっても、制御モデル１５０の作成を容易化する等の効果が得られる。
【００９７】
また、ソースコードを生成せず、シミュレーションのみを行っても良く、このような場合であっても、異常ブロック群が正常ブロック群に置き換えられた制御モデル１５０の検証を行うことができる。
【００９８】
（４）また、本実施形態のコード生成処理では、制御モデル１５０を構成する関数ブロック毎に、同一グローバル変数の読み出しが２箇所以上で行われているか否かを判定し、肯定判定が得られた関数ブロック群を対象に異常パターンを用いた異常ブロック群の検出を行っている。しかしながら、関数ブロックを構成するブロック群毎に同様にして異常ブロック群の検出を行っても良いし、複数の関数ブロックの集まり毎に同様の検出を行っても良い。また、上記判定を行うこと無く、全ての関数ブロックに対し異常パターンを用いた異常ブロック群の検出を行っても良い。
【００９９】
このような場合であっても、制御モデルの作成を容易化する等の効果が得られる。
［特許請求の範囲との対応］
上記実施形態の説明で用いた用語と、特許請求の範囲の記載に用いた用語との対応を示す。
【０１００】
コード生成ツール１００がコード生成プログラムに相当する。
また、第１〜４異常パターン２００，３００，４００，５００がパターンに相当し、第１〜４正常パターン２４０〜５４０が変換方法に相当する。
【０１０１】
また、ＰＣ１のＨＤＤ２０がパターン登録手段，変換方法登録手段，記憶媒体に相当する。
また、コード生成処理のＳ６０５が読込手段に、Ｓ６１５が検出手段に、Ｓ６２０が検出手段，パターン読出し手段に、Ｓ６２５が変換手段，変換方法読出し手段に、Ｓ６３５がシミュレーション手段に、Ｓ６４０が生成手段に相当する。
【符号の説明】
【０１０２】
１…ＰＣ、１０…ディスプレイ、２０…ＨＤＤ、３０…ＣＰＵ、４０…ＲＯＭ、５０…ＲＡＭ、６０…入力装置、１００…コード生成ツール、１５０…制御モデル、２００…第１異常パターン、２４０…第１正常パターン、３００…第２異常パターン、３４０…第２正常パターン、４００…第３異常パターン、４４０…第３正常パターン、５００…第４異常パターン、５４０…第４正常パターン。
【図１】
2013161219.tif 000003
【図２】
2013161219.tif 000004
【図３】
2013161219.tif 000005
【図４】
2013161219.tif 000006
【図５】
2013161219.tif 000007
【図６】
2013161219.tif 000008