Slide 1

Slide 1 text

sakalib.com PLCでも出来た!おウチで制御工学 2025/02/01(土) 第21回FA設備技術勉強会 LT枠 発表資料

Slide 2

Slide 2 text

sakalib.com 1/14 自己紹介 坂田 晃一 専門:制御工学、モーションコントロール 略歴 2011年3月 博士(工学) 2011年4月-現在 精密機器メーカー勤務 2022年8月-現在 個人事業主 屋号SakaLib 制御セミナー講師・コンサルティング プライベート 子供たちが寝静まった夜に「おウチで制御工学」しています。 @sakata0330

Slide 3

Slide 3 text

sakalib.com 2/14 はじめに ⚫ モータ制御は確立されている技術で、上流からは指令通りに動いて当たり前 ⚫ サーボモータ用ドライバの高性能化のおかげで、大抵のものは動かせてしまう 上流 下流 •画像処理 •軌道計画 •故障予測 Intelligence •PLC Sequence Control •制御設計 •メカトロニクス •パワーエレクトロニクス Motion Control 制御機器のソフト階層 FA制御の主戦場は明確にPLCから上流 マルチレート制御 とはいえ汎用ドライバでは賄いきれない、 特定の産業機器に特化した独自の制御を 実装したいケースもマイナーだが存在する。 例: 露光装置、加工機械、HDD、etc. PLC 動け! ハイ! ココをPLC上でやっちゃう話

Slide 4

Slide 4 text

sakalib.com 3/14 システム構成 IPC PLC Sequencer GUI (HMI) Motion Control EtherCAT Driver Motor Driver Motor Encoder Position/Velocity Control Current (Torque) Control 高速リアルタイム制御 (62.5~125us) 軌道生成 毎サイクル分割指令 論理・順序設定 基本的なシステム構成 Motor Driver Motor Encoder IPC PLC Position/Velocity Control Current (Torque) Control Sequencer GUI (HMI) Motion Control EtherCAT Driver PLCでリアルタイム制御な構成

Slide 5

Slide 5 text

sakalib.com 4/14 ハードウェア構成(おウチでver) ①数万円の市販PC+②TwinCAT対応NIC+③EtherCAT対応モータドライバ+④サーボモータ TwinCAT3が優秀すぎて、市販PCでも趣味の開発レベルでは問題なく動作してしまう!※保証外 実行環境PC EtherCATマスタ (TwinCAT3 XAR) 兼 開発環境PC (Python/TwinCAT3 XAE) 24VDC Power 開発環境PC (Python/TwinCAT3 XAE) EtherNET EtherCAT 開発環境PCと実行環境PCを分けたい場合 EtherCAT Motor Driver Servomotor 1. TwinCAT対応NICの搭載 2. TwinCAT3のインストール 3. TwinCAT Realtime Ethernet Driverのインストール 4. Windowsテストモードへの変更 5. CPU CoreのIsolation(リアルタイム処理の安定動作のため) 市販PCのIPC化について 実行環境PCには中華ミニPCが格安で便利だが、 Windowsライセンスの形態に注意! • CPU: Intel N100, 12th Gen, 4Core/4Thread • Memory, Storage: 16GB, 512GB • LAN port×2: i225-V (TwinCAT対応NIC搭載) なんちゃってIPC

Slide 6

Slide 6 text

sakalib.com 5/14 制御系ブロック全体図 モータ ドライバ 実行環境PC サンプリング周波数8kHz サンプリング周波数16kHz ドライバはCSTモードで電流制御を行い、PLC (ST言語)で記述した位置制御系をIPCで実行 ドライバ+モータ 実行環境PC 対応

Slide 7

Slide 7 text

sakalib.com 6/14 FB制御器の設計とPLCへの取り込み https://github.com/Koichi-Sakata/pylib_sakata 1.PythonでFB制御器(離散時間伝達関数)を設計し、 各係数をCSVファイルに保存 2.PLC Program: P_CSV_READにてCSVファイルの値を バッファ配列へCopy 3.PLC Program: MAINにてバッファ配列から制御器構造体へ 1サイクル (125us)内でCopy

Slide 8

Slide 8 text

sakalib.com 7/14 PLCで高速リアルタイム制御 VAR fbPD : FB_TF1_EXE; fbPID : FB_TF2_EXE; ―――――――――――――――――――――――――――――――――――――――――――― IF RTC.gbFlagServoExe = TRUE AND RTC.gbFlagContrInit = FALSE THEN IF RTC.giModeFBType = 1 THEN // PID fbPID( dIn := dErrPosUm * 1.0E-6, stTfState := RTC.gstFbState, stTf2Inf := RTC.gstPidInf, dOut => dFbOutN, stTfState1 => RTC.gstFbState ); ELSIF RTC.giModeFBType = 2 THEN // PD fbPD( dIn := dErrPosUm * 1.0E-6, stTfState := RTC.gstFbState, stTf1Inf := RTC.gstPdInf, dOut => dFbOutN, stTfState1 => RTC.gstFbState ); ELSE // Manual dFbOutN := DRV.gdRatedTorqueMn * dFbOutManualPercent * 1.0E-5; END_IF // Copyright(c) 2025 Koichi Sakata (SakaLib) VAR_INPUT dIn : LREAL; stTfState : TF_STATE; stTf2Inf : TF2_INF; END_VAR VAR_OUTPUT dOut : LREAL; stTfState1 : TF_STATE; END_VAR ――――――――――――――――――――――――――――――― dOut := stTf2Inf.dB[0] * dIn + stTf2Inf.dB[1] * stTfState.dInPre[0] + stTf2Inf.dB[2] * stTfState.dInPre[1] - stTf2Inf.dA[1] * stTfState.dOutPre[0] - stTf2Inf.dA[2] * stTfState.dOutPre[1]; stTfState.dInPre[1] := stTfState.dInPre[0]; stTfState.dInPre[0] := dIn; stTfState.dOutPre[1] := stTfState.dOutPre[0]; stTfState.dOutPre[0] := dOut; // Copy to output stTfState1 := stTfState; Function Block: FB_TF2_EXE Program: MAINの一部抜粋 離散時間伝達関数の計算をFunction Blockで 作成し、MAINの中で毎サイクル (125us)ぶん回す!

Slide 9

Slide 9 text

sakalib.com 8/14 TwinCAT PLCのリアルタイム処理能力 PID制御器+ノッチフィルタ×20個+ピークフィルタ×20個の演算+4次多項式目標軌道演算+I/O処理、諸々含めて、 1軸分の処理時間:約20us ドライバ+モータ 実行環境PC

Slide 10

Slide 10 text

sakalib.com 9/14 なぜPLCでも高速リアルタイム制御が可能なのか考察 下図の参照元:https://infosys.beckhoff.com TwinCATでは、ProjectをPLC (ST言語)で作ろうがC++で作ろうが、 実行環境PC (XAR)内にTcCOMと呼ばれる共通のModule形式で実装される。 開発言語は開発手段の違いでしかなく、実装形態は変わらない。 C++とPLCのコンパイラの違いは処理速度に大きな性能差は無い。(?)

Slide 11

Slide 11 text

sakalib.com 10/14 1.数十usレベルの高速リアルタイム制御も実装できた! 2.実行中に関数内のローカル変数までリアルタイムに見える!書き換えられる! 3.変数の宣言と実態が同時 4.プロジェクト実行時の署名と認証が不要! PLCの良かったところ (自分が)乗り越えなければいけなかった敷居 • 代入演算子が「=」ではなくて「:=」 • 等価演算子が「==」ではなくて「=」 • 型の名前:64bit浮動小数点は「double」ではなくて[LREAL] • FBの略がFeedbackではなくてFunction Block 逆に言えばそのくらいしか無かった

Slide 12

Slide 12 text

sakalib.com 11/14 おまけ① PLC Visualizationで作成してみたGUI (HMI) 月並みな感想: ①Toolboxから使いたいアイコン選んで、②いい感じに配置して、③Propertiesから対応する変数を選ぶだけ!めちゃ楽!

Slide 13

Slide 13 text

sakalib.com 12/14 おまけ② モータ動特性を考慮した仮想モータ軸 VAR fbPlant : FB_TF2_EXE; ――――――――――――――――――――――――――――――――――――――――――――――――――――――― TorqueActualValue := LREAL_TO_INT(FC_SAT( INT_TO_LREAL(TargetTorque), INT_TO_LREAL(MaxTorque) )); dServoOutN := INT_TO_LREAL(TorqueActualValue) * dRatedTorqueMn * 1.0E-6; IF ControlWord = 16#0F THEN // Plant fbPlant( dIn := dServoOutN, stTfState := stPlantState, stTf2Inf := stPlantInf, dOut => dActPosM, stTfState1 => stPlantState ); END_IF PositionActualValue := LREAL_TO_DINT(dActPosM * dEncoderReso * 1.0E3); Program: P_VIRTUAL_MOTORの一部抜粋 EtherCAT CiA402 drive profileに準拠したI/O # Plant model M = 0.0185 C = 0.7 K = 0 Pmechs = ctrl.tf([1.0], [M, C, K]) Pmechz = ctrl.c2d(Pmechs, Ts, method='zoh') Pythonで定義した制御対象 (サーボモータ)の離散時間伝達関数を、 別に作成したVirtualMotor Project内で、制御器の実装と同様に実行している。

Slide 14

Slide 14 text

sakalib.com 13/14 おまけ② 仮想モータと実モータのChirp加振時間応答比較 仮想モータ 実モータ TwinCAT Measurement YT Scopeにて比較

Slide 15

Slide 15 text

sakalib.com 14/14 宣伝:TwinCATとPythonで学ぶモデルベースト制御講座 Beckhoff Automation公式HP 申し込みページ TwinCAT3 Training/Individual/TR9001 https://www.beckhoff.com/ja-jp/support/training-offerings/tr9001/ @sakata0330 1. はじめに 2. モデリング 3. システム同定 4. FB制御器設計 5. 制御性能と安定性 6. 制御器の離散化 7. 制御器の実装 8. 実験準備 9. ソフトウェア説明 10. 実習:システム同定から実装まで 11. 目標軌道生成 12. 振動とフィルタ設計 13. 2慣性系の実験準備 14. ノッチフィルタ設計 15. 最適ピークフィルタ設計 16. 外乱オブザーバ設計 17. 制御対象の離散化 18. 2自由度制御系とFF制御設計 19. 多軸制御と座標変換 • 単なるゲイン調整ではないモデルに基づく理論的な制御設計を学んでモータ制御してみたい方。 • TwinCAT3でモータ制御開発を始めたいけど具体的な環境構築が分からない方。 • 制御器/フィルタの設計~実装~解析まで実践的な制御開発を体験してみたい方。 期間 :理論編 (1日間)、実践編(2日間)の計3日間 開催日:応相談 場所 :ベッコフオートメーション株式会社内トレーニングルーム (横浜/名古屋) 対象者 アジェンダ 講師:

Slide 16

Slide 16 text

No content