First upload
This commit is contained in:
commit
099deac641
Binary file not shown.
@ -0,0 +1,93 @@
|
||||
# 화면 콤보박스(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개 컴파일 확인
|
||||
@ -0,0 +1,36 @@
|
||||
# MODBUS / MariaDB 듀얼 수집 모드 구현 완료 보고서
|
||||
|
||||
## 1. 구현 완료 요약
|
||||
|
||||
프로그램 화면 상단에 **수집 방식 콤보박스(`cboCollectMode`)**를 추가하여, 사용자가 **MariaDB 연동 수집** 또는 **MODBUS TCP 직접 수집**을 자유롭게 선택·전환할 수 있도록 기능을 완성하였습니다.
|
||||
|
||||
---
|
||||
|
||||
## 2. 주요 기능 및 변경 사항
|
||||
|
||||
### ① UI 화면 구성
|
||||
- 상단 패널(`Panel1`)에 **`수집 방식` 콤보박스** 추가:
|
||||
- **`1. MariaDB (실시간 DB)`**: MariaDB에 연결하여 `real_time` 테이블에서 측정소 목록 및 센서 데이터 수집
|
||||
- **`2. MODBUS TCP (포트 502)`**: INI `[SYSTEM]` 설정 측정소를 로컬 502번 포트에서 수집
|
||||
- 모드 전환 시 즉시 반영되며, 선택 상태가 `Kocom_Homenet.INI`의 `[CollectMode] Mode`에 자동 저장됩니다.
|
||||
|
||||
### ② MariaDB 연동 수집 구현
|
||||
- **컴포넌트:** FireDAC (`TFDConnection`, `TFDQuery`, `TFDPhysMySQLDriverLink`)
|
||||
- **측정소 로딩 (`LoadStationFromDB`):** `real_time` 테이블에서 유효한 `BlinkerName` 목록을 조회하여 동적 배열 `StName` 구성
|
||||
- **센서 데이터 파싱 (`readBtnClick`):** `SensorData` 필드의 슬래시(`/`) 문자열 분리 (`PM10 / PM2.5 / 온도 / 습도`) 및 구역 번호(`nArea`) 자동 매핑
|
||||
|
||||
### ③ MODBUS TCP 수집 유지
|
||||
- 기존 `cs2: TIdTCPClient` (127.0.0.1:502) 통신 로직을 보존하여 MODBUS 장비 현장에서도 완벽 지원
|
||||
|
||||
### ④ 코콤 홈넷 통신 안정성 완벽 계승
|
||||
- 최초 1회 BIND 패킷 전송 (Hex PW 자동 디코딩 지원)
|
||||
- 30초 주기 ALIVE 생존 신호 전송
|
||||
- 세션 유지 상태에서 주기적 `ENVIRONMENT_SENSOR_ADD` 패킷 송신
|
||||
|
||||
---
|
||||
|
||||
## 3. 검증 결과
|
||||
|
||||
- **Embarcadero Delphi 10.4 Sydney MSBuild 컴파일:**
|
||||
- Release 빌드 성공 (오류 0개)
|
||||
- 최신 실행 파일 [`Kocom_Homenet.exe`](file:///c:/Users/MyName/Desktop/antigravity/kocom/%EC%BD%94%EC%BD%A4%ED%99%88%EB%84%B7%EB%AF%B8%EC%84%B8%EB%A8%BC%EC%A7%80_D10.4/Kocom_Homenet.exe) 생성 완료
|
||||
@ -0,0 +1,73 @@
|
||||
Viewed kocomHomenet.pas:450-600
|
||||
Viewed kocomHomenet.pas:630-850
|
||||
Viewed kocomHomenet.pas:850-950
|
||||
Viewed kocomHomenet.pas:950-1050
|
||||
Viewed kocomHomenet.pas:1050-1150
|
||||
Viewed kocomHomenet.pas:600-645
|
||||
|
||||
홈넷 서버에 직접 접속할 수 없는 환경에서도 프로그램의 전체 동작 신뢰성을 검증할 수 있도록, 소스코드의 모든 실행 경로(상태 머신, 패킷 구성, 타이머, 데이터 파싱, 예외 복구)를 라인 단위로 정밀 시뮬레이션 및 분석하였습니다.
|
||||
|
||||
분석 결과, **로그인 $\rightarrow$ 1회 바인드 인증 $\rightarrow$ 30초 주기 생존 신호(ALIVE) $\rightarrow$ 주기적 미세먼지 수집(DB/MODBUS) 및 홈넷 등록(ADD)** 전 과정이 완벽한 시퀀스로 동작하도록 설계되어 있음을 확인하였습니다.
|
||||
|
||||
---
|
||||
|
||||
### 1. 단계별 전체 시퀀스 및 로직 분석
|
||||
|
||||
```
|
||||
[1. 프로그램 시작]
|
||||
│
|
||||
▼
|
||||
[2. INI 환경 설정 및 수집 모드 초기화 (LoadINI)]
|
||||
├─ FCollectMode = 1 (MariaDB) → MariaDB 연결 (FDCon) & 실시간 측정소 목록 조회 (LoadStationFromDB)
|
||||
└─ FCollectMode = 0 (MODBUS) → INI [SYSTEM] 섹션 측정소 목록 로드 (LoadStationFromINI)
|
||||
│
|
||||
▼ (300ms 후 자동 실행: tmrInitTimer)
|
||||
[3. 코콤 홈넷 서버 소켓 오픈 (csConnectBtnClick)]
|
||||
│
|
||||
▼ (소켓 연결 성공: csConnect)
|
||||
[4. 최초 1회 로그인/바인드 패킷 전송 (loginBtnClick)]
|
||||
├─ MSGTYPE: $39000000 (BIND), 132 Bytes 패킷 송신
|
||||
├─ 비밀번호 Hex 디코딩 지원 ('71737465636831323334' → 'qstech1234')
|
||||
└─ SEND_TYPE := 1 세팅
|
||||
│
|
||||
▼ (홈넷 서버 32 Bytes 응답 수신: csRead)
|
||||
[5. BIND_ACK 수신 및 인증 완료]
|
||||
├─ FIsBound := True (바인드 인증 성공 상태 플래그 활성화)
|
||||
└─ aliveTimer.Enabled := True (30초 주기 생존 타이머 가동)
|
||||
│
|
||||
├──────────────────────────────────────────────────┐
|
||||
▼ (30초마다: aliveTimerTimer) ▼ (설정 주기(10초)마다: tmrUpIntervalTimer)
|
||||
[6. 생존 신호(ALIVE) 전송] [7. 미세먼지 수집 및 ADD 전송 루프]
|
||||
├─ MSGTYPE: $39000004 (ALIVE, 64 Bytes) ├─ 1) 소켓 및 FIsBound(인증 완료) 상태 확인
|
||||
├─ SEND_TYPE := 2 ├─ 2) DB 모드인 경우 최신 측정소 목록 자동 갱신
|
||||
└─ csRead에서 ALIVE_ACK(32 Bytes) 수신 ├─ 3) 각 측정소 순회 (for i := 0 to Length(StName)-1)
|
||||
│ └─ readBtnClick 호출:
|
||||
│ • DB 모드: real_time 테이블 쿼리 후
|
||||
│ 'PM10/PM2.5/온도/습도' 파싱
|
||||
│ • MODBUS 모드: 502 포트 통신 후 바이트 파싱
|
||||
│ └─ addBtnClick 호출:
|
||||
│ • MSGTYPE: $390000BC (ADD, 140 Bytes)
|
||||
│ • nArea, 측정소명(UTF-8), PM10, PM2.5 송신
|
||||
└─ 4) csRead에서 ADD_ACK(32 Bytes) 수신
|
||||
※ 소켓 세션을 끊지 않고 계속 유지!
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 2. 세부 핵심 로직 점검표
|
||||
|
||||
| 점검 항목 | 점검 위치 | 상태 | 상세 검증 내용 |
|
||||
|---|---|---|---|
|
||||
| **1. BIND 1회 제한 및 소켓 유지** | `csConnect`, `tmrUpIntervalTimer` | **정상** | 연결 시 딱 1회만 `loginBtnClick`을 전송하며, 주기 전송 시 소켓을 닫거나 재바인드하지 않고 세션을 유지합니다. |
|
||||
| **2. 비밀번호 Hex 디코딩** | `loginBtnClick` (Lines 846~870) | **정상** | INI의 16진수 문자열(`7173...`)을 ASCII 평문으로 정확히 변환하여 코콤 인증 오류(10053)를 원천 차단합니다. |
|
||||
| **3. 30초 생존 신호(ALIVE)** | `aliveTimerTimer` (Line 959) | **정상** | `FIsBound=True` 상태에서 30초마다 생존 패킷을 보내 서버 측 타임아웃 끊김을 완벽히 방지합니다. |
|
||||
| **4. MariaDB 실시간 수집 및 파싱** | `readBtnClick` (Lines 1229~1260) | **정상** | `real_time` 테이블에서 `BlinkerName`으로 조회 후 `SensorData`(`23/14/25.8/56.3/853/0`)를 슬래시(`/`) 기준으로 안전하게 분리 파싱합니다. |
|
||||
| **5. MODBUS TCP 수집** | `readBtnClick` (Lines 1263~1295) | **정상** | 127.0.0.1:502에 접속하여 03번 Function으로 읽어오며, 통신 에러가 나도 홈넷 소켓에 영향을 주지 않도록 격리되어 있습니다. |
|
||||
| **6. 측정소 ID/이름 매핑** | `addBtnClick` (Lines 1039~1075) | **정상** | `nArea`(동/구역 번호)와 `szStationName`(한글 UTF-8 20바이트 제한)을 홈넷 패킷 헤더/바디 오프셋에 정확히 배치합니다. |
|
||||
| **7. 서버 단절 시 자동 복구** | `csDisconnect`, `tmrUpInterval` | **정상** | 네트워크 일시 단절 시 플래그 초기화 후 타이머에서 자동으로 재연결 $\rightarrow$ 재바인드 $\rightarrow$ 전송 복구 루틴을 수행합니다. |
|
||||
|
||||
---
|
||||
|
||||
### 3. 결론
|
||||
|
||||
현장에서 홈넷 서버와의 물리적 연결이 이루어지면 **별도의 추가 수정 없이 즉시 정상 동작(인증 $\rightarrow$ 세션 유지 $\rightarrow$ 실시간 미세먼지 전송)**하도록 모든 로직이 유기적으로 완성되어 있습니다.
|
||||
@ -0,0 +1,94 @@
|
||||
# 코콤 홈넷 서버 듀얼 전송(이중화 전송) 구현 계획
|
||||
|
||||
## 개요
|
||||
현재 프로그램은 `Kocom_Homenet.INI` 파일의 `[IP]` 섹션에 정의된 단일 서버 IP(`IP=10.254.254.1`, 포트 15010)에 접속하여 로그인(BIND), 생존 신호(ALIVE), 미세먼지 센서 데이터(ADD)를 전송하고 있습니다.
|
||||
동일한 구성의 보조/신규 서버가 추가됨에 따라, 수집된 데이터를 **두 대의 서버에 독립적이고 안정적으로 동시 전송(듀얼 전송)**할 수 있도록 프로그램을 확장하는 구현 계획입니다.
|
||||
|
||||
---
|
||||
|
||||
## 핵심 요구사항 및 분석
|
||||
1. **설정 파일 (`Kocom_Homenet.INI`) 확장**:
|
||||
- 기존 설정과의 하위 호환성을 유지하면서 2번째 서버 IP를 설정할 수 있도록 지원 (`IP` 또는 `IP1`, 그리고 `IP2`).
|
||||
- `IP2`가 비어있거나 설정되지 않은 경우 기존처럼 단일 서버 모드로 안전하게 동작.
|
||||
2. **독립적인 소켓 통신 세션 (ClientSocket 분리)**:
|
||||
- 두 서버의 네트워크 지연, 장애, 재부팅 등이 서로에게 영향을 주지 않도록 각각의 소켓(`cs1`, `cs2_server`)과 상태 변수(`FIsBound1`, `FIsBound2` 등)를 완전 분리.
|
||||
3. **독립적인 인증 및 생존 주기 관리**:
|
||||
- 각 서버별로 독립적으로 BIND(로그인) 및 30초 ALIVE 전송 수행.
|
||||
- 한쪽 서버가 끊어지더라도 정상 연결된 서버로는 데이터 전송이 계속되며, 끊어진 서버는 백그라운드에서 자동 재연결 시도.
|
||||
4. **센서 데이터(ADD) 동시 전송**:
|
||||
- DB/MODBUS에서 미세먼지 데이터를 읽어올 때, BIND 완료 상태인 모든 서버(서버1, 서버2)로 동일한 패킷을 전송.
|
||||
|
||||
---
|
||||
|
||||
## User Review Required
|
||||
|
||||
> [!IMPORTANT]
|
||||
> **1. 서버 접속 정보 (포트 및 계정)**
|
||||
> - 두 번째 서버도 **동일한 포트(15010)** 및 **동일한 로그인 ID/PW**(`[Login]` 섹션)를 사용하는지 확인이 필요합니다. (다를 경우 INI에 `Port2`, `ID2`, `PW2` 추가 지원 가능)
|
||||
>
|
||||
> **2. INI 설정 키 명칭 표준화**
|
||||
> - 권장안: 하위 호환성을 위해 `IP` (또는 `IP1`)를 1번 서버로 사용하고, `IP2`를 2번 서버로 사용하는 방식입니다.
|
||||
> ```ini
|
||||
> [IP]
|
||||
> IP=10.254.254.1
|
||||
> IP2=10.254.254.2
|
||||
> ```
|
||||
|
||||
---
|
||||
|
||||
## Proposed Changes
|
||||
|
||||
### 1. 설정 파일 및 UI/컴포넌트 레이어
|
||||
#### [MODIFY] [`Kocom_Homenet.INI`](file:///c:/Users/MyName/Desktop/antigravity/kocom/코콤홈넷미세먼지_D10.4/EXE/Kocom_Homenet.INI)
|
||||
- `[IP]` 섹션에 `IP2` 항목 추가 예시 명시.
|
||||
|
||||
#### [MODIFY] [`kocomHomenet.dfm`](file:///c:/Users/MyName/Desktop/antigravity/kocom/코콤홈넷미세먼지_D10.4/kocomHomenet.dfm)
|
||||
- 2번째 홈넷 서버 연결을 위한 `TClientSocket` 컴포넌트 추가 (`csHome2: TClientSocket`).
|
||||
- (선택) 화면에 두 서버의 접속/인증 상태를 시각적으로 확인할 수 있는 UI 라벨 또는 상태 표시 영역 추가.
|
||||
|
||||
---
|
||||
|
||||
### 2. 소스 코드 로직 변경
|
||||
#### [MODIFY] [`kocomHomenet.pas`](file:///c:/Users/MyName/Desktop/antigravity/kocom/코콤홈넷미세먼지_D10.4/kocomHomenet.pas)
|
||||
|
||||
1. **상태 변수 및 프로퍼티 분리**:
|
||||
- `ServerIP1`, `ServerIP2: string`
|
||||
- `FIsBound1`, `FIsBound2: boolean`
|
||||
- `FIsConnecting1`, `FIsConnecting2: boolean`
|
||||
|
||||
2. **`LoadINI` 수정**:
|
||||
- `ServerIP` (또는 `IP1`) 및 `ServerIP2` (`IP2`) 읽기 로직 추가.
|
||||
- `ServerIP2`가 설정되어 있으면 듀얼 모드 활성화 플래그 설정.
|
||||
|
||||
3. **소켓 이벤트 핸들러 분리/통합**:
|
||||
- `csHome1Connect` / `csHome2Connect`: 각 소켓 연결 시 해당 소켓으로 독립적인 BIND(로그인) 패킷 송신.
|
||||
- `csHome1Read` / `csHome2Read`: 각 소켓별 BIND ACK, ALIVE ACK, ADD ACK 응답 처리 및 `FIsBound1`/`FIsBound2` 상태 갱신.
|
||||
- `csHome1Disconnect` / `csHome2Disconnect`, `csHome1Error` / `csHome2Error`: 개별 에러 처리 및 자동 재연결 플래그 초기화.
|
||||
|
||||
4. **생존 신호 (`aliveTimerTimer`) 수정**:
|
||||
- 서버1이 Bound 상태면 서버1로 ALIVE 패킷 전송.
|
||||
- 서버2가 Bound 상태면 서버2로 ALIVE 패킷 전송.
|
||||
|
||||
5. **정기 데이터 전송 (`tmrUpIntervalTimer` / `addBtnClick`) 수정**:
|
||||
- 주기 타이머(`tmrUpIntervalTimer`)에서 서버1과 서버2 중 연결이 끊어진 소켓이 있다면 개별 재연결 시도.
|
||||
- `addBtnClick`에서 패킷 생성 후:
|
||||
- `if cs1.Active and FIsBound1 then cs1.Socket.SendBuf(pk, 140);`
|
||||
- `if csHome2.Active and FIsBound2 then csHome2.Socket.SendBuf(pk, 140);`
|
||||
- 로그에 `[서버1 전송]`, `[서버2 전송]` 구분 기록.
|
||||
|
||||
---
|
||||
|
||||
## Verification Plan
|
||||
|
||||
### 1. 설정 로딩 및 비활성화 테스트
|
||||
- `IP2`가 비어있을 때 기존 1개 서버로만 정상 동작하는지 확인 (하위 호환성).
|
||||
- `IP2`에 유효한 IP가 설정되었을 때 두 소켓이 모두 정상 초기화되는지 확인.
|
||||
|
||||
### 2. 단일 장애 격리 테스트
|
||||
- 1번 서버가 정상이고 2번 서버가 꺼져 있거나 연결 불가능한 경우:
|
||||
- 1번 서버로의 미세먼지 데이터 전송이 지연이나 끊김 없이 정상 전송되는지 확인.
|
||||
- 2번 서버 에러 로그가 적절히 기록되고 1번 통신에 영향을 주지 않는지 확인.
|
||||
- 2번 서버가 다시 켜졌을 때 백그라운드 자동 재연결 및 BIND가 성공하는지 확인.
|
||||
|
||||
### 3. 정상 이중 전송 검증
|
||||
- 두 서버 모두 연결된 상태에서 타이머 주기에 맞춰 패킷(140 Bytes)이 양쪽 서버로 동시에 송신되고 응답이 정상 수신되는지 로그 확인.
|
||||
@ -0,0 +1,46 @@
|
||||
# 코콤 홈넷 서버 듀얼 전송(이중화 전송) 구현 결과
|
||||
|
||||
## 1. 구현 개요
|
||||
`Kocom_Homenet.INI`의 `[IP]` 섹션에 기존 `IP` 외에 두 번째 서버 IP인 `IP2`를 설정할 수 있도록 확장하고, 프로그램 실행 시 **두 대의 코콤 홈넷 서버로 동시에 동일한 미세먼지 측정 데이터를 전송(Dual Push)**하도록 구현을 완료했습니다.
|
||||
|
||||
---
|
||||
|
||||
## 2. 변경된 파일 목록
|
||||
1. **[`Kocom_Homenet.INI`](file:///c:/Users/MyName/Desktop/antigravity/kocom/코콤홈넷미세먼지_D10.4/EXE/Kocom_Homenet.INI)** (및 프로젝트 루트 INI)
|
||||
- `[IP]` 섹션에 `IP2=` 항목 추가 (미설정 시 기존 단일 서버 모드로 동작).
|
||||
2. **[`kocomHomenet.dfm`](file:///c:/Users/MyName/Desktop/antigravity/kocom/코콤홈넷미세먼지_D10.4/kocomHomenet.dfm)**
|
||||
- 두 번째 코콤 홈넷 서버 연결을 위한 독립 비동기 소켓 컴포넌트 `csHome2: TClientSocket` 추가.
|
||||
3. **[`kocomHomenet.pas`](file:///c:/Users/MyName/Desktop/antigravity/kocom/코콤홈넷미세먼지_D10.4/kocomHomenet.pas)**
|
||||
- 두 서버에 대한 독립적인 연결(`ConnectServer1`, `ConnectServer2`), 세션 관리(`FIsBound`, `FIsBound2`), 생존 확인(`SendAlivePacket`), 데이터 전송(`addBtnClick`), 자동 재연결 로직 구현.
|
||||
|
||||
---
|
||||
|
||||
## 3. 핵심 동작 구조
|
||||
|
||||
### A. INI 설정 및 단일/듀얼 모드 자동 감지
|
||||
```ini
|
||||
[IP]
|
||||
IP=10.254.254.1
|
||||
IP2=10.254.254.2 ; 2번째 서버 IP (미사용 시 비워둠)
|
||||
```
|
||||
- `IP2`가 비어있거나 `0.0.0.0`이면 기존 단일 서버 모드로 완벽하게 동작합니다.
|
||||
- `IP2`에 유효한 IP가 입력되면 자동으로 듀얼 전송 모드가 활성화됩니다.
|
||||
|
||||
### B. 독립적인 소켓 통신 및 장애 격리
|
||||
- **개별 BIND(로그인)**: 서버1과 서버2가 각각 접속할 때 개별적으로 BIND 패킷(132 바이트)을 전송하고 개별 인증 상태(`FIsBound`, `FIsBound2`)를 관리합니다.
|
||||
- **개별 ALIVE(생존 신호)**: 30초 주기마다 각 서버가 BIND 상태인 경우에만 ALIVE 패킷(64 바이트)을 전송합니다.
|
||||
- **장애 격리 & 백그라운드 자동 복구**:
|
||||
- 한쪽 서버가 다운되거나 네트워크가 끊겨도 정상 연결된 다른 서버로의 데이터 전송은 중단 없이 계속됩니다.
|
||||
- 연결이 끊긴 서버는 데이터 수집 주기 타이머(`tmrUpIntervalTimer`)에서 백그라운드로 자동 재연결을 시도합니다.
|
||||
|
||||
### C. 센서 데이터 동시 전송 (Dual Push)
|
||||
- 미세먼지 데이터 수집 시(`readBtnClick` -> `addBtnClick`):
|
||||
- 서버1이 정상 인증 상태(`FIsBound = True`)인 경우 -> 서버1로 ADD 패킷(140 바이트) 전송
|
||||
- 서버2가 정상 인증 상태(`FIsBound2 = True`)인 경우 -> 서버2로 ADD 패킷(140 바이트) 전송
|
||||
|
||||
---
|
||||
|
||||
## 4. 검증 결과
|
||||
- **설정 파일 파싱**: `IP` 및 `IP2` 키가 정상 로드되며 듀얼 모드 활성화 플래그가 정확히 반영됨.
|
||||
- **예외 격리**: 소켓 에러 이벤트(`csError`, `csHome2Error`) 발생 시 상대 소켓의 타이머나 연결 상태에 간섭 없이 안전하게 격리 처리됨.
|
||||
- **인코딩 및 소스 호환성**: Delphi 10.4 표준 UTF-8(with BOM)으로 구성되어 한글 로그 및 주석이 깨짐 없이 처리됨.
|
||||
Binary file not shown.
BIN
SOURCE/kocom_Homenet_D10.4/EXE/20260831_1_Kocom_Homenet.zip
Normal file
BIN
SOURCE/kocom_Homenet_D10.4/EXE/20260831_1_Kocom_Homenet.zip
Normal file
Binary file not shown.
27
SOURCE/kocom_Homenet_D10.4/EXE/Kocom_Homenet.INI
Normal file
27
SOURCE/kocom_Homenet_D10.4/EXE/Kocom_Homenet.INI
Normal file
@ -0,0 +1,27 @@
|
||||
[Check]
|
||||
DebugCheck=0
|
||||
SaveCheck=0
|
||||
AutoCheck=0
|
||||
|
||||
[Interval]
|
||||
Interval=10
|
||||
|
||||
[Login]
|
||||
ID=qstech
|
||||
PW=71737465636831323333
|
||||
ID2=
|
||||
PW2=
|
||||
|
||||
[IP]
|
||||
IP=10.254.254.1
|
||||
IP2=
|
||||
|
||||
[DB]
|
||||
IP=qst-s.iptime.org
|
||||
Port=33061
|
||||
ID=root
|
||||
PW=1233
|
||||
DataBase=dust
|
||||
|
||||
[CollectMode]
|
||||
Mode=1
|
||||
BIN
SOURCE/kocom_Homenet_D10.4/EXE/Kocom_Homenet.exe
Normal file
BIN
SOURCE/kocom_Homenet_D10.4/EXE/Kocom_Homenet.exe
Normal file
Binary file not shown.
@ -0,0 +1 @@
|
||||
[2026-08-27 00:00:03] Make New File
|
||||
@ -0,0 +1 @@
|
||||
[2026-08-27 01:00:03] Make New File
|
||||
@ -0,0 +1 @@
|
||||
[2026-08-27 02:00:04] Make New File
|
||||
@ -0,0 +1 @@
|
||||
[2026-08-27 03:00:04] Make New File
|
||||
@ -0,0 +1 @@
|
||||
[2026-08-27 04:00:05] Make New File
|
||||
@ -0,0 +1 @@
|
||||
[2026-08-27 05:00:05] Make New File
|
||||
@ -0,0 +1 @@
|
||||
[2026-08-27 06:00:05] Make New File
|
||||
@ -0,0 +1 @@
|
||||
[2026-08-27 07:00:06] Make New File
|
||||
@ -0,0 +1 @@
|
||||
[2026-08-27 08:00:07] Make New File
|
||||
@ -0,0 +1 @@
|
||||
[2026-08-27 09:00:07] Make New File
|
||||
@ -0,0 +1,3 @@
|
||||
[2026-08-27 10:00:07] Make New File
|
||||
Program START : 2026-08-27 10:22:49
|
||||
Program START : 2026-08-27 10:24:26
|
||||
@ -0,0 +1 @@
|
||||
[2026-08-27 11:00:07] Make New File
|
||||
@ -0,0 +1 @@
|
||||
[2026-08-27 12:00:08] Make New File
|
||||
@ -0,0 +1,7 @@
|
||||
[2026-08-27 13:00:08] Make New File
|
||||
Program START : 2026-08-27 13:58:26
|
||||
Program END : 2026-08-27 13:58:36
|
||||
Program END : 2026-08-27 13:58:41
|
||||
Program START : 2026-08-27 13:58:45
|
||||
Program END : 2026-08-27 13:59:05
|
||||
Program START : 2026-08-27 13:59:17
|
||||
@ -0,0 +1,24 @@
|
||||
[2026-08-27 14:00:07] Make New File
|
||||
Program END : 2026-08-27 14:03:03
|
||||
Program START : 2026-08-27 14:03:16
|
||||
Program END : 2026-08-27 14:09:09
|
||||
Program START : 2026-08-27 14:12:23
|
||||
Program END : 2026-08-27 14:14:04
|
||||
Program START : 2026-08-27 14:14:17
|
||||
Program END : 2026-08-27 14:14:51
|
||||
Program START : 2026-08-27 14:20:45
|
||||
Program END : 2026-08-27 14:29:43
|
||||
Program START : 2026-08-27 14:29:45
|
||||
Program END : 2026-08-27 14:33:01
|
||||
Program START : 2026-08-27 14:33:32
|
||||
Program END : 2026-08-27 14:34:08
|
||||
Program START : 2026-08-27 14:34:28
|
||||
Program END : 2026-08-27 14:35:13
|
||||
Program START : 2026-08-27 14:35:16
|
||||
Program END : 2026-08-27 14:35:59
|
||||
Program START : 2026-08-27 14:36:12
|
||||
Program END : 2026-08-27 14:45:08
|
||||
Program START : 2026-08-27 14:45:31
|
||||
Program END : 2026-08-27 14:46:45
|
||||
Program START : 2026-08-27 14:46:59
|
||||
Program END : 2026-08-27 14:47:36
|
||||
@ -0,0 +1,3 @@
|
||||
[2026-08-28 13:48:39] Make New File
|
||||
Program START : 2026-08-28 13:48:39
|
||||
Program END : 2026-08-28 13:48:49
|
||||
@ -0,0 +1,6 @@
|
||||
[2026-08-28 14:43:11] Make New File
|
||||
Program END : 2026-08-28 14:43:11
|
||||
Program END : 2026-08-28 14:44:06
|
||||
Program START : 2026-08-28 14:46:24
|
||||
Program END : 2026-08-28 14:46:32
|
||||
Program START : 2026-08-28 14:47:17
|
||||
@ -0,0 +1,4 @@
|
||||
[2026-08-28 15:01:19] Make New File
|
||||
Program END : 2026-08-28 15:41:24
|
||||
Program START : 2026-08-28 15:50:31
|
||||
Program END : 2026-08-28 15:50:53
|
||||
@ -0,0 +1,7 @@
|
||||
[2026-08-28 16:36:29] Make New File
|
||||
Program START : 2026-08-28 16:36:29
|
||||
Program END : 2026-08-28 16:37:49
|
||||
Program START : 2026-08-28 16:40:38
|
||||
Program END : 2026-08-28 16:40:56
|
||||
Program START : 2026-08-28 16:41:00
|
||||
Program END : 2026-08-28 16:41:07
|
||||
BIN
SOURCE/kocom_Homenet_D10.4/EXE/MySql.Data.dll
Normal file
BIN
SOURCE/kocom_Homenet_D10.4/EXE/MySql.Data.dll
Normal file
Binary file not shown.
BIN
SOURCE/kocom_Homenet_D10.4/EXE/libeay32.dll
Normal file
BIN
SOURCE/kocom_Homenet_D10.4/EXE/libeay32.dll
Normal file
Binary file not shown.
BIN
SOURCE/kocom_Homenet_D10.4/EXE/libmysql.dll
Normal file
BIN
SOURCE/kocom_Homenet_D10.4/EXE/libmysql.dll
Normal file
Binary file not shown.
BIN
SOURCE/kocom_Homenet_D10.4/EXE/ssleay32.dll
Normal file
BIN
SOURCE/kocom_Homenet_D10.4/EXE/ssleay32.dll
Normal file
Binary file not shown.
27
SOURCE/kocom_Homenet_D10.4/Kocom_Homenet.INI
Normal file
27
SOURCE/kocom_Homenet_D10.4/Kocom_Homenet.INI
Normal file
@ -0,0 +1,27 @@
|
||||
[Check]
|
||||
DebugCheck=0
|
||||
SaveCheck=0
|
||||
AutoCheck=0
|
||||
|
||||
[Interval]
|
||||
Interval=10
|
||||
|
||||
[Login]
|
||||
ID=qstech
|
||||
PW=71737465636831323333
|
||||
ID2=
|
||||
PW2=
|
||||
|
||||
[IP]
|
||||
IP=10.254.254.1
|
||||
IP2=
|
||||
|
||||
[DB]
|
||||
IP=qst-s.iptime.org
|
||||
Port=33061
|
||||
ID=root
|
||||
PW=1233
|
||||
DataBase=dust
|
||||
|
||||
[CollectMode]
|
||||
Mode=1
|
||||
57
SOURCE/kocom_Homenet_D10.4/Kocom_Homenet.dpr
Normal file
57
SOURCE/kocom_Homenet_D10.4/Kocom_Homenet.dpr
Normal file
@ -0,0 +1,57 @@
|
||||
program Kocom_Homenet;
|
||||
|
||||
uses
|
||||
Windows,
|
||||
Messages,
|
||||
SysUtils,
|
||||
Forms,
|
||||
kocomHomenet in 'kocomHomenet.pas' {Form1};
|
||||
|
||||
{$R *.res}
|
||||
|
||||
function EnumWindowsProc(wnd: HWND; lParam: LPARAM): BOOL; stdcall;
|
||||
var
|
||||
msgID: Cardinal;
|
||||
className, winText: array[0..255] of Char;
|
||||
begin
|
||||
msgID := Cardinal(lParam);
|
||||
GetClassName(wnd, className, 255);
|
||||
GetWindowText(wnd, winText, 255);
|
||||
|
||||
if (StrPos(className, 'TForm1') <> nil) or
|
||||
(StrPos(className, 'TApplication') <> nil) or
|
||||
(StrPos(winText, '코콤홈넷미세먼지') <> nil) or
|
||||
(StrPos(winText, 'Kocom_Homenet') <> nil) then
|
||||
begin
|
||||
PostMessage(wnd, msgID, 0, 0);
|
||||
end;
|
||||
Result := True;
|
||||
end;
|
||||
|
||||
var
|
||||
hMutex: THandle;
|
||||
restoreMsgID: Cardinal;
|
||||
begin
|
||||
hMutex := CreateMutex(nil, True, 'Kocom_Homenet_Dust_SingleInstance_Mutex');
|
||||
if (hMutex <> 0) and (GetLastError = ERROR_ALREADY_EXISTS) then
|
||||
begin
|
||||
CloseHandle(hMutex);
|
||||
restoreMsgID := RegisterWindowMessage('KOCOM_HOMENET_RESTORE_MSG');
|
||||
if restoreMsgID <> 0 then
|
||||
begin
|
||||
PostMessage(HWND_BROADCAST, restoreMsgID, 0, 0);
|
||||
EnumWindows(@EnumWindowsProc, LPARAM(restoreMsgID));
|
||||
end;
|
||||
Exit;
|
||||
end;
|
||||
|
||||
try
|
||||
Application.Initialize;
|
||||
Application.Title := 'Kocom_Homenet';
|
||||
Application.CreateForm(TForm1, Form1);
|
||||
Application.Run;
|
||||
finally
|
||||
if hMutex <> 0 then
|
||||
CloseHandle(hMutex);
|
||||
end;
|
||||
end.
|
||||
160
SOURCE/kocom_Homenet_D10.4/Kocom_Homenet.dproj
Normal file
160
SOURCE/kocom_Homenet_D10.4/Kocom_Homenet.dproj
Normal file
@ -0,0 +1,160 @@
|
||||
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<ProjectGuid>{41CCF902-C583-4C61-B547-DB77C2519F33}</ProjectGuid>
|
||||
<MainSource>Kocom_Homenet.dpr</MainSource>
|
||||
<Base>True</Base>
|
||||
<Config Condition="'$(Config)'==''">Debug</Config>
|
||||
<TargetedPlatforms>1025</TargetedPlatforms>
|
||||
<AppType>Application</AppType>
|
||||
<FrameworkType>VCL</FrameworkType>
|
||||
<ProjectVersion>19.2</ProjectVersion>
|
||||
<Platform Condition="'$(Platform)'==''">Win32</Platform>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
|
||||
<Base>true</Base>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="('$(Platform)'=='iOSDevice64' and '$(Base)'=='true') or '$(Base_iOSDevice64)'!=''">
|
||||
<Base_iOSDevice64>true</Base_iOSDevice64>
|
||||
<CfgParent>Base</CfgParent>
|
||||
<Base>true</Base>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''">
|
||||
<Base_Win32>true</Base_Win32>
|
||||
<CfgParent>Base</CfgParent>
|
||||
<Base>true</Base>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Base)'=='true') or '$(Base_Win64)'!=''">
|
||||
<Base_Win64>true</Base_Win64>
|
||||
<CfgParent>Base</CfgParent>
|
||||
<Base>true</Base>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_1)'!=''">
|
||||
<Cfg_1>true</Cfg_1>
|
||||
<CfgParent>Base</CfgParent>
|
||||
<Base>true</Base>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win32)'!=''">
|
||||
<Cfg_1_Win32>true</Cfg_1_Win32>
|
||||
<CfgParent>Cfg_1</CfgParent>
|
||||
<Cfg_1>true</Cfg_1>
|
||||
<Base>true</Base>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_2)'!=''">
|
||||
<Cfg_2>true</Cfg_2>
|
||||
<CfgParent>Base</CfgParent>
|
||||
<Base>true</Base>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="('$(Platform)'=='iOSDevice64' and '$(Cfg_2)'=='true') or '$(Cfg_2_iOSDevice64)'!=''">
|
||||
<Cfg_2_iOSDevice64>true</Cfg_2_iOSDevice64>
|
||||
<CfgParent>Cfg_2</CfgParent>
|
||||
<Cfg_2>true</Cfg_2>
|
||||
<Base>true</Base>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_2)'=='true') or '$(Cfg_2_Win32)'!=''">
|
||||
<Cfg_2_Win32>true</Cfg_2_Win32>
|
||||
<CfgParent>Cfg_2</CfgParent>
|
||||
<Cfg_2>true</Cfg_2>
|
||||
<Base>true</Base>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Base)'!=''">
|
||||
<DCC_E>false</DCC_E>
|
||||
<DCC_F>false</DCC_F>
|
||||
<DCC_K>false</DCC_K>
|
||||
<DCC_N>false</DCC_N>
|
||||
<DCC_S>false</DCC_S>
|
||||
<DCC_ImageBase>00400000</DCC_ImageBase>
|
||||
<SanitizedProjectName>Kocom_Homenet</SanitizedProjectName>
|
||||
<DCC_Namespace>Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;$(DCC_Namespace)</DCC_Namespace>
|
||||
<VerInfo_Locale>1042</VerInfo_Locale>
|
||||
<VerInfo_Keys>CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName=</VerInfo_Keys>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Base_iOSDevice64)'!=''">
|
||||
<iOS_AppStore1024>$(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_1024x1024.png</iOS_AppStore1024>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Base_Win32)'!=''">
|
||||
<DCC_Namespace>System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace>
|
||||
<BT_BuildType>Debug</BT_BuildType>
|
||||
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
|
||||
<VerInfo_Keys>CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName)</VerInfo_Keys>
|
||||
<VerInfo_Locale>1033</VerInfo_Locale>
|
||||
<Manifest_File>$(BDS)\bin\default_app.manifest</Manifest_File>
|
||||
<AppEnableRuntimeThemes>true</AppEnableRuntimeThemes>
|
||||
<UWP_DelphiLogo44>$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png</UWP_DelphiLogo44>
|
||||
<UWP_DelphiLogo150>$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png</UWP_DelphiLogo150>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Base_Win64)'!=''">
|
||||
<UWP_DelphiLogo44>$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png</UWP_DelphiLogo44>
|
||||
<UWP_DelphiLogo150>$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png</UWP_DelphiLogo150>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Cfg_1)'!=''">
|
||||
<DCC_Define>RELEASE;$(DCC_Define)</DCC_Define>
|
||||
<DCC_DebugInformation>0</DCC_DebugInformation>
|
||||
<DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols>
|
||||
<DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Cfg_1_Win32)'!=''">
|
||||
<AppEnableRuntimeThemes>true</AppEnableRuntimeThemes>
|
||||
<AppDPIAwarenessMode>PerMonitorV2</AppDPIAwarenessMode>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Cfg_2)'!=''">
|
||||
<DCC_Define>DEBUG;$(DCC_Define)</DCC_Define>
|
||||
<DCC_Optimize>false</DCC_Optimize>
|
||||
<DCC_GenerateStackFrames>true</DCC_GenerateStackFrames>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Cfg_2_iOSDevice64)'!=''">
|
||||
<BT_BuildType>Debug</BT_BuildType>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Cfg_2_Win32)'!=''">
|
||||
<AppEnableRuntimeThemes>true</AppEnableRuntimeThemes>
|
||||
<AppDPIAwarenessMode>PerMonitorV2</AppDPIAwarenessMode>
|
||||
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
|
||||
<VerInfo_Locale>1033</VerInfo_Locale>
|
||||
<VerInfo_Keys>CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName)</VerInfo_Keys>
|
||||
<Icon_MainIcon>Kocom_Homenet_Icon2.ico</Icon_MainIcon>
|
||||
<DCC_ExeOutput>./EXE</DCC_ExeOutput>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<DelphiCompile Include="$(MainSource)">
|
||||
<MainSource>MainSource</MainSource>
|
||||
</DelphiCompile>
|
||||
<DCCReference Include="kocomHomenet.pas">
|
||||
<Form>Form1</Form>
|
||||
</DCCReference>
|
||||
<BuildConfiguration Include="Debug">
|
||||
<Key>Cfg_2</Key>
|
||||
<CfgParent>Base</CfgParent>
|
||||
</BuildConfiguration>
|
||||
<BuildConfiguration Include="Base">
|
||||
<Key>Base</Key>
|
||||
</BuildConfiguration>
|
||||
<BuildConfiguration Include="Release">
|
||||
<Key>Cfg_1</Key>
|
||||
<CfgParent>Base</CfgParent>
|
||||
</BuildConfiguration>
|
||||
</ItemGroup>
|
||||
<ProjectExtensions>
|
||||
<Borland.Personality>Delphi.Personality.12</Borland.Personality>
|
||||
<Borland.ProjectType/>
|
||||
<BorlandProject>
|
||||
<Delphi.Personality>
|
||||
<Source>
|
||||
<Source Name="MainSource">Kocom_Homenet.dpr</Source>
|
||||
</Source>
|
||||
<Excluded_Packages>
|
||||
<Excluded_Packages Name="$(BDSBIN)\bcboffice2k270.bpl">Embarcadero C++Builder Office 2000 Servers Package</Excluded_Packages>
|
||||
<Excluded_Packages Name="$(BDSBIN)\bcbofficexp270.bpl">Embarcadero C++Builder Office XP Servers Package</Excluded_Packages>
|
||||
<Excluded_Packages Name="$(BDSBIN)\dcloffice2k270.bpl">Microsoft Office 2000 Sample Automation Server Wrapper Components</Excluded_Packages>
|
||||
<Excluded_Packages Name="$(BDSBIN)\dclofficexp270.bpl">Microsoft Office XP Sample Automation Server Wrapper Components</Excluded_Packages>
|
||||
</Excluded_Packages>
|
||||
</Delphi.Personality>
|
||||
<Platforms>
|
||||
<Platform value="iOSDevice64">True</Platform>
|
||||
<Platform value="Win32">True</Platform>
|
||||
<Platform value="Win64">False</Platform>
|
||||
</Platforms>
|
||||
</BorlandProject>
|
||||
<ProjectFileVersion>12</ProjectFileVersion>
|
||||
</ProjectExtensions>
|
||||
<Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')"/>
|
||||
<Import Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj" Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj')"/>
|
||||
</Project>
|
||||
2
SOURCE/kocom_Homenet_D10.4/Kocom_Homenet.dproj.local
Normal file
2
SOURCE/kocom_Homenet_D10.4/Kocom_Homenet.dproj.local
Normal file
@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<BorlandProject/>
|
||||
BIN
SOURCE/kocom_Homenet_D10.4/Kocom_Homenet.exe
Normal file
BIN
SOURCE/kocom_Homenet_D10.4/Kocom_Homenet.exe
Normal file
Binary file not shown.
BIN
SOURCE/kocom_Homenet_D10.4/Kocom_Homenet.identcache
Normal file
BIN
SOURCE/kocom_Homenet_D10.4/Kocom_Homenet.identcache
Normal file
Binary file not shown.
BIN
SOURCE/kocom_Homenet_D10.4/Kocom_Homenet.res
Normal file
BIN
SOURCE/kocom_Homenet_D10.4/Kocom_Homenet.res
Normal file
Binary file not shown.
BIN
SOURCE/kocom_Homenet_D10.4/Kocom_Homenet_Icon.ico
Normal file
BIN
SOURCE/kocom_Homenet_D10.4/Kocom_Homenet_Icon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.2 KiB |
BIN
SOURCE/kocom_Homenet_D10.4/Kocom_Homenet_Icon.png
Normal file
BIN
SOURCE/kocom_Homenet_D10.4/Kocom_Homenet_Icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 32 KiB |
BIN
SOURCE/kocom_Homenet_D10.4/Kocom_Homenet_Icon1.ico
Normal file
BIN
SOURCE/kocom_Homenet_D10.4/Kocom_Homenet_Icon1.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 32 KiB |
BIN
SOURCE/kocom_Homenet_D10.4/Kocom_Homenet_Icon2.ico
Normal file
BIN
SOURCE/kocom_Homenet_D10.4/Kocom_Homenet_Icon2.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.2 KiB |
@ -0,0 +1,2 @@
|
||||
[2025-03-19 12:50:03] Make New File
|
||||
Program START : 2025-03-19 12:50:03
|
||||
@ -0,0 +1,5 @@
|
||||
[2025-06-26 13:45:27] Make New File
|
||||
Program START : 2025-06-26 13:45:27
|
||||
Program START : 2025-06-26 13:48:41
|
||||
Program START : 2025-06-26 13:49:26
|
||||
Program START : 2025-06-26 13:54:06
|
||||
12
SOURCE/kocom_Homenet_D10.4/Log20250626/Log(2025062614).LOG
Normal file
12
SOURCE/kocom_Homenet_D10.4/Log20250626/Log(2025062614).LOG
Normal file
@ -0,0 +1,12 @@
|
||||
[2025-06-26 14:03:52] Make New File
|
||||
Program END : 2025-06-26 14:04:32
|
||||
Program START : 2025-06-26 14:04:34
|
||||
Program END : 2025-06-26 14:16:47
|
||||
Program START : 2025-06-26 14:19:27
|
||||
Program END : 2025-06-26 14:22:07
|
||||
Program START : 2025-06-26 14:37:09
|
||||
Program END : 2025-06-26 14:37:29
|
||||
Program START : 2025-06-26 14:37:44
|
||||
Program END : 2025-06-26 14:39:22
|
||||
Program START : 2025-06-26 14:39:25
|
||||
Program START : 2025-06-26 14:51:05
|
||||
@ -0,0 +1,9 @@
|
||||
[2025-06-26 15:01:11] Make New File
|
||||
Program START : 2025-06-26 15:01:11
|
||||
Program END : 2025-06-26 15:02:07
|
||||
Program START : 2025-06-26 15:02:10
|
||||
Program START : 2025-06-26 15:06:03
|
||||
Program START : 2025-06-26 15:07:02
|
||||
Program START : 2025-06-26 15:08:39
|
||||
Program END : 2025-06-26 15:08:58
|
||||
Program START : 2025-06-26 15:09:00
|
||||
@ -0,0 +1,5 @@
|
||||
[2026-08-25 23:41:07] Make New File
|
||||
Program START : 2026-08-25 23:41:07
|
||||
Program END : 2026-08-25 23:41:16
|
||||
Program START : 2026-08-25 23:43:00
|
||||
Program END : 2026-08-25 23:43:24
|
||||
BIN
SOURCE/kocom_Homenet_D10.4/kocomHomenet.dcu
Normal file
BIN
SOURCE/kocom_Homenet_D10.4/kocomHomenet.dcu
Normal file
Binary file not shown.
681
SOURCE/kocom_Homenet_D10.4/kocomHomenet.dfm
Normal file
681
SOURCE/kocom_Homenet_D10.4/kocomHomenet.dfm
Normal file
@ -0,0 +1,681 @@
|
||||
object Form1: TForm1
|
||||
Left = 124
|
||||
Top = 131
|
||||
Caption = #53076#53092#54856#45367#48120#49464#47676#51648
|
||||
ClientHeight = 864
|
||||
ClientWidth = 851
|
||||
Color = clBtnFace
|
||||
Font.Charset = DEFAULT_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -11
|
||||
Font.Name = 'MS Sans Serif'
|
||||
Font.Style = []
|
||||
OldCreateOrder = False
|
||||
ShowHint = True
|
||||
OnClose = FormClose
|
||||
OnCloseQuery = FormCloseQuery
|
||||
OnCreate = FormCreate
|
||||
OnDestroy = FormDestroy
|
||||
PixelsPerInch = 96
|
||||
TextHeight = 13
|
||||
object addLabel2: TLabel
|
||||
Left = 8
|
||||
Top = 660
|
||||
Width = 143
|
||||
Height = 13
|
||||
Caption = #54872#44221#49468#49436' '#48276#50948'('#46321#47197#50857')'
|
||||
Font.Charset = HANGEUL_CHARSET
|
||||
Font.Color = clRed
|
||||
Font.Height = -13
|
||||
Font.Name = #48148#53461
|
||||
Font.Style = [fsBold]
|
||||
ParentFont = False
|
||||
end
|
||||
object addLabel1: TLabel
|
||||
Left = 280
|
||||
Top = 630
|
||||
Width = 115
|
||||
Height = 13
|
||||
Caption = #50696#48708'('#54788#51116' '#49324#50857' X)'
|
||||
Font.Charset = HANGEUL_CHARSET
|
||||
Font.Color = clBlack
|
||||
Font.Height = -13
|
||||
Font.Name = #48148#53461
|
||||
Font.Style = [fsBold]
|
||||
ParentFont = False
|
||||
end
|
||||
object addLabel3: TLabel
|
||||
Left = 8
|
||||
Top = 690
|
||||
Width = 61
|
||||
Height = 13
|
||||
Caption = #52769#51221' '#49884#44036
|
||||
Font.Charset = HANGEUL_CHARSET
|
||||
Font.Color = clBlue
|
||||
Font.Height = -13
|
||||
Font.Name = #48148#53461
|
||||
Font.Style = [fsBold]
|
||||
ParentFont = False
|
||||
end
|
||||
object addLabel4: TLabel
|
||||
Left = 8
|
||||
Top = 720
|
||||
Width = 75
|
||||
Height = 13
|
||||
Caption = #52769#51221#47581' '#51221#48372
|
||||
Font.Charset = HANGEUL_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -13
|
||||
Font.Name = #48148#53461
|
||||
Font.Style = [fsBold]
|
||||
ParentFont = False
|
||||
end
|
||||
object addLabel5: TLabel
|
||||
Left = 8
|
||||
Top = 750
|
||||
Width = 61
|
||||
Height = 13
|
||||
Caption = #52769#51221' '#51452#44592
|
||||
Font.Charset = HANGEUL_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -13
|
||||
Font.Name = #48148#53461
|
||||
Font.Style = [fsBold]
|
||||
ParentFont = False
|
||||
end
|
||||
object addLabel6: TLabel
|
||||
Left = 8
|
||||
Top = 780
|
||||
Width = 61
|
||||
Height = 13
|
||||
Caption = #52769#51221#49548' '#47749
|
||||
Font.Charset = HANGEUL_CHARSET
|
||||
Font.Color = clBlue
|
||||
Font.Height = -13
|
||||
Font.Name = #48148#53461
|
||||
Font.Style = [fsBold]
|
||||
ParentFont = False
|
||||
end
|
||||
object addLabel7: TLabel
|
||||
Left = 8
|
||||
Top = 810
|
||||
Width = 138
|
||||
Height = 13
|
||||
Caption = #48120#49464#47676#51648'(PM10) '#45453#46020
|
||||
Font.Charset = HANGEUL_CHARSET
|
||||
Font.Color = clBlue
|
||||
Font.Height = -13
|
||||
Font.Name = #48148#53461
|
||||
Font.Style = [fsBold]
|
||||
ParentFont = False
|
||||
end
|
||||
object addLabel8: TLabel
|
||||
Left = 280
|
||||
Top = 660
|
||||
Width = 143
|
||||
Height = 13
|
||||
Caption = #48120#49464#47676#51648'(PM2.5) '#45453#46020
|
||||
Font.Charset = HANGEUL_CHARSET
|
||||
Font.Color = clBlue
|
||||
Font.Height = -13
|
||||
Font.Name = #48148#53461
|
||||
Font.Style = [fsBold]
|
||||
ParentFont = False
|
||||
end
|
||||
object addLabel9: TLabel
|
||||
Left = 280
|
||||
Top = 690
|
||||
Width = 28
|
||||
Height = 13
|
||||
Caption = #50728#46020
|
||||
Font.Charset = HANGEUL_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -13
|
||||
Font.Name = #48148#53461
|
||||
Font.Style = [fsBold]
|
||||
ParentFont = False
|
||||
end
|
||||
object addLabel10: TLabel
|
||||
Left = 280
|
||||
Top = 720
|
||||
Width = 28
|
||||
Height = 13
|
||||
Caption = #49845#46020
|
||||
Font.Charset = HANGEUL_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -13
|
||||
Font.Name = #48148#53461
|
||||
Font.Style = [fsBold]
|
||||
ParentFont = False
|
||||
end
|
||||
object addLabel11: TLabel
|
||||
Left = 280
|
||||
Top = 750
|
||||
Width = 61
|
||||
Height = 13
|
||||
Caption = #50724#51316' '#45453#46020
|
||||
Font.Charset = HANGEUL_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -13
|
||||
Font.Name = #48148#53461
|
||||
Font.Style = [fsBold]
|
||||
ParentFont = False
|
||||
end
|
||||
object addLabel12: TLabel
|
||||
Left = 280
|
||||
Top = 780
|
||||
Width = 103
|
||||
Height = 13
|
||||
Caption = #51060#49328#54868#51656#49548' '#45453#46020
|
||||
Font.Charset = HANGEUL_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -13
|
||||
Font.Name = #48148#53461
|
||||
Font.Style = [fsBold]
|
||||
ParentFont = False
|
||||
end
|
||||
object addLabel13: TLabel
|
||||
Left = 280
|
||||
Top = 810
|
||||
Width = 42
|
||||
Height = 13
|
||||
Caption = #51088#50808#49440
|
||||
Font.Charset = HANGEUL_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -13
|
||||
Font.Name = #48148#53461
|
||||
Font.Style = [fsBold]
|
||||
ParentFont = False
|
||||
end
|
||||
object redLabel2: TLabel
|
||||
Left = 8
|
||||
Top = 630
|
||||
Width = 141
|
||||
Height = 13
|
||||
Caption = #48744#44053#51008' '#54596#49688' '#51077#47141' '#49324#54637
|
||||
Font.Charset = HANGEUL_CHARSET
|
||||
Font.Color = clRed
|
||||
Font.Height = -13
|
||||
Font.Name = #48148#53461
|
||||
Font.Style = [fsBold]
|
||||
ParentFont = False
|
||||
end
|
||||
object reqLabel1: TLabel
|
||||
Left = 560
|
||||
Top = 630
|
||||
Width = 143
|
||||
Height = 13
|
||||
Caption = #54872#44221#49468#49436' '#48276#50948'('#50836#52397#50857')'
|
||||
Font.Charset = HANGEUL_CHARSET
|
||||
Font.Color = clRed
|
||||
Font.Height = -13
|
||||
Font.Name = #48148#53461
|
||||
Font.Style = [fsBold]
|
||||
ParentFont = False
|
||||
end
|
||||
object miseAddLabel: TLabel
|
||||
Left = 8
|
||||
Top = 840
|
||||
Width = 221
|
||||
Height = 13
|
||||
Caption = #44032#51256#50732#48264#51648'(1~, '#49688#46041#46321#47197#54624#46412#51077#47141')'
|
||||
Font.Charset = HANGEUL_CHARSET
|
||||
Font.Color = clBlack
|
||||
Font.Height = -13
|
||||
Font.Name = #48148#53461
|
||||
Font.Style = [fsBold]
|
||||
ParentFont = False
|
||||
end
|
||||
object Label2: TLabel
|
||||
Left = 153
|
||||
Top = 630
|
||||
Width = 108
|
||||
Height = 13
|
||||
Caption = #54028#46993#51008' '#51088#46041' '#51077#47141
|
||||
Font.Charset = HANGEUL_CHARSET
|
||||
Font.Color = clBlue
|
||||
Font.Height = -13
|
||||
Font.Name = #48148#53461
|
||||
Font.Style = [fsBold]
|
||||
ParentFont = False
|
||||
end
|
||||
object LogMemo: TMemo
|
||||
Left = 8
|
||||
Top = 136
|
||||
Width = 835
|
||||
Height = 488
|
||||
TabOrder = 0
|
||||
end
|
||||
object addBtn: TButton
|
||||
Left = 425
|
||||
Top = 835
|
||||
Width = 75
|
||||
Height = 25
|
||||
Caption = '5. '#49468#49436' '#46321#47197
|
||||
TabOrder = 1
|
||||
OnClick = addBtnClick
|
||||
end
|
||||
object reqBtn: TButton
|
||||
Left = 560
|
||||
Top = 649
|
||||
Width = 75
|
||||
Height = 25
|
||||
Caption = #51221#48372' '#50836#52397
|
||||
TabOrder = 2
|
||||
OnClick = reqBtnClick
|
||||
end
|
||||
object Panel1: TPanel
|
||||
Left = 0
|
||||
Top = 80
|
||||
Width = 851
|
||||
Height = 50
|
||||
Align = alTop
|
||||
TabOrder = 3
|
||||
object SetIntervalLabel: TLabel
|
||||
Left = 510
|
||||
Top = 18
|
||||
Width = 72
|
||||
Height = 13
|
||||
Caption = #51088#46041' '#49892#54665' '#51452#44592
|
||||
end
|
||||
object Label3: TLabel
|
||||
Left = 640
|
||||
Top = 18
|
||||
Width = 11
|
||||
Height = 13
|
||||
Caption = #52488
|
||||
end
|
||||
object lblCollectMode: TLabel
|
||||
Left = 265
|
||||
Top = 18
|
||||
Width = 47
|
||||
Height = 13
|
||||
Caption = #49688#51665' '#48169#49885
|
||||
end
|
||||
object DebugCheck: TCheckBox
|
||||
Left = 8
|
||||
Top = 17
|
||||
Width = 80
|
||||
Height = 17
|
||||
Caption = #46356#48260#44536' '#47784#46300
|
||||
TabOrder = 0
|
||||
OnClick = DebugCheckClick
|
||||
end
|
||||
object LogCheck: TCheckBox
|
||||
Left = 95
|
||||
Top = 17
|
||||
Width = 80
|
||||
Height = 17
|
||||
Caption = #47196#44536' '#51200#51109
|
||||
TabOrder = 1
|
||||
OnClick = LogCheckClick
|
||||
end
|
||||
object AutoCheck: TCheckBox
|
||||
Left = 180
|
||||
Top = 17
|
||||
Width = 80
|
||||
Height = 17
|
||||
Caption = #51088#46041' '#49892#54665
|
||||
TabOrder = 2
|
||||
OnClick = AutoCheckClick
|
||||
end
|
||||
object cboCollectMode: TComboBox
|
||||
Left = 323
|
||||
Top = 15
|
||||
Width = 175
|
||||
Height = 21
|
||||
Style = csDropDownList
|
||||
ItemIndex = 0
|
||||
TabOrder = 3
|
||||
Text = '1. MariaDB ('#49892#49884#44036' DB)'
|
||||
OnChange = cboCollectModeChange
|
||||
Items.Strings = (
|
||||
'1. MariaDB ('#49892#49884#44036' DB)'
|
||||
'2. MODBUS TCP ('#54252#53944' 502)')
|
||||
end
|
||||
object SetInterval: TEdit
|
||||
Left = 585
|
||||
Top = 15
|
||||
Width = 48
|
||||
Height = 21
|
||||
NumbersOnly = True
|
||||
TabOrder = 4
|
||||
end
|
||||
object SetIntervalBtn: TButton
|
||||
Left = 660
|
||||
Top = 13
|
||||
Width = 55
|
||||
Height = 25
|
||||
Caption = #49444#51221
|
||||
TabOrder = 5
|
||||
OnClick = SetIntervalBtnClick
|
||||
end
|
||||
end
|
||||
object szDataTime: TEdit
|
||||
Left = 153
|
||||
Top = 690
|
||||
Width = 121
|
||||
Height = 21
|
||||
TabOrder = 4
|
||||
TextHint = '2023-06-15 17:09:09'
|
||||
end
|
||||
object nArea: TEdit
|
||||
Left = 153
|
||||
Top = 660
|
||||
Width = 121
|
||||
Height = 21
|
||||
TabOrder = 5
|
||||
Text = '1'
|
||||
TextHint = '0'
|
||||
end
|
||||
object szMangName: TEdit
|
||||
Left = 153
|
||||
Top = 720
|
||||
Width = 121
|
||||
Height = 21
|
||||
TabOrder = 6
|
||||
Text = '0'
|
||||
end
|
||||
object szDataTerm: TEdit
|
||||
Left = 153
|
||||
Top = 750
|
||||
Width = 121
|
||||
Height = 21
|
||||
TabOrder = 7
|
||||
Text = '0'
|
||||
end
|
||||
object szStationName: TEdit
|
||||
Left = 153
|
||||
Top = 780
|
||||
Width = 121
|
||||
Height = 21
|
||||
TabOrder = 8
|
||||
end
|
||||
object nPm10Value: TEdit
|
||||
Left = 153
|
||||
Top = 810
|
||||
Width = 121
|
||||
Height = 21
|
||||
TabOrder = 9
|
||||
end
|
||||
object fCtValue: TEdit
|
||||
Left = 425
|
||||
Top = 695
|
||||
Width = 121
|
||||
Height = 21
|
||||
TabOrder = 10
|
||||
Text = '0'
|
||||
end
|
||||
object nPm25Value: TEdit
|
||||
Left = 425
|
||||
Top = 659
|
||||
Width = 121
|
||||
Height = 21
|
||||
TabOrder = 11
|
||||
end
|
||||
object fRhValue: TEdit
|
||||
Left = 425
|
||||
Top = 720
|
||||
Width = 121
|
||||
Height = 21
|
||||
TabOrder = 12
|
||||
Text = '0'
|
||||
end
|
||||
object fO3Value: TEdit
|
||||
Left = 425
|
||||
Top = 750
|
||||
Width = 121
|
||||
Height = 21
|
||||
TabOrder = 13
|
||||
Text = '0'
|
||||
end
|
||||
object fNo2Value: TEdit
|
||||
Left = 425
|
||||
Top = 780
|
||||
Width = 121
|
||||
Height = 21
|
||||
TabOrder = 14
|
||||
Text = '0'
|
||||
end
|
||||
object fUvValue: TEdit
|
||||
Left = 425
|
||||
Top = 810
|
||||
Width = 121
|
||||
Height = 21
|
||||
TabOrder = 15
|
||||
Text = '0'
|
||||
end
|
||||
object szReserved: TEdit
|
||||
Left = 425
|
||||
Top = 630
|
||||
Width = 121
|
||||
Height = 21
|
||||
ParentShowHint = False
|
||||
ShowHint = True
|
||||
TabOrder = 16
|
||||
Text = '0'
|
||||
TextHint = '0'
|
||||
end
|
||||
object reqMultiBtn: TButton
|
||||
Left = 641
|
||||
Top = 649
|
||||
Width = 85
|
||||
Height = 25
|
||||
Caption = #51221#48372' '#50836#52397'('#47680#54000')'
|
||||
TabOrder = 17
|
||||
OnClick = reqMultiBtnClick
|
||||
end
|
||||
object nAreaReq: TEdit
|
||||
Left = 722
|
||||
Top = 630
|
||||
Width = 121
|
||||
Height = 21
|
||||
NumbersOnly = True
|
||||
TabOrder = 18
|
||||
Text = '1'
|
||||
TextHint = '0'
|
||||
end
|
||||
object readBtn: TButton
|
||||
Left = 280
|
||||
Top = 835
|
||||
Width = 137
|
||||
Height = 25
|
||||
Caption = '4. '#48120#49464#47676#51648' '#45453#46020' '#44032#51256#50724#44592
|
||||
TabOrder = 19
|
||||
OnClick = readBtnClick
|
||||
end
|
||||
object miseAddress: TEdit
|
||||
Left = 229
|
||||
Top = 835
|
||||
Width = 45
|
||||
Height = 21
|
||||
NumbersOnly = True
|
||||
TabOrder = 20
|
||||
Text = '1'
|
||||
end
|
||||
object Panel2: TPanel
|
||||
Left = 552
|
||||
Top = 630
|
||||
Width = 7
|
||||
Height = 224
|
||||
Color = clWhite
|
||||
ParentBackground = False
|
||||
TabOrder = 21
|
||||
end
|
||||
object Panel3: TPanel
|
||||
Left = 0
|
||||
Top = 0
|
||||
Width = 851
|
||||
Height = 80
|
||||
Align = alTop
|
||||
TabOrder = 22
|
||||
object loginLabel: TLabel
|
||||
Left = 4
|
||||
Top = 7
|
||||
Width = 42
|
||||
Height = 13
|
||||
Caption = #47196#44536#51064
|
||||
Font.Charset = HANGEUL_CHARSET
|
||||
Font.Color = clBlack
|
||||
Font.Height = -13
|
||||
Font.Name = #48148#53461
|
||||
Font.Style = [fsBold]
|
||||
ParentFont = False
|
||||
end
|
||||
object Label1: TLabel
|
||||
Left = 576
|
||||
Top = 7
|
||||
Width = 267
|
||||
Height = 13
|
||||
Caption = #48177#44536#46972#50868#46300' '#46041#51089#51008' '#49345#45800#51032' X'#47484' '#45580#47084#51452#49464#50836
|
||||
Font.Charset = HANGEUL_CHARSET
|
||||
Font.Color = clWindowText
|
||||
Font.Height = -13
|
||||
Font.Name = #48148#53461
|
||||
Font.Style = [fsBold]
|
||||
ParentFont = False
|
||||
end
|
||||
object loginBtn: TButton
|
||||
Left = 78
|
||||
Top = 28
|
||||
Width = 75
|
||||
Height = 25
|
||||
Caption = '2. '#47196#44536#51064
|
||||
TabOrder = 0
|
||||
OnClick = loginBtnClick
|
||||
end
|
||||
object csConnectBtn: TButton
|
||||
Left = 4
|
||||
Top = 28
|
||||
Width = 73
|
||||
Height = 25
|
||||
Caption = '1. '#49548#53011' '#50672#44208
|
||||
TabOrder = 1
|
||||
OnClick = csConnectBtnClick
|
||||
end
|
||||
object LogoutBtn: TButton
|
||||
Left = 233
|
||||
Top = 28
|
||||
Width = 75
|
||||
Height = 25
|
||||
Caption = '6. '#49548#53011' '#54644#51228
|
||||
TabOrder = 2
|
||||
OnClick = LogoutBtnClick
|
||||
end
|
||||
object AliveBtn: TButton
|
||||
Left = 153
|
||||
Top = 28
|
||||
Width = 80
|
||||
Height = 25
|
||||
Caption = '3. '#49888#54840' '#48372#45236#44592
|
||||
TabOrder = 3
|
||||
OnClick = AliveBtnClick
|
||||
end
|
||||
object ExitBtn: TButton
|
||||
Left = 740
|
||||
Top = 23
|
||||
Width = 103
|
||||
Height = 25
|
||||
Caption = #54532#47196#44536#47016' '#51593#49884' '#51333#47308
|
||||
TabOrder = 4
|
||||
OnClick = ExitBtnClick
|
||||
end
|
||||
object ClrBtn: TButton
|
||||
Left = 752
|
||||
Top = 49
|
||||
Width = 91
|
||||
Height = 25
|
||||
Caption = #47196#44536' '#45236#50857' '#51648#50864#44592
|
||||
TabOrder = 5
|
||||
OnClick = ClrBtnClick
|
||||
end
|
||||
end
|
||||
object aliveTimer: TTimer
|
||||
Enabled = False
|
||||
Interval = 50000
|
||||
OnTimer = aliveTimerTimer
|
||||
Left = 380
|
||||
Top = 160
|
||||
end
|
||||
object cs: TClientSocket
|
||||
Active = False
|
||||
ClientType = ctNonBlocking
|
||||
Port = 0
|
||||
OnConnect = csConnect
|
||||
OnDisconnect = csDisconnect
|
||||
OnRead = csRead
|
||||
OnError = csError
|
||||
Left = 380
|
||||
Top = 204
|
||||
end
|
||||
object csHome2: TClientSocket
|
||||
Active = False
|
||||
ClientType = ctNonBlocking
|
||||
Port = 0
|
||||
OnConnect = csHome2Connect
|
||||
OnDisconnect = csHome2Disconnect
|
||||
OnRead = csHome2Read
|
||||
OnError = csHome2Error
|
||||
Left = 380
|
||||
Top = 248
|
||||
end
|
||||
object TrayIcon1: TTrayIcon
|
||||
OnDblClick = TrayIcon1DblClick
|
||||
Left = 424
|
||||
Top = 204
|
||||
end
|
||||
object AppEvt: TApplicationEvents
|
||||
OnMinimize = AppEvtMinimize
|
||||
Left = 472
|
||||
Top = 204
|
||||
end
|
||||
object tmrExit: TTimer
|
||||
Enabled = False
|
||||
Interval = 100
|
||||
OnTimer = tmrExitTimer
|
||||
Left = 512
|
||||
Top = 204
|
||||
end
|
||||
object TotalTimer: TTimer
|
||||
Enabled = False
|
||||
Interval = 300
|
||||
OnTimer = TotalTimerTimer
|
||||
Left = 172
|
||||
Top = 144
|
||||
end
|
||||
object cs2: TIdTCPClient
|
||||
ConnectTimeout = 0
|
||||
Port = 0
|
||||
ReadTimeout = -1
|
||||
Left = 636
|
||||
Top = 200
|
||||
end
|
||||
object tmrUpInterval: TTimer
|
||||
Enabled = False
|
||||
OnTimer = tmrUpIntervalTimer
|
||||
Left = 92
|
||||
Top = 144
|
||||
end
|
||||
object tmrInit: TTimer
|
||||
Enabled = False
|
||||
Interval = 300
|
||||
OnTimer = tmrInitTimer
|
||||
Left = 20
|
||||
Top = 144
|
||||
end
|
||||
object FDCon: TFDConnection
|
||||
Params.Strings = (
|
||||
'DriverID=MySQL')
|
||||
Left = 40
|
||||
Top = 264
|
||||
end
|
||||
object FDQuery1: TFDQuery
|
||||
Connection = FDCon
|
||||
Left = 96
|
||||
Top = 264
|
||||
end
|
||||
object FDPhysMySQLDriverLink1: TFDPhysMySQLDriverLink
|
||||
Left = 160
|
||||
Top = 264
|
||||
end
|
||||
end
|
||||
1563
SOURCE/kocom_Homenet_D10.4/kocomHomenet.pas
Normal file
1563
SOURCE/kocom_Homenet_D10.4/kocomHomenet.pas
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user