リアルタイムデータ共有メモリ機能

RT-DSM
ユーザーズガイド

HIOT-DSM-03

この製品を輸出される場合には、外国為替及び外国貿易法の規制並びに米国輸出管理規則など外国の輸出関連法規をご確認のうえ、
必要な手続きをお取りください。
なお、不明な場合は、弊社担当営業にお問い合わせください。

２０２１年 ５月（第１版）ＨＩＯＴ－ＤＳＭ－０１（廃版）
２０２１年 ９月（第２版）ＨＩＯＴ－ＤＳＭ－０２（廃版）
２０２２年 ７月（第３版）ＨＩＯＴ－ＤＳＭ－０３●

このマニュアルの一部または全部を無断で転写したり複写したりすることは、
固くお断りいたします。

●

このマニュアルの内容を、改良のため予告なしに変更することがあります。

All Rights Reserved, Copyright © 2022 Hitachi Industrial Products, Ltd.

ご注意
● このソフトウェアをご使用になる前に、このマニュアルの記載内容をよく読み、書かれている指示や注意を十分理解してください。

● このマニュアルの記載内容について理解できない内容、疑問点または不明点がございましたら、最寄りの当社営業までお知らせください。

● 当社提供ソフトウェアを改変して使用した場合には、発生した事故や損害につきましては、当社は責任を負いかねますのでご了承ください。

● 当社提供以外のソフトウェアを使用した場合の信頼性については、当社は責任を負いかねますのでご了承ください。

● このソフトウェアが万一故障したり、誤動作やプログラムに欠陥があった場合でも、ご使用されるシステムの安全が十分に確保されるよう、保護・安全回路は外部に設け、人身事故・重大な災害に対する安全対策などが十分確保できるようなシステム設計としてください。

はじめに
本マニュアルは、「RT-DSM（S-763A-96P）」の使い方などについて記述したものです。本ソフトウェ
アをご使用になる前に、このマニュアルをよくお読みください。

＜マニュアル構成＞
このマニュアルは、次のような構成となっています。
第1章 RT-DSMとは
第2章 ソフトウェア構成
第3章 RT-DSMのインストール
第4章 ライブラリ使用手順
第5章 Windows®側API仕様
第6章 CODESYS®側API仕様
第7章 制限事項
第8章 開発ツールとデータ定義ファイル
第9章 コマンドリファレンス
第10章 サンプルプログラム
第11章 組込みCDMSとのデータ連携＜商標について＞
・Microsoft®、Windows®は、米国Microsoft Corporationの米国およびその他の国における登録商標または商標です。
・CODESYS®は、ドイツCODESYS GmbHの登録商標です。
・EtherCAT®は、ドイツBeckhoff Automation GmbHによりライセンスされた特許取得済み技術であり、登録商標です。
・上記以外にこのマニュアルに記載されている他社製品名（ソフトウェア、ハードウェア）は、各社の登録商標、商標、または商品です。
＜関連ドキュメント＞
本機能に対応した CODESYS®を搭載する IoT 対応産業用コントローラ HF-W/IoT のソフトウェア
PLC の使い方などについては、下記ドキュメントをご参照ください。

No.

ドキュメント名

備考

1

HF-W100E/IoT スタートアップガイド

(*1)

2

HF-W2000/IoT モデル 58/55/50 HF-W400E/IoT スタートアップガイド(*1)(*1) 以下の URL からご参照ください。
https://www.hitachi-ip.co.jp/products/hfw/products/iot_ctr/download.html

i目次
はじめに ............................................................................................................................................ i
目次 ................................................................................................................................................... ii
第 1 章 RT-DSM とは ........................................................................................................................ 1
第 2 章 ソフトウェア構成 ................................................................................................................ 2
第 3 章 RT-DSM のインストール...................................................................................................... 3
3.1. インストール作業の前に ....................................................................................................... 3
3.2. RT-DSM のインストール ........................................................................................................ 4
3.3. RT-DSM のアンインストール ................................................................................................. 5
第 4 章 ライブラリ使用手順 ............................................................................................................ 6
第 5 章 Windows®側 API 仕様 ......................................................................................................... 15
5.1. Windows®側 API リファレンス ............................................................................................. 16
5.2. Windows®側 API エラーコード ............................................................................................. 25
第 6 章 CODESYS®側 API 仕様 ...................................................................................................... 27
6.1. CODESYS®側 API リファレンス .......................................................................................... 28
6.2. CODESYS®側 API エラーコード .......................................................................................... 34
第 7 章 制限事項............................................................................................................................. 36
第 8 章 開発ツールとデータ定義ファイル..................................................................................... 38
8.1. リファレンス ....................................................................................................................... 39
8.2. データ定義ファイル定義項目.............................................................................................. 40
8.3. 構造体メンバとして記述できるデータ型 ........................................................................... 41
8.4. C 言語プログラム用ヘッダファイル出力仕様 ..................................................................... 42
8.5. IEC プログラム用変数定義ファイルの出力仕様 .................................................................. 43
8.6. データ定義ファイルサンプル.............................................................................................. 44
第 9 章 コマンドリファレンス ....................................................................................................... 45
第 10 章 サンプルプログラム......................................................................................................... 52
第 11 章 組込み CDMS とのデータ連携 ......................................................................................... 57
11.1. リファレンス ..................................................................................................................... 58
11.2. データ定義ファイル定義項目 ............................................................................................ 59

ii

第1章 RT-DSM とは
リアルタイムデータ共有メモリ機能（RT-DSM）は、Windows®および CODESYS®上で動作するプログラム間で、データの受け渡しを漏れなく行うためのソフトウェアです。リングバッファ構造のデー
タ共有メモリ（データ共有リングバッファ）を用いて、機能を実現しています。特長を以下に示します。
(1) API を介して、Windows®（情報系）および CODESYS®（制御系）上のプログラム間でデータ共有（受け渡し）を行います。
(2) 物理メモリ上で直接読み書きを行うため、高速にデータの受け渡しが可能です。
(3) 共有するデータ構成の定義は、定義ファイル（テキスト形式）で設定できます。
(4) データ共有リングバッファに書き込むデータは、約 30 秒間分蓄積可能（1ms 毎にデータを書き込む場合）なため、CODESYS®の高速周期データを漏れなく Windows®に渡すことができます。

このデータ共有リングバッファに、CODESYS®が制御する装置の各種データや情報系からの指令や解析フィードバックデータを格納することで、設備の監視や生産効率改善などに活用できます。また、API を介したデータ共有のため、本機能を搭載した環境であれば、ユーザープログラムの移行が行えます。

図1

RT-DSM の利用イメージ

1第2章 ソフトウェア構成
データ共有リングバッファは、リングバッファ定義ファイルに基づき PC 起動時に Windows®上のデーモンにより作成されます。リングバッファ定義ファイルは、ユーザーが作成するデータ定義ファイルを開発ツール（コマンド）に読み込ませて自動生成します。開発ツールとデータ定義ファイルの詳細については、「第 8 章 開発ツールとデータ定義ファイル」をご参照ください。

仕様に従いユーザーが作成

データ
定義ファイル

リングバッファ
定義ファイルデーモン
PC起動時に作成

read
プログラムB

開発ツール(コマンド)で自動生成
writeプログラムA

read

データ共有

API

プログラムC

API

リングバッファread
プログラムD

図2

RT-DSM ソフトウェア構成

データ共有リングバッファは、図 3 に示す構造をしており複数作成できます。1 つのリングバッファ
に対し、書き込みが行えるのは 1 つのプログラムのみで、読み込みは複数のプログラムから可能です。
リングバッファへの書き込み および 読み込みは、複数のデータを一まとめにしたデータ群で行います。このデータ群の単位を「ブロック」と呼びます。リングバッファはブロック N 個分のデータを蓄積し、N 個をオーバーして書き込むと古いブロックから順に上書きされます。
リングバッファ

データ群
データA
データB

データ群

ブロック1
write

read
ブロック2

データA

データB
データC

データC
データD

ブロック3
ブロック4

：
ブロックN

図3

データ共有リングバッファの構造

2

データD

第3章 RT-DSM のインストール
RT-DSM のインストール方法を以下に記載します。

3.1. インストール作業の前に
RT-DSM のインストールに際して、インストール作業で必要な項目 および 動作環境について説明します。
インストール作業で必要な項目を以下に示します。作業を開始する前に予め確認しておいてください。

＜インストール作業で必要になる項目＞
項目

内容

Name

任意の名前を入力ください。

Serial number

本ソフトウェアのインストールで必要な 12 桁のシリアルナンバーです。
本製品購入時に、弊社より通知されたものを入力ください。

ソフトウェア開発・実行環境を以下に示します。

＜ソフトウェア開発環境＞
項目

内容

Windows®アプリケーション開発環境

C 言語での開発が可能な任意の環境

CODESYS®開発環境

CODESYS® Development System（V3.5 SP16 Patch 4）＜ソフトウェア実行環境＞
項目

内容

OS（Windows®）

Microsoft® Windows® 10 Iot Enterprise（64bit）

CODESYS®リアルタイム実行環境

CODESYS® Control RTE（V3.5 SP16 Patch 4）.NET Framework.NET Framework 3.5 または .NET Framework 4

留意事項
装置に DVD ドライブが搭載されていない場合は、USB 接続の外付け光ディスクドライブ（DVD メディアを読み込めるドライブ）を用意して装置に接続してください。

33.2. RT-DSM のインストール
RT-DSM のインストール手順について説明します。なお、インストールはコンピューターの管理者
アカウントでログオンして行ってください。

① Administrator 権限を持つアカウントでログオンします。

② 「ファイル名を指定して実行」ウィンドウを開きます。［スタート］ボタンを右クリックし、表示されたメニューより「ファイル名を指定して実行」をクリックします。

③ セットアッププログラムを起動します。名前のボックスに以下を入力して[Enter]キーを押します。
"D:¥DSM.msi"※ DVD 媒体でのインストール手順として、DVD ドライブを D ドライブと仮定したパスを指定しています。下線部のパスはセットアッププログラムが格納されている場所に応じて変更してください。

④ 「RT-DSM」用のセットアップウィザード画面が表示されます。
「Next」ボタンをクリックします。

⑤ 画面に従いインストールします。Name には任意の名前を、Serial number には本ライブラリ購入時に弊社から提供されたキーを入力します。
「ユーザーアカウント制御」画面が表示される場合は、「はい」ボタンをクリックします。

⑥ RT-DSM のインストールが完了したことを示す画面が表示されます。
「Close」ボタンをクリックしてセットアッププログラムを終了します。

⑦ Windows®を再起動します。

4

3.3. RT-DSM のアンインストール
RT-DSM のアンインストール手順について説明します。なお、アンインストールはコンピューターの管理者アカウントでログオンして行ってください。

① 「スタート」メニューから「コントロールパネル」を開きます。
［スタート］ボタンをクリックし、［Windows システムツール］-［コントロールパネル］をクリックします。

② 「プログラムのアンインストール」を選択します。

③ インストールされているプログラムのリストから、「RT-DSM」を選択し、アンインストールを実行します。

④ 「RT-DSM」の削除を確認するメッセージが表示されます。「はい」ボタンをクリックします。
「ユーザーアカウント制御」画面が表示される場合は、「はい」ボタンをクリックします。

⑤ Windows®を再起動します。

5

第4章 ライブラリ使用手順
RT-DSM のライブラリの使用手順を以下に記載します。

（１） Windows®側ライブラリ使用手順【ライブラリ格納場所】
ライブラリ関連ファイルは、以下に格納しています。
「C:¥Program Files¥HX-DSM」

フォルダ

No.

ファイル

内容

1

DsmWlib.dll

データ共有リングバッファ API の DLL

2defconv.exe

定義ファイル作成用開発ツール

3

defconvDB.exe

定義ファイル作成用開発ツール（組込み CDMS 対応版 (*1)）

dsmconf.exe

データ共有リングバッファの定義情報表示コマンド

4bin

データ共有リングバッファの定義ファイル文法チェック

5
dsmconfchk.exe

コマンド
データ共有リングバッファの読み書きオープン状態

6dsmresetwop.exe

リセットコマンドお使いになるリングバッファ定義ファイルを格納して

7
buffer.ini
conf8（初期状態では No.8 を格納しています）
sample9 inc

ください。ini ファイルは複数格納しないでください。

buffer.ini

リングバッファ定義ファイル（サンプル）

dsm_rb.h

データ共有リングバッファ API のヘッダファイル
データ共有リングバッファ API のインポートライブラリ

10lib

DsmWlib.lib

ファイル(*1) 組込み CDMS の詳細は「第 11 章 組込み CDMS とのデータ連携」を参照。

【ライブラリ使用手順】
ライブラリの使用手順を以下に記載します。

＜ヘッダファイルの設定＞
コンパイルに必要な API のヘッダファイルは、dsm_rb.h をご使用ください。
① コンパイラのインクルードディレクトリに dsm_rb.h の格納フォルダを追加② ソースコードでインクルード（#include "dsm_rb.h"の指定）＜インポートライブラリファイルの設定＞
リンクに必要な API のインポートライブラリファイルは、DsmWlib.lib をご使用ください。
① リンカーの依存ライブラリファイルに DsmWlib.lib を追加

6

（２） CODESYS®側ライブラリ使用手順【ライブラリ格納場所】
ライブラリファイルは、以下に格納しています。
「C:¥Program Files¥HX-DSM¥Library¥Dsm_Cdsys.package」【ライブラリ使用手順】
CODESYS®の開発環境に、ライブラリを追加する手順を説明します。以下の手順を行う必要があります。
[1] ライブラリリポジトリに、ライブラリ（パッケージ形式）をインストール[2] ライブラリマネージャーに、ライブラリを追加＜ライブラリインストール方法（パッケージ形式）＞
ライブラリのインストールを一度でも実施している場合、以下の手順は不要です。
「＜ライブラリ追加方法(CODESYS®プロジェクト毎に実施)＞」の手順から実施してください。

①

CODESYS®開発環境上部の「ツール」-「パッケージマネージャー」をクリックします。

図 4 パッケージマネージャー表示7②

表示されるパッケージマネージャーダイアログで「インストール」ボタンを押下します。

図 5 パッケージマネージャーダイアログ③「C:¥Program Files¥HX-DSM¥Library」フォルダ内の「Dsm_Cdsys.package」ファイルを指定し、「開く(O)」ボタンを押下します。

図 6 ライブラリパッケージインストール

8

④パッケージのインストール画面が表示されます。画面に従いインストールを進めます。License
Agreement の画面が表示されますので、内容を確認し「私は、上記の使用許諾契約を読んで理解したので同意します。」にチェックを入れ「Next」ボタンを押下します。

図 7 インストール画面(License Agreement)⑤

セットアップの種類を選択します。デフォルトの「代表的なセットアップ」を選択したまま「Next」ボタンを押下します。
「ユーザーアカウント制御」画面が表示される場合は、「はい」
ボタンをクリックします。

図 8 インストール画面(Choose Setup Type)9

⑥

パッケージのインストールを開始します。1～2 分後、下記画面が表示されインストールが正常終了したことを確認し「Next」ボタンを押下します。

図 9 インストール画面(Setup Completed)⑦

インストールの概要を確認し、「Finish」ボタンを押下して終了します。

図 10 インストール画面(Summary)
10⑧

パッケージマネージャーダイアログで「CmpDsm」が表示されることを確認します。

図 11 パッケージマネージャーダイアログ(インストール後)11

＜ライブラリ追加方法(CODESYS®プロジェクト毎に実施)＞①

デバイス欄の「ライブラリマネージャー」をダブルクリックします。

図 12 ライブラリマネージャー表示②

ライブラリマネージャー内の「ライブラリの追加」を押下します。

図 13 ライブラリ追加ダイアログ表示12

③

ダイアログが表示されたら、左下部の「上級者向け…」ボタンを押下します。

図 14 ライブラリ追加ダイアログ④

ダイアログが切り替わったら、「System ⇒ SysLibs」内の「CmpDsm」を選択し、OK ボタンを押下します。

図 15 ライブラリ追加
13

⑤

なお、検索バーを利用し、ライブラリの検索をすることも可能です。

図 16 ライブラリ追加(検索バー使用時)⑥

ライブラリマネージャーに以下のライブラリが追加されたら完了となります。
・CmpDsm, 3.5.13.2 (Hitachi Industrial Products Ltd.)※ 会社情報には「, (カンマ)」が使用できないため省略しています。

14

第5章 Windows®側 API 仕様
RT-DSM の Windows®側の API 仕様を以下に記載します。

【Windows®側 API 一覧】
データ共有リングバッファへアクセスするための Windows®側 API の一覧を表 1 に示します。

表1

Windows®側 API 一覧

No.

関数名

1

Dsm_WinOpenRb

データ共有リングバッファのオープン

5.1(1)

2

Dsm_WinWriteRb

データ共有リングバッファへのデータ書き込み

5.1(2)

3

Dsm_WinReadRb

データ共有リングバッファからの最新データ読み込み

5.1(3)

4

Dsm_WinMReadRb

データ共有リングバッファからの未読データ読み込み

5.1(4)

5

Dsm_WinCloseRb

データ共有リングバッファのクローズ

5.1(5)

データ共有リングバッファの読み書きオープン状態を5.1(6)

6
Dsm_WinResetWOpenRb

説明

参照項

リセット

【Windows®側 API 仕様】
Windows®側 API の仕様一覧を表 2 に示します。

表2

Windows®側 API の仕様

No.

項目

内容

1

API の提供形態

C 言語用の関数として 64 ビット DLL で提供

2

エンディアン

リトルエンディアン
ただし、リングバッファに格納するデータ群のエンディアンは書き込みプログラムに依存します。

3構造体のアライメント

8 バイトアライメント
リングバッファ定義ファイルは、予めアライメントを意識した開発ツールを用いて作成してください。

15

5.1. Windows®側 API リファレンス（１）Dsm_WinOpenRb

＜名

前＞

＜形

式＞

Dsm_WinOpenRb － データ共有リングバッファのオープン

int

Dsm_WinOpenRb(buffname, type, &hBuff, &blksz, &blkcase, hashcode)char*buffname;unsigned int

type;

DSM_RB_HANDLE*hBuff;unsigned int*blksz;unsigned int*blkcase;

unsigned int

hashcode;＜機能説明＞
Dsm_WinOpenRb は、データ共有リングバッファをオープンする関数です。

*buffname ：データ共有リングバッファに割り当てた名称を指定してください。書き込み側と読み込み側で、同じリングバッファ名称を指定することでデータを共有できます。リングバッファ名称の長さは最大 31 文字です。31 文字以上を指定した場合、31 文字
までの名称を使用します。名称には英数字、"_"(アンダーバー)、および"-"(ハイフン)を使用できます。指定された名称がリングバッファ定義ファイルの定義内容と不一致の場合は、異常終了します。
type：読み込み用、または読み書き用のアクセス種別を指定してください。
0：読み込み用
1：読み書き用*hBuff：リングバッファのハンドルの格納先アドレスを指定してください。指定したリング
バッファのハンドル情報を格納します。リングバッファの読み込み、書き込み、クローズ時にそれぞれの関数に渡してください。

*blksz：リングバッファの 1 ブロックのサイズが返ります。8 バイトアラインのサイズになります。

*blkcase：リングバッファのブロック数が返ります。2 のべき乗で切り上げた数になります。

16hashcode：オープンするリングバッファのハッシュコードを指定してください。ハッシュコー
ドは、開発ツールが構造体の情報を基にインクルードファイルに出力します。また、構造体の使用先リングバッファとの関連付け情報として、ハッシュコードはリング
バッファ定義ファイルにも出力します。インクルードファイルにおけるハッシュコードの出力フォーマットは下記の通りです。
”struct xxx { ... };””#define(xxx はリングバッファ名称)

xxx_HASH

yyy” (xxx はリングバッファ名称、yyy はハッシュコード)リングバッファ定義ファイルにおけるハッシュコードの出力フォーマットは下記のとおりです。
”BuffName=xxx”(xxx はリングバッファ名称)”Hash=yyy”(yyy はハッシュコード)指定したハッシュコードとリングバッファ定義ファイルの定義内容が異なる場合は異常終了します。

＜診断＞
Dsm_WinOpenRb は、処理が正常終了すると 0 を返し、異常終了すると負の値を返します。

No.

エラーコード1

DSM_E_ARG

2

DSM_W_INIT

3

DSM_E_WINAPI

4

DSM_E_EXTWRTOPN

5

DSM_W_STOP

6

DSM_E_RBMALLOC

7

DSM_E_MGROPEN

8

DSM_E_RBOPEN

9

DSM_E_RBNAME

10

DSM_E_READONLY

11

DSM_E_UNMATCHHASH

17

＜注意事項＞
・ 読み書き用リングバッファのオープンは、１つのリングバッファにつき 1 つのスレッドのみが実行可能です。既に読み書き用でリングバッファがオープンされている場合、その後の読み書き用のリングバッファオープンは失敗します。
・ リングバッファの書込可能プログラム種別が「Windows」以外の場合、アクセス種別に読み書き用を指定したリングバッファオープンは失敗します。
・ 既に読み込み用でオープンしているリングバッファに再度読み込み用オープンを発行した場合、異常終了せずにリングバッファのハンドルを新しく確保します。
・ Dsm_WinCloseRb を発行せずにオープンを繰り返すとリングバッファのハンドルに関連する
Windows®のリソースが枯渇します。
・ 同一リングバッファハンドルを複数のスレッドから同時に使用できません。スレッド毎にオープンを実施して、リングバッファハンドルを用意してください。同一リングバッファハンドルに対して複数のスレッドから同時に使用した場合、プログラムエラーや API のエラーが発生します。

18

（２）Dsm_WinWriteRb

＜名

前＞

＜形

式＞

Dsm_WinWriteRb － データ共有リングバッファへのデータ書き込み

int

Dsm_WinWriteRb(hBuff, &pData, size)

