Wago#750-1657 4ポートIO-Link マスターを使ってみよう

今回の記事では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

皆様のサポートが、私たちの活動をより充実させる力となります。

どうぞよろしくお願いします。

メールアドレス(*=@)

soup01threes*gmail.com

X

https://x.com/3threes2

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位置変数名説明
7RegComRegister通信状態で、1=Register通信が有効
6GEN_ERR0=エラーなし。1=エラーあり。それはビット0〜5のうち少なくとも1つが1の場合に設定されます。
5PORT4_ERR0=ポート 4 に接続されたデバイスは正常状態1=ポート 4 に接続されたデバイスがエラー状態
4PORT3_ERR0=ポート 3 に接続されたデバイスは正常状態1=ポート 3 に接続されたデバイスがエラー状態
3PORT2_ERR0=ポート 2 に接続されたデバイスは正常状態1=ポート 2 に接続されたデバイスがエラー状態
2PORT1_ERR0=ポート 1 に接続されたデバイスは正常状態1=ポート 1 に接続されたデバイスがエラー状態
1TEMP_ERR0=IO-Link マスタが温度エラーまたは過負荷のアラームあり1=IO-Link マスタが温度エラーまたは過負荷のアラームなし
0INT_ERR0=内部エラーなし。1=内部エラーがある。

Codesysライブラリ‐fbIOL_Call

WAGO社からWagoAppIOLinkというライブラリが提供されており、750-1657で様々な操作を行うことができます。今回の記事ははfbIOL_Callを使用し、IO-LINKデバイスのパラメータを読み書きにします。

VAR_INPUT

変数名タイプ説明
I_PortWagoTypesModule_75x_657.I_Module_75x_657モジュールへのアクセス
xExecuteBOOL立ち上げ信号でIOLコールコマンド実行開始
xWriteReadBOOL0=読む1=書く
bEntityBYTE0=モジュールからの設定データになります。1=ポート1のデバイス、2=ポート2のデバイス
iFI_IndexINTDefault=98、IO Linkセンサーへのアクセス
wIOL_IndexWORDIOリンクのインデックス、例えば16=IOリンク・メーカー名
bIOL_SubindexBYTEIOリンクのサブインデックス
wLenWORD書き込みコマンドの場合のデータ長
tTimeoutTIME

VAR_IN_OUT

変数名タイプ説明
aIOL_DataARRAY [0..255] OF BYTEコマンドによるIOLデータ

VAR_OUT

変数名タイプ説明
xDoneBOOL1=コマンドはエラーなしで実行した
xBusyBOOL1=コマンド実行中
xErrorBOOL1=コマンドがエラーで実行された
oStatusWagoSysErrorBase.FbResultステータス情報
typErrortypIOL_PDU_ErrorIO‐LINK固有のエラー詳細
iLenResponseINT読みコマンドによる受信データ数

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

Footer_Basic

Please Support some devices for my blog

Amazon Gift List

Find ME

Twitter:@3threes2
Email:soup01threes*gmail.com (* to @)
YoutubeChannel:https://www.youtube.com/channel/UCQ3CHGAIXZAbeOC_9mjQiWQ

シェアする

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

フォローする