今回の記事ではWAGO社の750-8215を使用し、BALLUFF社のBNI IOL-728-S51-P012と繋いで、Codesysプログラムと画面を作成します。
さ、FAを楽しもう。

Reference Link
BNI IOL-728-S51-P012?
今回使用するのはBalluff社のBNI IOL-728-S51-P012 IO-LINK HUBです。このデバイスは以下の特徴があります。
- IO-Link センサ/アクチュエータハブ
- インタフェース
- IO-Link 1.1
- 電源電圧 Ub
- 18 ~ 30.2 VDC
- 接続部(COM 1)
- M12x1-オス, 4-ピン, A-コーディング済
- デバイス接続部
- 8x M12×1-ソケット, 5-ピン, A-コーディング済
- アナログ入力
- 8x アナログ、電圧/ アナログ、電流
(0 ~ 10 V/-10 ~ 10 V/0~5 V/-5 ~ 5 V/5 ~ 10 V/4 ~ 20 mA/0 ~ 20 mA)
IOLINK HUB?
デジタル入力/出力およびアナログ入力用の IO-Link ハブ(バリエーションによる)には、自由に設定可能なポートが 8 つあります。
上位のマスタモジュールとの接続は IO-Link プロトコルで行われます。デジタルまたはアナログ信号を記録し、IO-Link インタフェース経由で転送する、または IO-Link 経由で送られてくるデジタル制御信号を接続されたアクチュエータに転送する。
LED
こちらはBNI IOL-728-S51-P012のLED説明です。
Wiring
こちらはBNI IOL-728-S51-P012?の配線図です。

2線式の接続コンセプト
2線式電流センサー(4~20mA)は、センサー供給ラインと信号ラインが共通です。センサーの出力は、構成に応じてピン2またはピン4に接続できます。
3線式の接続コンセプト
シングルエンド・モード(非対称)では、信号をピン2/ピン4とピン3の間に印加する必要があります。このモードは3線式センサーに使用できます。
4線式の接続コンセプト
差動モードでは、信号は2番ピンと4番ピンの間に印加する必要があります。この動作モードは、差動出力ドライバ(信号用に独立した0 V)を持つセンサに使用できます。これらのセンサーでは、信号が独自の基準電位(output-)を持つため、GNDラインでの電圧降下の影響を避けることができます。
Implementation
ここからIO-LINK HUB・CODESYS・WAGO 750-1657の構築をやりましょう。
Download IODD FILE
BalluffのHPからBNI IOL-728-S51-P012のIODD FILEをDownloadしてください。
https://assets.balluff.com/WebBinary1/ST_IODD_BNI_IOL_728_S51_P012_DRF_952475_AA_000.zip
WAGO Side
最初にWAGOのIO-LINKマスターを設定します。
Configure IO-Link Master
WAGO IO CHECKを起動し、750-1657と接続します。そのあと右クリック>Settingを開きます。
前回の記事にも紹介したWAGO IO-Link Toolが起動しました。
Set Data Frame
Data Frameをクリックし、750-1657のProcess Dataサイズを設定します。
今回の記事では最大の48Bytesに設定します。
今回WAGOの750-1657とBNI IOL-728-S51-P012間はPORT1で接続しています。
Connect to IO-LINK Master
次は750-1657 IO-LINKマスターの設定を行います。
Port Configuration
IOODsボタンをクリックします。
Importをクリックし、先程DownloadしたIODD FILEを選択しましょう。
Configure Parameters
今回はBNI IOL-728-S51-P012のパラメータ設定を行います。Show IO-Link Deviceボタンをクリックします。
これでBNI IOL-728-S51-P012のパラメータが表示されました。
General Device Settings
ConnectボタンをクリックしPORT1とつながっているBNI IOL-728-S51-P012と接続します。
Analog Mode
Analogモードを0-10vに設定します。
Pin Assignment
Pin設定はPin2にします。
Process Data Format
Data Formatは電圧のRawデータをそのままIO-LINKマスターに返します。
Resolution
分解能は最大の16Bitに設定します。
Process Data Monitor
次はWAGO IO-Link ToolのProcess Data監視機能を使って、BNI IOL-728-S51-P012の現在データを確認していきましょう。
Read Proces DataのCheckboxを入れます。
Done!それだけで現在BNI IOL-728-S51-P012のProcess Dataを確認できます。
Codesys Side
次はCodesys 側を構築します。
Configure IO-Link Master
K-Busに750-1657(48Bytes)を追加します。
DUT
こちらはBNI IOL-728-S51-P012から受信したIO-LINKデータをScalingするための構造体です。
TYPE stMotorParameters : STRUCT rRawLower :REAL:=0.0; rRawUpper :REAL:=10.0; rEngineeringUnitLower :REAL:=0.0; rEngineeringUnitUpper :REAL:=10.0; END_STRUCT END_TYPE |
Function Block
こちらはBNI IOL-728-S51-P012から受信したIO-LINKデータをScalingするプログラムです。
- inModuleパラメータは直接WAGO社の750-1657モジュール構造体を渡します
- iByteOffsetパラメータは750-1657モジュールの取得データOFFSET
- GetProcessInByte 関数を使用し750-1657のプロセスデータを取得する
FUNCTION_BLOCK fbRawDataScaling VAR_INPUT inModule:WagoAppIOLink.WagoTypesModule_75x_657.I_Module_75x_657; iByteOffset :UINT; END_VAR VAR_OUTPUT rValue:REAL; END_VAR VAR_IN_OUT stMotorParameters: stMotorParameters; END_VAR VAR arrBytes:ARRAY[0..2]OF BYTE; wTemp:WORD; rRawValue:REAL; END_VAR //Read the current arrBytes[1]:=inModule.GetProcessInByte(ByteNo:=iByteOffset); arrBytes[0]:=inModule.GetProcessInByte(ByteNo:=iByteOffset+1); // MEMUtils.MemCpy( ADR(wTemp), ADR(arrBytes[0]) ,2 ); rRawValue:=TO_REAL(wTemp)/1000.0; rValue:=((stMotorParameters.rEngineeringUnitUpper-stMotorParameters.rEngineeringUnitLower) /(stMotorParameters.rRawUpper-stMotorParameters.rRawLower))* (rRawValue-stMotorParameters.rRawLower)+stMotorParameters.rEngineeringUnitLower; |
POU
最後はさきほど作成したFBをを呼び出し、Scalingの上下限を設定し、IO-LINK HUBから守ろったデータを正しい値を取得しましょう。
PROGRAM MAIN VAR fbDevices:fbRawDataScaling; END_VAR VAR CONSTANT ciUnitNumber:INT:=0; ciIOLINKPort:UINT:=0; END_VAR fbDevices( inModule:=IoConfig_Globals.IOLINk1 ,iByteOffset:=(ciIOLINKPort*2)+8 ,stMotorParameters:=gRetainParamaters.stMotors[ciUnitNumber] ); gHMI.stMotor0DisplayY.rEngineeringUnitLower:=gRetainParamaters.stMotors[ciUnitNumber].rEngineeringUnitLower; gHMI.stMotor0DisplayY.rEngineeringUnitUpper:=gRetainParamaters.stMotors[ciUnitNumber].rEngineeringUnitUpper; gData.udtMotorDatas[ciUnitNumber,0].rCurrentValue:=fbDevices.rValue; gHMI.stMotor0DisplayY.rDisplayValue:=fbDevices.rValue; |