HOME会社概況業務内容開発分野開発事例CANモジュールソフテックだよりお問い合わせ
HOME > ソフテックだより > 第159号(2012年4月4日発行) 技術レポート「LinuxOSでのDNP3.0通信開発」

「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。

ソフテックだより(発行日順)のページへ
ソフテックだより(技術分野別)のページへ
ソフテックだより(シーン別)のページへ


ソフテックだより 第159号(2012年4月4日発行)

技術レポート

「LinuxOSでのDNP3.0通信開発」

1. はじめに

通信プロトコルには様々な種類があり、ベンダ固有の通信プロトコルもあれば、国際的に標準化されている通信プロトコルもあります。また、通信プロトコルによっては得意な分野があるので、開発するシステムに応じ採用する通信プロトコルを決めていく必要があります。

弊社でもmodbusをはじめ、様々な通信プロトコルを開発しておりますが、今回の技術レポートでは弊社過去の開発実績の中からDNP3.0プロトコルに準拠したソフトウェア開発の事例を紹介します。

本実装例では、LinuxOSにDNP3.0を実装したものになります。

2. DNP3.0とは

DNP3.0(Distributed Network Protocol)は電力会社や水道施設などの工業分野でよく利用されるSCADAのオープン通信プロトコルセットです。安定度の低い通信回線を利用しても、確実にデータの送受信ができ、最近では、石油やガスの採掘現場、パイプラインといった広域分散設備の制御に導入されています。

元々はWestronic社(現GE Harris社)が開発した通信プロトコルで、DNPユーザグループを立ち上げそこでDNPの開発が進んでいきました。

DNP3.0プロトコルは、マスタ/アウトステーション方式で、マスタが通信の起点となります。
アウトステーションは、マスタから要求された機能を実行し応答メッセージを返します。(図1)

マスタ/アウトステーション方式
図1. マスタ/アウトステーション方式

DNP3.0プロトコルでは通信方法として、シリアル通信とIPネットワーク通信の2種類をサポートしています。また、IPネットワーク通信ではTCPとUDPをサポートしています。DNP3.0プロトコルの実装として、すべてを対応する必要はなく、必要な機能のみを実装し、実装した内容をDevice Profileという文書にサポートしている機能として記載します。

サポートしているデータタイプとしてはBinary データ、Counterデータ、Analogデータ、文字列、ファイルなどがあります。これらのデータにアクセスするために、DNP3.0は専用のメッセージ(オブジェクトグループ)を用意しており、アクセスしたいデータタイプに合わせてメッセージの使い分けをします。

また、マスタがデータを取得する際、1〜20の範囲を取得するといった指定のほかに、前回データを取得してから値が変わったデータのみを取得するといったこともできます。値が変わったデータをイベントとして保持し、マスタはイベントデータのみを取得できます。イベントデータのみを取得することによって、トラフィック負荷が軽減できます。

3. DNP3.0プロトコルの概要

DNP3.0プロトコルは以下のレイヤ構成になります。

DNP3.0レイヤ
図2. DNP3.0レイヤ

User LayerはDNP3.0を使用するユーザのソフトウェアになります。DNP3.0 Application LayerからDNP3.0 Data Link LayerまではDNP3が規定するレイヤになります。
Physical Mediaはシリアル通信であれば、RS-232やRS-485、IP ネットワーキングならEthernetになります。

3-1. メッセージ

メッセージは、レイヤごとに定められています。ここではDNP3.0 Application Layerのフレームについてご紹介します。

●リクエスト時

DNP3.0リクエストメッセージ
図3. DNP3.0リクエストメッセージ

●レスポンス時

DNP3.0レスポンスメッセージ
図4. DNP3.0レスポンスメッセージ

名前 概要
Application Request Header Application Control およびFunction Codeが格納されています。
Application Response Header Application Control、Function Code およびInternal Indicationsが格納されています。
Application Control 通信制御用ビットが格納されています。
Function Code readなどのファンクションコードが格納されています。
3.2.項で説明します。
Internal Indications レスポンス時のみある領域です。アウトステーションのステータスやエラー状態をチェックする領域です。
Object Header DNPオブジェクトのヘッダになります。
Group DNPオブジェクトのグループ番号になります。
使用するDNPの機能に応じた番号を指定します。
3.3.項で説明します。
Variation DNPオブジェクトのデータフォーマットを指定する番号になります。Group毎にVariation番号が規定してあるので、使用するフォーマットに応じ番号を指定します。
Qualifier Field/Range Field Qualifier FieldにはQualifier Codeが格納されており、これは例えばreadの時、範囲を指定するのか、readサイズを指定するのか、全データを取得するのかなどを指定するものです。Range Fieldにはパラメータ(開始インデックス、終了インデックスやサイズなど)が格納されます。

