今回の記事ではCodesys Runtimeを稼働できるWago PFC200 Controllerからデジタル入出力からJTEKTのServo Driveを制御していきたいと思います。
Codesys側はFBD言語で制御プログラムを実装し、JTEKT側はPR Modeを使用します。
さ、はじめよう!
Reference Link
Video
こちらは今回の記事の動画Versionになります。
Codesys.Tutorial02:JTEKT Servo DriveをDIOで制御しよう
PR Mode?
KSD-A3 Servo Driveの位置制御には、外部位置指令パルス(PT)入力と内部レジスタ入力(PR)の 2 つの指令入力モードがあります。
そのPR Modeは、外部指令パルス入力を使用することなく、簡単に位置制御を行うことができるモードになります。Servo Driveには100セットまでのPR Registerが用意されています。
下図のように、End-Userが実行したいPRをPOS0からPOS6までBit単位として分解し、CTRG Flagを立ち上げTrueすれば、コマンドがトリガーされます。
下図は基本的な制御構成です。
Pars
PR ModeでもPT Modeでもパラメータを調べたり変更したりする場合もあります。
KSDソフトからParameter Editorをクリックします。
パラメータの一覧画面が表示されます。
変更するパラメータをクリックすると下図のようなParameter Setting Helper画面が表示され、Valueに新しい設定値を入力し、Write to Servoでパラメータを更新しましょう。
Time Chart
PRモードでは、DI信号に基づいて位置指令が入力され、POS0とPOS6が位置指令を選択し、CTRGが実行すればServoが位置命令を実行します。
0x08 CTRG
0X08 CTRGが立ち上がりエッジでPOS0-6の入力に合わせ、Servo内部で定義されたPRに沿って運転します。PR制御モードのみ使用できます。
0x02 SON
0x02 SONはServo ON信号でこの信号がTrueでなおかつアラームがない限り、ServoがONになります。
0x15 Cmd_OK
0x15 Cmd_OKがTrueになるとPR位置命令が実行完了だと示しています。
0x17 MC_OK
0x17 MC_OKはDO.Cmd_OKとDO.TOSが両方ON信号するときTrueになります。
つまり命令の実行成功(DO.Cmd_OK)と現在パルス値は設定パルス範囲内(DO.TOS)両方とも成立であることを示しています。DO.TOSをONする参照範囲はP1.048と関係あります。
0x05 TPOS
0x05 TPOS=Trueはパルス設定位置範囲(P1.054)以内であることを示しています。
P1.054 InPosition
TPOSがTrueになるかを参照するパラメータです。
例えばロータリモータの場合、P1.054=167772の場合、誤差パルス数が167772パルス以下になると、 TPOSがTrueになります。
これは167772/16777216=0.01回転に相当します。
Mapping
次は今回の記事でMappingした信号を紹介します。
Input
0x01 SON
0X01 SON=TrueでServo MotorをONにします。
すべての制御モードからも使用できます。
0x02 ARST
0X02 ARSTが立ち上がりエッジでServo Motorが発生したアラームなどをリセットします。
すべての制御モードからも使用できます。
0x08 CTRG
0X08 CTRGが立ち上がりエッジでPOS0-6の入力に合わせ、Servo内部で定義されたPRに沿って運転します。PR制御モードのみ使用できます。
0x11 0x12 0x13 0x1A 0x1B 0x1C 0x1E POS
POS0-POS6の入力レベルに沿って内部のPRを選択します。
例えばPR#5を選択したい場合、POS0、POS2をTrueにします。
PR制御モードのみ使用できます。
0x21 EMGS
0x21 EMGS=TrueでServo Motorを緊急停止します。
すべての制御モードからも使用できます。
Output
0x01 SRDY
0x01 SRDY=TrueはServoが準備Okの状態を示しています。
この状態は制御と主回路電源もあることを示します。
すべての制御モードからもこの信号を出力できます。
0x03 ZSPD
0x03 ZSPD=TrueはServo Motorの現在のSpeed=0を示しています。
この場合は実際の速度がP1.038の設定より低い場合を示します。
すべての制御モードからもこの信号を出力できます。
0x05 TPOS
0x05 TPOS=TrueはServo Motorの位置決めタスク完了であることを示しています。
この場合は実際の位置偏差はP1.054の設定値より小さいであることを示します。
PT/PRモードのみこの信号を出力できます。
0x07 ALRM
0x05 ALRM=TrueはServo Motorがアラームを発していることを示しています。
すべての制御モードからもこの信号を出力できます。
0x09 HOME
0x09 HOME=TrueはServo Motorが復旧完了したことを示しています。
PRモードのみこの信号を出力できます。
0x17 MC_OK
0x17 MC_OK=Trueは先程で説明したDO.Cmd_OKとDO.TPOS両方ともTrueしている状態になります。
PRモードのみこの信号を出力できます。
P1.038
0x03 ZSPDがTrueに遷移することを左右するパラメータです。現在SpeedはこのP1.038より小さい場合、0x03 ZSPDのがTrueに出力します。
Implementation
JTKET Side
Scan devices
もしServo Driveの最終プロジェクトを持っていないなら、File>Scan DeviceでUSBケーブル接続中のDriveを検索しプロジェクトに追加することが可能です。
Scanボタンでデバイスを検索します。
Done!今回の記事では使用してるKSD-A3-Lがみつかりました。
AddボタンをクリックしDriveをプロジェクトに追加しましょう。
Wiring
こちらはManualに載せてたNPNのIO配線図です。
OUTPUT
こちらは出力の配線図です。
INPUT
こちらは入力の配線図です。注意するのは今回使用するのはPNP配線です。
Mapping
次はIO Mappingを変更するため、Digital IO Jog Controlをクリックしましょう。
Mapping画面が表示され、各入出力が紐つけられたパラメータを一覧できます。
例えばDI6を変更したい場合、Edit DI/O ItemのCheckboxを入れ、DI6のDrop-Listから変更したいパラメータを設定できます。
設定が完了したらOKボタンをクリックし設定を保存しましょう。
Done!
もちろん入力をA/B設定に変更することも可能です。
Finally
こちらは今回記事で設定したDIO Mappingになります。
PR Mode Configuration
今回はPR Modeを使用しますので、Motion Control>PR Mode SettingでPR の設定画面を開きます。
Done!こちらはServo Drive内部の各Position Registerの設定画面になります。
Accel/Decel Time
こちらはServo Driveの加速・減速設定値になります。
AC00-A15まで16個の設定値があります。
Delay Time
こちらはServo DriveのコマンドDelay設定値になります。
DLY00-DLY15まで16個の設定値があります。
Internal Target Speed
こちらはServo Driveの速度設定値になります。
POV00-POV15まで16個の設定値があります。
Position Register
こちらはServo DriveのPosition Regiserになります。
PR00-PR99まで100個の設定値があります。
PR を開くと細かい設定項目が表示されます。
Read the PR
Read the Path Type and DataをクリックするとDriveから該当するPRの設定を読み込むことができます。
TYPE Settings
TYPE SettingsはこのPRはどんなMotion Taskを実行するかを設定できます。
Drop ListからPoint to Point・定速運転など多彩な制御タイプがあります。
OPT options
OPT Optionsの設定でいま実行中のPRを中断し、いまのPRを実行に切り替えるかを選択できます。
CMD
該当するPRを実行するコマンドです。絶対位置決め・相対位置決めなどのコマンドが用意されています。
Speed and Time Setting
こちらは該当するPRの速度値・加減速と遅延を設定できます。
Data
Dataは該当するPRの移動位置を設定できます。
Write Path
最後はWrite the path to driveでPRの設定をDriveに書き込みましょう。
Test it
では、実際にKSDソフトからPRの運転をテストしてみましょう。
Forced Srv On
まずForced Srv OnのCheckbox入れServo ONします。
Run Path
実行したいPR番号を入力し、Run PR.PathをクリックすればServo Driveが該当するPRを実行します。
Video
こちらの動画から操作の確認ができます。
Stop Path
運転中にServoを止めたい場合、Stop PR. Pathをクリックしましょう。
Video
こちらの動画から操作の確認ができます。
Wago Side
Options For FBD
FBDを実際に始める前に、OptionsからFBD,LD and IL editorを開き、Show Network titleとShow network CommentのCheckboxを入れましょう。
下図のようにNetwork TitleとNetwork Commentが表示されるようになります。
Add FBD Program
今度はPOUを追加するためApplication>Add Object>POUをクリックします。
Add POUの画面が表示されます。
NameでPOUの名前を入力しImplementation LanguageをFBDに設定しましょう。
Done!FBDプログラムが追加されました。
POU_Servo
次はServo Driveを制御するプログラムを作成します。
VAR
PROGRAM POU_Servo VAR Slot1:BYTE; Slot2:BYTE; Switch_Status1:BOOL; Switch_Status2:BOOL; iServo_Ready :BOOL; iHome_Completed :BOOL; iPR_Command_Completed:BOOL; iServo_Alarm :BOOL; iPosition_Reached:BOOL; iSpeedNotZero :BOOL; qServoON :BOOL; qCommandtrigger :BOOL; qAlarmReset :BOOL; qESTOP :BOOL; qCommands_PR_Bit0,qCommands_PR_Bit1,qCommands_PR_Bit2:BOOL; qSwitchLamp:BOOL; Switch_Lamp:BOOL; PRCommand1,PRCommands2,PRCommand3:BOOL; Alarms_Servo:BOOL; Alarms_ESTOP:BOOL; System_Reset:BOOL; Servo_Start :BOOL; Commands_Reset:BOOL; Commands_Servo_ON:BOOL; Commands_PR_INT:SINT; Commands_PR_Backup:SINT; Actual_PR:SINT; TON_0: TON; TON_1:TON; END_VAR VAR CONSTANT Always_ON:BOOL:=TRUE;//symbol comment END_VAR |
Program
Network1 Get Data From Process Input
こちらはFBDのEXECUTE Blockで、ST CodeをFBDのNetwork内で実行することができます。このBlockはSlot1の入力をUser Programの内部変数に移動するプログラムになります。
Execute BlockをNetworkに追加するため、Networkを右クリック>Insert Execute Boxします。
Done!EXECUTE Blockが追加されました。
EXECUTE Blockは3つの部分に分けられます。
- ENがTrueになるとEXECUTE Blockのプログラムが実行されます。
- ENOがTrueになるとEXECUTE Blockが実行に成功したことを示しています。
- 真ん中にある”Enter ST Code here..”のところにSTコードを入力できます。
Network2 System Reset
Commands_Reset変数をSystem_ResetからAssignされます。
Assignmentを追加するためにNetworkに右クリック>Insert Assignmentします。
このようなAssignment Formatが追加され、右の変数値が左のパラメータから与えます。
Network3 ESTOP Alarm
Network3はSwitchのNC接点が切れたらAlarms_ESTOPがTrueいなり、System_ResetがTrueにしないとAlarms_ESTOPがそのまま自己保持します。
AND Blockを追加するために右のToolboxからAND Blockを追加しましょう。
次はOR GateのパラメータにあるSwitch_Status2が小さい丸いICONついてますね。この丸い形はNOT Gateになります。
NOT Gateを追加したい場合はPinを選択した状態で右クリック>Negationを選択すればOkです。
Network4 Servo Alarm
Network4はiServo_AlarmがTrueになるとAlarm_ServoがTrueいなり、System_ResetがTrueにしないとAlarm_Servoがそのまま自己保持します。
Networkに新しいBoxを追加するにはToolboxからDropする以外、Networkの空き部分もしくは追加した場所に右クリック>Insert Empty Boxも可能です。
このように新しいEmpty Boxが追加されます。
黒文字の???ここをクリックし追加したいBoxを入力しましょう。
Done!AND BOXが追加されました。
Network Switch Lamp
こちらのNetworkではアラームが発生する場合、スイッチのLampをONするようにします。
Network6 Servo Start Command
こちらのNetworkはServo StartがコマンドをTrueにするときAlarmが発生していなければ、Commands_Servo_ONをTrueにしなおかつ自己保持します。
そしてアラームが発生した場合にCommands_Servo_ONの自己保持回路を切るようにします。
このNetworkで注意するのはServo_Startコマンドには小さな三角がついてるところです。その三角は立ち上げ検知という機能になります。
Boxに渡すパラメータが立ち上げ検知必要のところを選択し>右クリック>Edge DetectionをクリックしていただければOkです。
Network7 Reset Servo Start Command
こちらのNetworkはServo_Start コマンドが1秒以上ONにすると自動リセットするようにします。
Network8 Reset PR Command
こちらのNetworkはアラームが発生する・もしくはコマンド値は無効である場合はコマンドと現在Positionをリセットするようにします。
Network9 Back up the Command
こちらのNetworkは現在のコマンドと1つ前のコマンドを常に比較し、異なるであれば新しいコマンドを受信したことがわかります。
コマンドを更新したあと現在のCommand_PR_INTをCommands_PR_Backupに移します。
次はqCommandTriggerをTrueにしPR Jobを開始します。
Network10 Set the Command Bit
こちらのNetworkは最後に受信したコマンドをBit単位に分けて出力します。
例えばコマンド=3の場合、Bit0、Bit1がTrueになります。
Network11 Actual PR
iPosition_Reached=TrueならServo DriveのMotion Taskが完了することを示しています。
そのときコマンド値を現在位置として認識します。
Network12 Servo ON Output
Servo ONのコマンドです。
Network13 Alarm Reset
Servo のアラームリセットするコマンドです。
Network 14,15,16 PR Command Output
こちらは新しく受信し、なおかつ分解したBit Dataを出力します。
Network17 ESTOP STOP
Servoの緊急停止をトリガーするコマンドです。
Network18 Lamp Output
オペレーターに現在システムにエラーあるを示すため、Lampを光ります。
Network19 Reset
Commandが1秒以上ONすると自動的にリセットします。
Network20 Output to Process Output Image
最後は変数をProcess Output に出力します。
Download
LoginボタンでプログラムをWAGO PLCにDownloadしましょう。
Run
最後はStartボタンでRuntimeを起動します。
Result
こちらの動画で動作確認できます。
Wago.Control JTKET Sero Drive in PR Mode
Source Project
こちらのLinkから今回のサンプルプロジェクトをDownloadしてください。
https://github.com/soup01Threes/Codesys/blob/main/DemoProject_Wago_JKTEK_Servo_FBD.projectarchive