94 lines
3.9 KiB
Plaintext
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개 컴파일 확인
|