DSM_RB_HANDLE

hBuff;

unsigned char*pData;unsigned int

size;＜機能説明＞
Dsm_WinWriteRb は、データ共有リングバッファにデータを書き込む関数です。

：Dsm_WinOpenRb 関数でオープンした、データ共有リングバッファのハンドルを指hBuff

定してください。
*pData：書き込むデータの先頭アドレスを指定してください。書き込むデータのエリアとして、書き込みサイズ以上を用意してください。
：書き込むデータのサイズ(バイト)を指定してください。1 ブロックのサイズより大きsize

い値を指定した場合は、異常終了します。

＜診断＞
Dsm_WinWriteRb は、処理が正常終了すると書き込んだデータの個数である 1 を返し、異常終了す

ると負の値を返します。

エラーコードNo.
1

DSM_E_ARG

2

DSM_W_STOP

3

DSM_E_OVERSIZE

4

DSM_E_NOWRITE

5

DSM_E_RESETWOP＜注意事項＞
・ 読み書き用にオープンしたリングバッファのみ、書き込みできます。
・ 性能の低下を避けるため、リングバッファへの書き込みの排他制御は行いません。
・ size は 8 バイトの倍数以外を指定すると性能低下の要因になります。

19

（３）Dsm_WinReadRb＜名前＞Dsm_WinReadRb － データ共有リングバッファからの最新データ読み込み

＜形

式＞
int

Dsm_WinReadRb(hBuff, &pData)

DSM_RB_HANDLE

hBuff;

unsigned char*pData;＜機能説明＞
Dsm_WinReadRb は 、 デ ー タ 共 有 リ ン グ バ ッ フ ァ の 最 新 デ ー タ を 読 み 込 む 関 数 で す 。
Dsm_WinReadRb では、未読や既読の管理は行いません。常に最新のデータを読み込み対象とします。
データの読み込みサイズは、リングバッファのブロックサイズ固定です。

：Dsm_WinOpenRb 関数でオープンした、データ共有リングバッファのハンドルを指hBuff

定してください。
*pData：読み込みデータの格納先の先頭アドレスを指定してください。読み込みデータの格
納先エリアとして、リングバッファのブロックサイズ以上を用意してください。

＜診断＞
Dsm_WinReadRb は、処理が正常終了すると読み込んだデータの個数である 1 を返し、異常終了す

ると負の値を返します。書き込み関数による書き込みが一度も無い場合は、0 が返ります。最新デー
タの読み込み中に書き込み関数で読み込みデータが上書きされた場合、異常終了します。

エラーコードNo.
1

DSM_E_ARG

2

DSM_W_STOP

3

DSM_E_OVERWRITE＜注意事項＞・ 性能の低下を避けるため、リングバッファからの読み込みの排他制御は行いません。
・ Dsm_WinOpenRb の引数 blksz にブロックサイズが返りますので、データの格納先のエリアサイズとして使用してください。
・ エリアサイズが不足している場合、プログラムエラーやデータ破壊が発生します。

20

（４）Dsm_WinMReadRb＜名前＞Dsm_WinMReadRb － データ共有リングバッファからの未読データ読み込み

＜形

式＞
int

Dsm_WinMReadRb(hBuff, num ,&pData, &onSkip)

DSM_RB_HANDLE

hBuff;

unsigned int

num;

unsigned char*pData;unsigned int*onSkip;＜機能説明＞
Dsm_WinMReadRb は、データ共有リングバッファの時系列データ群を、最新から指定した個数分の中で未読データのみを全て読み込みます。読み込んだデータは既読データとなり、
Dsm_WinMReadRb の読み込み対象から外れます。未読と既読は、リングバッファのハンドル毎に管理します。データの読み込み最大サイズは「リングバッファのブロックサイズ × num で指定した個数」です。

hBuff：Dsm_WinOpenRb 関数でオープンした、データ共有リングバッファのハンドルを指定してください。

num：読み込み対象とするデータの個数(1～ブロック数)を指定してください。

*pData：読み込みデータの格納先の先頭アドレスを指定してください。読み込みデータの格
納先エリアとして、リングバッファのブロックサイズ以上を用意してください。読
み込んだデータは、最古から最新の順番に格納します。

*onSkip：データ連続確認フラグの格納先の先頭アドレスを指定してください。データ連続確
認フラグの格納先として「unsigned int」のサイズ以上を用意してください。未読データの読み込みが正常終了した時、前回の Dsm_WinMReadRb で読み込んだデータとの連続性の判定結果を返します。同一リングバッファのハンドルに対してのみ有効な判定です。
0：前回の読み込みデータに対して、今回の読み込みデータは連続しています。
1：前回の読み込みデータに対して、今回の読み込みデータは連続していません。

21

＜診

断＞
Dsm_WinMReadRb は、処理が正常終了すると読み込んだデータの個数を返し、異常終了すると負の値を返します。書き込み関数による書き込みが一度も無い場合、または未読データが無い場合は 0が返ります。最新データの読み込み中に書き込み関数でいずれかの読み込みデータが上書きされた
場合、異常終了します。

エラーコードNo.
1

DSM_E_ARG

2

DSM_W_STOP

3

DSM_E_OVERBLOCK

4

DSM_E_OVERWRITE＜注意事項＞・ 性能の低下を避けるため、リングバッファからの読み込みの排他制御は行いません。
・ Dsm_WinOpenRb の引数 blksz にブロックサイズが返りますので、データの格納先のエリアサイズとして使用してください。
・ エリアサイズが不足している場合、プログラムエラーやデータ破壊が発生します。
・ Dsm_WinMReadRb 発行後に Dsm_WinReadRb を発行しても、データの未読状態と既読状態は変化しません。

＜ご参考：num、ブロック数のチューニング＞
num に指定する個数は、リングバッファのブロック数より小さい値を指定してください。例えば、
ブロック数が 16 の時、num も 16 にすると、最新から 16 個目のブロックは常に書き込み対象になるため、読み込み対象のデータが上書きされ Dsm_WinMReadRb が異常終了となり読み込みできません。
16 個目を読む場合は、書き込み側プログラムを停止してください。num および ブロック数は、プ
ログラムの処理、実行環境を考慮した上で調整してください。

22

（５）Dsm_WinCloseRb

＜名

前＞

＜形

式＞

Dsm_WinCloseRb － データ共有リングバッファのクローズ

int

Dsm_WinCloseRb(hBuff)

DSM_RB_HANDLE

hBuff;＜機能説明＞
Dsm_WinCloseRb は、オープン中のデータ共有リングバッファをクローズする関数です。

：Dsm_WinOpenRb 関数でオープンした、データ共有リングバッファのハンドルを指hBuff

定してください。

＜診断＞

Dsm_WinCloseRb は、処理が正常終了すると 0 を返し、異常終了すると負の値を返します。

No.
1

エラーコードDSM_E_ARG＜注意事項＞
・ リングバッファを読み書き用でオープンしているプログラムが異常終了、もしくは強制終了させた場合、対象のリングバッファを読み書き用でオープンできなくなる場合があります。その場合は、[Dsm_WinResetWOpenRb]API、または[dsmresetwop]コマンドで読み書き用オープン状態をリセットしてください。
・ プログラムが正常に終了する場合、Dsm_WinCloseRb を発行しなくても Dsm_WinOpenRb で確保したリソースはプログラムの終了時に自動的に解放します。

23

（６）Dsm_WinResetWOpenRb＜名前＞

Dsm_WinResetWOpenRb － データ共有リングバッファの読み書きオープン状態を
リセット

＜形

式＞

int

Dsm_WinResetWOpenRb(buffname)char*buffname;＜機能説明＞
Dsm_WinResetWOpenRb は、指定したデータ共有リングバッファの読み書きオープン状態をリセットする関数です。読み書きオープンしていた処理が異常終了し、読み書きオープンができなくなった場合に使用します。

*buffname ：読み書きオープン状態をリセットするリングバッファの名称を指定してください。

＜診断＞

Dsm_WinResetWOpenRb は、処理が正常終了すると 0 を返し、異常終了すると負の値を返します。

エラーコードNo.
1

DSM_E_ARG

2

DSM_W_INIT

3

DSM_E_MGROPEN

4

DSM_W_STOP

5

DSM_E_RBNAME＜注意事項＞・ API の誤動作の原因になるため、正常に動作している状態では使用しないでください。

24

5.2. Windows®側 API エラーコード
API の関数が返すエラーコードの一覧を表 3 に示します。

表3
No.

エラーコード値

1
DSM_W_INIT

Windows®側 API エラーコード一覧

-1

内容

対処方法

デーモンによる初期化がプログラムの起動順序を見直し、リ

終わっていません。

トライしてください。
引数を確認し、プログラムを見直し

2
DSM_E_ARG-2

引数の設定が異常です。

てください。プログラムの修正を実施の上、再立ち上げしてください。

3
DSM_E_WINAPI-34

WINAPI のエラーによる

logsave コマンドで RAS 情報を収集し内部異常です。

て、製品責任元に連絡してください。

既に読み書き用にリング
DSM_E_EXTWRTOPN -4

バッファがオープンされ
ています。

5
-5

6
DSM_W_STOP-6

7

む権限を持っていません。

-7

プンした処理のクローズ漏れがない

読み込み用でオープンしたリングバ
ッファに書き込みをしていないか確認してください。

デーモンが停止していま処理を停止し、リングバッファをクす。(停止処理中も含む)

ローズしてください。

メモリの割り当て失敗に
DSM_E_RBMALLOC

読み書き用にリングバッファをオーか確認してください。

リングバッファに書き込
DSM_E_NOWRITE

他のリングバッファを使用するか、よる異常です。

空きメモリが確保されているか確認
し、空きメモリがない場合は確保してください。
空きメモリが確保されているか確認

8

DSM_E_MGROPEN-8

バッファ管理テーブルのし、空きメモリがない場合は確保しオープン失敗による異常てください。解決しない場合は、です。

logsave コマンドで RAS 情報を収集して、製品責任元に連絡してください。
空きメモリが確保されているか確認

9
リングバッファのオープ
DSM_E_RBOPEN-9

ン失敗による異常です。

し、空きメモリがない場合は確保してください。解決しない場合は、
logsave コマンドで RAS 情報を収集して、製品責任元に連絡してください。

25

10

リングバッファ名称の取DSM_E_RBNAME-10

得失敗による異常です。

取得対象とするリングバッファ名称が異なっていないか、引数を確認してください。

書き込みサイズが、0 また

11
DSM_E_OVERSIZE-11は 1 ブロックサイズより引数に設定しているサイズを確認し大きいサイズで指定されてください。

ています。
指定ブロック数が 0 また

12
DSM_E_OVERBLOCK -12は最大ブロック数を超えて指定されています。

引数に設定しているブロック数を確認してください。
リングバッファの最大ブロック数や

13
DSM_E_OVERWRITE-13

データの読み込み中に上ブロックサイズ または データの読書きされています。

み書きタイミングを見直してください。

読み込み専用のリングバ

14

ッファを読み書き用にオ
DSM_E_READONLY-14

