139 lines
7.1 KiB
Plaintext
139 lines
7.1 KiB
Plaintext
unit UAutoControl;
|
|
|
|
{$WARN IMPLICIT_STRING_CAST OFF}
|
|
{$WARN IMPLICIT_STRING_CAST_LOSS OFF}
|
|
|
|
{
|
|
============================================================
|
|
UAutoControl.pas - 스마트팜 HMI 자동운전 타입 정의
|
|
============================================================
|
|
이 유닛은 자동운전(Auto Control) 기능에 필요한
|
|
타입(enum, record)을 정의합니다.
|
|
|
|
구현 코드(TfrmMain 메서드)는 UAutoControl_Impl.inc 을 참조:
|
|
UMain.pas implementation 섹션의 $I UAutoControl_Impl.inc
|
|
============================================================
|
|
}
|
|
|
|
interface
|
|
|
|
type
|
|
// ─── 조건 연산자 ─────────────────────────────────────────────────────────────
|
|
TAutoCondOp = (
|
|
acoGT, // > 초과 (수치 비교)
|
|
acoLT, // < 미만 (수치 비교)
|
|
acoEQ, // = 같음 (수치 비교)
|
|
acoON, // DI 드라이 접점 ON (접점 닫힘, 값 > 0)
|
|
acoOFF // DI 드라이 접점 OFF (접점 열림, 값 = 0)
|
|
);
|
|
|
|
// ─── 유량계산 기준 ─────────────────────────────────────────────────────────────
|
|
TAutoCondFOp = (
|
|
acfoPulse, // 펄스계산
|
|
acfoLiter, // 리터계산
|
|
acfoKg // 키로그람 계산
|
|
);
|
|
|
|
// ─── 조건 결합 방식 ───────────────────────────────────────────────────────────
|
|
TAutoCondMode = (
|
|
acmAND, // 모든 조건이 참이어야 활성화
|
|
acmOR // 하나라도 참이면 활성화
|
|
);
|
|
|
|
// ─── 개별 추가 조건 아이템 ────────────────────────────────────────────────────
|
|
TAutoCondItem = record
|
|
NodeID : string; // 조건 노드 ID (예: 'AI_00', 'DI_01')
|
|
Op : TAutoCondOp; // 비교 연산자
|
|
FOp : TAutoCondFOp; // 비교 연산자 유량계산용
|
|
PerPulse : Double; // 펄스당 리터(L) / 키로그람(Kg) 계산용
|
|
Value : Double; // 비교 기준값 (수치 비교 시 사용)
|
|
BaseValue : Double; // (런타임) 구역 시작(또는 평가시작) 시점의 센서 원본값 (유량 펄스차이 계산용 등)
|
|
end;
|
|
|
|
// ─── 자동 제어 규칙 레코드 ────────────────────────────────────────────────────
|
|
TAutoRule = record
|
|
// 기본 정보
|
|
Enabled : Boolean; // 규칙 활성화 여부
|
|
|
|
// 동작 시간 범위 (hh:mm ~ hh:mm)
|
|
StartHH, StartMM : Word; // 시작 시각
|
|
EndHH, EndMM : Word; // 종료 시각
|
|
// ※ EndMin < StartMin 이면 자정 넘김으로 처리
|
|
|
|
// 출력 설정
|
|
DOChannel : Integer; // 대상 DO 채널 인덱스 (0..15)
|
|
DOState : Boolean; // 조건 충족 시 출력 상태 (True=ON, False=OFF)
|
|
|
|
// 추가 조건 목록 (빈 배열이면 시간만으로 제어)
|
|
Conditions : array of TAutoCondItem; // 다중 추가 조건
|
|
CondMode : TAutoCondMode; // 조건 결합 방식 (AND/OR)
|
|
|
|
// 실행 추적 (중복 MQTT 발행 방지)
|
|
WasActive : Boolean; // 이전 체크 주기의 활성 여부
|
|
|
|
// UI 선택 상태 (설정 파일에는 저장하지 않음)
|
|
IsSelected : Boolean; // 삭제 등을 위한 선택 여부
|
|
|
|
// 스케줄 반복 작동 (추가)
|
|
UseSchedule : Boolean; // 설정 시간 내 작동/휴식 반복 설정 사용 여부
|
|
WorkMinutes : Integer; // 작동 시간 (분)
|
|
RestMinutes : Integer; // 휴식 시간 (분)
|
|
|
|
// 메모
|
|
RuleName : string; // 사용자 정의 규칙 이름
|
|
end;
|
|
|
|
// ─── 개별 관수 제어 동작 (순차 스케쥴 용) ───────────────────────────────────────
|
|
TIrriAction = record
|
|
TargetNodeID : string; // 제어할 구역(DO 노드 ID)
|
|
DelayMins : Integer; // 정지조건 달성 후 재시작 전 쿨다운 대기시간(분)
|
|
TimeoutMin : Integer; // 1회당 제한시간(분): 이 시간 초과 시 강제 다음 구역으로 스킵 (0=무제한)
|
|
|
|
StartConds : TArray<TAutoCondItem>; // 시작 조건 (다중, 비어있으면 즉시 시작)
|
|
StartCondMode: TAutoCondMode; // 시작 조건 결합 (AND/OR)
|
|
|
|
StopConds : TArray<TAutoCondItem>; // 정지 조건 (1사이클 완료: 장비 임시 정지 후 쿨다운)
|
|
StopCondMode : TAutoCondMode; // 정지 조건 결합 (AND/OR)
|
|
|
|
EndConds : TArray<TAutoCondItem>; // 종료 조건 (구역 완전 종료)
|
|
EndCondMode : TAutoCondMode; // 종료 조건 결합 (AND/OR)
|
|
|
|
IsSelected : Boolean; // 삭제 선택 플래그 (UI 전용)
|
|
end;
|
|
|
|
// ─── 순차 관수 스케쥴 레코드 ────────────────────────────────────────────────────
|
|
TIrrigationSchedule = record
|
|
Enabled : Boolean; // 활성화 여부
|
|
SchedName : string; // 스케쥴 이름
|
|
IsAutoStart: Integer; // 0=자동(시간 도달 시 즉시 실행) / 1=수동(알림 후 승인)
|
|
|
|
StartHH, StartMM: Word; // 트리거 시각 (시:분)
|
|
StartDate, EndDate: TDate; // 실행 유효 기간 (시작일~종료일)
|
|
RepeatDays : Integer; // 반복 주기(일): 1=매일, 2=격일, ...
|
|
|
|
LimitOnesTimeMin: Integer; // 1회당 제한시간(분)
|
|
|
|
Actions : array of TIrriAction; // 순차 동작(구역) 배열
|
|
|
|
// UI 관리용
|
|
IsSelected : Boolean; // 삭제 등을 위한 선택 플래그
|
|
|
|
// 동작 런타임 상태 (파일에 저장하지 않음)
|
|
IsRunning : Boolean; // 현재 이 스케쥴이 실행 중인지 여부
|
|
WaitingManual : Boolean; // 수동 모드에서 사용자 승인 대기 중
|
|
CurrentActionIdx: Integer; // 현재 진행 중인 동작 배열 인덱스
|
|
ActionStartTick : TDateTime; // 현재 동작(또는 쿨다운)이 시작된 기준 시간
|
|
SchedStartTick : TDateTime; // 스케쥴 마스터가 동작을 시작한 시간 (LimitOnesTimeMin 검사용)
|
|
IsDelaying : Boolean; // 쿨다운(정지→재시작 대기) 상태 여부
|
|
IsCoolingDown : Boolean; // 정지조건 달성 후 쿨다운 타이머 진행 중
|
|
CooldownEndTick : TDateTime; // 쿨다운 종료 예정 시각
|
|
LastRunDate : TDate; // 마지막으로 스케쥴이 실행된 날짜
|
|
end;
|
|
|
|
// ─── 호환성 유지용 (미사용) ───────────────────────────────────────────────────
|
|
TAutoCondType = (actNone, actAI, actDI);
|
|
|
|
implementation
|
|
|
|
end.
|