사용자 도구

사이트 도구


products:mpino_studio2:memory

문서의 이전 판입니다!


MPINO STUDIO 2 Phase 2 · 메모리 이해하기

P·M·D·C·T·R 메모리의 차이, 주소 표기, 메모리 영역 설정, 사용 위치 확인, 특수 비트 메모리를 설명합니다.

메모리 이해 순서

1. PLC 기본 메모리

Arduino와 다르게 PLC에서는 P,M,D,C,T,R 메모리를 사용합니다. Arduino code에서 PLC에 할당된 메모리를 제외하고 남은 메모리에서 변수를 할당할 수 있습니다.

메모리는 프로그램이 실행되는 동안 입력 상태, 내부 조건, 계산 결과, 타이머 값과 같은 데이터를 보관하는 공간입니다. MPINO Studio 2의 래더 로직과 Arduino C 코드는 이 메모리를 공유하여 사용할 수 있습니다.

기본 주소는 영역을 나타내는 문자 + 0부터 시작하는 번호로 씁니다. 예를 들어 M10은 M 영역의 11번째 주소이고, D0은 D 영역의 첫 번째 주소입니다.

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 메모리의 같은 저장 공간을 사용합니다. 한쪽에서 값을 쓰면 다른 쪽에서 같은 주소로 읽을 수 있습니다.

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)

그림 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 관련 함수를 사용하려면 설정 → 래더 핀맵 설정에서 해당 출력의 사용을 체크 해제하십시오.

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. 데이터 형식

데이터 폭은 한 번에 읽거나 저장할 비트 수입니다. 값이 가질 수 있는 범위와 사용하는 메모리 양이 달라집니다.

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. 메모리 주소 읽는 방법

메모리 주소는 단순한 형식부터 필요한 요소를 하나씩 더해 읽습니다.

M0, D0, D0.1, WM1.2 메모리 주소 형식

  1. M0: M 영역의 0번 BIT 주소입니다.
  2. D0: D 영역의 0번 WORD 주소입니다.
  3. D0.1: D0 WORD 안의 두 번째 비트입니다. 비트 번호는 0부터 시작합니다.
  4. WM1.2: M 영역을 WORD로 묶은 WM1 안의 세 번째 비트입니다. M18과 같은 비트를 가리킵니다.

메모리 구조

비트, 바이트, 워드, 더블워드, 실수의 메모리 구조입니다.

P M 비트 메모리와 D C T WORD 메모리가 BYTE WORD DWORD로 묶이는 구조

P·M 영역은 각각의 BIT 주소를 8개, 16개, 32개씩 묶어 BYTE·WORD·DWORD로 읽습니다. 낮은 주소가 최하위 비트가 되므로 WM0.0M0, WM1.3M19와 같은 비트를 가리킵니다.

D·C·T 영역은 주소 하나가 WORD입니다. 연속된 WORD 두 개를 묶으면 DWORD가 되며, DD0D0D1, DD1D2D3을 결합합니다. C와 T도 DC0, DT0처럼 같은 규칙을 사용합니다.

5. 프로젝트에서 사용한 메모리 찾기

메뉴에서 보기 → 사용 메모리 맵을 선택하거나 Ctrl+Shift+L을 누릅니다.

그림 2. 사용 메모리 맵에서 주소와 사용 위치를 확인하는 화면

주소를 바꾸기 전과 메모리 영역 크기를 줄이기 전에 이 화면을 확인하면 중복 사용과 범위 오류를 줄일 수 있습니다.

6. 특수 비트 메모리

@로 시작하는 특수 비트 메모리는 MPINO Studio 2가 상태를 자동으로 갱신합니다. 래더의 비트 접점에서 사용할 수 있습니다.

형식 동작
@ON 항상 ON 비트 접점을 항상 참으로 유지
@OFF 항상 OFF 비트 접점을 항상 거짓으로 유지
@<ms> 지정한 시간 경계를 지날 때 한 번, 한 스캔 동안만 ON @100은 100ms마다 한 스캔 ON
@F<ms> 지정한 시간만큼 ON, 같은 시간만큼 OFF를 반복 @F1000은 1초 ON, 1초 OFF 반복

@ON@OFF는 대소문자를 구분하지 않으므로 @on@off도 사용할 수 있습니다.

@100과 @F1000 특수 비트 메모리의 시간 동작 비교

@100은 프로그램 스캔이 정확히 100ms 시각과 일치하지 않아도 경계를 지나갔다면 한 번 ON됩니다. 주기적으로 값 하나를 증가시키거나 일정 간격으로 작업을 시작할 때 사용할 수 있습니다.

@F1000은 점멸 상태를 직접 뒤집는 코드를 작성하지 않아도 1초 간격의 ON/OFF 조건을 만듭니다.

그림 3. 래더 셀에 특수 비트 메모리를 입력한 예

특수 비트 메모리 입력 규칙은 다음과 같습니다.

  • @<ms>@F<ms>의 시간 단위는 밀리초(ms)입니다.
  • 괄호를 쓰지 않습니다. @F(1000)이 아니라 @F1000으로 입력합니다.
  • 비트 접점에서만 사용합니다.
  • 출력 코일 주소에는 사용하지 않습니다.

문제해결방법

증상 확인할 항목
입력한 주소가 허용되지 않습니다. 영역 문자, 주소 범위, B/W/D 접두어 지원 여부, .n 비트 접근 지원 여부를 차례로 확인합니다.
메모리 영역 설정을 저장할 수 없습니다. 예상 SRAM 사용량이 전체 SRAM을 넘어서 빨간색으로 표시되었는지 확인합니다.
사용 메모리 맵에서 주소가 보이지 않습니다. 올바른 영역 탭과 래더·코드 필터를 선택했는지 확인하고 주소를 입력한 뒤 Enter를 누릅니다.
C 카운터 값이 예상과 다릅니다. MPINO-8A4R(T)-S의 C0 ~ C10 보드 핀 매핑과 주소 중복을 먼저 확인합니다.
@F1000을 입력할 수 없습니다. 비트 접점인지, 괄호 없이 입력했는지 확인합니다.

관련 문서

products/mpino_studio2/memory.1789114805.txt.gz · 마지막으로 수정됨: 저자 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki