今回の記事ではWAGO社の750-8215を使用し、新しい4 Port IO-LinkマスターでWAGOのアナログ4-20mA出力→IOLINK変換器と繋いで、Codesysプログラムと画面を作成します。
さ、FAを楽しもう。

前書き
いつも私の技術ブログとYouTubeチャンネルをご覧いただき、心より感謝申し上げます。また、いまFullさん(full@桜 八重 (@fulhause) / X)と共に毎週水曜日の夜にお届けしている「高橋クリス」ラジオ番組を運営しています。
現在、私達の活動はほぼ無償で続けており、より多くのコンテンツを提供するためには、皆様の温かいご支援が大変重要です。もし可能であれば、以下のリンクから応援していただけると大変嬉しく思います。
高橋クリスのメンバーシップ
こちらはFullさん(full@桜 八重 (@fulhause) / X)と共にやっているラジオにメンバーシップを登録いただけます。
https://note.com/fulhause/membership/join
AMAZON ギフトリスト
こちらは自分のブログのコンテンツ制作や設備の充実に大いに役立てさせていただきます。
https://www.amazon.co.jp/hz/wishlist/ls/H7W3RRD7C5QG?ref_=wl_share
Patreon
こちらは自分のブログのコンテンツ制作や設備の充実に対する小さな応援の気持ちのPatreonです。
https://www.patreon.com/user?u=84249391
皆様のサポートが、私たちの活動をより充実させる力となります。
どうぞよろしくお願いします。
メールアドレス(*=@)
X
IO-Link Function?
IO-Link は、一般的なデジタル入力/出力とインテリジェントな IO-Link デバイスの両方を制御レベルに接続するための通信規格(IEC 61131-9 による)を定義しています。IO-Link デバイスとは、IO-Link 機能を持つフィールドレベルのセンサやアクチュエータを指します。
IO-Link を使えば、プロセスデータ通信だけでなく、コンフィギュレーション、診断、メンテナンスもコントローラから最下部のフィールドレベルまで実行できます。例えば、センサの故障をコントローラ内で診断し、特定することができます。
IO-Link マスタにパラメータデータをPLCなどに保存し、事前設定オプションを使用することで、接続されている IO-Link デバイスの交換や設定のコピーが簡単にできます。通信は 3 線接続技術のシリアルピアツーピアリンクで行われます。データと診断情報、電源は IO-Link インタフェースを介して同時に送信されます。
IO-Link デバイスの設定は、標準化された “IO Device Description” (IODD) ファイルに基づいています。これらは IO-Link デバイスメーカから提供され、特定の設定ソフトウェアにインポートされます。
これにより、IO-Link デバイスは、一般的なオートメーションシステムやネットワーク構造に統合することができます。
750-1657?
750-1657は4ポートのIO-Linkマスターは、IOLink通信システムがコントローラーレベルで使用するインテリジェントセンサとアクチュエータを接続する役割を果たします。 3線式接続技術により、最大4台のIO-LinkデバイスをI/O-Linkマスタの各ポートに接続できます。
WAGOから提供したファンクションブロック、デバイス記述Profile、WAGO I/O Check、または WAGO IO-Link Configurator を使用して、IO-Link マスタを構成およびパラメータ化できます。I/Oモジュールは、エンハンスドとスタンダードの2つの動作モードを提供します。
注意するのは、拡張動作モードは現在、ファームウェアバージョン 12 以上の第 3 世代 PROFINET フィールドバスカプラとの組み合わせでのみ使用できます。
他のすべてのヘッドステーションでは、4ポートのIO-Link マスターは標準動作モードで動作します。
配線
750-1657 4ポートIO-Linkマスタは、IOLink通信システムがコントローラレベルで使用するインテリジェントセンサやアクチュエータを接続するのに役立ちます。3線式接続技術により、最大4台のIO-LinkデバイスをI/O-Linkマスタの各ポートに接続できます。
また、ファンクションブロック、デバイス記述、WAGO I/O Check、または WAGO IO-Link Configurator を使用して、IO-Link マスタを構成およびパラメータ化できます。
プロセスデータ
750-1657 4ポートIO-Linkマスタのプロセスイメージサイズは、接続されたデバイス(スイッチ、IO-Linkデバイスなど)の数とそのデータ量に応じて調整できます。
ローカルバス側では、4 ポートのIO-Link マスタは 4, 6, 8、10、12、16、20、24、32、40、48 バイトに設定できます。(デフォルトでは、プロセスイメージのサイズは入出力データで24バイトにプリセットされており、そのうち4バイトが非周期的メールボックスに割り当てられています)
Status Bytes
こちらは750-1657 4ポートIO-Linkマスタの0バイト目のStatus Bytesの意味合いです。
Bit位置 | 変数名 | 説明 |
7 | RegCom | Register通信状態で、1=Register通信が有効 |
6 | GEN_ERR | 0=エラーなし。1=エラーあり。それはビット0〜5のうち少なくとも1つが1の場合に設定されます。 |
5 | PORT4_ERR | 0=ポート 4 に接続されたデバイスは正常状態1=ポート 4 に接続されたデバイスがエラー状態 |
4 | PORT3_ERR | 0=ポート 3 に接続されたデバイスは正常状態1=ポート 3 に接続されたデバイスがエラー状態 |
3 | PORT2_ERR | 0=ポート 2 に接続されたデバイスは正常状態1=ポート 2 に接続されたデバイスがエラー状態 |
2 | PORT1_ERR | 0=ポート 1 に接続されたデバイスは正常状態1=ポート 1 に接続されたデバイスがエラー状態 |
1 | TEMP_ERR | 0=IO-Link マスタが温度エラーまたは過負荷のアラームあり1=IO-Link マスタが温度エラーまたは過負荷のアラームなし |
0 | INT_ERR | 0=内部エラーなし。1=内部エラーがある。 |
Codesysライブラリ‐fbIOL_Call
WAGO社からWagoAppIOLinkというライブラリが提供されており、750-1657で様々な操作を行うことができます。今回の記事ははfbIOL_Callを使用し、IO-LINKデバイスのパラメータを読み書きにします。
VAR_INPUT
変数名 | タイプ | 説明 |
I_Port | WagoTypesModule_75x_657.I_Module_75x_657 | モジュールへのアクセス |
xExecute | BOOL | 立ち上げ信号でIOLコールコマンド実行開始 |
xWriteRead | BOOL | 0=読む1=書く |
bEntity | BYTE | 0=モジュールからの設定データになります。1=ポート1のデバイス、2=ポート2のデバイス |
iFI_Index | INT | Default=98、IO Linkセンサーへのアクセス |
wIOL_Index | WORD | IOリンクのインデックス、例えば16=IOリンク・メーカー名 |
bIOL_Subindex | BYTE | IOリンクのサブインデックス |
wLen | WORD | 書き込みコマンドの場合のデータ長 |
tTimeout | TIME |
VAR_IN_OUT
変数名 | タイプ | 説明 |
aIOL_Data | ARRAY [0..255] OF BYTE | コマンドによるIOLデータ |
VAR_OUT
変数名 | タイプ | 説明 |
xDone | BOOL | 1=コマンドはエラーなしで実行した |
xBusy | BOOL | 1=コマンド実行中 |
xError | BOOL | 1=コマンドがエラーで実行された |
oStatus | WagoSysErrorBase.FbResult | ステータス情報 |
typError | typIOL_PDU_Error | IO‐LINK固有のエラー詳細 |
iLenResponse | INT | 読みコマンドによる受信データ数 |
765-2701/200-000?
アナログ/IO-Linkコンバータは、従来のアナログセンサやアクチュエータをWAGO I/O System FieldのようなIO-Link対応システムに簡単に組み込むための経済的でコンパクトなデバイスです。
これにより、信頼性が高く、コスト効率に優れ、干渉を受けないアナログ信号の取得と出力が可能になります。デジタル通信は、古いシステムを近代化する際に簡単に導入(レトロフィット)できます。
また、コンバータは IO-Link を介してデバイス上で直接設定できます。
コンパクトな設計、IP67の保護等級、高い動作温度範囲により、Analog/IO-Linkコンバータは制御キャビネットのないオートメーションに最適です。
765-2701/200-000は、アナログ信号、接続されたセンサー、またはアナログ出力を持つ他のデバイスの評価に使用されます。アナログ電流入力x1、出力x2を備えています。
- 出力1はデジタル出力
- 出力2はオプションでアナログ電流出力として使用できます。
そしてスタンドアロンモードと IO-Link モードで動作可能です。
レイアウト
こちらは765-2701/200-000のLayoutです。

