====== BASIC에서 LD 영역 접근 ======
BASIC 프로그램에서는 LD(래더)에서 사용하는 모든 메모리 영역에 직접 접근할 수 있습니다.
각 영역은 **언더바(_) 접두어를 사용하여 변수 형태로 읽기/쓰기**가 가능합니다.
즉, LD에서 사용하는 메모리를 BASIC에서도 동일하게 공유하며 사용할 수 있습니다.
===== 기본 사용 방법 =====
LD 영역은 다음과 같이 사용합니다.
_D(0) = 123 ' LD의 D0에 값 쓰기
Debug Dec _D(0),Cr ' LD의 D0 값 읽기
* 읽기(Read)와 쓰기(Write) 모두 가능
* LD와 BASIC이 동일한 메모리를 공유
===== 사용 예 =====
Dim value As Integer
value = 100
_D(0) = value ' LD 데이터 메모리에 기록
value = _D(0) ' LD에서 사용 중인 값 읽기
Debug Dec value,Cr
===== LD 메모리 영역 =====
BASIC에서는 아래 모든 LD 메모리에 접근할 수 있습니다.
^ 레지스터 이름 ^ BASIC 접근 방식 ^ 범위 ^ 단위 ^ 설명 ^
| I 입력 이미지 | ''_I(n)'' | I0 ~ I15 | 1 bit | 입력 상태 |
| Q 출력 이미지 | ''_Q(n)'' | Q16 ~ Q31 | 1 bit | 출력 상태 |
| X 확장 입력 | ''_X(n)'' | X0 ~ X127 | 1 bit | 확장 입력 |
| Y 확장 출력 | ''_Y(n)'' | Y0 ~ Y127 | 1 bit | 확장 출력 |
| M 내부 릴레이 | ''_M(n)'' | M0 ~ M2047 | 1 bit | 내부 메모리 |
| S 시스템 릴레이 | ''_S(n)'' | S0 ~ S127 | 1 bit | 시스템 상태 |
| D 데이터 메모리 | ''_D(n)'' | D0 ~ D7999 | 16 bit | 일반 데이터 |
| DD 더블워드 | ''_DD(n)'' | DD0 ~ DD7999 | 32 bit | 32비트 데이터 |
| DF 실수 데이터 | ''_DF(n)'' | DF0 ~ DF7999 | Float | 실수 데이터 |
| T 타이머 값 | ''_T(n)'' | T0 ~ T999 | 32 bit | 타이머 현재값 |
| C 카운터 값 | ''_C(n)'' | C0 ~ C999 | 32 bit | 카운터 현재값 |
| SD 시스템 데이터 | ''_SD(n)'' | SD0 ~ SD99 | 16 bit | 시스템 데이터 |
===== Retain 메모리 (정전 유지) =====
다음 영역은 전원이 꺼져도 값이 유지됩니다.
^ 레지스터 이름 ^ BASIC 접근 방식 ^ 범위 ^ 단위 ^ 설명 ^
| R 유지 비트 | ''_R(n)'' | R0 ~ R2047 | 1 bit | 유지 비트 |
| RD 유지 워드 | ''_RD(n)'' | RD0 ~ RD99 | 16 bit | 유지 데이터 |
| RDD 유지 더블워드 | ''_RDD(n)'' | RDD0 ~ RDD99 | 32 bit | 유지 데이터 |
| RDF 유지 실수 | ''_RDF(n)'' | RDF0 ~ RDF99 | Float | 유지 실수 |
-----
====== 중요 주의 사항 ======
BASIC과 LD는 동일한 메모리를 공유하므로, **읽기와 쓰기 사용 방식에 주의해야 합니다.**
==== 읽기(Read)는 자유롭게 가능 ====
* BASIC과 LD에서 동일한 주소를 동시에 읽는 것은 문제가 없습니다.
value = _D(0) ' BASIC에서 읽기
==== 쓰기(Write)는 충돌 가능 ====
* BASIC과 LD에서 동일한 주소에 값을 쓰는 경우,
* **나중에 실행된 값이 최종적으로 남습니다.**
' LD에서 D0 = 100
' BASIC에서 _D(0) = 200
즉, 실행 순서에 따라 결과가 달라집니다.
==== 동시 쓰기 문제 ====
* BASIC과 LD가 같은 주소에 거의 동시에 값을 쓰면,
* **예상하지 못한 값이 기록될 수 있습니다.**
==== 권장 사용 방법 (중요) ====
코딩 시 메모리 영역을 역할별로 분리하는 것이 좋습니다.
* BASIC 전용 쓰기 영역 지정
* 예: ''D1000 ~ D1999''
* BASIC: 쓰기 가능
* LD: 읽기만 사용
* LD 전용 쓰기 영역 지정
* 예: ''D0 ~ D999''
* LD: 쓰기 가능
* BASIC: 읽기만 사용
' BASIC → LD 전달
_D(1000) = value
' LD에서 읽기만 수행
==== 주의 ====
* 이러한 메모리 충돌은 시스템에서 자동으로 보호되지 않습니다.
* 사용자가 설계 단계에서 영역을 구분하여 사용해야 합니다.
[[..:index|← CUBLOC2 목차로 돌아가기]]