라벨이 Electrical and electronic control인 게시물 표시

EP.2-1 GUI 컴포넌트 배선

이미지
EP.2-1 첫 번째 GUI 컴포넌트 배선 — 스위치 동기화와 메시지 단자대 타격 | 제어 엔지니어 구조 분석 Season 2: Windows GUI & Application — EP.2-1 첫 번째 GUI 컴포넌트 배선 — 스위치 인가와 메시지 단자대 타격 하얀 도화지 위에 물리적 단자를 얹고, 커널의 신호 체계를 수동으로 납땜질하는 실전 공정 1. 컴포넌트 배치: 하얀 대지 위에 첫 스위치를 박다 이전 장에서 우리는 아무것도 없는 텅 빈 하얀 도화지(윈도우 창)를 확보하는 데 성공했습니다. 영토가 확보되었으니 이제 오퍼레이터가 장비를 가동할 수 있는 '물리적 스위치' 를 배치할 차례입니다. Visual Studio의 Dialog 디자이너 인터페이스를 활용하여 가시적인 컴포넌트 모델링을 시작합니다. [공정 1단계] 도구 상자 컴포넌트 드래그 앤 드롭 리소스 뷰를 통해 대화 상자 편집기를 열고, 좌측의 [도구 상자(Toolbox)] 에서 Button 컴포넌트를 마우스로 끌어다 하얀 창 위에 배치합니다. 이 버튼은 향후 우리 시스템의 전원을 인가할 가상의 메인 스위치가 됩니다. [공정 2단계] 배선 이름표(Caption) 동기화 기본으로 설정된 Button2 라는 모호한 이름은 현장에서 허용되지 않습니다. 배치한 버튼의 우측 하단 [속성] 창에서 Caption 항목의 우측 열을 정확히 타격하여 '장비 가동' 으로 명칭을 수정합니다. (단축키 F2 를 사용하여 디자이너 창에서 즉시 편집도 가능합니다.) ▲ [실습 컷] 도구 상자에서 버튼을 인가하고 고유 식별자(ID)와 캡션을 '장비 가동'으로 설정한 모습 ...

Season 2: Visual Studio 응용 프로그램 개발 — 제어 인터페이스의 구축

이미지
Season 2: Visual Studio 응용 프로그램 개발 — 제어 인터페이스의 구축 | 제어 엔지니어 구조 분석 Season 2: Windows GUI & Application Season 2: Visual Studio 응용 프로그램 개발 — 오프닝 검은 콘솔 창을 넘어서, 눈으로 보고 마우스로 조종하는 "진짜 계기판"을 올리는 공정 1. 콘솔 시뮬레이터를 나와 가시적 제어 시대로 지금까지 우리는 C언어의 메모리 주소를 넘나들고, 데이터를 패키징하며, 파일 창고에 로그를 박아넣는 단단한 '백엔드 제어 엔진' 의 기초를 다졌습니다. 하지만 현장의 오퍼레이터들이 텍스트로만 가득한 껌껌한 검은 화면(Console)을 보며 수천 대의 모터를 제어할 수는 없습니다. Season 2 에서는 한 걸음 더 나아갑니다. 강력한 개발 툴인 Visual Studio 를 완벽히 장악하여 사용자가 마우스로 클릭하고, 실시간 데이터를 그래프로 확인하며, 직관적으로 장비를 조작하는 윈도우 응용 프로그램(GUI) 개발 공정 에 돌입합니다. 📍 Season 2에서 달성할 3대 핵심 제어 공정 인터페이스 모델링 (UI Design): 버튼, 텍스트 박스, 체크 박스 등 윈도우 컴포넌트를 배치하여 제어 계기판을 설계합니다. 이벤트 구동 아키텍처 (Event-Driven): "버튼이 클릭되었을 때", "센서 데이터가 수신되었을 때" 시스템이 즉각 반응하는 비동기식 제어 로직을 마스터합니다. 통합 제어 시스템 연동: Season 1에서 완성한 데이터 모델링과 파일 입출력 메커니즘을 윈도우 창 내부로 이식하여 지속 가능한 프로그램을 완성합니다. ...

