# Siemens S7

> S7comm によるアドレス指定か、S7CommPlus による変数名で Siemens S7 の PLC につなぎます。アクセスの項目、ラックとスロット、メモリー領域、型付きのバイトとビットのアドレス指定、変数名、HMI の設定、そして S7 固有のデータ型。

**Siemens S7** のドライバーは、ISO-on-TCP に載る古くからの Step 7 のプロトコル、S7comm で Siemens S7 の PLC と話します。メモリー領域、データブロックの番号、バイト、ビットという絶対アドレスを使うので、エンジニアリングのプロジェクトからシンボルを書き出さなくても動きます。[Connector](connector) の Siemens S7 のドライバーの下に機器を追加し、下の項目を埋めてください。パネルは、このプロトコルが使う項目だけを見せます。

ここまでが**アドレスで指定**のアクセスです。機器ごとに**アクセス**を選びます。上のとおりの**アドレスで指定**か、TIA Portal と Siemens の HMI が使うプロトコル S7CommPlus による**名前で指定**です。名前で指定では、各タグが TIA Portal の書き方のとおりに変数を名前で示し、型は CPU が伝えます。

## アクセス {#access}

| 観点 | アドレスで指定 | 名前で指定 |
| --- | --- | --- |
| プロトコル | ISO-on-TCP 上の S7comm、ポート 102 | ISO-on-TCP 上の TLS 1.3 による S7CommPlus、ポート 102 |
| CPU | S7-300、S7-400、S7-1200、S7-1500 | ファームウェア V2.9 以降の S7-1500、ファームウェア V4.5 以降の S7-1200 で、TIA Portal V17 以降で構成したもの |
| 機器の項目 | ホスト、ラック / スロット | ホスト、ユーザー名とパスワード（どちらも任意） |
| タグが示すもの | エリア、DB 番号、バイトとビット、そのデータ型 | 変数の名前。たとえば `GanterOpt.Real_`。型は CPU が伝えます |
| CPU 側 | PUT/GET の許可と、最適化されていないデータブロック（[CPU を準備する](#prepare-the-cpu)） | 変えるものはありません。最適化されたデータブロックも読め、PUT/GET も要りません |
| 機器検出 | なし | CPU の変数（[機器検出](#discovery)） |

いま作る機器は**名前で指定**から始まります。この選択ができる前に保存された機器は、これまでどおり**アドレスで指定**で読み続けます。アクセスを切り替えても、タグの型付きのアドレスと変数の名前はどちらも残るので、元に戻せばすべてがもとの場所にあります。名前で指定のとき、機器の見出しはラックとスロットのない接続先を見せます。たとえば `s7://192.168.0.2?access=name` です。名前によるアクセスに答えない CPU は、機器のページでそう伝えます（[名前によるアクセスのない CPU](#a-cpu-without-the-access-by-name)）。

## 接続 {#connection}

| 項目 | 意味 | 既定 |
| --- | --- | --- |
| **ホスト** | CPU（またはその前に立つ CP モジュール）の IP アドレスかホスト名。 | 空 |
| **アクセス** | **アドレスで指定**か**名前で指定**（[アクセス](#access)）。 | 名前で指定 |
| **ラック / スロット** | アドレスで指定のときだけです。Siemens のハードウェア構成で設定した、CPU のラック番号とスロット番号です。1 行に数値の入力欄が 2 つ並び、先がラック、後がスロットです。 | 0 / 0 |
| **ユーザー名 / パスワード** | 名前で指定のときだけで、どちらも任意です。パスワードは、CPU のアクセスレベルが求めるときの CPU の保護のパスワードで、ユーザー名はユーザーを管理する CPU のときだけです。このコンピューターに保護して保存されます。 | 空 |
| **読み出し周期（ms）** | 上書きしないタグに対する、機器全体の読み取りの周期。 | 1,000 |

TCP のポートは 102（ISO-on-TCP）に固定なので、ポートの項目はありません。機器の見出しは、組み立てられた接続先を見せます。たとえば `s7://192.168.0.2:0:1`（ホスト、ラック、スロット）です。

ラックとスロットはハードウェアと合っている必要があります。S7-1200 と S7-1500 の CPU はラック 0、スロット 0 か 1 で答えます。よくある S7-300 の CPU はラック 0、スロット 2 にいます。S7-400 のラックは構成によって変わります。スロットが違うと、間違ったデータを読むのではなく、接続が失敗します。

各タグは自分の**読み出し周期（ms）**を持てます。タグの値が 0 のときは、機器の周期に戻ります。

## 名前で読む {#read-by-name}

名前で読む機器のタグは、「信号源」のカードの**変数名**の項目に、TIA Portal の書き方のとおりに変数を書きます。データブロックと変数、メンバーの前にはピリオド、配列の要素は角かっこです。TIA Portal の二重引用符は入力してもよく（`"GanterOpt".Real_`）、取り除かれます。

| TIA Portal の変数 | 変数名 |
| --- | --- |
| データブロック `GanterOpt` の `Real_` | `GanterOpt.Real_` |
| UDT のインスタンス `Udt_` の `Valor` | `GanterOpt.Udt_.Valor` |
| 配列 `Vetor` の要素 0 | `GanterOpt.Vetor[0]` |
| DTL の `DataHora` | `GanterOpt.DataHora`。1 つのタグで、日時です |

エリアも DB 番号もバイトも入力しません。変数がどこにあり、どの型かは CPU が伝え、ドライバーはそれをタグのデータ型として読みます。

| CPU の型 | データ型 | 補足 |
| --- | --- | --- |
| Bool | Boolean | |
| Byte、USInt / SInt | Byte / SByte | 符号なし / 符号付き |
| Word、UInt / Int | UInt16 / Int16 | 符号なし / 符号付き |
| DWord、UDInt / DInt | UInt32 / Int32 | 符号なし / 符号付き |
| LWord、ULInt / LInt | UInt64 / Int64 | 64 ビットすべてを正確に |
| Real / LReal | Float / Double | |
| Char、String | String | アドレスで指定と同じ Windows-1252 |
| WChar、WString | String | UTF-16、どの文字でも |
| Time、S5Time | Int32 | ミリ秒 |
| LTime | Int64 | ナノ秒 |
| Time_Of_Day | UInt32 | 午前 0 時からのミリ秒、24 h 未満 |
| Date、Date_And_Time、DTL、LDT | DateTime | 日付のみ / 日付と時刻 |

機器検出は、各タグに変数のデータ型と単位（ms、ns）を付けます。手で作ったタグは選んだデータ型になり、CPU の値はその型に変換されます。

String や WString は、ブロックで宣言された長さで丸ごと書き込みます。ドライバーはその長さを最初の書き込みの前に変数から読みます。それより長い文字列は 2 つの長さを示して拒否され、何も送られません。String は Windows-1252 にない文字を拒否します。DTL は日時として丸ごと読み書きします。8 つのフィールドを別々に出すことはありません。フィールドを 1 つだけ書くと、どんな値でも受け入れてしまうからです（月が 90 でも）。型の範囲を外れた値（24 h 以上の Time_Of_Day、Int への 40000）は範囲を示して拒否され、何も送られません。CPU にない名前はタグのエラーになり、そう伝えます。DTL のフィールドを 1 つだけ名前で示すと、DTL を名前で示すように案内します。

### HMI の設定 {#the-hmi-settings}

TIA Portal は、データブロックの変数ごとに 3 つの設定をブロックの列に持っています。ステーションは、CPU が何を通すかにかかわらず、Siemens 自身の HMI や OPC UA サーバーと同じようにそれに従います。

| TIA Portal の設定 | チェックがないとき |
| --- | --- |
| **Accessible from HMI/OPC UA/Web API** | その変数は読みも書きもしません。タグのエラーがこの設定の名前を示し、機器検出はその変数を出しません。 |
| **Visible in HMI engineering** | 機器検出はその変数を出しません。手でその変数を示したタグはふつうに読みます。 |
| **Writable from HMI/OPC UA/Web API** | その変数は読み取りのみです。書き込みはこの設定の名前を示して拒否され、タグの**アクセス**は読み取りのみを出してその理由を伝え、機器検出は読み取りのみとして出します。 |

### 名前によるアクセスのない CPU {#a-cpu-without-the-access-by-name}

接続を受け入れたのに名前によるアクセスに答えない CPU（ファームウェア V2.9 より前の S7-1500、V4.5 より前の S7-1200、V17 より前の TIA Portal で構成したプロジェクト、または S7comm しか話さない CPU）では、機器はオフラインのままです。機器のページは、エラーの代わりに通知でそれを伝えます。CPU に必要なもの、TIA Portal がファームウェアを見せる場所（CPU が動かしているものは **Online & diagnostics**、プロジェクトが示すバージョンは CPU のプロパティの **General > Catalog information**）、そして 3 つの道です。

1. CPU のファームウェアを更新し、TIA Portal のプロジェクトでも CPU に同じバージョンを設定して、ハードウェア構成をダウンロードします。ファームウェアの更新だけでは足りません。
2. **アクセス**を**アドレスで指定**にし、PUT/GET を許可し、データブロックの最適化を外します（[CPU を準備する](#prepare-the-cpu)）。
3. CPU 自身の OPC UA サーバー（S7-1500、またはファームウェア V4.4 以降の S7-1200）から、[OPC UA](driver-opc-ua) のドライバーで読みます。

機器の各タグも自分のページに同じ通知を持ち、CPU が名前で答えるようになると通知はひとりでに消えます。診断ログとエージェントも、機器のエラーで同じ手順を読みます。

## CPU を準備する {#prepare-the-cpu}

この節はアドレスで指定のアクセスについてです。名前で読む機器には、これらの設定はどれも要りません。

S7-1200 や S7-1500 が S7comm の絶対アドレス指定に応じるのは、CPU 自身の 2 つの設定がそろっているときだけです。どちらも TIA Portal で設定し、CPU にダウンロードします。S7-300 や S7-400 にはどちらも要りません。

| 設定 | TIA Portal での場所 | ないとき |
| --- | --- | --- |
| **Permit access with PUT/GET communication from remote partner** にチェック | CPU のデバイス構成を開いて CPU を選択し、**Properties > General > Protection & Security > Connection mechanisms** を開きます。ハードウェア構成をダウンロードします（**Download to device > Hardware configuration**）。プログラムだけをダウンロードしても、この設定は届きません。 | CPU は接続を受け入れたうえで、すべての読み取りと書き込みを拒否します。機器は接続されたままで、そのタグは品質が悪いものとして読まれます。 |
| **Optimized block access** のチェックを外す（ステーションが読むすべてのデータブロックで） | プロジェクトツリーの **Program blocks** の下でデータブロックを右クリックし、**Properties > General > Attributes** を開きます。ブロックをコンパイルしてダウンロードします。するとブロックの **Offset** 列に各変数の始まる位置が表示されます。それがタグの**開始バイト**に入れる値です。 | CPU はそのブロックのどのバイトもアドレスでは返しません。そのタグは品質が悪いものとして読まれ、機器のほかのタグは読み続けます。 |

**Optimized block access** を変えると、ダウンロードのときにデータブロックが初期化され、変数は初期値に戻ります。フラグのメモリー（M）、入力（I）、出力（Q）はいつでもアドレスを指定でき、変更は要りません。最適化したままにしなければならないデータブロックは、別の方法で読めます。PLC のプログラムでステーションが読む値を最適化されていないデータブロックかフラグのメモリーにコピーし、タグはそこを指します。あるいは、ステーションが PLC 自身の OPC UA サーバー（S7-1500、ファームウェア 4.4 以降の S7-1200）から、[OPC UA](driver-opc-ua) のドライバーで読みます。

CPU がどちらかの設定のせいで拒否すると、機器のページがどちらの設定かを、これらの手順といっしょに通知で伝えます。この通知は CPU が受け入れるとひとりでに消えます。データブロックの場合は、そのブロックと、読めなくなっているタグの名前を示します。診断ログとエージェントも同じ手順を読みます。CPU にないデータブロックや、データブロックの終わりを越えたアドレスは、それを指すタグでそのとおりに伝えられます。

## アドレス指定 {#addressing}

この節と続く 2 つの節（データ型、書き込み）はアドレスで指定のアクセスについてです。名前によるアクセスは[名前で読む](#read-by-name)にあります。

S7 のタグは、自由記述の文字列ではなく型付きの項目でアドレスを取ります。パネルは、タグの「信号源」のカードにそれらを見せます。

| 項目 | 意味 | 受け付ける値 | 既定 |
| --- | --- | --- | --- |
| **エリア** | 読むメモリー領域。 | `DataBlock`、`Merker`、`ProcessInput`、`ProcessOutput`、`Timer`、`Counter` | `DataBlock` |
| **DB 番号** | どのデータブロックか。エリアが `DataBlock` のときだけ出ます。 | 0 以上 | 1 |
| **開始バイト** | その領域の中で値が始まるバイトの位置。`Timer` と `Counter` の領域では、この入力欄は**タイマー番号**または**カウンター番号**という名前になり、タイマーやカウンターの番号を尋ねます。 | 0 以上 | 0 |
| **ビット（0～7）** | 開始バイトの中でのビットの位置。ブール値のタグにだけ出ます。 | 0～7 | 0 |
| **最大長（空欄なら 254）** | S7 の STRING または WSTRING の宣言された最大長（文字数）。`Timer` と `Counter` の領域以外の、文字列のタグにだけ出ます。 | STRING は 1～254、WSTRING は 1～16382、または空欄 | 空欄 |
| **PLC の文字列型** | ブロックの中で文字列が宣言されている型で、長さの隣にあります。`STRING`（1 文字 1 バイト、Windows-1252）か `WSTRING`（1 文字 2 バイト、UTF-16、どの文字でも入ります）です。最大長が出るところにだけ出ます。 | `STRING`、`WSTRING` | `STRING` |

領域は、Siemens のふつうの書き方に対応します。`Merker` はフラグのメモリー（M）、`ProcessInput` はプロセスイメージの入力（I/E）、`ProcessOutput` はプロセスイメージの出力（Q/A）、`Timer` と `Counter` は S7-300 と S7-400 の CPU にあるタイマーとカウンターの領域です。タイマーとカウンターは、バイトではなく番号でアドレスを取ります。`Timer` で番号 5 なら T5 を、`Counter` で番号 3 なら C3 を読みます。古くからの絶対アドレスを読み替えると次のようになります。

| 従来のアドレス | データ型 | 入力する項目 |
| --- | --- | --- |
| REAL を持つ `DB5.DBD12` | Float | エリア `DataBlock`、DB 番号 5、開始バイト 12 |
| `DB1.DBX3.4` | Boolean | エリア `DataBlock`、DB 番号 1、開始バイト 3、ビット 4 |
| INT を持つ `DB2.DBW20` | Int16 | エリア `DataBlock`、DB 番号 2、開始バイト 20 |
| `MW10` | Int16 | エリア `Merker`、開始バイト 10 |
| `M10.3` | Boolean | エリア `Merker`、開始バイト 10、ビット 3 |
| `IB2` | Byte | エリア `ProcessInput`、開始バイト 2 |
| `Q4.1` | Boolean | エリア `ProcessOutput`、開始バイト 4、ビット 1 |
| `T5` | Int16 | エリア `Timer`、タイマー番号 5 |
| `C3` | Int16 | エリア `Counter`、カウンター番号 3 |

ブール値のタグは、バス上でちょうど 1 ビットを読み書きします。まわりのバイトを書き直すことは決してありません。ほかのすべての型は、開始バイトから、そのデータ型のちょうどの幅でバイト単位のアドレスを取ります。「信号源」のカードの読み取り専用の**取得元のアドレス（バス上）**の行が、編集しているそばから組み立てられたアドレスを見せます。

## データ型 {#data-types}

タグの**データ型**が、バス上での S7 固有の型を決めます。S7 固有の 13 の幅がすべて使えます。

| データ型 | S7 の型 | バス上の大きさ |
| --- | --- | --- |
| Boolean | BOOL | 1 ビット |
| SByte | SINT | 1 バイト |
| Byte | USINT | 1 バイト |
| Int16 | INT | 2 バイト |
| UInt16 | UINT | 2 バイト |
| Int32 | DINT | 4 バイト |
| UInt32 | UDINT | 4 バイト |
| Int64 | LINT | 8 バイト |
| UInt64 | ULINT | 8 バイト |
| Float | REAL | 4 バイト |
| Double | LREAL | 8 バイト |
| String | STRING または WSTRING | 最大長 + 2 バイト（STRING）、最大長 × 2 + 4 バイト（WSTRING） |
| DateTime | DTL | 12 バイト |

複数バイトの値は、S7 固有のビッグエンディアンのバイト順を自動で使います。バイト順の選択肢がないのは、必要がないからです。

文字列のタグは、標準の S7 STRING の並びを読みます。宣言された最大長が 1 バイト、現在の長さが 1 バイト、そのあとに文字が 1 文字 1 バイトずつ、Windows-1252 で続きます。Windows-1252 は、TIA Portal と Siemens の HMI が STRING を表示するときのコードページです。そのため、ステーションが書いた文字列は TIA Portal と HMI にそのまま表示され（「Peça 12」は「Peça 12」のままです）、ステーションも同じ文字列として読み戻します。**最大長**は文字数で数え、ブロックの中の STRING の宣言と一致している必要があります（空欄は S7 の最大値である 254 の意味です）。ドライバーは、1 回の読み取りで最大長 + 2 バイトを運びます。日時のタグは、S7-1200/1500 の系列の DTL 構造体（年からナノ秒まで）に対応します。古い 8 バイトの DATE_AND_TIME は出ません。

**PLC の文字列型**が `WSTRING` の文字列のタグは、代わりに S7 WSTRING の並びを読みます。宣言された最大長が 1 ワード、現在の長さが 1 ワード、そのあとに文字が 1 文字 2 バイトずつ UTF-16 で続くので、どの文字でも入ります（「中」は「中」として書き込まれ、そのまま読み戻されます）。**最大長**はやはり文字数で数え、1 から 16382 までで、ブロックの中の WString の宣言と一致している必要があります（空欄は 254 の意味で、TIA Portal が長さなしで宣言された WString に与える長さです）。ドライバーは、1 回の読み取りで最大長 × 2 + 4 バイトを運びます。S7comm では CPU から型を読み取れないので、型は変数と一致させる必要があります。WString の変数に対して `STRING` のままのタグは、違う並びで読み書きします。この欄ができる前に保存されたタグは、すべて `STRING` です。

## 書き込み {#writes}

**アクセス**が読み書きか書き込みのみのタグは書き込めます。書き込みは、読み取りと同じ領域、バイト、ビットを対象にします。ブール値の書き込みはその 1 ビットを立て、ほかはすべてその型のちょうどのバイトを書きます。新しいタグは読み取りのみから始まります。

文字列の書き込みが**最大長**より多くのバイトを必要とする場合は、拒否されて何も送られず、大きさに合わせて切り詰められることはありません。診断ログとエージェントには、たとえば「The DB1 byte 44 write was not sent: the text takes 21 bytes, and the STRING holds 20.」と出ます。**最大長**ちょうどの長さの文字列は、そのまま全部書き込まれます。

Windows-1252 にない文字（たとえば漢字）を含む文字列の書き込みも同じように拒否され、その文字を疑問符に置き換えて書くことはありません。診断ログとエージェントには、たとえば「The DB1 byte 44 write was not sent: the STRING holds Windows-1252 characters only, and '中' (U+4E2D) is not one of them; it fits once the tag's text type in the PLC and the PLC variable are both WSTRING.」と出ます。タグのパネルは、同じ理由をステーションの言語で示します。

このような文字列を書くには、ブロックで変数を WString として宣言し、タグの**PLC の文字列型**を `WSTRING` にします。WSTRING は 1 文字を 2 バイトで数えるので、**最大長**より長い文字列は同じように拒否され、何も送られません。たとえば「The DB1 byte 94 write was not sent: the text takes 42 bytes, and the WSTRING holds 40 (20 characters of two bytes).」と出ます。

## 機器検出 {#discovery}

名前で読む CPU は自分の変数を一覧にします。S7comm は何も一覧にせず、同報で CPU が見つかることもありません。ドライバーのページでは、**スキャンの範囲**のカードの**スキャンする CPU**がどの CPU かを決めます。このドライバーの Siemens の機器で CPU を名前で読むもの（その機器のホストでスキャンし、その機器のパスワードでサインインします。パスワードで保護された CPU が変数を一覧にするのはこの方法です）か、**ここに入力したアドレス**で、CPU のアドレスを **CPU のアドレス**に入れます。

**機器検出**は、その CPU を、変数をタグにした 1 つの機器として出します。出るのは、CPU が HMI からアクセスでき見えると印を付けた変数で、すべてチェック済み、CPU が伝える型を持ち、CPU が HMI から書き込めないと印を付けたものは読み取りのみです。一覧は名前のパスによるツリーです。データブロック、次に各構造体または UDT のインスタンスと各配列、そして変数で、それぞれほかの変数と重ならない名前のいちばん短い末尾（`Real_`、`Valor`、`Vetor[0]`）で名付けられます。枝のチェックはその下のすべてをチェックまたは解除し、枝はその変数のうちいくつがチェックされているかを示します。DTL は 1 つの変数です。**機器を追加**は、チェックしたタグを持つ、名前で読む機器を作ります。

このステーションの Siemens の機器がすでに名前で読んでいる CPU は、スキャンがどう指定しても、その機器です。スキャンはその機器のパスワードでサインインし、**タグにして追加**は、まだタグのない変数を追加します。名前で読む機器のページでは、タグのカードの**タグ検出**が、その機器だけについて同じツリーで同じことをします（[機器検出](connector-discovery#discovering-a-devices-tags)を参照）。アドレスで指定の機器にはタグ検出がありません。タグは手で追加してください。

## 知っておくとよいこと {#good-to-know}

- タイマーとカウンターの領域があるのは S7-300 と S7-400 の CPU だけです。S7-1200 にはこの領域がなく、S7-1500 は PUT/GET を許可していても、S7comm でのこの領域へのアクセスを「Address out of range」で拒否します。その場合は、PLC のプログラムでタイマーやカウンターの値をデータブロックかフラグのメモリーにコピーし、そこから読み取ってください。領域がある CPU では、バイトの位置ではなく番号でアドレスを取ります。入力欄はタイマーやカウンターそのもの（T0、T1、T2 と C0、C1、C2）を尋ねます。どちらの値も 16 ビットのワード 1 つなので、Int16 と組み合わせてください。それより広い型や狭い型は、タグの名前を診断ログに残して拒否され、その機器のほかのタグは読み取りを続けます。
- 届かない PLC があっても起動時の損はありません。機器は背後で再試行を続け、接続がつながるまでそのタグは品質が悪いものとして読まれます。
- 機器がオンラインになったあとでケーブルが抜かれた場合は、次の読み取りで気付きます。機器はオフラインになり、そのタグは品質が悪くなり、ネットワークが戻れば自分で再接続します。CPU が拒否するアドレスはそうはならないので、書き間違えたタグ 1 つが機器の残りを道連れにすることは決してありません。読み取りで接続が切れていることに気付いたタグは、機器との接続が切れたことをステーションの言語で伝え、Sharp7 の言葉はイベントのページに残ります。
