Project#Pilz CPU x Omron NX CPU with Modbus TCP Connection

こちらの記事ではPilz CPUでModbus TCP/IP Serverを立ち上げ、Omron NX CPUからModbus TCP Clientのプログラムを組んでアクセスします。Omron のManualはほぼSTで自分も最初にSTで書こうと思いますが、あえてラダーを書いてみました。よろしくおねがいします。

Thanks!

この記事が出来上がったのはオムロン株式会社さまとPilz Japan.さまから機材を貸してくださったおかけです。誠にありがとうございます。

オムロン株式会社

オムロン株式会社は、オートメーションのリーディングカンパニーとして、工場の自動化を中心とした制御機器、電子部品、駅の自動改札機や太陽光発電用パワーコンディショナーなどの社会システム、ヘルスケアなど多岐にわたる事業を展開し、約120の国と地域で商品・サービスを提供しています。

こちらはオムロン株式会社のホームページです。

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

https://www.omron.com/jp/ja/

PILZ

PILZは安全およびオートメーション技術のソリューションでトータルソリューションサプライヤとしてのFA現場を支え、人の安全だけではなく、機械、および環境の安全を保証し、機械や設備をいかに安全に稼働させます。ピルツは全世界に42の現地法人や支社を設置し、包装、自動車産業、ロボットアプリケーション、さらに風力発電、鉄道技術など様々な分野で活躍しています。

Office:

ピルツジャパン株式会社

〒222-0033

横浜市港北区新横浜3-17-5

いちご新横浜ビル 4階

HP

https://www.pilz.com/ja-JP

Reference Link

http://soup01.com/ja/category/omron%e3%82%aa%e3%83%a0%e3%83%ad%e3%83%b3/

http://soup01.com/ja/category/pilz/

Pilz

IP Connections?

PSS4000システムでは、IP Connectionsを使用することにより、CPUと3rd Partyデバイス間でModbus TCP/Raw TCP/Raw UDPで通信可能になります。PSS4000システムの視点からみるとそれらのConnectionは全て外部通信です。

Max Number of IP connections?

PSS4000システムの最大IP Connections数はツールから設定できますが、32を超えることができません。ですが、SafetyNet p ConnectionsはIP Connectionsに管理されていませんので、Connections数とて計算されません。

IP Connections Name?

プロジェクト内のIP Connectionsの名前は必ず重複しないようにしてください。

Local Port Number?

プロジェクト内のIP Connectionsで使用するLocal Port(CPU本体)も必ず重複しないようにしてください。CPUでは1つのPortと1つのIP Connectionは1対1の関係で、Raw TCP/UDPを使用するとき該当するPortはすでに別のSerivcesに占有されたかを確認しておきましょう。(そしてRaw TCP/UDP Servicesで使用できるPort番号は1024から5000まで、UDPは49152から65535までになります)

Modbus TCP 

Data Area(Server)

こちらはPSS4000 システム Modbus TCP Server SideのData Areaになります。注意するのはPSS4000は0からスタートですが、メーカーにより1からスタートの場合もございますので、注意してください。

Data AreaModbus SynataxR/WRangeExample
Coils(Bit)0x[xxxxx]Read/Write可能0x00000から0x65535まで0x01234
Discrete Inputs(Bit)1x[xxxxx]Readのみ0x00000から0x65535まで1×5123
Input Register(Word 16 bit)3x[xxxxx]Readのみ0x00000から0x65535まで3×0111
Holding Register(Word 16 bit)4x[xxxxx]Read/Write可能0x00000から0x65535まで4×1234

Function Codes

こちらはClient側PSS4000のModbus TCP Serverデータにアクセスする際、使用するFunction Codeです。