EP.5 파일 입출력

이미지
EP.5 파일 입출력: 데이터의 영속성과 기록의 기술 | 제어 엔지니어 구조 분석 Phase 5: Data Persistence & File I/O EP.5 파일 입출력 — 기록과 소환의 메커니즘 프로그램이 종료되어도 사라지지 않는 "영구적 데이터" 제어 공정 1. 데이터 영속성(Persistence)의 필요성 지금까지 우리가 다룬 변수와 구조체는 프로그램이 꺼지면 메모리(RAM)에서 증발합니다. 하지만 실제 현장의 제어 시스템은 가동 로그를 남기거나 설정값을 유지해야 합니다. 파일 입출력 은 하드디스크라는 영구 저장소에 데이터를 각인하여 정전이나 종료 시에도 데이터를 보존하는 유일한 수단입니다. 📍 파일 제어의 3단계 표준 공정 Open (열기): fopen 을 통해 파일이라는 창고 문을 엽니다. (읽기 'r' 혹은 쓰기 'w' 모드 결정) Process (작업): fprintf (쓰기)나 fgets (읽기)를 통해 데이터를 주고받습니다. Close (닫기): fclose 로 자원을 반납하고 창고 문을 확실히 잠급니다. 2. ⚡ 실습 1: 데이터 기록 (Write 모드) 모터의 최종 가동 상태를 motor_log.txt 파일에 박아넣는 공정입니다. #define _CRT_SECURE_NO_WARNINGS # include <stdio.h> int main() {     FILE *fp = fopen("motor_log.txt", "w"); // 쓰기 모드 열기      if (fp == NULL) return 1...

EP.4-2 구조체 포인터

이미지
EP.4-2 구조체 포인터: 화살표(->) 연산자로 조종하는 스마트 제어 | 제어 엔지니어 구조 분석 Phase 4: Data Modeling & Struct EP.4-2 구조체 포인터 — 화살표(->) 연산자 무거운 장비를 직접 옮기지 않고 "주소 리모컨"으로 원격 제어하기 1. 왜 구조체에 포인터를 쓰는가? 우리가 만든 Motor 구조체는 이름, 속도, 온도를 포함한 꽤 무거운 데이터 덩어리입니다. 함수를 호출할 때마다 이 덩어리를 통째로 복사하는 것은 시스템 자원을 낭비하는 일입니다. 하지만 구조체 포인터 를 쓰면 단 몇 바이트의 '주소(리모컨)'만 전달하면 됩니다. 함수는 그 주소를 따라가서 실제 장비를 직접 점검하고 수정할 수 있게 되죠. 이것이 바로 고속 원격 제어 의 핵심입니다. 📍 화살표 연산자 (->) : "그리로 가서 작업해!" 구조체 포인터를 다룰 때 가장 중요한 도구는 화살표 연산자( -> ) 입니다. ptr->speed 는 "ptr이 가리키는 주소로 화살표 방향대로 따라가서(*) , 거기 있는 speed 단자에 접속하라"는 직관적인 명령입니다. 2. ⚡ 실습: 원격 진단 유닛 가동 메인 공정의 모터 주소를 넘겨받아 상태를 점검하고 성능을 최적화하는 진단 시뮬레이션입니다. #define _CRT_SECURE_NO_WARNINGS # include <stdio.h> // 장비 설계도 struct Motor {      char name[20];      int speed;      float temp; }; // [진단 함수] 구조체 포인터...

EP.4-1 구조체

