こちらは新しいシリーズの記事で、StratonというSoftware PLCを使って様々なテストを展開します。今回はStraton RuntimeにEthernet/IP Adapterを立ち上げ、Pilz者のIndustrial PIにあるCodesysとEthernet/IPで接続します。
さ、FAを楽しもう。

Reference Link
http://soup01.com/ja/category/pilz/industrialpi/
http://soup01.com/ja/category/straton/
前書き
いつも私の技術ブログと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
Function Block
最初に今回記事で使用したFB/FCを紹介します。
eipAdapter
こちらのFBはEthernet/IP Scanner接続の現在の状態に関する情報を提供します。このBlockはEthernet/IP Adpaterとして構築されたもののみに使用でき、またInputs がないので、自動的にプロジェクト内のアダプタを参照します。
VAR_OUTPUTS
変数 | データ・タイプ | 説明 |
Run | BOOL | TRUE=EIP Stackが実行中 |
IOcnx | BOOL | TRUE=スキャナと I/O 接続が確立されている |
PWM
こちらのFBはPWM信号を生成でき、入力値は[XinMin … XinMax]区間で切り捨てられます。また、XinMax は XinMin より大きくする必要があります。
こちらはPWM FBの計算式です。
(Xin – XinMin) * Period / (XinMax – XinMin) |
VAR_INPUTS
変数 | データ・タイプ | 説明 |
XIN | REAL | 入力アナログ値 |
XinMin | REAL | 最小入力値 |
XinMax | REAL | 最大入力値 |
MinPulse | TIME | 出力の最小パルス時間 |
Period | TIME | 出力信号の周期 |
VAR_OUTPUTS
変数 | データ・タイプ | 説明 |
Q | BOOL | PWM信号 |
Ramp
こちらは信号の上昇または下降を制限するFBになります。注意するのはパラメータは常時更新されるわけではなく、また以下の場合にのみ考慮する必要があります。これら2つの状況では、出力はIN入力の値に設定されます。
- このブロックが最初に呼ばれたとき。
- リセット入力(RST)が TRUE のとき。
ASCとDSCは、TB期間中にアセンダントとディセンダントの信号上昇または下降を最大化します。注意するのはいずれも正の数で表示する必要があります。
LD言語では、入力ラング(EN)がTRUEである場合にのみ操作が実行され、出力ラング(ENO)は入力ラングと同じ値を維持します。
こちらはRAMP FBの動作FLOWです。
VAR_INPUTS
変数 | データ・タイプ | 説明 |
IN | REAL | 入力信号 |
ASC | REAL | タイムベース中の最大上昇率 |
DSC | REAL | タイムベース中の最大降下量 |
TM | TIME | 時間ベース |
RST | BOOL | リセット |
VAR_OUTPUTS
変数 | データ・タイプ | 説明 |
OUT | REAL | RAMP出力 |
SerializeOut
SerializeOut関数を利用し、変数の値をバイナリーフレームにコピーできます。この関数は、バイナリ形式の通信フレームを構築するために一般的に使用されています。
また、ラダー言語では、入力ラング(EN)がTRUEである場合にのみ操作が実行され、出力ラング(ENO)は入力ラングと同じ値を維持します。
注意するのはFRAME入力は、データを受け取るのに十分な大きさの配列でなければなりません。データを宛先バッファにコピーできない場合、関数は0を返します。そして文字列変数の使用はできません。
この関数は、以下のバイト数を宛先フレームにコピーしていますので、転送先と転送元のデータタイプに気をつけましょう。
- BOOL、SINT、USINT、BYTE 変数の場合は 1 バイト
- INT、UINT、WORD変数の場合は2バイト
- DINT、UDINT、DWORDおよびREAL変数の場合は4バイト
- LINTおよびLREAL変数は8バイト
VAR_INPUTS
変数 | データ・タイプ | 説明 |
FRAME | USINT | 宛先バッファ – 配列でなければならない |
DATA | ANY(*) | コピー元の変数。 |
POS | DINT | コピー元の配列Index |
BIGENDIAN | BOOL | TRUE=BIG Endian Format |
VAR_OUTPUTS
変数 | データ・タイプ | 説明 |
NEXTPOS | DINT | コピーされたデータのコピー先バッファ内の位置。エラー(無効な位置/バッファサイズ)の場合は0になります。 |
Rand
こちらは乱数を生成するFBです。
VAR_INPUTS
変数 | データ・タイプ | 説明 |
xRun | USINT | TRUE=乱数生成する |
randBas | ANY(*) | 乱数のベース |
VAR_OUTPUTS
変数 | データ・タイプ | 説明 |
xOK | BOOL | TRUE=乱数生成OK |
RandQ | REAL | 乱数出力値 |
Implementation
Straton Side
Configure Ethernet/IP Adapter
Add Fieldbus Configurations
もしStratonプロジェクトにFieldbus Configurationが見つからない場合は、Shortcuts>Fieldbus Configurationで項目を追加してください。
Done!
Insert Local Ethernet/IP Adapter
次はStratonプロジェクトにEthernet/IP Adpaterを追加します。
Ethernet/IP(ODVA)>Ethernet/IP Adapter(Server)を選択してください。
Done!Ethernet/IP Adapterが追加されました。
Insert Instance Outputs O→T
次はStratonのEthernet/IP AdapterにInstanceを追加するために、右クリック>Insert Slave/Data Blockをクリックします。
今回はEthernet/IPと入出力データ両方も交換したいので、TypeをI/O :Outputsを選択します。
次はIdentificationにInstance番号とデータ交換するサイズを設定します。
今回の記事ではInstance=100、Size=32バイトに構築します。
Done!
Insert Instance Inputs T→O
次はStraton のEthernet/IP Adpaterの入力データ(T→O)を定義するために、Insert Slave/Data Blockをクリックします。
今度はI/O :Inputsを選択し、Instance番号を100、データサイズは32バイトに設定します。
Done!
Global Variables
今回の記事はStraton IDEのWorkspaceから直接グローバル変数を定義するために、Variablesをクリックします。
こちらはStratonプロジェクトのすべてのPOUやグローバル変数を定義できる画面です。
Global variableを選択した状態で右クリック>Add Variableで新しい変数を追加します。
今回はEthernet/IP AdpaterとMappingするために32Bytesの配列を2つ追加しました。
Mapping
今度はMappingを行います。先程Fidlbusを構築する画面に行って、Instanceを選択し>右クリック>Insert Variableします。
Variableの選択画面が表示されます。
先ほど定義したグローバル変数を選択しましょう。
Done!
こちらは今回記事でMappingした変数です。通信確認をするために、入出力データの初めてと最後のデータにも使用します。
Program
次はPLCプログラムを書きます。今回はフリーラダーを使用します。
こちらは今回記事で作成したプログラムです。
Variables
こちらはプログラムに定義された変数です。
Network1
ネットワーク1はStarton RuntimeのEthernet/IP Adapter接続状態を確認します。
Network2
ネットワーク2はCodesys Runtimeから受け取ったPWM値をPWM関数に出力します。
Network3
ネットワーク3はCodesys Runtimeから受け取ったRAMP設定値をRMAP関数に出力します。
Network4
ネットワーク4はCodesys Runtimeから受け取った乱数Base設定値をRAND関数に出力します。
Codesys Side
次はCodesys側を構築します。
Add Ethernet Driver
Ethernet>右クリック>Add Deviceで新規Ethernet/IP Scannerを追加します。
Fieldbus>Ethernet/Ip Scannerを選択し、Add DeviceでEthernet/IP Scannerを追加しましょう。
Done!
Add Generic
StratonのEthernet/Ip Adpaterと接続するにはEDS Fileなくてもできますので、Generic Ethernet/IP Deviceを選び>Add Devicesで追加します。
Done!
次はEthernet/IP Adapterの設定画面を開きます。
Ethernet/IP Adapter IP Address
先ほど追加したGeneric Ethernet/IP Adapterをダブルクリックし、Straton RuntimeがインストールされているPCのIPアドレスを設定してください。
Electronic Keying
今回はGeneric Ethernet/Ip デバイスを使用しますので、Vendor IDのCheckを外します。
Configure Connection
今度はConnection画面を開き、Straton Ethernet/Ip Adpaterと接続するためのConnectionを設定します。
Add Connectionをクリックし、新たなConnectionを作成します。
こちらはCodesys Ethernet/IP接続の設定画面になります。
Straton RuntimeのEthernet/Ip Adpater設定に合わせて数のように設定します。
Mapping
今度はMappingです。Ethenret/IP Mappingを開き、入出力データの先頭アドレスを固定します。
Add GVL
GVLを追加します。
GVL名を入力し、Addで進みます。
Ethernet/Ipの接続に合わせて32 Bytesの入出力変数を定義します。
{attribute ‘qualified_only’} VAR_GLOBAL gArrEIPIN AT %IB0 :ARRAY[0..31]OF BYTE; gArrEIPOut AT %QB0 :ARRAY[0..31]OF BYTE; END_VAR |
Program
最後はプログラムを作成します。MEM.MemMove関数を使用し、RAMP・PWM・乱数設定値をEthernet/IP経由でStarton Runtimeに転送します。
PROGRAM PLC_PRG VAR rPWMSetPoint:REAL:=20.0; rRampUPSetPoint:REAL:=100.0; rRampUPCurrentPoint:REAL:=0; diRandBase:DINT:=10; diRandNumber:DINT:=0; END_VAR MEM.MemMove( pSource:=ADR(rPWMSetPoint) ,pDestination:=ADR(GVL.gArrEIPOut) ,uiNumberOfBytes:=SIZEOF(rPWMSetPoint) ); MEM.MemMove( pSource:=ADR(rRampUPSetPoint) ,pDestination:=ADR(GVL.gArrEIPOut[4]) ,uiNumberOfBytes:=SIZEOF(rRampUPSetPoint) ); MEM.MemMove( pSource:=ADR(GVL.gArrEIPIN[4]) ,pDestination:=ADR(rRampUPCurrentPoint) ,uiNumberOfBytes:=SIZEOF(rRampUPCurrentPoint) ); MEM.MemMove( pSource:=ADR(diRandBase) ,pDestination:=ADR(GVL.gArrEIPOut[28]) ,uiNumberOfBytes:=SIZEOF(diRandBase) ); MEM.MemMove( pSource:=ADR(GVL.gArrEIPIN[28]) ,pDestination:=ADR(diRandNumber) ,uiNumberOfBytes:=SIZEOF(diRandNumber) ); |
Login
プロジェクトをDownloadします。
Result
Done!CodesysのEthernet/IP ScannerがStraton RuntimeのEthernet/IP Adapterと接続できました。
Ethernet/IPのLog画面でも接続情報を確認できます。