Data AreaData LengthFC(Writing From Client)FC (Reading From Client)
0x[xxxxx] Coils=1BitFC=05(Write Single Coil)FC=01(Read Coil,Range:1-2000)
0x[xxxxx] Coils>1BitFC=15(Write Multiple Coils,1-1968)FC=01(Read Coil,Range:1-2000)
1x[xxxxx]Discrete Input>=1BitFC=02(Read Discrete Input,Range:1-2000)
3x[xxxxx]Read Input Register>=1WordFC=04(Read Input RegisterRange:1-125)
4x[xxxxx]Read Holding Register=1WordFC=06(Write Single RegisterRange:1-123)FC=03(Read Holding RegisterRange:1-125)
4x[xxxxx]Read Holding Register>1 WordFC=16(Write Multiple RegisterRange:1-123)FC=03(Read Holding RegisterRange:1-125)

Implementation

Pilz Side

PAS4000を起動し、Hardware ConfigurationからIP Connectionsをクリックします。

Connectionsの設定画面が表示されています。

New Modbus/TCP Server

”New Modbus/TCP Server”をクリックしPilz CPUから新しいModbus/TCP Serverを構築します。

Done!Severが作成され、Registerの設定画面が見えました。

Server 

Network Settings

Connection name

そのIP Connectionsの名前です。

Local Port Number

Range:1-65535、Defaultは502です。Modbus TCP Clientを構築する際は、このPort番号に合わせてください。

Remote IP address

Defaultは0.0.0.0です。接続可能なModbus TCP Client IPです。0.0.0.0であればすべてのIPも接続可能です。

Remote Port number

Range:0-65535、Defaultは0です。接続可能なModbus TCP Client Port番号です。0であればすべてのPortも接続可能です。

Keep alive settings

Enable keep alive

Check=Keep Aliveします。

Keep alive time[ms]

ServerとClientの間でデータTrafficがないとき、最大のKeep Alive時間です。

Keep alive interval[ms]

ServerとClientの間の最大のKeep Alive メッセージ待ち時間です。

Connecton timeout

PSS4000システムはClientからMonitor時間内で返答がこない場合、Timeoutとして検知できます。計算は:Timeout=(Number of Connection cycles)*(Connection cycle time)

Enable Connection Timeout

CheckするとTimeoutを監視します。

Connection Cycle

Timeout検知するためのConnection cycle数。

Server Allocation Table

PSS4000システムの各Allocatonのサイズ・Start Addressを設定できます。

Program

PROGRAM POU_2
VAR
ModbusCoil00_Read AT %i*:ARRAY[0..99]OF BOOL;
ModbusCoil00_Write AT %Q*:ARRAY[0..99]OF BOOL;
ModbusCoil01_Write AT %Q*:ARRAY[0..99]OF BOOL;
ModbusRegister03_Write AT %Q*:ARRAY[0..99]OF WORD;
ModbusRegister04_Write AT %Q*:ARRAY[0..99]OF WORD;
ModbusRegister04_Read AT %I*:ARRAY[0..99]OF WORD;
b1,b2:BOOL;
w1,w2:WORD;
END_VAR

//Read Coils Function Code01
ModbusCoil00_Write[0]:=TRUE;
ModbusCoil00_Write[99]:=TRUE;

//Read Discrete Inputs Code02
ModbusCoil01_Write[1]:=TRUE;
ModbusCoil01_Write[98]:=TRUE;

//Write Multiple Coils Code15
b1:=ModbusCoil00_Read[0];
b2:=ModbusCoil00_Read[99];

//
w1:=ModbusRegister04_Read[0];
w2:=ModbusRegister04_Read[99];

//Read Input Register Code04
ModbusRegister03_Write[0]:=WORD#99;
ModbusRegister03_Write[99]:=WORD#123;

//Read Holding Register Code 03
ModbusRegister04_Write[0]:=WORD#56;
ModbusRegister04_Write[99]:=WORD#912;

END_PROGRAM

Mapping

プログラム準備が終わったら次はI/O Mappingを行います。

IP ConnectionsでModbus TCP Serverの各Registerが表示されるはずです。

しっかり間違えないようにMappingをしましょう。