이미지
EP.4-1 구조체: 개별 부품을 하나의 장비로 조립하기 | 제어 엔지니어 구조 분석 Phase 4: Data Modeling & Struct EP.4-1 구조체 — 데이터의 패키징과 모델링 서로 다른 부품들을 묶어 하나의 "모터 제어 모듈" 설계도 만들기 구조체(Struct): 엔지니어의 설계도 현장의 모터 한 대에는 이름(문자), 속도(정수), 온도(실수) 등 다양한 데이터가 섞여 있습니다. 이를 개별 변수로 관리하면 코드가 복잡해집니다. 구조체 는 이 부품들을 하나의 케이스에 담아 '통합 제어 모듈' 로 규격화하는 기술입니다. ⚡ 실습: 컨베이어 라인(01~03) 통합 제어 모터 3대를 배열로 묶어 라인 전체를 관리하는 시운전 코드입니다. #define _CRT_SECURE_NO_WARNINGS // 최신 보안 경고 방지 # include <stdio.h> # include <string.h> // 1. 모터 제어 모듈 설계도 정의 struct Motor {      char name[20];      int speed;      float temp; }; int main() {      // 2. 구조체 배열 선언 (모터 3대를 한 라인으로 구축)      struct Motor line[3];      // 3. 각 장비 데이터 입력 (점 '.' 연산자로 내부 접속)     strcpy(line[0].name, "Conveyor_01");    ...

EP.3-3 Call by Reference

이미지
EP.3-3 Call by Reference: 함수의 국경을 넘는 원격 제어 | 제어 엔지니어 구조 분석 Phase 3: Memory & Address Control EP.3-3 Call by Reference — 함수의 국경을 넘는 제어 값을 복사해주는 '통보'가 아니라, 열쇠를 넘겨주는 '권한 위임'의 기술 복사(Value)와 주소(Reference)의 차이 함수에 데이터를 보낼 때, 우리는 두 가지 선택을 할 수 있습니다. 변수 안의 내용물을 복사해서 보내느냐(Value), 아니면 변수가 있는 창고의 열쇠를 보내느냐(Reference)입니다. 포인터를 사용한 Call by Reference 는 함수가 메인 공정(main)의 데이터를 직접 수정할 수 있게 해줍니다. 이것은 마치 원격지에 있는 장비의 관리자 권한을 획득하는 것과 같습니다. ⚡ 실습: 두 장비의 데이터를 맞바꾸는 Swap 공정 포인터 없이는 절대 불가능한 '값 교체(Swap)' 공정을 통해 원격 제어의 위력을 확인합니다. # include <stdio.h> // [함수 설계] 리모컨(주소)을 받아 직접 값을 교체함 void swap( int *pA, int *pB) {      int temp; // 값을 잠시 담아둘 임시 보관함     temp = *pA; // A의 위치로 가서 값을 temp에 보관     *pA = *pB; // B의 값을 A의 위치에 덮어쓰기     *pB = temp; // 보관했던 값을 B의 위치에 쓰기 } int main() {    ...

EP.3-2 포인터와 배열

이미지
EP.3-2 포인터와 배열: 이름표 뒤에 숨겨진 비밀 | 제어 엔지니어 구조 분석 Phase 3: Memory & Address Control EP.3-2 포인터와 배열 — 이름표 뒤에 숨겨진 비밀 배열의 이름은 사실 "기관차의 위치"를 가리키는 리모컨이었습니다. 배열 이름의 정체: 고정 주소값 우리가 int scores[3] 이라고 선언할 때, scores 라는 이름 자체는 배열의 첫 번째 칸(scores[0])의 주소 를 의미합니다. 전 장에서 배운 포인터와 똑같이 동작하죠. 다만, 배열 이름은 위치를 바꿀 수 없는 '고정 리모컨'이라는 점이 다릅니다. 📍 자동 점프(Pointer Arithmetic)의 원리 포인터에 1을 더하면 주소값이 단순히 1 늘어날까요? 아닙니다. 컴퓨터는 데이터의 타입(int, char 등)을 보고 다음 칸이 있는 곳으로 자동 점프 합니다. char* + 1: 1바이트 점프 int* + 1: 4바이트 점프 실습: 주소 테스터기로 배열 칸별 주소 확인 # include <stdio.h> int main() {      int train[3] = {10, 20, 30};      int *ptr = train; // 배열 이름은 주소이므로 &를 붙이지 않습니다.     printf("=== [배열 단자대 점검] ===\n");      for ( int i = 0; i        ...

