Append measurement feature

Hi everyone,

first of all thanks for this super nice software, we have introduced SweepMe as our main measurement software in our characterization lab in the last weeks and we are pretty happy and haven’t encountered any bigger problems so far.

I have a question about a feature that is present in many measurement devices, e.g. the Keithley 4200 or the Keysight B1500. There you can do an “append run”, so adding measurement run into the same plot and result table. Is a feature like that planned (or even available already?) in the SweepMe software?

Best regards
Benjamin

1 Like

Hi Benjamin,

thanks a lot for the feedback and happy to hear it works for you.

A real append mode by design where you use an Append button instead of a Run button does not yet exist, although there are some preparations in the code to add it at some point.

It is possible to create a sequencer where you can imitate such a functionality.

The idea is to put your measurement into a Loop module and use the add-on module UserIO to stop between the repetitions where you can also ask the user to continue or to stop:

Here is the configuration string that you can copy&paste into the sequencer to get the above setup:

{
  "child_items": [
    {
      "child_items": [
        {
          "child_items": [
            {
              "child_items": [
                {
                  "child_items": [],
                  "is_checked": true,
                  "is_expanded": true,
                  "module_details": {
                    "module_type": "SMU",
                    "Label": "SMU2",
                    "value": "",
                    "Device": "SMU-Keithley_4200-SCS",
                    "Channel": "SMU2",
                    "Port": "",
                    "SweepValue": "SweepEditor",
                    "SweepMode": "Voltage in V",
                    "RouteOut": "Rear",
                    "4wire": false,
                    "Compliance": "0.0001",
                    "SkipCompliance": false,
                    "Speed": "Very fast",
                    "Range": "Auto",
                    "RangeVoltage": "Auto",
                    "Average": 1,
                    "Configuration": "",
                    "PostProcessingResistance": false,
                    "PostProcessingConductance": false,
                    "PostProcessingPower": false,
                    "ShowPulse": false,
                    "CheckPulse": false,
                    "PulseCount": "1",
                    "PulseOffLevel": "0.0",
                    "PulseOnTime": "5e-07",
                    "PulseOffTime": "200e-3",
                    "PulsePeriod": "2e-06",
                    "PulseDelay": "2e-08",
                    "PulseMeasStart": 50,
                    "PulseMeasTime": 20,
                    "PulseRiseTime": "1e-07",
                    "PulseFallTime": "1e-07",
                    "PulseImpedance": "1000000.0",
                    "SweepEditor": {
                      "sweeps": [
                        {
                          "loop": "1",
                          "start": "0.0",
                          "end": "0.0",
                          "step_points": "0.1",
                          "scaling": "Step width",
                          "hold": "0.0"
                        }
                      ]
                    },
                    "ListSweepCheck": false,
                    "ListSweepType": "Sweep",
                    "ListSweepStart": "0.0",
                    "ListSweepEnd": "1.0",
                    "ListSweepStepPointsType": "Step width:",
                    "ListSweepStepPointsValue": "0.1",
                    "ListSweepDual": false,
                    "ListSweepCustomValues": "",
                    "ListSweepHoldtime": "0.1",
                    "ListSweepDelaytime": "0.0",
                    "Comment": ""
                  }
                }
              ],
              "is_checked": true,
              "is_expanded": true,
              "module_details": {
                "module_type": "SMU",
                "Label": "SMU1",
                "value": "",
                "Device": "SMU-Keithley_4200-SCS",
                "Channel": "SMU1",
                "Port": "",
                "SweepValue": "SweepEditor",
                "SweepMode": "Voltage in V",
                "RouteOut": "Rear",
                "4wire": false,
                "Compliance": "0.0001",
                "SkipCompliance": false,
                "Speed": "Very fast",
                "Range": "Auto",
                "RangeVoltage": "Auto",
                "Average": 1,
                "Configuration": "",
                "PostProcessingResistance": false,
                "PostProcessingConductance": false,
                "PostProcessingPower": false,
                "ShowPulse": false,
                "CheckPulse": false,
                "PulseCount": "1",
                "PulseOffLevel": "0.0",
                "PulseOnTime": "5e-07",
                "PulseOffTime": "200e-3",
                "PulsePeriod": "2e-06",
                "PulseDelay": "2e-08",
                "PulseMeasStart": 50,
                "PulseMeasTime": 20,
                "PulseRiseTime": "1e-07",
                "PulseFallTime": "1e-07",
                "PulseImpedance": "1000000.0",
                "SweepEditor": {
                  "sweeps": [
                    {
                      "loop": "1",
                      "start": "0.0",
                      "end": "0.0",
                      "step_points": "0.1",
                      "scaling": "Step width",
                      "hold": "0.0"
                    }
                  ]
                },
                "ListSweepCheck": false,
                "ListSweepType": "Sweep",
                "ListSweepStart": "0.0",
                "ListSweepEnd": "1.0",
                "ListSweepStepPointsType": "Step width:",
                "ListSweepStepPointsValue": "0.1",
                "ListSweepDual": false,
                "ListSweepCustomValues": "",
                "ListSweepHoldtime": "0.1",
                "ListSweepDelaytime": "0.0",
                "Comment": ""
              }
            }
          ],
          "is_checked": true,
          "is_expanded": true,
          "module_details": {
            "module_type": "MakeFile",
            "Label": "MakeFile1",
            "value": "ID",
            "FileID": "ID",
            "ShowAdvancedOptions": false,
            "BranchIndex": true,
            "FileIndex": true,
            "ModuleLabels": true,
            "Comment": ""
          }
        },
        {
          "child_items": [],
          "is_checked": true,
          "is_expanded": true,
          "module_details": {
            "module_type": "UserIO",
            "Label": "UserIO1",
            "value": "",
            "Type": "MessageBox (Information)",
            "Message": "Please accept this message to append a furthe measurement or stop the run to finish the measurement.",
            "Variable": "Var",
            "Unit": "",
            "Maximum": "",
            "Minimum": "",
            "Choices": "",
            "Blocking": true,
            "Autoclose": true,
            "Comment": ""
          }
        }
      ],
      "is_checked": true,
      "is_expanded": true,
      "module_details": {
        "module_type": "Loop",
        "Label": "Loop1",
        "value": "nonstop",
        "Repetitions": "0",
        "UseReduction": false,
        "MaxPoints": 10000,
        "Reduction": "Quadratic",
        "KeepLastPoints": 10,
        "Comment": ""
      }
    }
  ],
  "data_type": "Sequencer",
  "version": "v1"
}

