Siemens#S71200-G2とS71500でDPWR_DAT/DPRD_DATを使ってみよう

今回の記事ではS71200-G2とS71516F-3間でProfinet経由で通信を構築します。S71516F側はIOコントローラーでS71200G2はIOデバイスになります。また、今回記事ではDPWR_DATとDPRD_DATを使用しIOデータを更新します。

さ、FAを楽しもう!

Reference Link

http://soup01.com/ja/category/siemens-jp/s7%e2%80%901200-g2/

Data consistencyデータ一貫性

複数のプロセスが同時に動作している場合でも、途中で内容が変更されないデータ領域を*コンシステントデータ領域(consistent data area)と呼びます。

一方で、データブロックのサイズがコンシステントデータ領域を超える場合、伝送中にデータブロック全体の整合性が保たれない可能性があります。

そのため、本来ひとまとまりとして扱いたいデータブロックであっても、そのサイズがコンシステントデータ領域より大きい場合には、一部が新しいデータ、別の一部が古いデータという状態になることがあります。

データの不整合は、たとえば通信処理を実行している途中で、より優先度の高いハードウェア割り込みOBによって処理が中断された場合に発生することがあります。このとき、割り込みOB内のユーザープログラムによって、通信命令がすでに一部処理していたデータが変更されると、転送されるデータには次の2つの時点の情報が混在する可能性があります。

  • ハードウェア割り込みが処理される前のデータ
  • ハードウェア割り込みが処理された後のデータ

つまり、転送されたデータが同じ時点の内容ではなくなるため、これらのデータは不整合(inconsistent / not coherent)な状態となります。

一貫性を確保する方法

通信処理が割り込みOBによって中断される可能性がある場合は、データが一貫した状態で転送されるようにする必要があります。そのため、割り込みOBから転送対象のデータを直接変更するのではなく、データのコピー(イメージ)側を変更するようにします。そして、次のデータ転送を行う前に、そのデータのイメージを通信命令の転送領域へコピーします。

ユーザープログラム内の通信命令が共通のデータ領域へアクセスする場合、そのデータ領域へのアクセスは、たとえば DONEパラメータを利用して調整できます。これにより、通信命令によってローカル側から転送される通信領域については、ユーザープログラム側でデータの一貫性を確保できます。

PUT/GETの場合

一方、S7通信命令の PUT/GET を使用する場合は、プログラム作成やコンフィグレーションの段階で、コンシステントデータ領域のサイズを考慮しておく必要があります。

これは、通信先となるデバイス(サーバー)のユーザープログラムには、通信データとユーザープログラムの処理を同期させるための通信ブロックが存在しないためです。

S7-300 / C7-300の場合

S7-300およびC7-300では、CPU 318-2 DPを除き、通信データはOSのサイクル制御ポイン

トにおいて、32バイト単位で一貫性を保った状態でユーザーメモリへコピーされます。

一方、32バイトを超えるデータ領域については、データの一貫性は保証されません。

そのため、明確にデータの一貫性を確保する必要がある場合、ユーザープログラムで扱う通信データは32バイトを超えない範囲にする必要があります。

なお、バージョンによっては、扱えるサイズが最大8バイトとなる場合があります。

S7-400 / S7-1500の場合

一方、S7-400およびS7-1500では、通信データは462バイト単位で扱われます。S7-300とは異なり、これらの通信データはサイクル制御ポイントで処理されるのではなく、プログラムサイクル中に設けられた一定の時間枠(タイムスライス)内で処理されます。

タグの一貫性については、システムによって保証されます。そのため、これらの通信領域には、「PUT」/「GET」命令を使用する場合や、OPまたはOSなどからタグを読み書きする場合でも、一貫性を保った状態でアクセスできます。

割り込み応答時間への影響

データのコピー処理を行うことで、CPUの割り込み応答時間はわずかに長くなります。

また、完全なデータ一貫性を保った状態で転送する必要があるデータ量が多くなるほど、システムの割り込み応答時間も長くなります。

つまり、一貫性を保証するデータ量と割り込み応答時間にはトレードオフがあるため、扱うデータ量には注意が必要です。

DPWR_DAT

DPWR_DAT命令を使用すると、RECORD パラメータで指定したデータを、一貫性を保った状態で、中央構成のモジュール、またはDP標準スレーブ/PROFINET IOデバイスの指定されたモジュールへ転送できます。

必要に応じて、プロセスイメージにもデータが転送されます。これは、対象となるDP標準スレーブのアドレス範囲が、プロセスイメージ内の一貫性領域(consistency range)として設定されている場合に該当します。

「DPWR_DAT」が必要となるのは、I/Oまたはプロセスイメージ出力へアクセスする通常の転送命令では、連続した最大4バイトまでしか書き込めないためです。

CPUが対応している場合は、プロセスイメージ出力を介して一貫性のあるデータを書き込むこともできます。使用しているCPUがこの機能をサポートしているかどうかは、関連するドキュメントを確認してください。

ただし、一貫性のあるデータを書き込む際には、2つの方法を同時に使用しないようにします。

「DPWR_DAT」を使用するか、プロセスイメージ出力テーブルを介して書き込むか、どちらか一方を使用します。

注意

「DPWR_DAT」を使用する場合は、OB6x(等時性モード割り込み)が割り当てられているプロセスイメージパーティションに属するI/O領域へのアクセスは避けてください。

LADDR パラメータ

LADDR パラメータでは、対象となるDP標準スレーブ/PROFINET IOデバイスを指定します。指定したモジュールへのアクセス時にエラーが発生した場合は、エラーコード 8090 が出力されます。

RECORD パラメータ

RECORD パラメータでは、書き込むデータのソース領域を指定します。ソース領域は、選択したモジュールの出力データと同じか、それ以上の長さである必要があります。実際に転送されるのは出力データに対応する部分のみで、それ以外のバイトは考慮されません。

RECORD で指定したソース領域が、設定されたモジュールの出力サイズより大きい場合は、出力の最大サイズまでのデータのみが転送されます。

一方、ソース領域がモジュールの出力サイズより小さい場合は、エラーコード 80B1 が出力されます。

使用できるデータ型

使用できるデータ型は次のとおりです。これらのデータ型は、ARRAY または STRUCT 型のデータ構造内でも使用できます。一方、STRING および WSTRING 型はサポートされていません。

また、PLCデータ型(UDT)およびシステムデータ型にも対応しています。データ転送は同期方式で行われます。そのため、命令の実行が完了した時点で、書き込み処理も完了しています。

  • BOOL
  • BYTE
  • CHAR
  • WCHAR
  • WORD
  • LWORD
  • DWORD
  • INT
  • UINT
  • USINT
  • SINT
  • LINT
  • ULINT
  • DINT
  • UDINT
  • REAL
  • LREAL

パラメータ

パラメータ

宣言

データ型

説明

LADDR

Input

HW_IO

データを書き込む対象モジュールのハードウェアIDを指定します。ハードウェア識別子はシステム定数で確認できます。

RECORD

Input

VARIANT

書き込むユーザーデータのソース領域を指定します。

RET_VAL

Return

INT

命令の実行中にエラーが発生した場合、この戻り値にエラーコードが格納されます。

エラーコード

DPWR_DAT の実行結果は、RET_VAL に返されます。正常終了時は 0000、エラーが発生した場合は対応するエラーコードが格納されます。

エラーコード

内容

0000

エラーは発生していません。

8090

指定したハードウェアIDに対応するモジュールが設定されていない、コンシステントデータの長さに関する制限を満たしていない、または LADDR にハードウェアIDが指定されていません。

8092

RECORD パラメータに、サポートされていないデータ型が指定されています。

8093

LADDR で指定したハードウェアIDに、コンシステントデータを書き込めるDPモジュール/PROFINET IOデバイスが存在しません。また、指定したDP標準スレーブ/PROFINET IOデバイスに出力がない場合にも、このエラーが発生します。

80A1

I/Oデバイスへのアクセス中にアクセスエラーが検出されました。

80B1

RECORD で指定したソース領域が、設定されたDP標準スレーブ/PROFINET IOデバイスの出力サイズより短くなっています。

80C1

前回の書き込みジョブのデータが、DP標準スレーブ/PROFINET IOデバイスでまだ処理されていません。

DPRD_DAT

DPRD_DAT命令を使用すると、I/Oモジュールから一貫性を保ったデータを読み出すことができます。

この命令は、中央構成のモジュールだけでなく、DP標準スレーブやPROFINET IOデバイスに対しても使用できます。

DPRD_DATが必要となるのは、I/Oまたはプロセスイメージ入力テーブルへアクセスする通常のロード命令では、連続した最大4バイトまでしか読み出せないためです。

CPUが対応している場合は、必要に応じてプロセスイメージ入力を介して一貫性のあるデータを読み出すこともできます。

LADDR パラメータ

LADDR パラメータでは、対象となるDP標準スレーブ/PROFINET IOデバイスを指定します。指定したモジュールへのアクセス時にエラーが発生した場合は、エラーコード 8090 が出力されます。

RECORD パラメータ

RECORD パラメータでは、書き込むデータのソース領域を指定します。ソース領域は、選択したモジュールの出力データと同じか、それ以上の長さである必要があります。実際に転送されるのは出力データに対応する部分のみで、それ以外のバイトは考慮されません。

