制御系のブロック線図を TikZ で描く

はじめに

制御系の説明で使うブロック線図 ── 伝達関数のブロック、加算点、分岐点、フィードバック経路 ── は、TikZ で素直に描けます。同じ TikZ で、確率モデルのグラフィカルモデルや圏論の可換図式も描けます。

準備とスタイル定義

専用パッケージは使わず、positioning(相対配置)、calc(座標計算)、arrows.meta(矢じり)だけで組みます。

\usepackage{tikz}
\usetikzlibrary{arrows.meta, positioning, calc}

\tikzset{
  >={Stealth[]},
  block/.style  = {draw, thick, minimum height=2.8em, minimum width=3.2em, align=center},
  sum/.style    = {draw, thick, circle, inner sep=0pt, minimum size=5mm},
  branch/.style = {circle, fill, inner sep=1.3pt},   % 分岐点(黒丸)
}
  • block … 伝達関数を書く矩形
  • sum … 加算点(小さい丸)
  • branch … 信号を取り出す分岐点(塗り丸)

開ループ

まずは 1 ブロックだけ。\coordinate で入出力の端点を置き、node[above] で信号名を矢印に添えます。

\begin{tikzpicture}[node distance=1.7cm]
  \coordinate (in);
  \node[block, right=of in] (G) {$G(s)$};
  \coordinate[right=of G] (out);
  \draw[->] (in) -- node[above]{$U(s)$} (G);
  \draw[->] (G) -- node[above]{$Y(s)$} (out);
\end{tikzpicture}
入力 U(s) がブロック G(s) を通って出力 Y(s) になる開ループ

出力例:開ループ。$Y(s) = G(s)\,U(s)$。

単一フィードバックループ

閉ループの要点は 3 つです。

  1. 加算点 sum を置き、入力と帰還を集める
  2. 出力線の途中に branch(黒丸)を置いて信号を取り出す
  3. 帰還経路を -|(先に水平、次に垂直)や |- で直角に引き回し、加算点に戻す
\begin{tikzpicture}[node distance=1.7cm]
  \coordinate (in);
  \node[sum, right=1.2cm of in] (sum) {};
  \node[block, right=1.4cm of sum] (C) {$C(s)$};
  \node[block, right=of C] (P) {$P(s)$};
  \coordinate[right=1.8cm of P] (out);
  \node[branch] at ($(P)!0.55!(out)$) (pick) {};

  \draw[->] (in)  -- node[above]{$R(s)$} (sum);
  \draw[->] (sum) -- node[above]{$E(s)$} (C);
  \draw[->] (C)   -- node[above]{$U(s)$} (P);
  \draw[->] (P)   -- node[above,pos=0.9]{$Y(s)$} (out);
  \draw[->] (pick) -- ++(0,-1.25) -| (sum);   % 分岐→下→左→加算点へ

  \node at ($(sum)+(-0.33,0.30)$) {$+$};
  \node at ($(sum)+(0.30,-0.33)$) {$-$};
\end{tikzpicture}
R(s) が加算点に入り、C(s)、P(s) を通って Y(s) になり、出力の分岐点から負帰還で加算点に戻る

出力例:単一フィードバック系。開ループ伝達関数を $L = P C$ として、閉ループは $Y/R = L/(1+L)$。

ポイント:

  • ($(P)!0.55!(out)$) は calc の記法で「P と out を結ぶ線分の 55% の点」。分岐点をここに置く
  • -- ++(0,-1.25) -| (sum) で「現在地から下へ 1.25、そこから加算点へ直角に」
  • 符号 $+$ $-$ は加算点の脇に \node で個別に置く(自動では付かない)

外乱を含む閉ループ

加算点をもう一つ足し、外乱 $D$ を上から入れます。

\begin{tikzpicture}[node distance=1.6cm]
  \coordinate (in);
  \node[sum, right=1.1cm of in] (s1) {};
  \node[block, right=1.3cm of s1] (C) {$C(s)$};
  \node[sum, right=1.3cm of C] (s2) {};
  \node[block, right=1.3cm of s2] (P) {$P(s)$};
  \coordinate[right=1.8cm of P] (out);
  \node[branch] at ($(P)!0.55!(out)$) (pick) {};

  \draw[->] (in) -- node[above]{$R$} (s1);
  \draw[->] (s1) -- node[above]{$E$} (C);
  \draw[->] (C)  -- node[above,pos=0.4]{$U$} (s2);
  \draw[->] (s2) -- (P);
  \draw[->] (P)  -- node[above,pos=0.9]{$Y$} (out);
  \draw[->] ($(s2)+(0,1.3)$) -- node[right,pos=0.15]{$D$} (s2);   % 外乱
  \draw[->] (pick) -- ++(0,-1.3) -| (s1);                          % 負帰還

  \node at ($(s1)+(-0.33,0.30)$) {$+$};
  \node at ($(s1)+(0.30,-0.33)$) {$-$};
  \node at ($(s2)+(-0.36,0.32)$) {$+$};
  \node at ($(s2)+(0.33,0.20)$) {$+$};
\end{tikzpicture}
R が加算点 s1 に入り C(s) を通過、加算点 s2 で外乱 D が加わり P(s) を通って Y になり、負帰還で s1 に戻る

出力例:外乱 $D$ が制御対象の入力側に加わる系。$Y = \dfrac{PC}{1+PC}R + \dfrac{P}{1+PC}D$。

配線のコツ

  • 直交で引く:信号線は水平・垂直だけにする。-| と |- で曲がり方(先に横/先に縦)を選ぶ
  • 端点は \coordinate:入出力やジャンクションは見えない点として置くと、線の起点・終点を指定しやすい
  • 分岐点は線の上:calc の !割合! で線分上に黒丸を置く。分岐後の線は分岐点ノードから引く
  • 符号は手動:加算点の + / - は自動で付かないので \node で配置する。位置は加算点中心からの相対で微調整
  • ブロックの高さをそろえる:minimum height / minimum width を固定し、node distance で間隔を管理する

他の選択肢

  • circuitikz … 回路図向けだが、\draw (0,0) to[...] ... の記法でブロックや加算器の部品も持つ
  • blox … ブロック線図専用のパッケージ。\bXInput, \bXComp(加算器)などのマクロで組む

決まった部品を多用するなら専用パッケージ、図ごとに配線や体裁を作り込むなら素の TikZ、という使い分けになります。

運用

図は standalone で 1 枚ずつ別ファイルにし、本文から \input します。ビルドは latexmk、環境固定は TeX Live 入りコンテナの記事にまとめてあります。この記事の図も、上のコードを standalone でコンパイルして dvisvgm で SVG 化したものです。

関連記事

まとめ

  • block / sum / branch の 3 スタイルを定義すれば、たいていのブロック線図は書ける。
  • 配置は positioning の right=of、配線は -| / |- の直交、分岐点は calc の !割合! で線上に。
  • 加算点の符号は自動で付かないので \node で手動配置する。
  • 定型部品が多いなら blox などの専用パッケージも検討する。

信号の流れを追いながら「配置 → 配線 → 符号」の順に置いていけば、閉ループでも数行〜十数行で描けます。

LaTeX組版・教材校正のご依頼・ご相談はコレクトコネクトへお問い合わせください。

← コラム一覧へ