Dust/SOURCE/kocom_Homenet_D10.4/Docs/20260828_0_화면 콤보박스(ComboBox) 기반 MODBUS MariaDB 듀얼 수집 모드 구현 계획.txt
2026-09-04 10:15:33 +09:00

94 lines
3.9 KiB
Plaintext

# 화면 콤보박스(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개 컴파일 확인