表1. メッセージフレームの内容

3-2. Function Code

DNP3.0プロトコルには多くのFunction Codeが定義されていますが、一般的に使用するものを表 2にまとめます。

コード 名称 概要
0x01 READ 指定したデータを取得します。
0x03 SELECT 書き込むデータの選択を行います。この段階では書き込みが行われず、OPERATEコマンドを発行することにより、データが書き込まれます。
0x04 OPERATE SELECTしたデータに書き込みを行います。SELECT & OPERATEをすることにより、データを確実に書込みすることができるようになります。
0x05 DIRECT_OPERATE SELECTを行わなくてもデータの書き込みを行えるファンクションです。

表2. Function Codeの種類

3-3. Group

DNP3.0のGroupについて一般的に使用するものをまとめます。
各GroupはVariationやFunction Codeによって動作が変わります。

Group 名称 概要
1 Binary Input Binary Inputデータの制御(readなど)
2 Binary Input Event Binary Inputイベントデータの制御(readなど)
10 Binary Output Status Binary Outputデータの制御(readなど)
11 Binary Output Event Binary Outputイベントデータの制御(readなど)
12 Binary Output Command Binary Outputデータの制御(SELECT/OPERATEなど)
30 Analog Input Analog Inputデータの制御(READなど)
32 Analog Input Event Analog Inputイベントデータの制御(READなど)
40 Analog Output Status Analog Outputデータの制御(READなど)
41 Analog Output Command Analog Outputデータの制御(SELECT/OPERATEなど)
42 Analog Output Event Analog Outputイベントデータの制御(READなど)

表3. Groupの種類

4. 開発事例

今回は、弊社開発実績の中から、DNP3.0のアウトステーション側の開発事例を紹介します。

4-1. システム構成

開発事例のシステム構成を図5に示します。
1台のマスタに対して1台のアウトステーションが接続される構成となります。

DNP3.0システム構成
図5. DNP3.0システム構成

弊社はアウトステーション側を担当し、LinuxOSにDNP3.0を実装しました。
また、通信はLinuxOSを使用してEthernetを用いたTCP通信を実現しています。

今回、アウトステーション側のDNP3.0機能要件は、以下の2点でした。

  • Analog Input - 32bit without flag(Group30 Variation3)
  • Analog Output Command - 32bit(Group41 Variation1)

以上の要件のため、上記機能のみを今回実装いたしました。

4-2. 設計

アウトステーション側プログラムの処理分けは図6の通りとし、アプリケーション制御部、DNP通信プロトコル部およびTCP通信部の3つにプログラムを分けています。3つに分割することによって、変更が互いに影響しないようにしています。

  1. アプリケーション制御部
    アプリケーション制御部ではDNP通信の監視を行い、データ送受信の要求や接続、切断処理などを行います。
  2. DNP通信プロトコル部
    DNP通信プロトコル部ではDNP通信プロトコルに準拠した処理を行います。送受信時にデータ領域にアクセスする必要があるため、データ領域へのインターフェースを定義し、データ領域が変更されてもDNP通信プロトコルを変更することなく対応できるようにしています。
  3. TCP通信部
    TCP通信部ではLinuxOSの提供するソケット通信を使用し、マスタとのTCP通信を実現しています。

プログラムの機能分け
図6. プログラムの機能分け

5. おわりに

本レポートでは、アウトステーション側実装の例としてDNP3.0の開発事例を取り上げました。
今回はDNP3.0の機能のごく一部を実装した事例になります。DNP3.0標準化されているプロトコルであるため、ユーザ視点から見ればわかりやすく、使いやすい通信プロトコルであると感じています。DNP3.0の資料は日本語に限らず、英語の資料も少ないため、DNP3.0の参考資料の一つになればと思います。

(S.O.)

[参考文献]
『DNP Users Group.ホームページ(http://www.dnp.org/default.aspx)』DNP Users Group.

関連ページへのリンク

関連するソフテックだより