Omron Side

こちらは自分が使用するSysmac Studio Versionです。

VAR

次はOmron NX CPUでEthernet通信を使用するとき必要な変数を紹介します。

_EIP_EthXXOnlineSta

Variable NameTypeDescription
_EIP_EthOnlineStaBOOLTrue=NX CPU 内蔵のEthernet/IP Portが使用可能になります。
_EIP1_EthOnlineStaBOOLTrue=NX CPU 内蔵のEthernet/IP Port1使用可能が使用可能になります。
_EIP2_EthOnlineStaBOOLTrue=NX CPU 内蔵のEthernet/IP Port2使用可能が使用可能になります。
_EIPIn1_EthOnlineStaBOOLTrue=NY CPU 内蔵のEthernet/IP Port1使用可能が使用可能になります。

Socket

Variable NameTypeDescription
HandleUDINT0=すべでのTCP接続をCloseします。
SrcAdr_sSOCKET_ADDRESSNX CPUのLocal IPとPort番号
DstAdr_sSOCKET_ADDRESSRemote ServerのIPとPort番号
_sSOCKET_ADDRESS
Variable NameTypeDescription
PortNoUINTPort番号
IpAdrStringIPアドレス

_eMDB_FUN

Enum NameRangeData Type
_MDB_READ_COILSRead Outputs(Bit,1-2000)Bool/Bool配列
_MDB_READ_DISCRETE_INPUTSRead Inputs(Bit,1-2000)Bool/Bool配列
_MDB_READ_HOLDING_REGISTERSRead Holding Register(Word,1-125)Word/Word配列
_MDB__READ_INPUT_REGISTERSRead Input Register(Word,1-125)Word/Word配列
_MDB_WRITE_SINGLE_COILWrite Single Coils(Bit,1)Bool/Bool配列
_MDB_WRITE_SINGLE_REGISTERWrite Holding Register(Word,1)Word/Word配列
_MDB_WRITE_MULTIPLE_COILSWrite multiple outputs (Bit,1968)Bool/Bool配列
_MDB_WRITE_MULTIPLE_REGISTERSWrite multiple holding registers (Word,123)Word/Word配列

Function Block

SktTCPConnect

こちらのFunction Blockを使用しOmron CPUからRemote Serverに接続リクエストを送信できます。接続が成功した場合Done=Trueになります。

VAR_INPUT
Variable NameTypeDescription
SrcTcpPortBoolLocal(Omron CPU)のPortを指定します。0=1024以上の使用可能なPortを自動的に使います。Default=0です。
DstAdrString最大200Bytesの文字列でRemote ServerのIPアドレスを指定できます。
DstTcpPortUINTRemote Serverの接続Port番号(1-65535まで)
VAR_OUTPUT
Variable NameTypeDescription
DoneBoolFB実行成功
BusyBoolFB実行中
ErrorBoolFBがエラーあり
ErrorIDWORDFBのエラー情報
Socket_sSOCKETSocket変数

SktClose

こちらのFunction Blockを使用しNX CPUとRemote ServerのSocket接続を切断できます。実行が成功した場合Done=Trueになります。

VAR_INPUT
Variable NameTypeDescription
ExecuteBool立ち上げて実行する
SocketSocketSktTCPConnectから取得したSocket変数
VAR_OUTPUT
Variable NameTypeDescription
DoneBoolFB実行成功
BusyBoolFB実行中
ErrorBoolFBがエラーあり
ErrorIDWORDFBのエラー情報

SktSetOption

こちらのFunction Blockを使用するとSocket通信のOptionsを設定できます。

Done=FB実行成功、Error=FB実行エラーあり。

VAR_INPUT
Variable NameTypeDescription
ExecuteBool立ち上げて実行する
SocketSocketSktTCPConnectから取得したSocket変数
OptionType_sSKT_OPTION_TYPESocketのOption Type
OptionParamBOOLTrue=NO Delayを有効する(Nagle アルゴリズムを無効)
VAR_OUTPUT
Variable NameTypeDescription
DoneBoolFB実行成功
BusyBoolFB実行中
ErrorBoolFBがエラーあり
ErrorIDWORDFBのエラー情報

