以下、本開示の実施の形態に係るプログラミング支援装置について、図面を参照しつつ詳細に説明する。このプログラミング支援装置は、非オブジェクト指向のソースコードをオブジェクト指向のソースコードに変換することにより、プログラマブルコントローラの動作プログラムの作成を支援する装置である。
実施の形態1.
本実施の形態に係るプログラミング支援装置10は、ソースコードを編集するためのエンジニアリングツールとして機能するソフトウェアを実行可能な産業用PC(Personal Computer)又はネットワーク上のサーバ装置である。プログラミング支援装置10は、図1に示されるように、記憶装置200に格納されるプロジェクトデータ20のうちの第1ソースコード21を読み出し、読み出した第1ソースコード21に基づいて第2ソースコード22を生成して、生成した第2ソースコード22をプロジェクトデータ20内に書き込む。
記憶装置200は、プログラミング支援装置10に脱着可能なメモリーカードであってもよいし、ネットワークを経由してプログラミング支援装置10に接続される装置であってもよい。また、図1では、記憶装置200がプログラミング支援装置10の外部に配置されているが、プログラミング支援装置10が記憶装置200を内蔵してもよい。
プロジェクトデータ20は、プログラマブルコントローラによって用いられるデータの集合であって、プログラマブルコントローラを動作させるための動作プログラムを含む。プロジェクトデータ20に含まれる動作プログラムは、1つであってもよいし複数であってもよい。動作プログラムは、プログラマブルコントローラによって直接実行されるオブジェクトファイルの他に、当該オブジェクトファイルを得るためにコンパイルの対象となる種々のソースコードを含む。また、動作プログラムは、プログラマブルコントローラによって最初に実行される単一のプログラムの他に、適宜参照される外部プログラム及びライブラリデータを含む。
プロジェクトデータ20は、動作プログラムとして、第1ソースコード21、第2ソースコード22、及び、実行プログラム23を含む。第1ソースコード21及び実行プログラム23は、エンジニアリングツールを用いてユーザによって作成される。
第1ソースコード21は、非オブジェクト指向のサブルーチンに相当するファンクションブロックの定義が記述されたデータである。ファンクションブロックは、他のプログラムから呼び出されることにより予め規定された機能を発揮するための再利用可能な一又は複数の命令である。第1ソースコード21において定義されるファンクションブロックは、IEC61131-3第2版で規定されたファンクションブロックであってもよいし、IEC61131-3規格で規定されたファンクションであってもよいし、サブルーチンに相当する他のプログラミング言語要素であってもよい。以下では、ファンクションブロックを適宜FBと表記し、IEC61131-3規格をIEC規格と略記することがある。また、非オブジェクト指向のFBを従来型FBと適宜表記する。第1ソースコード21に含まれるFBは、従来型FBである。
第2ソースコード22は、オブジェクト指向のFBの定義が記述されたデータである。詳細には、第2ソースコード22には、メソッドを有するオブジェクト指向FBの定義が記述される。メソッドは、他のプログラムから呼び出されることにより予め機能を発揮するための再利用可能な一又は複数の命令である点では従来型FBと類似するが、宣言されたオブジェクト指向FBのインスタンスのメンバ関数として呼び出される点で、従来型FBとは異なる。従来型FBが、1つのまとまった機能に対応する一方で、オブジェクト指向FBは、機能に相当するメソッドを複数含み得る。第2ソースコード22において定義されるオブジェクト指向FBは、IEC規格の第3版で規定されたものであってもよいし、同第3版で規定されたクラスであってもよいし、メソッドを有する他のプログラミング言語要素であってもよい。
従来型FBは、サブルーチンであるファンクションブロックの機能が、当該ファンクションブロックに含まれる一又は複数のメソッドとは異なる形式で記述される第1ファンクションブロックの一例に相当する。また、オブジェクト指向FBは、その機能がメソッドとして記述される第2ファンクションブロックの一例に相当する。
実行プログラム23は、第1ソースコード21にて定義された従来型FBのインスタンスを使用する動作プログラムである。第1ソースコード21、第2ソースコード22及び実行プログラム23を記述するプログラミング言語として、IEC規格で規定されたインストラクションリスト、ストラクチャードテキスト、ラダーダイアグラム、ファンクションブロックダイアグラム、及びシーケンシャルファンクションチャートのいずれを採用してもよいし、他の言語を採用してもよい。
プログラミング支援装置10は、第1ソースコード21から第2ソースコード22を生成するエンジニアリングツールを実行するコンピュータとして構成される。詳細には、プログラミング支援装置10は、ハードウェア構成として、図2に示されるように、プロセッサ31と、主記憶部32と、補助記憶部33と、入力部34と、出力部35と、通信部36と、を有する。主記憶部32、補助記憶部33、入力部34、出力部35及び通信部36はいずれも、内部バス37を介してプロセッサ31に接続される。
プロセッサ31は、処理回路としてのCPU(Central Processing Unit)を含む。プロセッサ31は、補助記憶部33に記憶されるプログラムP1を実行することにより、プログラミング支援装置10の種々の機能を実現して、後述の処理を実行する。
主記憶部32は、RAM(Random Access Memory)を含む。主記憶部32には、補助記憶部33からプログラムP1がロードされる。そして、主記憶部32は、プロセッサ31の作業領域として用いられる。プログラムP1は、エンジニアリングツールに相当し、第2ソースコード22を生成するプログラミング支援プログラムの一例に相当する。なお、図2では1つのプログラムP1が代表的に示されているが、複数のプログラムP1があってもよい。
補助記憶部33は、EEPROM(Electrically Erasable Programmable Read-Only Memory)及びHDD(Hard Disk Drive)に代表される不揮発性メモリを含む。補助記憶部33は、プログラムP1の他に、プロセッサ31の処理に用いられる種々のデータを記憶する。補助記憶部33は、プロセッサ31の指示に従って、プロセッサ31によって利用されるデータをプロセッサ31に供給し、プロセッサ31から供給されたデータを記憶する。
入力部34は、キーボード及びポインティングデバイスに代表される入力デバイスを含む。入力部34は、プログラミング支援装置10のユーザによって入力された情報を取得して、取得した情報をプロセッサ31に通知する。
出力部35は、LCD(Liquid Crystal Display)及びスピーカに代表される出力デバイスを含む。出力部35は、プロセッサ31の指示に従って、種々の情報をユーザに提示する。
通信部36は、外部の装置と通信するためのネットワークインタフェース回路を有する。通信部36は、外部から信号を受信して、この信号により示される情報をプロセッサ31へ出力する。また、通信部36は、プロセッサ31から出力された情報を示す信号を外部の装置へ送信する。
なお、入力部34及び出力部35は、プログラミング支援装置10のUI(User Interface)に相当する。ただし、プログラミング支援装置10は、通信部36を介して外部のUI装置と接続されて、通信部36を介して、ユーザからの情報を取得するとともにユーザに情報を提供してもよい。入力部34及び出力部35に代えて外部のUI装置と協働する通信部36がプログラミング支援装置10のUIとして用いられる場合には、入力部34及び出力部35が省略されてもよい。また、プログラミング支援装置10が外部の装置と通信することのないスタンドアロン装置である場合には、通信部36が省略されてもよい。
図1に戻り、プログラミング支援装置10は、上述のハードウェア構成が協働することで実現される機能的な構成を有する。詳細には、プログラミング支援装置10は、第1ソースコード21を取得する取得部11と、UI部12と、ユーザからの入力に基づいて第2ソースコード22を生成する生成部13と、
を有する。
取得部11は、主としてプロセッサ31によって実現される。なお、取得部11が記憶装置200との通信により第1ソースコード21を取得する場合には、取得部11は、プロセッサ31及び通信部36の協働により実現される。取得部11は、ユーザから指定された記憶装置200のアドレスからプロジェクトデータ20を読み出して第1ソースコード21を取得する。また、取得部11は、読み出したプロジェクトデータ20をUI部12に出力し、第1ソースコード21を生成部13に出力する。取得部11は、プログラミング支援装置10において、動作プログラムの第1ソースコードを取得する取得手段の一例に相当する。
UI部12は、主として入力部34及び出力部35の協働により実現されてもよいし、上述のように外部のUI装置と協働する通信部36によって実現されてもよい。UI部12は、プロジェクトデータ20の構成を表示して、オブジェクト指向FBのメソッドに置換すべき従来型FBの選択をユーザから受け付ける。
図3の例では、UI部12の画面120に、「プロジェクトA」を構成するファンクションブロックの一覧として、「位置決めデータ設定」という従来型FB211、「位置決め運転始動」という従来型FB212、及び、「温度調整開始」という従来型FB213が表示されている。この一覧から、1つ以上の従来型FBが選択され得る。図3では、ユーザによって選択された従来型FB211,211にハッチングが付されている。
UI部12は、従来型FB211,212が選択されると、選択された従来型FB211,212に関する操作のリストを含むサブメニュー121を表示する。このサブメニュー121において「オブジェクト指向拡張」という操作が選択されると、UI部12は、オブジェクト指向FBに変換すべき対象としての従来型FB211,212の選択を受け付ける。UI部12は、プログラミング支援装置10において、第1ソースコードに含まれるファンクションブロックから第1ファンクションブロックの選択を受け付ける受付手段の一例に相当する。
そして、UI部12は、選択された従来型FBの変数のうちの、オブジェクト指向FBのメンバ変数として共通化すべき変数の選択を受け付ける。図4の例では、画面120に、新たに作成されるオブジェクト指向FBの名称を入力するための入力欄122と、従来型FBに含まれる変数を示すテーブル123と、が表示される。ここで、従来型FB211は、図5の左側に示されるように、「ユニット情報」という変数2111及び「データNo」という変数2112それぞれの宣言を含み、従来型FB212は、「ユニット情報」という変数2121及び「始動No」という変数2122それぞれの宣言を含む。
図4のテーブル123は、これらの変数2111,2112,2121,2122を一覧表示する。このテーブル123は、共通化すべき変数を選択するためのチェックボックス列124を含む。ユーザによってチェックボックスにチェックが付されることで選択された変数については、オブジェクト指向FBにおいて共通化される変数の名称が、列125においてユーザにより設定される。図4の例では、従来型FB211,212それぞれの「ユニット情報」という変数2111,2121が、実質的に同一の変数であるため、新たに作成される「位置決めユニット」という名称のオブジェクト指向FBにおいて「ユニット情報」という変数に統合されることが示されている。なお、「データNo」という変数2112と「始動No」という変数2122については、従来型FB211,212それぞれに固有の異なる情報であるため、共通化の設定はなされない。ユーザがボタン126を押下することで、従来型FBの選択及び共通化すべき変数の設定が完了する。
図1に戻り、生成部13は、主としてプロセッサ31によって実現される。生成部13は、UI部12を用いてユーザにより設定された内容に基づいて、第1ソースコード21から第2ソースコード22を生成する。
詳細には、図5の右側に示されるように、新たに作成されるオブジェクト指向FB220は、従来型FB211に対応するメソッド221と、従来型FB212に対応するメソッド222と、を有する。メソッド221の機能を特定するロジック記述2212は、対応する従来型FB211のロジック記述2113と同等の内容を有する。メソッド222の機能を特定するロジック記述2222は、対応する従来型FB212のロジック記述2123と同等の内容を有する。
また、オブジェクト指向FB220は、従来型FB211,212の変数2111,2121が統合された共通化変数2201の宣言を含む。メソッド221は、対応する従来型FB211の変数2111,2112のうちの、共通化変数の設定から除外された変数2112に対応する変数2211の宣言を含む。メソッド222は、対応する従来型FB212の変数2121,2122のうちの、共通化変数の設定から除外された変数2122に対応する変数2221の宣言を含む。
そして、生成部13は、生成した第2ソースコード22を記憶装置200に出力する。生成部13は、プログラミング支援装置10において、第1ソースコードにおいて記述された第1ファンクションブロックを第2ファンクションブロックに置換することで、プログラマブルコントローラを動作させるための動作プログラムの第2ソースコードを生成する生成手段の一例に相当する。
続いて、プログラミング支援装置10によって実行される支援処理について、図6,7を用いて説明する。この支援処理は、ユーザによる特定の操作により開始する。支援処理は、動作プログラムの作成を支援するプログラミング支援方法の一例に相当する。
支援処理において、プログラミング支援装置10の取得部11は、図6に示されるように、第1ソースコード21を取得する(ステップS1)。そして、UI部12は、ステップS1で取得された第1ソースコード21のうちの従来型FBの選択を受け付けて(ステップS2)、ステップS2で選択された従来型FBの変数のうちの共通化すべき変数の選択を受け付ける(ステップS3)。
次に、生成部13が、ステップS1で取得された第1ソースコード21から、ステップS2,S3で受け付けられた選択に基づいて第2ソースコード22を生成する生成処理を実行する(ステップS4)。生成処理が完了すると、生成部13は、生成した第2ソースコード22を出力する(ステップS5)。その後、支援処理が終了する。
図7には、ステップS4の生成処理の詳細が示されている。図7に示されるように、生成処理では、生成部13が、空のオブジェクト指向FBを生成し(ステップS11)、生成したオブジェクト指向FBに、ステップS3で設定された共通化変数を登録する(ステップS12)。これにより、図5の例では、共通化変数2201を宣言する記述がオブジェクト指向FBに追加される。
次に、生成部13は、ステップS2で選択された従来型FBから、生成処理において未選択の従来型FBを1つ選択する(ステップS13)。例えば、生成部13は、図5に示される従来型FB211を選択する。
次に、生成部13は、空のメソッドを生成し(ステップS14)、ステップS13で選択した従来型FBのロジック記述を、ステップS14で生成したメソッドのロジック記述として挿入する(ステップS15)。これにより、図5の例では、メソッド221のロジック記述2212が追加される。
次に、生成部13は、ステップS13で選択した従来型FBに含まれる変数から、生成処理において未選択の変数を1つ選択する(ステップS16)。例えば、生成部13は、図5に示される従来型FB211の変数2111を選択する。
生成部13は、ステップS16で選択した変数が、ステップS3にて設定された共通化変数に対応するか否かを判定する(ステップS17)。選択した変数が共通化変数に対応すると判定した場合(ステップS17;Yes)、生成部13は、ステップS16で選択した変数の名前と共通化変数の名前が同一であるか否かを判定する(ステップS18)。
名前が同一であると判定した場合(ステップS18;Yes)、生成部13は、ステップS20に処理を移行する。一方、名前が同一でないと判定した場合(ステップS18;No)、生成部13は、メソッドのロジック記述に表れる、ステップS16で選択した変数の名前を、対応する共通化変数の名前に置換する(ステップS19)。これにより、ステップS15で挿入された変数に関する記述が、共通化変数に関する記述に修正される。変数に関する記述は、変数にアクセスするための記述であってもよいし、変数を用いた他の記述であってもよい。
次に、生成部13は、ステップS13で選択された従来型FBのすべての変数の選択が完了したか否かを判定する(ステップS20)。すべての変数の選択が完了していないと判定した場合(ステップS20;No)、生成部13は、ステップS16以降の処理を繰り返す。これにより、例えば、図5に示される従来型FB211の変数2112が選択されて、変数2112についてステップS16以降の処理が実行される。
ステップS17において変数が共通化変数に対応していないと判定した場合(ステップS17;No)、生成部13は、ステップS14で生成したメソッドに、ステップS16で選択した変数を登録する(ステップS21)。これにより、例えば図5に示されるメソッド221に変数2211に関する記述が追加される。
ステップS20においてすべての変数の選択が完了したと判定した場合(ステップS20;Yes)、生成部13は、オブジェクト指向FBに、ステップS14~S20で生成されたメソッドを追加する(ステップS22)。これにより、例えば図5に示されるメソッド221がオブジェクト指向FB220に追加される。
次に、生成部13は、ステップS2で選択されたすべての従来型FBを生成処理において選択したか否かを判定する(ステップS23)。すべての従来型FBを選択してはいないと判定した場合(ステップS23;No)、生成部13は、ステップS13以降の処理を繰り返す。これにより、例えば図5に示されるメソッド222がオブジェクト指向FB220に追加される。一方、すべての従来型FBを選択したと判定された場合(ステップS23;Yes)、オブジェクト指向FB220を規定する第2ソースコード22が生成され、プログラミング支援装置10による処理は、生成処理から図6に示される支援処理に戻る。
以上、説明したように、本実施の形態に係るプログラミング支援装置10によれば、第1ソースコード21に記述される非オブジェクト指向の従来型FBを、オブジェクト指向FBのメソッドに置換することで、当該オブジェクト指向FBが記述された第2ソースコード22を得ることができる。このため、プログラマブルコントローラの動作プログラムを作成する負担を軽減し、オブジェクト指向プログラミングへの移行を促進することができる。
また、プログラマブルコントローラは通常、複数のユニットを含む。従来型FBを用いてこのようなユニットの機能を提供する場合には、1つのユニットを使用する場合であっても、実行プログラム23において当該ユニットの機能毎に異なるインスタンスの宣言を記述して、ユニットに関する同様の情報を設定する必要があり、実行プログラム23が複雑になってしまう。
これに対して、本実施の形態に係るプログラミング支援装置10によって複数の従来型FBを1つのオブジェクト指向FBが有する複数の機能に置き換えれば、実行プログラム23においてメソッドを呼び出す度に共通のデータを設定する必要はなく、第1ソースコード41を簡略化することができる。
UI部12は、選択要素として第1ソースコードに含まれる複数の第1ファンクションブロックの選択を受け付ける受付手段の一例に相当し、生成部13は、第1ソースコードから選択された複数の第1ファンクションブロックを、第1ファンクションブロックそれぞれに対応するメソッドを複数含む一の第2ファンクションブロックに置換することで、第2ソースコードを生成する生成手段の一例に相当する。また、生成部13は、複数の第1ファンクションブロックを、第1ファンクションブロックにそれぞれ含まれる異なる変数に対応する共通化変数を含む第2ファンクションブロックに置換する生成手段の一例に相当する。
なお、図4に示されるように、生成されるオブジェクト指向FBの名前、及び、共通化変数の名前をユーザが手動で設定する例について説明したが、これには限定されない。オブジェクト指向FBの名前及び共通化変数の名前を、予め定められた命名規則に従ってプログラミング支援装置10が設定してもよい。
また、オブジェクト指向FBのメソッドの名前が、従来型FBの名前に類似するものとしてプログラミング支援装置10によって設定される例について説明したが、これらの名前は同一であってもよいし、ユーザによってメソッドの名前が設定されてもよい。
また、共通化変数に対応させる従来型FBの変数をユーザがUI部12を用いて設定する例について説明したが、これには限定されない。例えば、UI部12に代えて生成部13が、実行プログラム23を解析して、同じデータが接続されている従来型FBの入力変数又は出力変数を共通化変数に設定してもよい。共通化変数の選択、及び、オブジェクト指向FBの名前の設定が、ユーザではなくプログラミング支援装置10によってなされる場合には、図4に示されるダイアログ画面の表示が省略される。
実施の形態2.
続いて、実施の形態2について、上述の実施の形態1との相違点を中心に説明する。なお、上記実施の形態1と同一又は同等の構成については、同等の符号を用いるとともに、その説明を省略又は簡略する。本実施の形態は、FBを定義する記述の置換に代えて、FBに基づいて宣言されたインスタンスに関する記述を置換する点で、上記実施の形態1とは異なる。
本実施の形態に係るプログラミング支援装置10は、図8に示されるように、記憶装置200に格納されたプロジェクトデータ20に含まれる非オブジェクト指向の第1ソースコード41を読み出して、読み出した第1ソースコード41からオブジェクト指向の第2ソースコード42を生成して出力する。
第1ソースコード41及び第2ソースコード42はいずれも、実施の形態1に係る実行プログラム23に相当する。第1ソースコード41は、従来型FBのインスタンスに関する記述を含む。インスタンスに関する記述は、インスタンスの宣言であってもよいし、インスタンスの変数又はロジック記述にアクセスするための記述であってもよい。第2ソースコード42は、第1ソースコード41の従来型FBのインスタンスに関する記述が、オブジェクト指向FBのインスタンスに関する記述に置き換えられたものに相当する。
プロジェクトデータ20は、関連情報43を含む。関連情報43は、インスタンスに関する記述を置き換えるための従来型FBとオブジェクト指向FBとの対応関係を示す情報である。詳細には、関連情報43は、従来型FBとオブジェクト指向FBのメソッドとの対応関係、及び、従来型FBの変数とオブジェクト指向FBの共通化変数との対応関係を示す。例えば、関連情報43は、図5に示されるように、従来型FB211とメソッド221とを関連付けて示し、従来型FB212とメソッド222とを関連付けて示し、変数2111,2121と共通化変数2201とを関連付けて示す。
関連情報43は、実施の形態1に係る生成部13によって生成されてもよいし、プログラミング支援装置10が生成することなく外部から提供されてもよい。図8では、関連情報43を予め含むプロジェクトデータ20が例示されているが、関連情報43をプログラミング支援装置10に提供する手法は任意である。例えば、関連情報43が同梱されたFBライブラリがプロジェクトデータ20にインポートされてもよいし、プログラマブルコントローラを含むFA機器の製造メーカーから提供されるFBに関連情報43が同梱されてもよい。関連情報43は、第1ファンクションブロックとしての従来型FBに含まれる変数と、第2ファンクションブロックとしてのオブジェクト指向FBに含まれる変数と、を関連付ける情報の一例に相当する。
プログラミング支援装置10の取得部11は、第1ソースコード41及び関連情報43を取得して、UI部12に提供する。取得部11は、プログラミング支援装置10において、第1ファンクションブロックの機能と、該機能をメソッドとして含む第2ファンクションブロックと、が関連付けられた関連情報を取得する取得手段の一例に相当する。
UI部12は、第1ソースコード41を編集するためのプログラムエディタ141と、置換すべきインスタンスを割り当てる割当部142と、
を有する。
プログラムエディタ141は、取得部11によって取得された第1ソースコード41に記述されるオブジェクト指向FBのインスタンスの指定を受け付ける。例えば、プログラムエディタ141は、図9に示されるように、第1ソースコード41の内容を画面120に表示する。この第1ソースコード41は、従来型FB211,212に実質的に共通する変数411,414と、従来型FB211のインスタンスに相当する変数412,415と、従来型FB212のインスタンスに相当する変数413,416と、
の記述を含む。変数411~413は、「Aユニット」に関する変数であって、変数414~416は、「Bユニット」に関する変数である。
また、図9の例において第1ソースコード41は、オブジェクト指向FB220のインスタンス417を宣言する記述を含む。このインスタンス417に関する記述は、第1ソースコード41が取得部11によって取得された後にプログラムエディタ141を操作するユーザによって追加される。ただし、記憶装置200に格納されている第1ソースコード41がインスタンス417の記述を予め含んでもよい。インスタンス417の記述が予め含まれる場合には、プログラムエディタ141を省略してUI部12を構成してもよい。図9の例では、ロジック記述418は、IEC規格で規定されるストラクチャードテキストの形式で記述されているが、他の形式で記述されてもよい。
ユーザが第1ソースコード41においてインスタンス417を選択すると、プログラムエディタ141は、当該インスタンス417に関する操作のリストを含むサブメニュー127を表示する。サブメニュー127のリストから「このインスタンスに置き換え」が指定されると、プログラムエディタ141は、従来型FBのインスタンスの置換先となるオブジェクト指向FBのインスタンス417の指定を受け付けて、指定されたインスタンスを割当部142に通知する。
割当部142は、オブジェクト指向FBの指定されたインスタンスのメソッドに対する従来型FBのインスタンスの割り当てを受け付ける。詳細には、割当部142は、インスタンスが指定されたオブジェクト指向FBのメソッドと関連情報43において関連する従来型FBのインスタンスの選択をユーザから受け付ける。例えば、割当部142は、図10に示されるように、メソッドと、割り当てるべき従来型FBのインスタンスの選択欄と、を関連付けるテーブル128を画面120に表示する。ユーザは、このテーブル128を用いて、指定したオブジェクト指向FBのインスタンスのメソッドを、従来型FBのインスタンスに割り当てる。割り当て候補として表示される従来型FBのインスタンスの選択肢は、第1ソースコード41のスコープの範囲内にあり、かつ、関連情報43においてメソッドに関連付けられた従来型FBをデータ型とする変数である。
例えば、図9に示されるように「位置決めユニット」が置換先のオブジェクト指向FBのインスタンスとして指定された場合において、テーブル128に含まれるメソッドは、図5に示されるオブジェクト指向FB220のメソッド221,222となる。また、テーブル128に含まれるインスタンスは、図5に示されるようにメソッド221,222に対応する従来型FB211,212のインスタンスとして、第1ソースコード41に記述されたものである。上述したように、図9の例では、従来型FB211の「Aユニット」及び「Bユニット」それぞれに関するインスタンスが変数412,415として宣言され,従来型FB212の「Aユニット」及び「Bユニット」それぞれに関するインスタンスが変数413,416として宣言されている。図10の例では、「運転始動メソッド」に割り当てるべき従来型FB212のインスタンスとして、変数413に相当する「Aユニット位置決め運転始動」というインスタンス及び変数416に相当する「Bユニット位置決め運転始動」というインスタンスが、割り当て候補としてコンボボックスに一覧表示されている。この一覧のうちの「Aユニット位置決め運転始動」というインスタンスが割り当て対象としてユーザにより選択されていることがハッチングで示されている。また、「データ設定メソッド」には、「Aユニット位置決めデータ設定」を割り当てることが示されている。ユーザがボタン129を押下することで、テーブル128を用いて設定された内容が生成部13に通知される。
プログラムエディタ141及び割当部142を含むUI部12は、プログラミング支援装置10において、第1ソースコードに記述された第2インスタンスの指定を受け付けて、指定された第2インスタンスのメソッドと関連情報において関連付けられた機能を有する従来型FBのインスタンスの選択を受け付ける受付手段の一例に相当する。
生成部13は、第1ソースコード41を静的に解析する静的解析部131と、第1ソースコード41に記述された従来型FBのインスタンスに関する記述をオブジェクト指向FBのインスタンスに関する記述に修正する修正部132と、
を有する。
静的解析部131は、割当部142によって割り当てられた従来型FBのインスタンスをオブジェクト指向FBのメソッドに置換することが可能か否かを判断する。また、静的解析部131は、第1ソースコード41に記述された従来型FBのインスタンスをオブジェクト指向FBのメソッドに置換することで得る置換コードに基づくプログラマブルコントローラの動作が、第1ソースコード41に基づくプログラマブルコントローラの動作から変化するか否かを判断する。置換可能であり、かつ、動作に変化がない場合には、静的解析部131は、修正部132に対して第1ソースコード41の修正を許可して、修正部132に第2ソースコード42を生成させる。
置換不可である場合には、静的解析部131は、置換不可の旨をユーザに報知し、動作が変化する場合には、動作が変化する旨をユーザに報知する。ユーザへの報知は、UI部12を介してなされてもよいし、他の手法によりなされてもよい。静的解析部131を有する生成部13は、第1ソースコードにおける第1ファンクションブロックの機能を呼び出すための記述が、第2ファンクションブロックのメソッドを呼び出すための記述に置換された置換コードに従うプログラマブルコントローラの動作が、第1ソースコードに従うプログラマブルコントローラの動作と異なる場合に、置換により動作が変化する旨を報知する生成手段の一例に相当する。また、生成部13は、第1ソースコードにおける第1インスタンスの第1ファンクションブロックに含まれる変数が、第2ファンクションブロックに含まれるメソッドの変数と関連情報において関連付けられる場合に、変数が置換されない旨を報知する生成手段の一例に相当する。
修正部132は、第1ソースコード41における従来型FBのインスタンスに関する記述を、オブジェクト指向FBのインスタンスに関する記述に修正する。従来型FBのインスタンスは、従来型FBの機能を示すロジック記述の呼び出し、又は、従来型FBの変数へのアクセスとして用いられる。修正部132は、従来型FBのロジック記述を呼び出す記述を、オブジェクト指向FBのメソッドを呼び出す記述に置換する。また、修正部132は、従来型FBの変数にアクセスするための記述を、オブジェクト指向FBの変数にアクセスするための記述に置換する。修正部132は、置換に成功した従来型FBのインスタンスを宣言する記述を第1ソースコード41から削除する。
修正部132を有する生成部13は、第1ソースコードにおける第1ファンクションブロックの機能を呼び出すための記述を、第2ファンクションブロックのメソッドを呼び出すための記述に置換する生成手段の一例に相当する。また、生成部13は、第1ソースコードにおける第1ファンクションブロックに含まれる変数の記述を、第2ファンクションブロックに含まれる変数の記述に置換する生成手段の一例に相当する。
図11には、図9に示される第1ソースコード41が修正部132によって修正されることで生成された第2ソースコード42が例示されている。図11に示されるように、第2ソースコード42では、「Aユニット」に関する従来型FBのインスタンスに相当する変数412,413の宣言部分が削除されている。また、ロジック記述418がロジック記述419に修正されている。
なお、ロジック記述を呼び出すときに指定されるパラメータが共通化変数である場合において、当該パラメータは、対応するメソッドを呼び出すときに指定される一又は複数のパラメータから削除されるため、修正部132は、分離代入の記述を挿入する。図11の例では、ロジック記述418に含まれる「Aユニット位置決め運転始動(ユニット情報:=Aユニット情報,始動No:=1)」という記述4183が、「Aユニット.運転始動メソッド(始動No:=1);」という記述4193に修正されるとともに、「Aユニット.ユニット情報:=Aユニット情報;」という分離代入の記述4192が挿入されている。分離代入の結果、実質的に同一の記述4191,4192が生成されているが、修正部132は、最適化処理を実行して、このような冗長な記述を簡略化してもよい。
続いて、本実施の形態に係るプログラミング支援装置10によって実行される支援処理について、図12,13を用いて説明する。支援処理では、図12に示されるように、取得部11が、第1ソースコード41を取得する(ステップS31)。そして、UI部12のプログラムエディタ141が、置換先となるオブジェクト指向FBのインスタンスの指定を受け付けて(ステップS32)、割当部142が、置換対象となる従来型FBのインスタンスの選択を受け付ける(ステップS33)。
次に、生成部13が、ステップS32,S33で受け付けた内容に基づいて、ステップS31で取得された第1ソースコード41から第2ソースコード42を生成する生成処理を実行する(ステップS34)。そして、生成部13は、生成した第2ソースコード42を出力し、支援処理が終了する。
図13には、ステップS34で実行される生成処理の詳細が示されている。図13に示されるように、生成処理では、生成部13が、ステップS33で割り当てられた従来型FBのインスタンスのうちの生成処理において未選択の1つを選択する(ステップS41)。例えば、図10に示される「Aユニット位置決めデータ設定」が選択される。
次に、生成部13は、ステップS41で選択したインスタンスの使用箇所を第1ソースコード41からすべて検索する(ステップS42)。これにより、図9の例では、「Aユニット位置決めデータ設定」が使用されている記述4181,4182がヒットする。なお、従来型FBのインスタンスに相当する変数412を宣言する記述は、検索対象から除外される。
次に、生成部13の静的解析部131は、検索によりヒットした使用箇所のうちの、生成処理において未選択の使用箇所を1つ選択する(ステップS43)。そして、静的解析部131は、ステップS43で選択した使用箇所が、呼び出し式の記述であるか否かを判定する(ステップS44)。具体的には、この使用箇所が、従来型FBのインスタンスのロジック記述を呼び出すものであるか否かが判定される。ステップS43で選択された使用箇所が、図9の記述4181であるときには、当該記述418が呼び出し式ではなくインスタンス変数にアクセスするものであるため、ステップS44の判定は否定される。
選択した使用箇所が呼び出し式の記述でないと判定した場合(ステップS44;No)、静的解析部131は、この使用箇所が変数アクセスの記述であると判断して、アクセスされる変数が共通化変数であるか否かを判定する(ステップS45)。図9の記述4181については、「ユニット情報」が図5に示されるように共通化変数に対応するため、ステップS45の判定が肯定される。
アクセスされる変数が共通化変数であると判定された場合(ステップS45;Yes)、修正部132は、選択された使用箇所を、オブジェクト指向FBのインスタンスの変数アクセスに置換する(ステップS46)。これにより、図9の記述4181が、図11の記述4191に置き換えられる。
次に、生成部13は、すべての使用箇所を選択したか否かを判定する(ステップS47)。すべての使用箇所を選択していないと判定した場合(ステップS47;No)、生成部13は、ステップS43に戻り、次の使用箇所に関する処理を実行する。これにより、例えば図9に示される記述4182が選択される。
ステップS44にて、選択した使用箇所が呼び出し式の記述であると判定した場合(ステップS44;Yes)、静的解析部131は、呼び出し式の記述をメソッドに置換した場合にプログラマブルコントローラの動作が変化するか否かを判定する(ステップS48)。例えば、呼び出し式の記述に基づく動作が前回値に依存する場合には、当該記述をメソッドに置換することで得る置換コードにより実現される動作が、第1ソースコード41により実現される動作から変化する。ここで、前回値は、プログラマブルコントローラによる前回のスキャンの実行結果を意味する。スキャンは、動作プログラムに規定されている制御処理がプログラマブルコントローラによって繰り返し実行されるうちの1回の実行に相当する。
動作が変化しないと判定した場合(ステップS48;No)、静的解析部131は、呼び出し式の記述において指定されるパラメータに共通化変数があるか否かを判定する(ステップS50)。具体的には、静的解析部131は、引数として共通化変数に対応する変数が指定されているか否かを判定する。パラメータに共通化変数があると判定した場合(ステップS50;Yes)、従来型FBの変数から共通化変数への単純な置き換えができないため、パラメータ代入と等価な分離代入を挿入する(ステップS51)。ここで、分離代入の仮引数については、従来型FBのインスタンス変数に対するアクセスではなく、オブジェクト指向FBのインスタンス変数へのアクセスとする。
パラメータに共通化変数がないと判定した場合(ステップS50;No)、及び、ステップS51に続いて、修正部132は、選択された記述を、オブジェクト指向FBのメソッドに置換する(ステップS52)。これにより、図9の記述4182が、図11の記述4194に置き換えられる。その後、ステップS47の判定が実行される。
ステップS47にて、すべての使用箇所を選択したと判定された場合(ステップS47;Yes)、修正部132は、選択されたインスタンスの宣言部分を削除する(ステップS53)。これにより、例えば図9に示される変数412が削除されて、プログラミング支援装置10は、現在選択されている従来型FBのインスタンスに関する処理を完了して、ステップS56に処理を移行する。
なお、ステップS45にて、アクセスされる変数が共通化変数でないと判定された場合(ステップS45;No)、生成部13は、当該変数がオブジェクト指向FBのインスタンスのメソッド内の変数に関連付けられているため、外部から当該変数にアクセスすることができないと判断する。そして、生成部13は、記述の置換が不可である旨をユーザに通知して(ステップS54)、現在選択されている従来型FBのインスタンスを置き換えることなく、ステップS56に移行する。
また、ステップS48にて、動作が変化すると判定された場合(ステップS48;Yes)、生成部13は、動作が変化することをユーザに通知して(ステップS55)、現在選択されている従来型FBのインスタンスを置き換えることなく、ステップS56に移行する。
これにより、ステップS41で選択されたインスタンスに関してステップS42で検索されたすべての使用箇所の修正が可能であるときには、ステップS53が実行される結果、インスタンスの置換が完了する。一方、修正が可能でない使用箇所が検出された際には、選択されたインスタンスに関する処理を終了する。
ステップS56では、生成部13は、ステップS33で選択されたすべての従来型FBのインスタンスについて生成処理における選択が完了したか否かを判定する(ステップS56)。選択が完了していないと判定した場合(ステップS56;No)、生成部13は、ステップS41以降の処理を繰り返す。これにより、図10に示されるように「Aユニット位置決め運転始動」という従来型FB212が選択されて、ステップS50~S52が実行されることにより、図9の記述4183が、図11の記述4192,4193に置き換えられる。
一方、選択が完了したと判定された場合(ステップS56;Yes)、プログラミング支援装置10による処理は、生成処理から、図12に示される支援処理に戻る。
以上、説明したように、本実施の形態に係るプログラミング支援装置10によれば、第1ソースコード41に記述される非オブジェクト指向の従来型FBのインスタンスに関する記述を、オブジェクト指向FBのインスタンスに関する記述に置換することで、第2ソースコード42が生成される。このため、プログラマブルコントローラの動作プログラムを作成する負担を軽減し、オブジェクト指向プログラミングへの移行を促進することができる。
なお、図10において、複数のインスタンスがユーザにより選択される例について説明したが、これには限定されない。例えば、1つの従来型FBのインスタンスがユーザによって選択されたことをトリガとして、プログラミング支援装置10が、他のメソッドに従来型FBのインスタンスを割り当ててもよい。プログラミング支援装置10は、第1ソースコード41を解析して、最初にユーザによって選択されたインスタンスと同一の共通化変数に接続されるデータを有する他のインスタンスを検出すればよい。
実施の形態3.
続いて、実施の形態3について、上述の実施の形態1,2との相違点を中心に説明する。なお、上記実施の形態1,2と同一又は同等の構成については、同等の符号を用いるとともに、その説明を省略又は簡略する。本実施の形態は、実施の形態1,2を組み合わせた上で、置換対象を選択するためのユーザ操作を省いて、プログラミング支援装置10が第1ソースコード41から第2ソースコード42を生成する点で、上記実施の形態1とは異なる。
本実施の形態に係るプログラミング支援装置10は、図14に示されるように、実施の形態1と同様に機能する取得部11,UI部12及び生成部13を有する。実施の形態1と同様の情報の流れについては、図14において太線の矢印で示されている。
生成部13は、関連情報43を生成して、取得部11は、関連情報43を取得する。関連情報43がプログラミング支援装置10の内部情報として扱われるため、外部において関連情報43を永続化する必要はない。取得部11及び生成部13は、実施の形態2と同等の機能を発揮する。UI部12からは、実施の形態2に係るプログラムエディタ141及び割当部142が省略されている。
また、生成部13は、実施の形態2に係る割当部142から機能が拡張された割当部142aを有する。割当部142aには、取得部11から関連情報43及びプロジェクトデータ20が提供される。
割当部142aは、プロジェクトデータ20から従来型FBのインスタンスを用いる一又は複数の第2ソースコード42を抽出し、抽出した第2ソースコード42それぞれに対して、オブジェクト指向FBのインスタンスを宣言して、オブジェクト指向FBのインスタンスに従来型FBのインスタンスを割り当てる。
続いて、プログラミング支援装置10によって実行される支援処理について、割当部142aによる手順を中心に説明する。図15に示されるように、支援処理では、取得部11が、複数の第1ソースコード41を取得する(ステップS61)。
次に、割当部142aが、未選択の第1ソースコード41を1つ選択する(ステップS62)。そして、割当部142aは、選択した第1ソースコード41において、関連情報43に含まれる従来型FBのインスタンスが宣言されているか否かを判定する(ステップS63)。すなわち、割当部142aは、関連情報43に基づく置換が可能なインスタンスが第1ソースコード41において宣言されているか否かを判定する。インスタンスが宣言されていないと判定した場合(ステップS63;No)、割当部142aは、当該第1ソースコード41に関する処理を終了して、ステップS66に処理を移行する。
一方、インスタンスが宣言されていると判定した場合(ステップS63;Yes),割当部142aは、ステップS63にて発見されたインスタンスの従来型FBと関連情報43において関連付けられたオブジェクト指向FBのインスタンスを、選択した第1ソースコード41において宣言する(ステップS64)。このステップS64は、図9に示されたインスタンス417の宣言に対応する。ただし、図9に示されたインスタンス417の宣言は、プログラミング支援装置10の外部で付加されたのに対して、ステップS64では、プログラミング支援装置10がインスタンスを宣言する。
具体的には、割当部142aは、第1ソースコード41において宣言された従来型FBの複数のインスタンスをグループに分類し、グループそれぞれに対応するオブジェクト指向FBのインスタンスを宣言する。従来型FBのインスタンスの分類は、同一の従来型FBに基づいて宣言される複数のインスタンスが1つのグループに属することがないように分類することでなされる。すなわち、同一の従来型FBに基づいて宣言されるインスタンスが表れるたびに、このインスタンスは新たなグループに分類される。また、第1ソースコード41を解析して、1つのグループに属する複数の従来型FBのインスタンス変数が、異なるデータ型の共通化変数と対応することがないように分類してもよい。グループの数を最小化することで、より多くの従来型FBのインスタンスを、1つのオブジェクト指向FBのインスタンスにまとめることができる。
そして、割当部142aは、ステップS64で宣言したオブジェクト指向FBのインスタンスに、当該オブジェクト指向FBに対応するグループに分類された従来型FBのインスタンスを割り当てる(ステップS65)。このステップS65は、図10に示されたメソッドとインスタンスとの割当に対応する。ただし、図10の例では割り当てがユーザによってなされたのに対し、ステップS65では、プログラミング支援装置10によってなされる。
次に、生成部13は、実施の形態2と同様の生成処理を実行する(ステップS34)。そして、生成部13は、すべての第1ソースコード41を選択したか否かを判定し(ステップS66)、すべての第1ソースコード41を選択してはいないと判定された場合(ステップS66;No)、ステップS62以降の処理が繰り返される。一方、すべての第1ソースコード41を選択したと判定された場合(ステップS66;Yes)、支援処理が終了する。
以上、説明したように、割当部142aが、第1ソースコード41を解析して、オブジェクト指向FBのインスタンスのメソッドに従来型FBのインスタンスを割り当てる。これにより、動作プログラムを作成する負担をさらに軽減することができる。割当部142aを有する生成部13は、第1ソースコードに記述された複数の第1インスタンスをグループに分類し、グループそれぞれに属する第1インスタンスに関する記述を、該グループに対応する第2インスタンスであって、関連情報において第1インスタンスの第1ファンクションブロックに関連付けられたメソッドを有する第2ファンクションブロックの第2インスタンスに関する記述に置換する生成手段の一例に相当する。
以上、本開示の実施の形態について説明したが、本開示は上記実施の形態によって限定されるものではない。
例えば、第2ソースコード22,42が記憶装置200のプロジェクトデータ20に出力される例について説明したが、これには限定されない。例えば、第2ソースコード22,42は、プロジェクトデータ20とは異なる新たなプロジェクトデータを構成するものとして出力されてもよい。
また、第1ソースコード21,41及び第2ソースコード22,42は、単一のファイルに限られず、複数のファイルを含んでもよい。また、単一のファイルを分割して、複数の第1ソースコード41として扱ってもよい。
また、上記実施の形態では、オブジェクト指向FBに含まれる共通化変数を1つだけ設定する例について説明したが、これには限定されない。図16に例示されるように、従来型FB211,212それぞれに含まれる「ユニット情報」という変数をオブジェクト指向FB220の「ユニット情報」という共通化変数に対応させるとともに、従来型FB211,212それぞれに含まれる「エラー情報」という変数をオブジェクト指向FB220の「エラー情報」という共通化変数に対応させてもよい。このような対応関係は、図17に示されるようにユーザにより共通化変数名を用いて設定される。
また、プログラミング支援装置10の機能は、専用のハードウェアによっても、また、通常のコンピュータシステムによっても実現することができる。
例えば、プロセッサ31によって実行されるプログラムP1を、コンピュータ読み取り可能な非一時的な記録媒体に格納して配布し、そのプログラムP1をコンピュータにインストールすることにより、上述の処理を実行する装置を構成することができる。このような記録媒体としては、例えばフレキシブルディスク、CD-ROM(Compact Disc Read-Only Memory)、DVD(Digital Versatile Disc)、MO(Magneto-Optical Disc)が考えられる。
また、プログラムP1をインターネットに代表される通信ネットワーク上のサーバ装置が有するディスク装置に格納しておき、例えば、搬送波に重畳させて、コンピュータにダウンロードするようにしてもよい。
また、通信ネットワークを介してプログラムP1を転送しながら起動実行することによっても、上述の処理を達成することができる。
さらに、プログラムP1の全部又は一部をサーバ装置上で実行させ、その処理に関する情報をコンピュータが通信ネットワークを介して送受信しながらプログラムを実行することによっても、上述の処理を達成することができる。
なお、上述の機能を、OS(Operating System)が分担して実現する場合又はOSとアプリケーションとの協働により実現する場合には、OS以外の部分のみを媒体に格納して配布してもよく、また、コンピュータにダウンロードしてもよい。
また、プログラミング支援装置10の機能を実現する手段は、ソフトウェアに限られず、その一部又は全部を、回路を含む専用のハードウェアによって実現してもよい。
本開示は、本開示の広義の精神と範囲を逸脱することなく、様々な実施の形態及び変形が可能とされるものである。また、上述した実施の形態は、本開示を説明するためのものであり、本開示の範囲を限定するものではない。つまり、本開示の範囲は、実施の形態ではなく、請求の範囲によって示される。そして、請求の範囲内及びそれと同等の開示の意義の範囲内で施される様々な変形が、本開示の範囲内とみなされる。