SmartFactory_NEOL/SOURCE/NEOL_GTWYAgent_D104_PG/TemperatureConverter.pas
2026-09-04 14:06:10 +09:00

60 lines
1.6 KiB
ObjectPascal

unit TemperatureConverter;
interface
uses
System.SysUtils;
// ADC 값을 실제 온도(UP35A 재출력 스케일)로 변환하는 함수
function ConvertADCToTemperature(const ADCValue,TEMP_MIN_VALUE,TEMP_MAX_VALUE: Integer): Double;
implementation
const
// ADC 값 범위
ADC_MIN_VALUE = 0;
ADC_MAX_VALUE = 767;
// UP35A 재출력 스케일 (온도 범위)
// TEMP_MIN_VALUE = 0.0;
// TEMP_MAX_VALUE = 1700.0;
function ConvertADCToTemperature(const ADCValue,TEMP_MIN_VALUE,TEMP_MAX_VALUE: Integer): Double;
var
// ADC 값의 범위를 나타내는 델타 (분모)
ADC_RANGE: Double;
// 온도 값의 범위를 나타내는 델타 (최대 온도 - 최소 온도)
TEMP_RANGE: Double;
// 정규화된 ADC 값 (0.0 ~ 1.0)
NormalizedADC: Double;
begin
// 1. 입력 유효성 검사 (Guard Clause)
if (ADCValue < ADC_MIN_VALUE) or (ADCValue > ADC_MAX_VALUE) then
begin
// 예외 처리 또는 경고값 반환. 여기서는 최소/최대 범위로 클램핑 처리
if ADCValue < ADC_MIN_VALUE then
Exit(TEMP_MIN_VALUE)
else
Exit(TEMP_MAX_VALUE);
end;
// 2. 범위 계산
ADC_RANGE := ADC_MAX_VALUE - ADC_MIN_VALUE; // 767 - 0 = 767
TEMP_RANGE := TEMP_MAX_VALUE - TEMP_MIN_VALUE; // 1700.0 - 0.0 = 1700.0
// 3. 선형 변환 (Linear Mapping)
// 3-1. ADC 값을 0.0에서 1.0 사이의 비율로 정규화 (Normalization)
// (ADCValue - ADC_MIN_VALUE) / ADC_RANGE
// ADC_MIN_VALUE가 0이므로 (ADCValue / 767)
NormalizedADC := (ADCValue - ADC_MIN_VALUE) / ADC_RANGE;
// 3-2. 정규화된 값을 목표 온도 범위로 스케일링 (Scaling)
// TEMP_MIN_VALUE + (NormalizedADC * TEMP_RANGE)
Result := TEMP_MIN_VALUE + (NormalizedADC * TEMP_RANGE);
// 최종 결과는 0.0 ~ 1700.0 사이의 실수 (Double) 값
end;
end.