ModbusTCPRead

こちらのFunction Blockを使用すると確立されたConnectionから”Read”コマンドをRemote Modbus TCP Serverに送信することができます。読込されたデータサイズは”ReadSize”パラメータに格納され、読込されたデータはReadDatに割り付けられたパラメータに格納されます。(もしエラーが発生したらReadDatとReadSizeはわからないままになるので、該当するFBを実行する前にそれらのパラメータをリセットしたほうよいと思います)

​​

VAR_INPUT
Variable NameTypeDescription
ExecuteBool立ち上げて実行する
SocketSocketSktTCPConnectから取得したSocket変数
UnitIdentifierUSINTUnit ID Default=255
ReadCmd_sMODBUS_READModbus Function Code・サイズ・Start アドレス
TimeOutTimeTimeout時間(0.1s単位)を設定する、Defalt=2s(20)
VAR_OUTPUT
Variable NameTypeDescription
DoneBoolFB実行成功
BusyBoolFB実行中
ErrorBoolFBがエラーあり
ErrorIDWORDFBのエラー情報
ErrorIDExDWORDFBのエラー情報2
ReadSizeUINT読みされた合計サイズBitの場合は1−2000(Bit単位で計算)Wordの場合は1−125(Word単位で計算)
VAR_IN_OUT
Variable NameTypeDescription
ReadDatANYModbus TCP ServerからRegisterを読み込まれたデータ
TimeChart-Normal
TimeChart-Error

ModbusTCPWrite

こちらのFunction Blockを使用すると確立されたConnectionから”Write”コマンドをRemote Modbus TCP Serverに送信することができます。書き込むデータサイズは”WriteDat”パラメータに格納され、書き込むデータはWriteDatに割り付けられた変数から転送されます。

VAR_INPUT
Variable NameTypeDescription
ExecuteBool立ち上げて実行する
SocketSocketSktTCPConnectから取得したSocket変数
UnitIdentifierUSINTUnit ID Default=255
WriteCmd_sMODBUS_WRITEModbus Function Code・サイズ・Start アドレス
TimeOutTimeTimeout時間(0.1s単位)を設定する、Defalt=2s(20)
VAR_OUTPUT
Variable NameTypeDescription
DoneBoolFB実行成功
BusyBoolFB実行中
ErrorBoolFBがエラーあり
ErrorIDWORDFBのエラー情報
ErrorIDExDWORDFBのエラー情報2
VAR_IN_OUT
Variable NameTypeDescription
WriteDatANYModbus TCP ServerにRegisterを書き込むデータ
TimeChart-Normal
TimeChart-Error

Function

AryMove

こちらの関数を使用すると配列変数間のデータ転送ができます。転送元と転送先のData Typeは不一致でもOKです。

VAR_INPUT
Variable NameTypeDescription
InBool転送元
VAR_OUTPUT
Variable NameTypeDescription
OutBool常時True
VAR_IN_OUT
Variable NameTypeDescription
AryOutANY転送先

Clear

この関数を使用することによりInOutの変数を初期化します。該当する変数が初期値に設定された場合は初期値に戻りますが、なかった場合はDefault初期値になります。

Default Initial Value

以下は各データタイプのDefault初期値です。

VAR_INOUT
Variable NameTypeDescription
InOutANY初期化する変数
VAR_OUT
Variable NameTypeDescription
OutBool常時Trueの出力

NumToEnum

DINT変数をEnum変数に変換する関数です。

VAR_IN
Variable NameTypeDescription
InDINT
VAR_OUT
Variable NameTypeDescription
InOutEnumEnum変数

Configuration

NX CPUの内蔵Ethernet/IP Port設定を行います。

