(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2024-03-22
(45)【発行日】2024-04-01
(54)【発明の名称】共有メモリの設定方法及び計算機
(51)【国際特許分類】
G05B 19/05 20060101AFI20240325BHJP
G06F 12/00 20060101ALI20240325BHJP
【FI】
G05B19/05 F
G06F12/00 571A
(21)【出願番号】P 2020119289
(22)【出願日】2020-07-10
【審査請求日】2023-06-16
(73)【特許権者】
【識別番号】319007240
【氏名又は名称】株式会社日立インダストリアルプロダクツ
(74)【代理人】
【識別番号】110001678
【氏名又は名称】藤央弁理士法人
(72)【発明者】
【氏名】是枝 浩行
(72)【発明者】
【氏名】今井 光洋
(72)【発明者】
【氏名】仲野谷 仁茂
【審査官】稲垣 浩司
(56)【参考文献】
【文献】特開2020-95549(JP,A)
【文献】特開2009-87189(JP,A)
【文献】特開2007-234047(JP,A)
【文献】国際公開第2019/244328(WO,A1)
【文献】特表2013-524386(JP,A)
【文献】米国特許第8654136(US,B1)
(58)【調査した分野】(Int.Cl.,DB名)
G05B 19/05
G06F 12/00
(57)【特許請求の範囲】
【請求項1】
演算装置、前記演算装置に接続される記憶装置、前記演算装置に接続されるインタフェースを有する計算機が実行する共有メモリの設定方法であって、
前記計算機は、機器を制御する制御系プログラムと、前記機器から取得された情報を用いた処理を実行する情報系プログラムとが稼働する制御装置と接続し、
前記制御装置は、前記制御系プログラム及び前記情報系プログラムが、互いに、構造体によって関連付けられたデータ群を送受信するために使用する、所定のサイズの複数のブロックから構成されるキューを含む共有メモリを設定可能であり、
前記共有メモリの設定方法は、
前記演算装置が、前記制御系プログラム及び前記情報系プログラムの各々の実行周期に基づいて、前記制御系プログラムが前記キューに書き込んだ前記データ群を、当該データ群が上書きにより消去される前に前記情報系プログラムが読み出すことができる、前記ブロックの数を算出する第1のステップと、
前記演算装置が、前記共有メモリを介して送受信する前記データ群の構造を分析することによって、前記制御系プログラムが前記キューに書き込んだ前記データ群を、当該データ群が上書きにより消去される前に前記情報系プログラムが読み出すことができる、前記ブロックのサイズを算出する第2のステップと、
前記演算装置が、前記算出されたブロックの数及びサイズに基づいて定義される前記キューを含む前記共有メモリを設定するための共有メモリ定義情報を生成し、前記制御装置に出力する第3のステップと、
を含むことを特徴とする共有メモリの設定方法。
【請求項2】
請求項1に記載の共有メモリの設定方法であって、
前記第1のステップは、
前記演算装置が、前記制御系プログラムの実行周期及び前記情報系プログラムの実行周期に基づいて、実行周期比率を算出する第4のステップと、
前記演算装置が、前記実行周期比率に基づいて前記ブロックの数を算出する第5のステップと、を含むことを特徴とする共有メモリの設定方法。
【請求項3】
請求項2に記載の共有メモリの設定方法であって、
前記第5のステップは、前記演算装置が、前記実行周期比率より大きい整数の中で最も小さい前記整数を、前記ブロックの数として算出するステップを含むことを特徴とする共有メモリの設定方法。
【請求項4】
請求項3に記載の共有メモリの設定方法であって、
前記第5のステップは、前記演算装置が、前記最も小さい整数に、処理の遅延及びジッタを考慮して補正整数を加算した値を、前記ブロックの数として算出するステップを含むことを特徴とする共有メモリの設定方法。
【請求項5】
請求項1に記載の共有メモリの設定方法であって、
前記計算機は、前記構造体の情報と、前記制御系プログラムにおける前記データ群に対応する複数の変数の配置方式を定義する第1変数配置方式情報と、前記情報系プログラムにおける前記データ群に対応する複数の変数の配置方式を定義する第2変数配置方式情報とを管理し、
前記第1変数配置方式情報及び前記第2変数配置方式情報は、アラインメント方式及びアラインメントサイズを含み、
前記第2のステップは、
前記演算装置が、前記第1変数配置方式情報及び前記第2変数配置方式情報に基づいて、前記制御系プログラム及び前記情報系プログラムの各々が前記共有メモリを介した前記データ群の送受信が可能なアラインメント方式及びアラインメントサイズを決定する第6のステップと、
前記演算装置が、前記構造体の情報と、前記決定されたアラインメント方式及び前記決定されたアラインメントサイズとに基づいて、前記共有メモリを介して送受信する前記データ群に対応する前記変数を前記共有メモリ上に配置した場合の前記構造体のサイズを、前記ブロックのサイズとして算出する第7のステップと、を含むことを特徴とする共有メモリの設定方法。
【請求項6】
演算装置、前記演算装置に接続される記憶装置、前記演算装置に接続されるインタフェースを備える計算機であって、
機器を制御する制御系プログラムと、前記機器から取得された情報を用いた処理を実行する情報系プログラムとが稼働する制御装置と接続し、
前記制御装置は、前記制御系プログラム及び前記情報系プログラムが、互いに、構造体によって関連付けられたデータ群を送受信するために使用する、所定のサイズの複数のブロックから構成されるキューを含む共有メモリを設定可能であり、
前記計算機は、
前記制御系プログラム及び前記情報系プログラムの各々の実行周期に基づいて、前記制御系プログラムが前記キューに書き込んだ前記データ群を、当該データ群が上書きにより消去される前に前記情報系プログラムが読み出すことができる、前記ブロックの数を算出するブロック数算出部と、
前記共有メモリを介して送受信する前記データ群の構造を分析することによって、前記制御系プログラムが前記キューに書き込んだ前記データ群を、当該データ群が上書きにより消去される前に前記情報系プログラムが読み出すことができる、前記ブロックのサイズを算出するブロックサイズ算出部と、
前記演算装置が、前記算出されたブロックの数及びサイズに基づいて定義される前記キューを含む前記共有メモリを設定するための共有メモリ定義情報を生成し、前記制御装置に出力する情報出力部と、
を備えることを特徴とする計算機。
【請求項7】
請求項6に記載の計算機であって、
前記ブロック数算出部は、
前記制御系プログラムの実行周期及び前記情報系プログラムの実行周期に基づいて、実行周期比率を算出し、
前記実行周期比率に基づいて前記ブロックの数を算出することを特徴とする計算機。
【請求項8】
請求項7に記載の計算機であって、
前記ブロック数算出部は、前記実行周期比率より大きい整数の中で最も小さい前記整数を、前記ブロックの数として算出することを特徴とする計算機。
【請求項9】
請求項8に記載の計算機であって、
前記ブロック数算出部は、前記最も小さい整数に、処理の遅延及びジッタを考慮して補正整数を加算した値を、前記ブロックの数として算出することを特徴とする計算機。
【請求項10】
請求項6に記載の計算機であって、
前記計算機は、前記構造体の情報と、前記制御系プログラムにおける前記データ群に対応する複数の変数の配置方式を定義する第1変数配置方式情報と、前記情報系プログラムにおける前記データ群に対応する複数の変数の配置方式を定義する第2変数配置方式情報とを管理し、
前記第1変数配置方式情報及び前記第2変数配置方式情報は、アラインメント方式及びアラインメントサイズを含み、
前記ブロックサイズ算出部は、
前記第1変数配置方式情報及び前記第2変数配置方式情報に基づいて、前記制御系プログラム及び前記情報系プログラムの各々が前記共有メモリを介した前記データ群の送受信が可能なアラインメント方式及びアラインメントサイズを決定し、
前記構造体の情報と、前記決定されたアラインメント方式及び前記決定されたアラインメントサイズとに基づいて、前記共有メモリを介して送受信する前記データ群に対応する前記変数を前記共有メモリ上に配置した場合の前記構造体のサイズを、前記ブロックのサイズとして算出することを特徴とする計算機。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、装置上で並列実行される制御系プログラム及び情報系プログラムが相互にデータを送受信するために使用する共有メモリの設定方法に関する。
【背景技術】
【0002】
産業用制御システムでは、システム全体のネットワークトラフィックの負荷を軽減するために、クラウドコンピュータ側で従来行われていた高度な情報処理の一部を、制御装置側に搭載したエッジ端末に実行させるシステム構成を採用する動きがある。
【0003】
このような制御システムでは、リアルタイム処理を実行する制御系プログラムと、高度な情報処理を実行する情報系プログラムとが共存しながら、一つの装置上で並列稼働する。制御系プログラム及び情報系プログラムは、処理の目的が異なることから、一般的に、プログラミング言語、メモリの割当て方式、タスクスケジューリングの方式、及びプログラムの実行周期等が異なる。
【0004】
従来の制御システムでは、
図30に示すように、制御系プログラム2905及び情報系プログラム2906が共有メモリ2901を介してデータを共有する。すなわち、共有メモリを介してプログラム間でデータの送受信が行われる。制御系プログラム2905は、共有メモリAPI2903を用いて、共有メモリ2901を介して情報系プログラム2906に収集した情報を送信する。情報系プログラム2906は、共有メモリAPI2904を用いて、共有メモリ2901を介して、データを受け取って高度な処理を実行し、また、処理結果に基づく制御系プログラム2905へのフィードバックを行う。
【0005】
共有メモリ2901を介して、制御系プログラム2905と情報系プログラム2906との間でデータを送受信する場合、両プログラムが互いにアクセスできるように、共有メモリ2901上のデータの配置及びデータサイズを設定する手段として、特許文献1に記載の技術が知られている。
【0006】
特許文献1では、
図31に示すユーザインタフェース3000を提示する設定ツールが開示されている。設定ツールが動作する設定装置は、共有する変数の名称及びサイズ、並びに、変数に対するデータの読書の周期情報等を設定する。さらに、設定装置は、設定内容に基づいて、
図32に示すように、共有メモリ2901上への共有する変数の配置、共有メモリ2901上のアドレスを示すオフセット、及びサイズを記述したマップファイル3010を出力する。
【0007】
両プログラムは、マップファイル3010を参照することによって、共有する変数の位置及びサイズを認識することができる。これによって、プログラミング言語及びプログラム実行環境が異なる制御系プログラム2905と情報系プログラム2906との間でデータを齟齬なく受け渡すことができる。
【先行技術文献】
【特許文献】
【0008】
【発明の概要】
【発明が解決しようとする課題】
【0009】
制御系プログラムと情報系プログラムとの間で共有するデータが複雑な構造である場合、データサイズが大きくなり共有メモリの使用量が増大する。
【0010】
また、制御系プログラム及び情報系プログラムの実行周期に大きな差が存在する場合、制御系プログラムが取得したデータを、情報系プログラムに漏れなく送信するためには、データをバッファリングできるキューを含む共有メモリが必要となる。この場合、共有メモリに必要なメモリ容量は大きくなる。なお、両プログラムの実行周期に大きな差が存在するケースとしては、制御系プログラムが、制御対象機器から極めて短い周期で取得したデータを共有メモリに書き込み、情報系プログラムが、当該周期の一桁から二桁以上の長い周期で共有メモリからデータを読み出すようなケースである。
【0011】
ここで、プログラム間におけるデータの漏れのない送信とは、第1プログラムがメモリにデータを書き込み、第2プログラムがメモリからデータを読み出すシステムにおいて、第1プログラムがメモリに書き込んだデータが上書きにより消去される前に、第2プログラムがデータを読み出すことを意味する。すなわち、第2プログラムが第1プログラムによってメモリ書き込まれた全てのデータを読み出すことを意味する。
【0012】
従来技術では、両プログラム間でデータを漏れなく送受信することができ、かつ、メモリ容量を抑えた共有メモリを設定する手段については記載されていない。
【0013】
本発明は、制御系プログラム及び情報系プログラムが並列稼働する装置において、両プログラムがデータを漏れなく送受信することができ、かつ、メモリ容量を抑えた共有メモリを設定する方法及びその方法を実現するシステムを提供する。
【課題を解決するための手段】
【0014】
本願において開示される発明の代表的な一例を示せば以下の通りである。すなわち、演算装置、前記演算装置接続される記憶装置、前記演算装置に接続されるインタフェースを有する計算機が実行する共有メモリの設定方法であって、前記計算機は、機器を制御する制御系プログラムと、前記機器から取得された情報を用いた処理を実行する情報系プログラムとが稼働する制御装置と接続し、前記制御装置は、前記制御系プログラム及び前記情報系プログラムが、互いに、構造体によって関連付けられたデータ群を送受信するために使用する、所定のサイズの複数のブロックから構成されるキューを含む共有メモリを設定可能であり、前記共有メモリの設定方法は、前記演算装置が、前記制御系プログラム及び前記情報系プログラムの各々の実行周期に基づいて、前記制御系プログラムが前記キューに書き込んだ前記データ群を、当該データ群が上書きにより消去される前に前記情報系プログラムが読み出すことができる、前記ブロックの数を算出する第1のステップと、前記演算装置が、前記共有メモリを介して送受信する前記データ群の構造を分析することによって、前記制御系プログラムが前記キューに書き込んだ前記データ群を、当該データ群が上書きにより消去される前に前記情報系プログラムが読み出すことができる、前記ブロックのサイズを算出する第2のステップと、前記演算装置が、前記算出されたブロックの数及びサイズに基づいて定義される前記キューを含む前記共有メモリを設定するための共有メモリ定義情報を生成し、前記制御装置に出力する第3のステップと、を含む。
【発明の効果】
【0015】
本発明によれば、制御系プログラム及び情報系プログラムがデータを漏れなく送受信することができ、かつ、メモリ使用量を抑えた共有メモリを設定できる。上記した以外の課題、構成及び効果は、以下の実施例の説明により明らかにされる。
【図面の簡単な説明】
【0016】
【
図1】実施例1の制御システムの構成の一例を示すブロック図である。
【
図2】実施例1の制御装置のソフトウェア構成の一例を示す図である。
【
図3A】実施例1の共有メモリに含まれるキューの実装方式の一例を説明する図である。
【
図3B】実施例1の共有メモリに含まれるキューの実装方式の一例を説明する図である。
【
図3C】実施例1の共有メモリに含まれるキューの実装方式の一例を説明する図である。
【
図4】実施例1の設定装置のソフトウェア構成の一例を示す図である。
【
図5】実施例1の設定装置の設定プログラムに含まれる機能の一例を示す図である。
【
図6】実施例1の制御システムにおけるシステム構築の手順の一例を示す図である。
【
図7】実施例1の設定装置が保持する情報の一例を示す図である。
【
図8】実施例1のデータモデル定義情報の一例を示す図である。
【
図9】実施例1のデータモデル定義情報の記述仕様の一例を示す図である。
【
図10】実施例1のデータ型変換テーブルの一例を示す図である。
【
図11】実施例1のデータ型変換テーブルの記述仕様の一例を示す図である。
【
図12】実施例1の出力変数配置方式情報の一例を示す図である。
【
図13】実施例1の出力変数配置方式情報のアラインメント方式識別子の記述仕様の一例を示す図である。
【
図14】実施例1の出力変数配置方式情報のアラインメントサイズ識別子の記述仕様の一例を示す図である。
【
図15】実施例1の構造体メンバ情報の一例を示す図である。
【
図16】実施例1の共有メモリ定義情報の一例を示す図である。
【
図17】実施例1の共有メモリ定義情報の記述仕様の一例を示す図である。
【
図18】実施例1の設定プログラムが実行するメイン処理を説明するフローチャートである。
【
図19】実施例1の設定プログラムが実行する出力アラインメント形式決定処理の一例を説明するフローチャートである。
【
図20】アラインメント方式と変数配置との関係を説明する図である。
【
図21】実施例1の設定プログラムが実行する構造体メンバ決定処理の一例を説明するフローチャートである。
【
図22】実施例1の設定プログラムが実行する制御系プログラム構造体定義情報生成処理の一例を説明するフローチャートである。
【
図23】実施例1の設定プログラムが実行する情報系プログラム構造体定義情報生成処理の一例を説明するフローチャートである。
【
図24】実施例1の設定プログラムが出力する構造体定義情報の一例を示す図である。
【
図25】実施例1の設定プログラムが実行する共有メモリ定義情報生成処理の一例を説明するフローチャートである。
【
図26】実施例1の制御装置が設定するリングバッファ管理情報の一例を示す図である。
【
図27】実施例1の制御装置が生成するリングバッファの構成の一例を示す図である。
【
図28】実施例1の変形例の制御システム1の構成の一例を示すブロック図である。
【
図29】実施例1の変形例の制御装置のソフトウェア構成の一例を示す図である。
【
図30】従来技術の制御装置のソフトウェア構成の一例を示す図である。
【
図31】従来技術のユーザインタフェースの一例を示す図である。
【
図32】従来技術の共有メモリの設定方法の一例を示す図である。
【発明を実施するための形態】
【0017】
実施の形態について、図面を用いて詳細に説明する。ただし、本発明は以下に示す実施の形態の記載内容に限定して解釈されるものではない。本発明の思想ないし趣旨から逸脱しない範囲で、その具体的構成を変更し得ることは当業者であれば容易に理解される。
【0018】
以下に説明する発明の構成において、同一部分又は同様な機能を有する部分には同一の符号を異なる図面間で共通して用い、重複する説明は省略することがある。
【0019】
同一あるいは同様な機能を有する要素が複数ある場合には、同一の符号に異なる添字を付して説明する場合がある。ただし、複数の要素を区別する必要がない場合には、添字を省略して説明する場合がある。
【0020】
本明細書等における構成要素の番号や記号などの表記は、構成要素を識別するために付するものであり、必ずしも、数、順序、もしくはその内容を限定するものではない。
【0021】
図面等において示す各構成の位置、大きさ、形状、範囲などは、発明の理解を容易にするため、実際の位置、大きさ、形状、範囲などを表していない場合がある。このため、本発明は、必ずしも、図面等に開示された位置、大きさ、形状、範囲などに限定されない。
【実施例1】
【0022】
図1は、実施例1の制御システム1の構成の一例を示すブロック図である。
【0023】
制御システム1は、設定装置10、制御装置30、制御対象機器50、設定装置10と制御装置30との間を接続するネットワーク20、及び制御装置30と制御対象機器50との間を接続するネットワーク40から構成される。ネットワーク20、40は、装置間を接続するシリアル/パラレル通信又はバス接続であってもよい。
【0024】
設定装置10は、CPU11、EPROM12、メインメモリ13、周辺制御装置14、不揮発性記憶装置15、ユーザI/F装置16、及びネットワークI/F17を備える。不揮発性記憶装置15、ユーザI/F装置16、及びネットワークI/F17は、周辺制御装置14を介し、CPU11と接続する。
【0025】
設定装置10の起動時、EPROM12に格納されたプログラムは、メインメモリ13にコピーされ、CPU11によってメインメモリ13上のデータを読書きしながら実行される。以下の説明では、プログラムを主語に処理を説明する場合、CPU11が当該プログラムを実行していることを示す。
【0026】
ユーザは、プログラムを操作するために、ディスプレイ、キーボード、及びポインティングデバイス等を含むユーザI/F装置16を用いる。例えば、ユーザは、ユーザI/F装置16を用いて電源断時に消失したくないデータを不揮発性記憶装置15に保存する。プログラムが生成した設定情報は、ネットワークI/F17を介して、制御装置30に送信される。
【0027】
制御装置30は、CPU31、EPROM32、メインメモリ33、タイマ34、周辺制御装置35、不揮発性記憶装置36、ユーザI/F装置37、及びネットワークI/F38、39を備える。不揮発性記憶装置36、ユーザI/F装置37、及びネットワークI/F38、39は、周辺制御装置35を介し、CPU31と接続する。
【0028】
制御装置30の起動時、EPROM32に格納されたプログラムは、メインメモリ33にコピーされ、CPU31によって、メインメモリ33上のデータを読書きしながら実行される。タイマ34は、プログラムを周期的に実行する場合に用いる。
【0029】
ユーザは、プログラムを操作するために、ディスプレイ及びボタン等を含むユーザI/F装置37を用いる。例えば、ユーザは、ユーザI/F装置37を用いて電源断時に消失したくないデータを不揮発性記憶装置36に保存する。
【0030】
ネットワークI/F38は、設定装置10と接続するために用いられる。制御装置30は、ネットワークI/F38を介して設定装置10から設定情報等を受信する。ネットワークI/F39は、センサ51及びアクチュエータ52等の制御対象機器50と接続するために用いられる。制御装置30は、ネットワークI/F39を介して、制御対象機器50から情報を取得し、また、制御対象機器50を制御する。
【0031】
図2は、実施例1の制御装置30のソフトウェア構成の一例を示す図である。
図2では、ハイブリッドOS型の制御装置30について説明する。
【0032】
ハイブリッドOS型の制御装置30上では、低遅延かつ低ジッタでプログラムを実時間処理が可能なリアルタイムOS71と、高機能な非リアルタイムOS72とが共存し、かつ、並列実行が可能となっている。本実施例では、非リアルタイムOS72上で負荷が大きいプログラムが実行される場合でも、リアルタイムOS71上で稼働するプログラムのリアルタイム性能が悪化しないよう構成されている。
【0033】
リアルタイムOS71にはリアルタイム・タスク・スケジューラ73が実装される。制御系プログラム75は、SVC(supervisor call)80を介してリアルタイムOS71の機能を利用しながら、タスクとして動作する。
【0034】
非リアルタイムOS72にはプリエンプティブ・タスク・スケジューラ74が実装される。情報系プログラム76は、SVC80を介して非リアルタイムOS72の機能を利用しながら、タスクとして動作する。
【0035】
制御系プログラム75は、デバイス制御API83を介して、制御対象機器50の制御及び情報の取得を行う。情報系プログラム76は、記憶装置制御API84を介して、不揮発性記憶装置36に対するデータの読書きを行い、ネットワーク制御API85を介して、ネットワーク20と通信し、表示/入力API86を介して、ユーザI/F装置37とのやり取りを行う。
【0036】
制御装置30は、制御系プログラム75及び情報系プログラム76との間でデータを送受信するためのキューを含む共有メモリ77を備える。制御系プログラム75は、共有メモリAPI81を介して、共有メモリ77に対するデータの読書きを行うことができ、また、情報系プログラム76は、共有メモリAPI82を介して、共有メモリ77に対するデータの読書きを行うことができる。制御系プログラム75及び情報系プログラム76は、互いの書き込みタイミング及び排他処理を意識することなく、共有メモリ77に対するデータの読書きを行うことができる。
【0037】
ここで、
図3A、
図3B、及び
図3Cを用いて、共有メモリ77に含まれるキューの実装方式について詳しく説明する。
【0038】
図3A、
図3B、及び
図3Cは、実施例1の共有メモリ77に含まれるキューの実装方式の一例を説明する図である。
【0039】
制御系プログラム75は、制御装置30において、短い周期で制御対象機器50からデータを収集し、制御対象機器50に対する制御を行うことが求められている。一方で、情報系プログラム76は、制御装置30において、制御対象機器50からの各種データを統合的に処理し、より高度な情報処理を行うことが求められている。
【0040】
高度な情報処理としては、例えば、情報系プログラム76の負荷に応じた制御系プログラム75によるデータ収集の周期の変更、制御システム1全体の処理渋滞部分の検知、検知した渋滞を緩和するための制御システム1全体の制御ポリシの変更等が考えられる。前述のような高度な処理では、制御系プログラム75の実行周期に比べて極めて長い周期の単位でデータを処理し、また、判断を行う必要がある。
【0041】
制御系プログラム75が、制御系プログラム75から情報系プログラム76にデータを受け渡すために、短い周期で、情報系プログラム76に送信するデータを共有メモリ77に書き込んだ場合、情報系プログラム76は、実行周期が制御系プログラム75の実行周期と比較して極めて長いため、共有メモリ77に書き込まれたデータをリアルタイムに受け取ることができない。情報系プログラム76が、情報系プログラム76が共有メモリ77からデータを読み出す前に、次の周期のデータを共有メモリ77に書き込んだ場合、共有メモリ77上の古いデータは消去されるため、情報系プログラム76はデータを取りこぼしてしまう。情報系プログラム76は、データの漏れが発生した場合、高度な情報処理を正しく実行できなくなる。
【0042】
このような問題を回避するため、本実施例ではキューを含む共有メモリ77を設定する。
【0043】
キューの実装例としては、単純配列待ち行列3100、リングバッファ3110、及び連結リスト3120等がある。
【0044】
単純配列待ち行列3100は、固定のブロックサイズのN個のブロックの配列から構成される。書き込まれたデータブロックの先頭を示す先頭ポインタ3101と、末尾を示す末尾ポインタ3102とを用いて単純配列待ち行列3100が管理される。
【0045】
単純配列待ち行列3100にキューイングする場合、プログラムは、末尾ポインタ3102をインクリメントし、末尾ポインタ3102が示すブロックにデータを格納する。単純配列待ち行列3100からデキューする場合、プログラムは、先頭ポインタ3101が示すブロックからデータを読み出し、先頭ポインタ3101をインクリメントする。
【0046】
リングバッファ3110は、単純配列待ち行列3100と同じデータ構造であるが、配列の末尾の次のデータ格納先が配列先頭となるように設定される。リングバッファ3110は、単純配列待ち行列3100よりメモリ利用効率がよいキューを構成できるため、よく採用される。
【0047】
連結リスト3120は、データ本体をポインタで連結したリスト構造のキューで、可変長のデータの待ち行列を扱うことができるメリットはある。ただし、データごとにポインタ情報を付加する必要があるため、データ容量が増加することと、キューイング及びデューの処理でポインタの繋ぎ変え処理を行う必要があり、処理が重くなることとがデメリットとして上げられる。
【0048】
メモリリソースに限りがあり、リアルタイム性が重視されるシステムでは、リングバッファ3110が採用されることが多い。本実施例では、共有メモリ77に含まれるキューはリングバッファ3110として実装されるものとする。ただし、他のキューの実装方法であっても、本発明は同様に適用可能であり、本発明は、キューの実装方法には左右されない。
【0049】
図4は、実施例1の設定装置10のソフトウェア構成の一例を示す図である。
【0050】
設定装置10は、一般的に、ユーザI/Fとして高度なGUI環境を備えた、Linux(登録商標、以下同じ)やWindows(登録商標、以下同じ)等の高機能な非リアルタイムOS72を搭載する。非リアルタイムOS72に実装される設定プログラム90は、プリエンプティブ・タスク・スケジューラ74上で、SVC80を介して非リアルタイムOS72の機能を利用しながら、タスクとして動作する。
【0051】
設定プログラム90は、記憶装置制御API84を介して、不揮発性記憶装置15に対するデータ読書きを行い、ネットワーク制御API85を介して、ネットワーク20と通信し、表示/入力API86を介して、ユーザI/F装置16とのやり取りを行う。
【0052】
設定プログラム90は、ユーザがユーザI/F装置16を介して指定した設定内容に基づいて制御装置30の設定情報等を生成し、不揮発性記憶装置15に保存し、また、ネットワーク20を介して制御装置30に情報を送信する。これによって、制御装置30を設定に従い動作させることができる。
【0053】
図5は、実施例1の設定装置10の設定プログラム90に含まれる機能の一例を示す図である。
【0054】
実施例1では、データモデル定義情報1000、制御系プログラム定義情報1100、及び情報系プログラム定義情報1200を設定プログラム90に入力する。
【0055】
データモデル定義情報1000は、共有メモリ77を介して、制御系プログラム75と情報系プログラム76との間で共有するデータ群の構成の定義を格納する情報である。
【0056】
制御系プログラム定義情報1100は、制御系プログラム75に関する定義を格納する情報であり、変数配置方式情報1110及び実行周期1120を含む。変数配置方式情報1110は、データモデル定義情報1000で定義されたデータ群を、制御系プログラム75が使用する変数として配置する方式を指定する情報である。実行周期1120は、制御系プログラム75の実行周期である。
【0057】
情報系プログラム定義情報1200は、情報系プログラム76に関する定義を格納する情報であり、変数配置方式情報1210及び実行周期1220を含む。変数配置方式情報1210は、データモデル定義情報1000で定義されたデータ群を、情報系プログラム76が使用する変数として配置する方式を指定する情報である。実行周期1220は、情報系プログラム76の実行周期である。
【0058】
設定プログラム90は、機能として、変数配置方式決定手段91、変数配置手段92、ブロックサイズ算出手段93、制御系プログラム構造体定義出力手段94、情報系プログラム構造体定義出力手段95、ブロック数算出手段96、及び共有メモリ定義情報出力手段97を有する。
【0059】
変数配置方式決定手段91は、制御系プログラム75及び情報系プログラム76の各々の変数配置方式情報1110、1210に基づいて、制御系プログラム75及び情報系プログラム76の両方がアクセス可能かつメモリ効率の良い変数の配置方式を決定する。
【0060】
変数配置手段92は、決定された変数の配置方式に従って、データモデル定義情報1000に定義されたデータ群を変数として配置する。
【0061】
ブロックサイズ算出手段93は、変数配置手段92による変数の配置の結果に基づいて、変数を格納するために必要最小限のリングバッファ3110のブロックサイズを算出する。
【0062】
ブロック数算出手段96は、制御系プログラム75及び情報系プログラム76の各々の実行周期1120、1220の差に基づいて、必要最小限のリングバッファ3110のブロック数を算出する。
【0063】
共有メモリ定義情報出力手段97は、ブロックサイズ算出手段93によって算出されたブロックサイズと、ブロックサイズ算出手段93によって算出されたブロック数とに基づいて共有メモリ定義情報1600を生成し、出力する。
【0064】
制御装置30は、設定装置10から共有メモリ定義情報1600を受信した後、OS起動時に共有メモリ定義情報1600を読み出し、共有メモリ定義情報1600に格納されるブロックサイズ及びブロック数で構成されるリングバッファ3110を、共有メモリ77に生成する。これによって、制御系プログラム75及び情報系プログラム76の双方からアクセスでき、かつ、メモリ使用量が抑制された共有メモリ77を設定できる。
【0065】
制御系プログラム構造体定義出力手段94は、変数配置手段92によって決定された変数の配置に基づいて、制御系プログラム構造体定義情報1700を生成し、出力する。また、情報系プログラム構造体定義出力手段95は、変数配置手段92によって決定された変数の配置に基づいて、情報系プログラム構造体定義情報1800を生成し、出力する。
【0066】
なお、設定プログラム90の各手段(各機能)は、複数の機能を一つの機能にまとめてもよいし、一つの機能を複数の機能に分けてもよい。
【0067】
図6は、実施例1の制御システム1におけるシステム構築の手順の一例を示す図である。
【0068】
設定装置10は、制御系プログラム75の開発時に、制御系プログラム75のソースコード3300として制御系プログラム構造体定義情報1700を取り込む。これによって、制御系プログラム75は、リングバッファ3110に対して、データモデル定義情報1000に定義されたデータ群の読み書きが可能となる。設定装置10は、制御系プログラム構造体定義情報1700を取り込んだソースコード3300をビルドすることによって、制御系プログラムの実行ファイル3310を生成する。
【0069】
設定装置10は、情報系プログラム76の開発時に、情報系プログラム76のソースコード3400として情報系プログラム構造体定義情報1800を取り込む。これによって、情報系プログラム76は、リングバッファ3110に対して、データモデル定義情報1000に定義されたデータ群の読み書きが可能となる。設定装置10は、情報系プログラム構造体定義情報1800を取り込んだソースコード3400をビルドすることによって、情報系プログラム76の実行ファイル3410を生成する。
【0070】
また、設定装置10は、共有メモリ定義情報1600と、制御系プログラム75の実行ファイル3310と、情報系プログラム76の実行ファイル3410とを、ネットワーク20を介して、制御装置30に送信する。
【0071】
制御装置30は、受信した共有メモリ定義情報1600、制御系プログラム75の実行ファイル3310、情報系プログラム76の実行ファイル3410を、リアルタイムOS71及び非リアルタイムOS72が参照できるよう、不揮発性記憶装置36に格納する。
【0072】
制御装置30は、OS起動時の初期処理3500において、共有メモリ定義情報1600を参照してリングバッファ3110を生成する。制御装置30は、初期処理3500が完了した後、リアルタイムOS71上で制御系プログラム75の実行ファイル3310をタスクとして実行し、非リアルタイムOS72上で情報系プログラム76の実行ファイル3410をタスクとして実行する。
【0073】
共有メモリ定義情報1600に基づいてキュー(リングバッファ3110)を含む共有メモリ77を設定することによって、制御系プログラム75及び情報系プログラム76は、共有メモリ77を介してデータを共有しながら、並列して処理を実行できる。
【0074】
以上、実施例1の制御システム1の構成及び処理の概要を説明した。次に、本発明の特徴となる設定プログラム90の処理の詳細について説明する。
【0075】
図7から
図17を用いて設定プログラム90が使用する情報(テーブル及びファイル等)のデータ構造を説明する。
【0076】
図7は、実施例1の設定装置10が保持する情報の一例を示す図である。
【0077】
不揮発性記憶装置15は、設定プログラム90へ入力する情報として、データモデル定義情報1000、制御系プログラム定義情報1100、情報系プログラム定義情報1200を格納する。また、不揮発性記憶装置15は、設定プログラム90から出力される情報として、共有メモリ定義情報1600、制御系プログラム構造体定義情報1700、及び情報系プログラム構造体定義情報1800を格納する。さらに、不揮発性記憶装置15は、内部処理用の情報としてデータ型変換テーブル1400を格納する。
【0078】
メインメモリ13は、内部処理用の情報として、出力変数配置方式情報1300、構造体メンバ情報1500、アラインメントカウンタ1900、及びブロックサイズカウンタ1910を格納する。
【0079】
データモデル定義情報1000及び共有メモリ定義情報1600は、INI形式のテキストファイルであり、制御系プログラム定義情報1100及び情報系プログラム定義情報1200は、それぞれのプログラム言語仕様に基づく構造体の定義を記述したテキストファイルである。
【0080】
INI形式は、[]で囲った文字列で定義したセクションの後ろに、そのセクションに属する「(キー名称)=(値)」の形式で、様々な情報を定義できる形式である。
【0081】
図8は、実施例1のデータモデル定義情報1000の一例を示す図である。
図9は、実施例1のデータモデル定義情報1000の記述仕様の一例を示す図である。
【0082】
まず、
図9を用いて、データモデル定義情報1000で使用できるセクション名称、キー名称、及びキーに対して使用できる値について説明する。
【0083】
セクション「Buffer」の下には、共有メモリ77に定義できるリングバッファ3110の数を指定する。
【0084】
「BufferNum」で定義した数がN個の場合、セクション「RingBuffer1」からセクション「RingBufferN」のN個のセクションを指定し、各セクションの下に、リングバッファ3110のブロック数を、キー「BlockNum」として定義し、リングバッファ3110を指定する名称を、キー「BuffName」として定義する。
【0085】
各リングバッファ3110のブロック数はキー「BlockNum」で指定できる。ただし、ブロック数の指定は必須ではなく、制御系プログラム75及び情報系プログラム76の実行周期が指定されていれば省略可能である。
【0086】
キー「WritableProgType」は、リングバッファ3110にデータを書き込むプログラムが、制御系プログラム75(RT)及び情報系プログラム76(INFO)のいずれであるかを識別する情報を定義するキーである。その後には、各リングバッファ3110に、制御系プログラム75及び情報系プログラム76が相互に読み書きするデータモデルを定義するキーを記述できる。
【0087】
プログラムが読み書きするデータモデルのメンバ数がM個である場合、「Member1_Type1」から「Member1_TypeM」、「Member1_Name1」から「Member1_NameM」まで、それぞれM個、データモデルのデータ型及びデータ名称を定義できる。
【0088】
データ名称の直後に[(正整数値)]の形式で配列を指定することもできる。本実施例では、配列は2次元配列まで指定できるものとする。
【0089】
以上の仕様に基づき記述されたデータモデル定義情報1000の一例を
図8に示す。
図8のデータモデル定義情報1000には、3個のリングバッファ3110が定義されている。
【0090】
図10は、実施例1のデータ型変換テーブル1400の一例を示す図である。
図11は、実施例1のデータ型変換テーブル1400の記述仕様の一例を示す図である。
【0091】
データ型変換テーブル1400は、データモデル型名1410、データサイズ1420、制御系プログラム変数型名1430、及び情報系プログラム変数型名1440から構成される構造体の配列となっている。データ型変換テーブル1400の取り得る値の一例は
図11に示すとおりである。
【0092】
設定プログラム90は、データモデル定義情報1000のデータ型の名称が指定された場合、当該名称に対応するデータモデル型名1410を含むデータ型変換テーブル1400の、データサイズ1420を出力し、また、データ型の名称を制御系プログラム変数型名1430及び情報系プログラム変数型名1440に変換する。
【0093】
図12は、実施例1の出力変数配置方式情報1300の一例を示す図である。
図13は、実施例1の出力変数配置方式情報1300のアラインメント方式識別子の記述仕様の一例を示す図である。
図14は、実施例1の出力変数配置方式情報1300のアラインメントサイズ識別子の記述仕様の一例を示す図である。
【0094】
出力変数配置方式情報1300は、アラインメント方式識別子1310及びアラインメントサイズ識別子1320から構成される。制御系プログラム定義情報1100の変数配置方式情報1110及び情報系プログラム定義情報1200の変数配置方式情報1210も同一のデータ構造である。
【0095】
アラインメント方式識別子1310の取り得る値の一例は
図13に示すとおりであり、また、アラインメントサイズ識別子1320の取り得る値の一例は
図14に示すとおりである。
【0096】
実施例1では、固定アラインメント及びナチュラルアラインメントのいずれかをアラインメント方式として選択でき、また、1バイト、2バイト、4バイト、及び8バイトのいずれかをアラインメントサイズとして選択できる。
【0097】
図15は、実施例1の構造体メンバ情報1500の一例を示す図である。
【0098】
図15に示す構造体メンバ情報1500は、INI形式のデータモデル定義情報1000を参照しやすくするために、テーブル形式に変換した情報である。構造体メンバ情報1500は、メンバ名称1510、制御系プログラム変数型名1520、情報系プログラム変数型名1530、変数サイズ1540、変数配列数1次1550、及び変数配列数2次1560からなる構造体の配列である。
【0099】
図16は、実施例1の共有メモリ定義情報1600の一例を示す図である。
図17は、実施例1の共有メモリ定義情報1600の記述仕様の一例を示す図である。
【0100】
共有メモリ定義情報1600は、INI形式のテキストファイルである。セクション及びキーがとりうる値は
図17に示すとおりである。
【0101】
セクション「Buffer」のキー「BufferNum」と、各リングバッファ3110のセクションで定義できるキー「BlockNum」、キー「BuffName」、及びキー「WritableProgType」との仕様は、データモデル定義情報1000と同じである。キー「BlockSize」は、リングバッファ3110の1つのブロックサイズを表す。
【0102】
以上の仕様に基づき記述された共有メモリ定義情報1600の一例を
図16に示す。
【0103】
以上が設定プログラム90が使用する情報の説明である。次に、フローチャートを用いて、設定プログラム90が実行する処理を説明する。
【0104】
図18は、実施例1の設定プログラム90が実行するメイン処理を説明するフローチャートである。
【0105】
設定プログラム90は、実行指示を受け付けた場合、又は、必要な情報が全て入力された場合、メイン処理を開始する(ステップS100)。
【0106】
まず、設定プログラム90は、データモデル定義情報1000を読み出し(ステップS110)、出力アラインメント形式決定処理を実行する(ステップS200)。これらの処理は、
図5の変数配置方式決定手段91に対応する。出力アラインメント形式決定処理の詳細は
図19を用いて説明する。
【0107】
次に、設定プログラム90は、データモデル定義情報1000に定義されたN個のリングバッファ3110のループ処理Aを開始する(ステップS120)。ここでは、設定プログラム90は、INI形式のデータモデル定義情報1000に含まれるセクションを1つ選択する。
【0108】
次に、設定プログラム90は、選択したリングバッファ3110に対して構造体メンバ決定処理を実行する(ステップS300)。この処理は、
図5の変数配置手段92に対応する。構造体メンバ決定処理の詳細は
図21を用いて説明する。
【0109】
次に、設定プログラム90は、制御系プログラム構造体定義情報生成処理及び情報系プログラム構造体定義情報生成処理を実行する(ステップS500、ステップS700)。各処理は、
図5における制御系プログラム構造体定義出力手段94及び情報系プログラム構造体定義出力手段95に対応する。制御系プログラム構造体定義情報生成処理の詳細は
図22を用いて説明する。情報系プログラム構造体定義情報生成処理の詳細は
図23を用いて説明する。
【0110】
次に、設定プログラム90は、共有メモリ定義情報生成処理を実行する(ステップS900)。この処理は、
図5の共有メモリ定義情報出力手段97に対応する。共有メモリ定義情報生成処理の詳細は
図25を用いて説明する。
【0111】
次に、設定プログラム90は、データモデル定義情報1000に定義された全てのリングバッファ3110について処理が完了したか否かを判定する(ステップS140)。
【0112】
データモデル定義情報1000に定義された全てのリングバッファ3110について処理が完了していない場合、設定プログラム90はステップS120に戻り、同様の処理を実行する。
【0113】
データモデル定義情報1000に定義された全てのリングバッファ3110について処理が完了した場合、設定プログラム90はメイン処理を終了する。
【0114】
図19は、実施例1の設定プログラム90が実行する出力アラインメント形式決定処理の一例を説明するフローチャートである。
図20は、アラインメント方式と変数配置との関係を説明する図である。
【0115】
図20では、C言語の構造体定義4000にて関連付けられる変数を、異なるアラインメント方式及びアラインメントサイズの組合せでプログラムとしてビルドした場合の変数配置4010、4020、4030を示す。
図20に示すように、アラインメント方式(固定アラインメント方式又はナチュラルアラインメント方式)と、アラインメントサイズとの組み合わせによって、構造体に属する変数の配置は異なった結果となる。
【0116】
変数配置4010は、8バイトのナチュラルアラインメントを選択した場合の変数は位置を示す。変数配置4020は、4バイトのナチュラルアラインメントを選択した場合の変数は位置を示す。変数配置4030は、8バイトの固定アラインメントを選択した場合の変数は位置を示す。斜線部分はパディングを表す。
【0117】
従って、制御系プログラム75と情報系プログラム76との間で、リングバッファ3110を介して正しくデータの送受信を行うためには、各処理系のプログラムにおける変数の配置を完全に一致させる必要がある。
【0118】
また、処理系のプログラムにおいては、次のルールがあるため、それを満たせるように変数のアラインメント方式を決定する必要がある。
(1)ナチュラルアラインメントの処理系のプログラムは、固定アラインメントの変数配置にアクセスできるが、固定アラインメントの処理系のプログラムは、ナチュラルアラインメントの変数配置にアクセスできない場合がある。
(2)アラインメントサイズが小さい処理系のプログラムは、当該アラインメントサイズより大きなアラインメントサイズの変数配列にアクセスできるが、アラインメントサイズが大きな処理系のプログラムは、当該アラインメントサイズより小さなアラインメントサイズの変数配列にアクセスできない場合がある。
【0119】
設定プログラム90は、制御系プログラム75の変数配置方式情報1110及び情報系プログラム76の変数配置方式情報1210を参照し(ステップS201)、両方のプログラムのアラインメント方式がナチュラルアラインメントであるか否かを判定する(ステップS203)。
【0120】
両方のプログラムのアラインメント方式がナチュラルアラインメントである場合、設定プログラム90は、出力アラインメント方式としてナチュラルアラインメントを設定し(ステップS205)、その後、ステップS209に進む。具体的には、設定プログラム90は、出力変数配置方式情報1300のアラインメント方式識別子1310に0を設定する。
【0121】
いずれか一方のプログラムのアラインメント方式が固定アラインメントである場合、設定プログラム90は、出力アラインメント方式として固定アラインメントを設定し(ステップS207)、その後、ステップS209に進む。具体的には、設定プログラム90は、出力変数配置方式情報1300のアラインメント方式識別子1310に1を設定する。
【0122】
ステップS209では、設定プログラム90は、情報系プログラム76のアラインメントサイズが制御系プログラム75のアラインメントサイズ以上であるか否かを判定する(ステップS209)。
【0123】
情報系プログラム76のアラインメントサイズが制御系プログラム75のアラインメントサイズ以上である場合、設定プログラム90は、出力アラインメントサイズに、情報系プログラム76のアラインメントサイズを設定し(ステップS211)、出力アラインメント形式決定処理を終了する。具体的には、設定プログラム90は、出力変数配置方式情報1300のアラインメントサイズ識別子1320に、情報系プログラム76のアラインメントサイズに対応するアラインメントサイズ識別子を設定する。
【0124】
情報系プログラム76のアラインメントサイズが制御系プログラム75のアラインメントサイズより小さい場合、設定プログラム90は、出力アラインメントサイズに、制御系プログラム75のアラインメントサイズを設定し(ステップS213)、出力アラインメント形式決定処理を終了する。具体的には、設定プログラム90は、出力変数配置方式情報1300のアラインメントサイズ識別子1320に、制御系プログラム75のアラインメントサイズに対応するアラインメントサイズ識別子を設定する。
【0125】
図21は、実施例1の設定プログラム90が実行する構造体メンバ決定処理の一例を説明するフローチャートである。
【0126】
構造体メンバ決定処理では、データモデル定義情報1000から構造体メンバ情報1500が生成される。
【0127】
設定プログラム90は、データモデル定義情報1000の選択されたリングバッファ3110を介して送受信されるデータ群のデータモデルのループ処理Bを開始する(ステップS301)。ここでは、設定プログラム90は、選択されたリングバッファ3110におけるデータモデルを示すメンバを1つ選択する。
【0128】
設定プログラム90は、データモデル定義情報1000から、選択したデータモデル(メンバ)のデータ型の名称、データ名称、及び配列数を抽出する(ステップS303)。
【0129】
次に、設定プログラム90は、構造体メンバ情報1500に、変数型名及びサイズを設定する(ステップS305)。
【0130】
具体的には、設定プログラム90は、データモデル型名1410に抽出されたデータ型の名称を格納するデータ型変換テーブル1400を参照する。設定プログラム90は空の構造体メンバ情報1500を生成する。設定プログラム90は、変数サイズ1540に、データ型変換テーブル1400のデータサイズ1420を設定し、制御系プログラム変数型名1520に、データ型変換テーブル1400の制御系プログラム変数型名1430を設定し、情報系プログラム変数型名1530に、データ型変換テーブル1400の情報系プログラム変数型名1440を設定する。
【0131】
次に、設定プログラム90は、データモデルに配列が指定されているか否かを判定する(ステップS307)。具体的には、ステップS303において、設定プログラム90は、配列数が抽出されたか否かを判定する。
【0132】
データモデルに配列が指定されている場合、設定プログラム90は、構造体メンバ情報1500の変数配列数1次1550及び変数配列数2次1560に、データモデルに指定された配列数を設定し(ステップS309)、その後、ステップS313に進む。
【0133】
なお、指定された配列が1次元のみの場合、設定プログラム90は、変数配列数1次1550にのみ指定された値を設定し、変数配列数2次1560には1を設定する。指定された配列が2次元の場合、設定プログラム90は、変数配列数1次1550及び変数配列数2次1560の両方に、指定された配列数を設定する。
【0134】
データモデルに配列が指定されていない場合、設定プログラム90は、構造体メンバ情報1500の変数配列数1次1550及び変数配列数2次1560の各々に1を設定し(ステップS311)、その後、ステップS313に進む。配列数が1の場合、設定プログラム90は配列ではないと識別できる。
【0135】
ステップS313では、設定プログラム90は、構造体メンバ情報1500のメンバ名称1510に、選択されたデータモデルのメンバ名称を設定する(ステップS313)。
【0136】
次に、設定プログラム90は、選択されたリングバッファ3110における全てのデータモデルについて処理が完了したか否かを判定する(ステップS315)。
【0137】
選択されたリングバッファ3110における全てのデータモデルについて処理が完了していない場合、設定プログラム90はステップS301に戻り、同様の処理を実行する。
【0138】
選択されたリングバッファ3110における全てのデータモデルについて処理が完了した場合、設定プログラム90は構造体メンバ決定処理を終了する。
【0139】
図22は、実施例1の設定プログラム90が実行する制御系プログラム構造体定義情報生成処理の一例を説明するフローチャートである。
【0140】
設定プログラム90は、構造体定義のひな型の文字列を、制御系プログラム構造体定義情報1700に出力し(ステップS501)、アラインメントカウンタ1900及びブロックサイズカウンタ1910を0に初期化する(ステップS503)。
【0141】
次に、設定プログラム90は、データモデル定義情報1000の選択されたリングバッファ3110を定義するセクションのメンバのループ処理Cを開始する(ステップS505)。ここでは、設定プログラム90は、選択されたリングバッファ3110を定義するセクションのメンバに対応する構造体メンバ情報1500を1つ選択する。
【0142】
設定プログラム90は、出力変数配置方式情報1300を参照し、アラインメント方式がナチュラルアラインメントであるか否かを判定する(ステップS507)。
【0143】
アラインメント方式がナチュラルアラインメントである場合、設定プログラム90は、出力アラインメントサイズからアラインメントカウンタ1900を減算した値(算出値)が、構造体メンバの変数サイズ以上であるか否かを判定する(ステップS509)。
【0144】
具体的には、設定プログラム90は、算出値が構造体メンバ情報1500の変数サイズ1540以上であるか否かを判定する。
【0145】
算出値が構造体メンバの変数サイズ以上であると判定された場合、設定プログラム90はステップS511に進む。
【0146】
算出値が構造体メンバの変数サイズより小さい場合、設定プログラム90はステップ519に進む。これは、前の変数に連続して変数を配置できないためである。
【0147】
ステップS507において、アラインメント方式が固定アラインメントである場合、設定プログラム90は、アラインメントカウンタ1900が0であるか否かを判定する(ステップS517)。
【0148】
アラインメントカウンタ1900が0である場合、設定プログラム90はステップS511に進む。アラインメントカウンタ1900が0でない場合、設定プログラムはステップS519に進む。
【0149】
ステップS511では、設定プログラム90は、構造体メンバ定義文字列を、制御系プログラム構造体定義情報1700の構造体メンバとして出力する(ステップS511)。
【0150】
ただし、構造体メンバに配列が指定されている場合、設定プログラム90は、構造体メンバの変数サイズに配列数を乗算し、さらに、アラインメントサイズで除算して得られた剰余を変数サイズとして採用する。なお、配列の指定の有無は、構造体メンバ情報1500の変数配列数1次1550及び変数配列数2次1560に基づいて判定できる。
【0151】
次に、設定プログラム90は、構造体メンバサイズに基づいて、アラインメントカウンタ1900及びブロックサイズカウンタ1910を更新する(ステップS513、ステップS515)。その後、設定プログラム90はステップS525に進む。
【0152】
具体的には、設定プログラム90は、アラインメントカウンタ1900及びブロックサイズカウンタ1910の各々に構造体メンバ情報1500の変数サイズ1540を加算する。
【0153】
ステップS519では、設定プログラム90は、算出値に対応するサイズのダミーメンバ定義文字列を、制御系プログラム構造体定義情報1700の構造体メンバとして出力する(ステップS519)。ダミーメンバ定義文字列はパディングに相当する。
【0154】
次に、設定プログラム90は、アラインメントカウンタ1900を0に初期化し(ステップS521)、ダミー変数サイズに基づいてブロックサイズカウンタ1910を更新する(ステップS523)。その後、設定プログラム90はステップS525に進む。
【0155】
具体的には、設定プログラム90はブロックサイズカウンタ1910のダミー変数サイズを加算する。
【0156】
ステップS525では、設定プログラム90は、選択されたリングバッファ3110を定義するセクションの全てのメンバについて処理が完了したか否かを判定する(ステップS525)。
【0157】
選択されたリングバッファ3110を定義するセクションの全てのメンバについて処理が完了していない場合、設定プログラム90はステップS505に戻り、同様の処理を実行する。
【0158】
選択されたリングバッファ3110を定義するセクションの全てのメンバについて処理が完了した場合、設定プログラム90は制御系プログラム構造体定義情報生成処理を終了する。以上の処理によって得られたブロックサイズカウンタ1910の値が、共有メモリ77を介して送受信されるデータ群を定義する構造体のサイズとして算出される。
【0159】
アラインメント方式がナチュラルアラインメントの場合、設定プログラム90は前の変数に連続して変数を配置するように設定する。アラインメント方式が固定アラインメントの場合、設定プログラム90はアラインメントカウンタ1900が0のとき変数を配置するように設定する。
【0160】
図23は、実施例1の設定プログラム90が実行する情報系プログラム構造体定義情報生成処理の一例を説明するフローチャートである。
【0161】
情報系プログラム構造体定義情報生成処理(ステップS701からステップS725)は、制御系プログラム構造体定義情報生成処理(ステップS501からステップS525)とほぼ同一の処理である。ただし、情報系プログラム76は制御系プログラム75とはプログラミング言語の仕様自体が異なるため、構造体定義情報に出力する定義文字列の形式が異なる。
【0162】
なお、制御系プログラム構造体定義情報生成処理が実行済みの場合、情報系プログラム構造体定義情報生成処理では、ブロックサイズカウンタ1910は使用しなくてもよい。また、情報系プログラム構造体定義情報生成処理が実行済みの場合、制御系プログラム構造体定義情報生成処理では、ブロックサイズカウンタ1910は使用しなくてもよい。
【0163】
図24は、実施例1の設定プログラム90が出力する構造体定義情報の一例を示す図である。
【0164】
図24には、一例として、リングバッファ3110上で読み書きするデータモデルが8バイトサイズかつナチュラルアラインメントで配置された場合の例を示す。この場合、設定プログラム90は、
図24に示すような制御系プログラム構造体定義情報1700及び情報系プログラム構造体定義情報1800を出力する。
【0165】
図25は、実施例1の設定プログラム90が実行する共有メモリ定義情報生成処理の一例を説明するフローチャートである。
【0166】
設定プログラム90は、共有メモリ定義情報のひな形文字列を共有メモリ定義情報1600に出力する(ステップS901)。
【0167】
設定プログラム90は、出力変数配置方式情報1300の変数アラインメントサイズに基づいて、ブロックサイズカウンタ1910の値を補正する(ステップS903)。
【0168】
具体的には、ブロックサイズカウンタ1910の値(ブロックサイズ)が変数アラインメントサイズの整数倍でない場合、設定プログラム90は、ブロックサイズより大きく、かつ、最も小さな変数アラインメントサイズの整数倍の値になるようにブロックサイズを補正する。
【0169】
次に、設定プログラム90は、共有メモリ定義情報1600のブロックサイズ定義文字列としてブロックサイズカウンタ1910の値を出力する(ステップS905)。
【0170】
次に、設定プログラム90は、制御系プログラム75の実行周期が情報系プログラム76の実行周期より小さいか否かを判定する(ステップS907)。
【0171】
具体的には、設定プログラム90は、制御系プログラム定義情報1100の実行周期1120と、情報系プログラム定義情報1200の実行周期1220とを比較する。
【0172】
制御系プログラム75の実行周期が情報系プログラム76の実行周期より小さい場合、設定プログラム90は、情報系プログラム76の実行周期を制御系プログラム75の実行周期で除算した値を周期比率として算出する(ステップS909)。その後、設定プログラム90はステップS913に進む。
【0173】
制御系プログラム75の実行周期が情報系プログラム76の実行周期以上である場合、設定プログラム90は、制御系プログラム75の実行周期を情報系プログラム76の実行周期で除算した値を周期比率として算出する(ステップS911)。その後、設定プログラム90はステップS913に進む。
【0174】
ステップS913では、設定プログラム90は、周期比率に基づいてリングバッファ3110のブロック数を算出する(ステップS913)。
【0175】
周期比率からリングバッファ3110のブロック数を算出する方法としては、例えば、周期比率より大きく、かつ、一番小さな整数値を、ブロック数として算出する方法が考えられる。
【0176】
ただし、前述の算出方法で算出されたブロック数をそのまま用いた場合、非リアルタイムOS72上で動作する情報系プログラム76の周期実行における実行遅延時間及びジッタの発生によってキューがあふれてしまう危険性がある。そのため、安全性を考慮して、余裕を持ったブロック数を設定するのが通例である。すなわち、算出されたブロック数(整数)に余裕を見積もったブロック数(整数)を加算する。
【0177】
例えば、非リアルタイムOS72上でのタスク最大ジッタ量に応じて、固定的な比率でブロック数を加算する方法、非リアルタイムOS72上でのタスクのジッタ量を実行中に計測し、ジッタ量の大きさに応じてブロック数を加算する比率を変える方法等がある。
【0178】
次に、設定プログラム90は、共有メモリ定義情報1600のブロック数定義文字列として、算出したブロック数を出力する(ステップS915)。その後、設定プログラム90は共有メモリ定義情報生成処理を終了する。
【0179】
図26は、実施例1の制御装置30が設定するリングバッファ管理情報2200の一例を示す図である。
図27は、実施例1の制御装置30が生成するリングバッファ3110の構成の一例を示す図である。
【0180】
制御装置30は、初期処理3500において、設定プログラム90によって出力された共有メモリ定義情報1600を読み出し、共有メモリ定義情報1600に基づいてリングバッファ管理情報2200のブロック数2210及びブロックサイズ2220を設定する。また、制御装置30は、ブロックサイズ2220で指定されたサイズのブロックを、ブロック数2210で指定された数だけ含む配列からなるリングバッファ3110を共有メモリ77に生成する。
【0181】
また、制御装置30は、リングバッファ管理情報2200に先頭ブロックINDEX2230及び末尾ブロックINDEX2240に初期値を設定する。ここで、先頭ブロックINDEX2230及び末尾ブロックINDEX2240は、リングバッファ3110に書き込む先頭ブロック及び読み出す末尾のブロックを管理するためのものである。
【0182】
例えば、先頭ブロックINDEX2230及び末尾ブロックINDEX2240は、初期状態では、リングバッファ3110先頭を示す状態に設定される。
【0183】
ここで、制御系プログラム75は、1ブロックサイズ分の構造体データ2300(データ群)を、共有メモリAPI81を用いて、リングバッファ3110の先頭ブロックINDEX2230が示すブロックに書き込み、先頭ブロックINDEX2230の値を1つ進める。構造体データ2300は1つのセクションにおいて定義されたメンバから構成されるデータである。
【0184】
情報系プログラム76は、共有メモリAPI82を用いて、制御系プログラム5によってリングバッファ3110にキューイングされた、先頭ブロックINDEX2230から末尾ブロックINDEX2240が示す複数の構造体データ2310を、まとめて読み出すことができる。このとき、情報系プログラム76は、読出ブロック数2420と、読出ブロック数分の構造体データ群2410を一括して取得する。
【0185】
これによって、情報系プログラム76は、制御系プログラム75が書き込んだデータ群を、制御系プログラム75より長い周期でデータ群を読み出す場合でも、漏れなく全てのデータを取得できる。
【0186】
以上で説明したように、実施例1によれば、共有メモリ77上に、必要最小限のブロックサイズ、かつ、必要最小限のブロック数のリングバッファ3110を設定できる。これによって、制御系プログラム75と情報系プログラム76との間で漏れなくデータを送受信することができ、また、制御装置30にリングバッファ3110を設定するために必要なメモリ使用量を低く抑えることができる。
【0187】
(変形例1)
実施例1の制御システム1では制御装置30及び設定装置10を独立した装置としているが、1つの装置にまとめてもよい。
【0188】
図28は、実施例1の変形例の制御システム1の構成の一例を示すブロック図である。
【0189】
図28に示す制御システム1は、制御装置30、制御対象機器50、及び制御装置30と制御対象機器50との間を接続するネットワーク40から構成される。
【0190】
変形例の制御装置30は、設定プログラム90が動作するように構成される。この場合、設定プログラム90は、非リアルタイムOS72上で、情報系プログラム76と周辺制御装置35を共有し、並列動作する。
図28に示すような制御システム1であっても本発明を適用することができる。
【0191】
(変形例2)
実施例1では、制御装置30は、リアルタイムOS71及び非リアルタイムOS72が共存するハイブリッドOS型であったがこれ以外の構成でもよい。
【0192】
図29は、実施例1の変形例の制御装置30のソフトウェア構成の一例を示す図である。
【0193】
変形例では、本来、プリエンプティブ・タスク・スケジューラ74しか搭載しないOSのリアルタイム性能を強化し、リアルタイム・タスク・スケジューラ73を搭載したリアルタイムOS71上で、制御系プログラム75及び情報系プログラム76を共存させ、並列実行させる。
図29に示すような制御装置30であっても本発明を適用することができる。
【0194】
なお、本発明は上記した実施例に限定されるものではなく、様々な変形例が含まれる。また、例えば、上記した実施例は本発明を分かりやすく説明するために構成を詳細に説明したものであり、必ずしも説明した全ての構成を備えるものに限定されるものではない。また、各実施例の構成の一部について、他の構成に追加、削除、置換することが可能である。
【0195】
また、上記の各構成、機能、処理部、処理手段等は、それらの一部又は全部を、例えば集積回路で設計する等によりハードウェアで実現してもよい。また、本発明は、実施例の機能を実現するソフトウェアのプログラムコードによっても実現できる。この場合、プログラムコードを記録した記憶媒体をコンピュータに提供し、そのコンピュータが備えるプロセッサが記憶媒体に格納されたプログラムコードを読み出す。この場合、記憶媒体から読み出されたプログラムコード自体が前述した実施例の機能を実現することになり、そのプログラムコード自体、及びそれを記憶した記憶媒体は本発明を構成することになる。このようなプログラムコードを供給するための記憶媒体としては、例えば、フレキシブルディスク、CD-ROM、DVD-ROM、ハードディスク、SSD(Solid State Drive)、光ディスク、光磁気ディスク、CD-R、磁気テープ、不揮発性のメモリカード、ROMなどが用いられる。
【0196】
また、本実施例に記載の機能を実現するプログラムコードは、例えば、アセンブラ、C/C++、perl、Shell、PHP、Python、Java(登録商標)等の広範囲のプログラム又はスクリプト言語で実装できる。
【0197】
さらに、実施例の機能を実現するソフトウェアのプログラムコードを、ネットワークを介して配信することによって、それをコンピュータのハードディスクやメモリ等の記憶手段又はCD-RW、CD-R等の記憶媒体に格納し、コンピュータが備えるプロセッサが当該記憶手段や当該記憶媒体に格納されたプログラムコードを読み出して実行するようにしてもよい。
【0198】
上述の実施例において、制御線や情報線は、説明上必要と考えられるものを示しており、製品上必ずしも全ての制御線や情報線を示しているとは限らない。全ての構成が相互に接続されていてもよい。
【符号の説明】
【0199】
1 制御システム
10 設定装置
20、40 ネットワーク
30 制御装置
50 制御対象機器
11、31 CPU
12、32 EPROM
13、33 メインメモリ
14、35 周辺制御装置
15、36 不揮発性記憶装置
16、37 ユーザI/F装置
17、38、39 ネットワークI/F
34 タイマ
51 センサ
52 アクチュエータ
71 リアルタイムOS
72 非リアルタイムOS
75 制御系プログラム
76 情報系プログラム
77 共有メモリ
90 設定プログラム
91 変数配置方式決定手段
92 変数配置手段
93 ブロックサイズ算出手段
94 制御系プログラム構造体定義出力手段
95 情報系プログラム構造体定義出力手段
96 ブロック数算出手段
97 共有メモリ定義情報出力手段
1000 データモデル定義情報
1100 制御系プログラム定義情報
1200 情報系プログラム定義情報
1300 出力変数配置方式情報
1400 データ型変換テーブル
1500 構造体メンバ情報
1600 共有メモリ定義情報
1700 制御系プログラム構造体定義情報
1800 情報系プログラム構造体定義情報
2200 リングバッファ管理情報
3100 単純配列待ち行列
3110 リングバッファ
3120 連結リスト