ープンしようとしています。

リングバッファの書込可能プログラ
ム種別が「Windows」以外になっていないか、定義を見直してください。
開発ツールで構造体を変更した後15に、構造体を使用するプログラムがDSM_E_UNMATCHH-15
ASH

ハッシュコードが不一致

再コンパイルされているか確認してです。

ください。また、変更した後にデーモンを再起動しているか確認してください。
dsmresetwop コ マ ン ド 、 ま た は

16

DsmWinResetWOpenRb API で読み書
DSM_E_RESETWOP-16

読み書きオープン状態がきオープン状態がリセットされていリセットされています。

ます。
再度読み書き用でオープンしてから書き込みしてください。

26

第6章 CODESYS®側 API 仕様
RT-DSM の CODESYS®側の API 仕様を以下に記載します。

【CODESYS®側 API 一覧】
データ共有リングバッファへアクセスするための CODESYS®側 API 一覧を表 4 に示します。

表4
No.

CODESYS®側 API 一覧

関数名

説明

参照項

1

Dsm_CdsysOpenRb

データ共有リングバッファのオープン

6.1(1)

2

Dsm_CdsysWriteRb

データ共有リングバッファへのデータ書き込み

6.1(2)

3

Dsm_CdsysReadRb

データ共有リングバッファからの最新データ読み込み

6.1(3)

4

Dsm_CdsysCloseRb

データ共有リングバッファのクローズ

6.1(4)

データ共有リングバッファの読み書きオープン状態を6.1(5)

5
Dsm_CdsysResetWOpenRb

リセット【CODESYS®側 API 仕様】
CODESYS®側 API の仕様一覧を表 5 に示します。

表5
No.

CODESYS®側 API の仕様

項目

内容

1

API の提供形態

CODESYS®アプリケーション開発用ライブラリとして提供

2

エンディアン

リトルエンディアン
ただし、リングバッファに格納するデータ群のエンディアンは書き込みプログラムに依存します。また、外部接続機器(例：FL-net 接続機器)等が作成するデータについては、外部接続機器の仕様等に依存します。

3構造体のアライメント 8 バイトアライメント
リングバッファ定義ファイルは、予めアライメントを意識した開発ツー
ルを用いて作成してください。

27

6.1. CODESYS®側 API リファレンス（１）Dsm_CdsysOpenRb

＜名

前＞

＜形

式＞

Dsm_CdsysOpenRb － データ共有リングバッファのオープン

DINT

Dsm_CdsysOpenRb(buffname, accesstype, phBuff, pblksz, pblkcase, hashcode)

VAR_INPUT
buffname:

STRING(31);accesstype:

UDINT;

phBuff:

POINTER TO DSM_CD_RB_HANDLE;

pblksz:POINTER TO UDINT;

pblkcase:

POINTER TO UDINT;

hashcode:

UDINT

END_VAR＜機能説明＞
Dsm_CdsysOpenRb は、データ共有リングバッファをオープンする関数です。

buffname：データ共有リングバッファに割り当てた名称を指定してください。書き込み側と読み込み側で、同じリングバッファ名称を指定することでデータを共有できます。リングバッファ名称の長さは最大 31 文字です。31 文字以上を指定した場合、31 文字
までの名称を使用します。名称には英数字、"_"(アンダーバー)、および"-"(ハイフン)を使用できます。指定された名称がリングバッファ定義ファイルの定義内容と不一致の場合は、異常終了します。

accesstype ：読み込み用、または読み書き用のアクセス種別を指定してください。
0：読み込み用
1：読み書き用
phBuff：リングバッファのハンドルアドレスを指定してください。指定したリングバッファのハンドルを格納します。リングバッファの読み込み、書き込み、クローズ時にそれぞれの関数に渡してください。

pblksz：リングバッファのブロックサイズを返す変数のアドレスを指定してください。pblksz
が示す変数にブロックサイズが返ります。8 バイトアラインのサイズになります。

pblkcase：リングバッファのブロック数を返す変数のアドレスを指定してください。pblkcase
が示す変数にブロック数が返ります。2 のべき乗で切り上げた数になります。

28hashcode:オープンするリングバッファのハッシュコードを指定してください。ハッシュコード
は、開発ツールが構造体の情報を基に ST 言語ソースファイルに出力します。出力フォーマットは下記のとおりです。
”TYPE xxx : STRUCT ・・・” (xxx はリングバッファ名称)”VAR CONSTANT ・・・ xxx_HASH : UDINT := 16#yyy; END_VAR”(xxx はリングバッファ名称、yyy はハッシュコード)指定したハッシュコードとリングバッファ定義ファイルの定義内容が異なる場
合は異常終了します。

＜診断＞
Dsm_CdsysOpenRb は、処理が正常終了すると 0 を返し、異常終了すると負の値を返します。
エラーコードNo.
1

DSM_E_ARG

2

DSM_W_INIT

3

DSM_W_STOP

4

DSM_E_RBMALLOC

5

DSM_E_MGROPEN

6

DSM_E_RBOPEN

7

DSM_E_RBNAME

8

DSM_E_READONLY

9

DSM_E_UNMATCHHASH

10

DSM_E_WRONGVAL

11

DSM_E_SEMERROR＜注意事項＞
・ 読み書き用リングバッファのオープンは、１つのリングバッファにつき 1 つのタスクのみが実行可能です。既に読み書き用でリングバッファがオープンされている場合、その後の読み書き用のリングバッファオープンは失敗します。
・ あるタスクが読み書き属性でオープンした際、取得したハンドルを他タスクで使用しリングバッ
ファの読み書き等を行った場合、その動作は保証されません。
・ リングバッファの書込可能プログラム種別が「CODESYS」以外の場合、アクセス種別に読み書き用を指定したリングバッファのオープンは失敗します。
・ 既に読み込み用でオープンしているリングバッファに再度読み込み用オープンを発行した場合、異常終了せずにリングバッファのハンドルを新しく確保します。
・リングバッファのオープンは、読み書きの場合約 10ms、読み込みの場合約 0.5ms の時間がかかります（複数タスクから同時に使用すると＋αの時間になります）。そのため、同じタスク内でEtherCAT の制御を行っている場合、同期ズレの原因となる可能性があります。その場合、EtherCAT
タスクより実行優先度の低い別のタスクで、リングバッファのオープンを行うといった対応を推
奨します。

29

（２）Dsm_CdsysWriteRb
＜名

前＞

＜形

式＞

Dsm_CdsysWriteRb － データ共有リングバッファへのデータ書き込み

DINT

Dsm_CdsysWriteRb(hBuff, pData, size)

VAR_INPUT
hBuff:

DSM_CD_RB_HANDLE;

pData:

POINTER TO BYTE;

size:__UXINT;

END_VAR＜機能説明＞
Dsm_CdsysWriteRb は、データ共有リングバッファにデータを書き込む関数です。
：Dsm_CdsysOpenRb 関数でオープンした、データ共有リングバッファのハンドルを指hBuff

定してください。
：書き込むデータの先頭アドレスを指定してください。書き込むデータのエリアとし

pDataて、書き込みサイズ以上を用意してください。
：書き込むデータのサイズ(バイト)を指定してください。1 ブロックのサイズより大きsize

い値を指定した場合は、異常終了します。

＜診断＞
Dsm_CdsysWriteRb は、処理が正常終了すると書き込んだデータの個数である 1 を返し、異常終了

すると負の値を返します。

エラーコードNo.
1

DSM_E_ARG

2

DSM_W_INIT

3

DSM_W_STOP

4

DSM_E_OVERSIZE

5

DSM_E_NOWRITE

6

DSM_E_WRONGVAL＜注意事項＞
・ 読み書き用にオープンしたリングバッファのみ、書き込みできます。
・ 性能の低下を避けるため、リングバッファへの書き込みの排他制御は行いません。
・ size は 8 バイトの倍数以外を指定すると性能低下の要因になります。
・ 書き込むデータのサイズは、使用するリングバッファのブロックサイズ以下を指定してください。
書き込むデータのサイズが大きい場合、プログラムエラーやデータ破壊が発生します。

30

（３）Dsm_CdsysReadRb

＜名

前＞

＜形

式＞

Dsm_CdsysReadRb － データ共有リングバッファからの最新データ読み込み

DINT

Dsm_CdsysReadRb(hBuff, pData)

VAR_INPUT
hBuff:

DSM_CD_RB_HANDLE;

pData:

POINTER TO BYTE;

END_VAR＜機能説明＞
Dsm_CdsysReadRb は 、 デ ー タ 共 有 リ ン グ バ ッ フ ァ の 最 新 デ ー タ を 読 み 込 む 関 数 で す 。
Dsm_CdsysReadRb では、未読や既読の管理は行いません。常に最新のデータを読み込み対象とします。データの読み込みサイズは、リングバッファのブロックサイズ固定です。

：Dsm_CdsysOpenRb 関数でオープンした、データ共有リングバッファのハンドルを指hBuff

定してください。
：読み込みデータの格納先の先頭アドレスを指定してください。読み込みデータの格

pData

納先エリアとして、リングバッファのブロックサイズ以上を用意してください。

＜診断＞
Dsm_CdsysReadRb は、処理が正常終了すると読み込んだデータの個数である 1 を返し、異常終了

すると負の値を返します。Dsm_CdsysWriteRb による書き込みが一度も無い場合は 0 が返ります。最新データの読み込み中に書き込み関数で読み込みデータが上書きされた場合、異常終了します。

エラーコードNo.
1

DSM_E_ARG

2

DSM_W_INIT

3

DSM_W_STOP

4

DSM_E_OVERWRITE

5

DSM_E_WRONGVAL＜注意事項＞・ 性能の低下を避けるため、リングバッファからの読み込みの排他制御は行いません。
・ データの格納先のエリアサイズは、使用するリングバッファのブロックサイズ以上を用意してください。エリアサイズが不足している場合、プログラムエラーやデータ破壊が発生します。
Dsm_CdsysOpenRb の引数 pblksz にブロックサイズが返りますので、データの格納先のエリアサイ
ズとして使用してください。

31

（４）Dsm_CdsysCloseRb

＜名

前＞

＜形

式＞

Dsm_CdsysCloseRb － データ共有リングバッファのクローズ

DINT

Dsm_CdsysCloseRb(hBuff)

VAR_INPUT
hBuff:

DSM_CD_RB_HANDLE;

END_VAR＜機能説明＞
Dsm_CdsysCloseRb は、オープン中のデータ共有リングバッファをクローズする関数です。

hBuff：Dsm_CdsysOpenRb 関数でオープンした、データ共有リングバッファのハンドルを指定してください。

＜診断＞
Dsm_WinCloseRb は、処理が正常終了すると 0 を返し、異常終了すると負の値を返します。

エラーコードNo.
1

DSM_E_ARG

2

DSM_E_SYSERROR＜注意事項＞
・ リングバッファを読み書き用でオープンしているプログラムが異常終了、もしくは強制終了させた場合、対象のリングバッファを読み書き用でオープンできなくなる場合があります。その場合は、[Dsm_CdsysResetWOpenRb]API、または[dsmresetwop]コマンドで読み書き用オープン状態をリセットしてください。
・ CODESYS®アプリケーションを終了する際は、Dsm_CdsysCloseRb を発行し、Dsm_CdsysOpenRbで獲得したリソースを解放してください。

