# 화면 콤보박스(ComboBox) 기반 MODBUS / MariaDB 듀얼 수집 모드 구현 계획 화면(UI) 상단에 **수집 방식 선택 콤보박스(ComboBox)**를 배치하여, 사용자가 프로그램 화면에서 직접 **MODBUS TCP 직접 수집** 또는 **MariaDB 연동 수집**을 손쉽게 선택·전환할 수 있도록 설계한 구현 계획입니다. --- ## 1. UI 디자인 변경 계획 (`kocomHomenet.dfm`) 상단 설정 패널(`Panel1`)에 콤보박스 및 안내 라벨을 추가합니다: - **라벨 (`lblCollectMode: TLabel`):** `수집 방식` - **콤보박스 (`cboCollectMode: TComboBox`):** - **Style:** `csDropDownList` (임의 텍스트 입력 방지) - **Items:** - `0: MariaDB (실시간 DB)` - `1: MODBUS TCP (포트 502)` - **이벤트:** `OnChange = cboCollectModeChange` --- ## 2. 수집 모드별 동작 흐름 | 모드 선택 | 1. MariaDB (실시간 DB) | 2. MODBUS TCP (포트 502) | |---|---|---| | **수집 원천** | MariaDB `real_time` 테이블 | 로컬 MODBUS 센서/장비 (`127.0.0.1:502`) | | **측정소 목록** | DB `real_time` 테이블에서 `BlinkerName` 자동 조회 | `Kocom_Homenet.INI`의 `[SYSTEM]` 섹션 조회 | | **데이터 수집** | SQL 쿼리 (`SELECT * FROM real_time WHERE BlinkerName = ...`) | MODBUS 03번 Function (Read Holding Registers) | | **데이터 파싱** | `SensorData` 슬래시(`/`) 분리 (`PM10 / PM2.5 / 온도 / 습도`) | 수신 바이트 파싱 (`PM10=byte[14]`, `PM2.5=byte[12]`) | | **홈넷 전송** | **공통:** `ENVIRONMENT_SENSOR_ADD` 패킷으로 코콤 홈넷 서버에 전송 | **공통:** `ENVIRONMENT_SENSOR_ADD` 패킷으로 코콤 홈넷 서버에 전송 | --- ## 3. 소스코드 구현 계획 (`kocomHomenet.pas`) ### ① 콤보박스 변경 이벤트 (`cboCollectModeChange`) 콤보박스 선택 변경 시 즉시 수집 모드를 전환하고 INI에 저장합니다: ```pascal procedure TForm1.cboCollectModeChange(Sender: TObject); begin case cboCollectMode.ItemIndex of 0: // MariaDB 모드 begin FCollectMode := 1; AddLog('[' + FormatDateTime('yyyy-mm-dd hh:nn:ss', Now) + '] 수집 방식 전환: MariaDB (실시간 DB)'); InitMariaDB; // MariaDB 연결 및 loadStation 호출 end; 1: // MODBUS TCP 모드 begin FCollectMode := 0; AddLog('[' + FormatDateTime('yyyy-mm-dd hh:nn:ss', Now) + '] 수집 방식 전환: MODBUS TCP (포트 502)'); LoadStationFromINI; // INI [SYSTEM] 섹션에서 측정소 로드 end; end; // INI 파일에 현재 선택 저장 if Assigned(ini) then begin ini.WriteInteger('CollectMode', 'Mode', FCollectMode); ini.UpdateFile; end; end; ``` ### ② `LoadINI` 초기화 프로그램 시작 시 INI에 저장된 마지막 모드를 읽어 콤보박스에 반영합니다: ```pascal FCollectMode := ini.ReadInteger('CollectMode', 'Mode', 0); // 기본 MariaDB cboCollectMode.ItemIndex := IfThen(FCollectMode = 1, 0, 1); cboCollectModeChange(nil); ``` ### ③ 실시간 수집 및 전송 분기 (`readBtnClick`) - `FCollectMode = 1` (MariaDB): `FDCon` 연결 확인 $\rightarrow$ `real_time` 쿼리 $\rightarrow$ 슬래시(`/`) 파싱 $\rightarrow$ `addBtnClick(nil)` - `FCollectMode = 0` (MODBUS): `cs2` 연결 (127.0.0.1:502) $\rightarrow$ MODBUS 03번 요청/수신 $\rightarrow$ 바이트 파싱 $\rightarrow$ `addBtnClick(nil)` --- ## 4. 컴포넌트 추가 목록 - `cboCollectMode: TComboBox` (수집 모드 선택) - `lblCollectMode: TLabel` - `FDCon: TFDConnection` (MariaDB 접속용) - `FDQuery1: TFDQuery` (MariaDB 쿼리용) - `FDPhysMySQLDriverLink1: TFDPhysMySQLDriverLink` (드라이버 링크) - `cs2: TIdTCPClient` (기존 유지, MODBUS TCP 통신용) --- ## 5. 검증 계획 1. **화면 콤보박스 동작 검증:** - 콤보박스에서 `MariaDB` 선택 시 DB 연결 및 `loadStation` 정상 실행 확인 - `MODBUS TCP` 선택 시 INI `[SYSTEM]` 측정소 정상 로드 확인 2. **MSBuild Release 빌드:** Delphi 10.4 Sydney에서 오류 0개 컴파일 확인