Project#Start up your ATV320_Part2_Using M221ME16T CPU with Modbus IO Scanner

前回の記事Schneider ATV320U15M2CのDI1/DI2/AI1を使って Schneider TM221ME16T CPUから制御しました。今回はModbus Serial IO ScannerとDrv Objectを使用し、更に簡単にDrive を制御する方法を紹介します。

よろしくおねがいします。

Reference Link

Project#Start up your ATV320_Part1_ Using M221ME16T CPU with DI1/DI2/AI1
Schneider#EcoStruxureMachine Expert-Basic Installation
Project#Beckhoff TwinCAT3 x Schneider TM221 CPU x Ethernet/IP Communication
Schneider#Modicon CPU Firmware Update
Project#Revpi Connect x Schneider Mdoicon M221 x Modbus RTU

Drv Object?

今回の記事で使用するDrv Objectsは、複数のDrive専用Function BlockからM221 CPUをATV Driveを簡単制御できるライブラリだとイメージすればよいと思います。

Drv Objectを使用すると、

  • ATV Driveを簡単に制御できる
  • Driveのデータを常に更新される
  • Driveの状態を取得できる
  • Driveのエラー検知が簡単になる

Drv Objectの構築はすべでEcoStruxure Machine Expert から操作でき、特別なソフトが一切いりません。そして今回の記事で丁寧にStep By Step、構築方法を説明しますので、安心してください。

ATV Driveは以下のFunction Blockを使用できます。

  • MC_Power_ATV
  • MC_Jog_ATV
  • MC_MoveVel_ATV
  • MC_Stop_ATV
  • MC_ReadStatus_ATV
  • MC_ReadMotionState_ATV
  • MC_Reset_ATV

Function Block

MC_Power_ATV: Enable/Disable Power Stage 

