こちらは新しいシリーズで、OTeeというVirtual PLCを使用し様々な記事を展開します。第7話ではOTee Platform上でEthernet/IP Scannerを立ち上げ、WAGOのEthernet/IPカプラー750−363と接続します。
また、これからはOTeeのVirtual PLCをBerghofのMC-Pi Proにインストールし、記事を展開します。
さ、FAを楽しもう。

Referece Link
http://soup01.com/ja/category/otee/
前書き
いつも私の技術ブログと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
技術はひとりじゃもったいない。
750-363?
750-363 EtherNet/IPフィールドバス・カプラーは、EtherNet/IPフィールドバスシステムをモジュラー式WAGO I/Oシステムに接続します。また、フィールドバス・カプラーは接続されたすべてのI/Oモジュールを検出し、ローカルプロセスイメージを作成します。
750-363は2つのイーサネットインタフェースと内蔵スイッチにより、フィールドバスをライントポロジーで配線でき、スイッチやハブなどの追加ネットワークデバイスが不要となります。
さらにDIPスイッチはIPアドレスの最終バイトを設定し、IPアドレスの割り当て(DHCP、BootP、静的)に使用できます。
このカプラーは、EtherNet/IPネットワークにおけるフィールドバス通信用に設計されています。また、HTTP(S)、BootP、DHCP、DNS、SNMP、(S)FTPなど、多様な標準イーサネットプロトコルをサポートします。内蔵のWebサーバーは、カプラーの状態情報を表示しながら、ユーザー設定オプションを提供します。

DIP switch
8極DIPスイッチは、IPアドレス設定のプロトコルを選択するために使用されます。
また、アドレス選択スイッチとして、IPアドレスを設定するため。IPアドレスは、ネットワーク部分とホスト部分で構成されています。


Specification
こちらはWAGO 750−363 Ethernet/IPカプラーの仕様です。

Implementation
Wago Side
最初にWAGO のEthernet/IPカプラーから設定します。

Web Server
最初にDIPスイッチから固定のIPアドレスに設定し、WAGOのEthernet/IPカプラー750−363のWeb Serverにアクセスします。

Network Ethernet
Network→Ethernetをクリックします。

Ethernetの設定を変更したい場合はLoginが必要です。こちらはカプラーのDefault設定です。
- Username:admin
- password
- Username:user
- password:user

Done!この画面からPORTの有効・無効などの設定が可能です。

IP Configuration
次はEthernet/IP カプラーのIPアドレスなどを変更したいので、Network→TCP/IPをクリックします。

こちらはTCP/IPの設定画面になります。

IPアドレスを設定し、SUBMITで設定を有効にしましょう。

また、IP configuration sourceをStaticに設定すること忘れないでください。

Done!IPアドレス変更できました。

Fieldbus
次はWAGOのEthernet/IP カプラーのEthernet/IP設定を確認します。Fieldbus→Ethernet/IPをクリックします。

今回は750−1417と750−1515だけ使用していますので、Assembly InformationとI/O Mapping Informationからサイズ1Byteのみに設定されています。

OTee Side
次はOTee側を設定します。

Ethernet/IP設定を追加
OTeeのPlatformにアクセスし、プロジェクトの中にある+ボタンをクリックします。

新しい項目の追加画面が表示されます。

Drop-listからDriver Configを設定します。

次はDriverのDrop-listからEtherNet/IPを設定します。

Saveで設定を適用します。

クライアントを追加
次はEthernet/IPの設定画面を開き、”Add a Client”で新しいEthernet/IP Adapterを追加します。

Done!これで新しいEthernet/IP Adapterが追加されました。

リモートIPアドレス
Remote IP Address欄でBeckhoff TwinCAT3側で設定したIPアドレスに合わせてください。

先ほどのWAGO Ethernet/IPカプラーに合わせて設定してください。

Connect Configuration
これからWAGO←→OTEE Runtime間のEthernet/IP 設定を行います。

Connection Config
最初にClass1 Configの通信設定を行います。
Module Config Instance
Module Config Instanceは1でOKです。

Module Config data size
Module config data sizeは0にします。

T→O
次はT→O入力データ部分を設定します。

Assembly Instance
T→OのAssembly Instance番号は108に設定します。

先程WAGOの750−363のWeb ServerからInstance108はDIデータのみだと示しています。

Data Size
Data Sizeは1に設定します。

Data rate
通信周期はアプリケーションに合わせて設定してください。

O→T
今後はO→T出力データ側を設定しましょう。

Assembly Instance
Assembly Instance番号を102に設定します。

先程WAGOの750−363のWeb ServerからInstance102はDOデータのみだと示しています。

Data Size
Data Sizeは1に設定します。

先程WAGOの750−363のWeb ServerからInstance102はDOデータサイズは1だと示しています。

Data rate
通信周期はアプリケーションに合わせて設定してください。

Run program header
出力データはRun program headerのCheckboxを入れて下さい。

Rename the Tags
最後はEthernet/IPのSymbol名を設定しましょう。

Configuration
次はGlobal 変数を宣言するためにConfigurationをクリックします。

今回の記事では下図のように2つのGlobal変数を定義します。

先程Ethernet/IPで定義したSYMBOLとLinkさせましょう。