EP.3-1 포인터

이미지
EP.3-1 포인터: 메모리 단자대와 원격 제어의 시작 | 제어 엔지니어 구조 분석 Phase 3: Memory & Address Control EP.3-1 포인터 — 메모리 단자대와 원격 제어 "위치"를 알면 "권한"이 생깁니다. 주소라는 좌표를 다루는 기술. 포인터는 '닉네임 리모컨'이다 포인터를 배우다 포기하는 이유는 단순합니다. "주소를 담는 변수"라는 따분한 정의에 갇히기 때문입니다. 하지만 현장의 엔지니어에게 포인터는 '복잡한 메모리 주소를 대신하는 스마트한 닉네임 리모컨' 입니다. 0x0012FF7C 같은 복잡한 주소 번호를 직접 외울 수는 없습니다. 대신 그 주소를 ptr 이라는 이름의 리모컨에 저장해두고, 필요할 때마다 버튼 하나로 그 위치의 데이터를 원격 제어하는 것, 이것이 포인터의 본질입니다. 📍 포인터의 원초적 구성 요소 & (Address-of): "이 상자가 창고의 몇 번째 선반(주소)에 있지?" → 주소 추출기 * (Dereferencing): "그 선반 번호로 직접 가서 문을 열어!" → 원격 침투기 포인터 변수 (Pointer): 선반 번호를 적어두는 메모지 2. 포인터의 이중생활: 선언과 실행 똑같은 * 기호라도 쓰이는 위치에 따라 의미가 완전히 달라집니다. 이것은 장비의 [설치 모드]와 [운전 모드]의 차이와 같습니다. ① 설치 모드 (선언) int *ptr; "정수 전용 리모컨을 하나 만들겠...

EP.2-5 함수

이미지
EP.2-5 함수: 반복되는 로직의 모듈화와 캡슐화 | 제어 엔지니어 구조 분석 Phase 2: Operations & Control Logic EP.2-5 함수 — 반복되는 로직의 모듈화 중구난방인 코드를 하나의 독립된 '제어 모듈'로 패키징하기 함수(Function): 프로그램의 부품화 복잡한 설비를 한 대의 제어기(PLC)에 다 때려 넣으면 유지보수가 불가능해집니다. 이를 기능별로 나누어 독립된 모듈 로 만드는 것이 '함수'입니다. 필요할 때마다 호출하고, 결과만 받으면 끝이죠. 매개변수(Input): 모듈에 입력하는 제어값 반환값(Output): 모듈이 계산하여 돌려주는 결과값 실습: 화씨/섭씨 변환 모듈 설계 센서 데이터(F)를 인간이 읽기 쉬운 단위(C)로 변환하는 함수를 구축합니다. 계산 로직을 분리함으로써 메인 코드는 한결 간결해집니다. # include <stdio.h> // [함수 설계] 화씨를 섭씨로 변환하는 모듈 float convertToCelsius( float fahrenheit) {      float celsius;      // 5.0 / 9.0 처럼 점(.)을 찍어야 실수 나눗셈이 수행됩니다.     celsius = (fahrenheit - 32) * 5.0 / 9.0;      return celsius; } int main() {      float sensorF = 98.6; ...

EP.2-4 배열