32

（５）Dsm_CdsysResetWOpenRb＜名前＞

Dsm_CdsysResetWOpenRb － データ共有リングバッファの読み書きオープン状態を
リセット

＜形

式＞
DINT

Dsm_CdsysResetWOpenRb(Buffname)

VAR_INPUT
Buffname:

STRING(31);

END_VAR＜機能説明＞
Dsm_CdsysResetWOpenRb は、指定したデータ共有リングバッファの読み書きオープン状態をリセットする関数です。読み書きオープンしていた処理が異常終了し、読み書きオープンができなくなった場合に使用します。

Buffname＜診：読み書きオープン状態をリセットするリングバッファの名称を指定してください。

断＞
Dsm_CdsysResetWOpenRb は、処理が正常終了すると 0 を返し、異常終了すると負の値を返します。

エラーコードNo.
1

DSM_W_INIT

2

DSM_W_STOP

3

DSM_E_MGROPEN

4

DSM_E_RBNAME

5

DSM_E_WRONGVAL

6

DSM_E_SYSERROR＜注意事項＞・ API の誤動作の原因になるため、正常に動作している状態では使用しないでください。

33

6.2. CODESYS®側 API エラーコード
API の関数が返すエラーコードの一覧を表 6 に示します。

表6
No.

エラーコード値

1
DSM_W_INIT

CODESYS®側 API エラーコード一覧

-1

内容

対処方法

デーモンによる初期化

プログラムの起動順序を見直し、リトが終わっていません。

ライしてください。
引数を確認し、プログラムを見直して

2
DSM_E_ARG-2

引数の設定が異常です。

ください。プログラムの修正を実施の上、再立ち上げしてください。

3
DSM_E_NOWRITE-5

リングバッファに書き

読み込み用でオープンしたリングバッ

込む権限を持っていま

ファに書き込みをしていないか確認しせん。

てください。

4
デーモンに停 止要求がDSM_W_STOP-6

出ているか、デーモンが停止中です。

5

メモリの 割り当て 失敗
DSM_E_RBMALLOC-7による異常です。

6

入れ替えなどのためにデーモンを停止する要求が出ているか、デーモンが停止中です。処理を停止し、リングバッ
ファをクローズしてください。
空きメモリが確保されているか確認
し、空きメモリがない場合は確保してください。
空きメモリが確保されているか確認

DSM_E_MGROPEN-8

バッファ管理テーブル

し、空きメモリがない場合は確保してのオープン失敗によるください。解決しない場合は、logsave

異常です。

コマンドで RAS 情報を収集して、製品責任元に連絡してください。

7

空きメモリが確保されているか確認

DSM_E_RBOPEN-9

リングバッファのオー

し、空きメモリがない場合は確保してプン失敗による異常でください。解決しない場合は、logsave

す。

コマンドで RAS 情報を収集して、製品責任元に連絡してください。

8

リングバッファ名称のDSM_E_RBNAME-10

取得失敗による異常です。

34

取得対象とするリングバッファ名称が異なっていないか、引数を確認してください。

書き込みサイズが、0 ま

9
DSM_E_OVERSIZE-11

たは 1 ブロックサイズよ引数に設定しているサイズを確認してり大きいサイズで指定ください。

されています。
10

データの読み込み中に
DSM_E_OVERWRITE-13

上書きされています。
読み込み専用のリング

11

バッファを読み書き用
DSM_E_READONLY-14にオープンしようとしています。

リングバッファの最大ブロック数やブロックサイズ または データの読み書
きタイミングを見直してください。
リングバッファの書込可能プログラム
種別が「CODESYS」以外になっていな
いか、定義を見直してください。
開発ツールで構造体を変更した後に、

12
ハッシュコードが 不一

DSM_E_UNMATCHH
-15
ASH

致です。

構造体を使用するプログラムが再コン
パイルされているか確認してください。また、変更した後にデーモンを再起動しているか確認してください。

13
DSM_E_WRONGVAL

-16

14

管理テーブル、リングバ

開発ツールで生成した ini ファイルのッファ管理情報の値が値に、仕様外の値がないか確認してく

不正です。

ださい。

システムエラーが 発生
DSM_E_SYSERROR-17

15
DSM_E_SEMERROR

-18

しました。

タスク管理等の OS の基本機能のエラーですので、OS が正常に動作しているか確認してください。

CODESYS® の セ マ フ ォ

複数タスクが、読み書き属性でリングの獲得解放にかかわるバッファをオープンしていないか確認

エラーが発生しました。

してください。

35

第7章 制限事項
RT-DSM では、処理性能を優先しているためいくつかの制限事項があります。制限事項の一覧を表 7に示します。
表7

制限事項一覧

No.

項目

内容

1

リングバッファアクセス可能

書き込みは、一つのリングバッファに対して一つのスレッド

対象(CODESYS®の場合はタスク)のみアクセスが可能です。読み込
みは、一つのリングバッファに対して複数のスレッドのアクセスが可能です。
同一リングバッファハンドルを複数のスレッドから同時に使用できません。スレッド毎にオープンを実施してリングバッフ
ァハンドルを用意してください。同一リングバッファハンドルに対して複数のスレッドから同時に使用した場合、プログラム
エラーや API のエラーが発生します。

2

読み込み処理停止、または遅延

書き込み処理が周期実行中に、読み込み処理が停止、または遅によるデータ上書き

延すると、リングバッファ内の時系列の古いデータから順に新
しいデータで上書きされる場合があります。

3

書き込み処理停止、または遅延

書き込み処理が停止、または遅延すると、最新データ読み込みによる同一データ読み込み処理が同一データを読み込む場合があります。
シーケンス番号などを使用する側でデータに埋め込み、同一データかどうかを判断する必要があります。

4

ブロック数

ブロック数は、メモリアクセスの効率化から、2 のべき乗に切り上げで調整されます。例えば、「10」を設定した場合、切り上げで「16」に調整されます。

5

1 ブロックのサイズ

1 ブロックのサイズは、メモリアクセスの効率化から、8 バイ
ト境界に合わせて切り上げで調整されます。例えば、「20byte」を設定した場合、切り上げで「24byte」に調整されます。

6

エンディアン変換

リングバッファに対して書き込むデータ群、および読み込むデータ群に対して、エンディアン変換は行いません。

7

パディングの追加・削除

リングバッファに対して書き込むデータ群、および読込むデー
タ群に対してパディングの追加・削除によるアライン補正は行
いません。

8

読み込みデータの構成

読み込みデータは、読み込み処理の性能確保のため、書き込み
データのサイズに依らず、1 ブロックのサイズ分を読み込みます。書き込みデータの指定サイズ以降の領域は、書込対象外であるため不定値のままとなります。
複数のブロックを読み込む場合は、1 ブロックのサイズ×読み込み個数分のサイズを読み込みます。

36

9

リングバッファのアクセス

リングバッファは Windows®のサービス起動時に作成します。

タイミング

このため、Windows®の起動中にアクセスした場合は失敗することがあります。その場合は、アクセスに成功するまでリトライ
してください。

10

予約語について

関数名、変数名、およびリソース名のプレフィックスに以下の名称を使用しないでください。
・「dsm_」
・「DSM_」
・「Dsm_」
API 内部で使用している名称と重複して、コンパイルエラーになる可能性があります。

11

書き込みデータサイズ

書き込むデータのサイズは、使用するリングバッファのブロッ
クサイズ以下を指定してください。書き込むデータのサイズが大きい場合、プログラムエラーやデータ破壊が発生します。

12

読み込みデータエリアサイズ

データの格納先のエリアサイズは、「使用するリングバッファのブロックサイズ×読み込むデータの個数」以上を用意してください。エリアサイズが不足している場合、プログラムエラー
やデータ破壊が発生します。

13

未読データ読み込み

未読データ読み込み処理の未読管理は、書き込み毎にブロックにシーケンス番号を割り当て、読み込みは、前回読み込んだシーケンス番号を覚えて、そのシーケンス番号以降のブロックを読み込む仕組みとしています。
シーケンス番号は有限(1～2,147,483,648)のため、最大値を超える場合は 1 に戻ります。
このため、一度読み込み後に、しばらく書き込みのみ行い、未読のブロック数がシーケンス番号の最大数を超えると、同一のシーケンス番号が出現してしまい、再度読み込もうとした際に正しく読み込めなくなる場合があります。
この場合、読み込み処理でリングバッファを一旦クローズし、再度オープンすることで正しく読み込みができるようになります。

37

第8章 開発ツールとデータ定義ファイル
RT-DSM を使い始める際、最初に必要になるのは「データ定義ファイル」の作成です。データ定義
ファイルには、ユーザーが使用するリングバッファのブロック構造などを記載します。そのデータ定義ファイル作成した後、「開発ツール」を用いて以下の情報に変換します。

・リングバッファ定義ファイル
・Windows®側の C 言語プログラム用ヘッダファイル
・CODESYS®側の IEC プログラム用変数定義ファイル

変換の際、構造体にパディング情報も追加して、構造体の実サイズ(=ブロックサイズ)を自動計算すると共に、Windows®アプリケーションと CODESYS®アプリケーションで構造体内のデータのオフセッ
トが合うようにします。また、データ構造更新時にアプリへの定義反映漏れを防ぐため、上記ファイルにデータ定義を基にしたハッシュ値を出力し、Dsm_WinOpenRb 関数、Dsm_CdsysOpneRb 関数で整合性チェックを行います。
＜記載例＞[Buffer]
BufferNum=1

ユーザーがシステムで1つ作成

データ定義ファイル(.defファイル)[RingBuffer1]
BlockNum=10
BuffName=FLNET
WritableProgType=CODESYS
Member1_Type=short int
Member1_Name=aMember2_Type=long
Member2_Name=b

各リングバッファに割り当てるデータモデルを
構造体メンバを列記して記述

変換

開発ツール
１構造体に対し、
ヘッダファイルを1つ生成システムで1つ生成リングバッファ
定義ファイル（.iniファイル）
起動時readデーモン:[RingBuffer1]
BlockNum=16
BuffName=FLNET
WritableProgType=CODESYS
Hash=0xC7911B94
BlockSize=8

C言語
プログラム用
ヘッダファイル（.hファイル）
includestruct FLNET{
short int a;char _pad1[2];long b;};#define RB_FLNET“FLNET”;#define FLNET_HASH
0xC7911B94;

Windows
アプリ

図 17

システムで1つ生成IECプログラム用
変数定義(.txtファイル)
cut & paste

CODESYS
アプリ

開発ツールの概要

38

TYPE FLNET:STRUCTa : INT;_pad1 : ARRAY [1..2] OF USINT ;b : DINT;END_STRUCTEND_TYPE;VAR CONSTANT
RB_FLNET : STRING[31] :='FLNET';FLNET_HASH : UDINT :=16#C7911B94;
END_VAR

