Initial commit

This commit is contained in:
2026-08-11 16:20:44 +09:00
commit 15535f4e1a
117 changed files with 23897 additions and 0 deletions

View File

@@ -0,0 +1,85 @@
# BMS_D1000 프로젝트 개선 필요사항 분석 보고서
**작성일시**: 2026-08-11
**분석 대상**: BMS_D1000H C# 임베디드 솔루션 (`BMS_D1000.sln`)
---
## 1. 개요
`BMS_D1000` 프로젝트는 Windows CE 5.0 기반의 임베디드 타겟 장비에서 동작하는 모니터링 시스템입니다. 현재 동작 가능한 상태이지만, 코드의 안정성(Robustness), 유지보수성(Maintainability), 자원 관리(Resource Management) 및 불필요한 코드 관리 측면에서 몇 가지 중요한 개선 필요 항목이 확인되었습니다.
---
## 2. 세부 개선 필요 항목
### 🚨 2.1 예외 처리 및 런타임 안정성 (High Priority)
1. **Modbus 데이터 파싱 경계 검사 부재 (`IndexOutOfRangeException` 위험)**
- **위치**: [`csModbusDataProcess.cs`](file:///c:/Users/JK.Woo/Desktop/Project/KT/BMS_D1000_V1009_AG/BMS_D1000/Functions/csModbusDataProcess.cs#L28-L116)
- **문제점**: `ModBusSystemData_Reg``ModBusData_Reg` 메서드에서 수신 바이트 배열(`bdata`)의 `bdata[i]`, `bdata[i+1]` 접근 시, 수신된 데이터 길이가 예기치 않게 짧은 경우 `IndexOutOfRangeException`이 발생하여 프로그램이 비정상 종료될 위험이 있습니다.
- **개선안**: 데이터 파싱 전 `if (i + 1 >= bdata.Length) break;` 와 같이 바이트 범위를 검증하는 방어적 코드(Defensive Coding) 추가.
2. **전역 예외 처리기(Global Exception Handler) 미비**
- **위치**: [`Program.cs`](file:///c:/Users/JK.Woo/Desktop/Project/KT/BMS_D1000_V1009_AG/BMS_D1000/Program.cs)
- **문제점**: 메인 루프 진입점에 `Application.ThreadException` 또는 `AppDomain.CurrentDomain.UnhandledException` 처리 루틴이 없어, 처리되지 않은 런타임 에러 발생 시 사용자 안내 없이 즉시 튕기는 현상이 발생합니다.
- **개선안**: `Program.cs``Main()` 메서드에 최상위 `try-catch` 및 전역 예외 처리 핸들러 작성.
---
### 🛠️ 2.2 코드 가독성 및 아키텍처 개선 (Medium Priority)
1. **대규모 하드코딩 Switch-Case 문 리팩토링**
- **위치**: [`csModbusDataProcess.cs`](file:///c:/Users/JK.Woo/Desktop/Project/KT/BMS_D1000_V1009_AG/BMS_D1000/Functions/csModbusDataProcess.cs#L26-L115)
- **문제점**: 100개 이상의 레지스터 주소가 단일 `switch` 문으로 100여 줄 이상 나열되어 있어 가독성이 떨어지고 수정 시 오타 및 오동작 가능성이 큽니다.
- **개선안**: 오프셋 기반 계산식 또는 레지스터-데이터 맵(Dictionary / Delegate Mapping) 방식으로 파싱 구성을 모듈화.
2. **하드코딩된 저장소 경로 추상화**
- **위치**: [`AlarmFile.cs`](file:///c:/Users/JK.Woo/Desktop/Project/KT/BMS_D1000_V1009_AG/BMS_D1000/Utils/Function/AlarmFile.cs#L22-L27)
- **문제점**: `@"Flash Disk\Run\alarmlist.sdf"`, `@"Flash Disk\Run\AlarmHistory.db"` 와 같이 디바이스 특정 절대 경로가 코드 상수에 고정되어 있습니다.
- **개선안**: 실행 경로(`AppDomain.CurrentDomain.BaseDirectory`) 기준 상대 경로 또는 설정 파일(`App.config` 등) 기반으로 동적 경로 할당 처리.
---
### 🧹 2.3 미사용(Dead) 파일 및 프로젝트 정리 (Low Priority)
1. **미사용 더미 Form 파일 방치**
- **위치**: [`Form1.cs`](file:///c:/Users/JK.Woo/Desktop/Project/KT/BMS_D1000_V1009_AG/BMS_D1000/Form1.cs), `Form2.cs`, `Form3.cs`, `Form4.cs` (프로젝트 루트 디렉터리)
- **문제점**: `BMS_D1000.csproj`에 포함되지 않은 빈 WinForm 소스 파일들이 루트 디렉터리에 남아있어 개발 시 혼란을 유발할 수 있습니다.
- **개선안**: 불필요한 `Form1`~`Form4``.resx`, `.Designer.cs` 파일 삭제.
2. **Service 디렉터리의 `Class1.cs` 빌드 미포함**
- **위치**: [`Service/Class1.cs`](file:///c:/Users/JK.Woo/Desktop/Project/KT/BMS_D1000_V1009_AG/BMS_D1000/Service/Class1.cs)
- **문제점**: csproj에는 `<Folder Include="Service\" />` 폴더만 등록되어 있고 `Class1.cs` 소스 파일이 Compile 항목에서 누락되어 있음.
- **개선안**: 해당 소스가 필요한 기능인지 확인 후 `csproj`에 포함하거나 삭제.
3. **`Old/` 디렉터리 백업 관리**
- **위치**: `BMS_D1000/Old/`
- **문제점**: 소스 제어 시스템(Git 등)을 사용 중이라면 형상 관리에 남아있을 이전 버전 백업 디렉터리가 로컬 워크스페이스에 방치됨.
- **개선안**: 필요에 따라 로컬 정리 및 `.gitignore` 설정 점검.
---
### ⚡ 2.4 메모리 & 성능 최적화 (Optimization)
1. **문자열 연산 시 Garbage Collector (GC) 부하 유발**
- **위치**: [`AlarmFile.cs`](file:///c:/Users/JK.Woo/Desktop/Project/KT/BMS_D1000_V1009_AG/BMS_D1000/Utils/Function/AlarmFile.cs#L100-L134)
- **문제점**: `WriteDataHeader` 등 로그 작성 루프 내에서 `+` 연산자로 문자열 연결(String Concatenation)을 다수 수행하여 GC 힙 메모리 할당이 빈번하게 일어납니다. Windows CE 디바이스는 RAM 자원이 매우 제한적이므로 GC 파즈(Pause)에 취약합니다.
- **개선안**: `StringBuilder` 패턴으로 변경하여 문자열 생성 효율 극대화.
2. **파일 I/O 핸들 누수 방지**
- **위치**: [`AlarmFile.cs`](file:///c:/Users/JK.Woo/Desktop/Project/KT/BMS_D1000_V1009_AG/BMS_D1000/Utils/Function/AlarmFile.cs)
- **문제점**: `FileStream` 생성 및 닫기(`Close()`) 시 `try-finally` 또는 `using` 문 구문을 적극적으로 사용하지 않아 예외 발생 시 파일 잠금(Lock) 또는 핸들 누수가 지속될 수 있음.
- **개선안**: 파일 연산 시 `using (FileStream fs = ...)` 블록 적용.
---
## 3. 종합 조치 권고사항 우선순위
| 우선순위 | 구분 | 대상 파일 / 모듈 | 권장 조치 내용 |
| :--- | :--- | :--- | :--- |
| **P1** | **안정성** | [csModbusDataProcess.cs](file:///c:/Users/JK.Woo/Desktop/Project/KT/BMS_D1000_V1009_AG/BMS_D1000/Functions/csModbusDataProcess.cs) | 배열 범위 검사 방어 로직 추가 **(완료)** |
| **P1** | **안정성** | [Program.cs](file:///c:/Users/JK.Woo/Desktop/Project/KT/BMS_D1000_V1009_AG/BMS_D1000/Program.cs) | 전역 예외 처리기(Unhandled Exception Handler) 추가 **(완료)** |
| **P2** | **자원 관리** | [AlarmFile.cs](file:///c:/Users/JK.Woo/Desktop/Project/KT/BMS_D1000_V1009_AG/BMS_D1000/Utils/Function/AlarmFile.cs) | `using` 구문 적용 및 `StringBuilder` 사용, 경로 동적 추상화(`PathHelper`) **(완료)** |
| **P2** | **코드 가독성** | [csModbusDataProcess.cs](file:///c:/Users/JK.Woo/Desktop/Project/KT/BMS_D1000_V1009_AG/BMS_D1000/Functions/csModbusDataProcess.cs) | 거대 `switch-case` 모듈화 및 범위 기반 레지스터 매핑 리팩토링 **(완료)** |
| **P3** | **코드 정리** | 루트 Form 파일들 (`Form1`~`Form4`), `Service/Class1.cs` | 불필요한 더미 소스 정리 및 csproj 동기화 |

View File

@@ -0,0 +1,85 @@
# BMS_D1000 프로젝트 검토 보고서
**작성일시**: 2026-08-11
**프로젝트명**: BMS_D1000H (Battery Management System)
**대상 솔루션**: `BMS_D1000.sln`
---
## 1. 프로젝트 개요
본 프로젝트는 **KT / 산업용 ESS 및 배터리 랙(Rack) 및 트레이(Tray) 상태 모니터링 시스템**을 위한 임베디드 GUI 애플리케이션입니다.
SmartX 터치패널(Windows CE 기반) 디바이스에서 실시간 배터리 상태(전압, 전류, 온도, SOC, SOH, 알람 등)를 모니터링하고, 파라미터 설정 및 알람 이력을 관리하는 역할을 수행합니다.
---
## 2. 기술 스택 및 개발 환경
- **타겟 OS**: Windows CE 5.0 (Windows Embedded)
- **프레임워크**: .NET Compact Framework v3.5 (C# / Windows Forms)
- **개발 환경 (IDE)**: Visual Studio 2008 / .NET Compact Framework 개발 툴킷
- **주요 외산/하드웨어 전용 라이브러리**:
- `SmartXCommon.dll`, `SmartXCommonExt.dll`, `SmartX_IEC1000.dll` (SmartX 임베디드 디바이스제어/GUI 터치 컴포넌트)
- `Microsoft.WindowsCE.Forms`
- `System.Data.SqlServerCe` (임베디드 로컬 DB)
---
## 3. 디렉터리 및 파일 구조
```
BMS_D1000_V1009_AG/
├── BMS_D1000.sln # Visual Studio 솔루션 파일
└── BMS_D1000/ # 메인 C# 프로젝트 디렉터리
├── BMS_D1000.csproj # 프로젝트 빌드 및 어셈블리 참조 설정
├── Program.cs # 애플리케이션 진입점 (Main)
├── Revision history.txt # 버전 수정 이력 (V1.0.0.1 ~ V1.0.0.7)
├── DataStructure/ # BMS 데이터 모델 및 상수 정의
│ ├── BMSData.cs
│ └── BMSConstData.cs
├── Functions/ # 통신 및 데이터 처리 모듈
│ └── csModbusDataProcess.cs
├── Utils/ # 유틸리티 기능
│ └── Function/
│ ├── AlarmFile.cs # 알람 로그 CSV 파일 생성 및 관리
│ └── ConvertTo.cs # 데이터 변환 유틸리티
├── Form/ # Windows Forms 화면 구성 요소
│ ├── fmBMSMain.cs # 메인 BMS 모니터링 화면
│ ├── fmTrayInfo.cs # 모듈/트레이 상세 정보 화면
│ ├── fmHistory.cs # 알람 이력 조회 화면
│ ├── fmNetConfig.cs # 네트워크 설정 화면
│ ├── fmParamSet.cs # BMS 파라미터 설정 화면
│ ├── fmSystemSet.cs # 시스템 설정 화면
│ ├── fmPassword.cs # 비밀번호 인증 화면
│ └── fmScreenSaver.cs # 화면 보존(Screen Saver) 화면
└── Service/ # 확장 서비스 모듈 디렉터리
```
---
## 4. 주요 기능 모듈 분석
### 4.1 데이터 구조 (`DataStructure/`)
- `BMSData.cs`: 랙(Rack) 및 트레이(Tray) 단위의 배터리 상태 전압, 전류, Cell 별 온도, SOC, SOH, 경고/보호(Trip) 비트 플래그 정보 데이터 구조체 포함.
- `BMSConstData.cs`: BMS 장비 통신에 사용되는 상수, 알람 코드 및 시스템 파라미터 정의.
### 4.2 통신 및 데이터 처리 (`Functions/csModbusDataProcess.cs`)
- Modbus RTU/TCP 프로토콜을 통해 BMS 하드웨어 제어기와의 시리얼/Ethernet 통신 수행.
- 수신 데이터 바이트를 파싱하여 `BMSData` 구조체로 바인딩하고 UI 업데이트 이벤트 전달.
### 4.3 알람 이력 관리 (`Utils/Function/AlarmFile.cs`)
- 알람 발생 시 `Flash Disk\Run\Alarm\` 경로 등에 CSV 형태의 알람 기록 파일 자동 생성 및 저장.
- 최신 버전(V1.0.0.7) 기준 Debug GUI에서 이력 삭제 기능 지원.
### 4.4 사용자 인터페이스 (`Form/`)
- 터치패널 환경에 최적화된 사용자 인터페이스 구성.
- 랙 전체 모니터링(`fmBMSMain`), 셀/트레이 상세 상태(`fmTrayInfo`), 네트워크 및 IP 설정(`fmNetConfig`), 경보 내역 조회(`fmHistory`) 화면 제공.
---
## 5. 특이사항 및 고려사항
1. **임베디드 종속성 주의**:
- `SmartX_IEC1000` 등 특정 하드웨어 전용 벤더 라이브러리에 의존하고 있으므로, 빌드 환경에 `C:\Program Files\HNS\Embedded SmartX Component\IEC1000_DNCF35\` 디렉터리의 라이브러리가 필요합니다.
2. **.NET Compact Framework 3.5 지원 종료 이슈**:
- .NET CF 3.5는 구형 Windows CE 전용이므로 최신 윈도우 OS 개발 환경에서 Visual Studio 이전 버전 설치 및 전용 엠베디드 SDK 구성 필요.