
블록은 "하나의 기능을 수행하는 부품" 이다. 블록들을 레고처럼 조합해서 하나의 시스템을 만든다
┌─────────────┐
입력 ──▶│ 블록 │──▶ 출력
(Input) │ (연산 수행) │ (Output)
└─────────────┘
(1) 입력 포트 (Inport): 왼쪽에 있는 화살표 받는 곳
(2) 출력 포트 (Outport): 오른쪽에서 화살표 나가는 곳
(3) 블록 내부: 정해진 연산을 수행

┌─────────────────────────────────────────────┐
│ 블록 종류 │
├───────────────┬──────────────┬───────────────┤
│ 소스 블록 │ 처리 블록 │ 출력 블록 │
│ (Source) │ (Process) │ (Sink) │
├───────────────┼──────────────┼───────────────┤
│ 입력만 있음 │ 입력→연산→출력 │ 출력만 있음 │
│ 신호를 만듦 │ 신호를 가공 │ 결과를 표시 │
├───────────────┼──────────────┼───────────────┤
│ • Step │ • Gain │ • Scope │
│ • Constant │ • Sum │ • Display │
│ • Sine Wave │ • Integrator │ • To Workspace│
│ • Clock │ • Transfer Fcn│ • To File │
└───────────────┴──────────────┴───────────────┘
소스 블록 -> 처리 블록 -> 출력 블록 순서로 연결하면 하나의 시뮬레이션이 완성된다.
[Step] ────────────▶ [Gain] ────────────▶ [Scope]
신호선① 신호선②
(계단 신호가 흐름) (증폭된 신호가 흐름)
(1) 화살표 방향 = 데이터가 흘러가는 방향
(2) 각 신호선은 매 시뮬레이션 스텝마다 값을 전달
(3) 선 위에 마우스를 올리면 현재 흐르는 값을 볼 수 있음

┌──▶ [Scope 1]
[Step] ──▶ [Gain] ─┤
└──▶ [Scope 2]
위와 같이 신호를 분기시켜서 여러 블록에 신호를 동시에 보낼 수 있다.
Inport 1 ──▶┌─────────┐
│ 블록 │──▶ Outport
Inport 2 ──▶└─────────┘

복잡한 모델을 정리정돈하기 위한 "폴더" 같은 개념이다.
예를들어 서브시스템 적용 전에는
[Step]→[Gain]→[Sum]→[Integrator]→[Gain2]→[Saturation]→[Scope]
↑_____________________________________|
위와같이 복잡했다면, 서브시스템 적용 후에는
┌───────────────────┐
[Step] ────▶ │ 제어기 서브시스템 │ ────▶ [Scope]
│ (내부에 블록들) │
└───────────────────┘
이렇게 단순화가 가능하다.
참고로, 서브시스템을 더블클릭하면 내부로 들어가서 서브시스템을 이루는 블록들을 확인할 수 있다.

시간을 어떻게 진행시킬 것인가?"를 결정하는 핵심 설정
연속 시간 (Continuous) 이산 시간 (Discrete)
───────────────── ─────────────────
│ │ • │ • │ • │ • │
│ 부드러운 곡선 │ 샘플 점들
│ (아날로그 시스템) │ (디지털 시스템)
───────────────── ─────────────────
솔버: ode45 (가변스텝) 솔버: Fixed-Step
적분기(1/s) 사용 Delay(z⁻¹) 사용
컴퓨터는 디지털 시스템이다. 즉 연속적인 시간 표현이 불가능하다.
그래서 연속적인 시간의 표현이 필요하면 최대한 높은 주파수로 계산해서 연속적인 곡선을 최대한 정밀하게 근사한다. (연속 시간 솔버)
연속 시간 솔버는 시간 간격을 솔버가 알아서 조절하고 주로 아날로그 회로나 물리 시스템에 어울린다.
반면, 이산 시간의 표현이 필요한 경우는 내가 정한 간격그대로 정해진 간격마다 알아서 딱딱 끊어서 계산을 수행하게된다.
이산 시간 솔버는 시간 간격을 내가 정해주고 디지털 제어기, MCU 개발에 어울린다.


매 시뮬레이션 스텝마다:
① 소스 블록들이 값을 생성
↓
② 신호선을 따라 다음 블록으로 전달
↓
③ 처리 블록들이 연산 수행
↓
④ 결과를 출력 블록에 전달
↓
⑤ 시간 한 스텝 전진 → ①로 돌아감
Simulink가 자동으로 블록 실행 순서를 결정 (정렬 알고리즘) 한다.
만약 피드백 루프가 있으면? → 루프 안에 Delay 또는 Integrator가 반드시 필요하다. (그래야 순서가 정해지기때문)
⚠️ 대수 루프 (Algebraic Loop) 에러
[Sum] ──▶ [Gain] ──┐ ← Delay 없이 바로 되돌림
↑__________________| ← 실행 순서를 정할 수 없음!
✅ 해결: 루프에 Delay(z⁻¹) 또는 Memory 블록 삽입
Delay의 역할: "지금 당장 결과가 필요한 게 아니라, 이전 스텝의 값을 쓸게"라고 해서 순환 고리를 끊어줌
만약 Delay가 없다면 대수 루프 에러가 발생한다.
// 대수 루프 에러란...
Simulink: "Sum을 계산하려면 Gain의 출력이 필요해"
"Gain을 계산하려면 Sum의 출력이 필요해"
"...뭘 먼저 계산하지?" 🤯
→ 닭이 먼저냐 달걀이 먼저냐 문제!!
Simulink의 블록 창고이다. 수천 개의 블록이 카테고리별로 정리되어 있다.

