====== MPINO STUDIO 2 Phase 2 · 메모리 이해하기 ======
**P·M·D·C·T·R 메모리의 차이**, 주소 표기, 메모리 영역 설정, 사용 위치 확인, 특수 비트 메모리를 설명합니다.
{{ :products:mpino_studio2:memory-learning-path.svg?1000 |메모리 이해 순서 }}
===== 1. PLC 기본 메모리 =====
Arduino와 다르게 PLC에서는 P,M,D,C,T,R 메모리를 사용합니다. Arduino code에서 PLC에 할당된 메모리를 제외하고 남은 메모리에서 변수를 할당할 수 있습니다.
메모리는 프로그램이 실행되는 동안 입력 상태, 내부 조건, 계산 결과, 타이머 값과 같은 데이터를 보관하는 공간입니다. MPINO Studio 2의 래더 로직과 Arduino C 코드는 이 메모리를 공유하여 사용할 수 있습니다.
기본 주소는 **영역을 나타내는 문자 + 0부터 시작하는 번호**로 씁니다. 예를 들어 ''M10''은 M 영역의 11번째 주소이고, ''D0''은 D 영역의 첫 번째 주소입니다.
{{ :products:mpino_studio2:memory-overview.svg?1000 |P M D C T R 메모리 영역 비교 }}
^ 영역 ^ 단위 ^ 저장 형태 ^ 값의 범위 ^
| ''P'' | BIT | 보드의 디지털 입력·출력 상태 | 0 또는 1 |
| ''M'' | BIT | 내부 BIT 메모리 | 0 또는 1 |
| ''D'' | WORD | 부호 있는 내부 WORD 메모리 | -32,768 ~ 32,767 |
| ''C'' | WORD | 카운터 값 (부호 있는 내부 WORD 메모리) | -32,768 ~ 32,767 |
| ''T'' | WORD | 타이머 현재값 (부호 있는 내부 WORD 메모리) | -32,768 ~ 32,767 |
| ''R'' | Floating Point (32비트) | 내부 Floating Point 메모리 (실수 메모리) | 약 -3.4028235E38 ~ +3.4028235E38 |
==== Arduino 코드와 래더 로직의 메모리 공유 ====
래더 로직과 Arduino 코드는 P·M·D·C·T·R 메모리의 같은 저장 공간을 사용합니다. 한쪽에서 값을 쓰면 다른 쪽에서 같은 주소로 읽을 수 있습니다.
{{ :products:mpino_studio2:memory-sharing.svg?1000 |Arduino 코드와 래더 로직이 같은 PLC 메모리를 공유하는 구조 }}
Arduino 코드에서는 래더 주소와 같은 이름을 그대로 사용하거나 배열 형식으로 쓸 수 있습니다. 두 표기는 같은 메모리를 가리킵니다.
* 래더의 ''M0'' ↔ Arduino 코드의 ''M0'' 또는 ''M[0]''
* 래더의 ''D0'' ↔ Arduino 코드의 ''D0'' 또는 ''D[0]''
* 래더의 ''R0'' ↔ Arduino 코드의 ''R0'' 또는 ''R[0]''
void loop() {
M0 = true; // 래더의 M0 비트 접점을 ON 상태로 만듭니다.
D0 = 120; // 래더와 Arduino 코드가 D0의 정숫값을 공유합니다.
R0 = 23.5f; // 래더와 Arduino 코드가 R0의 실숫값을 공유합니다.
ladderLoop(); // 위에서 저장한 값으로 래더 로직을 실행합니다.
}
래더 로직에서 변경한 값은 ''ladderLoop()'' 실행이 끝난 뒤 Arduino 코드에서 읽을 수 있습니다. 같은 스캔 안에서 값을 읽고 쓰는 순서는 ''loop()''에서 ''ladderLoop()''를 호출한 위치를 따릅니다.
> **입출력 매핑 주의:** P 영역과 보드 기능에 매핑된 C 영역은 래더 스캔 중 실제 입출력과 동기화됩니다. 이 영역을 Arduino 코드와 공유할 때는 **설정 → 래더 핀맵 설정**에서 주소와 입출력 방향을 먼저 확인하십시오.
> **P 주소 주의:** P 주소는 **보드의 핀 편집**에서 확인하고 수정할 수 있습니다. P 주소의 입출력 방향과 실제 단자는 프로젝트에서 선택한 보드의 정의를 따릅니다.
> **R 값 오차 주의:** 32비트 실수는 부동 소수점 연산의 한계로 ''0.1 + 0.2''의 결과가 정확한 ''0.3''이 아니라 약 ''0.30000001''로 저장될 수 있습니다. 이는 IEEE 754 32비트 부동 소수점을 사용하는 제어기에서 공통적으로 고려해야 하는 특성입니다.
===== 2. 메모리 영역 =====
MPINO-8A4R(T)-S를 선택했을 때의 기본 메모리 개수는 다음과 같습니다.
**설정 → 메모리 영역 설정**에서 메모리의 사용 개수를 수정할 수 있습니다. (단축키: ''Ctrl + Shift + M'')
{{ :products:mpino_studio2:memory-settings-modal.png?430 |그림 1. 메모리 영역별 사용 개수와 예상 SRAM 사용량을 확인하는 메모리 영역 설정 창 }}
^ 영역 ^ 기본 개수 ^ 기본 주소 범위 ^
| ''P'' | 64 | ''P0'' ~ ''P63'' |
| ''M'' | 1,024 | ''M0'' ~ ''M1023'' |
| ''D'' | 200 | ''D0'' ~ ''D199'' |
| ''C'' | 100 | ''C0'' ~ ''C99'' |
| ''T'' | 128 | ''T0'' ~ ''T127'' |
| ''R'' | 50 | ''R0'' ~ ''R49'' |
**메모리 영역 설정 창:** P·M·D·C·T·R 입력칸을 비워 두면 보드 기본값을 사용합니다. 값을 입력하면 해당 프로젝트의 사용 개수를 변경하며, 창 아래에서 예상 SRAM 사용량과 전체 SRAM을 함께 확인할 수 있습니다.
개수와 마지막 주소를 혼동하지 마십시오. 번호가 0부터 시작하므로 D 메모리 200개는 ''D0''부터 ''D199''까지입니다.
==== C 영역과 보드 핀 매핑 ====
MPINO-8A4R(T)-S에서는 ''C0'' ~ ''C10'' 메모리에 아날로그 입력, NTC 온도 입력, PWM이 연결되어 있습니다.
매핑 메모리는 **설정 → 래더 핀맵 설정**에서 변경할 수 있습니다.
> **아날로그·PWM 출력 주의:** 아날로그 출력 또는 PWM 출력에 메모리를 매핑하면 매핑한 주소의 값으로 출력되므로 Arduino 코드에서 ''analogWrite'' 관련 함수를 사용할 수 없습니다. ''analogWrite'' 관련 함수를 사용하려면 **설정 → 래더 핀맵 설정**에서 해당 출력의 **사용**을 체크 해제하십시오.
{{ :products:mpino_studio2:memory-c-map-8a4r-s.svg?1000 |MPINO-8A4R(T)-S의 C 메모리와 보드 핀 매핑 }}
^ C 주소 ^ 보드 기능 ^ MCU 핀 ^
| ''C0'' ~ ''C5'' | 아날로그 입력 | ''A0'' ~ ''A5'' |
| ''C6'' ~ ''C7'' | NTC 온도 입력 | ''A6'' ~ ''A7'' |
| ''C8'' ~ ''C10'' | PWM 출력 | ''D21'' ~ ''D23'' |
| ''C11'' ~ ''C99'' | 위 기능에 직접 배정되지 않은 C 영역 | 사용 목적을 확인한 뒤 선택 |
> **중요:** 이 보드에서 ''C0'' ~ ''C10''을 일반 카운터 주소로 정하면, 같은 주소를 사용하는 보드 기능과 데이터가 겹칠 수 있습니다. 카운터 주소를 정하기 전에 **설정 → 래더 핀맵 설정**과 **설정 → 사용한 메모리**를 확인하십시오.
매핑된 주소는 보드별로 다릅니다. 또한 사용자가 변경할 수 있으므로 **설정 → 래더 핀맵 설정**에서 확인하십시오.
===== 3. 데이터 형식 =====
데이터 폭은 한 번에 읽거나 저장할 비트 수입니다. 값이 가질 수 있는 범위와 사용하는 메모리 양이 달라집니다.
{{ :products:mpino_studio2:memory-widths.svg?1000 |BIT BYTE WORD DWORD 데이터 폭과 값의 범위 }}
^ 데이터 폭 ^ 크기 ^ 부호 있는 값의 범위 ^ 대표 용도 ^
| BIT | 1비트 | 0 또는 1 | 접점, 코일, ON/OFF 상태 |
| BYTE | 8비트 | -128 ~ 127 | 작은 정수 |
| WORD | 16비트 | -32,768 ~ 32,767 | 일반 정수, D·C·T의 기본 값 |
| DWORD | 32비트 | -2,147,483,648 ~ 2,147,483,647 | WORD 범위를 넘는 큰 정수 |
''R''은 32비트를 사용하지만 DWORD 정수가 아니라 **실수**를 저장하는 별도의 영역입니다. 숫자 크기가 32비트라는 이유만으로 DWORD 접근과 R 메모리를 같은 방식으로 사용하면 안 됩니다.
값을 정할 때는 현재 값만 보지 말고 계산 후의 최댓값도 확인하십시오. 예를 들어 1일 동안 1ms마다 증가하는 누적값은 86,400,000이므로 WORD 범위를 넘습니다.
===== 4. 메모리 주소 읽는 방법 =====
메모리 주소는 단순한 형식부터 필요한 요소를 하나씩 더해 읽습니다.
{{ :products:mpino_studio2:memory-addressing.svg?1000 |M0, D0, D0.1, WM1.2 메모리 주소 형식 }}
- ''M0'': M 영역의 0번 BIT 주소입니다.
- ''D0'': D 영역의 0번 WORD 주소입니다.
- ''D0.1'': D0 WORD 안의 두 번째 비트입니다. 비트 번호는 0부터 시작합니다.
- ''WM1.2'': M 영역을 WORD로 묶은 ''WM1'' 안의 세 번째 비트입니다. ''M18''과 같은 비트를 가리킵니다.
==== 메모리 구조 ====
비트, 바이트, 워드, 더블워드, 실수의 메모리 구조입니다.
{{ :products:mpino_studio2:memory-structure.svg?1000 |P M 비트 메모리와 D C T WORD 메모리가 BYTE WORD DWORD로 묶이는 구조 }}
P·M 영역은 각각의 BIT 주소를 8개, 16개, 32개씩 묶어 BYTE·WORD·DWORD로 읽습니다. 낮은 주소가 최하위 비트가 되므로 ''WM0.0''은 ''M0'', ''WM1.3''은 ''M19''와 같은 비트를 가리킵니다.
D·C·T 영역은 주소 하나가 WORD입니다. 연속된 WORD 두 개를 묶으면 DWORD가 되며, ''DD0''은 ''D0''과 ''D1'', ''DD1''은 ''D2''와 ''D3''을 결합합니다. C와 T도 ''DC0'', ''DT0''처럼 같은 규칙을 사용합니다.
===== 5. 프로젝트에서 사용한 메모리 찾기 =====
메뉴에서 **설정 → 사용한 메모리**를 선택하거나 ''Ctrl+Shift+L''을 누릅니다.
{{ :products:mpino_studio2:memory-map-modal.png?800 |그림 2. 사용한 메모리에서 주소와 사용 위치를 확인하는 화면 }}
주소를 바꾸기 전과 메모리 영역 크기를 줄이기 전에 이 화면을 확인하면 중복 사용과 범위 오류를 줄일 수 있습니다.
===== 6. 특수 비트 메모리 =====
''@''로 시작하는 특수 비트 메모리는 MPINO Studio 2가 상태를 자동으로 갱신합니다. 래더의 비트 접점에서 사용할 수 있습니다.
^ 형식 ^ 동작 ^ 예 ^
| ''@ON'' | 항상 ON | 비트 접점을 항상 참으로 유지 |
| ''@OFF'' | 항상 OFF | 비트 접점을 항상 거짓으로 유지 |
| ''@'' | 지정한 시간 경계를 지날 때 한 번, 한 스캔 동안만 ON | ''@100''은 100ms마다 한 스캔 ON |
| ''@F'' | 지정한 시간만큼 ON, 같은 시간만큼 OFF를 반복 | ''@F1000''은 1초 ON, 1초 OFF 반복 |
''@ON''과 ''@OFF''는 대소문자를 구분하지 않으므로 ''@on''과 ''@off''도 사용할 수 있습니다.
{{ :products:mpino_studio2:special-memory-timing.svg?1000 |@100과 @F1000 특수 비트 메모리의 시간 동작 비교 }}
''@100''은 프로그램 스캔이 정확히 100ms 시각과 일치하지 않아도 경계를 지나갔다면 한 번 ON됩니다. 주기적으로 값 하나를 증가시키거나 일정 간격으로 작업을 시작할 때 사용할 수 있습니다.
''@F1000''은 점멸 상태를 직접 뒤집는 코드를 작성하지 않아도 1초 간격의 ON/OFF 조건을 만듭니다.
{{ :products:mpino_studio2:special-relay-example.png?420 |그림 3. 래더 셀에 특수 비트 메모리를 입력한 예 }}
특수 비트 메모리 입력 규칙은 다음과 같습니다.
* ''@''와 ''@F''의 시간 단위는 밀리초(ms)입니다.
* 괄호를 쓰지 않습니다. ''@F(1000)''이 아니라 ''@F1000''으로 입력합니다.
* 비트 접점에서만 사용합니다.
* 출력 코일 주소에는 사용하지 않습니다.
===== 문제해결방법 =====
^ 증상 ^ 확인할 항목 ^
| 입력한 주소가 허용되지 않습니다. | 영역 문자, 주소 범위, B/W/D 접두어 지원 여부, ''.n'' 비트 접근 지원 여부를 차례로 확인합니다. |
| 메모리 영역 설정을 저장할 수 없습니다. | 예상 SRAM 사용량이 전체 SRAM을 넘어서 빨간색으로 표시되었는지 확인합니다. |
| 사용한 메모리에서 주소가 보이지 않습니다. | 올바른 영역 탭과 래더·코드 필터를 선택했는지 확인하고 주소를 입력한 뒤 ''Enter''를 누릅니다. |
| C 카운터 값이 예상과 다릅니다. | MPINO-8A4R(T)-S의 ''C0'' ~ ''C10'' 보드 핀 매핑과 주소 중복을 먼저 확인합니다. |
| ''@F1000''을 입력할 수 없습니다. | 비트 접점인지, 괄호 없이 입력했는지 확인합니다. |
===== 관련 문서 =====
* [[products:mpino_studio2:activity_bar|Phase 8 · 활동바와 사이드 패널]]
* [[products:mpino_studio2:menus_settings|Phase 7 · 메뉴와 환경설정]]
* [[products:mpino_studio2:monitoring|Phase 6 · 시리얼ㆍ래더 모니터링]]
* [[products:mpino_studio2:first_project|Phase 1 · 첫 프로젝트 만들기]]
* [[products:mpino_studio2|MPINO STUDIO 2 사용설명서]]
[[products:mpino_studio2:first_project|← Phase 1 · 첫 프로젝트 만들기]] | [[products:mpino_studio2|MPINO STUDIO 2 사용설명서로 돌아가기]]