Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 37 additions & 19 deletions src/nipcbatt/pcbatt_library/dmm/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,24 @@
FormatMeasurement,
RangeAndMeasurementFunctionParameters,
)
from nipcbatt.pcbatt_library.dmm.dc_rms_current_measurements.dc_rms_current_constants import (
DEFAULT_DC_RMS_CURRENT_AC_MIN_FREQUENCY,
DEFAULT_DC_RMS_CURRENT_EXECUTION_TYPE,
DEFAULT_DC_RMS_CURRENT_MEASUREMENT_CONFIGURATION,
DEFAULT_DC_RMS_CURRENT_MEASUREMENT_PARAMETERS,
DEFAULT_DC_RMS_CURRENT_TIMING_PARAMETERS,
DEFAULT_DC_RMS_CURRENT_TRIGGER_PARAMETERS,
ConstantsForDcRmsCurrentMeasurements,
)
from nipcbatt.pcbatt_library.dmm.dc_rms_current_measurements.dc_rms_current_data_types import (
CurrentRangeAndFunctions,
DcRmsCurrentMeasurementConfiguration,
DcRmsCurrentMeasurementFunctionParameters,
DcRmsCurrentMeasurementResultData,
)
from nipcbatt.pcbatt_library.dmm.dc_rms_current_measurements.dc_rms_current_measurement import (
DcRmsCurrentMeasurement,
)
from nipcbatt.pcbatt_library.dmm.dc_rms_voltage_measurements.dc_rms_voltage_constants import (
DEFAULT_DC_RMS_VOLTAGE_AC_MIN_FREQUENCY,
DEFAULT_DC_RMS_VOLTAGE_EXECUTION_TYPE,
Expand All @@ -33,6 +51,24 @@
from nipcbatt.pcbatt_library.dmm.dc_rms_voltage_measurements.dc_rms_voltage_measurement import (
DcRmsVoltageMeasurement,
)
from nipcbatt.pcbatt_library.dmm.mixed_measurements.mixed_measurement import (
MixedMeasurement,
)
from nipcbatt.pcbatt_library.dmm.mixed_measurements.mixed_measurement_constants import (
DEFAULT_MIXED_AC_MIN_FREQUENCY,
DEFAULT_MIXED_EXECUTION_TYPE,
DEFAULT_MIXED_MEASUREMENT_CONFIGURATION,
DEFAULT_MIXED_MEASUREMENT_PARAMETERS,
DEFAULT_MIXED_TIMING_PARAMETERS,
DEFAULT_MIXED_TRIGGER_PARAMETERS,
ConstantsForMixedMeasurements,
)
from nipcbatt.pcbatt_library.dmm.mixed_measurements.mixed_measurement_data_types import (
MixedMeasurementConfiguration,
MixedMeasurementFunctionParameters,
MixedMeasurementResultData,
MixedRangeAndFunctions,
)
from nipcbatt.pcbatt_library.dmm.resistance_measurements.resistance_constants import (
DEFAULT_RESISTANCE_AC_MIN_FREQUENCY,
DEFAULT_RESISTANCE_EXECUTION_TYPE,
Expand All @@ -49,23 +85,5 @@
ResistanceRangeAndFunctions,
)
from nipcbatt.pcbatt_library.dmm.resistance_measurements.resistance_measurement import (
DcRmsResistanceMeasurement)

from nipcbatt.pcbatt_library.dmm.dc_rms_current_measurements.dc_rms_current_constants import (
DEFAULT_DC_RMS_CURRENT_AC_MIN_FREQUENCY,
DEFAULT_DC_RMS_CURRENT_EXECUTION_TYPE,
DEFAULT_DC_RMS_CURRENT_MEASUREMENT_CONFIGURATION,
DEFAULT_DC_RMS_CURRENT_MEASUREMENT_PARAMETERS,
DEFAULT_DC_RMS_CURRENT_TIMING_PARAMETERS,
DEFAULT_DC_RMS_CURRENT_TRIGGER_PARAMETERS,
ConstantsForDcRmsCurrentMeasurements,
)
from nipcbatt.pcbatt_library.dmm.dc_rms_current_measurements.dc_rms_current_data_types import (
CurrentRangeAndFunctions,
DcRmsCurrentMeasurementConfiguration,
DcRmsCurrentMeasurementFunctionParameters,
DcRmsCurrentMeasurementResultData,
)
from nipcbatt.pcbatt_library.dmm.dc_rms_current_measurements.dc_rms_current_measurement import (
DcRmsCurrentMeasurement,
DcRmsResistanceMeasurement,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
"""Provides Mixed measurement functionality using DMM"""
Original file line number Diff line number Diff line change
@@ -0,0 +1,181 @@
"""Defines class used for mixed measurement on PCB points."""

from typing import Union

import nidmm

from nipcbatt.pcbatt_library.common.common_data_types import MeasurementExecutionType
from nipcbatt.pcbatt_library.dmm.common.common_data_types import (
TimingParameters,
TriggerParameters,
)
from nipcbatt.pcbatt_library.dmm.common.helper_functions import (
FormatMeasurement,
RangeAndMeasurementFunctionParameters,
)
from nipcbatt.pcbatt_library.dmm.mixed_measurements.mixed_measurement_data_types import (
MixedMeasurementConfiguration,
MixedMeasurementFunctionParameters,
MixedMeasurementResultData,
)
from nipcbatt.pcbatt_library_core.daq.pcbatt_building_blocks import (
BuildingBlockUsingNIDMM,
)


class MixedMeasurement(BuildingBlockUsingNIDMM):
"""Defines a way that allows you to perform mixed measurements on PCB points."""

def initialize(self, dmm_resource_name: str, powerline_frequency: float):
"""Initializes the DMM session with the specific resource name and powerline frequency.

Args:
dmm_resource_name (str):
The resource name of the DMM device to use for measurements.
powerline_frequency (float):
The powerline frequency in Hz.
"""
self._dmm_resource_name = dmm_resource_name
self._powerline_frequency = powerline_frequency

self._instrument = nidmm.Session(resource_name=self._dmm_resource_name)
self.session.powerline_freq = self._powerline_frequency

def configure_and_measure(
self, configuration: MixedMeasurementConfiguration
) -> Union[MixedMeasurementResultData, None]:
"""Configures and/or performs a measurement according to specific configuration parameters.

Args:
configuration (MixedMeasurementConfiguration):
An instance of `MixedMeasurementConfiguration` used to configure
the measurement.

Returns:
MixedMeasurementResultData | None: An instance of
`MixedMeasurementResultData` containing DMM execution settings
and the measured value, or None if only configuration was performed.
"""
if configuration.execution_type in (
MeasurementExecutionType.CONFIGURE_ONLY,
MeasurementExecutionType.CONFIGURE_AND_MEASURE,
):
self.configure_measurement_function(
parameters=configuration.measurement_function_parameters
)
self.configure_trigger(parameters=configuration.trigger_parameters)
self.configure_timing(parameters=configuration.timing_parameters)
if self.session.function == nidmm.Function.AC_VOLTS:
self.session.ac_min_freq = configuration.ac_min_frequency

if configuration.execution_type in (
MeasurementExecutionType.MEASURE_ONLY,
MeasurementExecutionType.CONFIGURE_AND_MEASURE,
):
# dmm_read = self.session.read()
return self.acquire_measurement(
configuration.measurement_function_parameters.resolution_in_digits.value
)
return None

def close(self):
"""Closes measurement procedure and releases internal resources."""
if self.is_session_initialized:
self.session.close()
self._instrument = None

def configure_measurement_function(self, parameters: MixedMeasurementFunctionParameters):
"""Configures the measurement function settings for the DMM.

Args:
parameters (MixedMeasurementFunctionParameters):
An instance of `MixedMeasurementFunctionParameters` containing the
measurement function type and resolution in digits to configure.
"""
measurement_function_and_range = RangeAndMeasurementFunctionParameters(
parameters.measurement_function
)
resolution_in_digits = parameters.resolution_in_digits.value
self.session.configure_measurement_digits(
measurement_function=measurement_function_and_range.measurement_function,
range=measurement_function_and_range.range_value,
resolution_digits=resolution_in_digits,
)

def configure_trigger(self, parameters: TriggerParameters):
"""Configure the characteristics of triggers used for mixed measurements.

Args:
parameters (TriggerParameters):
An instance of `TriggerParameters` containing trigger source,
trigger delay, slope, and enable/disable flag.
"""
if not parameters.enable_trigger:
self.session.configure_trigger(
trigger_source=nidmm.TriggerSource.IMMEDIATE, trigger_delay=-1.0
)
return
self.session.configure_trigger(
trigger_source=nidmm.TriggerSource[parameters.trigger_source.name],
trigger_delay=parameters.trigger_delay,
)
# Configure Slope if trigger is enabled
nidmm_trigger_slope_attribute_id = 1250334
self.session._set_attribute_vi_int32(
nidmm_trigger_slope_attribute_id, parameters.trigger_slope.value
)

def configure_timing(self, parameters: TimingParameters):
"""Configures the timing characteristics used for mixed measurements.

Args:
parameters (TimingParameters):
An instance of `TimingParameters` containing aperture time and
settle time settings.
"""
self.session.aperture_time = parameters.aperture_time_seconds
self.session.settle_time = parameters.settle_time_seconds

def acquire_measurement(self, range_in_digits: float) -> MixedMeasurementResultData:
"""Acquires and formats the measurement result data.

Args:
range_in_digits (float):
The resolution in digits used for formatting the measured value.

Returns:
MixedMeasurementResultData:
An instance of `MixedMeasurementResultData` containing:
- dmm_execution_settings: Dictionary with keys 'Function', 'Range',
'Digits_Resolution', 'Aperture_Time(s)', 'Settle_Time(s)',
'Minimum_Frequency(Hz)', 'Absolute_Resolution',
'Input_Resistance(Ohm)', and 'Auto_Range_Value'
- measurement: Dictionary with keys 'Measured_Value', 'Unit', and
'Formatted_Measurement'
"""
measured_value = self.session.read()
measurement = FormatMeasurement.measurement(
range_in_digits=range_in_digits,
measured_value=measured_value,
measurement_function=self.session.function,
)
aperture_time = "{}{}".format(
*FormatMeasurement.format_with_si_prefix(self.session.aperture_time, 3)
)
settle_time = "{}{}".format(
*FormatMeasurement.format_with_si_prefix(self.session.settle_time.total_seconds(), 3)
)
dmm_execution_settings = {
"Function": self.session.function.name,
"Range": self.session.range,
"Digits_Resolution": self.session.resolution_digits,
"Aperture_Time(s)": aperture_time,
"Settle_Time(s)": settle_time,
"Minimum_Frequency(Hz)": self.session.ac_min_freq,
"Absolute_Resolution": self.session.resolution_absolute,
"Input_Resistance(Ohm)": self.session.input_resistance,
"Auto_Range_Value": self.session.auto_range_value,
}
return MixedMeasurementResultData(
dmm_execution_settings=dmm_execution_settings, measurement=measurement
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
"""Constants data types for Mixed Measurements."""

import dataclasses

from nipcbatt.pcbatt_library.dmm.common.common_data_types import (
TimingParameters,
TriggerParameters,
)
from nipcbatt.pcbatt_library.dmm.common.constants import ConstantsForDcRmsMeasurements
from nipcbatt.pcbatt_library.dmm.mixed_measurements.mixed_measurement_data_types import (
MixedMeasurementConfiguration,
MixedMeasurementFunctionParameters,
MixedRangeAndFunctions,
)


@dataclasses.dataclass
class ConstantsForMixedMeasurements:
"""Constants used for Mixed measurement."""

RANGE_AND_FUNCTION = MixedRangeAndFunctions.DC_Voltage_Auto_Range


# Mixed measurement-specific range/function setting is defined
# in ConstantsForMixedMeasurements.
# Default execution type for Mixed measurements
DEFAULT_MIXED_EXECUTION_TYPE = ConstantsForDcRmsMeasurements.DEFAULT_EXECUTION_TYPE

# Default measurement function parameter including Mixed range/function and resolution in digits
DEFAULT_MIXED_MEASUREMENT_PARAMETERS = MixedMeasurementFunctionParameters(
measurement_function=ConstantsForMixedMeasurements.RANGE_AND_FUNCTION,
resolution_in_digits=ConstantsForDcRmsMeasurements.DEFAULT_RESOLUTION_IN_DIGITS,
)

# Default timing parameters including aperture time and settle time
DEFAULT_MIXED_TIMING_PARAMETERS = TimingParameters(
aperture_time_seconds=ConstantsForDcRmsMeasurements.DEFAULT_APERTURE_TIME_SECONDS,
settle_time_seconds=ConstantsForDcRmsMeasurements.DEFAULT_SETTLE_TIME_SECONDS,
)

# Default AC minimum frequency
DEFAULT_MIXED_AC_MIN_FREQUENCY = ConstantsForDcRmsMeasurements.DEFAULT_AC_MIN_FREQUENCY

# Default trigger parameters including trigger source, trigger delay, and trigger enable setting
DEFAULT_MIXED_TRIGGER_PARAMETERS = TriggerParameters(
trigger_source=ConstantsForDcRmsMeasurements.DEFAULT_TRIGGER_SOURCE,
trigger_delay=ConstantsForDcRmsMeasurements.DEFAULT_TRIGGER_DELAY,
slope=ConstantsForDcRmsMeasurements.DEFAULT_TRIGGER_SLOPE,
enable_trigger=ConstantsForDcRmsMeasurements.DEFAULT_ENABLE_TRIGGER,
)

# Default DC-RMS Mixed measurement configuration
DEFAULT_MIXED_MEASUREMENT_CONFIGURATION = MixedMeasurementConfiguration(
execution_type=DEFAULT_MIXED_EXECUTION_TYPE,
measurement_function_parameters=DEFAULT_MIXED_MEASUREMENT_PARAMETERS,
trigger_parameters=DEFAULT_MIXED_TRIGGER_PARAMETERS,
timing_parameters=DEFAULT_MIXED_TIMING_PARAMETERS,
ac_min_frequency=DEFAULT_MIXED_AC_MIN_FREQUENCY,
)
Loading
Loading