Configuration and Setup>Controller Setup>Build-in Ethernet/IP Port Settingsをします。

使用するPortのIPアドレスを設定しましょう。

DUT

Socket FBやModbus TCP FBのFlagとまとめて定義する構造体です。

Program

プログラムの流れです。

VAR

VariableTypeDescription
_SktTCPConnectSktTCPConnectSktTCPConnectのInstance
_SktTCPCloseSktCloseSktCloseのInstnace
bExecuteBOOLSktTCPConnect FBを実行する
bCloseBOOLSktClose FBを実行する
Socket_sSOCKETSocket変数
_ModbusTCPReadModbusTCPReadModbusTCPReadのInstance
bErrorBOOL
ModbusReadDatARRAY[0..99] OF wordModbusTCPRead FBで使用するRead Buffer(Word)
ModbusWriteDatARRAY[0..99] OF wordModbusTCPWrite FBで使用するWrite Buffer
ModbusReadDataCoilARRAY[0..99] OF boolModbusTCPRead FBで使用するRead Buffer(Coil)
ModbusWrite_16ARRAY[0..99] OF wordFC16で使用するWord配列
ModbusRead_03ARRAY[0..99] OF wordFC3で使用するWord配列
ModbusRead_04ARRAY[0..99] OF wordFC4で使用するWord配列
ModbusRead_01ARRAY[0..99] OF boolFC1で使用するBool配列
ModbusRead_02ARRAY[0..99] OF boolFC2で使用するBool配列
ModbusWrite_15ARRAY[0..99] OF boolFC15で使用するBool配列
ReadCmd_sMODBUS_READModbusTCPReadのコマンド(サイズ・FCなど)
bReadsARRAY[0..15] OF boolModbusTCPReadを実行する
iStepINT
bWritesARRAY[0..15] OF boolModbusTCPWriteを実行する
bStartBOOLプログラムスタートする
R_TRIG1R_TRIG立ち上げ検知のInstance
ModbusTCPReadStatusDUT_ModbusTCPReadStatusModbusTCPRead(Word)FBのStatus
ModbusTCPReadCoilStatusDUT_ModbusTCPReadStatusModbusTCPRead(Coil)FBのStatus
SktBasicStatusDUT_srtBasicSktTCPConnect FBのStatus
SktCloseStatusDUT_srtBasicSktClose FBのStauts
_SktSetOptionSktSetOptionSktSetOption FBのInstance
SktSetOptionStatusDUT_srtBasicSktSetOptionの設定Option
bSetOptionsBOOLSktSetOption FBを実行する
bOptionNoDelayBOOL
TONsARRAY[0..15] OF ton
DummyBOOL
_ModbusTCPWriteRegisterModbusTCPWriteModbusTCPWrite FBのInstance
WriteCmd_sMODBUS_WRITEModbusTCPWriteのコマンド(サイズ・FCなど)
ModbusTCPWriteRegisterStatusDUT_ModbusTCPReadStatusModbusTCPWrite(Word)FBのStatus
ModbusWriteDatCoilsARRAY[0..99] OF boolModbusTCPWriteで使用するBool配列
_ModbusTCPWriteCoilsModbusTCPWriteModbusTCPWrite FBのInstance(Coils)
ModbusTCPWriteCoilsStatusDUT_ModbusTCPReadStatusModbusTCPWrite(Coil)FBのStatus

Code

Rung0-1
  • Rung0はbStartの立ち上げを待ち、bStartなおかつ現在EIP Portが使用可能であればR_TRIG1のClkがTriggerされます。
  • Rung1がStartがトリガーされたらiStep=1になります。
Rung2-4
  • Rung2はComment Listを表示しやすいように作ったDummy回路です。
  • Rung3はiStep=1ならbExecuteがTrueになり、SktTCPConnect Function Blockを実行し、DoneがTrueなら実行成功ならiStep=5で、ErrorがTrueなら実行失敗でiStep=9000になります。
  • Rung4はiStep=5ならbSetOptionsがTrueになり、SktSetOptions Function Blockを実行し、DoneがTrueなら実行成功ならiStep=10で、ErrorがTrueなら実行失敗でiStep=9000になります。
