Initial commit: HC900 Crawler

Honeywell HC900을 Modbus TCP로 직접 폴링 → gRPC → C# 크롤러 → PostgreSQL.
기존 Experion OPC UA 데이터 경로를 HC900 직접 통신으로 대체.

- industrial-comm/cpp: C++ Modbus 게이트웨이 (gRPC 서버)
- src: C# .NET 8 ASP.NET Core 크롤러 + 웹 UI (3-Layer)
- mcp-server: Python FastMCP (RAG/NL2SQL/P&ID)
- 다중 컨트롤러(N-Controller) 지원

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
windpacer
2026-06-03 20:28:14 +09:00
commit 16fc7a2598
325 changed files with 126583 additions and 0 deletions

View File

@@ -0,0 +1,98 @@
syntax = "proto3";
package hc900;
import "google/protobuf/timestamp.proto";
option csharp_namespace = "Hc900.Gateway";
// ─── Data types ───
message TagValue {
string tag_name = 1;
oneof value {
float float32_val = 2;
uint32 uint16_val = 3;
}
uint32 quality = 4; // 192=good, 0=bad
google.protobuf.Timestamp timestamp = 5;
}
message TagMetadata {
string tag_name = 1;
uint32 address = 2;
uint32 count = 3; // register count (1 for uint16, 2 for float32)
string type = 4; // "float32" or "uint16"
string access = 5; // "R" or "RW"
string description = 6;
string eu = 7; // engineering unit
}
// ─── Read ───
message ReadTagsRequest {
repeated string tag_names = 1; // empty means "all cached"
}
message ReadTagsResponse {
repeated TagValue values = 1;
bool from_cache = 2;
}
// ─── Write ───
message WriteTagRequest {
string tag_name = 1;
double value = 2; // always sent as double; gateway casts to float32 or uint16
}
message WriteTagResponse {
bool success = 1;
string error = 2;
}
// ─── Stream (real-time) ───
message StreamTagsRequest {
int32 interval_ms = 1; // 0 = push on every poll
repeated string tag_names = 2; // empty = all
}
// ─── Metadata ───
message ListTagsRequest {
string filter = 1; // tag name prefix match, empty = all
int32 limit = 2; // 0 = unlimited
}
message ListTagsResponse {
repeated TagMetadata tags = 1;
}
// ─── Health ───
message HealthCheckRequest {}
message HealthCheckResponse {
enum ServingStatus {
UNKNOWN = 0;
SERVING = 1;
NOT_SERVING = 2;
}
ServingStatus status = 1;
double uptime_sec = 2;
uint64 poll_count = 3;
double last_poll_ms = 4; // duration of last full poll in ms
string controller_ip = 5;
uint32 active_tags = 6;
}
// ─── Service ───
service ModbusGateway {
rpc ReadTags(ReadTagsRequest) returns (ReadTagsResponse);
rpc WriteTag(WriteTagRequest) returns (WriteTagResponse);
rpc StreamTags(StreamTagsRequest) returns (stream TagValue);
rpc ListTags(ListTagsRequest) returns (ListTagsResponse);
rpc HealthCheck(HealthCheckRequest) returns (HealthCheckResponse);
}