Opto22#Groov EPIC ControllerをModbusTCP経由でIOデータを取ってみよう

Opto22 groov CPU Tutorialの第2話になります。今回は、groov CPUのMMP Memory Mappingコンセプト・そしてMMPアドレスからModbus TCPの変換、最後にModbus TCP経由でIO モジュールデータにアクセスする方法を説明します。

さ、始めよう!

MMP?

OptoMMPは、IEEE1394規格に基づくメモリマッププロトコルです。このプロトコルを使用してこのプロトコルは、Opto 22のハードウェア製品を使用した遠隔監視、産業制御、およびデータ収集のためのソフトウェアアプリケーションを作成するために使用されます。

Accessing over the internet…

Opto 22 イーサネットベースのデバイスは、イーサネットネットワーク上の他のハードウェアと同様であるため、コンピュータにアクセスするのとまったく同じ方法でインターネット経由でアクセスすることができます。ですが、現在使用しているネットワークおよびインターネット接続に依存しシステム管理者、ネットワーク管理者、インターネットサービスプロバイダー(ISP)などに合わせる必要があります。

CAUTION!

Opto22のメモリマップデバイスと直接通信する場合は、他の通信オプションとの競合を引き起こしていないことを確認してください。例えば、メモリ・マップを使用してI/Oユニットとデータを交換する場合、そのI/OユニットはCodesys Runtimeから制御されている場合、入力データを取得するならよいですが、出力データを書き込む場合は注意してください。

つまり、I/O側に直接書き込まれるデータが、主制御プログラムで実行されている制御ロジックと衝突しないことを確認してください。

THE MEMORY MAP?

これからMemory Mappingについて簡単な知識を説明します。

If you’re a programmer

メモリマップとは、デバイス上の読み書き可能なメモリの物理アドレスと論理アドレスのセットを一致させるデータ構造であることだとも思います。一言で言うと、ルックアップテーブルのようなものだと考えてください。

PLCに慣れている方なら、Memory MapはPLCのレジスタをイメージすればよいでしょう。

Opto22のメモリ・マップ・デバイスでは、物理アドレスは、次のようなデータの単一の値を保持することがあります。メモリマップにデータを書き込むと、メモリマップされたデバイスは、成功または失敗コードを示すパケットを返すことで応答します。

また、読み出しを実行すると、メモリマップデバイスはデータを含むパケットを返します。

If you’re not a programmer

メモリーマップ(mem mapと呼ばれることもある)は、郵便番号の集合と考えることができます。それぞれの郵便ポストの住所には、それぞれ異なる所有者がいて、その所有者は、自分が欲しい情報を持っているか、あるいは変えたい情報を持っています。

情報を取得したり変更したりするには、メッセージを孩童する郵便番号に送信します。例えば、あるデバイスの部品番号を取得する場合、そのアドレスFFFF F030 0080に対してデータ・パケットを受け取ります。

また、メモリマップにデータ書き込む・読み取り両方もできます。(例えば、I/Oチャネルの構成、状態、値を変更するなど)。

groov I/O Units

GRV-EPIC-PR1またはGRV-EPIC-PR2のI/OプロセッサにあるI/Oユニットをgroov I/Oユニットと呼び、groov I/Oシャーシには4個または8個または16個のI/Oモジュールを収納できます。各モジュールには、モジュールによって8~64チャンネルが含まれます。

下図はいくつかのモジュールでチャンネルがどのように識別されるかの例も示しています。

Using the OptoMMP Protocol

先程も書きましたが、OptoMMPプロトコルを用いた通信は、基本的にIEEE1394のパケットをTCP/IPまたはUDP/IPのパケットの中に入れます。

そして、OptoMMPのポート番号は、デバイスのデフォルトで2001になっています(このポート番号はアドレスF030004で変更可能です)。アドレスF03A0004を使用して、このポート番号を変更できます。

こちらはTCPの例のようになります:

Opto22のメモリマップデバイスは、IEEE1394規格で規定された以下の種類のリクエストパケットを使用します。

  • Read Quadlet:あるアドレスから始まる4バイトを読み出す。
  • Read Block:あるアドレスから始まるNバイトを読み出す。
  • Write Quadlet:あるアドレスから始まる4バイトを書き込みます。
  • Write Block:あるアドレスから始まるNバイトを書き込みます。

メモリマップデバイスとの通信を開始するために、Hostは以下の4つのパケットのうち1つをTCP/IPまたはUDP/IP経由で送信します。

最後にデバイスからリード・レスポンス・パケットまたはライト・レスポンス・パケットを返します。

Writing Data

I/Oチャンネルの設定やステータスを変更したり、カウンターを有効にしたり、その他のデータを書き込むには、Hostは宛先アドレスと書き込む新しいデータを含むWrite Requestパケットを送信します。デバイスは、成功または失敗を示す書き込み応答パケットを返すことによって応答します。

Reading Data

Hostは、メモリマップからメモリロケーションを読み取ることで、I/Oモジュールのステータス、カウンタ値、その他のデータにもアクセスできます。Hostはこれらのメモリ位置からのデータを要求するRead Requestパケットを送信するだけで、デバイスはRead Responseパケットでデータを返します。

Streaming Data

ほとんどの通信は、リクエストとレスポンスの2段階の操作が必要ですが、一部のOpto 22メモリマップデバイスは、データをストリーミングすることもできます。ストリーミングは UDP を使用し、応答は必要ありません。

Reference Link

Opto22#Groov EPIC ControllerにCodesysを入れよう

Implementation

Enable

Modbus TCPからgroovにアクセスするためにまずI/O Modbus Slaveの機能が有効されたかを確認しましょう。groovMANAGE画面からI/Oをクリックします。

この画面は実際groovCPUにインストールされてるモジュールを一覧できますが、いまはI/O Servicesをクリックし次のMenuに進みます。

I/O Servicesの画面が表示されています。

I/O Configurationをクリックし更に次のMenun進みましょう。

I/O Modbus/TCP Slave Enabledの機能が有効化されたか確認してください。あとCPUの種類によりBig/Small Endian Formatが異なりますので実際のアプリケーションに合わせて行いましょう。

MMP Calculator

Modbus TCPでServer Slave通信するにはいくつかの重要なパラメータがあり、それは、

  • IPアドレス:すでに把握
  • Port:Defaultで502を使用
  • Modbus Unit ID:求める必要がある
  • Register番号:求める必要がある
  • Data Format:求める必要がある

これからModbus Unit ID・Register 番号・Data Formatを確認する方法を紹介します。

MMP Calculatorをクリックします。

MMP Calculatorは実際groovCPUにインストールされているIOモジュールのMMPアドレスをModbus TCP Formatに変換してくれる大変便利なツールでございます。

Area

Areaのところに確認したい項目を設定できます。

Areaをクリックすると、Channel Configurationだけではなく、Analog Channel・Digital Channelなど様々なアクセス項目がありますね。

Slot0にあるのはデジタル入力なので、Digital Packed Data Readをクリックしましょう。

Done!いまDigtial Packed Data ReadのMMP>Modbusアドレス変換Mapに変わりました。

Module

次はModuleですね。前回のTutorialにも言いましたが、groovはSlot0から始めます。Module0ならSlot0,Module1ならSlot1のように考えていただければよいと思います。

Moduleにある+/-ボタンで調べたいSlotを変更できます。

Show Modbus

こちらは該当するModuleのModbusアドレスを表示・非表示の切り替えになります。

このように操作します。

Data

いまAreaがDigital Packed Data ReadでModule0のデータを取得しています。

MMPの下にはModbus Unit IDとAddressがありますね。

Modbus Unit IDはModbus ClientがgroovとModbusで接続するときに必要なIDとAddressはRegister番号になります。

Generic MMP 

でもこのModbus Unit IDとAddressが本当に正しいかどうかの不安がありますね。groovにはGeneric MMPというツールもあります。

Test(Slot0,Digital Module)

State MaskにあるMMPをCopyし”Open area in Generic MMP Page”をクリックしてください。

Generic MMP というツールはMMPのアドレスを入力すれば該当する番地の現在値を確認できる便利なツールです。Addressに先程CopyしたMMPを貼り付けましょう。

次はData Typeです。groovがその番地のデータをどう表現するかを設定できます。

今回は32-Bit Integerを設定します。

最後のLegthはAddressからこのData Typeの番地データを何個連続読み取るかの設定です。

Result

このようにSlot0の入力状態が直接確認できます。

Test(Slot3 Channel0 ,Analog Module)

今度はSlot3にあるアナログ入力モジュールをテストします。AreaからAnalog Channel Readを選択します。

Module=3、Channel=0に設定します。いまはSlot3のアナログチャンネル0のMMPが表示され、そのMMPをCopyし先程のGeneric MMP ツールに行きます。

Data TypeをFloat

Result

Done!Slot3 Channel0のアナログ入力値を読み取りましたね。

Test(Slot2 Channel0 ,Temperature Module)

今度はSlot2 Temperature MdouleのChannel0データにアクセスしてみます。

AreaはAnalog Channel Readのまま、Module番号を2にしChannelを0に設定しましょう。

Anaalog Channel ValueのFieldで表示されたMMP IDをCopyし、また”Open area in Generic MMP page”をクリックしましょう。

Data TypeはFloatします。F0262000の現在値は24.85度だと見えます。

こちらは実際の動作になります。

Codesys

Generic MMP ツールからModuleのデータを取得できましたので、次はCodesysからModubus TCP Clientを立ち上げて、先ほどのモジュールのデータを取ってみます。

Add Device

前回のTutorialに沿ってCodesysプロジェクトを立ち上げて、Etherent>Add Deviceします。

Fieldbus>Modbus TCP Master>Modbus TCP Masterを選び>Add Deviceで追加します。

Confgiure Modbus

Defautlの通信設定を変更する必要があれば、先程追加したModbus TCP Masterをダブルクリックしてください。

Add Device

Modbus TCP Masterを右クリック>Add DeviceでアクセスしたModbus TCP Slaveを追加します。

Fieldbus>Modbus>Modbus TCP Slave> Modbus TCP Slaveを選び>Add Deviceします。

Done!次はSlaveをダブルクリックし細かい設定を行います。

Slave IP

General>Modbus TCP>Slave IP addressでModbus TCP SlaveのIPとPortを設定します。

groovCPUのIPは192.168.5.170でPortは502を使用しています。

Add Chanel

Modbus Slave Channelを開き>Add ChannelでアクセスするRegisterを追加します。

Offset は0xC80、Length=1で、Access TypeはFunction Code 3に設定します。

0xC80=3200Decで、先程のMMP Calculatorの計算ならAddress=3200です。

つまり、Digital Packed Data Read, Module0のデータをアクセスすることになります。

Done!

Update Time

DefaultではMappingされてない・プログラムに使用されていない変数はUpdateしません。ModbusTCPSlave I/O Mapping>Always Update VariablesのところをEnable2に設定します。

Mappingなどにか必ず変数がUpdateするようになります。

Unit ID

次はUnitIDを変更します。ModbusTCPSlave Parameters>UnitIDを変更します。Default=255です。

UnitIDを130に変更します。

それは、先程のMMP CalculatorからArea=Digital Packed Data Readで、Module=0にアクセスしたいときModbus Unit IDが130だと確認されたからです。

Add One More

もう1つのModbus Slaveを追加し、IPとPortも先程と同じ設定にします。

Offset=0x1800(6144)をLength=2、Function Code=3を設定します。

今回はModule=3、Analog Channel ReadのChannel0にアクセスすることになります。

Unitは21になります。

Program

最後はLeghth=2のModbus TCP Slaveデータを配列のWordから実数(Real)に変換するプログラムを作成します。

Add DUT

Application>右クリック>Add Object>DUTします。

Data Unit Type名を入力しTypeをUnionに選択します。UnionというのはそのDUTの中に定義された変数がすべて同じMemory Offsetになります。

r32の変数とw16のWord配列を定義しましょう。

次はMAIN プログラムに先ほど定義したDUTを使って変数を定義します。

MdobusTCPSlave I/O Mappingを開き、Variableの隣にある…ボタンをクリックしMappingを行います。

MAINプログラムで定義した変数と紐付けましょう。

これでOKです。

Result

プロジェクトをCodesys RuntimeにDownloadしましょう。すべてのFieldbus も緑になれば正常に動いているとわかります。

デジタル入力モジュールと接続してるボタンを操作するとデータもちゃんと反映されます。

次はアナログ入力モジュールを確認してみます。

But..

Generic MMP ツールから確認するとCodesys で取得したデータと異なりますね。

Modify

プログラムを編集し、Byte0とByte1をSWAPします。

Done!現在値が正確に読み取られました。

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

シェアする

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

フォローする