이미지
EP.2-4 배열: 데이터 창고를 넘어선 공간 제어의 마법 | 제어 엔지니어 구조 분석 Phase 2: Operations & Control Logic EP.2-4 배열 — 공간과 수치를 지배하는 데이터 창고 단순한 나열을 넘어 벡터(Vector)와 행렬(Matrix)의 관점으로 해석하다 왜 배열(Array)인가? 지금까지의 변수가 하나의 '점'이었다면, 배열은 점들이 모인 '선'이자 '면' 입니다. 로봇 관절의 위치를 정하는 벡터(Vector) 나 고성능 비전 시스템의 픽셀 데이터를 처리하는 행렬(Matrix) 의 실체가 바로 이 배열입니다. GPU가 현대 기술의 핵심이 된 이유도 결국 거대한 배열 연산을 한꺼번에 처리하는 능력 때문입니다. 배열을 이해하는 것은 수만 개의 데이터를 일일이 관리하지 않고, 단 하나의 이름으로 일괄 통제하는 법 을 배우는 것과 같습니다. 1차원 배열: 센서 데이터 벡터 생성 동일한 타입의 데이터를 메모리에 연속적으로 배치합니다. CPU는 인덱스(Index)라는 번호표를 통해 빛의 속도로 데이터에 접근합니다. # include <stdio.h> int main() {      // 로봇 관절 각도(Vector) 초기화      double joints[3] = { 45.0, 90.5, -15.25 };      int i;     printf("=== [ROBOT STATUS] 현재 관절 각도 벡터 ===\n");      for (i = 0; i     ...

EP.2-3: 반복문

EP.2-3 반복문: 멈추지 않는 제어 엔진, 스캔 사이클 | 제어 엔지니어 구조 분석 Phase 2: Operations & Control Logic EP.2-3 반복문 — 제어 엔진의 스캔 사이클 멈추지 않는 감시와 정밀한 카운팅을 위한 루프 설계 반복문: 제어의 '스캔 사이클' 산업용 제어기(PLC, Robot Controller)는 한 번 실행되고 종료되는 것이 아니라, END 를 만날 때마다 다시 처음으로 돌아가는 무한 스캔 사이클 을 가집니다. C언어의 반복문은 이러한 장비의 생명력을 구현하는 핵심 도구입니다. for문: "제품 10개를 카운트하고 멈춰라" (정해진 횟수 제어) while문: "비상 정지가 눌리기 전까지 무한 감시하라" (조건 유지 제어) for문: 정밀 수량 카운팅 목표 수량에 도달할 때까지 변수를 하나씩 증가시키며 특정 로직을 반복합니다. 인덱스(i)를 통해 현재 작업의 진행 상황을 실시간으로 파악할 수 있습니다. # include <stdio.h> int main() {      int target = 10; // 목표 수량      int i;            // 카운트 변수 사전 선언 (안전성 확보)     printf("[생산 시작] 목표 수량: %d 개\n", target);      // i가 1부터 시작하여 target(1...

EP.2-2 비교 연산과 조건문

이미지
EP.2-2 비교 연산과 조건문: 프로그램의 인터록 설계 | 제어 엔지니어 구조 분석 Phase 2: Operations & Control Logic EP.2-2 비교 연산과 조건문 — 프로그램의 인터록 판단하고, 거르고, 분기하는 지능형 로직의 핵심 비교 연산자 PLC의 CMP 명령어처럼, 두 값을 비교하여 참(1) 또는 거짓(0) 의 전기 신호를 만듭니다. 이 신호는 명령어 포인터(IP)가 다음에 실행할 메모리 주소를 갈아타게 만드는 물리적 스위치가 됩니다. == (같다): if (a == 10) (※ 주의: = 는 대입, == 는 비교!) != (다르다): 비상 정지 신호가 OFF가 아닐 때 주로 사용 && (AND / 직렬): 모든 접점이 닫혀야 가동 승인 || (OR / 병렬): 어느 하나라도 눌리면 즉시 차단 "가드 로직(Guard Logic)" 현장 제어에서 가장 위험한 것은 '정의되지 않은 신호'입니다. 명확한 정상(0)과 위험(1, 2) 외의 모든 수치를 예외로 처리하여 시스템을 보호해야 합니다. # include <stdio.h> int main() {      int status, signal;     printf("[시스템 체크] 상태를 입력하세요 (0:정상, 1:비상, 2:과부하): ");     scanf_s("%d", &status); ...