スタンドアローンモード(IO-Linkなし)
765-2701/200-000は、測定された電流値とパラメータ設定値を比較し、選択されたパラメータに従って出力を切り替えます。
その測定値は英数字ディスプレイに表示され、ユーザは表示された値をスケーリングすることができます(2 点スケーリング)。
注意するのはこのモードには IO-Link 機能はありません。パラメータは765-2701/200-000本体で直接設定するか、WAGO IO-Link Configurator などの IO-Link ツールを使用して設定します。
IO-Linkモード
IO-Link はインテリジェントセンサとアクチュエータをオートメーションシステムに接続するための通信システムです。IO-Link は IEC 61131-9 規格に準拠しています。
765-2701/200-000には IO-Link 通信インタフェースがあり、相互運用には IO-Link 対応モジュール(IO-Link マスタ)が必要です。IO-Link インタフェースにより、プロセスデータと診断データに直接アクセスでき、操作中に製品のパラメータを設定できます。
パラメータ
765-2701/200-000には設定できるパラメータがたくさんありますので、今回の記事では表示の色を変更できる・出力の設定範囲に関連する部分のみを説明します。
SP1/rP1
こちらはOUT1の切替点/反転切替点になります。
cFH/cFL
こちらは765-2701/200-000の表示LEDのカラー・チェンジの上限値/下限値になります。
[coLr]パラメータが[r-cF]または[G-cF]に設定されている場合は、[cFH]パラメータを選択して対応する上限値を設定し、[cFL]パラメータを選択して対応する下限値を設定する必要がある。
- 下限設定値は、パラメータ[cFL]になります。
- 上限設定値はパラメータ[cFH]になります。
プロセスデータ
こちらは765-2701/200-000のMappingになります。注意するのは、コントローラによってはバイト単位のアドレス指定時に上位バイトと下位バイトを入れ替える(SWAP)する必要があります。
IO-Link 経由パラメータ読み書き
765-2701/200-000をIO-LINKモードとして使用する場合、上位コントローラーからパラメータを読み書きできます。こちらの例ですが、Index=552、SubIndex=0でdiSパラメータにアクセスできることを確認できれば、あとはWAGO社から提供したIO-LINKライブラリを使用するのみです。
使用例
こちらは使用例になります。

