(58)【調査した分野】(Int.Cl.,DB名)
前記ステータス出力部が生成する前記ステータス情報は、前記データベースシステムへの送信対象のデータのデータサイズ、データ本体および接続先のデータベースシステムを識別する情報の少なくともいずれかを含む、
請求項1記載のコントローラ。
前記ステータス情報を参照して前記ステータス情報に示される前記アクセスの状況に応じてデータベースシステムへのアクセス処理のリカバリを行うリカバリプログラムを保持する保持部をさらに備え、
電断からの復帰時に、前記リカバリプログラムを実行する、
請求項1記載のコントローラ。
コントローラの動作を制御するためのプログラムであって、前記コントローラは、プロセッサと、データベースシステムと接続するための通信インタフェースと、不揮発性のメモリとを備え、
前記プログラムは、前記プロセッサに、
前記データベースシステムへアクセスするためのアクセス命令を含むユーザプログラムの実行時に、前記データベースシステムへの前記通信インタフェースを介したアクセスを制御するステップと、
前記アクセス命令の実行時に、前記データベースシステムへの送信対象のデータを前記不揮発性の記憶領域に格納するステップと、
前記不揮発性の記憶領域から前記データベースシステムへの送信対象のデータを読み出して、読み出されたデータに基づき前記データベースシステムへアクセスするための命令文を生成し、生成した命令文を前記データベースシステムへ送信するステップと、
前記アクセス命令に応じて前記データベースシステムへアクセスするための処理を開始してから前記生成された命令文に基づく処理が完了するまでの間、前記命令文の実行状況を示すステータス情報を生成し、生成された前記ステータス情報を前記不揮発性の記憶領域に記憶させるステップとを実行させる、プログラム。
【発明を実施するための形態】
【0018】
以下、図面を参照しつつ、本発明の実施の形態について説明する。以下の説明では、同一の部品には同一の符号を付してある。それらの名称および機能も同じである。したがって、それらについての詳細な説明は繰り返さない。
【0019】
<実施の形態1>
図1は、本実施形態における制御システム全体の構成を示す図である。
【0020】
まず、本実施の形態に係る制御システムのシステム構成について説明する。本実施の形態においては、機械や設備などの制御対象を制御するプログラマブルコントローラ(PLC)を制御装置の典型例として説明を行う。但し、本発明に係る制御装置は、PLCに限られることなく、各種の制御装置へ適用可能である。
【0021】
図1を参照して、制御システムには、PC(Personal Computer)10と、DB(Database)サーバ20と、PLC30と、PLC40とが含まれる。PLC30とPLC40とは、後述するようなユーザプログラムを周期的またはイベント的に実行する。ユーザプログラムは、PC10の利用者によって作成される。ユーザは、例えばPC10を操作することにより、アクセス命令を含むプログラム(ソースプログラム)を作成することができる。
【0022】
PC10は、PLC30で動作させるユーザプログラムをユーザが作成するための情報処理装置である。PC10は、作成されたソースプログラムを、PLC30やPLC40において実行可能な形式に変換し、変換されたユーザプログラムを、例えばPC10と接続するPLC30へ送信する。また、PC10は、例えばUSB(Universal Serial Bus)規格などに従って、接続用のケーブルを介してPLC30と接続される。PC10は、PLC30との間で各種パラメータの設定、プログラミング、モニタ、デバッグなどの機能を提供する。
【0023】
DBサーバ20は、データベースを管理するため、DBMS(database management system)として機能するサーバである。
【0024】
PLC30とPLC40とは、ユーザプログラムを実行し、ユーザプログラムに含まれるアクセス命令に従って、DBサーバ20にアクセスすることができる。
【0025】
PLC30は、PC10と、DBサーバ20と、PLC40と接続される。例えば、PLC30とDBサーバ20とは、イーサネット(登録商標)などのネットワークを介して、データを互いに遣り取りできるように構成される。PLC30は、DBサーバ20と接続するための設定を保持しており、設定に従ってDBサーバ20へアクセスする。
【0026】
また、PLC30は、制御演算を実行するCPUユニットと、1以上のIO(Input/Output)ユニットとを含んで構成され、これらCPUユニットと、IOユニットとは、システムバスを介してデータを互いに遣り取りできるように構成される。PLC30は、これらIOユニット等を通じて、各種のフィールド機器との間でデータを遣り取りする。これらのフィールド機器は、制御対象に対して何らかの処理を行うためのアクチュエータや、制御対象から各種情報を取得するためのセンサなどを含む。また、PLC30は、フィールドバスを介して、外部の各種のフィールド機器と接続し、これらフィールド機器との間でデータをやり取りする。PLC30は、センサ出力などを外部から受け付けてデータを蓄積し、蓄積されたデータを、後述するDBアクセス処理プログラム35によりDBサーバ20へ送信する。
【0027】
また、PLC30は、他のPLC(
図1の例ではPLC40)がDBサーバ20へ送信するデータを受け付けて、受け付けたデータをDBサーバ20へ送信する。PLC40は、センサ出力などを外部から受け付けてデータを蓄積し、蓄積されたデータを、PLC30を介してDBサーバ20へ送信する。
【0028】
<各機器の構成の詳細>
次に、各機器の構成の詳細について説明する。
【0029】
図2は、PC10の機能を示すブロック図である。
PC10は、CPU(Central Processing Unit)、ROM(Read Only Memory)、RAM(Random Access Memory)等を備えるコンピュータシステム(情報処理装置)である。
図2を参照して、PC10は、PLC30を動作させるためのユーザプログラムをユーザが作成するためのプログラミングツール12の機能を発揮する。プログラミングツール12は、命令実行状態取得部14と、プログラミング機能16との機能を含む。ユーザがプログラミングツール12により作成したユーザプログラムは、PLC30へ送信され、PLC30で実行される。
【0030】
命令実行状態取得部14は、PLC30に対し、PLC30のメモリに保持されるステータス情報51の内容をPC10へ送信するよう指示するためのソフトウェアである。
【0031】
プログラミング機能16は、ユーザによるプログラム作成を支援するためのソフトウェアである。これらソフトウェアがPC10において実行されることにより、命令実行状態取得部14とプログラミング機能16等の機能が発揮される。
【0032】
図3は、DBサーバ20の機能を示すブロック図である。DBサーバ20は、大容量の記憶装置などを備える。
【0033】
DBサーバ20は、データベースへの読み出しおよび書き込みを管理するDBMS22の機能を発揮する。DBMS22は、データベースとして機能するDB24へのデータの書き込みおよび読み出しを制御する。DB24は、複数件のデータレコードを保持するための記憶領域であり、DBMS22の制御に従ってデータの保持等を行う。
【0034】
図4は、PLC30の機能を示すブロック図である。PLC30は、ユーザプログラムを周期的に実行する。PLC30は、PLC30内のメモリ領域の情報を読み書きして、ユーザプログラムに示される命令を順に実行する。PLC30は、入出力機能を備えており、センサ出力などPLC30の外部からデータを受け付けて、データを蓄積する。PLC30は、蓄積されたデータをDBサーバ20へ送信する。
【0035】
図4を参照して、PLC30の各機能は、OS(Operating System)31と、システムプログラム33と、ユーザプログラム32等が動作することで発揮される。PLC30は、ステータス情報51とを保持している。
【0036】
OS31は、PLC30の資源を管理するオペレーティングシステムであり、タスクのスケジューリングや、DBサーバ20へのアクセス処理などを行う機能をPLC30に発揮させる。OS31は、CPU301がシステムプログラム33およびユーザプログラム32を実行するための基本的な実行環境を提供する。
【0037】
システムプログラム33は、PLC30としての基本的な機能を提供するためのソフトウェア群である。具体的には、システムプログラム33は、シーケンス命令プログラム34と、DB(データベース)アクセス処理プログラム35と、入出力処理プログラム36と、ツールインタフェース処理プログラム37と、スケジューラ38とを含んでいる。
【0038】
これに対し、ユーザプログラム32は、制御対象に対する制御目的に応じて任意に作成されるプログラムである。すなわち、ユーザプログラム32は、制御システムを用いて制御する対象に応じて、任意に設計される。ユーザプログラム32は、シーケンス命令プログラム34と協働して、ユーザにおける制御目的を実現する。すなわち、ユーザプログラム32は、シーケンス命令プログラム34によって提供される命令、関数、機能モジュールなどを利用することで、プログラムされた動作を実現する。そのため、ユーザプログラム32およびシーケンス命令プログラム34を「制御プログラム」と総称する場合もある。
【0039】
シーケンス命令プログラム34は、PLC30内のメモリ領域の情報を読み書きしながら、ユーザプログラム32の命令を順に実行する機能をPLC30に発揮させる。シーケンス命令プログラム34は、ユーザプログラム32の実行に伴って、ユーザプログラム32内で指定されているシーケンス命令の実態を呼び出して、その命令の内容を実現するための命令コード群を含む。
【0040】
DBアクセス処理プログラム35は、PLC30がシーケンス命令プログラム34によってユーザプログラム32を実行することに伴って呼び出され、ユーザプログラム32がDBサーバ20へアクセスするための処理、例えばSQL文の生成などの処理を実行する機能をPLC30に発揮させる。DBアクセス処理プログラム35は、ユーザプログラム32の実行に伴って、DBサーバ20へアクセスするために必要な処理を実現するための命令コード群を含む。DBアクセス処理プログラム35は、ユーザプログラム32において指定可能な命令に対応する実行コードを含む。
【0041】
入出力処理プログラム36は、PLC30が備える複数の入出力機能によるPLC30へのデータ入力およびPLC30からのデータ出力を制御する機能をPLC30に発揮させる。各入出力機能は、それぞれメモリのアドレスが割りあてられている。各入出力機能に対応するメモリに保持されるデータは、周期的にPLC30の外部のデータと一括して交換される。
【0042】
ツールインタフェース処理プログラム37は、PC10との間でデータを遣り取りするためのインタフェースを提供する。ツールインタフェース処理プログラム37は、PC10において動作するプログラミングツール12の機能によりPC10からPLC30へ通知される指示を受けて、DBアクセス処理プログラム35等へ処理を渡し、処理の結果等をPC10へ応答する機能をPLC30に発揮させる。スケジューラ38は、PLC30で実行するタスクの優先度に基づいて、タスクのスケジューリングを行う機能をPLC30に発揮させる。
【0043】
ユーザプログラム32は、上述したように、ユーザにおける制御目的に応じて作成される。ユーザプログラム32は、典型的には、PLC30のCPUユニットのプロセッサで実行可能なオブジェクトプログラム形式になっている。ユーザプログラム32は、PC10などにおいて、ラダー形式やファンクションブロック形式で記述されたソースプログラムがコンパイルされることで生成される。生成されたオブジェクトプログラム形式のユーザプログラムは、PC10からPLC30のCPUユニットへ転送され、PLC30のメモリに保持されている。
【0044】
ステータス情報51は、DBアクセス処理プログラム35により出力され、DBアクセス処理プログラム35によるDBサーバ20へのアクセスの状況を保持する。詳しくは後述する。
【0045】
図5は、本実施形態のハードウェアの構成を示す図である。
図5(A)は、コンピュータシステムとしてのPC10の構成を示す。
図5(A)を参照して、PC10は、CPU101と、ROM102と、RAM103と、通信インタフェース104と、ディスプレイ105と、入出力インタフェース106とを備える。
【0046】
CPU101は、OSを含む各種プログラムをROM102等から読み出して実行することでPC10に各種機能を発揮させる。ROM102は、不揮発性の記憶領域であり、BIOS(Basic Input/Output System)や各種のデータ等が記憶される。RAM103は、揮発性のメモリであり、CPU101によるプログラムの実行に必要なデータを格納するための作業領域を提供する。通信インタフェース104は、PC10が外部の機器と通信するためのインタフェースである。ディスプレイ105は、CPU101等による演算の結果を画像により出力するための表示機器である。入出力インタフェース106は、PC10がユーザの入力操作等を受け付け、PC10の動作状態を出力するためのインタフェースである。
【0047】
図5(B)は、PLC30のハードウェア構成を示す図である。PLC30は、CPU301と、ROM302と、RAM303と、通信インタフェース304と、バス307と、不揮発性メモリ308等を備える。PLC40もPLC30と同様のハードウェア構成を備える。CPU301は、典型的には、汎用的なコンピュータアーキテクチャに準じて構成される。CPU301は、内部クロックに従って順次供給される命令コードを解釈して実行する。
【0048】
PLC30とPLC40とは、記憶手段として、ROM302と、RAM303と、不揮発性メモリ308とを有する。RAM303は、揮発性の記憶領域であり、CPU301で実行されるべき各種プログラムを保持するとともに、各種プログラムの実行時の作業用メモリとしても使用される。ROM302は、不揮発性の記憶領域であり、BIOSや各種のデータ、OS、システムプログラム等が記憶される。不揮発性メモリ308は、不揮発性の記憶領域であり、共有メモリ309を含む。共有メモリ309は、ユーザプログラム32と、DBアクセス処理プログラム35とがアクセス可能な記憶領域である。
【0049】
通信インタフェース304は、PLC30が外部の機器と通信するためのインタフェースである。PLC30は、例えば、USB規格に従ってPC10と接続ケーブルにより接続される。また、PLC30は、イーサネット(登録商標)などのネットワークによってDBサーバ20と接続される。
【0050】
バス307は、PLC30において、CPUユニットとIOユニットとがデータを遣り取りするための通信路(システムバス)と接続するためのコネクタと、外部のフィールド機器との間でデータを遣り取りするためのフィールドバスと接続するためのコネクタとを含む。
【0051】
PLC30は、
図4と
図5(B)とを用いて説明した構成を備えており、CPU301がシステムプログラム33およびユーザプログラム32を実行することにより、「制御対象を制御するためのユーザプログラムを実行するための命令実行部」として機能する。
【0052】
また、PLC30は、CPU301がDBアクセス処理プログラム35およびユーザプログラム32を実行することにより、「DBサーバ20へアクセスするためのアクセス命令を含むユーザプログラム32の命令実行部による実行時に、DBサーバ20への通信インタフェース304を介したアクセスを制御するアクセス処理部」として機能する。
【0053】
PLC30は、CPU301が、ユーザプログラム32に含まれるアクセス命令に応じてDBアクセス処理プログラム35を実行することにより、「命令実行部が、ユーザプログラムに含まれるアクセス命令の実行時に、DBサーバ20への送信対象のデータを不揮発性メモリ308の共有メモリ309に格納し、アクセス処理プログラム35にアクセスの実行を指示することでアクセス処理プログラム35へ処理」を渡す。
【0054】
また、PLC30は、CPU301が、ユーザプログラム32に含まれるアクセス命令に応じてDBアクセス処理プログラム35を実行することにより、「アクセス処理プログラム35が、命令実行部の指示に応じて不揮発性メモリ308の共有メモリ309からDBサーバ20への送信対象のデータを読み出して、読みだされたデータに基づきDBサーバ20へアクセスするための命令文(SQL文)を生成し、生成した命令文をDBサーバ20へ送信する命令文送信部」として機能する。
【0055】
また、PLC30は、CPU301が、ユーザプログラム32に含まれるアクセス命令に応じてDBアクセス処理プログラム35を実行することにより、「アクセス処理プログラム35が、命令実行部の指示に応じた処理を開始してから命令文送信部により生成された命令文に基づく処理が完了するまでの間、命令文の実行状況を示すステータス情報51を生成し、生成されたステータス情報51を不揮発性メモリ308の記憶領域に記憶させるステータス出力部」として機能する。
【0056】
<データ>
次に、本実施形態で用いるデータについて、説明する。
【0057】
図6は、ステータス情報51に保持されるデータの内容を示す図である。ステータス情報51は、不揮発性メモリ308の共有メモリ309に保持される。本実施の形態において、DBアクセス処理プログラム35は、ユーザプログラム32において指定される命令に応じて呼び出され、命令内容に応じてDBサーバ20へ送信するためのSQL文を生成し、生成されたSQL文をDBサーバ20へ送信する。DBアクセス処理プログラム35は、送信したSQL文に対するDBサーバ20からの応答を、ユーザプログラム32へ渡す。ステータス情報51の内容は、以上のDBアクセス処理プログラム35によるDBサーバ20へのアクセス状況(アクセスの進捗状況)に応じて定義されている。
【0058】
例えば、ステータス情報51の内容は、DBアクセス処理プログラム35によるDBサーバ20へのアクセスの初期状態を示す「_DBC_SEND_INIT」(初期状態)、DBアクセス処理プログラム35によってDBサーバ20へとSQL文を送信する前(未送信)の状態を示す「_DBC_SEND_UNSENT」(SQL文未送信)、DBアクセス処理プログラム35によってDBサーバ20へとSQL文を送信しており、送信が完了するまでの状態を示す「_DBC_SEND_SENDING」(SQL文送信中)、DBアクセス処理プログラム35によってDBサーバ20へ送信するSQL文がスプールされ、不揮発性のメモリにSQL文が保持されている状態を示す「_DBC_SEND_SPOOLED」(SQL文スプール)、DBアクセス処理プログラム35によるDBサーバ20へのSQL文の送信が完了した状態を示す「_DBC_SEND_COMPLETE」(SQL文送信完了)がある。
【0059】
図7は、共有メモリ309に記憶されるステータス情報51を示す図である。
図7に示すように、ステータス情報51は、識別情報511と、進捗状況512と、データサイズ513と、データ本体514とを含む。
【0060】
識別情報511は、DBアクセス処理プログラム35がDBサーバ20へと送信するSQL文のそれぞれを識別するための情報であり、例えば、接続先のデータベースを特定する情報、テーブル名などを含む。
【0061】
進捗状況512は、DBアクセス処理プログラム35によるDBサーバ20へのアクセス状況を示す。例えば、
図6で説明したアクセス状況(アクセスの進捗状況)に応じてDBアクセス処理プログラム35が進捗状況512を更新する。
【0062】
データサイズ513は、DBアクセス処理プログラム35がDBサーバ20へ送信するデータの大きさを示す。
【0063】
データ本体514は、DBアクセス処理プログラム35がDBサーバ20へ送信するデータそのものを示す。
【0064】
<動作>
次に、本実施形態におけるPLC30の動作について、図面を用いて詳しく説明する。実施の形態1における動作の概要は、以下のとおりである。PC10は、ユーザの操作入力に基づいて、PLC30で実行させるユーザプログラムを作成する。PLC30は、PC10からユーザプログラムを受信して記憶する。PLC30は、シーケンス命令プログラム34によるユーザプログラム32の実行に伴ってDBアクセス処理プログラム35を呼び出す。PLC30は、ユーザプログラム32がDBサーバ20へアクセスするための処理、例えばSQL文の生成と送信等をDBアクセス処理プログラム35により行う。
【0065】
図8は、DBアクセス処理プログラム35によるDBサーバ20へのアクセス処理を示すフローチャートである。
図8においては、処理の各段階において、PLC30が共有メモリ309に出力するステータス情報51の内容を示している。PLC30は、シーケンス命令プログラム34によって、DBサーバ20へアクセスするための命令を含むユーザプログラム32を実行する。PLC30は、シーケンス命令プログラム34によって、DBサーバ20に保持させるデータおよび接続先のデータベースを特定する情報等を共有メモリ309へ書き込む。PLC30は、シーケンス命令プログラム34がユーザプログラム32に含まれる命令を実行し、命令に応じてDBアクセス処理プログラム35を呼び出すことでDBアクセス処理プログラム35へと処理が渡される。このとき、DBアクセス処理プログラム35は、ステータス情報51の進捗状況512に、データベースへのアクセスの初期状態を示す「_DBC_SEND_INIT」を初期値として格納する。
【0066】
ステップS11において、PLC30は、DBアクセス処理プログラム35によって、DBサーバ20へアクセスするための値(DBサーバ20へ書き込む対象となるデータであって、共有メモリ309に蓄積されたデータ)を共有メモリ309から読み出す。このとき、DBアクセス処理プログラム35は、ステータス情報51の進捗状況512に、SQL文の未送信を示す「_DBC_SEND_UNSENT」を格納する。
【0067】
ステップS13において、PLC30は、DBアクセス処理プログラム35によって、DBサーバ20へアクセスするためのSQL文を生成してDBサーバ20へ送信する。このとき、DBアクセス処理プログラム35は、ステータス情報51の進捗状況512に、SQL文が送信中の状態であることを示す「_DBC_SEND_SENDING」を格納する。
【0068】
ステップS15において、PLC30は、DBアクセス処理プログラム35によって、DBサーバ20に対して送信したSQL文について、DBサーバ20からのAck応答(送信Ack)があるか、タイムアウトするまで待機する。なお、このときステータス情報51の進捗状況512は、SQL文が送信中であることを示す「_DBC_SEND_SENDING」が格納されている。
【0069】
ステップS17において、PLC30は、DBアクセス処理プログラム35によって、DBサーバ20との通信に異常があったか否か(DBサーバ20との通信においてエラーの受信があった、またはAck応答の受信処理がタイムアウトしたかの少なくともいずれか一方)を判定する。なお、このときステータス情報51の進捗状況512は、SQL文が送信中であることを示す「_DBC_SEND_SENDING」である。ステップS17において、DBサーバ20との通信に異常があった場合(ステップS17においてYES)、PLC30は、DBアクセス処理プログラム35によって、ステップS21の処理を行う。ステップS17において、DBサーバ20との通信が正常に終了した場合(ステップS17においてNO)、DBアクセス処理プログラム35によってステップS19の処理を行う。
【0070】
ステップS19(DBアクセス処理プログラム35によるDBサーバ20へのSQL文の送信が正常に終了)において、PLC30は、DBアクセス処理プログラム35によって、DBアクセス処理プログラム35を呼び出したプログラムに対してDBサーバ20へのアクセスが完了したことを示す応答を出力する。このとき、DBアクセス処理プログラム35は、ステータス情報51の進捗状況512に、SQL文の送信が完了したことを示す「_DBC_SEND_COMPLETE」を格納する。
【0071】
ステップS21において、PLC30は、DBアクセス処理プログラム35によって、DBサーバ20への送信が正常に終了しなかったSQL文を不揮発性のメモリにスプールする。スプールが完了するまでの間、ステータス情報51の進捗状況512は、SQL文が送信中であることを示す「_DBC_SEND_SENDING」が格納される。
【0072】
ステップS23において、PLC30は、DBアクセス処理プログラム35によるDBサーバ20へのアクセスが終了したことを示す応答を、DBアクセス処理プログラム35を呼び出したユーザプログラム32に対して出力する。このとき、DBアクセス処理プログラム35は、ステータス情報51に、SQL文がスプールされていることを示す「_DBC_SEND_SPOOLED」を格納する。
【0073】
図9は、ユーザプログラム32の命令に従ってDBアクセス処理プログラム35によりDBサーバ20へのアクセスを開始し、ステータス情報51の進捗状況512を更新する処理を示す図である。
【0074】
(1)データ格納
ユーザプログラム32に含まれるDB命令60は、DBアクセス処理プログラム35を呼び出してDBサーバ20へアクセスするためのものであり、DBサーバ20への接続命令を示すDB_Connect命令61と、DBサーバ20にデータを挿入するDB_Insert命令62等を含む。PLC30は、シーケンス命令プログラム34によって、ユーザプログラム32に含まれる命令を順に実行する。PLC30は、シーケンス命令プログラム34によって、ユーザプログラム32に含まれるDB命令60を実行することで、DBサーバ20へ送信するデータを共有メモリ309に格納する。
【0075】
(2)指示
PLC30は、シーケンス命令プログラム34によってユーザプログラム32に含まれるDB命令60を実行することで、DBアクセス処理プログラム35を呼び出す。このDBアクセス処理プログラム35の呼び出しにより、ユーザプログラム32を実行するシーケンス命令プログラム34からDBアクセス処理プログラム35に対し、DBサーバ20へのアクセスを指示する。
【0076】
(3)現在値読み出し
PLC30は、DBアクセス処理プログラム35によってステップS11の処理を実行する。
【0077】
なお、共有メモリ309は、FIFO(First in First out)形式のデータ構造を有するものとしてもよい。
【0078】
(4)送信
PLC30は、DBアクセス処理プログラム35によってステップS13の処理を実行する。
【0079】
(5)送信Ack
PLC30は、DBアクセス処理プログラム35によってステップS15およびステップS17の処理を実行する。
【0080】
(6−1)障害時、(6−2)命令タイムアウト時
PLC30は、DBアクセス処理プログラム35を実行することでステップS21の処理を実行する(不揮発性のメモリにSQL文をスプールする)。なお、PLC30は、DBアクセス処理プログラム35によってSQL文をスプールする際、SQL文を送信すべき対象のデータベースを識別するための情報(コネクション名など)をSQL文とともに不揮発性のメモリに格納する。これにより、PLC30は、DBアクセス処理プログラム35によって、スプールされたSQL文をデータベースへ再送する際に、再送先となるデータベースを特定することができる。
【0081】
なお、SQL文をスプールするための不揮発性のメモリは、共有メモリ309としてもよいし、共有メモリ309とは別の記憶手段としてもよい。
【0082】
(7−1)完了、(7−2)完了(スプール)
PLC30は、DBアクセス処理プログラム35を実行することでステップS19またはステップS23の処理を実行する。
【0083】
図10は、電断のタイミングと、共有メモリ309に記憶される進捗状況512と、電断発生時に取りうる処置とを示す図である。
【0084】
図10における電断のタイミング(1)開始、(2)指示、(3)現在値の読み出し、(4)送信、(5)送信Ack、(6−1)障害時、(6−2)命令タイムアウト時、(7−1)完了、(7−2)完了(スプール)は、
図9で説明した各タイミングに対応する。
図10を参照して、電断のタイミングが「(1)開始」と「(2)指示」と「(3)現在値の読み出し」の場合、DBアクセス処理プログラム35によるDBサーバ20へのSQL文の送信はなされていない。そのため、電断発生時に取りうる処置は、PLC30が、シーケンス命令プログラム34によってユーザプログラムを実行することでDBアクセス処理プログラム35を再度呼び出して、このDBアクセス処理プログラム35によってSQL文を再送することである。
【0085】
なお、共有メモリ309に、DBサーバ20へアクセスするためのデータを格納している場合、PLC30は、DBアクセス処理プログラム35によって、共有メモリ309を参照してデータを読み出して、SQL文の生成およびDBサーバ20への送信を行う。
【0086】
電断のタイミングが「(4)送信、(5)送信Ack、(6−1)障害時、(6−2)命令タイムアウト時」の場合は、PLC30がDBアクセス処理プログラム35によってSQL文の送信を行っている。そのため、電断発生時に取りうる処置は、PLC30が、リカバリ処理によってDBサーバ20側のレコードの有無を確認し、DBサーバ20にレコードが記録されていない場合にDBアクセス処理プログラム35によってSQL文をDBサーバ20へ再送することとなる。
【0087】
電断のタイミングが「(7−1)完了」の場合、PLC30がDBアクセス処理プログラム35によってDBサーバ20へSQL文を送信する処理が完了している。そのため、電断発生時においても特段の処置は必要とされない。
【0088】
電断のタイミングが「(7−2)完了(スプール)」の場合、PLC30がDBアクセス処理プログラム35によってSQL文を不揮発性のメモリにスプールしている。そのため、電断発生時に取りうる処置は、不揮発性のメモリにスプールされているSQL文を、PLC30がDBアクセス処理プログラム35によってDBサーバ20へ再送することである。
【0089】
<リカバリ>
上記のようにPLC30がDBアクセス処理プログラム35によってDBサーバ20へアクセスする際にアクセス状況をステータス情報51に出力する動作を説明した。ここで、PLC30が、電断発生時にリカバリするための処理の例を説明する。
【0090】
(1)システムプログラムによるSQL文の再送
PLC30は、不揮発性のメモリにスプールされているデータがある場合、電断が発生した後のリカバリを、不揮発性のメモリにスプールされているデータを自動的にDBサーバ20へ再送することによって行うこととしてもよい。例えば、PLC30は、電断が発生した後、電断からの復帰時に自動的に実行するリカバリプログラムを不揮発性のメモリの保持している。リカバリプログラムは、PLC30がシステムプログラム33によってステータス情報51を参照してSQL文の送信状況を確認し、送信状況に応じてSQL文のDBサーバ20への再送を行う処理を含む。PLC30は、電断からの復帰時にリカバリプログラムを実行し、システムプログラム33によってステータス情報51を参照してSQL文の送信状況を確認する。PLC30は、ステータス情報51において「_DBC_SEND_SENDING」(SQL文送信中)と示されている場合は、DBアクセス処理プログラム35によってDBサーバ20のレコードの有無を確認し、確認結果に応じてSQL文を再送する。
【0091】
(2)ユーザプログラムからの指示に基づくリカバリ
PLC30は、電断が発生した後のリカバリを、例えば、ユーザプログラムからの指示をきっかけとして開始し、不揮発性のメモリに格納されたステータス情報51を参照することとしてもよい。例えば、リカバリのためのユーザプログラム(リカバリプログラム)の作成者は、PLC30の電源投入後の1サイクル目に不揮発性のメモリに格納されたステータス情報51を参照するようユーザプログラムに命令を含め、ステータス情報51に示されるSQL文の送信状況に応じた処理をPLC30に行わせるようユーザプログラムを作成する。PLC30は、電源投入後の1サイクル目にステータス情報51を参照し、ステータス情報51において、「_DBC_SEND_UNSENT」(SQL文未送信)と示されている場合は、SQL文を再送する。また、ステータス情報51において「_DBC_SEND_SENDING」(SQL文送信中)と示されている場合は、PLC30は、DBサーバ20のレコードの有無を確認し、確認結果に応じてSQL文を再送する。
【0092】
なお、上述の「(1)システムプログラムによるSQL文の再送」では、不揮発性のメモリにスプールされているデータがある場合に、システムプログラム33によって、DBサーバ20へのデータの再送を自動的に行うことを説明したが、不揮発性のメモリにデータが残っていない場合は、ユーザプログラムからの指示に基づくリカバリ処理を行う必要がある。
【0093】
このように各実施形態について説明してきたが、これら実施形態を組み合わせてもよいことはいうまでもない。以上、本発明者によってなされた発明を実施の形態に基づき具体的に説明したが、本発明は前記実施の形態に限定されるものではなく、その要旨を逸脱しない範囲で種々変更可能であることはいうまでもない。
【0094】
今回開示された実施の形態はすべての点で例示であって制限的なものでないと考えられるべきである。この発明の範囲は上記した説明ではなくて特許請求の範囲によって示され、特許請求の範囲と均等の意味および範囲内でのすべての変更が含まれることが意図される。