今回の記事では、シーメンス製 S7-1500 と Phoenix Contact 製 AXL E PN IOL4/0 DIO8 M12 6M-L を PROFINET で接続するだけでなく、
シーメンス標準ライブラリ「LIOLink」 を使用し、プログラム上から動的に AXL E IOL DIO8 M12 3M のパラメータを上書きする方法を解説します。
また、本記事で使用する IO-Link デバイス は以下のとおりです。
- AXL E IOL DIO8 M12 3M
- PSD-SC IOL S15 AE
- Murrelektronik 5000-00501-1300001
(アナログ信号を IO-Link に変換するコンバータ)
さ、FAを楽しもう!

前書き
いつも私の技術ブログとYouTubeチャンネルをご覧いただき、心より感謝申し上げます。また、いまFullさん(full@桜 八重 (@fulhause) / X)と共に毎週水曜日の夜にお届けしている「高橋クリス」ラジオ番組を運営しています。
技術は独り占めせず、届けるもの
私たちは工場の生産技術や制御に関する技術情報を、ブログや動画などで無料公開しています。「知識は誰でもアクセスできるべき」という信念のもと、現場で役立つ具体的なノウハウやトラブル事例などを発信してきました。すべて無料で続けているのは、「知らなかったせいで困る人」を少しでも減らしたいからです。
また、もしあなたの現場で…
- 「このPLCとデバイスの組み合わせ、ちゃんと動くのかな?」
- 「EtherCAT通信でうまくいかない部分を検証してほしい」
- 「新しいリモートI/Oを試したいけど社内に検証環境がない」
など、困っている構成や試してみたいアイデアがあれば、ぜひお知らせください。機器の貸出や構成の共有が可能であれば、検証し、記事や動画で発信します(ご希望に応じて匿名対応も可能です)。
支援のかたち
現在、私達の活動はほぼ無償で続けており、記事や動画の制作には、時間と検証環境の整備が必要です。この活動を継続的にコンテンツを提供するためには、皆様の温かいご支援が大変重要です。
メンバーシップ(ラジオの応援)
Fullさんとのラジオをより充実させるための支援プランです。
https://note.com/fulhause/membership/join
Amazonギフトリスト
コンテンツ制作に必要な機材・書籍をリストにしています。
https://www.amazon.co.jp/hz/wishlist/ls/H7W3RRD7C5QG?ref_=wl_share
Patreon(ブログ・動画活動への応援)
月額での小さなご支援が、記事の執筆・検証環境の充実につながります。
https://www.patreon.com/user?u=84249391
Paypal
小さな支援が大きな力になります。
https://paypal.me/soup01threes?country.x=JP&locale.x=ja_JP
知ってたら助かること、届けたいだけです
あなたの応援が、知識の共有をもっと自由で持続可能なものにしてくれます。これからもどうぞよろしくお願いします。
soup01threes*gmail.com
技術はひとりじゃもったいない。
Reference Link
FB
今回の記事で使用するシーメンスの標準関数を説明します。
SCALE_X: Scale
「Scale」命令を使用すると、VALUE入力の値を指定した値範囲にマッピングしてスケーリングすることができます。「Scale」命令が実行されると、VALUE入力の浮動小数点値がMINおよびMAXパラメータで定義された値範囲にスケーリングされます。スケーリングの結果は整数となり、RET_VAL出力に格納されます。

以下の図は、値をスケーリングする方法の例を示しています。
「Scale」命令は、次の式を使用して動作します。
OUT = [VALUE ∗ (MAX – MIN)] + MIN |
|---|

パラメータ
以下の表は「Scale」命令のパラメータを示しています。
パラメータ | 宣言 | データ型 | メモリ領域 | 説明 |
|---|---|---|---|---|
MIN | Input | 整数、浮動小数点数 | I, Q, M, D, Lまたは定数 | 値範囲の下限 |
VALUE | Input | 浮動小数点数 | I, Q, M, D, Lまたは定数 | スケーリングする値。定数を入力する場合は、宣言が必要です。 |
MAX | Input | 整数、浮動小数点数 | I, Q, M, D, Lまたは定数 | 値範囲の上限 |
RET_VAL | Output | 整数、浮動小数点数 | I, Q, M, D, L | スケーリングの結果 |
NORM_X: Normalize
「Normalize」命令を使用すると、VALUE入力に与えられたタグの値を、線形スケールにマッピングして正規化できます。
- MINおよびMAXパラメータを用いて、スケールに適用される値の範囲を定義します。
- RET_VAL出力には、正規化対象の値がこの範囲内のどの位置にあるかに応じて計算された結果が、浮動小数点数として出力・保存されます。
- 正規化する値がMIN入力の値と等しい場合、OUT出力は「0.0」となります。
- 正規化する値がMAX入力の値と等しい場合、OUT出力は「1.0」となります。