Implementation
Download IODD File
こちらのLinkでWAGOの765-2701/200-000 IODD FileをDownloadしてください。
https://www.wago.com/global/i-o-systems/1-channel-analog-input/p/765-2701_200-000
Factory Reset
最初に765-2701/200-000をFactory Resetします。
右上にある丸ボタンを押し、Menu に入ります。
オレンジ枠のMenu選択ボタンを押し、”EF” 操作Menu行きます。
次はまた丸ボタンを押し、”rES ” Menuに入ります。
丸ボタンをもう一回押し、rESを選択します。
上矢印もしくは下矢印ボタンを押し、Factory Resetを行います。
デバイスの表示画面が”‐‐‐‐”に変わります。
最後はまた丸ボタンを押せば完了です。
Install WAGO IO Check
750-1657を使用するにはWAGO I/O Checkソフトウエアをインストールする必要があります。そのセットアップFILEを起動し、Next>で進みます。
ライセンスに同意し、Nextで進みます。
簡単な個人情報を入力し、Nextで進みます。
必要なソフトウエアをCHECK入れ、Installで進みます。
少々お待ちください…
Done!WAGO I/O CHECKソフトウェアをインストールできました。
Configure IO-Link Master
750−1657を構築するためには、最初にWAGOのCPU接続を設定する必要があり、Settings>Communicationをクリックします。
こちらはWAGO CPUと通信するための設定画面になります。
Connection のDrop-DownリストからWAGO CPUと通信する方法を設定します。今回の記事ではEthernet(TCP/IP)を使用します。
次はWAGO CPUのIPアドレスを設定します。
WAGO CPUのIPアドレスがわからない場合はSearch deviceをクリックし、ネットワーク内のWAGOデバイスを検索していきましょう。
検索するIPあどうレス範囲を設定し、Searchをクリックします。
Done!今回記事で使用するWAGO PFC200を検索できました。
そのPFC200を選択し、Applyボタンをクリックし設定を適用します。
もう一回Applyをクリックし設定を適用します。
ソフトウエアがPFC200接続を試します…
Done!WAGO PFC200の本体だけではなく、右側にインストールされてたIOモジュールの情報も全部吸い上げました。
こちらは今回記事で使用する750−1657ですね。
Check Process Data
750−1657を選び>右クリック>Process Dataします。
PFC200がRunモードのときはIOモジュールをアクセスすることが拒否されます。
Codesys側で一回Runtimeを止めます。
Done!先程の操作をもう一回行うと、750-1657の生データを確認できました。
Settings
次は750-1657を右クリック>Settingsを開きます。
こちらの画面で750-1657のパラメータの確認・変更できます。
Connect to 750-1657
Connectボタンをクリック、ソフトウエアと750-1657を接続します。
Read Data from 750-1657
次はReadボタンをクリックし、現在モジュールの設定を読み出します。
Save Data
Saveボタンをクリックし、現在の設定を保存できます。
Write Data to 750-1657
Writeボタンをクリックし設定を750-1657に書き込むことも可能です。
Configure Port1
次は750-1657 Port1を設定します。
Mode
Port1はIO-LINKデバイスと接続していますので、Port SelctionをPort1を選び>ModeをIO-Linkに設定します。
Install IODDs FILEに
次はIOODs FILEをツールにインストールします。IODDsをクリックします。
先ほどWAGO HP からDownloadしたIODD FileをImpotします。
Done!
Get Device Data
次は”Show IO-Link Device”をクリックし、IO-Linkデバイスのデータやパラメータを確認します。
Connectボタンをクリックし、パラメータなどを変更できます。
Events
Eventsボタンをクリックし、IO-Linkマスターの動作履歴を確認できます。
Add Codesys Library
CodesysプロジェクトにWagoAppIOLink ライブラリを追加してください。
Scan K-Bus
CodesysではWAGO社のK-BUSの自動検索もできますので、K-BUSを右クリック>Scan for Devicesします。
Done!WAGO PFC200にインストールされているデバイスを全部確認できました。
DUT
DUT_765_2701_200_000_w
こちらはWAGOのアナログIOLINK変換器に書き込むパラメータをまとめた構造体です。
TYPE DUT_765_2701_200_000_w : STRUCT iSP_FH1:INT; //index583 irP_FL1:INT; //index584 icFL:INT; //index555 icFH:INT; //index556 uicoLr:USINT; //index554 idiS:UINT; //index552 iWrite: int; END_STRUCT END_TYPE |
DUT_765_2701_200_000
こちらはWAGOのアナログIOLINK変換器に、IO-LINK経由でアクセスパラメータをまとめた構造体です。
TYPE DUT_765_2701_200_000 : STRUCT stManufacturer:STRING(19); //index16 stManufacturerText:STRING(30); //index17 stProductName:STRING(18); //index18 stProductID:STRING(10); //index19 stProductText:STRING(30); //index20 stSerialNumber:STRING(12); //index21 stHardwareVersion:STRING(5); //index22 stFirmwareVersion:STRING(5); //index23 iSP_FH1:INT; //index583 irP_FL1:INT; //index584 icFL:INT; //index555 icFH:INT; //index556 uicoLr:USINT; //index554 idiS:UINT; //index552 rCurrentValue :REAL; xOut :BOOL; writeData :DUT_765_2701_200_000_w; END_STRUCT END_TYPE |
Function Block
fb_Wago_750_1657
こちらのFBはWAGO社の4‐Port IO-Linkマスターの状態を取得できます。
FUNCTION_BLOCK fb_Wago_750_1657 VAR_INPUT inModule:WagoAppIOLink.WagoTypesModule_75x_657.I_Module_75x_657; END_VAR VAR_OUTPUT x00_INT_ERR:BOOL; x01_TEMP_ERR:BOOL; x02_PORT1_ERR:BOOL; x03_PORT2_ERR:BOOL; x04_PORT3_ERR:BOOL; x05_PORT4_ERR:BOOL; x06_GEN_ERR:BOOL; x07_REG_COM:BOOL; END_VAR VAR bStatusByte:BYTE; END_VAR |
プログラムには750-1657の0Byte目のデータ各Bitにアクセスし、必要な情報を取得します。
bStatusByte:=inModule.GetProcessInByte(0); x00_INT_ERR:=bStatusByte.0; x01_TEMP_ERR:=bStatusByte.1; x02_PORT1_ERR:=bStatusByte.2; x03_PORT2_ERR:=bStatusByte.3; x04_PORT3_ERR:=bStatusByte.4; x05_PORT4_ERR:=bStatusByte.5; x06_GEN_ERR:=bStatusByte.6; x07_REG_COM:=bStatusByte.7; |
fb_Wago_765_2701_200_000
次はWAGO社の765-721-200 アナログIOLINK変換器用のFBを作成します。
FUNCTION_BLOCK fb_Wago_765_2701_200_000 VAR_INPUT inModule:WagoAppIOLink.WagoTypesModule_75x_657.I_Module_75x_657; inPort:BYTE:=1; END_VAR VAR_OUTPUT END_VAR VAR_IN_OUT io:DUT_765_2701_200_000; END_VAR VAR arrBytes:ARRAY[0..9]OF BYTE; myWord:INT; fbIOL_CALL_Read:WagoAppIOLink.FbIOL_Call; fbIOL_CALL_Write:WagoAppIOLink.FbIOL_Call; xExecute:BOOL; xWriteRead:BOOL; aIOL_Data:ARRAY[0..255]OF BYTE; istep:INT:=0; bEntity:BYTE:=1; wIOL_Index:WORD; bIOL_Subindex:BYTE; wLen:WORD; aIOL_Data1:ARRAY[0..255]OF BYTE; iCounter:DINT; fbInitTimer:Standard.TON; fbInitStart:Standard.R_TRIG; fbTimer2:Standard.TON; xinited:BOOL; wWriteBufferWord:WORD; END_VAR |
プログラムの中ではIO‐Link経由で様々なデータを取得します。メーカー名などの情報は基本的に定数なので、最初にだけ読み込めばOKです。そのあとは必要なパラメータをLoopingで読み込んで、またHMIからデータをパラメータを変更できるようにします。
//Read Operation CASE istep OF 0: //Init fbInitTimer(IN:=TRUE,PT:=T#1S); iCounter:=0; xExecute:=FALSE; xinited:=FALSE; IF NOT fbIOL_CALL_Read.xBusy AND NOT fbIOL_CALL_Read.xError AND fbInitTimer.Q THEN istep:=10; fbInitTimer(IN:=FALSE); END_IF; 10: //stManufacturer xExecute:=TRUE; wIOL_Index:=16; bIOL_Subindex:=0; wLen:=19; IF fbIOL_CALL_Read.xDone THEN istep:=15; END_IF 15: IF fbIOL_CALL_Read.xDone THEN xExecute:=FALSE; WagoSysPlainMem.MemCopy( pDest:=ADR(io.stManufacturer) ,pSource:=ADR(aIOL_Data) ,udiSize:=TO_UDINT(fbIOL_CALL_Read.iLenResponse) ); istep:=20; END_IF 20://stManufacturerText xExecute:=TRUE; wIOL_Index:=17; bIOL_Subindex:=0; wLen:=11; IF fbIOL_CALL_Read.xDone THEN istep:=25; END_IF 25: IF fbIOL_CALL_Read.xDone THEN xExecute:=FALSE; WagoSysPlainMem.MemCopy( pDest:=ADR(io.stManufacturerText) ,pSource:=ADR(aIOL_Data) ,udiSize:=TO_UDINT(fbIOL_CALL_Read.iLenResponse) ); istep:=30; END_IF 30://stProductName xExecute:=TRUE; wIOL_Index:=18; bIOL_Subindex:=0; wLen:=6; IF fbIOL_CALL_Read.xDone THEN istep:=35; END_IF 35: IF fbIOL_CALL_Read.xDone THEN xExecute:=FALSE; WagoSysPlainMem.MemCopy( pDest:=ADR(io.stProductName) ,pSource:=ADR(aIOL_Data) ,udiSize:=TO_UDINT(fbIOL_CALL_Read.iLenResponse) ); istep:=40; END_IF 40://stManufacturerText xExecute:=TRUE; wIOL_Index:=20; bIOL_Subindex:=0; wLen:=30; IF fbIOL_CALL_Read.xDone THEN istep:=45; END_IF 45: IF fbIOL_CALL_Read.xDone THEN xExecute:=FALSE; WagoSysPlainMem.MemCopy( pDest:=ADR(io.stManufacturerText) ,pSource:=ADR(aIOL_Data) ,udiSize:=TO_UDINT(fbIOL_CALL_Read.iLenResponse) ); istep:=50; END_IF; 50://stProductID xExecute:=TRUE; wIOL_Index:=19; bIOL_Subindex:=0; wLen:=6; IF fbIOL_CALL_Read.xDone THEN istep:=55; END_IF 55: IF fbIOL_CALL_Read.xDone THEN xExecute:=FALSE; WagoSysPlainMem.MemCopy( pDest:=ADR(io.stProductID) ,pSource:=ADR(aIOL_Data) ,udiSize:=TO_UDINT(fbIOL_CALL_Read.iLenResponse) ); istep:=60; END_IF 60://stProductText xExecute:=TRUE; wIOL_Index:=20; bIOL_Subindex:=0; wLen:=30; IF fbIOL_CALL_Read.xDone THEN istep:=65; END_IF 65: IF fbIOL_CALL_Read.xDone THEN xExecute:=FALSE; WagoSysPlainMem.MemCopy( pDest:=ADR(io.stProductText) ,pSource:=ADR(aIOL_Data) ,udiSize:=TO_UDINT(fbIOL_CALL_Read.iLenResponse) ); istep:=70; END_IF 70://stSerialNumber xExecute:=TRUE; wIOL_Index:=21; bIOL_Subindex:=0; wLen:=12; IF fbIOL_CALL_Read.xDone THEN istep:=75; END_IF 75: IF fbIOL_CALL_Read.xDone THEN xExecute:=FALSE; WagoSysPlainMem.MemCopy( pDest:=ADR(io.stSerialNumber) ,pSource:=ADR(aIOL_Data) ,udiSize:=TO_UDINT(fbIOL_CALL_Read.iLenResponse) ); istep:=80; END_IF 80://stHardwareVersion xExecute:=TRUE; wIOL_Index:=22; bIOL_Subindex:=0; wLen:=2; IF fbIOL_CALL_Read.xDone THEN istep:=85; END_IF 85: IF fbIOL_CALL_Read.xDone THEN xExecute:=FALSE; WagoSysPlainMem.MemCopy( pDest:=ADR(io.stHardwareVersion) ,pSource:=ADR(aIOL_Data) ,udiSize:=TO_UDINT(fbIOL_CALL_Read.iLenResponse) ); istep:=90; END_IF 90://stFirmwareVersion xExecute:=TRUE; wIOL_Index:=23; bIOL_Subindex:=0; wLen:=2; IF fbIOL_CALL_Read.xDone THEN istep:=95; END_IF 95: IF fbIOL_CALL_Read.xDone THEN xExecute:=FALSE; WagoSysPlainMem.MemCopy( pDest:=ADR(io.stFirmwareVersion) ,pSource:=ADR(aIOL_Data) ,udiSize:=TO_UDINT(fbIOL_CALL_Read.iLenResponse) ); istep:=100; END_IF 100://iSP_FH1 xExecute:=TRUE; wIOL_Index:=583; bIOL_Subindex:=0; wLen:=SIZEOF(io.iSP_FH1); IF fbIOL_CALL_Read.xDone THEN istep:=105; END_IF 105: IF fbIOL_CALL_Read.xDone THEN xExecute:=FALSE; WagoSysPlainMem.MemCopy( pDest:=ADR(io.iSP_FH1) ,pSource:=ADR(aIOL_Data) ,udiSize:=TO_UDINT(fbIOL_CALL_Read.iLenResponse) ); WagoSysPlainMem.MemSwap(pData:=ADR(io.iSP_FH1),udiSize:=2); istep:=110; END_IF 110://irP_FL1 xExecute:=TRUE; wIOL_Index:=584; bIOL_Subindex:=0; wLen:=SIZEOF(io.irP_FL1); IF fbIOL_CALL_Read.xDone THEN istep:=115; END_IF 115: IF fbIOL_CALL_Read.xDone THEN xExecute:=FALSE; WagoSysPlainMem.MemCopy( pDest:=ADR(io.irP_FL1) ,pSource:=ADR(aIOL_Data) ,udiSize:=TO_UDINT(fbIOL_CALL_Read.iLenResponse) ); WagoSysPlainMem.MemSwap(pData:=ADR(io.irP_FL1),udiSize:=2); istep:=120; END_IF 120://icFL xExecute:=TRUE; wIOL_Index:=555; bIOL_Subindex:=0; wLen:=SIZEOF(io.icFL); IF fbIOL_CALL_Read.xDone THEN istep:=125; END_IF 125: IF fbIOL_CALL_Read.xDone THEN xExecute:=FALSE; WagoSysPlainMem.MemCopy( pDest:=ADR(io.icFL) ,pSource:=ADR(aIOL_Data) ,udiSize:=TO_UDINT(fbIOL_CALL_Read.iLenResponse) ); WagoSysPlainMem.MemSwap(pData:=ADR(io.icFL),udiSize:=2); istep:=130; END_IF 130://icFH xExecute:=TRUE; wIOL_Index:=556; bIOL_Subindex:=0; wLen:=SIZEOF(io.icFH); IF fbIOL_CALL_Read.xDone THEN istep:=135; END_IF 135: IF fbIOL_CALL_Read.xDone THEN xExecute:=FALSE; WagoSysPlainMem.MemCopy( pDest:=ADR(io.icFH) ,pSource:=ADR(aIOL_Data) ,udiSize:=TO_UDINT(fbIOL_CALL_Read.iLenResponse) ); WagoSysPlainMem.MemSwap(pData:=ADR(io.icFH),udiSize:=2); istep:=140; END_IF 140://uicoLr xExecute:=TRUE; wIOL_Index:=554; bIOL_Subindex:=0; wLen:=SIZEOF(io.uicoLr); IF fbIOL_CALL_Read.xDone THEN istep:=145; END_IF 145: IF fbIOL_CALL_Read.xDone THEN xExecute:=FALSE; WagoSysPlainMem.MemCopy( pDest:=ADR(io.uicoLr) ,pSource:=ADR(aIOL_Data) ,udiSize:=TO_UDINT(fbIOL_CALL_Read.iLenResponse) ); WagoSysPlainMem.MemSwap(pData:=ADR(io.uicoLr),udiSize:=1); istep:=150; END_IF 150://idiS xExecute:=TRUE; wIOL_Index:=552; bIOL_Subindex:=0; wLen:=SIZEOF(io.idiS); IF fbIOL_CALL_Read.xDone THEN istep:=155; END_IF 155: IF fbIOL_CALL_Read.xDone THEN xExecute:=FALSE; WagoSysPlainMem.MemCopy( pDest:=ADR(io.idiS) ,pSource:=ADR(aIOL_Data) ,udiSize:=TO_UDINT(fbIOL_CALL_Read.iLenResponse) ); WagoSysPlainMem.MemSwap(pData:=ADR(io.idiS),udiSize:=2); istep:=100; xinited:=TRUE; END_IF END_CASE //Reset while Error IF fbIOL_CALL_Read.xError THEN istep:=0; END_IF //Read the current arrBytes[1]:=inModule.GetProcessInByte(ByteNo:=6); arrBytes[0]:=inModule.GetProcessInByte(ByteNo:=7); MEMUtils.MemCpy( ADR(myWord), ADR(arrBytes[0]) ,2 ); io.rCurrentValue:=TO_REAL(myWord)/1000.0; //Read the ou1 Status arrBytes[0]:=inModule.GetProcessInByte(ByteNo:=9); io.xOut:=arrBytes[0].0; //init fbTimer2(IN:=xinited,PT:=T#0.1S); fbInitStart( CLK:=xinited AND fbTimer2.Q ); IF fbInitStart.Q THEN io.writeData.icFH:=io.icFH; io.writeData.icFL:=io.icFL; io.writeData.idiS:=io.idiS; io.writeData.irP_FL1:=io.irP_FL1; io.writeData.iSP_FH1:=io.iSP_FH1; io.writeData.uicoLr:=io.uicoLr; END_IF //Read FB fbIOL_CALL_Read( I_Port:=inModule ,xExecute:=xExecute ,xWriteRead:=xWriteRead ,bEntity:=inPort ,iFI_Index:=98 ,wIOL_Index:=wIOL_Index ,bIOL_Subindex:=bIOL_Subindex ,wLen:=wLen ,aIOL_Data:=aIOL_Data ); //Write operation CASE io.writeData.iWrite OF 1: fbIOL_CALL_Write.wIOL_Index:=556; fbIOL_CALL_Write.bIOL_Subindex:=0; fbIOL_CALL_Write.wLen:=2; WagoSysPlainMem.MemCopy( ADR(wWriteBufferWord) ,ADR(io.writeData.icFH) ,2); WagoSysPlainMem.MemSwap( ADR(wWriteBufferWord) ,udiSize:=2 ); WagoSysPlainMem.MemCopy( ADR(aIOL_Data1) ,ADR(wWriteBufferWord) ,2); 2: fbIOL_CALL_Write.wIOL_Index:=555; fbIOL_CALL_Write.bIOL_Subindex:=0; fbIOL_CALL_Write.wLen:=2; WagoSysPlainMem.MemCopy( ADR(wWriteBufferWord) ,ADR(io.writeData.icFL) ,2); WagoSysPlainMem.MemSwap( ADR(wWriteBufferWord) ,udiSize:=2 ); WagoSysPlainMem.MemCopy( ADR(aIOL_Data1) ,ADR(wWriteBufferWord) ,2); 3: fbIOL_CALL_Write.wIOL_Index:=552; fbIOL_CALL_Write.bIOL_Subindex:=0; fbIOL_CALL_Write.wLen:=2; WagoSysPlainMem.MemCopy( ADR(wWriteBufferWord) ,ADR(io.writeData.idiS) ,2); WagoSysPlainMem.MemSwap( ADR(wWriteBufferWord) ,udiSize:=2 ); WagoSysPlainMem.MemCopy( ADR(aIOL_Data1) ,ADR(wWriteBufferWord) ,2); 4: fbIOL_CALL_Write.wIOL_Index:=584; fbIOL_CALL_Write.bIOL_Subindex:=0; fbIOL_CALL_Write.wLen:=2; WagoSysPlainMem.MemCopy( ADR(wWriteBufferWord) ,ADR(io.writeData.irP_FL1) ,2); WagoSysPlainMem.MemSwap( ADR(wWriteBufferWord) ,udiSize:=2 ); WagoSysPlainMem.MemCopy( ADR(aIOL_Data1) ,ADR(wWriteBufferWord) ,2); 5: fbIOL_CALL_Write.wIOL_Index:=583; fbIOL_CALL_Write.bIOL_Subindex:=0; fbIOL_CALL_Write.wLen:=2; WagoSysPlainMem.MemCopy( ADR(wWriteBufferWord) ,ADR(io.writeData.iSP_FH1) ,2); WagoSysPlainMem.MemSwap( ADR(wWriteBufferWord) ,udiSize:=2 ); WagoSysPlainMem.MemCopy( ADR(aIOL_Data1) ,ADR(wWriteBufferWord) ,2); 6: fbIOL_CALL_Write.wIOL_Index:=554; fbIOL_CALL_Write.bIOL_Subindex:=0; fbIOL_CALL_Write.wLen:=1; WagoSysPlainMem.MemCopy( ADR(wWriteBufferWord) ,ADR(io.writeData.uicoLr) ,2); WagoSysPlainMem.MemSwap( ADR(wWriteBufferWord) ,udiSize:=1 ); WagoSysPlainMem.MemCopy( ADR(aIOL_Data1) ,ADR(wWriteBufferWord) ,2); END_CASE // IF io.writeData.iWrite >0 THEN fbIOL_CALL_Write.xExecute:=TRUE; IF fbIOL_CALL_Write.xDone OR fbIOL_CALL_Write.xError THEN io.writeData.iWrite:=0; fbIOL_CALL_Write.xExecute:=FALSE; END_IF END_IF; //Write FB fbIOL_CALL_Write( I_Port:=inModule ,bEntity:=inPort ,xWriteRead:=TRUE ,aIOL_Data:=aIOL_Data1 ); |
GVL
WAGO社のアナログ→IOLINK変換器のデータを保存するGlobal 変数を宣言します。
{attribute ‘qualified_only’} VAR_GLOBAL Devices1:DUT_765_2701_200_000; END_VAR |
MAIN
MAINプログラムで先ほど作成したFBのInstanceを宣言し、呼び出します。
PROGRAM PLC_PRG VAR FB1:fb_Wago_765_2701_200_000; _750_1657:fb_Wago_750_1657; END_VAR |
_750_1657(inModule:=IoConfig_Globals.IOLINk1); FB1( inModule:=IoConfig_Globals.IOLINk1 ,inPort:=1 ,io:=GVL.Devices1 ); |
Visualization
次はCodesysのHMI画面を作成していきましょう。
Add WebVisu
CodesysプロジェクトにVisualization ManagerとWebVisuを追加してください。
Enable Webvisu
WAGO PFC200のWeb Serverにアクセスし、Ports and Services>PLC Runtime Servicesで下図のOptionsを有効にしてください。
次はConfiguration>PLC Runtime>Webserver Configuration>Defaultを”WebVisu”に設定します。
vt_765_2701_200_000
こちらは765-2701/200-000の操作Templateです。
VAR_IN_OUT io:DUT_765_2701_200_000; END_VAR |
vMain
次はWebVisuのDefault ページに先ほど宣言したTempateを追加し、パラメータをGVLに宣言した変数と繋がりましょう。
Set Default Page
Visualization>WebVisu>Start VisualizationでDefaultの起動画面を設定しましょう。
Login
プログラムをPFC200にDownloadしましょう。
Result
こちらはIO-Link マスターとIO-LINKデバイス間が正常に接続してるときのStatus Wordです。
こちらはIO-Link マスターPort 1とIO-Linkデバイス間が通信エラー発生したときのStatus Wordです。
次はPFC200のCodesys WebVisuにアクセスしましょう。
https://IPADDRESS:8081/webvisu/webvisu.htm
UsernameとPasswordを入力しLoginしてください。
Done!
こちらの動画から動作確認できます。
Wago.playing with 750-1657,Analog/IO-Link Converter and Codesys
Project Download
こちらのLinkで今回記事で作成したプロジェクトをDownloadできます。
https://github.com/soup01Threes/Codesys/blob/main/Project_Wago_750-8215.projectarchive