8.1. リファレンス
開発ツールの使い方を以下に示します。

defconv [入力ファイル名] [出力ファイルのパス][入力ファイル名]：データ定義ファイル(.def)の格納パスとファイル名を指定します。

[出力ファイルのパス]：defconv が出力するファイルの格納先を指定します。
指定されたパスには、生成した次のファイルを格納します。
・リングバッファ定義ファイル(.ini)
・C 言語プログラム用ヘッダファイル(.h)
・IEC プログラム用変数定義ファイル(.txt)※1 パラメータが省略された場合、プログラムのバージョンとヘルプを表示します。
※2 出力パスを省略した場合、データ定義ファイルが存在するパスが出力先になります。

開発ツールが表示するエラーコードは次の通りです。

表8
No.

defconv コマンドエラーコード一覧

エラーコード

値

内容

対処方法

システムエラー

-1

OS の基本機能が動作していません。

Windows® の動作環境に問題がな
いか確認してください。

入力ファイルエラー-2

データ定義ファイルが開けません。

指定した[入力ファイル名]に、データ定義ファイルが格納されているか確認してください。

出力ファイルエラー-3

生成したファイルが指定先に書き込めません。

指定した[出力ファイルのパス]のファイルが書き込める状態か、あるいは、容量に空きがあるか確認
してください。

定義誤り-4

データ定義ファイルの定義
内容が誤っているか、不足しています。

データ定義ファイルの定義内容に誤りがないか確認してください。

設定値エラー-5

データ定義ファイルに設定した値が許されない値です。

データ定義ファイルの定義値が仕様範囲内か確認してください。

データ型エラー-6

指定されたデータ型がサポートされていません。

データ定義ファイルの構造体メン
バで指定したデータ型が仕様で規定された型か確認してください。

パラメータエラー-7

パラメータが不正です。

コマンドラインパラメータの指定内容を確認してください。

1

2

3

4

5

6

7

39

8.2. データ定義ファイル定義項目
以下にデータ定義ファイルの設定項目一覧を示します。

表9

データ定義ファイル設定項目一覧

No.

セクション名1

BufferBufferNum

リングバッファ
の数

1

1～256

必須

2

RingBufferN(N=1-256)(*1) (*2)

BlockNum

リングバッファのブロック数128

2～32768

必須

BuffName

バッファ名称1

英数字、"_"、"-"
31 文字まで

必須

4

WritableProg
Type

書込可能プログ
ラム種別

Windows

Windows、
CODESYS

必須

5

MemberM_Type(M=1-2048)

構造体の M 番目
メンバの型

NULL

表 10 規定のキーワ
ード

必須

6

MemberM_Name(M=1-2048)

構造体の M 番目のメンバの名称

NULL

英数字、"_"、"[]"必須
配列は 2 次元まで。
配列数は数字、または DefineX_Name で定義した文字列。

7

DefineX_Name(X=1-4096)

MenberM_Nameの配列数として指定可能な
define 定義文字
列

NULL

英数字、"_"
ただし、数字のみは
不可

任意

8

DefineX_Value(X=1-4096)

DefineX_Name に対応する数値

NULL

正の整数

任意

3

項目名(KEY)

説明

初期値(*1) リングバッファの数だけ定義します。
(*2) 構造体のサイズは、100KB 以内にする必要があります。

40

範囲

要否

8.3. 構造体メンバとして記述できるデータ型
データ定義ファイルで使用可能なデータ型と、それに対し、開発ツールが出力する C 言語プログラ
ム用ヘッダファイルと、IEC プログラム用変数定義ファイルで使用されるデータ型の対応関係を表 10に示します。

表 10

使用可能なデータ型一覧

C 言語プログラム用

IEC プログラム用

ヘッダファイル

変数定義ファイル

No.

データ定義ファイル

備考

1

unsigned char

unsigned char

USINT

符号なし 1byte 整数型

2

char

char

SINT

符号つき 1byte 整数型

3unsigned short int

unsigned short int

UINT

符号なし 2byte 整数型

4short int

short int

INT

符号つき 2byte 整数型

5unsigned int

unsigned long

UDINT

符号なし 4byte 整数型

6

int

long

DINT

符号つき 4byte 整数型

7unsigned longunsigned long

UDINT

符号なし 4byte 整数型

8

long

long

DINT

符号つき 4byte 整数型

9unsigned long longunsigned long long

ULINT

符号なし 8byte 整数型

10long long

long long

LINT

符号つき 8byte 整数型

float

float

REAL

単精度浮動小数点型

11(32bit)
倍精度浮動小数点型

12
doubledoubleLREAL(64bit)13

stringchar

STRING(*1)

文字列型(配列のみ)(*1) 文字型配列に関しては、IEC プログラムでは文字列のサイトに EOT が 1 バイト追加されるため、
1 文字少ない配列の文字型に変換します。

41

8.4. C 言語プログラム用ヘッダファイル出力仕様
C 言語プログラム用ヘッダファイルは、データ定義ファイルを開発ツールに読み込ませることで自動生成されます。データ定義ファイルに定義された、複数の RingBuffer それぞれに１つのヘッダファ
イルを生成します。

生成されるヘッダファイルのファイル名は、”RingBuffer_”+BuffName+”.h”とします。
(例) BuffName=“FLNET”であれば、ファイル名は“RingBuffer_FLNET.h“

ヘッダファイルには、次のデータが定義されます。

(1) RingBuffer に割り当てて定義される C 言語形式の構造体
・ 構造体の名称は、BuffName になります。
・ 構造体には M の値が若い順に、メンバ名が MemberM_Name、その型が MemberM_Type の構造
体メンバを生成します。
・ MemberM_Name において、メンバ名に[(配列数)] または [(配列数 1)][(配列数 2)]で配列を記述すると、構造体メンバとして MemberM_Type で指定された型の配列を生成します。

(2) データ定義ファイルで定義されたリングバッファ名・リングバッファ名は、“RB_”＋“（リングバッファ名）”の定数として定義されます。

(3) データ定義ファイルで定義されたリングバッファのハッシュ値
・リングバッファのハッシュ値は、“（リングバッファ名）”＋“_HASH”の定数として定義されます。

42

8.5. IEC プログラム用変数定義ファイルの出力仕様
IEC プログラム用変数定義ファイルは、データ定義ファイルを開発ツールに読み込ませることで自動生成されます。データ定義ファイルに定義された、複数の RingBuffer に対応する構造体を記述した
変数定義ファイルを生成します。

生成される IEC プログラム用変数定義ファイルのファイル名は、入力ファイル名を継承します。
(例) データ定義ファイルが sys1.def であれば、IEC プログラム用変数定義ファイル名は sys1.txt

IEC プログラム用変数定義ファイルには、次のデータが定義されます。

(1) IEC 61131-3 規格形式の構造体定義
・構造体の名称は、BuffName になります。
・M の値が若い順に、メンバ名が MemberM_Name、その型が MemberM_Type の構造体メンバを生成します。
・MemberM_Name において、メンバ名に[(配列数)] または [(配列数 1)][(配列数 2)]で配列を記述すると、構造体メンバとして MemberM_Type で指定された型の配列を生成します。

(2) データ定義ファイルで定義されたリングバッファ名・リングバッファ名は、“RB_”＋“（リングバッファ名）”の定数として定義されます。

(3) データ定義ファイルで定義されたリングバッファのハッシュ値
・リングバッファのハッシュ値は、“（リングバッファ名）”＋“_HASH”の定数として定義されます。

43

8.6. データ定義ファイルサンプル＜記載例＞;Caution!! Don't delete this message.
[Buffer]
BufferNum=2[RingBuffer1]
BlockNum=10 (←任意の整数値を記述可能)
BuffName=FLNET
WritableProgType=CODESYS
Member1_Type=int
Member1_Name=aMember2_Type=long(←リングバッファに割り当てる構造体メンバを列記)

Member2_Name=b[RingBuffer2]
BlockNum=32
BuffName=LOGDATA
WritableProgType=Windows
Define1_Name=MESS_LEN
Define1_Value=32(←リングバッファの配列数用の定数を定義可能)

Member1_Type=int
Member1_Name=c
Member2_Type=long long
Member2_Name=d[4] (←構造体メンバに配列も記述可能)
Member3_Type=char
Member3_Name=e[100][MESS_LEN] (←2 次元配列も記述可能、配列数の定数定義も利用可能)

44

第9章 コマンドリファレンス
RT-DSM が提供する各種コマンドの一覧を示します。

表 11
No.

コマンド名

1

dsmconf

2
3

コマンドリファレンス一覧
説明参照項

備考(*1)

データ共有リングバッファの定義情報を表示

9.(1)

○

dsmconfchk

データ共有リングバッファの定義ファイルの文法チェック

9.(2)

●

dsmresetwop

データ共有リングバッファの読み書きオープン状態をリセット

9.(3)

○

(*1) コマンド実行時、RT-DSM の動作状態により結果が以下となります。
○：RT-DSM が停止していた場合、エラーメッセージを出力します。
●：RT-DSM が停止していても、エラーになりません。

＜各コマンドの実行権限について＞
上記コマンドを実行する場合、Administrator 権限を持つアカウントでログオンしてください。
Administrator 権限以外でコマンドを実行した場合、下記のエラーメッセージが表示されます。

表 12
No.
1

コマンド実行権限エラーメッセージ

エラーメッセージ

説明This command needs to be executed as Administrator.

45

Administrator で実行してください。

（１）dsmconf コマンド＜名前＞ dsmconf － データ共有リングバッファの定義情報を表示＜形式＞ dsmconf＜機能説明＞
dsmconf コマンドは、データ共有リングバッファの定義情報を表示します。

＜診断＞
操作が正常に終了した場合、終了コードは 0 となります。操作が正常に完了しなかった場合、終了コードは 0 以外の値となります。

＜表示フォーマット＞# dsmconf <Enter>[Buffer]Number of buffers

2

Prefix of shared memory name

Global¥Hitachi_Windows_CODESYS_shared_buffer[Ring buffer][Buffer name][Number of blocks][Block size][Writable program type]

FLNET

16

8

CODESYSLOGDATA

32

3240

Windows

表示項目について、以下に詳細を示します。

表 13
表示項目

No.
1

dsmconf 表示項目

Buffer2

説明

Number of buffer

データ共有リングバッファの数

Prefix of shared memory name

データ共有リングバッファの共有メモリ名プレフィックス

Buffer name

バッファ名称

4

Number of blocks

ブロック数

5

Block size

1 ブロックのサイズ

6

Writable program type

書込可能プログラム種別

3

Ring Buffer

46

表 14
No.
1

dsmconf コマンドエラー一覧

エラーメッセージ

説明

対処方法

HX-DSM Manager is not データ共有リングバッファ管理サ データ共有リングバッファ管理
running.

ービスが起動されていません。

サービスを起動してからコマンドを実行してください。

2

DSM_DIR is not setting.

環 境 変 数 [DSM_DIR] が 設 定 さ れ 環境変数が変更されています。
ていません。

3

再インストールしてください。

