(57)【要約】【課題】ユーザープログラムを構成する呼出可能な単位プログラムの互換性を実現する。【解決手段】ユーザープログラムから制御装置で実行可能な形式のコードを生成するコード生成部は、呼出式について、引数名と、当該引数に設定する値を関連付けるための関連付情報を格納する構造体を作成する命令コードを生成し、当該呼出式を構造体の識別子を用いて当該単位プログラムを呼出す命令コードに変換する。また、単位プログラムの各引数について、構造体に当該引数の引数名に対応の関連付情報が格納されているときは、当該引数に関連付情報の値を設定し、関連付情報が格納されていないときは、当該引数に所定値を設定するための命令コードを生成する。【選択図】図４
2019159361.tif 000002
【特許請求の範囲】
【請求項１】
制御対象を制御する制御装置で実行されるユーザープログラムの開発を支援するサポート装置であって、
前記ユーザープログラムを走査し、当該ユーザープログラムから当該ユーザープログラムを構成する呼出し可能な単位プログラムを呼出すための呼出式を検出する呼出し検出部と、
前記ユーザープログラムから前記制御装置で実行可能な形式のコードを生成するコード生成部と、を備え、
前記コード生成部は、
前記呼出式について、引数名と、当該引数に設定する値とを関連付けるための関連付情報を格納する構造体を作成するための作成命令コードを生成する構造体コード生成部と、
前記呼出式を、前記構造体の識別子を用いて当該単位プログラムを呼出すための呼出命令コードに変換する呼出コード生成部と、
前記単位プログラムが１以上の引数を有する場合に、各引数について、前記構造体に当該引数の引数名に対応の前記関連付情報が格納されているときは、当該引数に前記関連付情報の前記値を設定し、前記関連付情報が格納されていないときは、当該引数に所定値を設定するための設定命令コードを生成する設定コード生成部と、を含む、サポート装置。
【請求項２】
前記構造体コード生成部は、
前記呼出し検出部により前記単位プログラムの呼出式が検出される毎に、前記構造体を作成するための前記作成命令コードを生成する、請求項１に記載のサポート装置。
【請求項３】
前記構造体コード生成部は、
前記呼出し検出部が検出する前記呼出式により呼出される前記単位プログラムの種類毎に、前記構造体を作成するための前記作成命令コードを生成する、請求項１に記載のサポート装置。
【請求項４】
前記関連付情報は、前記引数名を示す情報と、前記値を示す情報とを含み、
前記引数名を示す情報は、当該引数名が格納される記憶領域のアドレスを含み、
前記値を示す情報は、当該値が格納される記憶領域のアドレスを含む、請求項１から３のいずれか１項に記載のサポート装置。
【請求項５】
前記引数は、前記ユーザープログラムで用いられる変数を表し、
前記値を示す情報は、関連付けされる前記引数が表す変数の型に基づき、当該値が格納される記憶領域のアドレスまたは当該値の一方を含む、請求項４に記載のサポート装置。
【請求項６】
前記単位プログラムは、当該単位プログラムの各引数の設定内容を判定する関数を含む、請求項１から５のいずれか１項に記載のサポート装置。
【請求項７】
前記呼出コード生成部は、前記構造体の識別子として、当該構造体が格納される領域のアドレスを用いて、前記呼出式を前記呼出命令コードに変換する、請求項１から６のいずれか１項に記載のサポート装置。
【請求項８】
前記設定コード生成部は、
前記単位プログラムが引数を有しない場合に、予め定められた処理を実行させる命令コードを生成する処理命令コード生成部を含む、請求項１から７のいずれか１項に記載のサポート装置。
【請求項９】
制御対象を制御する制御装置で実行されるユーザープログラムの開発を支援するサポート装置を実現するためのサポートプログラムであって、前記サポートプログラムは、コンピュータを、
前記ユーザープログラムを走査し、当該ユーザープログラムから当該ユーザープログラムを構成する呼出し可能な単位プログラムを呼出すための呼出式を検出する呼出し検出部と、
前記ユーザープログラムから前記制御装置で実行可能な形式のコードを生成するコード生成部として機能させ、
前記コード生成部は、
前記呼出式について、引数名と、当該引数に設定する値とを関連付けるための関連付情報を格納する構造体を作成するための作成命令コードを生成する構造体コード生成部と、
前記呼出式を、前記構造体の識別子を用いて当該単位プログラムを呼出すための呼出命令コードに変換する呼出コード生成部と、
前記単位プログラムが１以上の引数を有する場合に、各引数について、前記構造体に当該引数の引数名に対応の前記関連付情報が格納されているときは、当該引数に前記関連付情報の前記値を設定し、前記関連付情報が格納されていないときは、当該引数に所定値を設定するための命令コードを生成する設定コード生成部と、を含む、サポートプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示は、制御対象を制御する制御装置で実行される制御プログラムなどのユーザープログラムの開発を支援するサポート装置およびそれを実現するためのサポートプログラムに関する。
【背景技術】
【０００２】
様々な製造現場において、ＰＬＣ（Programmable Logic Controller）などの制御装置が導入されている。このような制御装置は、一種のコンピュータであり、製造装置や製造設備などに応じて設計された制御プログラムなどのユーザープログラムが実行される。このようなユーザープログラムは、制御装置とは別に用意された開発環境にて作成される。開発環境を提供するとともに、制御装置に対してユーザープログラムをアップロードし、あるいは、制御装置に対してユーザープログラムをダウンロードする機能を提供する装置は、サポート装置とも称される。
【０００３】
サポート装置では、ユーザーが制御プログラムなどのユーザープログラムを作成するための環境と、作成されたユーザープログラムのソースコードを例えば中間コード（または疑似コード，オブジェクトコードなど）などのＰＬＣで実行可能な実施のコードに変換するコンパイラ（またはビルダともいう）とを提供する。サポート装置は、実行可能なコードをＰＬＣに送信（ダウンロード又はアップロード）する。
【０００４】
制御プログラムなどのユーザープログラムでは、他のプログラムを呼出して利用する。例えば呼出されるプログラムの引数に変更がある場合は、変更後の引数に合わせて呼出し側のプログラムも変更するなどの特別な対応がなされる。
【０００５】
プログラムの変更が要求されるシーンに対応する方法として、例えば、特開平１０−０８３３１２号公報（特許文献１）は、インターフェイスにおけるプログラム・コールの透過的変換に関して、異なるＯＳ（オペレーティングシステム）間のプログラム呼出しを開示する。例えば、特開２００１−３３１３１５号公報（特許文献２）は、データ処理システムに関し、データ構造の変化に対する旧バージョンからのデータアクセスを実現する方法を開示する。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開平１０−０８３３１２号公報
【特許文献２】特開２００１−３３１３１５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
ＰＬＣなどの制御プログラムを含むユーザープログラムは、例えば、入力処理、制御演算処理、出力処理、アラーム処理などを実施する単位プログラムである１以上のＰＯＵ（Program Organization Unit）を含む。ＰＯＵの多くはユーザープログラムが共通して利用するライブラリとして提供され得る。ユーザープログラム中でＰＯＵが呼出されるとき、呼出し側のプログラムと呼出されるＰＯＵとの間では、引数などを含むＩ／Ｆ（インターフェイス）を用いてデータの遣り取りがなされる。ユーザープログラム間で、またはＰＬＣなどの制御装置間でＰＯＵの互換性を確保できるように、一度作成したＰＯＵのＩ／Ｆは容易に変更することができない。
【０００８】
そこで、ユーザーは、上記の互換性を確保するために、同様の処理を実施するためのＰＯＵであってもＩ／Ｆが異なれば、別のＰＯＵを作成する必要があった。また、ユーザーは、制御プログラムを含むユーザープログラムの作成時にＩ／Ｆの違いを意識したＰＯＵの使い分けが求められていた。また、Ｉ／Ｆのみが相違する同様のＰＯＵがライブラリに登録されるため、ライブラリの管理が複雑化していた。
【０００９】
本開示は、このような課題を解決することを目的とし、ユーザープログラムを構成する呼出し可能な単位プログラムの互換性を実現するサポート装置およびサポートプログラムを提供することを１つの目的としている。
【課題を解決するための手段】
【００１０】
本開示の一例によれば、制御対象を制御する制御装置で実行されるユーザープログラムの開発を支援するサポート装置であって、ユーザープログラムを走査し、当該ユーザープログラムから当該ユーザープログラムを構成する呼出し可能な単位プログラムを呼出すための呼出式を検出する呼出検出部と、ユーザープログラムから制御装置で実行可能な形式のコードを生成するコード生成部と、を備える。
【００１１】
コード生成部は、呼出式について、引数名と、当該引数に設定する値とを関連付けるための関連付情報を格納する構造体を作成するための作成命令コードを生成する構造体コード生成部と、呼出式を、構造体の識別子を用いて当該単位プログラムを呼出すための呼出命令コードに変換する呼出コード生成部と、単位プログラムが１以上の引数を有する場合に、各引数について、構造体に当該引数の引数名に対応の関連付情報が格納されているときは、当該引数に関連付情報の値を設定し、関連付情報が格納されていないときは、当該引数に所定値を設定するための設定命令コードを生成する設定コード生成部と、を含む。
【００１２】
この開示によれば、ユーザープログラムの実行中に呼出される単位プログラムは、引数を有する場合、その引数の全てに値を設定して実行することが可能になる。したがって、引数の個数の増減など単位プログラムのＩ／Ｆが変更されるとしても、Ｉ／Ｆが変更された単位プログラムを新たにライブラリに登録せずとも、ユーザープログラムの実行は可能となり、いわゆる単位プログラムの互換性が確保される。
【００１３】
上述の開示において、構造体コード生成部は、呼出検出部により単位プログラムの呼出式が検出される毎に、構造体を作成するための作成命令コードを生成する。
【００１４】
この開示によれば、ユーザープログラムの１回の走査により、ユーザープログラム中で呼出されている全ての単位プログラムについて呼出命令コードを生成することができる。
【００１５】
上述の開示において、構造体コード生成部は、呼出検出部が検出する呼出式により呼出される単位プログラムの種類毎に、構造体を作成するための作成命令コードを生成する。
【００１６】
この開示によれば、ユーザープログラムの実行中に構造体は単位プログラムの種類毎に作成されるので、構造体を単位プログラム毎に作成する場合に比較して、ユーザープログラムの実行速度を速くすることができ、また構造体を格納するための記憶領域を節約することができる。
【００１７】
上述の開示において、関連付情報は、引数名を示す情報と、値を示す情報とを含み、引数名を示す情報は、当該引数名が格納される記憶領域のアドレスを含み、値を示す情報は、当該値が格納される記憶領域のアドレスを含む。
【００１８】
この開示によれば、構造体に格納される関連付情報を、アドレスにすることが可能となる。記憶領域の指定に用いるアドレスを一般的に固定長であるから、データ長が可変である引数名または値そのものを用いる場合に比較して、構造体を格納するための記憶領域を節約することができる。
【００１９】
上述の開示において、引数は、ユーザープログラムで用いられる変数を表す。値を示す情報は、関連付けされる引数が表す変数の型に基づき、当該値が格納される記憶領域のアドレスまたは当該値の一方を含む。
【００２０】
この開示によれば、関連付情報の値を示す情報を、関連付けされた引数の変数の型に基づき、値そのもの、またはアドレスに選択的に切替えることができる。したがって、関連付情報にアドレスではなく値そのものを含めた場合は、関連付情報から直接にアドレスを取得できるので、アドレス指定により記憶領域から値の読出す処理を省略することができる。
【００２１】
上述の開示において、単位プログラムは、当該単位プログラムの各引数の設定内容を判定する関数を含む。
【００２２】
この開示によれば、ユーザープログラムの実行中に単位プログラムを呼出す場合に、実行される関数により、単位プログラム内で各引数の設定内容を判定することができる。
【００２３】
上述の開示において、呼出コード生成部は、構造体の識別子として、当該構造体が格納される領域のアドレスを用いて、呼出し式を呼出命令コードに変換する。
【００２４】
この開示によれば、呼出命令コードが実行されるとき、当該呼出命令コードに用いられるアドレスで構造体の領域を直接指定して、関連付情報を読み書きすることができる。
【００２５】
上述の開示において、設定コード生成部は、単位プログラムが引数を有しない場合に、予め定められた処理を実行させる命令コードを生成する。
【００２６】
この開示によれば、単位プログラムが引数を有しない場合には、実行可能な形式のコードとして、予め定められた処理を実行させる命令コードを生成することができる。
【００２７】
本開示の一例によれば、制御対象を制御する制御装置で実行されるユーザープログラムの開発を支援するサポート装置を実現するためのサポートプログラムであって、サポートプログラムは、コンピュータを、ユーザープログラムを走査し、当該ユーザープログラムから当該ユーザープログラムを構成する呼出し可能な単位プログラムを呼出すための呼出式を検出する呼出検出部と、ユーザープログラムから制御装置で実行可能な形式のコードを生成するコード生成部として機能させ、コード生成部は、呼出式について、引数名と、当該引数に設定する値とを関連付けるための関連付情報を格納する構造体を作成するための作成命令コードを生成する構造体コード生成部と、呼出式を、構造体の識別子を用いて当該単位プログラムを呼出すための呼出命令コードに変換する呼出コード生成部と、単位プログラムが１以上の引数を有する場合に、各引数について、構造体に当該引数の引数名に対応の関連付情報が格納されているときは、当該引数に関連付情報の値を設定し、関連付情報が格納されていないときは、当該引数に所定値を設定するための設定命令コードを生成する設定コード生成部と、を含む。
【００２８】
この開示によれば、ユーザープログラムの実行中に呼出される単位プログラムは、引数を有する場合、その引数の全てに値を設定して実行することが可能になる。したがって、引数の個数の増減など単位プログラムのＩ／Ｆが変更されるとしても、Ｉ／Ｆが変更された単位プログラムを新たにライブラリに登録せずとも、ユーザープログラムの実行を可能となり、いわゆる単位プログラムの互換性が確保される。
【発明の効果】
【００２９】
本開示の一例によれば、ユーザープログラムを構成する呼出し可能な単位プログラムの互換性を実現できる。
【図面の簡単な説明】
【００３０】
【図１】本実施の形態に従うサポート装置を適用可能なＰＬＣシステムの構成例を示す模式図である。
【図２】図１に示すＰＬＣシステムを構成するＰＬＣのハードウェア構成例を示す模式図である。
【図３】図１に示すＰＬＣシステムを構成するサポート装置のハードウェア構成例を示す模式図である。
【図４】本実施の形態に係るサポート装置の適用場面の一例を示す模式図である。
【図５】本発明の実施の形態に係るユーザープログラムの一例を模式的に示す図である。
【図６】従来のＰＯＵを呼出す側の中間コードの一例を模式的に示す図である。
【図７】従来の呼出される側（ＰＯＵ）の中間コードの一例を模式的に示す図である。
【図８】本発明の実施の形態に係る呼出毎連想配列の方法に従い生成される中間コードの一例を模式的に示す図である。
【図９】本発明の実施の形態に係る呼出毎連想配列の方法に従い生成される中間コードの一例を模式的に示す図である。
【図１０】本発明の実施の形態に係る呼出毎連想配列の方法に従う呼出し側の中間コードの生成処理の一例を示すフローチャートである。
【図１１】図１０の処理に用いられる一時領域と連想配列の内容の一例を模式的に示す図である。
【図１２】本発明の実施の形態に係る呼出毎連想配列の方法に従う呼出される側の中間コードの生成処理の一例を示すフローチャートである。
【図１３】本発明の実施の形態に係る呼出毎連想配列の方法に従う呼出し側の中間コードの生成処理の他の例を示すフローチャートである。
【図１４】図１３の処理に用いられる一時領域と連想配列の内容の一例を模式的に示す図である。
【図１５】本発明の実施の形態に係る呼出毎連想配列の方法に従う呼出される側の中間コードの生成処理の他の例を示すフローチャートである。
【図１６】本発明の実施の形態に係る「種類毎連想配列」の方法に従う中間コードの生成処理の一例を模式的に示すフローチャートである。
【図１７】本発明の実施の形態に係る「種類毎連想配列」の方法に従い生成される連想配列の一例を模式的に示す図である。
【図１８】本発明の実施の形態に係る種類毎連想配列の方法に従い生成される中間コードの一例を模式的に示す図である。
【図１９】本発明の実施の形態に係る組込関数の呼出しの書式と内容の一例を模式的に示す図である。
【図２０】本実施の形態により奏される利点の一例を模式的に示す図である。
【発明を実施するための形態】
【００３１】
本発明の実施の形態について、図面を参照しながら詳細に説明する。なお、図中の同一または相当部分については、同一符号を付してその説明は繰返さない。
【００３２】
＜Ａ．適用例＞
まず、図４を参照して、本発明が適用される場面の一例について説明する。図４は、本実施の形態に係るサポート装置２００の適用場面の一例を示す模式図である。本実施の形態では、制御対象を制御する制御装置で実行されるユーザープログラム６００の開発を支援するサポート装置２００が提供される。ユーザープログラム６００は、例えば制御対象を制御するための制御プログラムを含み得る。制御装置は、例えばＰＬＣ１００を含み得る。
【００３３】
サポート装置２００は、ユーザープログラム６００の開発支援環境としてプログラム開発部２６０を備える。サポート装置２００は、コンパイルに関連したデータを格納する領域および作業領域としてＲＡＭ（Random Access Memory）２０６などの記憶部を利用する。この記憶部は、ＲＡＭ２０６に限定されずＨＤＤ（ハードディスク）なども含み得る。
【００３４】
プログラム開発部２６０が備えるコンパイラ部２６３は、ＲＡＭ２０６などの記憶部をアクセスしながら、ユーザープログラム６００をコンパイルする。コンパイラ部２６３は、ユーザープログラム６００から制御装置に実行可能な形式のコードである中間コード７００を生成するコード生成部２７１と、ユーザープログラム６００を走査しながら、ユーザープログラム６００を構成する呼出し可能な単位プログラム（ＰＯＵ６０１）を呼出すための呼出式を検出する呼出検出部２７０とを備える。呼出式は、例えば、単位プログラムの名前（識別子）と、１以上の各引数の引数名とを含む。例えば、単位プログラムが関数である場合は、呼出式は、関数名（引数１の名前，引数２の名前，・・・）により表される。後述の変形例で示すように単位プログラムの引数は０個であってもよいが、説明を簡単にするために、以下では単位プログラムの引数を１以上として説明する。
【００３５】
コード生成部２７１は、構造体コード生成部２７２と、呼出コード生成部２７３と、設定コード生成部２７４とを含む。構造体コード生成部２７２は、検出された上記の呼出式に含まれる単位プログラムが有する１以上の引数それぞれについて、引数名と、当該引数に設定する値とを関連付ける関連付情報を格納する構造体を作成するための作成命令コードを生成する。この構造体は、例えば配列型の構造を有し、より特定的には、連想配列型の構造を有する。
【００３６】
呼出コード生成部２７３は、上記に述べた呼出式を、単位プログラムの１以上の引数名が上記の構造体の識別子に変更された当該単位プログラムを呼出すための呼出命令コードに変換する。
【００３７】
設定コード生成部２７４は、単位プログラムの実行可能な形式のコードを生成する場合に、設定命令コードを生成する。設定命令コードは、当該単位プログラムが有する１以上の引数のそれぞれについて、構造体に当該引数の引数名に対応の関連付情報が格納されているときは、当該引数に関連付情報で関連付けられる値を設定し、関連付情報が格納されていないときは、当該引数に所定値を設定するための命令コードを含む。これにより、単位プログラムの中間コードは、本来の処理内容を示す命令コードと、設定コード生成部２７４により生成された設定命令コードとを含む。
【００３８】
設定命令コードが実行されることにより、引数に設定される上記の所定値は、引数の値が省略されているとの扱いで単位プログラムの実行を可能にするような値であって、例えば、デフォルト値、エラーを示す値などを含み得る。
【００３９】
サポート装置２００が備える転送部２１６は、入力デバイスを介して受付けるユーザーの操作内容に従い、ＲＡＭ２０６などの記憶部から中間コード７００を読出し、読出された中間コード７００を制御装置に送信（ダウンロード、またはアップロード）する。なお、転送部２１６による制御装置への中間コード７００の送信は、有線および無線を介して、または、メモリカードなどの記録媒体を介した実施される。
【００４０】
制御装置が、サポート装置２００からの実行可能な形式のコード（以下、実行可能形式コードという）を実行する場合、呼出命令コードにより、例えば制御装置のライブラリから当該単位プログラムが呼出される。また、当該ライブラリから呼出された単位プログラムの各引数には、設定命令コードにより、構造体の関連付情報で関連付けされている値、または所定値が設定される。このように、制御装置でユーザープログラム６００が実行中に呼出される単位プログラムは、その引数の全てに何らかの値が設定されて実行される。
【００４１】
これにより、引数の個数が変更されるなどしてＩ／Ｆが変更される場合、「機能拡張版」として変更後の単位プログラムをライブラリに登録せずとも、ユーザープログラム６００の実行中に呼出される単位プログラムを実行することができ、単位プログラムの互換性が確保される。また、このことは、ライブラリにおける単位プログラムの管理が容易となり、ライブラリの保守性ももたらす。
【００４２】
ユーザープログラム６００は、例えば、ラダーロジック言語によって記述された１または複数のシーケンスプログラムの組み合わせを含み得る。なお、プログラムは、シーケンスプログラムに限定されず、モーションプログラムであってもよい。また、プログラム言語もラダーロジック言語に限定されない。
【００４３】
単位プログラムは、ユーザープログラム６００において呼出し可能な例えばＰＯＵ（Program Organization Unit）６０１を含む。ＰＯＵ６０１は、他のプログラム（他のＰＯＵ６０１を含む）から呼出されて実行され、その実行結果を呼出し元のプログラムに戻すような、一種のサブルーチンまたは関数なども含み得る。サポート装置２００は、ユーザー操作を受付けて、ＰＯＵ６０１を作成し、作成されたＰＯＵ６０１毎に実行可能形式コードを生成し、制御装置（ＰＬＣ１００）へ送信することも可能である。
【００４４】
ＰＯＵ６０１は、当該ＰＯＵ６０１を呼出すためのＩ／Ｆ（インターフェイス）を備える。このＩ／ＦはＰＯＵ６０１を含むプログラム間で、グローバル変数またはローカル変数などの値を引き渡しするための１つ以上の引数（変数）を含む。
【００４５】
上記の実行可能形式コードとしては、中間コード７００を例示するが、疑似コードであってもよい。制御装置（ＰＬＣ１００）では、サポート装置２００から受信した中間コード７００を、制御装置の仕様に適合したコードに変換して実行するケースもあり得る。その意味で、本適用例では、ユーザープログラム６００のソースコード６１０と制御装置の仕様に適合したコードとの中間に位置するとして、中間コード７００を用いる。
【００４６】
以下の説明では、引数は、仮引数と実引数の２種類を有する。仮引数は、例えば、ＰＯＵ６０１（単位プログラム）が関数である場合は、ＰＯＵ６０１の関数を定義する際の変数（パラメータ）に相当する。実引数は、ＰＯＵ６０１が例えば関数であれば、ＰＯＵ６０１の実行（関数に従う演算の実行）時に、ＰＯＵ６０１の関数に引き渡される値に相当する。このように、ＰＯＵ６０１の実行時には、実引数の値が仮引数に代入されて、代入された実引数の値を用いてプログラムの実行（例えば、関数の演算など）がなされる。また、この開示においては、アドレスは、物理的なアドレスと論理アドレスの両方を含み得る。
【００４７】
以下、本発明のより具体的な応用例として、本実施の形態に係るサポート装置２００のより詳細な構成および処理について説明する。
【００４８】
＜Ｂ．ＰＬＣシステムの構成例＞
まず、本実施の形態に従うサポート装置２００を適用可能なＰＬＣシステム１の構成例について説明する。図１は、本実施の形態に従うサポート装置２００を適用可能なＰＬＣシステム１の構成例を示す模式図である。
【００４９】
図１を参照して、ＰＬＣシステム１は、複数のＰＬＣ１００−１，１００−２，１００−３，１００−４，…（以下、「ＰＬＣ１００」とも総称する。）を含んでいる。ＰＬＣ１００の各々は、互いに同様の製造装置を制御する制御システムに備えられて、ＰＬＣ１００の各々では、実行される制御プログラムも実質的に同一であるとする。本実施の形態に従うサポート装置２００は、各ＰＬＣ１００の運転を制御する制御プログラムを開発し、開発した制御プログラムを各ＰＬＣにダウンロード（またはアップロード）する。なお、ＰＬＣシステム１に備えられるＰＬＣは複数に限定されず、１以上であればよい。
【００５０】
ＰＬＣ１００の各々は、制御対象を制御する制御装置の一例である。ＰＬＣ１００は、典型的には、制御プログラムを含む各種プログラムを実行する主体であるＣＰＵユニット１０と、ＣＰＵユニット１０などへ電力を供給する電源ユニット１２と、フィールドからの信号を遣り取りするＩ／Ｏ（Input/Output）ユニット１４とを含む。Ｉ／Ｏユニット１４は、ＣＰＵユニット１０とシステムバス１１を介して接続されている。
【００５１】
サポート装置２００は、制御対象を制御する制御装置であるＰＬＣ１００で実行される制御プログラムの開発を支援する。サポート装置２００は、ＰＬＣ１００で実行される制御プログラムを含むユーザープログラム６００を開発するための環境を提供する機能、ＰＬＣ１００に対して制御プログラムおよび各種情報を設定する機能、運転中のＰＬＣ１００の状態値を取得する機能などを含む。さらに、サポート装置２００は、ユーザーによる制御プログラムを含むユーザープログラム６００の開発を支援するため、デバック機能やシミュレーション機能を有していてもよい。
【００５２】
記録媒体２５０に格納されたアプリケーションプログラムであるサポートプログラムがサポート装置２００にインストールされることで、上述したような各種機能が実現される。記録媒体２５０に代えて、外部のサーバ装置などからネットワークを介して、サポートプログラムをダウンロードするようにしてもよい。サポート装置２００は、一例として、接続ケーブルを介してＰＬＣ１００のＣＰＵユニット１０と接続される。サポート装置２００は、典型的には、パーソナルコンピュータで実現される。
【００５３】
＜Ｃ．ＰＬＣ１００のハードウェア構成＞
次に、ＰＬＣ１００のハードウェア構成例について説明する。図２は、図１に示すＰＬＣシステムを構成するＰＬＣ１００のハードウェア構成例を示す模式図である。
【００５４】
図２を参照して、ＰＬＣ１００は、予めインストールされたプログラムをプロセッサが実行することで、制御対象に対する制御を実現する。より具体的には、ＰＬＣ１００は、ＣＰＵ（Central Processing Unit）やＭＰＵ（Micro-Processing Unit）などのプロセッサ１０２と、チップセット１０４と、メインメモリ１０６と、フラッシュメモリ１０８と、外部ネットワークコントローラ１１６と、メモリカードインターフェイス１１８と、内部バスコントローラ１２２と、フィールドバスコントローラ１２４とを含む。
【００５５】
プロセッサ１０２は、フラッシュメモリ１０８に格納されたシステムプログラム１１０およびユーザープログラム６００を読み出して、メインメモリ１０６に展開して実行することで、制御対象に対する制御を実現する。ユーザープログラム６００は、１または複数のＰＯＵ６０１を含み、これらＰＯＵ６０１はライブラリ１１３に登録されている。ライブラリ１１３の各ＰＯＵ６０１は、実行可能形式コード（例えば、中間コード）の態様で登録される。
【００５６】
システムプログラム１１０は、データの入出力処理や実行タイミング制御などの、ＰＬＣ１００の基本的な機能を提供するための命令コードを含む。ユーザープログラム６００は、制御対象に応じて任意に設計される一種の制御プログラムを含む。制御プログラムは、シーケンス制御を実行するためのシーケンスプログラム６００Ａおよびモーション制御を実行するためのモーションプログラム６００Ｂを含む。ＰＬＣ１００のユーザープログラム６００は、サポート装置２００からの中間コード７００により示されるユーザープログラム６００を含み得る。
【００５７】
チップセット１０４は、各コンポーネントを制御することで、ＰＬＣ１００全体としての処理を実現する。
【００５８】
内部バスコントローラ１２２は、ＰＬＣ１００と内部バスを通じて連結されるＩ／Ｏユニット１４との間でデータを遣り取りするインターフェイスである。フィールドバスコントローラ１２４は、ＰＬＣ１００と図示しないフィールドバスを通じて連結されるＩ／Ｏユニット１６との間でデータを遣り取りするインターフェイスである。内部バスコントローラ１２２およびフィールドバスコントローラ１２４は、対応のＩ／Ｏユニット１４および１６にそれぞれ入力される状態値を取得するとともに、プロセッサ１０２での演算結果を対応のＩ／Ｏユニット１４および１６から指令値としてそれぞれ出力する。
【００５９】
外部ネットワークコントローラ１１６は、各種の有線／無線ネットワークを通じたデータの遣り取りを制御する。メモリカードインターフェイス１１８は、メモリカード１２０を着脱可能に構成されており、メモリカード１２０に対してデータを書込み、メモリカード１２０からデータを読出すことが可能になっている。
【００６０】
ＰＬＣ１００がプログラムを実行することで提供される機能の一部または全部を専用のハードウェア回路として実装してもよい。
【００６１】
＜Ｄ．サポート装置２００のハードウェア構成例＞
次に、サポート装置２００のハードウェア構成例について説明する。図３は、図１に示すＰＬＣシステムを構成するサポート装置２００のハードウェア構成例を示す模式図である。図３を参照して、サポート装置２００は、典型的には、汎用のコンピュータで構成される。なお、ＰＬＣ１００が配置される製造現場では可搬性に優れたノート型のパーソナルコンピュータの形態で提供されてもよい。
【００６２】
サポート装置２００は、オペレーティングシステム（ＯＳ）を含む各種プログラムを実行するＣＰＵ２０２と、ＢＩＯＳや各種データを格納するＲＯＭ（Read Only Memory）１０４と、ＣＰＵ２０２でのプログラムの実行に必要なデータを格納するための作業領域を提供するメモリＲＡＭ２０６と、ＣＰＵ２０２で実行されるプログラムなどを不揮発的に格納するハードディスク（ＨＤＤ）２０８とを含む。
【００６３】
サポート装置２００は、さらに、ユーザーからの操作を受け付けるキーボード２１０およびマウス２１２と、情報をユーザーに提示するためのディスプレイ２１４とを含む。サポート装置２００は、ＰＬＣ１００（ＣＰＵユニット１０）などと通信するための通信インターフェイス２１８を含む。
【００６４】
サポート装置２００は、記録媒体２５０からそれに格納されているサポートプログラムを読み取るための記録媒体読取装置２１７を含む。このサポートプログラムは、コンパイラ部２６３を有するプログラム開発部２６０を実現するプログラムを含み得る。
【００６５】
＜Ｅ．プログラム開発環境＞
再び図４を参照して、サポート装置２００が提供するプログラム開発環境を説明する。
【００６６】
図４のプログラム開発部２６０のプログラム編集部２６２が提供するエディット機能を利用することにより、ユーザーはＰＯＵ６０１の単位で、プログラムの変更・更新・削除が可能になっている。プログラム編集部２６２は、キーボード２１０などの入力デバイスを介して受付けるユーザー操作内容に従い、ユーザープログラム６００を編集（エディット）し、編集後のユーザープログラム６００を予め定められたプログラム記述言語のソースコード６１０に変換する。
【００６７】
ＰＬＣ１００で実行される制御プログラムについては変数プログラミングが可能になっており、ＰＬＣ１００においてグローバル変数またはローカル変数のテーブルにおいて定義されたフィールドデータに関連付けられた変数値を用いて、各種処理が実行可能になっている。上記のＰＯＵの引数に設定される値は、これら変数値を含み得る。したがって、フィールド機器（制御対象の機器）の変更などによりグローバル変数またはローカル変数の変更があると、関連するＰＯＵ６０１のＩ／Ｆが変化し得る。例えば、Ｉ／Ｆの引数の個数が変化し得る。
【００６８】
コンパイラ部２６３が、ユーザープログラム６００を走査して中間コード７００を生成する機能は、サポート装置２００が備えるビルダ（Builder）の一部として提供されるケースもある。例えば、ビルダは、コンパイルとリンクの両方の機能を備えることにより、コンパイルにより生成された複数の中間コード７００のファイルをリンクすることにより実行ファイルを作成する。したがって、コンパイラ部２６３は、サポート装置２００が備えるビルダの一部として提供され得て、その場合は、中間コード７００は、このような実行ファイルとして制御装置（ＰＬＣ１００）に転送され得る。
【００６９】
＜Ｆ．ユーザープログラムと従来の中間コード＞
図５は、本発明の実施の形態に係るユーザープログラム６００の一例を模式的に示す図である。図６は、従来のＰＯＵを呼出す側の中間コードの一例を模式的に示す図である。図７は、従来の呼出される側（ＰＯＵ）の中間コードの一例を模式的に示す図である。図５を参照して、ユーザープログラム６００はプログラムの開始を表すSTARTから終了を表すENDまでの範囲において記述される。ユーザープログラム６００は、プログラム中で呼出されるＰＯＵ６０１の名前（識別子）と各引数の名前およびデータ型などの宣言部４００と、ＰＯＵ６０１を呼出す側のプログラムbarを記述したPROGRAM部５００を含む。以下では、ＰＯＵ６０１は名称が「foo」の関数と想定する。
【００７０】
図５を参照して、PROGRAM部５００では、呼出式５５０によりＰＯＵ６０１の呼出しが記述されている。呼出式５５０（foo（in1＝a+b、inout2＝ｃ［idx］、out3⇒ｄ）は、ＰＯＵ名は“foo”、その引数は３個であり、各引数名がin1、inout3およびout3であって、各引数の値にa+b、ｃ［idx］およびｄのそれぞれ指定されてＰＯＵ６０１が呼出されることを表す。
【００７１】
図５のユーザープログラム６００を従来の方法でコンパイルした場合に、呼出し側のプログラムbarにつては、例えば図６の中間コードが生成される。図６を参照してプログラムbarに対応の中間コード５０１は、ＰＯＵ６０１の呼出式５５０に対応したＰＯＵの呼出コード５０２と、他の部分のコード５０３と、戻り値ｄを設定するコード５０４とを含む。コード５０３は、ＰＯＵ６０１の各引数の値を算出（取得）するための命令コードを含む。これにより、ユーザープログラム６００の実行時に、プログラムbarからＰＯＵ６０１が呼出されるときはＰＯＵの各引数（仮引数）には、プログラムbarで算出（取得）された値である実引数が渡される。
【００７２】
また、図７を参照して、呼出される側のＰＯＵ６０１の中間コード５４０は、各引数に渡された値（実引数の値）を取得するための命令コード５４２と、渡された各引数の値を用いた処理（演算処理など）を実行するための命令コード５４３と、処理の結果を戻り値として設定するコード５４４とを含む。
【００７３】
＜Ｇ．連想配列の作成命令コードの生成方法＞
本実施の形態に係るコード生成部２７１は、ＰＯＵ６０１に関連付けて構造体の一例である連想配列の作成を指示するための作成命令コードを生成する。本実施の形態では、この作成命令コードは「呼出毎連想配列」と「種類毎連想配列」の２つの方法により提供される。
【００７４】
「呼出毎連想配列」では、ユーザープログラム６００の走査中に、呼出検出部２７０がＰＯＵの呼出式５５０を検出する毎に、構造体コード生成部２７２は連想配列を作成するための作成命令コードを生成する。これに対して、「種類毎連想配列」では、ユーザープログラム６００の走査中に、呼出検出部２７０が検出する呼出式５５０により呼出されるＰＯＵ６０１の種類毎に、連想配列を作成するための作成命令コードを生成する。
【００７５】
コンパイラ部２６３は「呼出毎連想配列」と「種類毎連想配列」の両方の機能（モジュール）を備える。コンパイラ部２６３は、入力デバイスを介してユーザーから受付けた指示に基づき、いずれか一方の機能（モジュール）を起動する。
【００７６】
＜Ｈ．「呼出毎連想配列」の方法＞
まず、「呼出毎連想配列」の方法を説明する。
【００７７】
（Ｈ−１．呼出毎連想配列の中間コード）
図８と図９は、本発明の実施の形態に係る呼出毎連想配列の方法に従い生成される中間コードの一例を模式的に示す図である。図８の中間コードは、ＰＯＵ（foo）を呼出す側である図５のプログラムbarから、呼出毎連想配列の方法に従い生成された中間コード５１０の一例を示す。
【００７８】
中間コード５１０は図６と同様の他の部分のコード５０３と、ＰＯＵ６０１の呼出しに関連して生成されたコード５２０とを含む。コード５２０は、ＰＯＵ６０１の呼出命令コード５２２と、連想配列の作成命令コード５２１と、連想配列の領域の解放を指示する解放命令コード５２３とを含む。
【００７９】
コード５０３は、図６に示したものと同様であるので説明は繰返さない。作成命令コード５２１は、呼出式５５０に含まれる１以上の引数それぞれについて、引数名と、当該引数に設定する値（実引数）とを関連付ける関連付情報を格納する連想配列を作成することを指示する命令コードを含む。具体的には、呼出式５５０のＰＯＵの識別子（名前foo）に関連付けて引数（in1，inout2，out3）の個数分に基づくサイズの連想配列の記憶領域を確保するための命令コード５２１１と、ＰＯＵ６０１の呼出し側であるプログラムbarにより算出（取得）された各引数の値（実引数）が格納される記憶領域のアドレスを取得するための命令コード５２１０と、ＰＯＵ６０１の各引数について、その値が格納されている領域のアドレス（すなわち、命令コード５２１０による取得されたアドレス）を各引数名に関連付けて連想配列（記憶領域）に設定するための命令コード５２１２を含む。
【００８０】
命令コード５２１１は、連想配列の識別子（“tmp7”）を指定して、引数のトータル個数（fooの場合は３個）分の領域と連想配列の終端（ターミネータ）を示すデータ（例えば、NULL）を格納する領域を確保するための命令コードを表している。ここでは、連想配列の識別子には、例えば連想配列が格納される領域の先頭アドレス（例えば“tmp7”）が割当てられている。
【００８１】
呼出命令コード５２２は、呼出式５５０を、１以上の引数名が連想配列の識別子（“tmp7”）に変更されたＰＯＵ６０１を呼出すための命令コードを表している。
【００８２】
また、解放命令コード５２３は、ＰＯＵ６０１の処理が終了し、ＰＯＵ６０１から呼出し側であるプログラムbarに戻ってきたときに、連想配列に使用した記憶領域を解放すること指示するコードを表す。本実施の形態では、「記憶領域の解放」とは、記憶領域を使用済状態から未使用状態、すなわち空き領域に変更することを含む。
【００８３】
上記に述べた呼出毎連想配列の方法によれば、ユーザープログラム６００を走査して、呼出式５５０が検出される毎に、連想配列を作成するための作成命令コード５２１が生成される。
【００８４】
図９の中間コード５３０は、呼出されるＰＯＵ６０１の中間コードの一例を示す。図９を参照して中間コード５３０は、図７の中間コード５４３と中間コード５４４に追加して、設定命令コード５３２を含む。図９では、設定命令コード５３２は、連想配列から、各引数名に対応の値（実引数）が格納されているアドレスを取得（読出）し、取得したアドレスの領域から読出した値を当該引数名の引数に設定することを指示する命令コードを含む。設定命令コード５３２は、アドレスの領域から読出した値がNULLであれば、当該引数名の引数にはデフォルト値を設定することを指示する命令コードを含む。
【００８５】
これにより、ＰＬＣ１００でユーザープログラム６００が実行中に、ＰＯＵ６０１が呼出されると、ＰＯＵ６０１の本来の処理の命令コード５４３が実行される前に、連想配列を介して、各引数には呼出し側のプログラムbarで取得（算出）された値（実引数）または（値が取得されていない場合は）所定値（例えばデフォルト値）が設定される。これにより、後続の命令コード５４３による処理が実行される時は、引数の値が不定であるなどの理由でエラー処理となることが回避される。
【００８６】
（Ｈ−２．呼出毎連想配列のフローチャート（呼出し側））
図１０は、本発明の実施の形態に係る呼出毎連想配列の方法に従う呼出し側の中間コードの生成処理の一例を示すフローチャートである。図１１は、図１０の処理に用いられる一時領域８００と連想配列９００の内容の一例を模式的に示す図である。図１０を参照して、ＰＯＵ６０１を呼出す側のユーザープログラム６００の一例であるプログラムbarの中間コードを生成する処理を説明する。一時領域８００と連想配列９００は、例えばＰＬＣ１００の記憶領域であって、典型的にはＲＡＭなどの揮発性の記憶領域に相当する。
【００８７】
呼出検出部２７０は、ユーザープログラム６００（ソースコード６１０）を走査しながら呼出式５５０を検出するか否かを判定する（ステップＳ１）。呼出式５５０が検出されたと判定すると（ステップＳ１でＹＥＳ）、ステップＳ３以降の処理に移行するが、検出されないと判定すると（ステップＳ１でＮＯ）、呼出検出部２７０は、ユーザープログラム６００の終端まで走査したかを判断する（ステップＳ１２）。呼出検出部２７０は、ユーザープログラム６００の終端まで走査を終了したと判断したとき（ステップＳ１２でＹＥＳ）処理を終了するが、ユーザープログラム６００の終端まで走査を終了していないと判断したとき（ステップＳ１２でＮＯ）、ステップＳ１に戻り、ユーザープログラム６００の走査を継続する。
【００８８】
呼出検出部２７０が呼出式５５０を検出したとき（ステップＳ１でＹＥＳ）、コード生成部２７１は、ＰＯＵ６０１の実引数を評価し、評価の結果を一時領域８００に格納することを指示するコード５０３を生成する（ステップＳ３）。また、コード生成部２７１は、検出された呼出式５５０に含まれる引数の個数をカウントする命令コードを生成する（ステップＳ３）。
【００８９】
具体的には、図１１を参照して、ステップＳ３で生成されるコード５０３は、図１１の一時領域８００には、各仮引数の変数に渡す値、すなわち実引数の変数の評価値を格納することを指示する命令コード含む。具体的には、コード５０３は、１番目の仮引数である入力変数in1への実引数の評価値が格納される領域Ｔ１（すなわちＰＯＵ６０１を呼出す側のプログラムbarによる演算結果（a+ｂ）値を格納する領域）、２番目の仮引数である入出力変数inout2への実引数の評価値が格納される領域Ｔ２（すなわちinout2に渡す変数のアドレス（ｃ［i］のアドレス））、および３番目の仮引数である出力変数out3への実引数の評価値が格納される領域Ｔ３（すなわち空（out3にＰＯＵの処理結果の値を格納してもらうため領域として確保））のアドレスを格納することを指示する命令コードを含む。この一時領域８００は、例えば１種のスタック領域であり、他の変数などの値を格納する記憶領域と重複しないように設定される。
【００９０】
なお、引数が表す変数の種類毎に、対応の領域Ｔ１〜Ｔ３に格納される評価値は異なる。本実施の形態では、ＰＯＵ６０１のＩ／Ｆに含まれ得る引数が表す変数の種類は、例えば入力変数、入出力変数および出力変数の３種類を有し、これら種類に応じて対応の領域Ｔ１〜Ｔ３に格納される評価値の種類も異なる。
【００９１】
続いて、構造体コード生成部２７２は、ステップＳ３でカウントされた仮引数のトータル個数に基づくエントリ数を有した連想配列９００の領域を確保することを指示する命令コード５２１１を生成する（ステップＳ５）。ステップＳ５では、連想配列９００のエントリ数は、例えば後述のステップＳ１３などにおいて連想配列の終端を判断し易いように、仮引数のトータル個数に終端を表す１つを追加した数としている。
【００９２】
また、構造体コード生成部２７２は、命令コード５２１０，５２１２を生成する（ステップＳ７）。命令コード５２１０，５２１２は、連想配列９００の各エントリ（呼出式に含まれる１以上の引数それぞれについてのエントリ）に、引数名と、当該引数に設定する値（実引数）とを関連付ける関連付情報９０４を格納するための命令コードである。
【００９３】
連想配列９００の各エントリの関連付情報９０４は、引数名を示す情報と、値（実引数）を示す情報とを含む。より特定的には、引数名を示す情報は、当該引数名が格納される記憶領域のアドレス９０１を含む。値を示す情報は、当該値が格納される記憶領域のアドレス９０２を含む。
【００９４】
呼出コード生成部２７３は、呼出式５５０を、１以上の引数名が連想配列９００の識別子に変更されたＰＯＵ６０１を呼出すための呼出命令コード５２２を生成する（ステップＳ９）。ここでは、呼出命令コード５２２は、連想配列９００の記憶領域の先頭アドレスを示す情報（“tmp7”など）を、連想配列９００の識別子とする。
【００９５】
また、コード生成部２７１は、ＰＯＵ６０１から元のプログラムbarの処理に復帰したときに仮引数（出力変数out3）に渡される値（すなわち、領域Ｔ３に格納された値）を、連想配列を介して一時領域８００の領域Ｔ３から読出すことを含む処理のコード５０４、および一時領域８００を解放（すなわち連想配列の領域を解放）する解放命令コード５２３を生成する（ステップＳ１１）。その後、ステップＳ１２に移行する。
【００９６】
このように、コンパイラ部２６３は、ＰＯＵ６０１を呼出す側のユーザープログラム６００中で呼出されるＰＯＵ毎に、当該ＰＯＵの仮引数の個数に相当するエントリを有する連想配列を作成するコード５０３，５２１０〜５２１２と、連想配列を用いてＰＯＵをライブラリから呼出す呼出命令コード５２２とを含む中間コードを生成する。
【００９７】
また、命令コード５２１０，５２１２が実行されることで生成される連想配列９００の各エントリには、関連付情報９０４として、引数名または値（実引数）そのものではなく、プログラム実行時にそれらが格納されている領域のアドレスが設定される。発明の背景として、一般的に記憶領域をアクセスするためのアドレス長は固定長であるから、データ長がまちまちとなり得る引数名または値（実引数）を格納する場合に比較して、このように領域のアドレスを格納することは連想配列９００に必要な記憶領域の節約を可能にする。
【００９８】
また、呼出命令コード５２２は、連想配列９００の記憶領域の先頭アドレスを、連想配列９００の識別子とするから、当該先頭アドレスを用いた直接アドレス指定が可能となり、連想配列９００に固有の名前を付ける方法に比較して、連想配列９００の検索（読書き）が容易となる。
【００９９】
（Ｈ−３．呼出毎連想配列のフローチャート（呼出される側））
図１２は、本発明の実施の形態に係る呼出毎連想配列の方法に従う呼出される側の中間コードの生成処理の一例を示すフローチャートである。図１２を参照して、プログラムbarなどによりライブラリ１１３から呼出されるＰＯＵ６０１に関連した中間コードを生成する処理を説明する。
【０１００】
設定コード生成部２７４は、コンパイラ部２６３によるＰＯＵのコンパイル時に、ステップＳ１３〜Ｓ１９の処理において設定命令コード５３２を生成する。設定命令コード５３２は、ＰＯＵ６０１の処理を示す命令コード５４３の実行前において実行されるような命令コードであって、例えばＰＯＵの処理の開始直後に実行される。
【０１０１】
具体的には、設定コード生成部２７４は、ＰＯＵ６０１が有する１以上の引数のそれぞれについて、連想配列９００に当該引数の引数名に対応の関連付情報９０４が格納されているときは、当該引数に関連付情報の値（実引数）を設定し、関連付情報９０４が格納されていないときは、当該引数に所定値を設定するための設定命令コード５３２を生成する。
【０１０２】
設定命令コード５３２は、ＰＯＵの仮引数の個数（例えばＮ個）だけ、当該仮引数名（変数名）をキーに連想配列９００を検索し（ステップＳ１３、Ｓ１５）、エントリのうち、アドレス９０１の領域に格納されている引数名と一致するエントリを特定し、特定したエントリのアドレス９０２で指定される領域から読出した値を、当該仮引数の変数に設定する（ステップＳ１７，Ｓ１９）命令コードを含む。また、設定命令コード５３２は、アドレス９０２の領域から読出された値がNULLであると判定したとき（ステップＳ１５でＮＯ）、当該仮引数の変数の値は省略されたとして扱う（ステップＳ１９）ことを指示する命令コードも含む。ステップＳ１９では、例えば当該仮引数の変数にデフォルト値を設定する命令コード、またはエラーを出力するなどの命令コードが生成され得る。
【０１０３】
なお、ステップＳ１７で生成される設定命令コード５３２は、仮引数に対応する変数の種類に応じて当該仮引数に設定される値を異ならせるための命令コードを含む。例えば、変数の種類が、入力変数であればアドレス９０２の領域から値を取得する命令コード、また、入出力変数であれば変数の値が格納される領域のアドレスを取得する命令コード、また、出力変数であればＰＯＵ６０１からの出力（戻り値）を格納する領域のアドレスを取得する命令コードを含む。
【０１０４】
このように、ＰＬＣ１００でユーザープログラム６００の呼出命令コード５２２が実行されて、ライブラリ１１３からＰＯＵ６０１が呼出された場合に、ＰＯＵ６０１の本来の処理である命令コード５４３が実行される前に、処理に必要な変数（引数）の全てに値（実引数値またはデフォルト値など）を設定することができる。これにより、命令コード５４３を実行中に仮引数に何らの値も設定されないことによる実行時エラーを回避することができる。
【０１０５】
（Ｈ−４．呼出毎連想配列のフローチャートの変形例）
図１３は、本発明の実施の形態に係る呼出毎連想配列の方法に従う呼出し側の中間コードの生成処理の他の例を示すフローチャートである。図１４は、図１３の処理に用いられる一時領域８００と連想配列９００の内容の一例を模式的に示す図である。図１５は、本発明の実施の形態に係る呼出毎連想配列の方法に従う呼出される側の中間コードの生成処理の他の例を示すフローチャートである。
【０１０６】
図１３の処理のうち、ステップＳ７ａは図１０のステップＳ７とは異なるが、他の処理は図１０と同じであるので説明は繰返さない。
【０１０７】
図１３のステップＳ７ａでは、構造体コード生成部２７２は、連想配列９００の各エントリに、アドレス９０１と、実引数評価値を格納した領域のアドレス９０３とを設定する命令コードを生成する。ステップＳ７ａでは、アドレス９０３として、関連付けられた引数が表す変数の型に基づき、当該値が格納される記憶領域のアドレスまたは当該値そのもの一方を設定する命令コードを生成する。
【０１０８】
具体的には、構造体コード生成部２７２は、仮引数が入力変数に対応する場合、入力変数の型が連想配列９００のアドレス９０３の幅以下の領域で収まる型であるときは、構造体コード生成部２７２はアドレス９０３に、アドレスではなく入力変数in1の値そのものを格納する命令コードを生成し、入力変数の型が連想配列９００のアドレス９０３の幅以下の領域で収まる型でないときは、評価値格納の領域Ｔ１へのアドレスを格納するための命令コードを生成する。
【０１０９】
仮引数が入出力変数に対応する場合、構造体コード生成部２７２は、対応のアドレス９０３に入出力変数inout2の値を格納するアドレス（ｃ［i］のアドレス）を格納するための命令コードを生成する。仮引数が出力変数に対応する場合、ＰＯＵ６０１からの出力を格納する領域のアドレスを格納するための命令コードを生成する。
【０１１０】
次に、図１５を参照して、呼出される側の処理を説明する。図１５の処理のうち、ステップＳ１７ａは図１２のステップＳ１７とは異なるが、他の処理は図１２と同じであるので説明は繰返さない。図１５のステップＳ１７ａでは、上記に述べたステップＳ７ａにおいて、変数の種類に応じて連想配列９００のエントリに格納される内容を異ならせていることに伴い、設定コード生成部２７４は、連想配列９００から取得する値の扱いを異ならせる命令コードを生成する。
【０１１１】
ステップＳ１７ａで生成される設定命令コード５３２は、仮引数に対応する変数の種類に応じて当該仮引数に設定される値を異ならせるための命令コードを含む。例えば、入力変数であれば、当該入力変数の型がアドレス幅以下の領域で収まる型の場合、エントリから値を取得し、そうでない場合、評価値を格納する領域Ｔ１へのアドレスとして扱い、領域Ｔ１から値を取得する命令コードを含む。また、入出力変数であれば、変数の値が格納される領域のアドレスを取得する命令コードを含む。また、出力変数でれば、ＰＯＵ６０１からの出力（戻り値）を格納する領域Ｔ３のアドレスを取得する命令コードを含む。
【０１１２】
図１３、図１４および図１５に示す変形例によれば、呼出されるＰＯＵ６０１の仮引数の変数の種類と変数の型により、連想配列のエントリの関連付情報９０４における実引数のデータとして格納する（または当該エントリの関連付情報９０４から取得する）内容を異ならせることができる。
【０１１３】
＜Ｉ．「種類毎連想配列」の方法＞
ユーザープログラム６００において呼出されるＰＯＵ６０１の種類毎に連想配列の領域を確保する方法を説明する。図１６は、本発明の実施の形態に係る「種類毎連想配列」の方法に従う中間コードの生成処理の一例を模式的に示すフローチャートである。
【０１１４】
図１６を参照して、コンパイラ部２６３は、ユーザープログラム６００（ソースコード６１０）を２回走査する。これを、以下では１回目の走査をパス１、２回目の走査をパス２という。
【０１１５】
パス１では、コンパイラ部２６３の呼出検出部２７０は、ユーザープログラム６００を例えば先頭から走査しながら（ステップＳ２１）、呼出式５５０を検出するかを判定する（ステップＳ２３）。呼出検出部２７０は、呼出式５５０を検出しないとき（ステップＳ２３でＮＯ）、後述するステップＳ２９に移行する。
【０１１６】
呼出検出部２７０は、呼出式５５０を検出すると（ステップＳ２３でＹＥＳ）、コンパイラ部２６３は検出された呼出式５５０からＰＯＵ６０１の種類を識別する（ステップＳ２５）。なお、ＰＯＵ６０１の種類は、呼出式５５０に含まれるＰＯＵ名称などに基いている。
【０１１７】
コンパイラ部２６３は、呼出式５５０から識別されたＰＯＵの種類毎に、ＰＯＵ６０１が有する仮引数の個数の最大数を判定する（ステップＳ２７）。その後、呼出検出部２７０はユーザープログラム６００の終端まで走査したかを判定する（ステップＳ２９）。終端まで走査していないと判定すると（ステップＳ２９でＮＯ）、ステップＳ２１に戻り、走査を継続する。
【０１１８】
呼出検出部２７０がユーザープログラム６００を終端まで走査したと判定したとき（ステップＳ２９でＹＥＳ）、コンパイラ部２６３によるＰＯＵ６０１の種類毎の仮引数の最大数が決定済みとなる。
【０１１９】
構造体コード生成部２７２は、ＰＯＵ６０１の種類毎に連想配列９００を格納する領域を確保する命令コード５２４を生成する（ステップＳ３１）。具体的には、構造体コード生成部２７２コードは、ＰＯ６０１の種類毎の連想配列について、当該種類に属するＰＯＵ６０１の仮引数の最大個数分のエントリと終端を示すエントリとを有した連想配列の領域を確保するため命令コードを生成する。これにより、パス１は終了する。
【０１２０】
コンパイラ部２６３は、パス２を実行する。パス２では、ユーザープログラム６００を走査し、コード生成部２７１は、各ＰＯＵ６０１について、パス１で確保された当該ＰＯＵ６０１の種類に対応した連想配列９００を利用して上述の「呼出毎連想配列」の方法に従い中間コードを生成する（ステップＳ３３）。これにより、パス２は終了する。
【０１２１】
図１７は、本発明の実施の形態に係る「種類毎連想配列」の方法に従い生成される連想配列の一例を模式的に示す図である。図１７を参照して、パス１により、ユーザープログラム６００（ソースコード６１０）を走査することにより、pou1、pou2、pou3の３種類のＰＯＵ６０１が検出された場合、構造体コード生成部２７２は、各種類に対応して連想配列９１０、９２０および９３０を作成するための作成命令コードを生成する。各連想配列は、対応の種類に属するＰＯＵ６０１が有する仮引数の最大個数に相当するエントリ数を有している。
【０１２２】
図１７を参照して、パス２における中間コード生成では、構造体コード生成部２７２は、ＰＯＵ呼出し毎に連想配列に値を設定する命令コードを生成する。生成される命令コードは「呼出毎連想配列」の方法と同様である。また、呼出コード生成部２７３は、各ＰＯＵ６０１を対応の連想配列を用いて呼出しコードを生成する。この場合も「呼出毎連想配列」に方法と同様に、連想配列の記憶領域の先頭アドレスを用いた呼出しコードが生成される。
【０１２３】
また、コード生成部２７１は、ＰＯＵ６０１の処理から戻った場合に、連想配列９１０、９２０，９３０の記憶領域の内容を初期化（クリア）する命令コマンドを生成する。連想配列の初期化の命令コードは、例えば、連想配列９１０、９２０，９３０の先頭のエントリにターミネータなどを設定することを指示する命令コードを含む。
【０１２４】
このように、ＰＯＵ６０１の種類毎の連想配列を、当該種類に属するＰＯＵ６０１が呼出される毎に、連想配列の関連付情報９０４の設定と初期化とを実施する命令コードが生成される。これにより、同一種類に属する各ＰＯＵ６０１について同一の連想配列を繰返し利用することが可能となる。
【０１２５】
（Ｉ−１．「種類毎連想配列」の中間コード）
図１８は、本発明の実施の形態に係る種類毎連想配列の方法に従い生成される中間コードの一例を模式的に示す図である。図１８の中間コードは、ＰＯＵ（foo）を呼出す側である図５のプログラムbarから、コード生成部２７１による種類毎連想配列の方法に従い生成された中間コード５１８の一例を示す。
【０１２６】
中間コード５１８は、ＰＯＵ６０１の仮引数の最大個数分のエントリを有した連想配列の記憶領域を確保するための命令コード５２４と、図６と同様の他の部分のコード５０３と、ＰＯＵ６０１の呼出しに関連して生成されたコード５２８とを含む。コード５２８は、ＰＯＵ６０１の呼出命令コード５２６と、連想配列の作成命令コード５２５と、連想配列の領域の初期化を指示する命令コード５２７とを含む。連想配列の作成命令コード５２５は、連想配列（“foo_arg_area”）の各エントリに関連付情報を設定する指令である、図８で示した命令コード５２１０および命令コード５２１３を含む。命令コード５２１３は、連想配列に関連付情報を格納することを指示する命令コードであり、連想配列の識別子は異なるが図８の命令コード５２１２と同様であるので説明は繰返さない。
【０１２７】
命令コード５２４は、連想配列の識別子（“foo_arg_area”）を指定して、引数の最大個数（例えば４個）分の領域（エントリ）と配列の終端（ターミネータ）を示すデータ（例えば、NULL）を格納する領域を確保するための命令を示す。
【０１２８】
呼出命令コード５２６は、連想配列の識別子（“foo_arg_area”）を用いてＰＯＵ６０１を呼出すための命令を表す。
【０１２９】
また、命令コード５２７は、ＰＯＵ６０１の処理が終了するときに、連想配列の記憶領域を初期化するための命令を表す。
【０１３０】
このように、「種類毎連想配列」の方法に従う中間コードでは、呼出されたＰＯＵ６０１の処理が終了する都度、当該ＰＯＵの種類に該当する連想配列を初期化する命令コード５２４を含めることで、連想配列を同一種類の複数のＰＯＵ６０１で共用することが可能になる。したがって、「呼出毎連想配列」の中間コードのようにＰＯＵの呼出し毎に連想配列の領域を確保する処理、およびＰＯＵ６０１の処理が終了する都度、連想配列の記憶領域を解放する処理を省略することができる。
【０１３１】
本実施の形態では、「種類毎連想配列」で生成される中間コードは、ビルド単位(一般に中間コード７００のファイルがリンクされた単位）で、連想配列の記憶領域をＰＬＣ１００の静的記憶領域に確保する命令コードを含んでもよい。この静的記憶領域は、ビルド単位のユーザープログラム６００の中間コードを、ＰＬＣ１００にロードされた時から削除される時まで保持することを可能にする記憶領域である。したがって、同一のビルド単位では、上記のパス１の実行回数を１回にすませることができる。
【０１３２】
「種類毎連想配列」で生成される中間コードは、連想配列の記憶領域を、ビルド単位内のみからの参照（またはデータの読み書き）を許可し、ビルド単位外から参照（またはデータの読み書き）は禁止するための命令コードを含んでもよい。これにより、連想配列は、上記の静的記憶領域に保持されるとしても、ビルド単位外からのデータの読書きはなされないので、連想配列内のデータの予期しない、または意図しない変更を防止することができる。
【０１３３】
また、「種類毎連想配列」で生成される中間コードは、同一種のＰＯＵ６０１が使用する連想配列について排他制御を実施するための命令コードを含んでもよい。種類毎連想配列について、排他制御が実施されることにより、ビルド単位内で同一種のＰＯＵ６０１を呼出して並列に実行させることが可能となる。
【０１３４】
また、「種類毎連想配列」で生成される中間コードは、連想配列の内容（関連付情報９０４）の退避/復帰などの処理を実施するための命令コードと、再帰的に同一種のＰＯＵ６０１を呼出す命令コードとを含んでもよい。これにより、連想配列の内容の退避/復帰の処理を実施しながら、同一種類のＰＯＵの再帰的呼出しが可能となる。
【０１３５】
＜Ｊ．組込関数＞
図１９は、本発明の実施の形態に係る組込関数５７０の呼出しの書式と内容を模式的に示す図である。
【０１３６】
本実施の形態では、ユーザーは、プログラム作成部２６１を用いてＰＯＵ６０１内に図１９の組込関数５７０（関数名はisArgSpecified）を記述することができる。
【０１３７】
上記に述べたように、実引数が省略されるときは、引数にはデフォルト値またはエラーを表す値が設定される（ステップＳ１９を参照）ので、呼出されるＰＯＵ６０１は、このような設定値から省略がなされたことを判定できるが、この判定方法は設定命令コード５３２（設定コード生成部２７４）の内容に依存する。これに対して、組込関数５７０を用いた判定方法は、設定命令コード５３２（設定コード生成部２７４）の内容に依存せずに、ＰＯＵ６０１は、組込関数５７０が実行されることで、実引数が設定（または省略）されているかの設定内容を判定することができる。
【０１３８】
したがって、ユーザーはＰＯＵ６０１に組込関数５７０を記載することで、設定命令コード５３２（設定コード生成部２７４）の内容に依存せずに、組込関数５７０の判定結果（戻り値）に基づき、実引数が省略された場合の明示的な処理を実行させるようなプログラミングが可能となる。また、実引数が省略された場合にデフォルト値が設定されるケースでは、実際に実引数が省略されたのか、または実引数（実引数は省略されておらず）にデフォルト値が設定されたのかを示す設定内容を、組込関数５７０を用いて判定することも可能となる。
【０１３９】
＜Ｋ．プログラム＞
本実施の形態に示した各フローチャートの処理を含むコンパイラ部２６３の処理を実行するためのサポートプログラムは、サポート装置２００の記憶部（ＲＯＭ２０４、ＲＡＭ２０６、ＨＤＤ２０８、記録媒体２５０など）に格納されている。ＣＰＵ２０２は、記憶部からサポートプログラムを読出し、実行することにより、本実施の形態で説明したコード生成部２７１を含むコンパイラ部２６３を実現することが可能となる。
【０１４０】
このようなサポートプログラムは、サポート装置２００に付属するフレキシブルディスク、ＣＤ−ＲＯＭ（Compact  Disk-Read  Only  Memory）、ＲＯＭ、ＲＡＭおよび記録媒体２５０などのコンピュータ読取り可能な記録媒体にて記録させて、プログラム製品として提供することもできる。あるいは、サポート装置２００に内蔵するＨＤＤ２０８などの記録媒体にて記録させて、プログラムを提供することもできる。また、図示しないネットワークから通信インターフェイスを介したダウンロードによって、プログラムを提供することもできる。
【０１４１】
＜Ｌ．変形例＞
上記の実施の形態では、構造体コード生成部２７２は、呼出式５５０に引数が無い場合であっても、作成命令コード５２１、５２５を生成することができる。この場合、作成命令コード５２１、５２５は、仮引数名のアドレス９０１として終端（ターミネータ）データ（例えば、NULL）および対応の設定する値のアドレス９０２としてＮ／Ａの値を有した関連付情報９０４のみを格納する連想配列９００の作成を指示する命令コードを含む。設定コード生成部２７４は、このような終端データの関連付情報９０４のみを格納した連想配列９００については予め定められた仕様に従う処理を実行させる命令コードを生成する。また、呼出されるＰＯＵ６０１の引数が０個であるときは、設定コード生成部２７４は、例えば、予め定められた仕様に従う処理を実行させる命令コードを生成する。
【０１４２】
＜Ｍ．利点＞
本実施の形態によれば、各ＰＬＣ１００のライブラリ１１３に格納されるＰＯＵ６０１の種類に依存せずに、異なるＰＬＣ１００間で、ユーザープログラム６００（すなわち実行可能形式コード（中間コード７００））をコピーして利用することが可能となる、いわゆるユーザープログラム６００のバイナリ互換性を確保することができる。
【０１４３】
また、コード生成部２７１により、ユーザープログラム６００から後方互換性を有した実行可能形式コード（中間コード７００）を生成することが可能となる。すなわち、制御装置においてユーザープログラム６００を実行するプロセッサまたはＯＳ（Operating System）などのプログラム実行環境にバージョンアップの変更があった（例えば、制御装置で呼出されるＰＯＵの引数に変更があった）場合、元の実行可能形式コードを変化後の実行環境に対応したバージョンに変更せずとも、ＰＬＣ１００では変化後のプロセッサまたはＯＳのもとで元の実行可能形式コード（中間コード７００）を実行することができる。
【０１４４】
また、上記の互換性をさらに説明する。図２０は、本実施の形態により奏される利点の一例を模式的に示す図である。図２０を参照して、ライブラリ１１３には、入力の引数が変数in1〜in3であるＰＯＵ６０１−１が登録されて、ユーザープログラム６００は呼出式５５０−１を含む場合は、図示されるように両者の引数の個数と引数名は一致するので、呼出命令コード５２２または５２６が実行されたときは、従来と同様に、ユーザープログラム６００の実行中にＰＯＵ６０１−１を呼出してその単位プログラムを実行することができる。
【０１４５】
これに対して、ライブラリ１１３には、入力の引数が変数in1〜in4であるＰＯＵ６０１−２が登録されて、ユーザープログラム６００は呼出式５５０−１を含む場合は、図示されるように入力変数in4の引数において両者の引数の個数と引数名は一致しない。したがって、呼出式５５０−１を変換した呼出命令コード５２２または５２６が実行されたときは、入力変数in4の仮引数に対応の実引数は存在しないので、当該仮引数に設定するべき値（実引数）は省略されたとして、例えばデフォルト値が設定される（例えば、図１２のステップＳ１５およびステップＳ１９の命令コードが実行される）。
【０１４６】
また、図２０を参照して、ライブラリ１１３には、入力の引数が変数in1〜in4であるＰＯＵ６０１−２が登録されて、ユーザープログラム６００は呼出式５５０−２を含む場合は、図示されるように両者の引数の個数と引数名は一致するので、呼出式５５０−２を変換した呼出命令コード５２２または５２６が実行されたときは、従来と同様に、ユーザープログラム６００の実行中にＰＯＵ６０１−２を呼出してその単位プログラムを実行することができる。
【０１４７】
これに対して、ライブラリ１１３には、入力の引数が変数in1〜in3であるＰＯＵ６０１−１が登録されて、ユーザープログラム６００は呼出式５５０−２を含む場合は、図示されるように入力変数in4の引数において両者の引数の個数と引数名は一致しない。したがって、ユーザープログラム６００の実行中に呼出式５５０−２を変換した呼出命令コード５２２または５２６が実行されたときは、入力変数in4の仮引数に対応の実引数は無視される。
【０１４８】
図２０で示すように、ユーザープログラム６００で記載される呼出式５５０が含む仮引数の個数および引数名に依存せずに、また、ライブラリ１１３に登録されるＰＯＵ６０１の引数の個数および引数名に依存せずに、ＰＬＣ１００では、ＰＯＵ６０１を呼出しながらユーザープログラム６００を実行することができる。これにより、本実施の形態では、ユーザープログラム６００の実行可能形式コードの互換性であるバイナリ互換性、およびＰＯＵ互換性を提供することができる。
【０１４９】
また、このことは、各ＰＬＣ１００が有する実行可能形式コードのバージョン管理を容易化する。また、ユーザーは、ＰＬＣ１００のライブラリ１１３に登録されているＰＯＵ６０１は利用可能なバージョンであるかなどを意識せずとも、サポート装置２００においてユーザープログラム６００を開発することができる。
【０１５０】
＜Ｎ．付記＞
上述したような本実施の形態は、以下のような技術思想を含む。
［構成１］
制御対象を制御する制御装置（１００）で実行されるユーザープログラム（６００）の開発を支援するサポート装置（２００）であって、
前記ユーザープログラムを走査し、当該ユーザープログラムから当該ユーザープログラムを構成する呼出し可能な単位プログラム（６０１）を呼出すための呼出式（５５０）を検出する呼出検出部（２７０）と、
前記ユーザープログラムから前記制御装置で実行可能な形式のコード（７００）を生成するコード生成部（２７１）と、を備え、
前記コード生成部は、
前記呼出式について、引数名と、当該引数に設定する値とを関連付けるための関連付情報（９０４）を格納する構造体（９００）を作成するための作成命令コードを生成する構造体コード生成部（２７２）と、
前記呼出式を、前記構造体の識別子を用いて当該単位プログラムを呼出すための呼出命令コード（５２２，５２６）に変換する呼出コード生成部（２７３）と、
前記単位プログラムが１以上の引数が有する場合に、各引数について、前記構造体に当該引数の引数名に対応の前記関連付情報が格納されているときは、当該引数に前記関連付情報の前記値を設定し、前記関連付情報が格納されていないときは、当該引数に所定値を設定するための設定命令コードを生成する設定コード生成部（２７４）と、を含む、サポート装置。
［構成２］
前記構造体コード生成部は、
前記呼出検出部により前記単位プログラムの呼出式が検出される毎に、前記構造体を作成するための前記作成命令コードを生成する、構成１に記載のサポート装置。
［構成３］
前記構造体コード生成部は、
前記呼出検出部が検出する前記呼出式により呼出される前記単位プログラムの種類毎に、前記構造体を作成するための前記作成命令コードを生成する、構成１に記載のサポート装置。
［構成４］
前記関連付情報は、前記引数名を示す情報（９０１）と、前記値を示す情報（９０２，９０３）とを含み、
前記引数名を示す情報は、当該引数名が格納される記憶領域のアドレスを含み、
前記値を示す情報は、当該値が格納される記憶領域（８００）のアドレスを含む、構成１から３のいずれか１に記載のサポート装置。
［構成５］
前記引数は、前記ユーザープログラムで用いられる変数を表し、
前記値を示す情報は、関連付けされる前記引数が表す変数の型に基づき、当該値が格納される記憶領域のアドレスまたは当該値の一方を含む、構成４に記載のサポート装置。
［構成６］
前記単位プログラムは、当該単位プログラムの各引数の設定内容を判定する関数を含む、構成１から５のいずれか１に記載のサポート装置。
［構成７］
前記呼出コード生成部は、前記構造体の識別子として、当該構造体が格納される領域のアドレスを用いて、前記呼出し式を前記呼出命令コード（５２２、５２６）に変換する、構成１から６のいずれか１に記載のサポート装置。
［構成８］
前記コード生成部は、
前記単位プログラムが引数を有しない場合に、予め定められた処理を実行させる命令コードを生成する、構成１から７のいずれか１に記載のサポート装置。
［構成９］
制御対象を制御する制御装置で実行されるユーザープログラムの開発を支援するサポート装置を実現するためのサポートプログラムであって、前記サポートプログラムは、コンピュータを、
前記ユーザープログラムを走査し、当該ユーザープログラムから当該ユーザープログラムを構成する呼出し可能な単位プログラムを呼出すための呼出式を検出する呼出検出部と、
前記ユーザープログラムから前記制御装置で実行可能な形式のコードを生成するコード生成部として機能させ、
前記コード生成部は、
前記呼出式について、引数名と、当該引数に設定する値とを関連付けるための関連付情報を格納する構造体を作成するための作成命令コードを生成する構造体コード生成部と、
前記呼出式を、前記構造体の識別子を用いて当該単位プログラムを呼出すための呼出命令コードに変換する呼出コード生成部と、
前記単位プログラムが１以上の引数が有する場合に、各引数について、前記構造体に当該引数の引数名に対応の前記関連付情報が格納されているときは、当該引数に前記関連付情報の前記値を設定し、前記関連付情報が格納されていないときは、当該引数に所定値を設定するための命令コードを生成する設定コード生成部と、を含む、サポートプログラム。
【０１５１】
今回開示された実施の形態はすべての点で例示であって制限的なものではないと考えられるべきである。本発明の範囲は、上記した説明ではなく、特許請求の範囲によって示され、特許請求の範囲と均等の意味および範囲内でのすべての変更が含まれることが意図される。
【符号の説明】
【０１５２】
１  ＰＬＣシステム、１１  システムバス、１２  電源ユニット、１０２  プロセッサ、１０４  チップセット、１０６  メインメモリ、１０８  フラッシュメモリ、１１０  システムプログラム、１１３  ライブラリ、１１６  外部ネットワークコントローラ、１１８  メモリカードインターフェイス、１２０  メモリカード、１２２  内部バスコントローラ、１２４  フィールドバスコントローラ、２００  サポート装置、２０４  ＲＯＭ、２０６  ＲＡＭ、２１０  キーボード、２１２  マウス、２１４  ディスプレイ、２１６  転送部、２１７  記録媒体読取装置、２１８  通信インターフェイス、２５０  記録媒体、２６０  プログラム開発部、２６１  プログラム作成部、２６２  プログラム編集部、２６３  コンパイラ部、２７０  呼出検出部、２７１  コード生成部、２７２  構造体コード生成部、２７３  呼出コード生成部、２７４  設定コード生成部、５２１，５２５  作成命令コード、５２２，５２６  呼出命令コード、５２３  解放命令コード、５３２  設定命令コード、５５０  呼出式、５７０  組込関数、６００  ユーザープログラム、６００Ａ  シーケンスプログラム、６００Ｂ  モーションプログラム、６１０  ソースコード、８００  一時領域、９００，９１０  連想配列、９０４  関連付情報、Ｔ１，Ｔ２，Ｔ３  領域。
【図１】
2019159361.tif 000003
【図２】
2019159361.tif 000004
【図３】
2019159361.tif 000005
【図４】
2019159361.tif 000006
【図５】
2019159361.tif 000007
【図６】
2019159361.tif 000008
【図７】
2019159361.tif 000009
【図８】
2019159361.tif 000010
【図９】
2019159361.tif 000011
【図１０】
2019159361.tif 000012
【図１１】
2019159361.tif 000013
【図１２】
2019159361.tif 000014
【図１３】
2019159361.tif 000015
【図１４】
2019159361.tif 000016
【図１５】
2019159361.tif 000017
【図１６】
2019159361.tif 000018
【図１７】
2019159361.tif 000019
【図１８】
2019159361.tif 000020
【図１９】
2019159361.tif 000021
【図２０】
2019159361.tif 000022