Rung5-7
  • Rung5はiStep=10、つまりNX CPUとRemote Serverと接続に成功した状態です。ModbusTCP Serverに送信する前BufferをクリアしiStepを15にします。
  • Rung6はModbusTCPReadのFunction BlockをトリガーするbRead[0]をTrue同時に、Modbus Function Code3、Register 0から100を取得するようにReadCmdに設定を転送します。もしDone=True、つまりFB実行成功であればiStep=20にいき、Error=True、つまりFB実行エラーありならiStep=9001になります。
  • Rung7は次のModbusReadの準備のためBufferをクリアし、0.1sのDelay後にiStepを25にします。
Rung8-9
  • Rung8はModbusTCPReadのFunction BlockをトリガーするbRead[1]をTrue同時に、Modbus Function Code4、Register 0から100を取得するようにReadCmdに設定を転送します。もしDone=True、つまりFB実行成功であればiStep=30にいき、Error=True、つまりFB実行エラーありならiStep=9006になります。
  • Rung9は次のModbusReadの準備のためBufferをクリアし、0.1sのDelay後にiStepを35にします。
Rung10-11
  • Rung10はModbusTCPReadのFunction BlockをトリガーするbRead[2]をTrue同時に、Modbus Function Code1、Coil 0から100を取得するようにReadCmdに設定を転送します。もしDone=True、つまりFB実行成功であればiStep=40にいき、Error=True、つまりFB実行エラーありならiStep=9006になります。
  • Rung11は次のModbusReadの準備のためBufferをクリアし、0.1sのDelay後にiStepを45にします。
Rung12
  • Rung12はModbusTCPReadのFunction BlockをトリガーするbRead[3]をTrue同時に、Modbus Function Code2、Coil 0から100を取得するようにReadCmdに設定を転送します。もしDone=True、つまりFB実行成功であればiStep=50にいき、Error=True、つまりFB実行エラーありならiStep=9006になります。
Rung13
  • Rung13はModbusTCPWriteのFunction BlockをトリガーするbWrite[0]をTrue同時に、Modbus Function Code16、Register 0から100を書き込むようにWriteCmdに設定を転送します。もしDone=True、つまりFB実行成功であればiStep=60にいき、Error=True、つまりFB実行エラーありならiStep=9006になります。
Rung14
  • Rung14はModbusTCPWriteのFunction BlockをトリガーするbWrite[0]をTrue同時に、Modbus Function Code15、Coil 0から100を書き込むようにWriteCmdに設定を転送します。もしDone=True、つまりFB実行成功であればiStep=400にいき、Error=True、つまりFB実行エラーありならiStep=9006になります。
Rung15-18
  • Run15はiStep=400、Remote Serverの接続を切断します。Done=Trueなら実行成功でiStep=0でErrorなら実行失敗でiStep=9002にします。
  • Rung16はComment Listを表示しやすいように作ったDummy回路です。
  • Rung17はSktTCPConnectのFunction Blockを呼び出します。
  • Rung18はSktSetOptionsのFunction Blockを呼び出します。
Rung 19-20
  • Rung19はModbusTCPRead(Register用)のFunction Blockを呼び出します。
  • Rung20はModbusTCPRead(Coils用)のFunction Blockを呼び出します。
Rung21-23
  • Rung21はModbusTCPWrite(Register用)のFunction Blockを呼び出します。
  • Rung22はModbusTCPWrite(Coils用)のFunction Blockを呼び出します。
  • Rung23はSktCloseのFunction Blockを呼び出します。

Download

こちらのLinkからSample ProjectをDownloadしてください。

https://github.com/soup01Threes/OMRON/blob/main/ModbuTCP_Test_with_pilz.smc2

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

シェアする

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

フォローする