[ フ ァ イ ル パ ス 名 ] is not[ファイルパス名]のファイルが見 動作に必要なファイルが見つか

found.

つかりません。

りません。
再インストールしてください。

4

Internal error. (詳細情報)

内部処理で異常が発生しました。 ① 起動中の空きメモリが充分に確保されているか確認してください。空きメモリがない場合は確保してください。
② ①で解決しない場合は、障害情報を収集の上、弊社のサポートへ問合せください。

47

（２）dsmconfchk コマンド＜名前＞ dsmconfchk － リングバッファ定義ファイルの文法チェック＜形

式＞ dsmconfchk＜機能説明＞
dsmconfchk コマンドは、リングバッファ定義ファイルの文法チェックを行います。

＜表示フォーマット＞# dsmconfchk <Enter>
HX-DSM Configuration checker start.....
（異常があった場合、診断に示す内容を表示します。）
HX-DSM Configuration checker end.....

＜診断＞
定義チェックが正常に終了した場合、終了コードは 0 となります。定義チェックが正常に完了しなかった場合、終了コードは 0 以外の値となります。

＜注意事項＞
定義の文法に誤りがなければ、次回データ共有リングバッファ管理サービス立ち上げ時に新しい定義内容を反映します。

48

表 15

dsmconfchk コマンドエラー一覧

No.

メッセージ

内容

対処方法

1

The configuration file is not

リングバッファ定義ファイルが見 リングバッファ定義ファイル作

found. ([path])

つかりません。

成後、再実行してください。

[path]:リングバッファ定義ファイ
ルのファイルパス
2

A mandatory-key is not

必須定義項目が定義されていませ 必須定義項目を定義して、再実

defined.

ん。

(section=[section],key=[key])[section]:セクション名

行してください。

[key]:項目名
3

4

5

A configured syntax was is値の定義に誤りがあります。

数値の範囲外、文字数の最大長wrong.(section=[section],key= [section]:セクション名

超過、禁則文字の使用がないか、[key],val=[val])[key]:項目名

値の定義を見直して修正後に、[val]:値

再実行してください。

DSM_DIR is not setting.

環 境 変 数 [DSM_DIR] が 設 定 さ れ 環境変数が変更されています。
ていません。

再インストールしてください。

DSM_DIR directory is not

環境変数[DSM_DIR]に設定され環境変数が変更されています。

found. ([path])ているパスが見つかりません。

再インストールしてください。

[path]:環境変数[DSM_DIR]に設定されているパス名
6

Not enough number of

リングバッファ数の定義に対して リングバッファ数、または'RingBuffer[n]''RingBuffer[n]'セクションの定義'RingBuffer[n]'セクションの定義

definition.(BufferNum=[num], が不足しています。

数を見直して修正後に、再実行

Number of 'RingBuffer[n]'[num]:リングバッファ数

してください。

definition=[val])[val]:'RingBuffer[n]'セクションの定義数

7[ファイルパス名] is not[ファイルパス名]のファイルが見 動作に必要なファイルが見つか

found.

つかりません。

りません。
再インストールしてください。

8

BuffName is multi-defined.

バッファ名称が重複しています。 バッファ名称が重複しないよう(BuffName=[buffname],[buffname]:バッファ名称

section=[section])[section]:セクション名

49に修正してください。

（３）dsmresetwop コマンド＜名

前＞dsmresetwop － データ共有リングバッファの読み書きオープン状態をリセット＜形

式＞

dsmresetwop -all | -n buffname＜機能説明＞
dsmresetwop コマンドは、指定したデータ共有リングバッファの読み書きオープン状態をリセットします。読み書きオープンしていた処理が異常終了し、読み書きオープンができなくなった場合に使用します。指定可能なオプションを以下に示します。

-all：全てのデータ共有リングバッファの読み書きオープン状態をリセットします。

-n buffname：buffname に指定したバッファ名称のデータ共有リングバッファの読み書き
オープン状態をリセットします。

＜表示フォーマット＞# dsmresetwop -all <Enter>
Reset OK.

＜診断＞
操作が正常に終了した場合、終了コードは 0 となります。操作が正常に完了しなかった場合、終了コードは 0 以外の値となります。

＜注意事項＞API の誤動作の原因になるため、正常に動作している状態では使用しないでください。

50

表 16

dsmresetwop コマンドエラー一覧

No.

エラーメッセージ

説明

対処方法

1

The parameter is incorrect.

コマンドに無効なオプシ オプションを見直してください。

Usage: dsmresetwop -all | -n

ョンを指定しています。

buffname2

HX-DSM Manager is not running.

データ共有リングバッフ データ共有リングバッファ管理サ
ァ管理サービスが起動さ ービスを起動してからコマンドをれていません。

3

4

Buffer name is not found.([バッフ指定されたバッファ名称 バッファ名称を見直してください。

ァ名称])は見つかりません。

DSM_DIR is not setting.

環境変数[DSM_DIR]が設 環境変数が変更されています。
定されていません。

5

実行してください。

[ファイルパス名] is not found.

再インストールしてください。

[ファイルパス名]のファ 動作に必要なファイルが見つかり
イルが見つかりません。

ません。
再インストールしてください。

6

Internal error. (詳細情報)

内部処理で異常が発生し ① 起動中の空きメモリが充分に確ました。

保されているか確認してください。
空きメモリがない場合は確保してください。
② ①で解決しない場合は、障害情報を収集の上、弊社のサポートへ問合せください。

51

第10章 サンプルプログラム
RT-DSM を使用したサンプルプログラムを以下に示します。
＜概要＞
CODESYS®アプリケーションから、一定周期でカウントアップした値（ULINT 型）をデータ共
有リングバッファに書き込みます。その値を Windows®上のアプリケーション（コマンド）から
Dsm_WinMReadRb 関数を用いて未読データ（最大 1024 個）を読み込み、内容表示するサンプルです。
※ Dsm_WinMReadRb 関数によるデータの読み込みと内容表示は、2 回実施します。初回は最大1024 個の未読データを読み込んで表示し、1 秒後に 2 回目を実施するため、その間に書き込
まれた未読データを表示することになります。

＜構成＞
サンプルプログラムの構成を以下に示します。
項目

No.

説明

1

buffer.def

サンプルプログラム用データ定義ファイル

2

buffer.ini

dsmconf コマンドに buffer.def を読み込ませて自動生成される
リングバッファ定義ファイル

3

buffer.txt

No.2 と併せて生成される IEC プログラム用変数定義ファイル

4

RingBuffer_sample_data.hNo.2 と併せて生成される C 言語プログラム用ヘッダファイル

5

CODESYS_sample

CODESYS®側からデータ共有リングバッファにデータを書き込
むサンプルプログラム(ST 言語)

6

Windows_sample

CODESYS®側から共有データ共有リングバッファに書き込まれたデータを読み込んで表示する C 言語サンプルプログラム＜詳細内容＞
サンプルプログラムの内容を示します。

【buffer.def】;Caution!! Don't delete this message.
[Buffer]
BufferNum=1[RingBuffer1]
BlockNum=8192
BuffName=sample_data
WritableProgType=CODESYS
Member1_Type=unsigned long long
Member1_Name=count52【buffer.ini（buffer.def を開発ツールに読み込ませて自動生成）】;Caution!! Don't delete this message.
[Buffer]
BufferNum=1
NamePrefix=Global¥Hitachi_Windows_CODESYS_shared_buffer[RingBuffer1]
BlockNum=8192
BuffName=sample_data
WritableProgType=CODESYS
Hash=0xD409FE2B
BlockSize=8【buffer.txt（buffer.def を開発ツールに読み込ませて自動生成）】// Structure definition for ring buffer : sample_data
TYPE sample_data:
STRUCT
count : ULINT;END_STRUCTEND_TYPE;CODESYS®開発環境で“DUT”として追加。

VAR CONSTANT// Name definition for ring buffer :sample_data
RB_sample_data : STRING[31] := 'sample_data' ;CODESYS®開発環境で“PLC_PRG(PRG)”の// Hash value definition for ring buffer :sample_data
sample_data_HASH : UDINT := 16#D409FE2B ;変数宣言部の最後に追加。

END_VAR【RingBuffer_sample_data.h（buffer.def を開発ツールに読み込ませて自動生成）】// Structure definition for ring buffer : sample_data
struct sample_data{
unsigned long long count;};// Name definition for ring buffer : sample_data#defineRB_sample_data"sample_data"// Hash value definition for ring buffer : sample_data#definesample_data_HASH 0xD409FE2B

53

【CODESYS_sample】【変数宣言部】
PROGRAM PLC_PRG
VAR
hBuff : DSM_CD_RB_HANDLE := 0;
blksz: UDINT;
blkcase: UDINT;
input_data: sample_data;
input_size: UDINT := SIZEOF(INPUT_DATA);
result : DINT ;RB_OPCL_Flag : BOOL := TRUE;
END_VAR
VAR CONSTANT// Name definition for ring buffer :sample_data
RB_sample_data : STRING[31] := 'sample_data' ;// Hash value definition for ring buffer :sample_data
sample_data_HASH : UDINT := 16#D409FE2B ;END_VAR【処理部】// Ring Buffer Open(Access Type : Read/Write)
IF hBuff = 0 AND RB_OPCL_Flag = TRUE THEN
result := Dsm_CdsysOpenRb(RB_sample_data, 1, ADR(hBuff), ADR(blksz), ADR(blkcase) ,sample_data_HASH);
END_IF;// Write Data to Ring Buffer
IF hBuff <> 0 AND RB_OPCL_Flag = TRUE THEN// Input data count up
input_data.count := input_data.count + 1;
result := Dsm_CdsysWriteRb (hBuff , ADR(input_data), input_size);
END_IF;// Ring Buffer CloseIF hBuff <> 0 AND RB_OPCL_Flag = FALSE THEN
result := Dsm_CdsysCloseRb(hBuff);
IF result = 0 THEN
hBuff := 0;
END_IF;
END_IF;

54

【Windows_sample】#include <stdio.h>#include "dsm_rb.h"#include "RingBuffer_sample_data.h"
int main(){
DSM_RB_HANDLE
unsigned int

hBuff;
blksz, blkcase;

int iReadBlockCnt = 1024;
unsigned int hash = sample_data_HASH;
struct sample_data output[10240];
unsigned int uiOnSkip = 0;
unsigned char* ucStr;
int result = 0, iDataCnt = 0, i = 0;
printf("¥n¥n<*** Dsm_WinMReadRb sample Start ***>¥n¥n");// Ring Buffer Open(Access Type : Read)
result = Dsm_WinOpenRb(RB_sample_data, 0, &hBuff, &blksz, &blkcase, hash);
if (result < 0) {printf("Dsm_WinOpenRb Error(%d).¥n", result);
return -1;}
else {
printf(" block size :%d¥n", blksz);
printf(" block case :%d¥n", blkcase);}
ucStr = (unsigned char*)malloc(blkcase * blksz);
memset(ucStr, 0x00, blkcase * blksz);// MRead Data from Ring Bufferfor (i = 0; i < 2; i++) {Sleep(1000);
printf("¥n Number of executions - %d¥n", i + 1);
result = Dsm_WinMReadRb(hBuff, iReadBlockCnt, &ucStr[0], &uiOnSkip);
memcpy(&output, &ucStr[0], blksz * iReadBlockCnt);
if (result >= 0) {for (iDataCnt = 0; iDataCnt < result; iDataCnt++) {printf(" [%4d] Count Data : %llu¥n", iDataCnt, output[iDataCnt].count);}}}free(ucStr);if (result >= 0) {result = Dsm_WinCloseRb(hBuff);}
printf("¥n<*** Dsm_WinMReadRb sample end
return 0;}55***>¥n");＜実行手順＞
サンプルプログラムの実行手順を以下に示します。なお、CODESYS®開発環境、CODESYS®リ
アルタイム実行環境、C 言語ビルド環境は別 PC であるものとして記載します。
① CODESYS® リ ア ル タ イ ム 実 行 環 境 に て 、 リ ング バ ッ フ ァ 定 義 フ ァ イ ル（ buffer.ini ） を「C:¥Program Files¥HX-DSM¥conf」に格納します。また、「Start PLC」を実施し、PLC プログ
ラムをダウンロードできるようにしておきます。
※ その他の ini ファイルを格納しないようご注意ください。
② CODESYS®開発環境にて、新規プロジェクトを作成します（テンプレートは、“標準プロジ
ェクト”）。デバイスの種類はご使用の環境に合わせたものを、開発言語は ST 言語を選択します。
③ 作成した CODESYS®プロジェクトにて、デバイスツリーの“ライブラリマネージャー”に
RT-DSM のライブラリ（“CmpDsm”）を追加します。
④ デバイスツリーの“Application”を右クリックし、“オブジェクトの追加”から“DUT”を構造体で追加します。構造体の名称は、「buffer.txt」記載上部の“sample_data”をコピーして使用します。
⑤ 追加した“sample_data”構造体の内容を、「buffer.txt」の”TYPE”から”END_TYPE;”までをコピー・ペーストして置き換えます。
⑥ デバイスツリーの“PLC_PRG(PRG)”を開き、変数宣言部の最後に「buffer.txt」の”VAR
CONSTANT”から”END_VAR”までをコピー・ペーストします。
⑦ 「CODESYS_sample」の変数宣言部と処理部の内容を、“PLC_PRG(PRG)”にコピー・ペース
トします。
⑧ ビルドした後、CODESYS®リアルタイム実行環境に PLC プログラムをダウンロード（ログイン操作）します。その後、ログアウトします。
⑨ C 言語ビルド環境にて、プロジェクトを作成し、ヘッダファイルのインクルードパスに「RingBuffer_sample_data.h」と「dsm_rb.h」を格納するフォルダのパスを設定します。また、「DsmWlib.lib」をインポートライブラリとして設定します。
⑩ 「Windows_sample」の内容をコピーして、C 言語のコマンドとしてビルドします。
⑪ CODESYS®リアルタイム実行環境にて Windows®を再起動し、リングバッファ定義ファイルの変更を反映します。再起動後、「Start PLC」することでデータ共有リングバッファにカウン
トアップ値の書き込みを開始します。
⑫ 続けて、コマンドプロンプトを管理者権限で起動し、⑩で作成したコマンドを実行します。
CODESYS®側からデータ共有リングバッファに書き込まれたカウントアップ値が取得＆表示できているのを確認します。

56

第11章 組込み CDMS とのデータ連携
RT-DSM は、組込み装置向けデータ管理基盤(NX Context-based Data Management System for Embedded
device、以降「組込み CDMS」と略す)とのデータ連携が可能です。第 8 章で説明した開発ツールの機能を拡張した、組込み CDMS 対応版開発ツールで出力した定義ファイルを使用します。
なお、組込み CDMS の使い方や定義ファイルの仕様に関しては、組込み CDMS のマニュアル「NX Context-based Data Management System for Embedded device ユーザーズガイド」をご参照ください。

組込み CDMS 対応版開発ツールでは、第 8 章のリングバッファ定義ファイル、C 言語プログラム用
ヘッダファイル、IEC プログラム用変数定義ファイルの 3 種類のファイルに加え、組込み CDMS で使用する次の 5 種類のファイルを出力します。
(1) データ項目紐付け定義ファイル（cdms_emb_mapped.conf）(2) データ名称定義ファイル（cdms_emb_named.conf）(3) イベントトリガー定義ファイル(cdms_emb_trigger.conf)(4) データ用リングバッファ定義ファイル（cdms_emb_dataring.conf）(5) トリガー用リングバッファ定義ファイル（cdms_emb_triggerring.conf）
データ定義ファイルに新たな KEY 定義を追加し、組込み CDMS 対応版開発ツールに入力すると、
上記の(1)～(5)の定義ファイルを出力することができます。
データ
定義ファイル(.defファイル)変換

ユーザーがシステムで1つ作成
CDMS対応のために、定義できるKEYを拡張。

CDMS対応版
開発ツール

リングバッファ
定義ファイル（.iniファイル）変換

IEC
プログラム用
変数定義(.txtファイル)

C言語
プログラム用
ヘッダファイル（.hファイル）

データ項目紐付け
定義ファイル(cdms_emb_
mapped.conf)

データ名称
定義ファイル(cdms_emb_named.conf)

イベントトリガー
定義ファイル(cdms_emb_t
rigger.conf)

データ用
リングバッファ
定義ファイル(cdms_emb_dataring.conf)

トリガー用
リングバッファ
定義ファイル(cdms_emb_tri
ggerring.conf)

共有メモリの番地と保存領域のカラムを紐づける。

構造体のメンバに対し別名称を定義する。

イベントトリガーを定義する。

データ取得のための
リングバッファを定義する。

トリガー通知の受信のためのリングバッファを定義する。

図 18

CDMS対応版で追加出力(各々システムで1つ生成)

組込み CDMS 対応版開発ツールの概要

なお、新たに追加した KEY 定義をデータ定義ファイルに記述しない場合、あるいは 組込み CDMS
対応の KEY 定義の不足や不整合がある場合は、第 8 章の開発ツール同じ 3 種類のファイルのみを出力
します。

57

11.1. リファレンス
defconvDB [入力ファイル名] [出力ファイルのパス][入力ファイル名]：データ定義ファイル(.def)の格納パスとファイル名を指定します。

[出力ファイルのパス]：defconvDB が出力するファイルの格納先を指定します。
指定されたパスには、生成した次のファイルを格納します。
・リングバッファ定義ファイル(.ini)
・C 言語プログラム用ヘッダファイル(.h)
・IEC プログラム用変数定義ファイル(.txt)
・データ項目紐付け定義ファイル(cdms_emb_mapped.conf）
・データ名称定義ファイル(cdms_emb_named.conf)
・イベントトリガー定義ファイル(cdms_emb_trigger.conf)
・データ用リングバッファ定義ファイル(cdms_emb_dataring.conf)
・トリガー用リングバッファ定義ファイル(cdms_emb_triggerring.conf)※1 パラメータが省略された場合、プログラムのバージョンとヘルプを表示します。
※2 出力パスを省略した場合、データ定義ファイルが存在するパスが出力先になります。
組込み CDMS 対応版開発ツールがエラー出力で表示するエラーコードは次の通りです。
表 17
No.

エラーコード値

システムエラー

-1

OS の基本機能が動作していま Windows® の動作環境に問題がない
せん。
か確認してください。

入力ファイルエラー-2

指定した[入力ファイル名]に、デー
データ定義ファイルが開けまタ定義ファイルが格納されている
せん。
か確認してください。

出力ファイルエラー-3

指定した[出力ファイルのパス]の生成したファイルが指定先に ファイルが書き込める状態か、ある
書き込めません。
いは、容量に空きがあるか確認して
ください。

定義誤り

-4

データ定義ファイルの定義内
データ定義ファイルの定義内容に容が誤っているか、不足してい誤りがないか確認してください。
ます。

設定値エラー-5

データ定義ファイルに設定し データ定義ファイルの定義値が仕た値が許されない値です。
様範囲内か確認してください。

データ型エラー-6

データ定義ファイルの構造体メン
指定されたデータ型がサポー
バで指定したデータ型が仕様で規トされていません。
定された型か確認してください。

パラメータエラー-7

パラメータが不正です。

1

2

3

4

5

6

7

defconvDB コマンドエラーコード一覧
内容

58

対処方法

コマンドラインパラメータの指定内容を確認してください。

11.2. データ定義ファイル定義項目
以下に組込み CDMS 対応版のデータ定義ファイルの設定項目一覧を示します。新たに追加した KEY
定義を太字で記載します。

表 18

データ定義ファイル設定項目一覧

No.

セクション名

項目名(KEY)

説明

1

BufferBufferNum

リングバッファの数

1

1～256

必須

2

RingBufferN(N=1-256)(*1)

DbAttrib

組込み CDMS での用途を示す種別(組込みCDMS で使用するもののみに指定)NULL

DATA,TRIGGER_S
TAT,ERR_TRIGGE
R,EVT_TRIGGER
のいずれか

任意

3

BlockNum

リングバッファのブロ
ック数

128

2～32768

必須

4

BuffName

バッファ名称

1

必須

5

WritableProg
Type

書込可能プログラム種
別

英数字
31 文字まで
Windows Windows、CODESYS

6

MemberM_Type(M=1-2048)

構造体の M 番目メン
バの型

NULL

表 10 規定のキーワ
ード

必須

7

MemberM_Name(M=1-2048)

構造体の M 番目のメ
ンバの名称

NULL

英数字、"_"、"[]"
配列は 2 次元まで。
配列数は数字、または DefineX_Name で定義した文字列。

必須

8

MemberM_Alias(システム全体でMax1000 個)

構造体メンバのエイリ
アス定義(DbAttrib=
DATA の時のみ有効)

NULL

英数字、"_"、"-“ 31文字まで“,” 区切りで複数
記述可能

任意

9

TargetData

イベントトリガーで収集したいデータを、定義済みの Alias で指定(DbAttrib=EVT_TRIGG
ER の時のみ有効)

NULL

英数字、"_"、"-“ 31文字まで“,”区切りで最大 16
個記述可能

任意

10

SampCyc

サンプリング周期(DbAttrib=EVT_TRIGG
ER の時のみ有効)

NULL

msec 単位数値(1-2147483647)

任意

11

BeforeTime

Before 時間(DbAttrib=EVT_TRIGG
ER の時のみ有効)

NULL

msec 単位数値(0-4000)

任意12

AfterTime

After 時間
(DbAttrib=EVT_TRIGG
ER の時のみ有効)

NULL

msec 単位数値(0-2147483647)

任意13

DefineX_Name(X=1-4096)

MenberM_Name の配列
数として指定可能な
define 定義文字列

NULL

英数字、"_"
ただし、数字のみは
不可

任意

14

DefineX_Value(X=1-4096)

DefineX_Name に対応
する数値

NULL

正の整数

任意

(*1) リングバッファの数だけ定義します。

59

初期値

範囲

要否

必須