次の図は、値を正規化する方法の一例を示しています。
「Normalize」命令は、以下の数式に基づいて動作します。
OUT = (VALUE – MIN) / (MAX – MIN)

パラメータ
次の表は、「Normalize」命令のパラメータを示しています。
パラメータ | 宣言 | データ型 | メモリ領域 | 説明 |
|---|---|---|---|---|
MIN | 入力 | 整数、浮動小数点数 | I, Q, M, D, L | 値範囲の下限 |
VALUE | 入力 | 整数、浮動小数点数 | I, Q, M, D, L | 正規化される値 |
MAX | 入力 | 整数、浮動小数点数 | I, Q, M, D, L | 値範囲の上限 |
RET_VAL | 出力 | 浮動小数点数 | I, Q, M, D, L | 正規化結果 |
動作モード:Filling Levelモード
PSD-SC IOL S15 AEのFilling Levelでは、アナログ値がシグナルタワーによって表示されます。各セグメントは充填レベルのインジケータとして使用され、すべてのセグメントが消灯している状態を 0%、すべてのセグメントが点灯している状態を 100%とする範囲で表現されます。
これにより、注文の進捗状況や、機械プロセスにおける材料の有無を、上昇または下降する照光表示として正確に可視化することが可能になります。

色の設定は、グローバルパラメータ「Filling level mode(フィリングレベルモード)」によって行われます。選択可能なオプションは次の2つです。
-
セグメント 1~15 または 1~9 の設定を適用
-
セグメント 1 の設定を適用
プロセスデータ:フィリングレベルモード
8ビットのプロセスデータが処理されます。
許容される値の範囲は 0〜 100 です。
ビット | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|
説明 | 0 ~ 100(%値) |
SIMATIC S7-1500/1200 IO-Link用ライブラリ (LIOLink)
IO-Link 通信規格は、センサやスイッチングデバイスをコントローラレベルへインテリジェントに接続することで、新たな可能性を切り開きます。中核となる要素は、フィールドレベルにおけるスイッチング、保護、そして監視です。
IO-Link システムは、IO-Link マスタと1台以上の IO-Link デバイス(センサまたはアクチュエータ)で構成されます。IO-Link マスタは上位コントローラへのインタフェースとして機能し、接続された IO-Link デバイスとの通信を制御します。
LIOLinkライブラリは、SIMATIC コントローラと IO-Link マスタ、または IO-Link デバイスとの通信を容易にするためのブロックおよび PLC データ型を提供します。
機能の範囲
このライブラリに含まれるブロックは、次の4つのグループに分類されています。
- 汎用ベースブロック
SIMATIC IO-Link マスタおよびあらゆる IO-Link デバイスとの通信や、IO-Link 診断情報の読み出しに使用される基本ブロックです。 - マスタ専用ブロック
SIMATIC IO-Link マスタのバックアップおよびリストア、ならびにポート機能の実行に使用されるブロックです。 - デバイス専用ブロック
特定の IO-Link デバイスとの通信を簡素化するため、それぞれ専用に最適化されたインタフェースと、あらかじめ定義された PLC データ型を備えています。これらのブロックはベースブロックを基盤としています。 - プロファイルブロック
特定の IO-Link プロファイルを介したデバイス通信を簡素化するブロックです。これらもベースブロックを基盤としています。
有効範囲
このライブラリは TIA Portal V18 以降で使用可能です。ライブラリ内のすべてのブロックは、SIMATIC S7-1200 / S7-1500 コントローラで利用できます。
LIOLink_Device
今回の記事ではこちらのFBを使用しIOLinkデバイスのパラメータを上書きします。

