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; // 시작 조건 (다중, 비어있으면 즉시 시작) StartCondMode: TAutoCondMode; // 시작 조건 결합 (AND/OR) StopConds : TArray; // 정지 조건 (1사이클 완료: 장비 임시 정지 후 쿨다운) StopCondMode : TAutoCondMode; // 정지 조건 결합 (AND/OR) EndConds : TArray; // 종료 조건 (구역 완전 종료) 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.