前回の記事Schneider ATV320U15M2CのDI1/DI2/AI1を使って Schneider TM221ME16T CPUから制御しました。今回はModbus Serial IO ScannerとDrv Objectを使用し、更に簡単にDrive を制御する方法を紹介します。
よろしくおねがいします。
Reference Link
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
Variable | Type | Description |
Enable | 1=Drive 電源ON0=Drive 電源OFF | |
Axis | %MC_POWER_ATVi.AXISi=0..15 | Drive Object(%DRV0 から%DRV15まで) |
VAR_OUTPUT
Variable | Type | Description |
Status | %MC_POWER_ATVi.Statusi=0..15 | 1=Drive電源が有効中0=Drive電源が無効中 |
Error | %MC_POWER_ATVi.Errori=0..15 | 1=Function Block実行中でエラー発生 |
ErrorId | %MC_POWER_ATVi.ErrorIdi=0..15 | Error情報Range:0..65535 |
MC_ReadStatus_ATV: Read Device Status
こちらのFBでDriveの状態を取得します。
VAR_INPUT
Variable | Type | Description |
Enable | 1=Function Blockを実行 | |
Axis | %MC_READSTATUS_ATVi.AXISi=0..15 | Drive Object(%DRV0 から%DRV15まで) |
VAR_OUTPUT
Variable | Type | Description |
Valid | %MC_READSTATUS_ATVi.Validi=0..15 | 1=Function Blockはエラーなし実行中 |
ErrorStop | %MC_READSTATUS_ATVi.ErrorStopi=0..15 | 1=Driveがエラー状態 |
Disabled | %MC_READSTATUS_ATVi.Disabledi=0..15 | 1=Drive が操作できないが、エラーもない |
Stopping | %MC_READSTATUS_ATVi.Stoppingi=0..15 | 1=MC_STOP_ATV の原因でDriveが停止中 |
StandStill | %MC_READSTATUS_ATVi.StandStilli=0..15 | 1=Driveが稼働状態だが速度=0 |
ContMotion | %MC_READSTATUS_ATVi.ContMotioni=0..15 | 1=Driveが稼働中で速度<>0 |
Error | %MC_READSTATUS_ATVi.Errori=0..15 | 1=Function Block実行中でエラー発生 |
ErrorId | %MC_READSTATUS_ATVi.ErrorIdi=0..15 | Error情報Range:0..65535 |
MC_Reset_ATV: Acknowledge and Reset Error
We can use this Function Block to Reset our ATV Drives.
VAR_INPUT
Variable | Type | Description |
Enable | 1=Function Blockを実行 | |
Axis | %MC_Reset_ATVi.AXISi=0..15 | Drive Object(%DRV0 から%DRV15まで) |
VAR_OUTPUT
Variable | Type | Description |
Done | %MC_Reset_ATVi.Donei=0..15 | 1=Function Block エラーなし実行した |
Busy | %MC_Reset_ATVi.Busyi=0..15 | 1=Function Block実行中 |
Error | %MC_Reset_ATVi.Errori=0..15 | 1=Function Block実行中でエラー発生 |
ErrorId | %MC_Reset_ATVi.ErrorIdi=0..15 | Error情報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
Variable | Type | Description |
Forward | 1=Driveを正回転する | |
Backward | 1=Driveを逆回転する | |
Vel | %MC_JOG_ATVi.VELi=0..15 | 速度設定値(RPMで、-32768..32768) |
Axis | %MC_JOG_ATVi.AXISi=0..15 | Drive Object(%DRV0 から%DRV15まで) |
VAR_OUTPUT
Variable | Type | Description |
Done | %MC_JOG_ATVi.Donei=0..15 | 1=Function Block エラーなし実行した |
Busy | %MC_JOG_ATVi.Busyi=0..15 | 1=Function Block実行中 |
CmdAborted | %MC_JOG_ATVi.CmdAbortedi=0..15 | 1=Function Blockの実行が中断された |
Error | %MC_JOG_ATVi.Errori=0..15 | 1=Function Block実行中でエラー発生 |
ErrorId | %MC_JOG_ATVi.ErrorIdi=0..15 | Error情報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
Variable | Type | Description |
Execute | 立ち上げ信号で実行 | |
ContUpdate | 1=速度設定値常に更新する | |
Vel | %MC_MOVEVEL_ATVi.VELi=0..15 | 速度設定値(RPMで、-32768..32768) |
Axis | %MC_MOVEVEL_ATVi.AXISi=0..15 | Drive Object(%DRV0 から%DRV15まで) |
VAR_OUTPUT
Variable | Type | Description |
InVel | %MC_MOVEVEL_ATVi.InVeli=0..15 | 1=現在速度=速度設定値 |
Busy | %MC_MOVEVEL_ATVi.Busyi=0..15 | 1=Function Blockが実行中で、 InVel=1ならFalseに戻ります。0=Function Blockは停止・中断された |
CmdAborted | %MC_MOVEVEL_ATVi.CmdAbortedi=0..15 | 1=FBが他のコマンドより中断された |
Error | %MC_MOVEVEL_ATVi.Errori=0..15 | 1=Function Block実行中でエラー発生 |
ErrorId | %MC_MOVEVEL_ATVi.ErrorIdi=0..15 | エラー情報Range:0..65535 |
MC_ReadMotionState_ATV: Read Motion State
こちらのFBを使用しATV Driveのモーション状態を取得できます。
VAR_INPUT
Variable | Type | Description |
Enable | 1=Functionを有効する | |
Axis | %MC_READMOTIONSTATE_ATVi.AXISi=0..15 | Drive Object(%DRV0 から%DRV15まで) |
VAR_OUTPUT
Variable | Type | Description |
Valid | %MC_READMOTIONSTATE_ATVi.Validi=0..15 | 1=Function Block エラーなし実行中 |
ConstantVel | %MC_READMOTIONSTATE_ATVi.ErrorStopi=0..15 | 1=Driveは定速動作中 |
Accelerating | %MC_READMOTIONSTATE_ATVi.Disabledi=0..15 | 1=Driveは加速中 |
Decelerating | %MC_READMOTIONSTATE_ATVi.Stoppingi=0..15 | 1=Driveは減速中 |
Error | %MC_READMOTIONSTATE_ATVi.Errori=0..15 | 1=Function Block実行中でエラー発生 |
ActualVel | %MC_READMOTIONSTATE_ATVi.ContMotioni=0..15 | 現在速度 |
AxisErrorId | %MC_READMOTIONSTATE_ATVi.Errori=0..15 | Axis Error情報 |
ErrorId | %MC_READMOTIONSTATE_ATVi.ErrorIdi=0..15 | Error情報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
Variable | Type | Description |
Enable | 1=Functionを有効する | |
Axis | %MC_STOP_ATVi.AXISi=0..15 | Drive Object(%DRV0 から%DRV15まで) |
VAR_OUTPUT
Variable | Type | Description |
Done | %MC_STOP_ATVi.Donei=0..15 | 1=Function Block エラーなし実行した |
Busy | %MC_STOP_ATVi.Busyi=0..15 | 1=Function Block実行中 |
Error | %MC_STOP_ATVi.Errori=0..15 | 1=Function Block実行中でエラー発生 |
ErrorId | %MC_STOP_ATVi.ErrorIdi=0..15 | Error情報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だと設定されています)
Variable | Modbus Register | Description |
%IWM100.0.0 | 12741 | ATV320 Status word |
%IWM100.0.1 | 12742 | ATV320 現在速度 |
%IWM100.0.2 | 12743 | Not Used |
%IWM100.0.3 | 12744 | Not 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と速度設定値だと設定されています)
Variable | Modbus Register | Description |
%QWM100.0.0 | 12761 | ATV320 Command |
%QWM100.0.1 | 12762 | ATV320 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