パラメータ一覧
制御・設定系
名前 | Pタイプ | データ型 | 説明 |
|---|---|---|---|
execute | IN | Bool | 機能を実行する要求 |
hwID | IN | HW_IO | IO-Link マスタ、または最初のサブモジュールのハードウェア識別子 |
cap(任意) | IN | Int | アクセス点(Client Access Point)Siemens の IO-Link マスタ使用時は自動検出されるため通常は不要。このパラメータを変更すると自動検出は行われない |
readWrite | IN | Bool | モード指定FALSE:読み取りTRUE:書き込み |
port | IN | Int | IO-Link デバイスが接続されているポート番号有効範囲:0..63 |
index | IN | Int | パラメータインデックス有効範囲:0..3276765535(0xFFFF):IOL-D ポート機能 |
subindex | IN | Int | パラメータサブインデックス0:レコード全体1..255:レコード内のパラメータ |
writeLen | IN | Int | 書き込みデータ長(バイト、正味データ)有効範囲(書き込み時):1..232読み取り時は無関係 |
timeout | IN | Time | コマンドがキャンセルされるまでの時間 |
pollingPeriod(任意) | IN | Time | データセットが送信されるまでブロックが待機する可変調整時間デフォルト値:100 ms |
ステータス系
名前 | Pタイプ | データ型 | 説明 |
|---|---|---|---|
done | OUT | Bool | TRUE:コマンドが正常に実行された |
busy | OUT | Bool | TRUE:コマンドを処理中 |
error | OUT | Bool | TRUE:FB 処理中にエラーが発生した |
status | OUT | Word | 16#0000–16#7FFF:FB のステータス16#8000–16#FFFF:エラーコード(セクション 3.1.4 参照) |
データ・診断系
名前 | Pタイプ | データ型 | 説明 |
|---|---|---|---|
diagnostics | OUT | “IOLink_typeDiagnostics” | FB の詳細診断情報(セクション 3.1.4 参照) |
readLen | OUT | Int | 読み取ったデータ長(バイト、正味データ) |
record | IN_OUT | Array[*] of bytes | 読み取り/書き込み対象データの送受信バッファ有効範囲:0..231 |
動作原理
アドレッシング
目的のデータセットは、「index」および「subindex」パラメータによって一意に指定されます。
データを書き込む場合、「writeLen」パラメータで指定されたデータ量が IO-Link デバイスへ送信されます。このパラメータは読み取り時には無関係です。
IO-Link マスタへのアクセスポイントは、「cap」パラメータ(Client Access Point)によって定義されます。Siemens AG 製の IO-Link マスタを使用する場合、検出は自動的に行われます。ただし、このパラメータを変更すると自動検出は無効になります。通常、アクセスポイントは 0xB400 または 0x00E3 です。
通信の時系列シーケンス
データ通信は、入力「execute」に立ち上がりエッジが入ることで開始されます。
出力「done」「busy」「error」「status」は、コマンドの実行状態を示します。
正常に実行された後、「len」パラメータには、受信または書き込みされたデータの長さが表示されます。
入力「execute」がセットされている間、出力パラメータはその値を保持します。
FB の処理が完了する前に「execute」入力がリセットされた場合でも、コマンド処理後の1サイクル間は出力パラメータの値が出力されます。
処理時間が「timeout」パラメータで指定された時間を超えた場合、処理は中断され、エラーが出力されます。
注意
データ転送は、生データ(バイト配列=ARRAY of bytes)の形式で行われます。そのため、この状態のままではデータを直接解釈することはできません。
データの整形や解釈は、デバイスメーカーの仕様に従ってユーザー側で行う必要があります(データ構造体やデータ型へコピーするなど)。
エラーハンドリング
出力「status」は現在のステータスおよびエラー状態を出力します。一方、出力「diagnostics」は、エラー発生時に詳細情報を含む診断構造体を提供します。
ステータス | 意味 |
|---|---|
16#0000 | 処理完了。警告なし、追加情報なし |
16#7000 | 処理中の操作なし(初期値) |
16#7001 | 新しいコマンドの最初の呼び出し(「execute」の立ち上がりエッジ) |
16#7002 | 2回目以降の呼び出し |
16#8201 | 未対応のポート |
16#8202 | 未対応のインデックス |
16#8203 | 未対応のサブインデックス |
16#8205 | 「writeLen」パラメータの長さが、書き込まれるデータセットと一致していない |
16#8401 | IO-Link マスタがエラーコードを報告(詳細は「diagnostics」を参照) |
16#8402 | 受信したデータセットが操作に一致していない |
16#8403 | 指定された時間内に処理を完了できなかった |
16#8600 | 内部ステートマシンが未定義状態に到達した |
16#8601 | システム関数 WRREC がエラーを報告 |
16#8602 | システム関数 RDREC がエラーを報告 |
診断
エラーが発生した場合、出力「diagnostics」には、現在保留中のエラーに関する詳細情報が提供されます。
タグ | 説明 |
|---|---|
status | FB のインタフェースパラメータ「status」における、直前のステータスコード |
subfunctionStatus | システム関数 RDREC/WRREC、または IO-Link マスタからのエラーコードのステータス (%W1:IO-Link マスタのエラーコード、%W0:ISDU エラーコード) 詳細については、該当するシステム関数のオンラインヘルプ、または IO-Link マスタ/デバイスのマニュアルを参照 |
stateNumber | エラーが発生した際の FB 内ステートマシンの状態番号 |
Implementation
シーメンス側
最初にシーメンスS7-1500側を構築します。

ライブラリダウンロード
シーメンスのLIOLINKライブラリを使用するには、下記のLinkからライブラリをDownloadしてください。

次はDownloadしたZIP Fileを解凍します。

TIAを開き、Global Library→下図に示すボタンをクリックします。

先程解凍したFileにある.al18を開きます。

今回記事で使用するにはTIA V20なので、Upgradeボタンをクリックします。

少々お待ち下さい…

Done!LIOLINKライブラリが追加されました。

次はBase blocks→LIOLink_Deviceをプロジェクトに追加します。

Done!

AXL E IOL DIO8 M12 3M-IO-Linkパラメータ
前回の記事ではAXL E IOL DIO8 M12 3Mを構築し、初期パラメータを構築しました。今回は下記の”Restore factory settings”Checkboxを設定することによって、毎回AXL E IOL DIO8 M12 3Mにもパラメータが初期化されます。

プログラム
次はプログラムを作成します。
udt4Bytes
データ型名は udt4Bytes で、内部に 4バイト分の生データを保持するための構造になっています。

udtAXL_E_PN_IN_IOLINKStatus_Module
この UDT は、IO-Link モジュールの各ポート状態をまとめて扱うためのステータス用データ型です。各ポート(1〜4)の状態を、用途別に Bool 配列で保持します。

udtAXL_E_PN_IN_StatusModule
この UDT は、IO-Link モジュール全体の電源・デバイス状態・各ポート系統のエラー状態を集約して保持するためのステータス用データ型です。
「モジュールとして今正常なのか」を判断するための情報が一か所にまとめられています。

udtAXL_E_PN_IN
この UDT は、これまでに見てきた 2つのステータス用 UDT を内包し、
AXL E PN IN モジュール全体の状態を1つの構造体として扱うためのデータ型です。

dbILINKTypeDiagnos
Data Blockをさくせし、TypeをLIOLink_typeDiagnosticsに指定します。

Done!

dbIOLINKRecordArray
こちらは長さ1000のByte配列を定義したDBです。

dbSt136InData
こちらはAXL E IOL DIO8 M12 3Mの入力データを分解し格納するDBです。

PLC Tags
こちらは今回記事で定義したTagsです。

fbAXL_E_PN_IN
こちらのFBはAXL E IOL DIO8 M12 3Mの入力データを分解し格納します。
IO-Link から受信した ステータス生データ(IOLinkStatus/InputStatus)を入力として受け取り、AXL E PN IN モジュール用の構造化ステータス(udtAXL_E_PN_IN)に変換して出力します。
VAR
こちらはFBのインタフェースです。

Prgoram
次はプログラムを作成しましょう。

Network2
IO-Link から受信した ステータス生データの0バイト目・0ビット目(raw000.%X0)を、デバイスの過温/低温異常フラグに変換 しています。

Network3
IO-Link から受信した ステータス生データの0バイト目・1ビット目(raw[0].%X1)を、センサ電源の低電圧(UnderVoltage)異常フラグに変換 しています。

Network4
IO-Link から受信した ステータス生データの0バイト目・2ビット目(raw[0].%X2)を、センサ電源の過電圧(OverVoltage)異常フラグに変換 しています。

Network5
IO-Link から受信した ステータス生データの1バイト目の各ビット(raw[1].%X0~%X3)を、ポート1~4それぞれのセンサ電源異常フラグ(SensorSupplyError)に変換 しています。

Network6
IO-Link から受信した ステータス生データの2バイト目の各ビット(raw[2].%X0~%X3)を、ポート1~4の出力電源異常フラグ(OutputSupplyError)に変換 しています。

Network7
IO-Link から受信した ステータス生データの3バイト目の各ビット(raw[3].%X0~%X3)を、ポート1~4の IO-Link 電源異常フラグ(IOLINKSupplyError)に変換 しています。

Network9
IO-Link から受信した リンクステータス生データの0バイト目の各ビット(raw[0].%X0~%X3)を、ポート1~4それぞれの IO-Link 接続状態フラグ(IOLINKStatus)に変換 しています。

Network10
IO-Link から受信した リンクステータス生データの1バイト目の各ビット(raw[1].%X0~%X3)を、ポート1~4それぞれの IO-Link プロセスデータ有効フラグ(IOLINKPDValid)に変換 しています。

Network11
IO-Link から受信した リンクステータス生データの2バイト目の各ビット(raw[2].%X0~%X3)を、ポート1~4それぞれの Pin4 の DI 状態フラグ(IOLINKDIStatePin4)に変換 しています。

OB1
最後はOB1のプログラムを作成します。
VAR
こちらはOB1で定義した変数です。

Program
次はラダープログラムを作成します。
Network2
IO-Link マスタから取得した IO-Link ステータス生データ(IOLinkStatus)と入力ステータス生データ(InputStatus)を FB に渡し、AXL E PN IN モジュール用の構造化ステータス(udtAXL_E_PN_IN)へ変換・集約 しています。

Network3
Murrelektronikの5000-00501-1300001アナログからIOLINKへの変換器から取得した アナログ生値(Int)を、NORM_X で 0~1 に正規化し、その結果を SCALE_X で 0.0~11.7 の実スケール値に変換 しています。

Network4
入力ビットの状態から 点灯段数(LightOrder)を数値化し、それを10倍して IO-Link 用の照光レベル指令値(バイトデータ)を計算 しています。

Network5
シグナルタワーモード/フィリングレベルモードの切り替え入力(b1.%X6/b1.%X7)を検出し、IO-Link パラメータ書き込み要求フラグ(xIOLINKParasWrite)をセット しています。

Network6
モード切替ビット(b1.%X6)が ON のとき、
IO-Link パラメータ書き込み用に「Index・SubIndex・WriteLen・Record 値(16#64)」を設定 しています。

Network7
モード切替ビット(b1.%X7)が ON のとき、
IO-Link パラメータ書き込み用に「Index・SubIndex・WriteLen・Record 値(16#64)」を設定 しています。

Network8
設定した Index/SubIndex/データを使って、IO-Link_Device FB を実行し、IO-Link デバイスへパラメータの読み書きを行い、その結果(完了・ビジー・エラー・ステータス)を取得しています。

LIOLinkの使用方法
補足ですが、LIOLinkライブラリの使用はいつものFB操作と同じです。

Instanceのタイプを指定します。

Cap入力変数
capというパラメータがDefault上に隠されており、Blockの一番下にある矢印ボタンをクリックしてください。

capパラメータが表示されます。

そこに16#B400をいれてください。

hwID
LIOLink_Deviceライブラリを使用するには、もう1つ必要なパラメータはhwIDです。

AXL E IOL DIO8 M12 3MをDevice Viewに切り替え→Properties→System constantsを開き、中にある”AXL-E-PN-IOL4-0-DIO8~Head”を選択すればOKです。

Network9
IO-Link 通信が完了(Done)またはエラー(Error)になった時点で、パラメータ書き込み要求フラグ(xIOLINKParasWrite)をリセット** しています。

ダウンロード
最後はプロジェクトをS7-1500にDownloadしましょう。
結果
Done!Profinet通信はエラーなく成立しました。

こちらの動画で動作確認できます。