RECORD で指定したソース領域が、設定されたモジュールの出力サイズより大きい場合は、出力の最大サイズまでのデータのみが転送されます。

一方、ソース領域がモジュールの出力サイズより小さい場合は、エラーコード 80B1 が出力されます。

使用できるデータ型

使用できるデータ型は次のとおりです。これらのデータ型は、ARRAY または STRUCT 型のデータ構造内でも使用できます。一方、STRING および WSTRING 型はサポートされていません。

また、PLCデータ型(UDT)およびシステムデータ型にも対応しています。データ転送は同期方式で行われます。そのため、命令の実行が完了した時点で、書き込み処理も完了しています。

  • BOOL
  • BYTE
  • CHAR
  • WCHAR
  • WORD
  • LWORD
  • DWORD
  • INT
  • UINT
  • USINT
  • SINT
  • LINT
  • ULINT
  • DINT
  • UDINT
  • REAL
  • LREAL

パラメータ

パラメータ

宣言

データ型

説明

LADDR

Input

HW_IO

データを読み出す対象モジュールのハードウェアIDを指定します。ハードウェア識別子はシステム定数で確認できます。

RET_VAL

Return

INT

命令の実行中にエラーが発生した場合、この戻り値にエラーコードが格納されます。

RECORD

Output

VARIANT

読み出したユーザーデータの格納先となる領域を指定します。

エラーコード

エラーコード

内容

0000

エラーは発生していません。

8090

指定したハードウェアIDに対応するモジュールが設定されていない、コンシステントデータの長さに関する制限を満たしていない、または LADDR にハードウェアIDが指定されていません。

8092

RECORD パラメータに、サポートされていないデータ型が指定されています。

8093

LADDR で指定したハードウェアIDに、一貫性のあるデータを読み出せるDPモジュール/PROFINET IOデバイスが存在しません。また、指定したモジュールに入力がない場合にも発生します。

80A0

I/Oへのアクセス中にアクセスエラーが検出されました。

80B1

RECORD で指定した格納先領域の長さが、設定されたユーザーデータ長より短くなっています。

80C0

データの読み出しがまだ完了していません。

Implementation

今回はS71516F-3・S71200-G2両方にも構築する必要があります。

新しいデバイスx2作成する

最初にTIAプロジェクトを作成し、その中に2つのCPUを追加します。今回の例ではS71516F-3とS’1214FCになります。

Configure IP address

次はNetwork Viewを切り替え、各CPUのIPアドレスを設定します。

下図のボタンをクリックします。

デバイスのIPアドレスをアプリケーションに合わせててください。

S71200 側

S71200-G2側を設定します。

IO device機能を有効にします。

今回の記事ではS71516F-3とS71200-G2と接続しますので、S71500のPROFINET インタフェースを設定しましょう。

Done!

Transfer area

次はOperation Mode>I-device communicationをクリックし、S71516F-3とS71200-G2間の通信領域を設定します。

プログラム

次はプログラムを作成します。

udt_test

こちらは100Bytesの構造体を作成します。

db

データブロックに先ほど作成した構造体で変数を定義します。

fbTest

今度はテスト用のプログラムを作成します。

ネットワーク1

こちらはS71200→S71500に送信するデータの先端と末端を、Connection1・Connection2にデータを書き込みます。

ネットワーク3

DPWR_DAT関数を使用しS71200→S71500にデータをProfinet経由で書き込みます。

ネットワーク5

DPRD_DAT関数を使用しS71500→S71200にデータをProfinet経由で受信します。

OB1

最後は先程作成したFBを呼び出します。

ダウンロード

最後はプロジェクトをPLCにDownloadしてください。

S71500 側

S71516F-3側を構築します。

Profinet接続設定

プログラム

次はプログラムを作成します。

udt_test

こちらは100Bytesの構造体を作成します。

Tags

こちらはTagsの宣言です。S71500側は直接IOをアクセスするプログラムを作成します。

db

データブロックに先ほど作成した構造体で変数を定義します。

fbTest

今度はテスト用のプログラムを作成します。

ネットワーク2

Profinet経由で入力データをDB変数に転送します。

ネットワーク4

受信したデータをプラスとマイナス1にS71200に返答します。

ネットワーク6

DB変数を出力に転送し、Profinet経由でS71200に送信します。

OB1

最後は先程作成したFBを呼び出します。

ダウンロード

最後はプロジェクトをPLCにDownloadしてください。

結果

WiresharkからPNIOのPacketを確認できました。

DPRD_DATの関数にもエラーがありません。

S71500側ではS71200から送信したデータも確認できました。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする