The Negligible Lab

Astray in the forest of electrical and electronic circuits. Adrift in the gap between time and frequency domains. 独立独歩を是とする。

LTspice用制御ライブラリContraille ~概要編~

はじめに

随分と間が開いてしまいましたが,如何お過ごしでしょうか? さて,今年(2021年)の元日,ぱわみ社さんより「パワーエレクトロニクス」第2号が発行されましたが,大変光栄なことに,本ブログの内容を基にして私もそこに寄稿させて頂きました。まさか自分がいわゆる〝同人誌〟に参加するなどとは思っていませんでしたが,Twitterでのご縁からこのような機会を頂戴することとなった次第です。

booth.pm rr-inyo.booth.pm

私の記事「LTspiceで三相PWM整流器を作る」の中で,掲題の自作制御ライブラリContrailleを紹介しておりますが,この度,Contrailleを下記に置きましたので,拙い完成度ではありますが,ご興味のある方は試してみて下さると幸いです。

github.com

本記事ではContrailleの概要について,ごく簡単にご説明しようと存じます。 各々のブロックについては長文になってしまうため次回以降に譲ります(分類毎に分割するかもしれません)。

開発の背景

LTspiceは旧Linear Technology社によって開発され,Analog Devices社に引き継がれた回路シミュレータであり,アナログ回路やスイッチング電源の解析・設計等,広範な分野で活用されております。

www.analog.com

パワーエレクトロニクス向けの回路シミュレータとしては,LTspiceの他にManitoba Hydro International社のPSCAD/EMTDCやPowerSim社のPSIM,そしてMathWorks社のMATLAB/Simulink + Simscape等が挙げられます。これらはいずれも,「信号」という概念を持っており,電気回路とブロック線図は別々に扱われます。また,PI制御器等のダイナミクスを持つ要素,四則演算,三角関数,論理演算,各種信号源を標準で備えており,これらを用いてブロック線図を描けば,制御システムを容易にモデル化できます。

一方,LTspice,ひいてはSPICE一般には「信号」という概念がなく,すべてが電気回路として解かれます。また,制御用コンポーネントは残念ながらあまり充実しているとは言えず,制御回路についてはオペアンプ等を使ってアナログ回路として組むか,ビヘイビア電源(Arbitrary behavioral voltage source, B)を組み合わせて作るしかありませんでした(ただしビヘイビア電源の記述は自由で強力です)。これは,LTspiceが「実在する電子部品」のシミュレーションに力点を置いている裏返しとも言えるかもしれません。

f:id:s-inoue2010:20210124044119p:plain
図1: Contrailleロゴマーク

そこで,先に挙げた3つの回路シミュレータにあるようなブロック線図ベースで制御回路を作ることができる制御ライブラリを作り,「Contraille」と名付けました。制御(control)が軌道(rail)に乗り,航跡(contrail)を描いて飛び立つようにとの思いを込めています。図1にロゴマークを示します*1

なお,LTspice向けの制御ライブラリとしては,金田洋志さんのLTspice Control Libraryが先行しておりますが,SPICEネットリストの勉強のため,私自身でも作ってみることにしました。特に,離散時間系を実現するためのサンプル & ホールドやユニットディレイ(z−1)の作り方については,LTspice Control Libraryを大いに参考にさせて頂きました。

github.com

Contrailleの構成とインストール方法

制御ブロックの分類

Contrailleでは,制御ブロックを表1に示す7種類に分類しています。ブロックは合計で137個になります。

表1: Contrailleの制御ブロック分類

No.分類ブロック数概要
1連続時間系(Continuous)251次・2次遅れ要素,PI制御器等
2離散時間系(Discrete)33S & H,ユニットディレイ(z−1),双一次変換で実装した1次・2次遅れ要素,PI制御器等
3数学関数(Math)35四則演算,三角関数,指数・対数関数等
4論理ゲート(Logic)8NOT, AND, OR, NAND, NORゲート等
5信号源(Signal sources)14定数,正弦波,矩形波三角波
6座標変換(Coordinates)9直交-極座標変換,α-β変換,d-q変換等
7電力用ツールボックス(Power toolbox)13三相電圧源,変圧器,遮断器,電圧・電流センサ等

各ブロックを分類するにあたり,極力分かり易くしたつもりではありますが,一部,自明ではない分類になっていたりします。例えば比例要素は連続時間系の中にしか入っておらず,離散時間系には入っていません。比例要素はダイナミクスを持たないため,連続時間系・離散時間系の本来どちらにも同じブロックを使うことができるのですが,そういった要素は代表して連続時間系に分類しています。

ファイル構成

LTspice XVIIをインストールすると,「ドキュメント」フォルダ*2の中にLTspiceXVIIというフォルダが作られ,その中のlibフォルダにライブラリが格納されています。図2にlibフォルダの構成を示します。図2のように,cmp,sub,symという3つのサブフォルダがあります。cmpフォルダにはバイポーラトランジスタやFET,ダイオード等のモデルが格納されております。

f:id:s-inoue2010:20210123024023p:plain
図2: LTspiceXVII\libフォルダの構成

subフォルダにはいわゆるsubcircuitとして実装されているコンポーネントの本体*3,symフォルダにはそれらのコンポーネントのためのシンボルが格納されております。Contrailleにおいても同様に,subフォルダにsubcircuitの本体,symフォルダにシンボルを置くこととしました。

f:id:s-inoue2010:20210123024048p:plain
図3: lib¥sub\Contrailleフォルダの内容

図3はlib\sub\Contrailleフォルダの内容です。ファイル名から明らかなように,各libファイルは表1の分類に対応しており,1つのファイルに複数のsubcircuitを記述しています。

f:id:s-inoue2010:20210123024155p:plain
図4: lib\sym\Contrailleフォルダの内容

図4はlib\sym\Contrailleフォルダの内容です。こちらはそれぞれのブロックに相当するシンボルを7つの分類毎にフォルダに分けて格納しています。

インストール方法

GitHubにはContrailleに関係するlibフォルダ以下の構造を保って各ファイルを置きました。gitコマンドが使えれば,

$ git clone https://github.com/RR-Inyo/Contraille 

とすればダウンロードは簡単です…。 GitHubからcloneやzipとしてダウンロードしたフォルダ構造を,そのまま「ドキュメント」フォルダ以下のLTspiceXVIIフォルダの下にコピーして下さい。 インストーラを作っておらず*4,大変ご面倒で恐縮です*5💧

制御ブロック実装の基本的な考え方

前述のように,LTspiceではすべてが電気回路です。Contrailleでは制御ブロックの入力部を電圧制御電圧源(General types of voltage-dependent voltage-source circuit elements, E)の制御入力部,または100 MΩの抵抗器とし,出力部を電圧制御電圧源の出力部,または出力インピーダンス零のビヘイビア電源として実装しています。信号はノード電圧(GNDに対する電位)で表現され,ブロックから流出する電流には信号としての意味はありません*6。連続時間系の1次LPFを例にとると,図5のようになっています。

f:id:s-inoue2010:20210124025959p:plain
図5: 連続時間系の1次LPFの内部構成

図5(a)はContrailleでのブロック,(b)が電圧制御電圧源を使った表現,(c)がSPICEネットリストです。一般のブロックでは概ね,入力部のノード名を「u」,出力部のノード名を「y」としています。なお,1次LPFは1入力1出力であるため,このように1つの電圧制御電圧源だけで成り立っていますが,入力が複数ある場合にはそれぞれの入力を100 MΩの抵抗器でいったん受け,ビヘイビア電源にて各入力のノード電圧から出力を演算しています。

シンボルについては,LTspice XVIIがUnicodeに対応したことを利用して,ギリシャ文字や上付き,下付き文字を使い,なるべく直感的に分かるような絵作り(!?)をしています。

使用例

「ドキュメント」フォルダ以下のLTspiceXVIIフォルダの直下にはexamplesというフォルダがあります。Contrailleの使用例として,いくつかのschematicをexamplesフォルダに置きましたので,そのうちの1つをここでご紹介します。

図6にContrailleを使用した水位制御系の解析例を示します。これは孔の開いた水槽の水位を一定に維持するように,流入させる水の流量を調整するフィードバック制御系です。制御工学の教科書に必ずと言って良いほど登場する例題の1つですね。水の呼吸!…もとい制御なので,当然「電気」ではありません。回路シミュレータというのはより一般化すれば連立常微分方程式のソルバとも考えることができるので,電気以外の現象にも適用できます。昨今では,感染症の感染拡大をLTspiceでシミュレーションした研究例などが注目されましたね*7

f:id:s-inoue2010:20210124041205p:plain
図6: Contrailleを使用した水位制御系の解析例

さて,この水位制御系において,水位をh,重力加速度をgとすると,断面積Sの孔から流出する流量qoutは次式で表されます。

q_{\mathrm{out}} = S \sqrt{2gh} \tag{1}

また,水槽の上から流入させる水の流量をqin,水槽の底面積をAとすると,水位hは次式で書けます。

h = \displaystyle \frac{1}{A} \int (q_{\mathrm{in}} -q_{\mathrm{out}}) dt \tag{2}

本解析例では,水槽の底面積A = 1 m2,孔の断面積S = 2 π × 0.022 = 2.51 × 10−3 m2としました。また,水位hを観測するセンサにT = 2 sのむだ時間があり,さらに流入量には0 m3/sという下限(蛇口全閉までで負の流入はない),0.02 m3/sという上限(蛇口全開)があることとしました。

このような条件で,hの観測信号hsenseを使って水位をPI制御します。 PI制御のゲインはZiegler-Nicholsの限界感度法を用いて決めています。

水位指令値h*を時刻t = 10 sで0 mから0.25 mに立ち上げ,さらに時刻t = 90 sで0.25 mから1 mに立ち上げます。さらに,時刻t = 210 sで流出量に0.002 m3/sの外乱を与えましたが,水位を指令値通りに制御できていることが分かります。

この例では,電気現象を一切扱っておらず,また,プラントのモデルも物理モデル(LTspiceには電気以外は存在しませんが)ではなくブロック図で表現しているため,MATLABに例えればSimscapeを使わない純粋なSimulinkでの解析に近いのではないかと思います。

まとめと次回予告

以上でContrailleの開発背景,ブロックの分類,ファイル構成,LTspiceでの実装方法,そして解析例について述べました。それぞれのブロックの詳細については次回以降で詳しく(できれば…)取り扱いたいと存じます。

*1:えぇ…中二病です…💦

*2:皆さま各自の環境に合わせて読み替えて下さい。

*3:LTspiceに同梱されているsubcircuitはバイナリ化されているものがほとんどです。一部,プレーンテキストとして読めるsubcircuitもあります。

*4:LTspice Control Libraryにはインストーラのバッチファイルがあります…。パクればあるいは…💧

*5:gitをもっと使いこなせば,直接LTspiceのフォルダに流し込んだりできるのでしょうか…?

*6:ただし,電気回路なのでブロック図に抵抗器,インダクタ,キャパシタ等を直接接続できます(笑)。巧く利用すれば,ときに簡潔なモデル表現が可能となります。

*7:https://rad-it21.com/%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9/kado_kanda_20200714_1/