こちらのFBを使用しDriveの電源をON/OFFできます(PLC Open libraryのMC_Powerのイメージで)。

  • Status=1はDriveの電源を有効にしている。
  • Enableパラメータがたち下がると電源が無効になり、Statusが0に変わります。
  • もしCPUがDriveのRegisterにアクセスできなければ、Timeoutエラーになる。
  • Function Blockが実行中にエラーがある場合、Error=1になる
    • ATVがShutdownコマンド受けた(CMD=16#0006)
    • ETAがShutdownコマンド受けた(CMD=16#xx21)
  • Function Blockがエラー発生した場合、MC_Rest_ATVを実行しDriveをリセットする必要があります。

VAR_INPUT

VariableTypeDescription
Enable1=Drive 電源ON0=Drive 電源OFF
Axis%MC_POWER_ATVi.AXISi=0..15Drive Object(%DRV0 から%DRV15まで)

VAR_OUTPUT

VariableTypeDescription
Status%MC_POWER_ATVi.Statusi=0..151=Drive電源が有効中0=Drive電源が無効中
Error%MC_POWER_ATVi.Errori=0..151=Function Block実行中でエラー発生
ErrorId%MC_POWER_ATVi.ErrorIdi=0..15Error情報Range:0..65535

MC_ReadStatus_ATV: Read Device Status 

こちらのFBでDriveの状態を取得します。

VAR_INPUT

VariableTypeDescription
Enable1=Function Blockを実行
Axis%MC_READSTATUS_ATVi.AXISi=0..15Drive Object(%DRV0 から%DRV15まで)

VAR_OUTPUT

VariableTypeDescription
Valid%MC_READSTATUS_ATVi.Validi=0..151=Function Blockはエラーなし実行中
ErrorStop%MC_READSTATUS_ATVi.ErrorStopi=0..151=Driveがエラー状態
Disabled%MC_READSTATUS_ATVi.Disabledi=0..151=Drive が操作できないが、エラーもない
Stopping%MC_READSTATUS_ATVi.Stoppingi=0..151=MC_STOP_ATV の原因でDriveが停止中
StandStill%MC_READSTATUS_ATVi.StandStilli=0..151=Driveが稼働状態だが速度=0
ContMotion%MC_READSTATUS_ATVi.ContMotioni=0..151=Driveが稼働中で速度<>0
Error%MC_READSTATUS_ATVi.Errori=0..151=Function Block実行中でエラー発生
ErrorId%MC_READSTATUS_ATVi.ErrorIdi=0..15Error情報Range:0..65535

MC_Reset_ATV: Acknowledge and Reset Error 

We can use this Function Block to Reset our ATV Drives.

VAR_INPUT

VariableTypeDescription
Enable1=Function Blockを実行
Axis%MC_Reset_ATVi.AXISi=0..15Drive Object(%DRV0 から%DRV15まで)

VAR_OUTPUT

VariableTypeDescription
Done%MC_Reset_ATVi.Donei=0..151=Function Block エラーなし実行した
Busy%MC_Reset_ATVi.Busyi=0..151=Function Block実行中
Error%MC_Reset_ATVi.Errori=0..151=Function Block実行中でエラー発生
ErrorId%MC_Reset_ATVi.ErrorIdi=0..15Error情報Range:0..65535

MC_Jog_ATV: Start Jog Mode 

こちらのFBを使用しDriveをJog操作行います。DriveはFowardやBackwordのコマンドと速度設定値により動きます。(PLC open ライブラリのMC_Jogと似ています)

  • Busyが0にリセットされたときもしCmdAbortedが1の場合、“MC_MoveVel_ATV” や“MC_Stop_ATV”が実行された。
  • 速度設定値はForward・Backwardコマンドが立ち上げのときのみ更新できます。
  • CmdAbort=1の場合、ForwardとBackwardコマンド両方をFalseすればリセットできます。
  • ForwardとBackwardを両方に0にすると、Jog動作が停止され、Done Flagが1 Cycle Trueになります。

VAR_INPUT

VariableTypeDescription
Forward1=Driveを正回転する
Backward1=Driveを逆回転する
Vel%MC_JOG_ATVi.VELi=0..15速度設定値(RPMで、-32768..32768)
Axis%MC_JOG_ATVi.AXISi=0..15Drive Object(%DRV0 から%DRV15まで)

VAR_OUTPUT

VariableTypeDescription
Done%MC_JOG_ATVi.Donei=0..151=Function Block エラーなし実行した
Busy%MC_JOG_ATVi.Busyi=0..151=Function Block実行中
CmdAborted%MC_JOG_ATVi.CmdAbortedi=0..151=Function Blockの実行が中断された
Error%MC_JOG_ATVi.Errori=0..151=Function Block実行中でエラー発生
ErrorId%MC_JOG_ATVi.ErrorIdi=0..15Error情報Range:0..65535

MC_MoveVel_ATV: Move at Specified Velocity 

このFBを使用しDriveを定速で動かすことができます。

  • InVel=1は現在速度=速度設定値
  • CmdAbort=1のときはMC_Jog_ATVやMC_Stop_ATVが実行し始める場合
  • Error=1のときはMC_STOP_ATVが実行してる最中にFBのExecuteをTrueにするとき

VAR_INPUT

VariableTypeDescription
Execute立ち上げ信号で実行
ContUpdate1=速度設定値常に更新する
Vel%MC_MOVEVEL_ATVi.VELi=0..15速度設定値(RPMで、-32768..32768)
Axis%MC_MOVEVEL_ATVi.AXISi=0..15Drive Object(%DRV0 から%DRV15まで)

VAR_OUTPUT

VariableTypeDescription
InVel%MC_MOVEVEL_ATVi.InVeli=0..151=現在速度=速度設定値
Busy%MC_MOVEVEL_ATVi.Busyi=0..151=Function Blockが実行中で、
InVel=1ならFalseに戻ります。0=Function Blockは停止・中断された
CmdAborted%MC_MOVEVEL_ATVi.CmdAbortedi=0..151=FBが他のコマンドより中断された
Error%MC_MOVEVEL_ATVi.Errori=0..151=Function Block実行中でエラー発生
ErrorId%MC_MOVEVEL_ATVi.ErrorIdi=0..15エラー情報Range:0..65535

MC_ReadMotionState_ATV: Read Motion State 

こちらのFBを使用しATV Driveのモーション状態を取得できます。

VAR_INPUT

VariableTypeDescription
Enable1=Functionを有効する
Axis%MC_READMOTIONSTATE_ATVi.AXISi=0..15Drive Object(%DRV0 から%DRV15まで)

VAR_OUTPUT

VariableTypeDescription
Valid%MC_READMOTIONSTATE_ATVi.Validi=0..151=Function Block エラーなし実行中
ConstantVel%MC_READMOTIONSTATE_ATVi.ErrorStopi=0..151=Driveは定速動作中
Accelerating%MC_READMOTIONSTATE_ATVi.Disabledi=0..151=Driveは加速中
Decelerating%MC_READMOTIONSTATE_ATVi.Stoppingi=0..151=Driveは減速中
Error%MC_READMOTIONSTATE_ATVi.Errori=0..151=Function Block実行中でエラー発生
ActualVel%MC_READMOTIONSTATE_ATVi.ContMotioni=0..15現在速度
AxisErrorId%MC_READMOTIONSTATE_ATVi.Errori=0..15Axis Error情報
ErrorId%MC_READMOTIONSTATE_ATVi.ErrorIdi=0..15Error情報Range:0..65535

MC_Stop_ATV: Stop Movement 

こちらのFBを使用すればATV Driveの運転を停止できます。停止するときの加減速など細かいパラメータはDrive本体で参照します。

  • FBはExecute Inputパラメータの立ち上げ信号で実行します。
  • 他のFBにあるExecute Input(例えばMC_JOG_ATV)がMC_STOP_ATVがDone=1になるまで無視されます。
  • MC_STOP_ATVがBusy=1のとき、他のFBは実行してもエラーで完了します。
  • その停止操作を中止できるのは:
    • Drive本体の電源喪失
    • 通信エラー

VAR_INPUT

VariableTypeDescription
Enable1=Functionを有効する
Axis%MC_STOP_ATVi.AXISi=0..15Drive Object(%DRV0 から%DRV15まで)

VAR_OUTPUT

VariableTypeDescription
Done%MC_STOP_ATVi.Donei=0..151=Function Block エラーなし実行した
Busy%MC_STOP_ATVi.Busyi=0..151=Function Block実行中
Error%MC_STOP_ATVi.Errori=0..151=Function Block実行中でエラー発生
ErrorId%MC_STOP_ATVi.ErrorIdi=0..15Error情報Range:0..65535

Modbus Support Function

こちらはTM221ME16T CPUがSupportするModbus Functon Codeです。

Drive State Diagram

こちらはATV320の状態遷移図です。

Disabled

DisabledはDriveの初期状態で、エラーなしですが操作不可になっています。

(%MC_POWER_ATV.Status=0 とエラーなし)

Standstill

Driveが操作可能の状態ですが、現在速度は0です。

  • ErrorStop状態からStandStillに遷移した場合
    • %MC_Reset_ATV.Done=1と %MC_Power_ATV.Enable=1,%MC_Power_ATV.Status=1
  • Disabled状態からStandStill状態に遷移した場合
    • %MC_Power_ATV.Enable=1,%MC_Power_ATV.Status=1

ErrorStop

Driveはエラー状態、停止しています。

Continuous motion

Driveが動作中で、現在速度は0ではない。

Stopping

DriveがMC_STOP_ATV Function blockの原因で停止中。

Implementation

次はATV320をSlaveの設定方法とTM221ME16T Schneider PLCをModbus RTU Masterの構築方法とDrv Objectを使用する方法を説明します。

ATV320 Side

Modbus Configuration

まずはSchneider ATV320側のModbus RTU Slaveの設定を行います。

Set Command Channel

ConF Menuを開きます。

FULL Menuを開きます。

CTL Menuへ行きます。

Fr1 Menuを開きます。

Fr1のDefaul値はAI1です。前回のTutorialでAI1の端子から(0-10v)ATV320を制御したこと覚えていますか?

“ndb”を変更します。つまりModbus通信経由で制御することになります。

Modbus Address

次はModbusRTU Slaveのアドレスを設定するためにConf Menuを開きます。

FULL Menuを開きます。

CON Menuを開きます。

NdIはModbus設定Menuです。

Add Menuを開きます。こちらはModbus Slaveのアドレスです。

DefaultはOFFです。

ロータリースイッチでアドレスを”1”に変更します。

Bandrate

“tbr”は通信速度です。

Defaultは192(19200)で、今回の記事は384(38400)に設定します。

Power Reset

設定が終わったら電源入れ直しで設定を適用しましょう。

TM221ME16T Side

Configure the Modbus

SL1(Serial line)>Modbusを開きます。

Protocol Settingsで”Modbus Serial IOScanner”を設定します。

ATV320側の通信設定をCPUと100%合わせてください。通信速度を38400に変更してください。

Configure the Modbus IO Scanner

SL1(Serial)>Modbus Serial IOScannerを開くと、Modbus Serial IOScannerの構築画面が表示されます。

Transmission mode

今回の記事ではRTU Modeを使用しますので、Transmission modeを”RUT”にしてください。

Drive Settings

記事ではATV320を使用します。DriveのRadio Boxを選択してください。

ATV320を選びます。

Done!

Add Drive

Add ボタンでATV320をIO ScannerのSlaveに追加します。

Done!

下図のように、Device 0(ATV320)が追加されました。

More about this item..

Modbus IOScannerはModbus Function Code 23を使用し一つのリクエストで複数のRegisterを読み書きするイメージです。

例えば、Channelのところで…Buttonをクリックします。

Channel Assistant 画面が表示され、該当するObjectがアクセスするModbus Registerを一覧できます。

ATV_IoScannerではMessage Typeは0x17、つまりFunction Code=23になります。

Modbus IOScannerではFunction Code23を使用し12741から4つのReisgerを読みます。

Input Register(IOScanner)

Programming Tab>Network objects>Input registers(IOScanner)を開きます。

Input registers(IOScanner) のproperties%IWM100.0.0 から %IWM100.0.3まで4つの変数があります。それはATV320を読み取る、4つのRegisterに該当します。 

こちらは各Registerの詳細情報です。

(12741と12742はDefault上でStatus wordと現在Speedだと設定されています)

VariableModbus RegisterDescription
%IWM100.0.012741ATV320 Status word
%IWM100.0.112742ATV320 現在速度
%IWM100.0.212743Not Used
%IWM100.0.312744Not Used
Output Register(IOScanner)

次はProgramming Tab>Network Objects>Output registers(IOScanner)を開きます。

Output registersIOScanner) のproperties%QWM100.0.0 から %QWM100.0.1まで2つの変数があります。それはATV320に書き込む、2つのRegisterに該当します。 

こちらは各Registerの詳細情報です。

(12761と12762はDefault上でControl wordと速度設定値だと設定されています)

VariableModbus RegisterDescription
%QWM100.0.012761ATV320 Command
%QWM100.0.112762ATV320 LFRD(Speed Setpoint)

FB_SLSTATUS

Add New Function Block

今度はFunction Blockを追加してみます。Programming Tab開き>User-defined functions>Add user-defined function blockをクリックします。

user-defined function blockがProjectに追加されました。

Rename it

右クリックでわかりやすい名前に変更しましょう。

Configure the Input/Output Boolean Data

M221のFunction BlockはSiemensやBeckhoffと少し違います。Input/OutputパラメータはBooleanのみ構築できます。

Rename it

次はわかりやすい名前に変更しましょう。

Configure the Parameters

今度はParametersを追加します。

%PARAM0を1つ定義します。それはFunction BlockのWord Type入力になります。

Program

中身はSL1(Serial Line1)の現在値からSerial Line1の状態を判断し出力します。

System Word %SW210

こちらは%SW210から示すIOScannerの状態です。

  • 0:IOScannerが停止中
  • 1:IOScannerがデバイスに初期化リクエスト送信した
  • 2:IOScannerが稼働中
  • 3:IOScannerが一部稼働中(通信できないデバイスがあり)
  • 4:IOScannerが一時停止中

How to use Drv Object?

次はDrive Objectの使用方法を説明します。ツールから”Programming Tab”を開き、Drive Objects>Driveをクリックします。

いまDrive Propertiesには%DRV0だけが表示されています。

それはModbus Serial IO Scannerには1つのDriveだけが構築されたからです。

Modbus Serial IO Scannerに仮にDrive Objectを追加してみます。

Drive Propertiesはいま%DRV0,%DRV1,%DRV2が表示されました!つまり私達はそのPropertiesをそんなに気にせず、ツールが自動的にDrive Objectを追加・削除します。

How to use MC_XXX Object in a Project?

T次はProjectの中にMC_XXX Objectを使用方法を紹介します。

Check the Mappings

例えばプログラムの中にMC_Power_ATVを使用したい場合、まずDrive Objects>MC_Power_ATVを開きます。

MC_Power_ATVi(i=0-15)が表示されます。

Call the Object

Programming tabを開き>DRV>MC_Power_ATVを選びます。

MC_POWER_ATVがプログラムの中に追加され、”%MC_POWER_ATV0″のところに赤いMarkがついています。それはObjectに割り付けられているDrive Objectがないからです。

Configure the DRV object

%MC_Power_ATV0 Block をクリックすると”Configuration” Popupが表示され、Drop-down ListからDrive Objectを選択できます。

このような操作です。

Assign the Input

ENABLEのInputパラメータにA接点とつながればOKです。STATUSとERRORの出力パラメータはそのままでもエラーにならないので大丈夫です。

Assign the Output

必要であれば%MのBitデバイスに出力しましょう。

Assign the WORD/DWORD/FLOAT data

最後にErrorId(つまりエラー情報)もほしいですね。

そのErrorIDにアクセスするため、RungにOperation Blockを追加します。

Rung内にOperation blockが追加されました。

次はこのような形でErroIdにアクセスすればよいです。

%yourDevice:=%Yourobjectname.yourParameters

今回の例ではこうになります:

%MW10:=%MC_POWER_ATV0.ERRORID;

MC_Power_ATV Propertiesを開くと、%DRIV0 がAxis Fieldのところに表示されました。

それは先程のプログラムで%DRV0をMC_Power_ATVに割り付けていたからです。

Program

いよいよATV320 Inverterを制御するプログラムを作成します。

Add Pou in your Master Task

プロジェクトが複雑になり、プログラムの機能ごとにPOUsをわけたほうが管理しやすいと思います。Master Task開き>右クリック>Add POUします。

3つのPousが構築され、次はプログラムの中身を詳しく説明します。

Configure the Cycle Time

そしてMaster TaskのCycle timeを変更することもできます。

Master TaskのDefaut設定は”Normal”で、今回は1msのFix Scanに変更します。

Pou01_System

Pou01_SystemはシステムFlagと入力信号を管理するプログラムです。

Rung0 CPU in Run Mode

%S12はSystem Bitであり、CPUがRun ModeのときTrueになります。

Rung1 Inputs

Rung1は入力信号をCPU Memory Bitsに一旦出力します。

Rung2 Reset/Rung3 SL1 Error Reset

Rung2はエラーのリセット操作で、Rung3は%110と%S107がSL1(Serial Line1)とIOエラーをリセットできるSystem Bitです。

Rung4 Read the SL1 Status

Rung4ではSL1(Serial Line1)の状態をSystem Word %SW210を読み取り、User-defined function Block FB_SLSTATUS0を使用し現在状態をBoolの形に変わってMBitに出力します。

Pou02_ATV320_1

Pou02_ATV320_1はこのプロジェクトのメイン部分でATV320 Inverterを制御するプログラムが入っています。

Rung0 POWER On interlock

Rung0はDrive Power ONのInterlockロジックです。

Rung1 POWER ON Command

Rung1はDriveのPower On コマンドを発行します。CPUはRun ModeなおかつInterlock状態がOKであれば、Power Onの押しボタンから立ち上げパルスで、そのPower ONコマンドを発行します。

Rung2 MC Power OFF

Rung2はPower Off コマンドを発行します。エラーが発生する場合やInterlockがFalseになるとPower On コマンドがリセットされます。

Rung3 MC_POWER/Rung4 Drive is Ready

Rung3では%MC_POWER_ATVi(i=0-15) を呼び出してATV320を起動し、現在の状態をSTATUS 出力から取得します。

Rung5 MC_READ_STATUS

Rung5はMC_READSTATUS_ATVi(i=0-15)を呼び出してATV320の現在状態を取得します。

Rung6 MC_READMOTIONSTATE

Rung6ではMC_READMOTIONSTATE_ATVi(i=0-15)を呼び出してATV320のモーション状態を取得します。

Rung7 Drive Operation Interlock

Rung7ではDriveを動かすコマンドを発行するInterlockです。

Rung8 MC_RESET

Rung8ではMC_RESET_ATVi(i=0-15)を呼び出してATV320のエラーを押しボタン経由でリセットします。

Rung9 JogFw/JogBw Interlock

Rung9ではJog正回転と逆回転のInterlockになります。

Rung10 MC_JOG

Rung10ではMC_JOG_ATVi(i=0-15) を呼び出してボタン操作からJog Operationを行い、なおかつ速度のSetpointは範囲内であることをCheckします。

Rung11 MC_MOveVel

Rung11はMC_JOG_MOVEVELi(i=0-15)を呼び出してDriveを定速運転操作を行い、なおかつ速度のSetpointは範囲内であることをCheckします。

Rung12 MC_STOP

Rung12ではMC_STOPi(i=0-15)を呼び出してATV320の運転を停止します。

Pou03_Outputs

Pou03_OutputsではPush Buttonのランプ出力を制御します。

Rung0 Power Status

%S6はCPUがRun中で1秒ON・OFF繰り返しのSystem bitです。

Rung1 JOG Forward Status

いまDriveがJog正回転操作してるとLampがOnになります。もしDriveがRun CommandがOFFになっても、Driveがまだ出力してる間は点滅になります。

Rung2 JOG Backward Status

いまDriveがJog逆回転操作してるとLampがOnになります。もしDriveがRun CommandがOFFになっても、Driveがまだ出力してる間は点滅になります。

Rung3 Move Vel Status

今度はATV320が定速運転中してるときLampがONになり、もしDriveがRun CommandがOFFになっても、Driveがまだ出力してる間は点滅になります。(もしくはまだ速度設定値に到達してない)

Result

Power OnとJog操作:

MC_MOVEVEL_ATV ContUpdate=0

MC_MOVEVEL_ATV ContUpdate=1

Source Project

下記のLinkからProjectをDownloadしてください。

https://github.com/soup01Threes/Schneider/blob/main/State2_DrvObject_ModbusRTU.smbp

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

シェアする

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

フォローする