目标是从输出到 MPC 和 PID 绘制反馈线,如附图所示。
\documentclass[border=3cm]{standalone}
\usepackage[dvipsnames]{xcolor}
\usepackage{tikz}
\usepackage{amsmath}
\usetikzlibrary{positioning, arrows.meta}
\begin{document}
\begin{tikzpicture}[>=Stealth, auto, node distance=2cm, thick]
% Create nodes
\node[draw, rectangle, minimum width=2cm, minimum height=1cm] (MPC) at (0,0) {MPC};
\node[draw, circle, minimum size=0.6cm, right=of MPC] (sum){};
\node[draw, rectangle, minimum width=2cm, minimum height=1cm, below=of MPC] (PID) {PID};
\node[draw, rectangle, minimum width=2.5cm, minimum height=1cm, right=of sum] (MPD) {MPD System};
% Connect nodes
\draw[-] (sum.north east) -- (sum.south west);
\draw[-] (sum.south east) -- (sum.north west);
\draw[->] (MPC) -- node[pos=0.5] {$u_{\text{MPC}}(t)$} (sum.west);
\draw[->] (PID.east) -| node[pos=0.25, above] {$u_{\text{PID}}(t)$} (sum.south);
\draw[->] (sum.east) -- node {$u(t)$} (MPD.west);
\draw[->] (MPD.east) -- node[pos=0.8] {} ++(1,0);
\draw[<-] ([yshift=+0.2cm]MPC.west) -- node[pos=0.8] {} ++(-1.5,0);
\draw[->] ([xshift=-0.8cm,yshift=+0.2cm]MPC.west) |- ([yshift=+0.2cm]PID.west);
% Add labels
\node[above left=-.3 and 0.9cm of MPC] {Ref.};
\node[right=1cm of MPD] {$P_{\text{bit}}$};
\end{tikzpicture}
\end{document}
我将非常感激您就如何将反馈线无缝集成到现有代码中提供的指导。此外,如果您有任何建议来提高框图的专业性或任何其他方法,我都愿意考虑。
为了更清楚地理解,我附上了描述当前状态和期望结果的相关图像。
答案1
最系统的方法可能是使用封装块或类似的东西。
但是,如果您想手动执行此操作,可以采用以下方法:
- 因为懒,我几乎放弃了数学模式 // 它很容易添加,而且会使代码更加模糊
- 从本质上来说,这幅画有点混杂
- 把积木 + 十字架放在一起
- 绘制各种连接
- 在需要的地方放置额外的矩形线节点,使用极坐标符号,例如在输入端
- 将大多数节点作为标签放在这些路径内(这会使阅读变得更加困难)
- 故意将极性放在最后,尽管它们也可以在所述路径中(使代码更加难以辨认)(我在这里使用了数学模式,因为减号有点长)
- 我把一些空节点和一个坐标放在你想要点的位置
我认为这里不需要点和驼峰来进行连接。
在这里使用起来很诱人{Circle}
,就像这样
\draw[{Circle}-{Circle}] (A) -- (B);
来模仿点,但随后你必须稍微延长箭头或移动其尖端。
\documentclass[border=3mm]{standalone}% just my preference
\usepackage{tikz}
%\usepackage{amsmath}
\usetikzlibrary{positioning, arrows.meta}
\begin{document}
\begin{tikzpicture}[auto, node distance=2cm,
> = {Stealth},
blks/.style={draw, minimum width=20mm,inner sep=4mm},
sum/.style={draw,circle,minimum size=6mm},
]
% ~~~ blocks ~~~~~~~~~
\node[blks] (M) at (0,0) {MPC};
\node[blks,below=of M] (P) {PID};
\node[sum,right=of M] (S) {}; % sum
\node[blks,right=of S] (Y) {MPD system};
% cross
\draw[-] (S.north east) -- (S.south west);
\draw[-] (S.south east) -- (S.north west);
% ~~~ connections ~~~~~~
% --- output
\draw[->] (Y.east) -- node[pos=0.5](O){} +(1.3,0)node[anchor=west]{Pbit};
%--- inside, mixed with labels
\draw[->] (M.east) -- node{uMPC(t)} (S.west);
\draw[->] (P.east) -| node[anchor=south,pos=.25]{uPID(t)} (S.south);
\draw[->] (S.east) -- node{u(t)} (Y.west);
%--- feedbacks
\draw[<->] (P.190) -- +(-1.3,0) coordinate (D) |- (M.190);
\draw (D) -- +(0,-1.5) -| (O);
%--- input
\draw[<-] (M.170) -- +(-2,0)
node[pos=.35,anchor=center,inner sep=0pt] (I) {}
node[anchor=south]{Ref.};
\draw[->] (I) |- (P.170);
% ~~~ polarities ~~~~~~~~~~~~
\node[red,xshift=3mm] at (P.170) {$+$};
\node[red,xshift=3mm] at (P.190) {$-$};
\node[red,xshift=-4mm,yshift=-3mm] at (S.west) {$+$};
\node[red,xshift=+4mm,yshift=-3mm] at (S.south) {$+$};
\end{tikzpicture}
\end{document}