반응형
[고급 프로그래밍 가이드] 실수 연산의 함정과 간접 주소 지정 마스터하기
컴퓨터가 숫자를 다루는 근본적인 한계인 '부동 소수점 오차'를 파악하고, 이를 극복하기 위한 '간접 주소 지정' 방식의 실전 활용법을 기초부터 전문가 수준까지 상세히 가이드합니다.
컴퓨터가 숫자를 다루는 근본적인 한계인 '부동 소수점 오차'를 파악하고, 이를 극복하기 위한 '간접 주소 지정' 방식의 실전 활용법을 기초부터 전문가 수준까지 상세히 가이드합니다.
프로그래밍이나 PLC 제어에서 가장 당혹스러운 순간은 "분명히 계산은 맞는데 결과값이 미세하게 틀릴 때"와 "수천 개의 데이터를 일일이 제어해야 할 때"입니다. 전자는 **실수(Float) 연산의 한계** 때문이고, 후자는 **간접 주소 지정**을 모르기 때문이죠. 오늘 이 두 가지 핵심 개념을 완벽히 정리해 드리겠습니다! 😊
1. 실수(Float) 연산: 왜 0.1 + 0.2는 0.3이 아닐까?
컴퓨터는 2진수를 사용합니다. 10진수 0.1을 2진수로 바꾸면 $0.0001100110011...$처럼 무한 소수가 됩니다. 한정된 메모리에 이 숫자를 담으려다 보니 끝부분을 잘라내게 되고, 여기서 **'부동 소수점 오차'**가 발생합니다.
⚠️ 전문가의 경고: 실수 비교 시
if (A == B)는 절대 금물입니다! 대신 두 수의 차이가 아주 작은 값(Epsilon)보다 작은지 확인하는 if (abs(A - B) < 0.00001) 방식을 사용해야 합니다.
2. 간접 주소 지정(Indirect Addressing): 데이터의 '길'을 찾다
간접 주소 지정은 "데이터가 어디에 있는지"를 직접 알려주는 게 아니라, **"주소가 적힌 메모리"**를 가리키는 방식입니다. 이는 대량의 데이터를 루프(Loop)로 처리할 때 필수적입니다.
💡 핵심 원리 (PLC 기준):
기준 주소 $D100$에 인덱스 레지스터 $Z0$의 값을 더합니다. $Z0$가 0이면 $D100$, $Z0$가 10이면 $D110$을 참조하게 됩니다. 코드 한 줄로 수만 개의 데이터를 핸들링할 수 있는 비결입니다.
기준 주소 $D100$에 인덱스 레지스터 $Z0$의 값을 더합니다. $Z0$가 0이면 $D100$, $Z0$가 10이면 $D110$을 참조하게 됩니다. 코드 한 줄로 수만 개의 데이터를 핸들링할 수 있는 비결입니다.
3. 실전 체험: 오차 확인 및 간접 주입 시뮬레이터 🧪
아래 시뮬레이터에서 실수 오차를 직접 눈으로 확인하고, 인덱스 값을 바꿔가며 간접 주소로 데이터를 읽어보세요.
Step 1. 실수 누적 오차 체험
0.1을 입력한 횟수만큼 더했을 때의 실제 값을 확인하세요.
Step 2. 간접 주소(Z)로 데이터 읽기
인덱스 $Z0$에 값을 입력하여 $D100$으로부터 떨어진 데이터를 가져옵니다.
4. 전문가 과정: 정밀도와 안정성 확보하기
고급 엔지니어는 환경에 따라 다음 두 가지 전략을 구사합니다.
- ✅ 정밀 연산이 필요할 때: 실수 대신 **고정 소수점(Fixed Point)** 방식을 씁니다. $1.23$을 처리할 때 $123$으로 계산하고 표시할 때만 소수점을 찍는 방식입니다. 오차가 전혀 발생하지 않습니다.
- ✅ 간접 주입 안전 설계: 간접 주소를 사용하기 전 반드시 **'Limit Check'**를 수행합니다. 인덱스 값이 메모리 범위를 초과하는 순간 PLC는 멈춥니다. 상한과 하한을 자르는 코드는 선택이 아닌 필수입니다.
💡 오늘의 핵심 요약
실수연산 소수점 오차를 인정하고 절대값 비교 기능을 활용할 것
간접주소 반복 업무의 구원자! 기준 주소 + 인덱스 원리를 활용할 것
안전제일 인덱스 범위 초과는 시스템 다운의 주범, 사전 검사 필수
기술의 원리를 이해하면 보이지 않던 버그가 보이기 시작합니다. 오늘 배운 내용을 바탕으로 더욱 견고하고 효율적인 프로그램을 설계해 보시기 바랍니다. 궁금한 점은 언제든 질문해 주세요! 😊
반응형
'PLC > 프로그래밍 및 명령어 활용' 카테고리의 다른 글
| 코드의 재사용성을 높이는 모듈화 프로그래밍 가이드: 원리부터 실전까지 (0) | 2026.04.26 |
|---|---|
| PLC 실무 기술: 펑션 블록(FB)과 표준화를 활용한 고품질 프로그램 작성법 (0) | 2026.04.10 |
| 실수 연산 기초부터 고급까지: 누적 오차를 잡는 전문가의 노하우 (0) | 2026.04.08 |
| PLC 코딩 시간을 절반으로! 인덱스 레지스터(Index Register) 활용 꿀팁 (0) | 2026.04.07 |
| PLC 간접 주소 지정과 인덱스 레지스터: 원리부터 실무 사례까지 (0) | 2026.03.22 |