Program
今度はプログラムを作成します。
Data Type-dut_wago_750_4xx_8Points
こちらは8点データを表す構造体です。

Function-fcGetBitFromByte
こちらはByte変数からあるBit位置の現在値(TRUEもしくはFALSE)を取得する関数です。

case iPos of
0:
fcGetBitFromByte := (iByte AND 1) <> 0;
1:
fcGetBitFromByte := (iByte AND 2) <> 0;
2:
fcGetBitFromByte := (iByte AND 4) <> 0;
3:
fcGetBitFromByte := (iByte AND 8) <> 0;
4:
fcGetBitFromByte := (iByte AND 16) <> 0;
5:
fcGetBitFromByte := (iByte AND 32) <> 0;
6:
fcGetBitFromByte := (iByte AND 64) <> 0;
7:
fcGetBitFromByte := (iByte AND 128) <> 0;
end_case;
Function-fcSetBitToByte
こちらはByte変数からあるBit位置の現在値(TRUEもしくはFALSE)に変更する関数です。

case iusiPos of
0:
if ixSetReset then
iobData := iobData OR 1;
else
iobData := iobData AND 254;
end_if;
1:
if ixSetReset then
iobData := iobData OR 2;
else
iobData := iobData AND 253;
end_if;
2:
if ixSetReset then
iobData := iobData OR 4;
else
iobData := iobData AND 251;
end_if;
3:
if ixSetReset then
iobData := iobData OR 8;
else
iobData := iobData AND 247;
end_if;
4:
if ixSetReset then
iobData := iobData OR 16;
else
iobData := iobData AND 239;
end_if;
5:
if ixSetReset then
iobData := iobData OR 32;
else
iobData := iobData AND 223;
end_if;
6:
if ixSetReset then
iobData := iobData OR 64;
else
iobData := iobData AND 191;
end_if;
7:
if ixSetReset then
iobData := iobData OR 128;
else
iobData := iobData AND 127;
end_if;
end_case;
Function Block-fb_Wago_7501417
こちらはWAGOの750−1417の8点入力モジュール用のFBです。

dutIO.x00:=fcGetBitFromByte(iByte:=iByte0,iPos:=0);
dutIO.x01:=fcGetBitFromByte(iByte:=iByte0,iPos:=1);
dutIO.x02:=fcGetBitFromByte(iByte:=iByte0,iPos:=2);
dutIO.x03:=fcGetBitFromByte(iByte:=iByte0,iPos:=3);
dutIO.x04:=fcGetBitFromByte(iByte:=iByte0,iPos:=4);
dutIO.x05:=fcGetBitFromByte(iByte:=iByte0,iPos:=5);
dutIO.x06:=fcGetBitFromByte(iByte:=iByte0,iPos:=6);
dutIO.x07:=fcGetBitFromByte(iByte:=iByte0,iPos:=7);
Function Block-fb_Wago_7501515
こちらはWAGOの750−1515の8点出力モジュール用のFBです。

_xTemp:=fcSetBitToByte(iusiPos:=0,ixSetReset:=dutIO.x00,iobData:=oByte0);
_xTemp:=fcSetBitToByte(iusiPos:=1,ixSetReset:=dutIO.x01,iobData:=oByte0);
_xTemp:=fcSetBitToByte(iusiPos:=2,ixSetReset:=dutIO.x02,iobData:=oByte0);
_xTemp:=fcSetBitToByte(iusiPos:=3,ixSetReset:=dutIO.x03,iobData:=oByte0);
_xTemp:=fcSetBitToByte(iusiPos:=4,ixSetReset:=dutIO.x04,iobData:=oByte0);
_xTemp:=fcSetBitToByte(iusiPos:=5,ixSetReset:=dutIO.x05,iobData:=oByte0);
_xTemp:=fcSetBitToByte(iusiPos:=6,ixSetReset:=dutIO.x06,iobData:=oByte0);
_xTemp:=fcSetBitToByte(iusiPos:=7,ixSetReset:=dutIO.x07,iobData:=oByte0);
MAIN
最後はMAINプログラムに、先ほど宣言したGlobal変数を外部変数として使用します。

こちらは今回記事で作成した構造体とFBの変数です。

今回記事のプログラムは単なるあるDI入力がTRUEになったら、そのまま同じ番号DOに出力します。
fbWago750363Slot1(
(* Inputs *)
iByte0 := gEIPWAGO750363Input0,
(* InOuts *)
dutIO := stWago750363Slot1
(* Outputs *)
);
fbWago750363Slot2(
(* Inputs *)
(* InOuts *)
dutIO := stWago750363Slot2,
(* Outputs *)
oByte0 => gEIPWAGO750363Output0
);
stWago750363Slot2.x00:=stWago750363Slot1.x00;
stWago750363Slot2.x01:=stWago750363Slot1.x01;
stWago750363Slot2.x02:=stWago750363Slot1.x02;
stWago750363Slot2.x03:=stWago750363Slot1.x03;
stWago750363Slot2.x04:=stWago750363Slot1.x04;
stWago750363Slot2.x05:=stWago750363Slot1.x05;
stWago750363Slot2.x06:=stWago750363Slot1.x06;
stWago750363Slot2.x07:=stWago750363Slot1.x07;
Download
最後はプロジェクトをOTee RuntimeにDownloadしてください。
結果
こちらの動画から動作確認できます。