JP2012234272A - プログラマブルコントローラ・システム、その支援装置 - Google Patents

プログラマブルコントローラ・システム、その支援装置 Download PDF

Info

Publication number
JP2012234272A
JP2012234272A JP2011100991A JP2011100991A JP2012234272A JP 2012234272 A JP2012234272 A JP 2012234272A JP 2011100991 A JP2011100991 A JP 2011100991A JP 2011100991 A JP2011100991 A JP 2011100991A JP 2012234272 A JP2012234272 A JP 2012234272A
Authority
JP
Japan
Prior art keywords
variable
additional
instance
address
block
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
JP2011100991A
Other languages
English (en)
Other versions
JP5790128B2 (ja
Inventor
Daisuke Yoshihara
大助 吉原
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Fuji Electric Co Ltd
Original Assignee
Fuji Electric Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Fuji Electric Co Ltd filed Critical Fuji Electric Co Ltd
Priority to JP2011100991A priority Critical patent/JP5790128B2/ja
Publication of JP2012234272A publication Critical patent/JP2012234272A/ja
Application granted granted Critical
Publication of JP5790128B2 publication Critical patent/JP5790128B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Landscapes

  • Programmable Controllers (AREA)

Abstract

【課題】PLCを停止させることなく、且つ予備領域では対応できない変数追加にも対応できるようにする。
【解決手段】インスタンス毎に1ブロックのメモリ割り当てを行い、1ブロック内には変数の割当て、予備領域、及び追加変数格納先アドレスがある。予備領域では対応できない変数追加があった場合、追加ブロック(追加変数格納領域)を確保して追加変数を割り当てると共に、上記追加変数格納先アドレスに追加ブロックの先頭アドレスを格納する。以後、追加変数格納先アドレスを介して追加ブロックの追加変数にアクセスする。
【選択図】図3

Description

本発明は、プログラマブルコントローラ・システムに係わり、特にその支援装置に関する。
PLC(プログラマブルコントローラ)の支援ツールは、ユーザが記述したプログラム(ソースコード;変数含む)をコンパイルして、PLCで動作する機械語オブジェクトを生成し、その際、PLC上の有限なメモリに(その任意のアドレスに)各変数を割り付ける。そして、機械語オブジェクトをPLCにダウンロードして記憶させる。これより、PLCは、このプログラムを実行することで各種処理を実行し、各変数の値のリード/ライト等の処理の際には、その変数に割り付けられたアドレス(割当位置)にアクセスすることになる。
PLCが稼動中にそのプログラムを変更する場合は(プログラムのバージョンアップ等)、既に割り付けた変数(既存の変数というものとする)のアドレスを変更することができない(変数の割当位置が変化すると、変更前と変更後とで変数の値がプログラムで正常に扱えないため、誤動作する。;変数のアドレスが変更されることにより、アドレスの変更前と変更後とでデータを引き継ぐことができない)。
そのため、従来は、変数を追加しても既存の変数のアドレスが変更されないようにするために予備領域を設けて、追加した変数(追加変数というものとする)をこの予備領域に割り付けるようにしている。予備領域に追加変数を割り付けることにより、既に割り付けた変数(既存の変数)の割当位置を変更しないで、変数の追加が可能になる。予備領域は、プログラム構成単位(以下POUと示す)単位で持つため、予備領域のサイズは、大抵、数W(WORD)から数10Wである。
予備領域は、変数を追加しなければ無駄な領域となる。PLCのメモリは有限であり、且つ、大規模なシステムではPOUの数も多いため、予備領域を大きく(幾つも)確保することができない。
ユーザが、予備領域の数を越える変数の追加を伴うプログラムの変更を実施すると、既存の変数の割当位置を維持できなくなるため、PLCの動作を継続しながらプログラムを変更すること(オンライン変更)はできなくなる。
予備領域を大きく確保し、オンライン変更の制限を緩和する方法として、例えば特許文献1に開示されている従来技術が存在するが、予備領域をPOU単位ではなくタスク単位にまとめて大きめに予備領域を確保する方式のため、予備領域の数を超えるような変数を追加できない課題がある。
特開2008−269449号公報
ここで、上記POUには、PG(プログラム)、FB(ファンクションブロック)、FCT(ファンクション)等の種類がある。基本的には、PGがメインプログラムでFBやFCTがサブプログラムと見做してよく、PGが、その処理実行中にFBやFCT等を呼び出す。また、FBが、その処理実行中に他のFBやFCTを呼び出す場合もある。
PGを例にすると、PGのソースコードを作成するユーザが、PG中に任意のFB等の呼び出しを記述するものであり、基本的に何種類でも何回でも呼び出すように記述できる。例えば、FB1、FB2の2種類のFBがあるものとし、ユーザが作成した任意のPGでは、FB1を3回呼び出し、FB2は2回呼び出すものとする。
あるいは、呼び出されたFB1が、その処理実行中にFB2を呼び出すように、FB1のソースコードを記述することもできる。
このように、ファンクションブロックFB1のロジック自体は1つでも、ユーザは、複数回利用することができる。同様にファンクションブロックFB2のロジック自体は1つでも、ユーザは、複数回利用することができる。
ここで、上記PG(プログラム)、FB(ファンクションブロック)、FCT(ファンクション)等の各種POUのソースコードには、通常、任意の変数が記述されている。そして、各種POUを有するプログラムをコンパイルする際には、コンパイラ機能により各POUのインスタンス化(各POUの各変数をメモリに割り付ける)を実施する。
これは、例えば上記のようにFB1が3回呼び出される例では、FB1に関しては3回のインスタンス化が行われる。例えば、FB1が温度計による計測温度と湿度計による計測湿度とを取得・記憶するロジックであった場合、例えば温度計Aの計測値を1000番地、湿度計aの計測値を1001番地に記憶するインスタンス、温度計Bの計測値を1010番地、湿度計bの計測値を1011番地に記憶するインスタンス、温度計Cの計測値を1020番地、湿度計cの計測値を1021番地に記憶するインスタンスの3つのインスタンスが生成されることになる。
コンパイラ機能は、各POUをインスタンス化する場合、予備領域も含めて1つの塊としてメモリを割り付ける。上記のようにFBを複数回利用する場合にはそれぞれについてインスタンス化が行われる。上記のようにFB1の例の場合には3つのインスタンスが生成され、それぞれについて1つの塊としてメモリを割り付けることになる。上記の例では、各インスタンス毎に、温度計と湿度計それぞれに1ワード(1番地)ずつ計2ワードと、更に予備領域を1ワードの計3ワード分を、1つの塊としてメモリを割り付けることになる。
そして、後にプログラムを修正(バージョンアップ)する等して、任意のPOUにおける変数に追加があった場合、この追加変数を上記予備領域に割り付けることになる。追加変数が多い為に予備領域が不足しても、通常、PLCのメモリには未だ十分な余裕(空き領域)が残っているため、他のメモリ領域に変数を割り付けることは可能である。
しかし、従来の方式では、予備領域を超えて変数を追加した場合、既存の変数のアドレス(割当位置)を変更する必要があり、既存変数のアドレスが変更されると上記の通り正常なデータ引き継ぎができない為、PLCを停止し、データの初期化を行い、プログラムをすべてPLCに転送してから、PLCを起動する必要がある。PLCが停止すると、システムも停止するため、システムの稼働率、保守性、拡張性の低下や、プラントなどシステムを停止できない場合に問題になる。
本発明の課題は、PLCシステムに係わりそのPLC支援装置におけるPLCのプログラムの更新/修正に伴い、既存の変数のアドレス(割当位置)を変更することなく、予備領域では対応できないような変数追加があった場合でもPLCのメモリの空き領域に追加変数を割り付けることで、PLCを停止しないでプログラム更新を可能とするPLC(プログラマブルコントローラ)システム、その支援装置を提供することである。
本発明のプログラマブルコントローラ・システムは、プログラマブルコントローラ用の任意のプログラムのソースコードをコンパイルして機械語オブジェクトを生成する支援装置と、プログラマブルコントローラとから成るプログラマブルコントローラ・システムであって、前記支援装置は、前記ソースコードのコンパイルの際に、前記ソースコードに含まれる各POU毎に、そのPOUに係わる各変数の格納領域と予備領域と追加変数格納先記憶領域の各領域を相対アドレスで示す領域情報を保持する変数情報記憶手段と、前記ソースコードのコンパイルの際に、前記各POUの各インスタンス毎に、そのインスタンスに関して確保された一塊のメモリ領域であるブロックに関する情報として少なくともその先頭アドレスを記憶するインスタンス情報記憶手段と、前記変数情報記憶手段と前記インスタンス情報記憶手段とを参照して、前記各変数を前記各インスタンス毎にメモリ割当てを行いながら、前記任意のプログラムのソースコードを前記機械語オブジェクトに変換するコンパイル手段と、前記プログラムの修正版/更新版である修正/更新プログラムのソースコードをコンパイルする際に、該ソースコードに含まれる各POU毎に、前記変数情報記憶手段を参照して追加変数の有無をチェックし、追加変数がある場合には前記予備領域で対応可能か否かを判定し、対応できる場合には該予備領域に追加変数を割当て、対応できない場合には、該POUの各インスタンス毎に追加のブロックを確保すると共に、既存のブロックの前記追加変数格納先記憶領域に該追加ブロックの先頭アドレスを格納させる為の情報を生成・記憶する追加変数対応手段とを有する。
上記プログラマブルコントローラ・システムにおいて、例えば、前記コンパイル手段は、前記修正/更新プログラムの前記機械語オブジェクトへの変換に関しては、前記追加変数の有無に係らず、既存の変数に関しては前記変数情報記憶手段の前記領域情報に基づいて前回コンパイル時と同じアドレスを割り当てる。
また、上記プログラマブルコントローラ・システムにおいて、例えば、前記コンパイル手段は、前記修正/更新プログラムの前記機械語オブジェクトへの変換に関しては、前記追加変数格納先記憶領域経由で前記追加変数にアクセスする機械語オブジェクトを生成する。
上記プログラマブルコントローラ・システムでは、例えばその支援装置において、修正/更新プログラムにおいて追加変数がある場合、予備領域で対応できる場合には予備領域を割当て、予備領域では対応できない場合であっても追加ブロックを確保することで対応できる。また、既存の変数に関しては、変数情報記憶手段の領域情報に基づいて前回コンパイル時と同じアドレスを割り当てることができる。
本発明のPLC(プログラマブルコントローラ)システム、その支援装置等によれば、PLCシステムに係わりそのPLC支援装置におけるPLCのプログラムの更新/修正に伴い、既存の変数のアドレス(割当位置)を変更することなく、予備領域では対応できないような変数追加があった場合でもPLCのメモリの空き領域に追加変数を割り付けることで、PLCを停止しないでプログラム更新を可能とする。
本例のPLCシステムの全体構成図である。 変数のメモリ割付けの一例を示す図である。 (a),(b)は、追加変数格納領域の割当てを示す図である。 (a)〜(c)は変数情報管理表の具体例を示す図である。 (a)、(b)は、POUインスタンスアドレス割付対応表の具体例を示す図である。 コンパイル処理を説明する為のフローチャート図である。 ソースコード識別番号対応表の具体例を示す図である。 修正版プログラムのコンパイル処理を説明する為のフローチャート図である。 POUインスタンスアドレス情報の具体例を示す図である。
以下、図面を参照して本発明の実施の形態について説明する。
尚、本説明では「割当て」と「割付け」はほぼ同義であると見做すものとする。
図1は、本例のプログラマブルコントローラ(PLC)システムの全体構成を示す図である。
本例のPLCシステムは、PLC(プログラマブルコントローラ)30と、このPLC30用のプログラム(制御プログラム等;以下、制御プログラムを例にして説明する)をユーザが任意に作成できるように支援する機能等を有する開発支援装置(ローダ)10を有する。
開発支援装置10は、上記作成された制御プログラムを、コンパイルして機械語に変換した後、不図示の通信線を介してPLC30にダウンロードする機能等も備えている。PLC30は、この機械語プログラムを記憶する(後述する機械語オブジェクト41に相当)。また、PLC30は、制御プログラムの更新/修正等に伴い更新/修正版等の機械語プログラムがダウンロードされた場合には、記憶してあった旧プログラムを削除して新プログラムを記憶する。そして、PLC30は、現在記憶している機械語プログラムを実行することで、制御対象の各種機器を制御する。
尚、特に図示しないが、PLC30は、上記制御対象である何らかの機器または当該機器を接続しているI/Oユニットと、通信線を介して接続している。
開発支援装置(ローダ)10は、コンパイラ機能部11、インタフェース機能部12、通信機能部13等の各種機能部と記憶部20等を有する。また、ユーザに上記制御プログラム等を作成させるための画面等を表示するディスプレイ14と、キーボード/マウス等の入力装置15等も有する。また、特に図示しないが、開発支援装置(ローダ)10は、CPU/MPU等の演算処理プロセッサも有している。
記憶部20には、予め不図示のアプリケーションプログラムが記憶されている。上記CPU/MPU等が、このアプリケーションプログラムを読み出し・実行することにより、上記各種機能部11,12、13の機能(特に後述する図6や図8に示す処理)が実現される。
また、記憶部20には、図示の各種データ/プログラム等が記憶される。
すなわち、記憶部20には、上記ユーザによって作成された制御プログラムのソースコード21、このソースコード21をコンパイラ機能部11によってコンパイルした結果である機械語オブジェクト23等が格納される。
更に、記憶部20には、図示の各種データ、すなわちソースコード識別番号対応表22、変数情報管理表24、POUインスタンスアドレス情報25、POUインスタンスアドレス割付対応表26等が、記憶される。尚、これら各種データについては、後に具体例を参照して説明する。
上記各種機能部のうち、まず、インタフェース機能部12は、ユーザが任意の制御プログラム(ソースコード21)を作成する際に作成作業が行い易いように支援する、既存の一般的な機能を有する処理機能部である。例えば上記ディスプレイ14上に所定の入力画面を表示し、ユーザは上記入力装置15を操作してこの入力画面上で任意の制御プログラムを記述する。
コンパイラ機能部11は、ユーザによって作成されたソースコード21を、ターゲット(PLC30)上で動作する機械語オブジェクト23に変換する(コンパイルを実行する)。通信機能部13は、生成された機械語オブジェクト23を、不図示の通信線を介してターゲット(PLC30)に送信する(ダウンロードする)。
PLC(プログラマブルコントローラ)30は、プログラム実行管理機能部31、通信機能部32等の各種機能部と記憶部40を有する。また、特に図示しないが、PLC30は、CPU/MPU等の演算処理プロセッサも有している。
記憶部40には、予め不図示のアプリケーションプログラムが記憶されている。上記CPU/MPU等が、このアプリケーションプログラムを読み出し・実行することにより、上記各種機能部31,32の機能(処理)が実現される。
通信機能部32は、上記開発支援装置10(その通信機能部13)との通信を行って、例えば上記ダウンロードされる機械語オブジェクト23の受信を行い、これを記憶部40に記憶する(これが図示の機械語オブジェクト41である)。また、POUインスタンスアドレス情報25がダウンロードされた場合には、これを記憶部40に記憶する(これが図示のPOUインスタンスアドレス情報42である)。
プログラム実行管理機能部31は、上記のように開発支援装置10からダウンロードされて記憶部40に記憶された機械語オブジェクト41等の実行を管理する。詳しくは後述する。
また、記憶部40(メモリ)の記憶領域の一部は、POUインスタンスメモリ領域43となっている。この領域43内に各変数を割当てる(各変数に係るデータ格納領域を割付ける)。これらについても詳しくは後述する。
ここで、PLCのプログラミングには、プログラム(PG)、ファンクションブロック(FB)、ファンクション(FCT)の3つのPOU要素がある。通常、各POUには
1以上の変数が含まれている。上記制御プログラム等をPLC30上で動作させる為には、開発支援装置10でコンパイルする際に、その各POUの各変数をPLC30のメモリ(領域43内)に割り付けてから(アドレスを割り当てる)、機械語オブジェクト23を生成する必要がある。コンパイラ機能部11が、上記コンパイルの際にPOU毎に(インスタンス毎に)その各変数のメモリ割付けを実施している。
コンパイラ機能部11は、上記POU毎に各変数をメモリに割付ける際に、各インスタンス毎に、上記のように一塊の領域(ブロック;変数割当領域というものとする)を確保する。これには、既に説明したように、予備領域も含まれる。つまり、各POUの各インスタンス毎に、各変数の割付領域と予備領域等から成る変数割当領域を割り当てることになる(例えば後述する図2参照)。そして、本手法では、更に「追加変数格納先アドレス」領域も確保する(これも上記変数割当領域(ブロック)に含まれる)。
例えば、任意の制御プログラムの新規作成時に、そのコンパイルの際に上記メモリ割付けを行うことで、その後にこの制御プログラムの修正/更新時には、そのコンパイルの際に、追加変数があった場合には上記変数割当領域内の予備領域に割り当てるようにする。
しかし、追加変数が多い場合等には、上記予備領域では足りない場合がある。つまり、上記確保してあった変数割当領域内に追加変数全てを割当てることが出来ない場合がある。
本手法では、この様な場合に備えて上記のように上記変数割当領域内に上記「追加変数格納先アドレス」領域も確保している。また、各POUの各インスタンス毎に、上記変数割当領域の先頭アドレスやサイズ、その変数等のメモリ割り当て状況を、上記変数情報管理表24、POUインスタンスアドレス割付対応表26に記憶している。
尚、上記制御プログラムの修正/更新版のコンパイルの際には、これら管理表24や対応表26を参照することで、既にメモリ割当て済みの変数(上述した既存の変数)に関しては同じアドレスを割当てることができる。
そして、上記予備領域では足りない様な(対応できないような)変数追加があった場合、PLC30のメモリ(領域43内)の空き領域に新たな変数割当領域(ブロック)を確保して、この変数割当領域内に追加変数を割り付けると共に、この追加した変数割当領域の先頭アドレスを「追加変数格納先アドレス」に書き込ませる。これより、追加変数は「追加変数格納先アドレス」経由でアクセスすることができる(例えば後述する図3参照)。
ここで、上記コンパイラ機能部11が上記コンパイルの際にPOU毎に(各インスタンス毎に)その各変数のメモリ割付を行うのは、上記の通りPOUインスタンスメモリ領域43内の任意の記憶領域である。図2に、この様なメモリ割付けの一例を示す。
図2に示すように、POUインスタンスメモリ領域43に対してPOU毎(インスタンス毎に)の変数のメモリ割付けが行われる。
図2の例は、2つのファンクションブロック(FB1、FB2)に関して、FB1は2つ、FB2は1つ、インスタンス化した場合のメモリ割付例である。
既に従来等で説明したように、ファンクションブロック(FB)に関しては、ユーザは、複数回利用することができる。複数回利用する場合は、コンパイラ機能により利用毎のインスタンス化(ファンクションブロックの変数をメモリに割り付ける)を実施する。従って、上記の例ではFB1は2度利用され、FB2は一度だけ利用されていることになる。
そして、変数のメモリ割付けは、各インスタンス毎に行われる。よって、上記の例では、FB2に関してはFB2のインスタンス2、FB1に関してはインスタンス1、インスタンス3のインスタンス化が行われ、これら各インスタンス毎に図示のように変数のメモリ割付けが行われる。
コンパイラ機能部11は、ファンクションブロックをインスタンス化する場合、1つの塊(ブロック;上記変数割当領域)としてメモリを割り付ける。すなわち、例えば図2に示す例のように、各ファンクションブロックをインスタンス化してなる各インスタンス毎に、1つの塊(ブロック)としてメモリ領域を割り付ける。
図2の例では、インスタンス1、インスタンス2、インスタンス3の3つのインスタンス化が行われるものとし、インスタンス1とインスタンス3はファンクションブロックFB1に係るインスタンス、インスタンス2はファンクションブロックFB2に係るインスタンスである。
各インスタンス毎の変数割当領域は、その各変数に対するメモリ割当て領域と予備用領域から成る。図2の例では、予備1と予備2の2つの予備領域が加わる。そして、図示の例ではファンクションブロックFB1に係る変数は変数1と変数2であり、ファンクションブロックFB2に係る変数は変数3と変数4と変数5であるものとしている。これより、図示の通り、インスタンス1とインスタンス3に関しては、変数1と変数2と予備1と予備2とを含む1つの塊(ブロック)として図示のようにメモリを割付ける。インスタンス2に関しては、変数3と変数4と変数5と予備1と予備2とを含む1つの塊(ブロック)として図示のようにメモリを割付ける。
図2に示す例に対して、本手法の場合にはブロック内に更に図3に示すように「追加変数格納先アドレス」が加わる。すなわち、本手法では、上記図1のPOUインスタンスメモリ領域43に対する各インスタンス毎のメモリ割当ては、例えば図3に示すようになる。
本手法では、図3(a)に示すように、各変数1,2,3,4,5に関するメモリ割当ては、上記図2の例と同様である。一方、2つの予備領域に関しては、予備1のみとなっており、上記予備2の割当て領域には図示のように「追加変数格納先アドレス」が割当てられている。但し、この例に限らず、予備領域は予備1、予備2の2つのままで更に「追加変数格納先アドレス」が加わるようにしてもよい。
ここで、PLC30の稼働中に、ユーザが開発支援装置10上で変数の追加を伴うプログラム修正(例えばバージョンアップしたソースコード21の作成等)を行った場合であって、特にPLC30を止めないでPLC30のプログラムの変更を実施するためには、既にメモリに割付けた変数(既存の変数)のメモリ割付け位置を変更しないようにする必要がある。
そこで、本手法では、コンパイラ機能部11は、ソースコード21のコンパイル実行の際に行う上記各インスタンス毎のメモリ割当ての際に、上記管理表24や対応表26に各変数のメモリ割当て状況を登録しておくと共に、予備領域だけでなく上記「追加変数格納先アドレス」を格納する領域を確保する。新規プログラム(新規ソースコード21)のコンパイルの際には、基本的には、この「追加変数格納先アドレス」領域には何もデータは格納されない(後述するNULLとなる)。
そして、後にこの新規プログラムを修正/更新(バージョンアップ等)したときに、修正/更新版プログラムをコンパイルする際に、追加変数があり且つ予備領域だけでは対応できない場合には、例えば図3(b)に示す「追加変数格納領域」(追加ブロック)を新たに確保すると共に、この「追加変数格納領域」の先頭アドレスを上記「追加変数格納先アドレス」が示す領域に格納させる。これについては、詳しくは後に図9を参照して説明するが、PLC30側において、「POUインスタンスアドレス情報」42(開発支援装置10側で生成した「POUインスタンスアドレス情報」25をダウンロードしたもの)を用いて「追加変数格納先アドレス」が示す領域に、「追加変数格納領域」の先頭アドレスを格納する。これより、その後は、PLC30では、「追加変数格納先アドレス」経由で「追加変数格納領域」の各追加変数にアクセスすることになる。
尚、本手法では、予備領域は確保せずに「追加変数格納先アドレス」領域だけを確保するようにしてもよい。尚、逐一述べないが、各変数に関する領域割当ては、当然、図2の場合と同様に行っている。
また、コンパイラ機能部11は、どの変数をどの記憶領域(アドレス)に割当てたのかを示す情報を、テーブル(上記管理表24等)に記憶しておく。
コンパイラ機能部11は、上記修正版(バージョンアップ版等)プログラムをコンパイルする際には、特に変数の追加があったPOUのインスタンスに係るメモリ割当てに関しては、既存の変数に関しては上記テーブルを参照することで既に割当てられている記憶領域を変更しないようにする(前回コンパイル時と同じアドレスが割当てられるようにする)。一方、新たに追加された変数(追加変数)に関しては、まず上記予備領域への割当てを試みて、割当て可能であれば予備領域を割当てる。
図3(b)に示す例では、ソースコード21において上記ファンクションブロックFB1に関して3つの変数が追加されたものとしている。これら追加された3つの変数を、追加変数1、追加変数2、追加変数3と呼ぶものとする。よって、新たなファンクションブロックFB1に関しては、上記既存の変数である変数1、変数2と、これら追加変数1、追加変数2、追加変数3との合計5つの変数が存在する状態となっている。
よって、上記コンパイルの際、新たなファンクションブロックFB1に係るインスタンス1、インスタンス3に関しては、両方とも、5つの変数のメモリ割り当てを行うことになる。
そして、上記の通り(そして図3(b)に示す通り)、既存の変数1、変数2に関しては図示の通り割当位置は図3(a)の状態と同じである(変わらない)。一方、追加変数に関しては、上記3つの追加変数のうちの1つ(ここでは追加変数1とする)は予備領域への割当てが可能であるが、他の2つの追加変数(ここでは追加変数2,3)を割当てることはできない。
この様に予備領域では対応できないような変数の追加が行われた場合には、POUインスタンスメモリ領域43内の空き領域に、当該インスタンス用の新たな変数記憶領域(追加変数格納領域/追加ブロックという)を確保し、当該追加ブロックのアドレス(先頭アドレス等)を上記「追加変数格納先アドレス」が示す領域に格納させる。
そして、当該追加ブロック内に上記他の2つの追加変数(ここでは追加変数2,3)を割当てる。これより、例えば図3(b)に示す状態となる。ここで、既に述べた通り、各インスタンス毎に1つの塊(ブロック)としてメモリ領域を割付けるものである為、上記新たな変数記憶領域(追加ブロック)においても、追加変数2,3だけでなく、予備領域(予備1)及び「追加変数格納先アドレス」領域も確保されることになる。
また、本例ではFB1は2つインスタンス化されているため、インスタンス毎に、(予備領域では対応できない)追加変数の格納領域を確保する必要がある。この為、図3(b)に示す通り、FB1のインスタンス1の追加変数格納領域と、FB1のインスタンス3の追加変数格納領域とが、新たに確保されることになる。
このようにすることで、最初に各インスタンス毎に1つの塊として割付けられるメモリ領域(初期ブロックという)では、全ての追加変数を割当てることができない場合でも、POUインスタンスメモリ領域43内に空き領域が存在する限りは、追加変数格納領域(追加ブロック)を確保することで、追加変数のメモリ割当てが可能となる。これは、既に存在する変数の割り当て位置は、変更しないで、追加変数のメモリ割当てを殆ど制限なしに(勿論、領域43の空き領域が無くなれば駄目であるが)行うものとなる。変数の追加の制限を撤廃し、PLCを停止しないでプログラムの変更が実施できる。
コンパイラ機能部11は、ユーザが記述したプログラム(ソースコード21)をコンパイルする際に、当該プログラムにおける各POU毎に、そのPOUが使用している変数の情報管理のため、「変数情報管理表」24を作成する。「変数情報管理表」24には、各変数毎に、変数の名前、型(サイズ)、割当位置を示す相対位置などの情報が存在する。
図4(a)〜(c)に、「変数情報管理表」24の具体例を示す。
図4(a)、(b)は、上記ファンクションブロックFB1に関する「変数情報管理表」24の具体例であって、図4(a)は図6の新規コンパイル後、図4(b)は図8の修正版等コンパイル後の状態を示す。このようなデータ例については、後に図6や図8の説明の際に説明するものとし、ここでは「変数情報管理表」24のフォーマットについてのみ説明するものとする。尚、図4(c)は後述するファンクションブロックFBCALLに関する「変数情報管理表」24の具体例である。
図4(a)〜(c)に示すように、「変数情報管理表」24のフォーマットは、変数名51、型52、相対位置53、及び格納先ブロック54の各データ項目より成るものである。尚、特に図示・説明しないが、各「変数情報管理表」24には、どのPOUの変数情報管理表であるのかを示す情報も含まれている。
変数名51には、図示の変数1、変数2等の変数名等(名前に限らず、識別番号等であってもよい)が格納される。図4(a),(b)の例の場合はファンクションブロックFB1で使用する各変数の変数名が、変数名51に格納されることになる。
但し、変数名51には、変数名等に限らず、図示のように「予備領域」、「追加変数格納先アドレス」等も格納される。これら名称やサイズは予め決められているものであり、上記各変数名等の格納が完了したら、続いてこれらの所定の名称や使用領域サイズを変数名51や型52に格納する。詳しくは後述する。
型52には、変数名51に変数名等が格納されている場合には、当該変数名の変数の型と使用する記憶容量(使用領域のサイズ)とが格納される。例えば、変数1は、INT型であって使用領域サイズが1W(ワード)であることになる。変数2は、WORD型であって使用領域サイズが1W(ワード)であることになる。また、型52には、変数名51に変数名以外が格納されている場合には、使用領域サイズのみが格納される。図示の例では、「予備領域」に関しては使用領域サイズが2W(ワード)となっており、「追加変数格納先アドレス」に関しても使用領域サイズが2W(ワード)となっている。
相対位置53には、上記各使用領域の相対アドレスが格納されている。これは、後述する先頭アドレス63からの相対位置を意味する。つまり、各インスタンス毎に、そのインスタンスに係るブロックの先頭アドレス63と上記各変数の相対位置53とによって、そのインスタンスで使用する各変数の割当位置を示す実アドレスが、分かることになる。
例えば、変数2の相対位置53は‘1’であり、図4(a)はファンクションブロックFB1の例であるので、仮にインスタンス3であった場合には先頭アドレス63は‘1018’番地であることから、変数2の割当位置の実アドレスは、‘1018’番地+1=‘1019’番地であることになる。また、この例の場合、予備領域の使用領域の実アドレスは、‘1018’番地+2=‘1020’番地であることになる。ここで、予備領域の型51(使用領域サイズ)は上記の通り2W(ワード)であるので、予備領域の使用領域は、‘1020’番地〜‘1021’番地ということになる。
格納先ブロック54は、変数名51の変数等を格納するブロックを示すものである。すなわち、上記の通り、各インスタンス毎に、最初に1つのブロック(初期ブロック)を確保し、その後、修正版プログラム等のコンパイルの際に場合によっては追加ブロックを確保することになるが、変数名51の変数の割当位置が、初期ブロック内であるのか追加ブロック内であるのかを示す情報が、格納先ブロック54に格納されている。
図3(a)に示す例では、インスタンス1,2,3の全てが初期ブロックのみである。一方、図3(b)に示す状態では、インスタンス2は初期ブロックのみであるが、インスタンス1,3は各々追加ブロックが新たに確保される為、2つのブロックを有するものとなっている。この例の場合、格納先ブロック54は、変数名51の変数等の割当位置が、これら2つのブロックのうちのどちらのブロック内であるのかを示すものとなる。本例では、格納先ブロック54が‘0’の場合は初期ブロック、格納先ブロック54が‘1’の場合は追加ブロックであることを示すものとする。尚、この例に限らず、例えば1つの追加ブロックだけでは足りずに2つ目の追加ブロックが確保された場合には、例えば格納先ブロック54が‘2’の場合には2つ目の追加ブロックを示すものとしてもよい。
尚、特に詳細には説明しないが、後述する変数宣言部分には、図4(c)に示すように変数名として「FB1インスタンス」、型として「FB1(2)」等といった情報も含まれていてもよい。尚、これはFB呼出しに係る情報であり、この例ではFBCALLがFB1を呼び出すことになるが、ここでは特に関係ないので、これ以上詳細には説明しない。
また、コンパイラ機能部11は、コンパイル時に変数をPLC30のメモリに割り付ける際、「変数情報管理表」24を元に、「POUインスタンスアドレス割付対応表」26を作成する。
当該対応テーブル26の一例を図5(a)、(b)に示す。図5(a)は図6の処理後、図5(b)は図8の処理後の状態を示す。ここでは、「POUインスタンスアドレス割付対応表」26のフォーマットのみについて説明するものとし、内容等の説明は図6、図8の説明の際に説明する。
図5(a)、(b)に示すように、「POUインスタンスアドレス割付対応表」26は、インスタンス番号61、POU名62、先頭アドレス63、インスタンスサイズ64、追加変数格納先アドレス65、追加変数格納先サイズ66の各データ項目より成る。
まず、上記の通り、各POU毎に1以上のインスタンスが生成されるものであり、インスタンス生成毎にそのインスタンスに識別番号を割付ける。ここでは、インスタンス番号は、インスタンス生成毎に‘1’から順にシリアルに番号が付されるものとする(+1インクリメントされる)。ここでは上記インスタンス1,2,3の識別番号が、‘1’、‘2’、‘3’であるものとする。よって、図示のインスタンス番号61=‘1’、‘3’のレコードは、上記インスタンス1、3に関する情報であり、従ってそのPOU名62は両方とも図示の通り“FB1”となっている。
先頭アドレス63及びインスタンスサイズ64には、インスタンス番号61のインスタンスに割当てられた上記初期ブロックの先頭アドレス(実アドレス)とサイズが格納される。ここで、例えば、最初に生成されたインスタンスである上記インスタンス1に関しては、その先頭アドレスには予め決められたデフォルト値(=1000番地)が割り当てられるものとする。また、FB1に関しては、図4(b)に示す例ではそのブロック全体のサイズは6W(ワード)であるので、インスタンスサイズ64=‘6’となっている。つまり、インスタンス1に割当てられる初期ブロックの領域は、1000番地〜1005番地となっている。
これより、次に生成されたインスタンス2に関しては、その先頭アドレス63は1006番地(1005番地+1あるいは1000番地+6)となる。
また、追加変数格納先アドレス65及び追加変数格納先サイズ66には、上記追加変数格納領域(追加ブロック)の先頭アドレス(実アドレス)とサイズが格納される。尚、追加変数格納先アドレス65及び追加変数格納先サイズ66は、上記追加ブロックの数の分だけ存在する。ここでは、未だ追加ブロックは存在しないので、追加変数格納先アドレス65及び追加変数格納先サイズ66には図5(a)に示すように“NULL”及び‘0’が格納される。
図2の例では、FB1についてはインスタンス1,3、FB2についてはインスタンス2の合計3つのインスタンス化が成されている。
インスタンス1のメモリ割付けを実施する時、POUがFB1なので、FB1の「変数情報管理表」24から、インスタンス化に必要なサイズ(ブロックのサイズ)を算出する(本例では6W(ワード))。このサイズを元に、PLC30のメモリ(そのPOUインスタンスメモリ領域43)にインスタンス1のブロックの領域を確保する。
同様にして、インスタンス2のPOUはFB2なので、FB2の「変数情報管理表」24から、インスタンス化に必要なサイズ(ブロックのサイズ)を算出し、このサイズを元に上記インスタンス2のブロックの領域を確保する。
上記の処理を、インスタンスの数分繰り返し実施する。
「POUインスタンスアドレス割付対応表」26には、各インスタンスの割当て領域(ブロック)の先頭アドレスとサイズが設定される。図5(a)の段階では、初期ブロックの先頭アドレス63とサイズ64が設定される一方で、追加ブロックは未だ存在しないので、追加変数格納先アドレス65には無効を示すNULL情報が設定されると共に、追加変数格納先サイズ66には‘0’が設定される。
ユーザが、変数の追加を伴う修正版/更新版の(バージョンアップ版等の)ソースコード21を作成してコンパイルの実施を指示・操作した時、コンパイラ機能部11は、各POU毎に、追加変数がある場合にはまず当該追加変数を予備領域に割付けるようにする。予備領域で収まる場合は、「変数情報管理表」24を更新し(追加変数のメモリ割当て情報を追加し)、予備領域のサイズ(型52)を減らすと共に予備領域の相対位置53を変更する。予備領域では収まらないような変数の追加が行われていた場合、コンパイラ機能部11は、空き領域に追加ブロックの領域を確保すると共に、この追加ブロック領域内に追加変数を割当てる。また、確保した追加ブロックの領域の先頭アドレスとサイズを、追加変数格納先アドレス65、追加変数格納先サイズ66に格納する。
これによって、例えば、図5(a)の状態から図5(b)の状態へと移行することになる。図5(b)の例では、FB1に関しては予備領域では対応できないような変数の追加が行われた為に、FB1の各インスタンス1,3に関しては追加ブロックが新たに確保され、各追加ブロックの先頭アドレスとサイズが、図示のように格納される(図示の例ではアドレス65が‘1034’と‘1044’)。
尚、この追加ブロックについても、初期ブロックと同様に、変数の格納領域だけでなく、予備領域や上記「追加変数格納先アドレス」の領域が含まれるようにしてもよい。
以下、図6、図8のフローチャート図を参照して、上述したコンパイラ機能部11の処理についてより詳細に説明する。
図6は、新規作成されたソースコード21のコンパイル時の処理を示す。
図8は、既存のソースコード21の一部を修正/更新等(特に変数の追加を伴う修正/更新)して成る修正版(バージョンアップ版)のソースコード21のコンパイル時の処理を示す。
まず、図6の処理について説明する。
図6において、まず、コンパイル対象のソースコード21に記述されている各POU毎に、そのソースコードに基づいて「コンパイル(変数宣言)」処理を行うことになる。すなわち、各POUのソースコードは、大別して、変数宣言部分と本文部分とから成るものであり、当該「コンパイル(変数宣言)」処理では、この変数宣言部分を参照してステップS12〜S15の処理を行うものである。尚、特に図示しないが、変数宣言部分には、各変数の名称と型が宣言されており、更にそのPOUの名称(POU名;プログラム作成者が任意に決めている)も記述されている。
図6の処理では、全POUについて「コンパイル(変数宣言)」処理済みであるか否かを判定し(ステップS11)、未だ「コンパイル(変数宣言)」処理を行っていないPOUがある場合には(ステップS11,NO)、当該未処理のPOUのうちの1つを処理対象として、「コンパイル(変数宣言)」処理(ステップS12〜S15の処理)を実行する。
すなわち、処理対象POUのソースコードの上記変数宣言部分を読み込み(ステップS12)、これに基づいて「ソースコード識別番号対応表」22と「変数情報管理表」24を作成する(ステップS13〜S15)。
すなわち、まず、上記ステップS12で読み込んだPOUのソースコードの上記変数宣言部分に基づいて、「ソースコード識別番号対応表」22にPOU名と識別番号を登録する(ステップS13)。そして識別番号を更新する(ステップS14)。
ここで、図7に、「ソースコード識別番号対応表」22の具体例を示す。
図示の例の「ソースコード識別番号対応表」22は、POU名71、識別番号72の各データ項目より成る。POU名71には、上記処理対象POUのソースコードの上記変数宣言部分から得られるPOU名等(そのPOUの識別情報)が格納される。識別番号72には、POU名71のPOUに対して任意に割り当てた識別番号が格納される。ここでは識別番号の初期値を‘1’とし、上記ステップS14の処理で+1インクリメントする更新を行うものとし、それによって図7に示すように識別番号72は1,2,3,4等となっている。
上記ステップS14の処理に続いて、上記処理対象POUに関する「変数情報管理表」24を作成する(ステップS15)。すなわち、まず、予め設定されている「変数情報管理表」24の雛形(図4(a)は作成済みの状態を示すが、雛形では未だデータは何も格納されていない)を取得して、これに上記処理対象POUのPOU名/識別番号を付与すると共に、この処理対象POUのソースコードの上記変数宣言部分に記述されている各変数に関する情報(上記のように変数名や型など)を、上記取得した雛形に登録する。
例えば図4(a)に示す例は、処理対象POUがFB1であり、そのソースコードの変数宣言部分に最初に記述されている変数の変数名は変数1であり、その型はINT型であり、そのサイズは1W(ワード)であったものとしている。それ故に図示のように変数名51と型52に、それぞれ、変数1、INT(1)が登録される。また、最初に登録される変数に関してはその相対位置53は必ず‘0’とする。
尚、図6の処理では初期ブロックへの割当てになるので、逐一述べないが、格納先ブロック54は図4(a)に示すように全てのレコードで‘0’となる。
また、ここでは、変数宣言部分に2番目に記述されている変数の変数名は変数2であり、その型はWORD型であり、そのサイズは1W(ワード)であったものとしている。これより、図示のように変数2に関しては、変数名51と型52に、それぞれ、変数2、WORD(1)が登録される。そして、相対位置53に関しては、1つ前のレコードにおける型52(そのサイズ)に相対位置53を加算した値を登録する。ここでは、1つ前のレコードの型52はINT(1)、相対位置53は‘0’であるので、1+0=1が、図示の通り変数2のレコードの相対位置53に登録されることになる。
そして、全ての変数の登録が完了したら、続いて、変数名51に所定の名称(「予備領域」と「追加変数格納先アドレス」)をそれぞれ登録すると共に、それぞれに対応する所定のサイズ(予め決められている)を型52に登録する。図示の例では両方ともサイズ=‘2’となっている。そして、上記変数2の場合と同様にして相対位置53を算出して登録する。これは「予備領域」に関してはWORD(1)+1=2が登録され、「追加変数格納先アドレス」に関しては2+2=4が登録されることになる。
尚、上記処理の際に、更に、最後のレコード(「追加変数格納先アドレス」のレコード)における型52(そのサイズ)に相対位置53を加算した値を、当該対象POU(ここではFB1)に関する上記ブロックの全体サイズとして算出しておき、これを後述する「POUインスタンスアドレス割付対応表」26の作成の際にそのインスタンスサイズ64に登録するようにしてもよい。上記の例では、「追加変数格納先アドレス」のレコードおける型52(そのサイズ)は‘2’、相対位置53は‘4’であるので、このブロックの全体サイズ=2+4=6が求められ、これによって図5(a)の例ではFB1に関するインスタンスサイズ64は‘6’となっている。
コンパイル対象のソースコード21に記述されている全てのPOUに関して上記コンパイル(変数宣言)処理を実行したならば(ステップS11,YES)、続いて、当該全てのPOUについてステップS17〜S20によるインスタンス化処理を実行する。これは、ソースコード21(例えばPG)を先頭から順次参照していき、POU(FBやFCT)呼び出しの記述がある毎に(更に呼び出されたPOUに更に他のPOUの呼び出しの記述がある毎に)当該呼び出されるPOUのインスタンス化を実行する。
例えば、上記の例では例えばPGにおいてFB1呼出し、FB2呼出し、FB1呼出しの記述があった場合、上記一例のようにFB1に関しては2回のインスタンス化でインスタンス1とインスタンス3が得られ、FB2に関しては1回のインスタンス化でインスタンス2が得られることになる。
ソースコード21に記述されている全てのPOUについてインスタンス化処理を実行したら(ステップS16,YES)、ステップS21以降の処理へと移行する。
以下、ステップS17〜S20の処理(インスタンス化処理)について説明する。このインスタンス化処理は、上記各POU毎のインスタンス毎に、その上記ブロックのメモリ領域を確保すると共に、このブロック領域の先頭アドレス(実アドレス)とサイズを「POUインスタンスアドレス割付対応表」26に登録する処理である。
まず、処理対象POUに関する上記「変数情報管理表」24を読み込む(ステップS17)。そして、処理対象POUに関して確保すべきメモリ領域全体の(上記ブロックの)サイズを計算する(ステップS18)。この計算方法は既に述べた通りであり、上記の通り対象POUがFB1の場合には全体サイズ(ブロックサイズ)=‘6’が算出されることになる。
続いて、「POUインスタンスアドレス割付対応表」26を参照して空きアドレスを検索する(ステップS19)。これは、例えば上記確保すべきブロックの先頭アドレスを求めるものである。
例えば、FB1に関する2回目のインスタンス化の場合、図5(b)の例では4つのレコードが登録されているが、ここではそのうちの最初の2つのレコードのみが「POUインスタンスアドレス割付対応表」26に登録されている状態となっていることになる。つまり、インスタンス番号61が‘1’である先頭レコードと‘2’である2番目のレコードとが登録されている状態である。
この状態で上記FB1に関する2回目のインスタンス化処理が行われる場合、POU名は当然「FB1」であり、またインスタンス番号=‘3’が割り当てられ、FB1に関する全体サイズは上記の通り‘6’が算出されているので、当該インスタンス3のブロックの領域の先頭アドレスが分かれば、「POUインスタンスアドレス割付対応表」26への新規登録が行える。この先頭アドレスは、現時点での最後のレコード(ここでは2番目のレコード)における先頭アドレス63にインスタンスサイズ64を加算することで求められる。2番目のレコードの先頭アドレス63は‘1006’、インスタンスサイズ64は‘12’であるので、1006+12=1018が算出される。
以上得られた情報を、図示の通り、3番目のレコードにおけるインスタンス番号61、POU名62、先頭アドレス63、インスタンスサイズ64に格納する。更に、既に述べたように追加変数格納先アドレス65には“NULL”が格納され、追加変数格納先サイズ66には‘0’を格納する。このようにして「POUインスタンスアドレス割付対応表」26に新規レコードを登録したら(ステップS20)、ステップS16に戻り、全てのインスタンス化が行われたか否かを判定し、全インスタンス化が完了したならば(ステップS16,YES)、ステップS21の処理へ移行する。
上記インスタンス化処理が完了したら、最後に、コンパイル対象のソースコード21における各POU毎に「コンパイル(コード)」処理を行う。既に説明した「コンパイル(変数宣言)」処理は上記変数宣言部分に基づく処理であったが、「コンパイル(コード)」処理は上記本文部分を機械語に変換する処理である。
特に例示はしないが、本文部分には、上記変数宣言部分で宣言された各種変数を用いた任意の処理が記述されており、これを機械語に変換する際にアドレス割り当てを行う必要がある。
ステップS21では全てのPOUインスタンスについて「コンパイル(コード)」処理を実行したか否かを判定し、全POUインスタンスについて実行済みならば(ステップS21,YES)本処理を終了する。一方、未処理のPOUインスタンスがあるならば(ステップS21,NO)、そのうちの1つを処理対象として、基本的には、この処理対象POUのソースコード(本文部分)を読み込み(ステップS22)、このソースコードを機械語に変換するものである(ステップS26)。但し、ステップS26の処理の前に、「POUインスタンスアドレス割付対応表」26の読込み(ステップS24)、及び処理対象POUに関する「変数情報管理表」24の読込みを行ったうえで(ステップS25)、これらを参照して「変数のアドレス解決」処理を行い(ステップS23)、以って1POU分の機械語オブジェクト生成を行う(ステップS26)。
すなわち、まず、処理対象POUのPOU名を用いて「POUインスタンスアドレス割付対応表」26を検索して、該当するレコードを見つける毎に、そのレコードの先頭アドレス63や追加変数格納先アドレス65等を用いて、更に「変数情報管理表」24も参照して、「変数のアドレス解決」処理を行う。尚、上記該当するレコードとは、そのPOU名62が、上記処理対象POUのPOU名と同一であるレコードである。
基本的には、上記該当レコードの先頭アドレス63と、各変数毎の型52及び相対位置53とによって、各変数のアドレス解決が実現されるが、上記追加変数格納領域に格納される変数に関しては更に追加変数格納先アドレス65等を用いる処理が必要となる。詳しくは後述する。
上記「変数のアドレス解決」及び機械語への変換処理については、後に具体例を用いて説明するものとする。
次に、図8の処理について説明する。
尚、図8では省略しているが、図示のステップS31の判定がYESとなった場合には、更に続いて図6のステップS21〜S26の処理を実行する。
図8の処理の場合、既に述べた通り、コンパイル対象は上記修正版/更新版(バージョンアップ版等)のソースコード21である。これは例えば人間が判断して指定することで図6と図8の何れかの処理が実行されるようにしている。つまり、特に図示しないが、ユーザがコンパイル処理を指示する操作ボタンには、新規用と修正版用の2種類あり、ユーザが新規用を操作した場合には図6の処理が実行され、修正版用を操作した場合には図8の処理が実行される。
あるいは、ユーザが特に指定しなくても開発支援装置(ローダ)10が自動的に図6、図8のどちらの処理を実行するのかを判断するようにしてもよい。これは、例えばオンラインの場合には図8の処理を実行し、オフラインのときには図6の処理を実行するようにしてもよい。尚、オンラインの場合とは、PLCを保守する為に開発支援装置(ローダ)10がPLC30に接続され且つ両者の通信が確立しているときである。
上記修正版のソースコード21のコンパイル時にその各POU毎に本処理(ステップS32〜S39の処理)を実行し、全てのPOUについて本処理を実行済みとなったら(ステップS31,YES)、本処理を終了する(上記ステップS21〜S26の処理に移行する)ものである。
未処理のPOUがある場合、そのうちの1つを処理対象として、当該処理対象POUのソースコードを読み込み(ステップS32)、更に当該処理対象POUに関する上記「変数情報管理表」24を読み込み(ステップS33)、これらに基づいて追加変数があるか否かを判定する(ステップS34)。すなわち、ステップS32で読み込んだソースコードの変数宣言部分に記述されている全ての変数名を取得して、これらの変数名が全て上記「変数情報管理表」24の変数名51に登録されているか否かをチェックする。未登録の変数が1つも無い場合には、追加変数は存在しないと判定し(ステップS34,NO)、ステップS31に戻る。
一方、未登録の変数がある場合には、当該未登録の変数が追加変数ということになり、ステップS34の判定はYESとなり、ステップS35へ移行する。
ステップS35では、全ての追加変数を予備領域に割付可能か否かを判定する。これは、まず、各追加変数の“型”を上記ソースコードから抽出する。“型”は上記INT、WORD等であり、“型”によってその変数のサイズ(占有領域)が決まるものである。上記の例では、INT、WORDは両方とも、サイズ(占有領域)が1W(ワード)となるものである。上記“型”によって、各追加変数のサイズが分かるので、これらの合計を求めることで追加変数全体のサイズが分かる。一方、ステップS33で読み込んだ「変数情報管理表」24において、変数名51が「予備領域」のレコードにおける型52を取得することで、予備領域のサイズが分かる。図4(a)の例では予備領域のサイズは‘2’であることになる。
そして、上記追加変数全体のサイズが、予備領域のサイズ以下であるならば、ステップS35の判定はYESとなり、ステップS36の処理を実行する。
ステップS36では、追加変数のメモリ割当てを行い、それに伴って「変数情報管理表」24を更新する。
例えば、図4(a)の例に対して、例えば追加変数が1つだけであり(仮に、変数名を“追加変数1”とする)、且つ、その型がINTであったとしたならば、追加変数全体のサイズ(占有領域)は1W(ワード)であり、予備領域のサイズは‘2’であることから、上記ステップS35の判定はYESとなる。
そして、この例では、特に図示しないが、図4(a)に示す「変数2」のレコードの次のレコード(空きレコード)に、“追加変数1”に関する登録を行う。すなわち、特に図示しないがこのレコードでは、変数名51が“追加変数1”、型52がINT(1)、相対位置53が‘2’、格納先ブロック54が‘0’となる。尚、相対位置53の求め方は既に述べた通りである。
これに伴って予備領域の確保分を削減しなければならないので、図4(a)に示す「予備領域」のレコードの型52と相対位置53を更新する。型52は‘2’であったが、上記追加変数のサイズである1W(ワード)を差し引くことで、‘1’に更新されることになる。また、相対位置53は‘3’となる。尚、相対位置53の求め方は既に述べた通りである。
一方、例えば追加変数が2つあって(仮に“追加変数1”と“追加変数2”とする)、各サイズ(占有領域)が2W(ワード)であった場合、合計で4W(ワード)となる為、上記予備領域では対応できず、ステップS35の判定はNOとなる。尚、ここでは“型”がDINTである場合には、2W(ワード)必要であるものとする。
ステップS35がNOの場合には、上記追加変数格納領域(追加ブロック)を確保すると共に、当該追加ブロック領域のアドレス情報や追加変数の割当て情報を、上記各種テーブル24、26(管理表24、対応表26)などに登録する。
まず、「変数情報管理表」24に拡張用の情報を追加する(ステップS37)と共に追加変数を登録する(ステップS38)。これによって、例えば図4(a)に示す例の「変数情報管理表」24は、図4(b)に示す状態になる。図示のように拡張用の情報(レコード)は、格納先ブロック54を全て‘1’とすることで、上記追加変数格納領域(追加ブロック)における割当て情報であることを示す。追加ブロックの場合も、初期ブロックに関する割当て情報(図4(a)に示すもの)と同様に、変数だけでなく、予備領域及び追加変数格納先アドレスの領域も確保して、図示のように相対位置53と型52(サイズ)を登録する。
そして、追加変数を割当てるが、これはまず初期ブロックの予備領域への割当てを試みて、割当て可能であるならば初期ブロックの予備領域への割当てを行う。本例では、追加変数1,2の両方を初期ブロックの予備領域に割当てることは出来ないが、追加変数1のみは割当て可能なので、図4(b)に示すように追加変数1は初期ブロックの予備領域への割当てを行う。これによって初期ブロックでは予備領域は無くなることになる。尚、追加変数1の初期ブロックへの割当て処理は、上記ステップS36と略同様であってよい。但し、本例ではこれによって初期ブロックの予備領域の型52が‘0’になるので、この場合には初期ブロックの予備領域のレコードを削除する。
一方、この例では追加変数2は、初期ブロックに割当てることはできないので、追加ブロック内に割当てる。よって、図示の通り、追加変数2に関するレコードの格納先ブロック54は‘1’となっている。この点を除けば、追加変数2の追加ブロック内への割当て処理は、上記変数1、2の初期ブロックへの割当て処理と略同様であり、ここでは詳細には説明しないが、図示の通り、型52にはDINT(2)が登録されると共に、相対位置53には‘0’が登録されることになる。
尚、予備領域や追加変数格納先アドレスのサイズは、予め任意に決められて設定されているものとし、ここでは予備領域のサイズは、初期ブロックに関しては‘2’であるが、追加ブロックに関しては‘8’が設定されているものとしている。追加変数格納先アドレスに関して、初期ブロック、追加ブロックどちらもサイズ=‘2’となっている。
以上、「変数情報管理表」24の更新を行ったら、続いて、「POUインスタンスアドレス割付対応表」26の更新を行う(ステップS39)。すなわち、図5(a)ではNULLで‘0’としていた追加変数格納先アドレス65及び追加変数格納先サイズ66に、上記追加ブロックの領域の先頭アドレスとサイズを登録する。これによって例えば図5(b)に示す状態となる。
尚、追加変数格納先サイズ66は、上記インスタンスサイズ64と同様に、「変数情報管理表」24に基づいて求めることができる。また、追加変数格納先アドレス65は、既に確保済みの領域のなかで最後のブロックの領域情報、すなわち図示の例ではPOU名が「PG1」のブロックの先頭アドレス63=1024とインスタンスサイズ64=10とに基づいて、1024+10=1034が求められることになる。
尚、上記ステップS36またはS39の処理後は、ステップS31に戻る。
上記図8の処理が完了したら、図6におけるステップS21〜S26の処理を実行することになる。当然、この場合には、例えば図4(b)と図5(b)に示す状態のテーブル24、26を参照して、処理実行することになる。
以上、図8の処理について説明した。
ここで、上述してあった通り、上記ステップS23〜S26の処理について、以下、具体例を示して説明する。換言すれば、コンパイラの機械語コード生成例について以下に説明する。
まず、以下の何れの例においても、本説明で用いるソースコードは、下記のような単純な例であるものとする。
ソースコード例; 変数2:=変数1;
すなわち、変数1の値を変数2に代入するという単純な処理である。
まず最初は、上記ソースコード例がプログラムPG1に記述されたものであるとする。
この場合、まず「POUインスタンスアドレス割付対応表」26(図5(b))を参照することで、PG1の先頭アドレス(1024)が得られる。また、「変数情報管理表」24を参照することで、変数1、変数2それぞれのオフセットアドレス(相対位置)が得られる。図4等にはPG1に関する「変数情報管理表」24の具体例は図示していないが、仮に、変数1の相対位置53が‘0’、変数2の相対位置53が‘2’であったとするならば、上記PG1の先頭アドレス(1024)に、これら各変数のオフセット値を足した値が、各変数の実アドレスとなる。すなわち、1024+0=1024が変数1の格納アドレス(実アドレス)となる。同様に、1024+2=1026が変数2の格納アドレス(実アドレス)となる。
以上のことからPG1の場合、上記ソースコード例に応じた機械語例は、以下のようになる。
LD B 1024
ST B 1026
尚、よく知られているように、LD命令は、指定したアドレスの内容を演算用メモリに読み込む命令である。ST命令は、演算用メモリの内容を指定したアドレスに書き込む命令である。更に、LD命令と指定アドレス(ここでは1024)との間の‘B’は、領域サイズを指定する為のオプションであり、‘B’は1バイト分を意味する。尚、同様にして、Wは2バイト分、Tは4バイト分を意味する。よって、上記「LD B 1024」は“1024番地から1バイト分の領域の内容を演算用メモリに読み込む”ことを意味する。これはST命令に関しても同様である。尚、例えば「LD W 1024」は“1024番地から2バイト分の領域(つまり1024番地〜1025番地)の格納データを演算用メモリに読み込む”ことになる。
プログラム(PG)の場合は、1POUが1つだけインスタンス化されるため、変数にアクセスするコードを直接アドレス(実アドレス)で機械語を生成しても問題が無いが、FBの場合、1つのPOUが複数インスタンス化されるため問題が発生する。
例えば上記の例でFB1の場合には、図4、図5に示す例より、上記ソースコード例に応じた機械語例は、以下のようになる。
LD B 1000
ST B 1001
FB1に関して1つだけインスタンス化されるならば、これでも問題はないが、上記の通り、複数インスタンス化された場合、全てのインスタンスが同じアドレスへアクセスするため(LDでは1000番地、STでは1001番地)、FB内の変数の独立性が保てない(FB内の内部変数は、独立していることが規約で定められている)。
そこで、コンパイラ機能部11は、コンパイル対象POUがFB(ここではFB1)の場合には、例えば下記のようにベースポインタ(Base)経由で変数にアクセスする機械語を生成する。
LD B Base+0
ST B Base+1
ここで、各FBの実行時には、上記Baseポインタにはインスタンスの先頭アドレスが入ることになり(図4、図5の例の場合、インスタンス1の場合にはBase=1000、インスタンス2の場合にはBase=1018が代入されることになる)、これはFBを呼び出すPOUが設定するものである。以下、まず、FB1を呼び出すPOUが、PGである場合について、具体的な機械語コードの生成例を示して説明する。
PGからFB1(ここではFB1のインスタンス1)を呼び出す場合の例を、以下に示す。この場合、コンパイラ機能部11はコンパイル時に、上記各種テーブル22、26等を参照して、上記PGからFB1を呼出すと共にその際に上記Baseポインタの設定を行う機械語コードを生成する。
すなわち、基本的に、任意のFB(そのインスタンス)を呼び出す場合は、その識別番号(POUの識別番号)とインスタンスアドレス(先頭アドレス)が必要である。これより、まず、図7に示すソースコード識別番号対応表22を参照して、呼び出すFB(ここではFB1)の識別番号72(ここでは‘1’)を取得する。また、インスタンスアドレスは、上記「POUインスタンスアドレス割付対応表」26から取得する。図5の例では、FB1のインスタンス1の先頭アドレス63は‘1000’となっている。
これより、PGにおけるFB1(インスタンス1)を呼び出しに係る機械語コードが、以下のように生成されることになる。
LD T1000
ST Base
CALL 1
尚、「LD 1000」は1000番地のデータを演算用メモリに読み込むものであるが、上記「LD T1000」は、Tの後の数値(ここでは1000)を演算用メモリに読み込むものである。従って、上記機械語は、‘1000’を取得して、これをBaseに代入した後、FB1を呼び出す処理となる。
そして、この場合、呼び出されたFB1の上記機械語の処理は、実質的に以下の内容と同等となる。
LD B 1000+0
ST B 1000+1
尚、CALL命令は、識別番号(ここでは‘1’)によって指定されたPOUを呼び出す命令である。
尚、同じFB1を用いる場合でも、インスタンス3の場合には、以下の機械語が生成されることになる。
LD T1018
ST Base
CALL 1
この場合、呼び出されたFB1の上記機械語の処理は、実質的に以下の内容と同等となる。
LD B 1018+0
ST B 1018+1
PGの場合、上記「LD 1000」のように直接アドレス(実アドレス)をコード上に記述することができる。
呼び出し元がFBの場合も、上記と略同様であってよいので、ここでの説明は省略する。
次に、以下、追加変数へのアクセスに係わる機械語コード生成例について説明する。
例えば、下記のソースコードをコンパイルして機械語コードを生成する例を用いて説明する。
ソースコード例;
追加変数2:=変数2;
つまり、変数2の内容を追加変数2に代入する処理である。
尚、特に説明しないが、本例においても当該FBの呼出元のPOUが、Baseの値を設定している。尚、本例のFBは、上記FB1であるものとする。そして、FB1に係る変数情報管理表24は、図4(b)に示す状態となっているものとする。
この場合、図4(b)に示すFB1の「変数情報管理表」24を参照して、まず、変数2に関しては、格納先ブロック54が‘0’であるので、初期ブロックに格納されていると判定し、そのオフセット(相対位置53)が‘1’であることから、変数2に対応するアドレスは「Base+1」であると決定する。従って、上記ソースコード例ではまず変数2に対応するアドレスの格納データを読み出すことになるので機械語コード「LD Base+1」が生成される。
続いて、追加変数2に関しては、図4(b)に示すFB1の「変数情報管理表」24の例では格納先ブロック54が‘1’であるので、「追加変数格納先アドレス1」経由でアクセスするものと判定すると共に、そのオフセット(相対位置53)=‘0’を取得して一時的に記憶する。そして、「変数情報管理表」24において変数名51が“追加変数格納先アドレス1”であるレコードを参照することで、そのオフセット(相対位置53)が‘4’であることから、対応するアドレスは「Base+4」であると判定する
以上の処理に基づいて、下記の機械語コードを生成することになる(尚、以下の例では上記BやW等は省略している)。
LD Base+1
LDAX Base+4
ADDAX 0
ST AX
尚、上記機械語コードにおいて、LDAX命令は、指定されたアドレスの格納データを、AXレジスタ(アドレス演算用の内部変数)にセットする命令である。上記の例の場合、アドレス“Base+4”の格納データを、AXレジスタにセットすることになる。
FB1のインスタンス1の場合、Base=1000が設定されているはずであるので、アドレス“1004”の格納データを、AXレジスタにセットすることになる。尚、アドレス“1004”には予めインスタンス1に係わる追加ブロックの先頭アドレス(本例では‘1034’)が格納されている。これについては後に図9を参照して説明する。
なお、FB1のインスタンス3の場合、Base=1018が設定されているはずであるので、アドレス“1022”の格納データを、AXレジスタにセットすることになる。尚、アドレス“1022”には予めインスタンス3に係わる追加ブロックの先頭アドレス(本例では‘1044’)が格納されている。これについても後に図9を参照して説明する。
また、ADDAX命令は、AXレジスタの格納内容に、指定した数字を加算する命令であり、上記機械語においては追加変数2の格納アドレスを演算している。インスタンス1の場合には、アドレス“1004”の格納データ(‘1034’)に‘0’が加算された値が、AXレジスタの新たな格納データとなる。インスタンス3の場合には、アドレス“1022”の格納データ(‘1044’)に‘0’が加算された値が、AXレジスタの新たな格納データとなる。
また、上記「ST AX」は、AXレジスタの格納データが示すアドレスに、上記1行目のLD命令でロードしたデータ(変数2のデータ)を格納する命令である。従って、本例では、インスタンス1の場合にはアドレス‘1034’に変数2のデータを格納することになり、インスタンス3の場合にはアドレス‘1044’に変数2のデータを格納することになる。
ここで、上記アドレス“1004”や“1022”には、予めPLC30が、開発支援装置10から機械語オブジェクト23と共にダウンロードされたPOUインスタンスアドレス情報25に基づいて、該当データを設定しておく。
図9に、上記図4(b)、図5(b)の例に応じたPOUインスタンスアドレス情報25の一例を示す。
図9の例のPOUインスタンスアドレス情報25は、アドレス81と値82から成る。
アドレス81には“追加変数格納先アドレス”のアドレスが格納され、値82には追加変数格納領域の先頭アドレスが格納される。
図4(b)に示すFB1の「変数情報管理表」24では“追加変数格納先アドレス”のオフセット(相対位置53)が‘4’である。また、図5(b)の「POUインスタンスアドレス割付対応表」26の例では、FB1によるインスタンス1の先頭アドレス63は‘1000’、追加変数格納先アドレス65は‘1034’となっており、FB1によるインスタンス3の先頭アドレス63は‘1018’、追加変数格納先アドレス65は‘1044’となっている。これより、図9に示すように、アドレス81が‘1004’(=1000+4)に対して値82が‘1034’となっており、アドレス81が‘1022’(=1018+4)に対して値82が‘1044’となっている。
以上のPOUインスタンスアドレス情報25生成処理は、例えばコンパイラ機能部11がコンパイルの際に行うものであり、その後、コンパイル結果として得られる機械語オブジェクト23と共にPOUインスタンスアドレス情報25がPLC30にダウンロードされる。これより、PLC30側では(例えばプログラム実行管理機能部31が)、当該新たな機械語オブジェクト23による運用を開始する前に、POUインスタンスアドレス情報25に基づく設定処理を行う。
図9に示す例では、アドレス‘1004’にデータ“1034”を格納し、アドレス‘1022’に対してデータ“1044”を格納することになる。この例の場合、上記「LDAX Base+4」は、インスタンス1の場合にはアドレス‘1004’の格納データすなわち“1034”を、AXレジスタに格納することになり、インスタンス3の場合にはアドレス‘1022’の格納データすなわち“1044”を、AXレジスタに格納することになる。
尚、POUインスタンスアドレス情報25の代わりに「POUインスタンスアドレス割付対応表」26をPLC30にダウンロードすることで、PLC30側で上記設定処理を行わせるようにしてもよい。但し、「POUインスタンスアドレス割付対応表」26は、
データ量が多い為、PLCでは扱いにくいので、該当アドレスとその内容(追加変数格納領域の先頭アドレス)を取り出した情報を格納したのが、上記「POUインスタンスアドレス情報」25である。PLC30は、この情報25を獲得し、PLC30内のメモリに、上記該当アドレスで指定された場所に値を展開する。
尚、上記のBaseポインタの設定例は、コンパイラ(コード生成)で実施しているが、PLC内のシステム(Call内)で同様な動作を実施することも可能である。
以上説明したように、本例のプログラマブルコントローラの支援装置によれば、ユーザが変数追加を伴うプログラムの更新を実施しても、既に割り付けた変数(既存の変数)のアドレス(割当位置)を変更することなく、追加した変数を新しいアドレスに割り付けることが可能になり、PLCを停止しないで(PLCを停止することは、システムを停止することになる)、プログラムを更新できるため、システムの稼動性、保守性、拡張性が向上する。特に既に確保済みのブロックのみでは全ての追加変数を割り当てられない場合であっても、追加ブロックを生成して追加変数を格納できるので、最初に確保したブロックのサイズ(予備領域のサイズ)によって制限を受けることなく、変数の追加を行うことができる。
10 開発支援装置(ローダ)
11 コンパイラ機能部
12 インタフェース機能部
13 通信機能部
14 ディスプレイ
15 入力装置
20 記憶部
21 ソースコード
22 ソースコード識別番号対応表
23 機械語オブジェクト
24 変数情報管理表
25 POUインスタンスアドレス情報
26 POUインスタンスアドレス割付対応表
30 PLC(プログラマブルコントローラ)
31 プログラム実行管理機能部
32 通信機能部
40 記憶部
41 機械語オブジェクト
42 POUインスタンスアドレス情報
43 POUインスタンスメモリ領域
51 変数名
52 型
53 相対位置
54 格納先ブロック
61 インスタンス番号
62 POU名
63 先頭アドレス
64 インスタンスサイズ
65 追加変数格納先アドレス
66 追加変数格納先サイズ
71 POU名
72 識別番号
81 アドレス
82 値

Claims (8)

  1. プログラマブルコントローラ用の任意のプログラムのソースコードをコンパイルして機械語オブジェクトを生成する支援装置と、プログラマブルコントローラとから成るプログラマブルコントローラ・システムであって、
    前記支援装置は、
    前記ソースコードのコンパイルの際に、前記ソースコードに含まれるPOUに、そのPOUに係わる変数の格納領域と予備領域と追加変数格納先記憶領域を相対アドレスで示す領域情報を保持する変数情報記憶手段と、
    前記ソースコードのコンパイルの際に、前記POUのインスタンスに、そのインスタンスに関して確保された一塊のメモリ領域であるブロックに関する情報として少なくともその先頭アドレスを記憶するインスタンス情報記憶手段と、
    前記変数情報記憶手段と前記インスタンス情報記憶手段とを参照して、前記変数を前記インスタンスにメモリ割当てを行いながら、前記任意のプログラムのソースコードを前記機械語オブジェクトに変換するコンパイル手段と、
    前記プログラムの修正版/更新版である修正/更新プログラムのソースコードをコンパイルする際に、該ソースコードに含まれるPOUに、前記変数情報記憶手段を参照して追加変数の有無をチェックし、追加変数がある場合には前記予備領域で対応可能か否かを判定し、対応できる場合には該予備領域に追加変数を割当て、対応できない場合には、該POUのインスタンスに追加のブロックを確保すると共に、既存のブロックの前記追加変数格納先記憶領域に該追加ブロックの先頭アドレスを格納させる為の情報を生成し記憶する追加変数対応手段と、
    を有することを特徴とするプログラマブルコントローラ・システム。
  2. 前記コンパイル手段は、前記修正/更新プログラムの前記機械語オブジェクトへの変換に関しては、前記追加変数の有無に係らず、既存の変数に関しては前記変数情報記憶手段の前記領域情報に基づいて前回コンパイル時と同じアドレスを割り当てることを特徴とする請求項1記載のプログラマブルコントローラ・システム。
  3. 前記コンパイル手段は、前記修正/更新プログラムの前記機械語オブジェクトへの変換に関しては、前記追加変数格納先記憶領域経由で前記追加変数にアクセスする機械語オブジェクトを生成することを特徴とする請求項1記載のプログラマブルコントローラ・システム。
  4. 前記支援装置は、前記追加変数格納先記憶領域のアドレスと該追加変数格納先記憶領域に記憶される前記追加ブロックの先頭アドレスとの対応関係情報を、前記修正/更新プログラムの機械語オブジェクトと共に前記プログラマブルコントローラにダウンロードし、
    前記プログラマブルコントローラは、該修正/更新プログラムの機械語オブジェクトを実行開始する前に、前記対応関係情報に基づいて、前記追加変数格納先記憶領域に前記追加ブロックの先頭アドレスを格納することを特徴とする請求項3記載のプログラマブルコントローラ・システム。
  5. 前記コンパイル手段は、前記POUの一種であるPGに関しては、前記ブロックの先頭アドレスと前記変数の相対アドレスとによって変数の割当位置の実アドレスを求めて、該実アドレスを用いて前記機械語オブジェクトを生成することを特徴とする請求項1記載のプログラマブルコントローラ・システム。
  6. 前記コンパイル手段は、前記POUの一種であるファンクションブロックに関しては、ベースポインタと前記変数の相対アドレスとによって変数の割当位置にアクセスさせる機械語オブジェクトを生成すると共に、該ファンクションブロックのインスタンスの呼び出し元POUが、該ファンクションブロックのインスタンスに対応する前記ブロックの先頭アドレスを前記ベースポインタにセットしてから該ファンクションブロックのインスタンスを呼び出す機械語オブジェクトを生成することを特徴とする請求項1記載のプログラマブルコントローラ・システム。
  7. 前記変数情報記憶手段には、前記変数に、その変数が前記既存のブロックと前記追加ブロックのどちらに割り当てられたかを示す情報も記憶されることを特徴とする請求項1記載のプログラマブルコントローラ・システム。
  8. プログラマブルコントローラ用の任意のプログラムのソースコードをコンパイルして機械語オブジェクトを生成する支援装置であって、
    前記ソースコードのコンパイルの際に、前記ソースコードに含まれるPOUに、そのPOUに係わる変数の格納領域と予備領域と追加変数格納先記憶領域を相対アドレスで示す領域情報を保持する変数情報記憶手段と、
    前記ソースコードのコンパイルの際に、前記POUのインスタンスに、そのインスタンスに関して確保された一塊のメモリ領域であるブロックに関する情報として少なくともその先頭アドレスを記憶するインスタンス情報記憶手段と、
    前記変数情報記憶手段と前記インスタンス情報記憶手段とを参照して、前記変数を前記インスタンスにメモリ割当てを行いながら、前記任意のプログラムのソースコードを前記機械語オブジェクトに変換するコンパイル手段と、
    前記プログラムの修正版/更新版である修正/更新プログラムのソースコードをコンパイルする際に、該ソースコードに含まれるPOUに、前記変数情報記憶手段を参照して追加変数の有無をチェックし、追加変数がある場合には前記予備領域で対応可能か否かを判定し、対応できる場合には該予備領域に追加変数を割当て、対応できない場合には、該POUのインスタンスに追加のブロックを確保すると共に、既存のブロックの前記追加変数格納先記憶領域に該追加ブロックの先頭アドレスを格納させる為の情報を生成し記憶する追加変数対応手段と、
    を有することを特徴とするプログラマブルコントローラの支援装置。

JP2011100991A 2011-04-28 2011-04-28 プログラマブルコントローラ・システム、その支援装置 Active JP5790128B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2011100991A JP5790128B2 (ja) 2011-04-28 2011-04-28 プログラマブルコントローラ・システム、その支援装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2011100991A JP5790128B2 (ja) 2011-04-28 2011-04-28 プログラマブルコントローラ・システム、その支援装置

Publications (2)

Publication Number Publication Date
JP2012234272A true JP2012234272A (ja) 2012-11-29
JP5790128B2 JP5790128B2 (ja) 2015-10-07

Family

ID=47434555

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2011100991A Active JP5790128B2 (ja) 2011-04-28 2011-04-28 プログラマブルコントローラ・システム、その支援装置

Country Status (1)

Country Link
JP (1) JP5790128B2 (ja)

Cited By (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2013168031A (ja) * 2012-02-15 2013-08-29 Fuji Electric Co Ltd プログラマブルコントローラシステム、その支援装置、プログラム
JP2014153827A (ja) * 2013-02-06 2014-08-25 Azbil Corp エンジニアリング装置およびエンジニアリング方法
JP2015125713A (ja) * 2013-12-27 2015-07-06 富士電機株式会社 プログラマブルコントローラ・システム、その支援装置、プログラマブルコントローラ、プログラム
JP2016081097A (ja) * 2014-10-10 2016-05-16 富士電機株式会社 プログラマブルコントローラシステム、その支援装置、プログラマブルコントローラ
JP2018013917A (ja) * 2016-07-20 2018-01-25 株式会社Ihi ロジック更新装置及びロジック更新方法
CN111142421A (zh) * 2018-11-02 2020-05-12 横河电机株式会社 工程装置、工程装置的控制方法以及存储介质
JP7130178B1 (ja) * 2022-02-10 2022-09-02 三菱電機株式会社 プログラマブルコントローラシステム、開発支援装置、メモリ割当方法およびプログラム
JP2022161657A (ja) * 2021-04-09 2022-10-21 横河電機株式会社 プログラム修正支援装置及びプログラム修正支援方法

Citations (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH05224707A (ja) * 1992-02-13 1993-09-03 Yaskawa Electric Corp プログラマブルコントローラのプログラム変更方法
JPH08314712A (ja) * 1995-05-16 1996-11-29 Toyo Electric Mfg Co Ltd プログラマブルコントロ−ラ
JPH10207512A (ja) * 1997-01-27 1998-08-07 Omron Corp プログラマブルコントローラ
JP2000020297A (ja) * 1998-07-01 2000-01-21 Omron Corp 制御装置
JP2001142510A (ja) * 1999-11-11 2001-05-25 Omron Corp コントローラシステム及びプログラミングツール並びにコントローラ
JP2003022182A (ja) * 2001-07-10 2003-01-24 Omron Corp コントローラ
JP2005301520A (ja) * 2004-04-08 2005-10-27 Mitsubishi Electric Corp プログラミングシステム
JP2010072892A (ja) * 2008-09-18 2010-04-02 Meidensha Corp Pouの実装方式

Patent Citations (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH05224707A (ja) * 1992-02-13 1993-09-03 Yaskawa Electric Corp プログラマブルコントローラのプログラム変更方法
JPH08314712A (ja) * 1995-05-16 1996-11-29 Toyo Electric Mfg Co Ltd プログラマブルコントロ−ラ
JPH10207512A (ja) * 1997-01-27 1998-08-07 Omron Corp プログラマブルコントローラ
JP2000020297A (ja) * 1998-07-01 2000-01-21 Omron Corp 制御装置
JP2001142510A (ja) * 1999-11-11 2001-05-25 Omron Corp コントローラシステム及びプログラミングツール並びにコントローラ
JP2003022182A (ja) * 2001-07-10 2003-01-24 Omron Corp コントローラ
JP2005301520A (ja) * 2004-04-08 2005-10-27 Mitsubishi Electric Corp プログラミングシステム
JP2010072892A (ja) * 2008-09-18 2010-04-02 Meidensha Corp Pouの実装方式

Cited By (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2013168031A (ja) * 2012-02-15 2013-08-29 Fuji Electric Co Ltd プログラマブルコントローラシステム、その支援装置、プログラム
JP2014153827A (ja) * 2013-02-06 2014-08-25 Azbil Corp エンジニアリング装置およびエンジニアリング方法
JP2015125713A (ja) * 2013-12-27 2015-07-06 富士電機株式会社 プログラマブルコントローラ・システム、その支援装置、プログラマブルコントローラ、プログラム
JP2016081097A (ja) * 2014-10-10 2016-05-16 富士電機株式会社 プログラマブルコントローラシステム、その支援装置、プログラマブルコントローラ
JP2018013917A (ja) * 2016-07-20 2018-01-25 株式会社Ihi ロジック更新装置及びロジック更新方法
CN111142421A (zh) * 2018-11-02 2020-05-12 横河电机株式会社 工程装置、工程装置的控制方法以及存储介质
JP2022161657A (ja) * 2021-04-09 2022-10-21 横河電機株式会社 プログラム修正支援装置及びプログラム修正支援方法
JP7380635B2 (ja) 2021-04-09 2023-11-15 横河電機株式会社 プログラム修正支援装置及びプログラム修正支援方法
JP7130178B1 (ja) * 2022-02-10 2022-09-02 三菱電機株式会社 プログラマブルコントローラシステム、開発支援装置、メモリ割当方法およびプログラム
WO2023152890A1 (ja) * 2022-02-10 2023-08-17 三菱電機株式会社 プログラマブルコントローラシステム、開発支援装置、メモリ割当方法およびプログラム

Also Published As

Publication number Publication date
JP5790128B2 (ja) 2015-10-07

Similar Documents

Publication Publication Date Title
JP5790128B2 (ja) プログラマブルコントローラ・システム、その支援装置
US10282195B2 (en) Generating and applying patches to computer program code concurrently with its execution
JP7090657B2 (ja) アプリケーションをアップグレードするための方法、装置、デバイスならびに記憶媒体
KR101963912B1 (ko) 라이브러리 운영체제들과의 애플리케이션 호환성을 가능하게 하는 기법
JP2015526821A5 (ja)
JP2006092544A (ja) プリオペレーティングシステム環境におけるモジュールの動的リンク
US7788661B2 (en) Method and system for applying patches to a computer program concurrently with its execution
JP2007511816A (ja) 集中daマネージャを用いた動的アドレシング(da)
JP6292096B2 (ja) プログラマブルコントローラシステム、その支援装置
JP6866663B2 (ja) プログラマブルコントローラシステム、プログラマブルコントローラ、支援装置、hci装置、二重化プログラマブルコントローラシステム
JP5757098B2 (ja) プログラム作成支援装置、プログラム作成支援方法
JP2015125713A (ja) プログラマブルコントローラ・システム、その支援装置、プログラマブルコントローラ、プログラム
JP4319082B2 (ja) プログラミングシステム
JP5895616B2 (ja) 情報処理装置およびプログラム実行方法
JP6119452B2 (ja) プログラマブルコントローラシステム、その支援装置、プログラマブルコントローラ、プログラム
JP6205934B2 (ja) プログラマブルコントローラシステム、その支援装置、プログラム
JP6455096B2 (ja) コントロールシステム、その支援装置、プログラマブルコントロール装置
JP4760607B2 (ja) プログラマブルコントローラ
KR101918430B1 (ko) 시스템 설계 지원 툴
JP5978775B2 (ja) プログラマブルコントローラ、その支援装置、プログラム、プログラム転送方法
JP6295914B2 (ja) プログラマブルコントローラシステム、その支援装置、プログラマブルコントローラ
CN104106015A (zh) 可编程控制器系统、其可编程显示器、辅助装置、程序
CN110720081B (zh) 编译器及编程辅助装置
JP7499966B2 (ja) 制御装置、及び、アドレス管理方法
KR20070081868A (ko) 이동통신시스템에서 효율적으로 소프트웨어를 업데이트하는방법

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20140314

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20150120

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20150121

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20150304

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20150707

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20150720

R150 Certificate of patent or registration of utility model

Ref document number: 5790128

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250