The message box is blocking so that SweepMe! waits for a user to interact. In the plot, it is then possible to split the curves for the variation of the Loop module.

I have added the feature request to our backlog. It does not mean that it will be immediately processed, but the more users request it the higher the priority gets.

Of course, it is also possible to add such features during co-innovation projects:
https://sweep-me.net/services/new-features

Let me know whether the above workaround works for you or if some other changes would also help to improve the user experience.

Thanks and best,
Axel

1 Like

Thank you very much for the quick and thorough response.

That workaround could be helpful, we will try it out.

I assume with this workaround it will not be possible to change the SMU sweep values for the appended run, right? We sometimes do measurements on very sensitive samples (e.g. memristive devices), where the initial run will be from 0…0,5V, then you go from 0…1V, then 0…1,5V and so on and check the I-V curve and the device behaviour after each iteration. So basically “creeping forward” sensibly without destroying the device in the initial run.

1 Like

I know what you mean. I did this stepwise testing towards the limits a device myself a lot.

The Sweep Editor of SweepMe! is read out right now at the beginning of the measurement. So, for now, no chance to change it during the run. (Also something we plan to change by making it possible to define sweeps during run-time).

Currently, you can do the following: You create a voltage sweep that includes the maximum range you would like to address, e.g. -3 V to 3V. Then, you can use an add-on module Condition to skip values that fulfill certain conditions e.g. are lower or higher than a given value.

These boundaries that are changing for each repetition of the IV curve could for example be defined via float fields of the add-on module Form or a slider of the add-on module ControlWidgets.

If the Condition and the Form/ControlWidgets module are part of your active branch, they will constantly check whether a point needs to be skipped.

This could look like this here:

Important is now how to configure the Condition module:

Here I use the curly parameter syntax. The value {SMU1_SweepValue} is the set value that is known before the measurement point is processed. If it is larger than e.g. the upper limit given in a float field of the Form module, the points of the voltage sweep are skipped. The execution is set to “Before each point (in ‘start’)” which tells the Condition module to verify the relation before a measurement process is started in the phase ‘start’ of our semantic phase scheme.

Please test it with a safe range and increase the voltage range if everything works.

It is even possible to automate the step-wise increase of the voltage limits using the module “Sweep”. It can be used to create arbitrary value variations.

Instead of using a Loop (nonstop), you could replace it with such a Sweep module that is increasing the boundary of the voltage sweep step-wise:

Now, the Form module is not needed anymore, because the limits are automatically changed.

You could further add a second Condition module that e.g. stops the entire measurement when some threshold is reached. This way, it could even be possible to fully automate the stepwise expansion of the voltage sweep.

Hope this help and would be interesting to hear if this is applicable to your use case.

Thanks and best,
Axel