cgse 2024.7.0__py3-none-any.whl → 2025.0.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- README.md +27 -0
- bump.py +85 -0
- cgse-2025.0.1.dist-info/METADATA +38 -0
- cgse-2025.0.1.dist-info/RECORD +5 -0
- {cgse-2024.7.0.dist-info → cgse-2025.0.1.dist-info}/WHEEL +1 -2
- cgse-2024.7.0.dist-info/COPYING +0 -674
- cgse-2024.7.0.dist-info/COPYING.LESSER +0 -165
- cgse-2024.7.0.dist-info/METADATA +0 -144
- cgse-2024.7.0.dist-info/RECORD +0 -660
- cgse-2024.7.0.dist-info/entry_points.txt +0 -75
- cgse-2024.7.0.dist-info/top_level.txt +0 -2
- egse/__init__.py +0 -12
- egse/__main__.py +0 -32
- egse/aeu/aeu.py +0 -5238
- egse/aeu/aeu_awg.yaml +0 -265
- egse/aeu/aeu_crio.yaml +0 -273
- egse/aeu/aeu_cs.py +0 -627
- egse/aeu/aeu_devif.py +0 -321
- egse/aeu/aeu_main_ui.py +0 -903
- egse/aeu/aeu_metrics.py +0 -131
- egse/aeu/aeu_protocol.py +0 -463
- egse/aeu/aeu_psu.yaml +0 -204
- egse/aeu/aeu_ui.py +0 -873
- egse/aeu/arbdata/FccdRead.arb +0 -2
- egse/aeu/arbdata/FccdRead_min_points.arb +0 -2
- egse/aeu/arbdata/HeaterSync_FccdRead.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead25.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead31_25.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead37_50.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead43_75.arb +0 -2
- egse/aeu/arbdata/HeaterSync_ccdRead50.arb +0 -2
- egse/aeu/arbdata/Heater_FccdRead_min_points.arb +0 -2
- egse/aeu/arbdata/ccdRead25.arb +0 -2
- egse/aeu/arbdata/ccdRead25_150ms.arb +0 -2
- egse/aeu/arbdata/ccdRead31_25.arb +0 -2
- egse/aeu/arbdata/ccdRead31_25_150ms.arb +0 -2
- egse/aeu/arbdata/ccdRead37_50.arb +0 -2
- egse/aeu/arbdata/ccdRead37_50_150ms.arb +0 -2
- egse/aeu/arbdata/ccdRead43_75.arb +0 -2
- egse/aeu/arbdata/ccdRead43_75_150ms.arb +0 -2
- egse/aeu/arbdata/ccdRead50.arb +0 -2
- egse/aeu/arbdata/ccdRead50_150ms.arb +0 -2
- egse/alert/__init__.py +0 -1049
- egse/alert/alertman.yaml +0 -37
- egse/alert/alertman_cs.py +0 -233
- egse/alert/alertman_ui.py +0 -600
- egse/alert/gsm/beaglebone.py +0 -138
- egse/alert/gsm/beaglebone.yaml +0 -51
- egse/alert/gsm/beaglebone_cs.py +0 -108
- egse/alert/gsm/beaglebone_devif.py +0 -122
- egse/alert/gsm/beaglebone_protocol.py +0 -46
- egse/bits.py +0 -318
- egse/camera.py +0 -44
- egse/collimator/__init__.py +0 -0
- egse/collimator/fcul/__init__.py +0 -0
- egse/collimator/fcul/ogse.py +0 -1077
- egse/collimator/fcul/ogse.yaml +0 -14
- egse/collimator/fcul/ogse_cs.py +0 -154
- egse/collimator/fcul/ogse_devif.py +0 -358
- egse/collimator/fcul/ogse_protocol.py +0 -132
- egse/collimator/fcul/ogse_sim.py +0 -431
- egse/collimator/fcul/ogse_ui.py +0 -1108
- egse/command.py +0 -699
- egse/config.py +0 -410
- egse/confman/__init__.py +0 -1058
- egse/confman/confman.yaml +0 -70
- egse/confman/confman_cs.py +0 -240
- egse/confman/confman_ui.py +0 -381
- egse/confman/setup_ui.py +0 -565
- egse/control.py +0 -632
- egse/coordinates/__init__.py +0 -534
- egse/coordinates/avoidance.py +0 -100
- egse/coordinates/cslmodel.py +0 -127
- egse/coordinates/laser_tracker_to_dict.py +0 -122
- egse/coordinates/point.py +0 -707
- egse/coordinates/pyplot.py +0 -194
- egse/coordinates/referenceFrame.py +0 -1279
- egse/coordinates/refmodel.py +0 -737
- egse/coordinates/rotationMatrix.py +0 -85
- egse/coordinates/transform3d_addon.py +0 -419
- egse/csl/__init__.py +0 -50
- egse/csl/commanding.py +0 -78
- egse/csl/icons/hexapod-connected-selected.svg +0 -30
- egse/csl/icons/hexapod-connected.svg +0 -30
- egse/csl/icons/hexapod-homing-selected.svg +0 -68
- egse/csl/icons/hexapod-homing.svg +0 -68
- egse/csl/icons/hexapod-retract-selected.svg +0 -56
- egse/csl/icons/hexapod-retract.svg +0 -51
- egse/csl/icons/hexapod-zero-selected.svg +0 -56
- egse/csl/icons/hexapod-zero.svg +0 -56
- egse/csl/icons/logo-puna.svg +0 -92
- egse/csl/icons/stop.svg +0 -1
- egse/csl/initialisation.py +0 -102
- egse/csl/mech_pos_settings.yaml +0 -18
- egse/das.py +0 -1240
- egse/das.yaml +0 -7
- egse/data/conf/SETUP_CSL_00000_170620_150000.yaml +0 -5
- egse/data/conf/SETUP_CSL_00001_170620_151010.yaml +0 -69
- egse/data/conf/SETUP_CSL_00002_170620_151020.yaml +0 -69
- egse/data/conf/SETUP_CSL_00003_170620_151030.yaml +0 -69
- egse/data/conf/SETUP_CSL_00004_170620_151040.yaml +0 -69
- egse/data/conf/SETUP_CSL_00005_170620_151050.yaml +0 -69
- egse/data/conf/SETUP_CSL_00006_170620_151060.yaml +0 -69
- egse/data/conf/SETUP_CSL_00007_170620_151070.yaml +0 -69
- egse/data/conf/SETUP_CSL_00008_170620_151080.yaml +0 -75
- egse/data/conf/SETUP_CSL_00010_210308_083016.yaml +0 -138
- egse/data/conf/SETUP_INTA_00000_170620_150000.yaml +0 -4
- egse/data/conf/SETUP_SRON_00000_170620_150000.yaml +0 -4
- egse/decorators.py +0 -514
- egse/device.py +0 -269
- egse/dpu/__init__.py +0 -2698
- egse/dpu/ccd_ui.py +0 -514
- egse/dpu/dpu.py +0 -783
- egse/dpu/dpu.yaml +0 -153
- egse/dpu/dpu_cs.py +0 -272
- egse/dpu/dpu_ui.py +0 -671
- egse/dpu/fitsgen.py +0 -2096
- egse/dpu/fitsgen_ui.py +0 -399
- egse/dpu/hdf5_model.py +0 -332
- egse/dpu/hdf5_ui.py +0 -277
- egse/dpu/hdf5_viewer.py +0 -506
- egse/dpu/hk_ui.py +0 -468
- egse/dpu_commands.py +0 -81
- egse/dsi/__init__.py +0 -33
- egse/dsi/_libesl.py +0 -232
- egse/dsi/constants.py +0 -296
- egse/dsi/esl.py +0 -630
- egse/dsi/rmap.py +0 -444
- egse/dsi/rmapci.py +0 -39
- egse/dsi/spw.py +0 -335
- egse/dsi/spw_state.py +0 -29
- egse/dummy.py +0 -318
- egse/dyndummy.py +0 -179
- egse/env.py +0 -278
- egse/exceptions.py +0 -88
- egse/fdir/__init__.py +0 -26
- egse/fdir/fdir_manager.py +0 -85
- egse/fdir/fdir_manager.yaml +0 -37
- egse/fdir/fdir_manager_controller.py +0 -136
- egse/fdir/fdir_manager_cs.py +0 -164
- egse/fdir/fdir_manager_interface.py +0 -15
- egse/fdir/fdir_remote.py +0 -73
- egse/fdir/fdir_remote.yaml +0 -30
- egse/fdir/fdir_remote_controller.py +0 -30
- egse/fdir/fdir_remote_cs.py +0 -94
- egse/fdir/fdir_remote_interface.py +0 -9
- egse/fdir/fdir_remote_popup.py +0 -26
- egse/fee/__init__.py +0 -106
- egse/fee/f_fee_register.yaml +0 -43
- egse/fee/feesim.py +0 -914
- egse/fee/n_fee_hk.py +0 -768
- egse/fee/nfee.py +0 -188
- egse/filterwheel/__init__.py +0 -4
- egse/filterwheel/eksma/__init__.py +0 -49
- egse/filterwheel/eksma/fw8smc4.py +0 -657
- egse/filterwheel/eksma/fw8smc4.yaml +0 -121
- egse/filterwheel/eksma/fw8smc4_cs.py +0 -144
- egse/filterwheel/eksma/fw8smc4_devif.py +0 -473
- egse/filterwheel/eksma/fw8smc4_protocol.py +0 -82
- egse/filterwheel/eksma/fw8smc4_ui.py +0 -940
- egse/filterwheel/eksma/fw8smc5.py +0 -115
- egse/filterwheel/eksma/fw8smc5.yaml +0 -105
- egse/filterwheel/eksma/fw8smc5_controller.py +0 -307
- egse/filterwheel/eksma/fw8smc5_cs.py +0 -141
- egse/filterwheel/eksma/fw8smc5_interface.py +0 -65
- egse/filterwheel/eksma/fw8smc5_simulator.py +0 -29
- egse/filterwheel/eksma/fw8smc5_ui.py +0 -1065
- egse/filterwheel/eksma/testpythonfw.py +0 -215
- egse/fov/__init__.py +0 -65
- egse/fov/fov_hk.py +0 -710
- egse/fov/fov_ui.py +0 -859
- egse/fov/fov_ui_controller.py +0 -140
- egse/fov/fov_ui_model.py +0 -200
- egse/fov/fov_ui_view.py +0 -345
- egse/gimbal/__init__.py +0 -32
- egse/gimbal/symetrie/__init__.py +0 -26
- egse/gimbal/symetrie/alpha.py +0 -586
- egse/gimbal/symetrie/generic_gimbal_ui.py +0 -1521
- egse/gimbal/symetrie/gimbal.py +0 -877
- egse/gimbal/symetrie/gimbal.yaml +0 -168
- egse/gimbal/symetrie/gimbal_cs.py +0 -183
- egse/gimbal/symetrie/gimbal_protocol.py +0 -138
- egse/gimbal/symetrie/gimbal_ui.py +0 -361
- egse/gimbal/symetrie/pmac.py +0 -1006
- egse/gimbal/symetrie/pmac_regex.py +0 -83
- egse/graph.py +0 -132
- egse/gui/__init__.py +0 -47
- egse/gui/buttons.py +0 -378
- egse/gui/focalplane.py +0 -1285
- egse/gui/formatter.py +0 -10
- egse/gui/led.py +0 -162
- egse/gui/limitswitch.py +0 -143
- egse/gui/mechanisms.py +0 -587
- egse/gui/states.py +0 -148
- egse/gui/stripchart.py +0 -729
- egse/gui/styles.qss +0 -48
- egse/gui/switch.py +0 -112
- egse/h5.py +0 -274
- egse/help/__init__.py +0 -0
- egse/help/help_ui.py +0 -126
- egse/hexapod/__init__.py +0 -32
- egse/hexapod/symetrie/__init__.py +0 -137
- egse/hexapod/symetrie/alpha.py +0 -874
- egse/hexapod/symetrie/dynalpha.py +0 -1387
- egse/hexapod/symetrie/hexapod_ui.py +0 -1516
- egse/hexapod/symetrie/pmac.py +0 -1010
- egse/hexapod/symetrie/pmac_regex.py +0 -83
- egse/hexapod/symetrie/puna.py +0 -1167
- egse/hexapod/symetrie/puna.yaml +0 -193
- egse/hexapod/symetrie/puna_cs.py +0 -195
- egse/hexapod/symetrie/puna_protocol.py +0 -134
- egse/hexapod/symetrie/puna_ui.py +0 -433
- egse/hexapod/symetrie/punaplus.py +0 -107
- egse/hexapod/symetrie/zonda.py +0 -872
- egse/hexapod/symetrie/zonda.yaml +0 -337
- egse/hexapod/symetrie/zonda_cs.py +0 -172
- egse/hexapod/symetrie/zonda_devif.py +0 -414
- egse/hexapod/symetrie/zonda_protocol.py +0 -123
- egse/hexapod/symetrie/zonda_ui.py +0 -449
- egse/hk.py +0 -791
- egse/icons/aeu-cs-start.svg +0 -117
- egse/icons/aeu-cs-stop.svg +0 -118
- egse/icons/aeu-cs.svg +0 -107
- egse/icons/aeu_cs-started.svg +0 -112
- egse/icons/aeu_cs-stopped.svg +0 -112
- egse/icons/aeu_cs.svg +0 -55
- egse/icons/alert.svg +0 -1
- egse/icons/arrow-double-left.png +0 -0
- egse/icons/arrow-double-right.png +0 -0
- egse/icons/arrow-up.svg +0 -11
- egse/icons/backward.svg +0 -1
- egse/icons/busy.svg +0 -1
- egse/icons/cleaning.svg +0 -115
- egse/icons/color-scheme.svg +0 -1
- egse/icons/cs-connected-alert.svg +0 -91
- egse/icons/cs-connected-disabled.svg +0 -43
- egse/icons/cs-connected.svg +0 -89
- egse/icons/cs-not-connected.svg +0 -44
- egse/icons/double-left-arrow.svg +0 -1
- egse/icons/double-right-arrow.svg +0 -1
- egse/icons/erase-disabled.svg +0 -19
- egse/icons/erase.svg +0 -59
- egse/icons/fitsgen-start.svg +0 -47
- egse/icons/fitsgen-stop.svg +0 -48
- egse/icons/fitsgen.svg +0 -1
- egse/icons/forward.svg +0 -1
- egse/icons/fov-hk-start.svg +0 -33
- egse/icons/fov-hk-stop.svg +0 -37
- egse/icons/fov-hk.svg +0 -1
- egse/icons/front-desk.svg +0 -1
- egse/icons/home-actioned.svg +0 -15
- egse/icons/home-disabled.svg +0 -15
- egse/icons/home.svg +0 -13
- egse/icons/info.svg +0 -1
- egse/icons/invalid.png +0 -0
- egse/icons/led-green.svg +0 -20
- egse/icons/led-grey.svg +0 -20
- egse/icons/led-orange.svg +0 -20
- egse/icons/led-red.svg +0 -20
- egse/icons/led-square-green.svg +0 -134
- egse/icons/led-square-grey.svg +0 -134
- egse/icons/led-square-orange.svg +0 -134
- egse/icons/led-square-red.svg +0 -134
- egse/icons/limit-switch-all-green.svg +0 -115
- egse/icons/limit-switch-all-red.svg +0 -117
- egse/icons/limit-switch-el+.svg +0 -116
- egse/icons/limit-switch-el-.svg +0 -117
- egse/icons/location-marker.svg +0 -1
- egse/icons/logo-dpu.svg +0 -48
- egse/icons/logo-gimbal.svg +0 -112
- egse/icons/logo-huber.svg +0 -23
- egse/icons/logo-ogse.svg +0 -31
- egse/icons/logo-puna.svg +0 -92
- egse/icons/logo-tcs.svg +0 -29
- egse/icons/logo-zonda.svg +0 -66
- egse/icons/maximize.svg +0 -1
- egse/icons/meter.svg +0 -1
- egse/icons/more.svg +0 -45
- egse/icons/n-fee-hk-start.svg +0 -24
- egse/icons/n-fee-hk-stop.svg +0 -25
- egse/icons/n-fee-hk.svg +0 -83
- egse/icons/observing-off.svg +0 -46
- egse/icons/observing-on.svg +0 -46
- egse/icons/open-document-hdf5.png +0 -0
- egse/icons/open-document-hdf5.svg +0 -21
- egse/icons/ops-mode.svg +0 -1
- egse/icons/play-green.svg +0 -17
- egse/icons/plugged-disabled.svg +0 -27
- egse/icons/plugged.svg +0 -21
- egse/icons/pm_ui.svg +0 -1
- egse/icons/power-button-green.svg +0 -27
- egse/icons/power-button-red.svg +0 -27
- egse/icons/power-button.svg +0 -27
- egse/icons/radar.svg +0 -1
- egse/icons/radioactive.svg +0 -2
- egse/icons/reload.svg +0 -1
- egse/icons/remote-control-off.svg +0 -28
- egse/icons/remote-control-on.svg +0 -28
- egse/icons/repeat-blue.svg +0 -15
- egse/icons/repeat.svg +0 -1
- egse/icons/settings.svg +0 -1
- egse/icons/shrink.svg +0 -1
- egse/icons/shutter.svg +0 -1
- egse/icons/sign-off.svg +0 -1
- egse/icons/sign-on.svg +0 -1
- egse/icons/sim-mode.svg +0 -1
- egse/icons/small-buttons-go.svg +0 -20
- egse/icons/small-buttons-minus.svg +0 -51
- egse/icons/small-buttons-plus.svg +0 -51
- egse/icons/sponge.svg +0 -220
- egse/icons/start-button-disabled.svg +0 -84
- egse/icons/start-button.svg +0 -50
- egse/icons/stop-button-disabled.svg +0 -84
- egse/icons/stop-button.svg +0 -50
- egse/icons/stop-red.svg +0 -17
- egse/icons/stop.svg +0 -1
- egse/icons/switch-disabled-square.svg +0 -87
- egse/icons/switch-disabled.svg +0 -15
- egse/icons/switch-off-square.svg +0 -87
- egse/icons/switch-off.svg +0 -72
- egse/icons/switch-on-square.svg +0 -87
- egse/icons/switch-on.svg +0 -61
- egse/icons/temperature-control.svg +0 -44
- egse/icons/th_ui_logo.svg +0 -1
- egse/icons/unplugged.svg +0 -23
- egse/icons/unvalid.png +0 -0
- egse/icons/user-interface.svg +0 -1
- egse/icons/vacuum.svg +0 -1
- egse/icons/valid.png +0 -0
- egse/icons/zoom-to-pixel-dark.svg +0 -64
- egse/icons/zoom-to-pixel-white.svg +0 -36
- egse/images/big-rotation-stage.png +0 -0
- egse/images/connected-100.png +0 -0
- egse/images/cross.svg +0 -6
- egse/images/disconnected-100.png +0 -0
- egse/images/gui-icon.png +0 -0
- egse/images/home.svg +0 -6
- egse/images/info-icon.png +0 -0
- egse/images/led-black.svg +0 -89
- egse/images/led-green.svg +0 -85
- egse/images/led-orange.svg +0 -85
- egse/images/led-red.svg +0 -85
- egse/images/load-icon.png +0 -0
- egse/images/load-setup.png +0 -0
- egse/images/load.png +0 -0
- egse/images/pause.png +0 -0
- egse/images/play-button.svg +0 -8
- egse/images/play.png +0 -0
- egse/images/process-status.png +0 -0
- egse/images/restart.png +0 -0
- egse/images/search.png +0 -0
- egse/images/sma.png +0 -0
- egse/images/start.png +0 -0
- egse/images/stop-button.svg +0 -8
- egse/images/stop.png +0 -0
- egse/images/switch-off.svg +0 -48
- egse/images/switch-on.svg +0 -48
- egse/images/undo.png +0 -0
- egse/images/update-button.svg +0 -11
- egse/imageviewer/exposureselection.py +0 -475
- egse/imageviewer/imageviewer.py +0 -198
- egse/imageviewer/matchfocalplane.py +0 -179
- egse/imageviewer/subfieldposition.py +0 -133
- egse/lampcontrol/__init__.py +0 -4
- egse/lampcontrol/beaglebone/beaglebone.py +0 -178
- egse/lampcontrol/beaglebone/beaglebone.yaml +0 -62
- egse/lampcontrol/beaglebone/beaglebone_cs.py +0 -106
- egse/lampcontrol/beaglebone/beaglebone_devif.py +0 -150
- egse/lampcontrol/beaglebone/beaglebone_protocol.py +0 -73
- egse/lampcontrol/energetiq/__init__.py +0 -22
- egse/lampcontrol/energetiq/eq99.yaml +0 -98
- egse/lampcontrol/energetiq/lampEQ99.py +0 -283
- egse/lampcontrol/energetiq/lampEQ99_cs.py +0 -128
- egse/lampcontrol/energetiq/lampEQ99_devif.py +0 -158
- egse/lampcontrol/energetiq/lampEQ99_encode_decode_errors.py +0 -73
- egse/lampcontrol/energetiq/lampEQ99_protocol.py +0 -71
- egse/lampcontrol/energetiq/lampEQ99_ui.py +0 -465
- egse/lib/CentOS-7/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/CentOS-8/ESL-RMAP_v34_86.dylib +0 -0
- egse/lib/CentOS-8/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/Debian/ESL-RMAP_v34_86.dylib +0 -0
- egse/lib/Debian/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/Debian/libetherspacelink_v35_21.dylib +0 -0
- egse/lib/Linux/ESL-RMAP_v34_86.dylib +0 -0
- egse/lib/Linux/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/Ubuntu-20/ESL-RMAP_v34_86.dylib +0 -0
- egse/lib/Ubuntu-20/EtherSpaceLink_v34_86.dylib +0 -0
- egse/lib/gssw/python3-gssw_2.2.3+31f63c9f-1_all.deb +0 -0
- egse/lib/ximc/__pycache__/pyximc.cpython-38 2.pyc +0 -0
- egse/lib/ximc/__pycache__/pyximc.cpython-38.pyc +0 -0
- egse/lib/ximc/libximc.framework/Frameworks/libbindy.dylib +0 -0
- egse/lib/ximc/libximc.framework/Frameworks/libxiwrapper.dylib +0 -0
- egse/lib/ximc/libximc.framework/Headers/ximc.h +0 -5510
- egse/lib/ximc/libximc.framework/Resources/Info.plist +0 -42
- egse/lib/ximc/libximc.framework/Resources/keyfile.sqlite +0 -0
- egse/lib/ximc/libximc.framework/libbindy.so +0 -0
- egse/lib/ximc/libximc.framework/libximc +0 -0
- egse/lib/ximc/libximc.framework/libximc.so +0 -0
- egse/lib/ximc/libximc.framework/libximc.so.7.0.0 +0 -0
- egse/lib/ximc/libximc.framework/libxiwrapper.so +0 -0
- egse/lib/ximc/pyximc.py +0 -922
- egse/listener.py +0 -179
- egse/logger/__init__.py +0 -243
- egse/logger/log_cs.py +0 -321
- egse/metrics.py +0 -102
- egse/mixin.py +0 -464
- egse/monitoring.py +0 -95
- egse/ni/alarms/__init__.py +0 -26
- egse/ni/alarms/cdaq9375.py +0 -300
- egse/ni/alarms/cdaq9375.yaml +0 -89
- egse/ni/alarms/cdaq9375_cs.py +0 -130
- egse/ni/alarms/cdaq9375_devif.py +0 -183
- egse/ni/alarms/cdaq9375_protocol.py +0 -48
- egse/obs_inspection.py +0 -165
- egse/observer.py +0 -41
- egse/obsid.py +0 -163
- egse/powermeter/__init__.py +0 -0
- egse/powermeter/ni/__init__.py +0 -38
- egse/powermeter/ni/cdaq9184.py +0 -224
- egse/powermeter/ni/cdaq9184.yaml +0 -73
- egse/powermeter/ni/cdaq9184_cs.py +0 -130
- egse/powermeter/ni/cdaq9184_devif.py +0 -201
- egse/powermeter/ni/cdaq9184_protocol.py +0 -48
- egse/powermeter/ni/cdaq9184_ui.py +0 -544
- egse/powermeter/thorlabs/__init__.py +0 -25
- egse/powermeter/thorlabs/pm100a.py +0 -380
- egse/powermeter/thorlabs/pm100a.yaml +0 -132
- egse/powermeter/thorlabs/pm100a_cs.py +0 -136
- egse/powermeter/thorlabs/pm100a_devif.py +0 -127
- egse/powermeter/thorlabs/pm100a_protocol.py +0 -80
- egse/powermeter/thorlabs/pm100a_ui.py +0 -725
- egse/process.py +0 -451
- egse/procman/__init__.py +0 -834
- egse/procman/cannot_start_process_popup.py +0 -43
- egse/procman/procman.yaml +0 -49
- egse/procman/procman_cs.py +0 -201
- egse/procman/procman_ui.py +0 -2081
- egse/protocol.py +0 -605
- egse/proxy.py +0 -531
- egse/randomwalk.py +0 -140
- egse/reg.py +0 -585
- egse/reload.py +0 -122
- egse/reprocess.py +0 -693
- egse/resource.py +0 -333
- egse/rmap.py +0 -406
- egse/rst.py +0 -135
- egse/search.py +0 -182
- egse/serialdevice.py +0 -190
- egse/services.py +0 -247
- egse/services.yaml +0 -68
- egse/settings.py +0 -379
- egse/settings.yaml +0 -980
- egse/setup.py +0 -1181
- egse/shutter/__init__.py +0 -0
- egse/shutter/thorlabs/__init__.py +0 -19
- egse/shutter/thorlabs/ksc101.py +0 -205
- egse/shutter/thorlabs/ksc101.yaml +0 -105
- egse/shutter/thorlabs/ksc101_cs.py +0 -136
- egse/shutter/thorlabs/ksc101_devif.py +0 -201
- egse/shutter/thorlabs/ksc101_protocol.py +0 -71
- egse/shutter/thorlabs/ksc101_ui.py +0 -548
- egse/shutter/thorlabs/sc10.py +0 -82
- egse/shutter/thorlabs/sc10.yaml +0 -52
- egse/shutter/thorlabs/sc10_controller.py +0 -81
- egse/shutter/thorlabs/sc10_cs.py +0 -108
- egse/shutter/thorlabs/sc10_interface.py +0 -25
- egse/shutter/thorlabs/sc10_simulator.py +0 -30
- egse/simulator.py +0 -41
- egse/slack.py +0 -61
- egse/socketdevice.py +0 -218
- egse/sockets.py +0 -218
- egse/spw.py +0 -1401
- egse/stages/__init__.py +0 -12
- egse/stages/aerotech/ensemble.py +0 -245
- egse/stages/aerotech/ensemble.yaml +0 -205
- egse/stages/aerotech/ensemble_controller.py +0 -275
- egse/stages/aerotech/ensemble_cs.py +0 -110
- egse/stages/aerotech/ensemble_interface.py +0 -132
- egse/stages/aerotech/ensemble_parameters.py +0 -433
- egse/stages/aerotech/ensemble_simulator.py +0 -27
- egse/stages/aerotech/mgse_sim.py +0 -188
- egse/stages/arun/smd3.py +0 -110
- egse/stages/arun/smd3.yaml +0 -68
- egse/stages/arun/smd3_controller.py +0 -470
- egse/stages/arun/smd3_cs.py +0 -112
- egse/stages/arun/smd3_interface.py +0 -53
- egse/stages/arun/smd3_simulator.py +0 -27
- egse/stages/arun/smd3_stop.py +0 -16
- egse/stages/huber/__init__.py +0 -49
- egse/stages/huber/smc9300.py +0 -920
- egse/stages/huber/smc9300.yaml +0 -63
- egse/stages/huber/smc9300_cs.py +0 -178
- egse/stages/huber/smc9300_devif.py +0 -345
- egse/stages/huber/smc9300_protocol.py +0 -113
- egse/stages/huber/smc9300_sim.py +0 -547
- egse/stages/huber/smc9300_ui.py +0 -973
- egse/state.py +0 -173
- egse/statemachine.py +0 -274
- egse/storage/__init__.py +0 -1067
- egse/storage/persistence.py +0 -2295
- egse/storage/storage.yaml +0 -79
- egse/storage/storage_cs.py +0 -231
- egse/styles/dark.qss +0 -343
- egse/styles/default.qss +0 -48
- egse/synoptics/__init__.py +0 -417
- egse/synoptics/syn.yaml +0 -9
- egse/synoptics/syn_cs.py +0 -195
- egse/system.py +0 -1611
- egse/tcs/__init__.py +0 -14
- egse/tcs/tcs.py +0 -879
- egse/tcs/tcs.yaml +0 -14
- egse/tcs/tcs_cs.py +0 -202
- egse/tcs/tcs_devif.py +0 -292
- egse/tcs/tcs_protocol.py +0 -180
- egse/tcs/tcs_sim.py +0 -177
- egse/tcs/tcs_ui.py +0 -543
- egse/tdms.py +0 -171
- egse/tempcontrol/__init__.py +0 -23
- egse/tempcontrol/agilent/agilent34970.py +0 -109
- egse/tempcontrol/agilent/agilent34970.yaml +0 -44
- egse/tempcontrol/agilent/agilent34970_cs.py +0 -114
- egse/tempcontrol/agilent/agilent34970_devif.py +0 -182
- egse/tempcontrol/agilent/agilent34970_protocol.py +0 -96
- egse/tempcontrol/agilent/agilent34972.py +0 -111
- egse/tempcontrol/agilent/agilent34972.yaml +0 -44
- egse/tempcontrol/agilent/agilent34972_cs.py +0 -115
- egse/tempcontrol/agilent/agilent34972_devif.py +0 -189
- egse/tempcontrol/agilent/agilent34972_protocol.py +0 -98
- egse/tempcontrol/beaglebone/beaglebone.py +0 -341
- egse/tempcontrol/beaglebone/beaglebone.yaml +0 -110
- egse/tempcontrol/beaglebone/beaglebone_cs.py +0 -117
- egse/tempcontrol/beaglebone/beaglebone_protocol.py +0 -134
- egse/tempcontrol/beaglebone/beaglebone_ui.py +0 -674
- egse/tempcontrol/digalox/digalox.py +0 -115
- egse/tempcontrol/digalox/digalox.yaml +0 -36
- egse/tempcontrol/digalox/digalox_cs.py +0 -108
- egse/tempcontrol/digalox/digalox_protocol.py +0 -56
- egse/tempcontrol/keithley/__init__.py +0 -33
- egse/tempcontrol/keithley/daq6510.py +0 -662
- egse/tempcontrol/keithley/daq6510.yaml +0 -105
- egse/tempcontrol/keithley/daq6510_cs.py +0 -163
- egse/tempcontrol/keithley/daq6510_devif.py +0 -343
- egse/tempcontrol/keithley/daq6510_protocol.py +0 -79
- egse/tempcontrol/keithley/daq6510_sim.py +0 -186
- egse/tempcontrol/lakeshore/__init__.py +0 -33
- egse/tempcontrol/lakeshore/lsci.py +0 -361
- egse/tempcontrol/lakeshore/lsci.yaml +0 -162
- egse/tempcontrol/lakeshore/lsci_cs.py +0 -174
- egse/tempcontrol/lakeshore/lsci_devif.py +0 -292
- egse/tempcontrol/lakeshore/lsci_protocol.py +0 -76
- egse/tempcontrol/lakeshore/lsci_ui.py +0 -387
- egse/tempcontrol/ni/__init__.py +0 -0
- egse/tempcontrol/spid/spid.py +0 -109
- egse/tempcontrol/spid/spid.yaml +0 -81
- egse/tempcontrol/spid/spid_controller.py +0 -279
- egse/tempcontrol/spid/spid_cs.py +0 -136
- egse/tempcontrol/spid/spid_protocol.py +0 -107
- egse/tempcontrol/spid/spid_ui.py +0 -723
- egse/tempcontrol/srs/__init__.py +0 -22
- egse/tempcontrol/srs/ptc10.py +0 -867
- egse/tempcontrol/srs/ptc10.yaml +0 -227
- egse/tempcontrol/srs/ptc10_cs.py +0 -128
- egse/tempcontrol/srs/ptc10_devif.py +0 -116
- egse/tempcontrol/srs/ptc10_protocol.py +0 -39
- egse/tempcontrol/srs/ptc10_ui.py +0 -906
- egse/ups/apc/apc.py +0 -236
- egse/ups/apc/apc.yaml +0 -45
- egse/ups/apc/apc_cs.py +0 -101
- egse/ups/apc/apc_protocol.py +0 -125
- egse/user.yaml +0 -7
- egse/vacuum/beaglebone/beaglebone.py +0 -149
- egse/vacuum/beaglebone/beaglebone.yaml +0 -44
- egse/vacuum/beaglebone/beaglebone_cs.py +0 -108
- egse/vacuum/beaglebone/beaglebone_devif.py +0 -159
- egse/vacuum/beaglebone/beaglebone_protocol.py +0 -192
- egse/vacuum/beaglebone/beaglebone_ui.py +0 -638
- egse/vacuum/instrutech/igm402.py +0 -91
- egse/vacuum/instrutech/igm402.yaml +0 -90
- egse/vacuum/instrutech/igm402_controller.py +0 -124
- egse/vacuum/instrutech/igm402_cs.py +0 -108
- egse/vacuum/instrutech/igm402_interface.py +0 -49
- egse/vacuum/instrutech/igm402_simulator.py +0 -36
- egse/vacuum/keller/kellerBus.py +0 -256
- egse/vacuum/keller/leo3.py +0 -100
- egse/vacuum/keller/leo3.yaml +0 -38
- egse/vacuum/keller/leo3_controller.py +0 -81
- egse/vacuum/keller/leo3_cs.py +0 -101
- egse/vacuum/keller/leo3_interface.py +0 -33
- egse/vacuum/mks/evision.py +0 -86
- egse/vacuum/mks/evision.yaml +0 -75
- egse/vacuum/mks/evision_cs.py +0 -101
- egse/vacuum/mks/evision_devif.py +0 -313
- egse/vacuum/mks/evision_interface.py +0 -60
- egse/vacuum/mks/evision_simulator.py +0 -24
- egse/vacuum/mks/evision_ui.py +0 -701
- egse/vacuum/pfeiffer/acp40.py +0 -87
- egse/vacuum/pfeiffer/acp40.yaml +0 -60
- egse/vacuum/pfeiffer/acp40_controller.py +0 -117
- egse/vacuum/pfeiffer/acp40_cs.py +0 -109
- egse/vacuum/pfeiffer/acp40_interface.py +0 -40
- egse/vacuum/pfeiffer/acp40_simulator.py +0 -37
- egse/vacuum/pfeiffer/tc400.py +0 -87
- egse/vacuum/pfeiffer/tc400.yaml +0 -83
- egse/vacuum/pfeiffer/tc400_controller.py +0 -136
- egse/vacuum/pfeiffer/tc400_cs.py +0 -109
- egse/vacuum/pfeiffer/tc400_interface.py +0 -70
- egse/vacuum/pfeiffer/tc400_simulator.py +0 -35
- egse/vacuum/pfeiffer/tpg261.py +0 -80
- egse/vacuum/pfeiffer/tpg261.yaml +0 -66
- egse/vacuum/pfeiffer/tpg261_controller.py +0 -150
- egse/vacuum/pfeiffer/tpg261_cs.py +0 -109
- egse/vacuum/pfeiffer/tpg261_interface.py +0 -59
- egse/vacuum/pfeiffer/tpg261_simulator.py +0 -23
- egse/version.py +0 -174
- egse/visitedpositions.py +0 -398
- egse/windowing.py +0 -213
- egse/zmq/__init__.py +0 -28
- egse/zmq/spw.py +0 -160
- egse/zmq_ser.py +0 -41
- scripts/alerts/cold.yaml +0 -278
- scripts/alerts/example_alerts.yaml +0 -54
- scripts/alerts/transition.yaml +0 -14
- scripts/alerts/warm.yaml +0 -49
- scripts/analyse_n_fee_hk_data.py +0 -52
- scripts/check_hdf5_files.py +0 -192
- scripts/check_register_sync.py +0 -47
- scripts/check_tcs_calib_coef.py +0 -90
- scripts/correct_ccd_cold_temperature_cal.py +0 -157
- scripts/create_hdf5_report.py +0 -293
- scripts/csl_model.py +0 -420
- scripts/csl_restore_setup.py +0 -229
- scripts/export-grafana-dashboards.py +0 -49
- scripts/fdir/cs_recovery/fdir_cs_recovery.py +0 -54
- scripts/fdir/fdir_table.yaml +0 -70
- scripts/fdir/fdir_test_recovery.py +0 -10
- scripts/fdir/hw_recovery/fdir_agilent_hw_recovery.py +0 -73
- scripts/fdir/limit_recovery/fdir_agilent_limit.py +0 -61
- scripts/fdir/limit_recovery/fdir_bb_heater_limit.py +0 -59
- scripts/fdir/limit_recovery/fdir_ensemble_limit.py +0 -33
- scripts/fdir/limit_recovery/fdir_pressure_limit_recovery.py +0 -71
- scripts/fix_csv.py +0 -80
- scripts/ias/correct_ccd_temp_cal_elfique.py +0 -43
- scripts/ias/correct_ccd_temp_cal_floreffe.py +0 -43
- scripts/ias/correct_trp_swap_achel.py +0 -199
- scripts/inta/correct_ccd_temp_cal_duvel.py +0 -43
- scripts/inta/correct_ccd_temp_cal_gueuze.py +0 -43
- scripts/n_fee_supply_voltage_calculation.py +0 -92
- scripts/playground.py +0 -30
- scripts/print_hdf5_hk_data.py +0 -68
- scripts/print_register_map.py +0 -43
- scripts/remove_lines_between_matches.py +0 -188
- scripts/sron/commanding/control_heaters.py +0 -44
- scripts/sron/commanding/pumpdown.py +0 -46
- scripts/sron/commanding/set_pid_setpoint.py +0 -19
- scripts/sron/commanding/shutdown_bbb_heaters.py +0 -10
- scripts/sron/commanding/shutdown_pumps.py +0 -33
- scripts/sron/correct_mgse_coordinates_brigand_chimay.py +0 -272
- scripts/sron/correct_trp_swap_brigand.py +0 -204
- scripts/sron/gimbal_conversions.py +0 -75
- scripts/sron/tm_gen/tm_gen_agilent.py +0 -37
- scripts/sron/tm_gen/tm_gen_heaters.py +0 -4
- scripts/sron/tm_gen/tm_gen_spid.py +0 -13
- scripts/update_operational_cgse.py +0 -268
- scripts/update_operational_cgse_old.py +0 -273
egse/tempcontrol/srs/ptc10.py
DELETED
|
@@ -1,867 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
This module defines the basic classes to access the MaRi regulation ensured by
|
|
3
|
-
SRS PTC10 controller that will be used in the IAS TVAC setup.
|
|
4
|
-
"""
|
|
5
|
-
import logging
|
|
6
|
-
from datetime import datetime
|
|
7
|
-
from typing import List
|
|
8
|
-
|
|
9
|
-
from time import sleep, strftime, gmtime
|
|
10
|
-
|
|
11
|
-
from egse.decorators import dynamic_interface
|
|
12
|
-
from egse.device import DeviceInterface
|
|
13
|
-
from egse.mixin import add_lf
|
|
14
|
-
from egse.mixin import dynamic_command
|
|
15
|
-
from egse.proxy import Proxy
|
|
16
|
-
from egse.settings import Settings
|
|
17
|
-
from egse.setup import load_setup
|
|
18
|
-
from egse.system import format_datetime
|
|
19
|
-
from egse.tempcontrol.srs.ptc10_devif import ptc10Error
|
|
20
|
-
from egse.tempcontrol.srs.ptc10_devif import ptc10TelnetInterface
|
|
21
|
-
from egse.zmq_ser import connect_address
|
|
22
|
-
|
|
23
|
-
LOGGER = logging.getLogger(__name__)
|
|
24
|
-
|
|
25
|
-
CTRL_SETTINGS = Settings.load("SRS PTC10 Control Server")
|
|
26
|
-
PTC10_SETTINGS = Settings.load("SRS PTC10 Controller")
|
|
27
|
-
DEVICE_SETTINGS = Settings.load(filename="ptc10.yaml")
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
class ptc10Interface(DeviceInterface):
|
|
31
|
-
"""
|
|
32
|
-
Interface definition for the Temp regulation SRS PTC10 Controller, Simulator and Proxy..
|
|
33
|
-
"""
|
|
34
|
-
|
|
35
|
-
@dynamic_interface
|
|
36
|
-
def connect(self):
|
|
37
|
-
"""Connects to the Temp regulation device.
|
|
38
|
-
|
|
39
|
-
Raises:
|
|
40
|
-
DeviceNotFoundError: when the Temp regulation device is not connected.
|
|
41
|
-
"""
|
|
42
|
-
|
|
43
|
-
raise NotImplementedError
|
|
44
|
-
|
|
45
|
-
@dynamic_interface
|
|
46
|
-
def disconnect(self):
|
|
47
|
-
raise NotImplementedError
|
|
48
|
-
|
|
49
|
-
@dynamic_interface
|
|
50
|
-
def reconnect(self):
|
|
51
|
-
raise NotImplementedError
|
|
52
|
-
|
|
53
|
-
@dynamic_interface
|
|
54
|
-
def is_connected(self):
|
|
55
|
-
"""Check if the Temp Controller is connected."""
|
|
56
|
-
raise NotImplementedError
|
|
57
|
-
|
|
58
|
-
@dynamic_interface
|
|
59
|
-
def is_simulator(self):
|
|
60
|
-
raise NotImplementedError
|
|
61
|
-
|
|
62
|
-
@dynamic_interface
|
|
63
|
-
def info(self) -> str:
|
|
64
|
-
"""
|
|
65
|
-
Returns basic information about the device, its name, firmwre version etc.
|
|
66
|
-
Returns:
|
|
67
|
-
An identification string of the instrument.
|
|
68
|
-
"""
|
|
69
|
-
raise NotImplementedError
|
|
70
|
-
|
|
71
|
-
@dynamic_interface
|
|
72
|
-
def alarm_status(self) -> str:
|
|
73
|
-
"""
|
|
74
|
-
Returns the current value of the Alarm Status Register (ASR), and then clears the register.
|
|
75
|
-
"""
|
|
76
|
-
raise NotImplementedError
|
|
77
|
-
|
|
78
|
-
@dynamic_interface
|
|
79
|
-
def get_names(self):
|
|
80
|
-
"""
|
|
81
|
-
Returns a tuple of 2 lists with the names of inputs (3 sensors) in the first list and the names of
|
|
82
|
-
outputs (3 heaters) in the second list.
|
|
83
|
-
"""
|
|
84
|
-
raise NotImplementedError
|
|
85
|
-
|
|
86
|
-
@dynamic_interface
|
|
87
|
-
def set_name(self, old_name: str, new_name: str):
|
|
88
|
-
"""Modifies the name of the specified channel (input or output)."""
|
|
89
|
-
raise NotImplementedError
|
|
90
|
-
|
|
91
|
-
@dynamic_interface
|
|
92
|
-
def clear_error(self):
|
|
93
|
-
"""
|
|
94
|
-
Erases all error messages for the port over which the instruction was transmitted. Also clears all messages
|
|
95
|
-
from the System.Com. Errors window regardless of which port generated them.
|
|
96
|
-
"""
|
|
97
|
-
raise NotImplementedError
|
|
98
|
-
|
|
99
|
-
@dynamic_interface
|
|
100
|
-
def stop(self):
|
|
101
|
-
"""
|
|
102
|
-
kill.all stops all currently running macros with the given runtime name. The runtime name is assigned with the
|
|
103
|
-
"name" instruction and is not necessarily the same as the file name that a macro may be saved under.
|
|
104
|
-
The kill.all instruction stops all currently-running macros regardless of name or which port started the macro.
|
|
105
|
-
"""
|
|
106
|
-
raise NotImplementedError
|
|
107
|
-
|
|
108
|
-
@dynamic_interface
|
|
109
|
-
def standby(self):
|
|
110
|
-
"""
|
|
111
|
-
Puts the PTC10 into stby mode, in which the outputs are turned off, data acquisition is paused, macros are
|
|
112
|
-
paused, the front panel display and system fan are shut off, and the system does not respond to remote commands.
|
|
113
|
-
The PTC321's excitation currents remain on, and the chassis cooling fan may switch on occassionally.
|
|
114
|
-
Press the "Output Enable" key to exit standby mode. There is no remote command to leave stand by mode.
|
|
115
|
-
"""
|
|
116
|
-
raise NotImplementedError
|
|
117
|
-
|
|
118
|
-
@dynamic_command(
|
|
119
|
-
cmd_type="write",
|
|
120
|
-
cmd_string="*RST",
|
|
121
|
-
process_cmd_string=add_lf,
|
|
122
|
-
)
|
|
123
|
-
def reset(self):
|
|
124
|
-
"""
|
|
125
|
-
Resets the PTC10.
|
|
126
|
-
|
|
127
|
-
The *RST instruction is equivalent to turning the instrument off and back on again, except the Power On bit of
|
|
128
|
-
the Event Status Register is not set. *RST has the following effects:
|
|
129
|
-
- Outputs are disabled (as if the “Output enable” button were pressed).
|
|
130
|
-
- All currently-running macros are stopped, regardless of whether the macros were started by the GPIB interface,
|
|
131
|
-
another I/O port, or the Program screen.
|
|
132
|
-
- The instrument returns to the Select screen.
|
|
133
|
-
-Partially-received instructions on all I/O ports are cleared.
|
|
134
|
-
- All pending transmissions on all I/O ports are cancelled.
|
|
135
|
-
- The error queues for all I/O ports are cleared.
|
|
136
|
-
- The plot screen returns to showing the most recent data on autoscaled Y axes.
|
|
137
|
-
- The instrument automatically triggers at the rate set with the “A/D rate” control.
|
|
138
|
-
- Clears all locally-stored log data. Logs on USB devices are not affected. If data is not being logged to a
|
|
139
|
-
USB storage device, the Plot screen shows no accumulated data immediately after a *RST command.
|
|
140
|
-
"""
|
|
141
|
-
raise NotImplementedError
|
|
142
|
-
|
|
143
|
-
@dynamic_interface
|
|
144
|
-
def read_temperature(self):
|
|
145
|
-
"""
|
|
146
|
-
Reads the temperature from the 3 PT1000 corresponding to TRP2/TRP3/TRP4.
|
|
147
|
-
|
|
148
|
-
Notes: <channel>.value? returns the current value of the channel. Ex: 2A.value? queries the output of channel 2A
|
|
149
|
-
<channel>? also works
|
|
150
|
-
"""
|
|
151
|
-
|
|
152
|
-
raise NotImplementedError
|
|
153
|
-
|
|
154
|
-
@dynamic_interface
|
|
155
|
-
def read_heater(self):
|
|
156
|
-
"""
|
|
157
|
-
Reads the 3x heater outputs with the unit (W, A or V).
|
|
158
|
-
Returns a tuple. 1st element is a list with the 3 values of the heaters. 2nd element is a string with the unit
|
|
159
|
-
('W', 'A' or 'V').
|
|
160
|
-
"""
|
|
161
|
-
|
|
162
|
-
raise NotImplementedError
|
|
163
|
-
|
|
164
|
-
@dynamic_interface
|
|
165
|
-
def disable_heater(self, output_ch: int):
|
|
166
|
-
"""
|
|
167
|
-
Disables the specified heater output. output_ch = 1, 2, 3
|
|
168
|
-
|
|
169
|
-
Notes: <channel>.Off cancels any active autotuning process, turns PID feedback off, and sets the channel's
|
|
170
|
-
output to zero or the lower limit.
|
|
171
|
-
"""
|
|
172
|
-
|
|
173
|
-
raise NotImplementedError
|
|
174
|
-
|
|
175
|
-
@dynamic_interface
|
|
176
|
-
def outputs_enable(self):
|
|
177
|
-
"""Enables all outputs. Equivalent to press the red button twice on the front panel of the PTC10 when outputs disabled."""
|
|
178
|
-
raise NotImplementedError
|
|
179
|
-
|
|
180
|
-
@dynamic_interface
|
|
181
|
-
def outputs_disable(self):
|
|
182
|
-
"""Disables all outputs. Equivalent to press the red button on the front panel of the PTC10 when output enabled."""
|
|
183
|
-
raise NotImplementedError
|
|
184
|
-
|
|
185
|
-
@dynamic_interface
|
|
186
|
-
def disable_all(self):
|
|
187
|
-
"""Both disable_heater function used for all heaters AND outputs_disable."""
|
|
188
|
-
raise NotImplementedError
|
|
189
|
-
|
|
190
|
-
@dynamic_interface
|
|
191
|
-
def is_outputs_enable(self) -> bool:
|
|
192
|
-
"""
|
|
193
|
-
Returns a boolean corresponding to the state of the red button/light on the front panel of the PTC10.
|
|
194
|
-
True means outputs enabled (red light switch on)
|
|
195
|
-
False means outputs disabled (red light switch off)
|
|
196
|
-
"""
|
|
197
|
-
|
|
198
|
-
raise NotImplementedError
|
|
199
|
-
|
|
200
|
-
@dynamic_interface
|
|
201
|
-
def output_limit(self, output_ch: int, low: float, high: float):
|
|
202
|
-
"""
|
|
203
|
-
Sets the min and max output and can be used to prevent the PID loop for delivering excessive power to a
|
|
204
|
-
heater. The limits must be expressed in the same units that the output is expressed in. The limits must
|
|
205
|
-
normally be reset when the output units are changed, since the limits are not converted to the new units.
|
|
206
|
-
output_ch = 1, 2, 3
|
|
207
|
-
low = float >= 0
|
|
208
|
-
high = float > low
|
|
209
|
-
|
|
210
|
-
Notes:
|
|
211
|
-
by default the DC heater driver output is measured in watts. But can be changed to either A or V.
|
|
212
|
-
<channel>.Units{W, A, V}
|
|
213
|
-
"""
|
|
214
|
-
|
|
215
|
-
raise NotImplementedError
|
|
216
|
-
|
|
217
|
-
@dynamic_interface
|
|
218
|
-
def output_unit(self, unit: str):
|
|
219
|
-
"""
|
|
220
|
-
Sets the unit for the 3 heaters
|
|
221
|
-
unit = W, A, V, or in lowercase w, a, v
|
|
222
|
-
"""
|
|
223
|
-
|
|
224
|
-
raise NotImplementedError
|
|
225
|
-
|
|
226
|
-
@dynamic_interface
|
|
227
|
-
def set_heater_input(self, output_ch: int, input: str):
|
|
228
|
-
"""
|
|
229
|
-
Sets the sensor as input for the specified heater.
|
|
230
|
-
output_ch = 1, 2, 3
|
|
231
|
-
input = name of the sensor (e.g. TRP2)
|
|
232
|
-
"""
|
|
233
|
-
|
|
234
|
-
raise NotImplementedError
|
|
235
|
-
|
|
236
|
-
@dynamic_interface
|
|
237
|
-
def setpoint(self, output_ch: int, setpoint: float):
|
|
238
|
-
"""
|
|
239
|
-
Sets the temperature setpoint. The PID attemps to keep the input at this value by changing the output.
|
|
240
|
-
output_ch = 1, 2, 3
|
|
241
|
-
setpoint = float (°C)
|
|
242
|
-
|
|
243
|
-
Notes:
|
|
244
|
-
usage: <channel>.PID.Setpoint<setpoint>
|
|
245
|
-
"""
|
|
246
|
-
|
|
247
|
-
raise NotImplementedError
|
|
248
|
-
|
|
249
|
-
@dynamic_interface
|
|
250
|
-
def get_PID(self, output_ch: int) -> dict:
|
|
251
|
-
"""
|
|
252
|
-
Returns a dictionary with P, I and D parameters as float, {"P": P_value, "I": I_value, "D": D_value}
|
|
253
|
-
output_ch = 1, 2, 3
|
|
254
|
-
"""
|
|
255
|
-
|
|
256
|
-
raise NotImplementedError
|
|
257
|
-
|
|
258
|
-
@dynamic_interface
|
|
259
|
-
def set_PID(self, input_ch: int, output_ch: int, PID: List[float]):
|
|
260
|
-
"""
|
|
261
|
-
The input must be stable before either Step or Relay tuning is started. Furthermore, the output must be greater
|
|
262
|
-
than half the step height before starting relay tuning. The best time to start a step response is when the
|
|
263
|
-
system is first turned on at the beginning of the day, i.e the heater is cold and its temperature stable.
|
|
264
|
-
See User Manual for further details.
|
|
265
|
-
input_ch parameter sets the PID input channel which is the temperature that the PID feedback loop controls. intput_ch = 1, 2, 3
|
|
266
|
-
output_ch parameter sets the PID output channel. output_ch = 1, 2, 3
|
|
267
|
-
PID parameter sets the three coefficients respectively in P, I and D. PID = [float, float, float]
|
|
268
|
-
|
|
269
|
-
Notes
|
|
270
|
-
PID: <channel>.PID.D<value>, <channel>.PID.I<value>, <channel>.PID.P<value>
|
|
271
|
-
<channel>.PID.Input<channel name>
|
|
272
|
-
"""
|
|
273
|
-
|
|
274
|
-
raise NotImplementedError
|
|
275
|
-
|
|
276
|
-
@dynamic_interface
|
|
277
|
-
def autotune_PID(self, input_ch: int, output_ch: int):
|
|
278
|
-
"""
|
|
279
|
-
|
|
280
|
-
"""
|
|
281
|
-
|
|
282
|
-
raise NotImplementedError
|
|
283
|
-
|
|
284
|
-
@dynamic_interface
|
|
285
|
-
def set_auto(self, output_ch: int, setpoint: float):
|
|
286
|
-
"""
|
|
287
|
-
Enables the specified output to reach the specified setpoint automatically.
|
|
288
|
-
output_ch = 1, 2, 3
|
|
289
|
-
setpoint = float (°C)
|
|
290
|
-
"""
|
|
291
|
-
raise NotImplementedError
|
|
292
|
-
|
|
293
|
-
@dynamic_interface
|
|
294
|
-
def set_manual(self, output_ch: int, value: float):
|
|
295
|
-
"""
|
|
296
|
-
Enables the specified output manually with the specified value.
|
|
297
|
-
The unit is the one currently in effect (W, A or V).
|
|
298
|
-
output_ch = 1, 2, 3
|
|
299
|
-
value = float >= 0
|
|
300
|
-
"""
|
|
301
|
-
|
|
302
|
-
raise NotImplementedError
|
|
303
|
-
|
|
304
|
-
@dynamic_interface
|
|
305
|
-
def set_survival(self):
|
|
306
|
-
"""
|
|
307
|
-
Sets all outputs to the min Non op temperature for TRP2, TRP3 and TRP4 as given in the Setup YAML file.
|
|
308
|
-
We assume that P, I and D coefficients are already correctly set.
|
|
309
|
-
"""
|
|
310
|
-
|
|
311
|
-
raise NotImplementedError
|
|
312
|
-
|
|
313
|
-
@dynamic_interface
|
|
314
|
-
def set_stable(self, setpoint: float):
|
|
315
|
-
"""
|
|
316
|
-
Sets all outputs to the same temperature setpoint given as parameter.
|
|
317
|
-
We assume that P, I and D coefficients are already correctly set.
|
|
318
|
-
"""
|
|
319
|
-
|
|
320
|
-
raise NotImplementedError
|
|
321
|
-
|
|
322
|
-
@dynamic_interface
|
|
323
|
-
def set_custom(self, outputs_dict: dict):
|
|
324
|
-
"""
|
|
325
|
-
Sets the outputs given as parameter to the corresponding temperature given as parameter.
|
|
326
|
-
If an output channel is not given as parameter in the dictionary outputs_dict, this output channel will remain
|
|
327
|
-
at the same state and with same setpoint as before.
|
|
328
|
-
outputs_dict = {output_ch: setpoint} for example: {3: -110, 1: -106}
|
|
329
|
-
"""
|
|
330
|
-
|
|
331
|
-
raise NotImplementedError
|
|
332
|
-
|
|
333
|
-
@dynamic_interface
|
|
334
|
-
def heater_sensor_error(self) -> list:
|
|
335
|
-
"""
|
|
336
|
-
Returns a list with names of sensors (TRP) and heaters which cannot be read by the PTC10.
|
|
337
|
-
"""
|
|
338
|
-
|
|
339
|
-
raise NotImplementedError
|
|
340
|
-
|
|
341
|
-
@dynamic_interface
|
|
342
|
-
def disable_heater_error(self):
|
|
343
|
-
"""
|
|
344
|
-
Disables heaters whose PT1000 sensors are faulty.
|
|
345
|
-
This function does not re-enable heater if a PT1000 is no longer faulty.
|
|
346
|
-
"""
|
|
347
|
-
|
|
348
|
-
raise NotImplementedError
|
|
349
|
-
|
|
350
|
-
@dynamic_interface
|
|
351
|
-
def get_time(self) -> str:
|
|
352
|
-
"""
|
|
353
|
-
Returns PTC10 time as a string.
|
|
354
|
-
"""
|
|
355
|
-
|
|
356
|
-
raise NotImplementedError
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
@dynamic_interface
|
|
360
|
-
def update_time(self):
|
|
361
|
-
"""
|
|
362
|
-
Updates the PTC10 date and time in UTC from the server's time which is ntp synchronised.
|
|
363
|
-
"""
|
|
364
|
-
|
|
365
|
-
raise NotImplementedError
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
class ptc10Simulator(ptc10Interface):
|
|
369
|
-
"""
|
|
370
|
-
The ptc10 Simulator class.
|
|
371
|
-
"""
|
|
372
|
-
|
|
373
|
-
def __init__(self):
|
|
374
|
-
self._is_connected = True
|
|
375
|
-
self.temp_operation = False
|
|
376
|
-
|
|
377
|
-
def is_connected(self):
|
|
378
|
-
return self._is_connected
|
|
379
|
-
|
|
380
|
-
def is_simulator(self):
|
|
381
|
-
return True
|
|
382
|
-
|
|
383
|
-
def connect(self):
|
|
384
|
-
self._is_connected = True
|
|
385
|
-
|
|
386
|
-
def disconnect(self):
|
|
387
|
-
self._is_connected = False
|
|
388
|
-
|
|
389
|
-
def reconnect(self):
|
|
390
|
-
self.connect()
|
|
391
|
-
|
|
392
|
-
def info(self):
|
|
393
|
-
pass
|
|
394
|
-
|
|
395
|
-
def read_temperature(self):
|
|
396
|
-
pass
|
|
397
|
-
|
|
398
|
-
def read_heater(self):
|
|
399
|
-
pass
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
class ptc10Controller(ptc10Interface):
|
|
403
|
-
"""The ptc10Controller allows controlling a SRS ptc10 temperature regulation device."""
|
|
404
|
-
|
|
405
|
-
def __init__(self):
|
|
406
|
-
"""Initialize the ptc10 Controller interface."""
|
|
407
|
-
self.output_mode_var = None
|
|
408
|
-
self.setpoint_var = None
|
|
409
|
-
self.PID = None
|
|
410
|
-
self.limits = None
|
|
411
|
-
setup = load_setup()
|
|
412
|
-
self.T_min_NOP = setup.gse.PTC10.T_min_NOP # TRP2, TRP3 and TRP4 min NOP (°C)
|
|
413
|
-
|
|
414
|
-
super().__init__()
|
|
415
|
-
|
|
416
|
-
LOGGER.debug("Initializing PTC10")
|
|
417
|
-
|
|
418
|
-
try:
|
|
419
|
-
self.temp = ptc10TelnetInterface()
|
|
420
|
-
self.temp.connect(PTC10_SETTINGS.HOSTNAME)
|
|
421
|
-
except ptc10Error as exc:
|
|
422
|
-
LOGGER.warning(f"TempError caught: Couldn't establish connection ({exc})")
|
|
423
|
-
raise ptc10Error(
|
|
424
|
-
"Couldn't establish a connection with the Temp PTC10 controller."
|
|
425
|
-
) from exc
|
|
426
|
-
|
|
427
|
-
def connect(self):
|
|
428
|
-
"""Connects to the Temp regulation device.
|
|
429
|
-
|
|
430
|
-
Raises:
|
|
431
|
-
DeviceNotFoundError: when the Temp regulation device is not connected.
|
|
432
|
-
"""
|
|
433
|
-
try:
|
|
434
|
-
self.temp.connect(PTC10_SETTINGS.HOSTNAME)
|
|
435
|
-
except ptc10Error as exc:
|
|
436
|
-
LOGGER.warning(f"ptc10Error caught: Couldn't establish connection ({exc})")
|
|
437
|
-
raise ConnectionError("Couldn't establish a connection with the SRS PTC10 controller.") from exc
|
|
438
|
-
|
|
439
|
-
def disconnect(self):
|
|
440
|
-
try:
|
|
441
|
-
self.temp.disconnect()
|
|
442
|
-
except ptc10Error as exc:
|
|
443
|
-
raise ConnectionError("Couldn't establish a connection with the SRS PTC10 controller.") from exc
|
|
444
|
-
|
|
445
|
-
def reconnect(self):
|
|
446
|
-
if self.is_connected():
|
|
447
|
-
self.disconnect()
|
|
448
|
-
sleep(1)
|
|
449
|
-
self.connect()
|
|
450
|
-
|
|
451
|
-
def is_connected(self):
|
|
452
|
-
"""Check if the Temp Controller is connected."""
|
|
453
|
-
return self.temp.is_connected()
|
|
454
|
-
|
|
455
|
-
def is_simulator(self):
|
|
456
|
-
return False
|
|
457
|
-
|
|
458
|
-
def info(self):
|
|
459
|
-
"""
|
|
460
|
-
Returns basic information about the device, its name, firmwre version etc.
|
|
461
|
-
Returns:
|
|
462
|
-
An identification string of the instrument.
|
|
463
|
-
"""
|
|
464
|
-
|
|
465
|
-
self.temp.write("*IDN?")
|
|
466
|
-
_info = self.temp.read()
|
|
467
|
-
return _info
|
|
468
|
-
|
|
469
|
-
def alarm_status(self) -> str:
|
|
470
|
-
"""Returns the current value of the Alarm Status Register (ASR), and then clears the register."""
|
|
471
|
-
|
|
472
|
-
self.temp.write("*ASR?")
|
|
473
|
-
status = self.temp.read()
|
|
474
|
-
return status
|
|
475
|
-
|
|
476
|
-
def get_names(self):
|
|
477
|
-
"""
|
|
478
|
-
Returns a tuple of 2 lists with the names of inputs (4 sensors) in the first list and the names of
|
|
479
|
-
outputs (3 heaters) in the second list.
|
|
480
|
-
"""
|
|
481
|
-
|
|
482
|
-
self.temp.write("getOutput.names")
|
|
483
|
-
NAMES = self.temp.read().split(", ")
|
|
484
|
-
|
|
485
|
-
Sensors = NAMES[3:7]
|
|
486
|
-
|
|
487
|
-
Heaters = NAMES[:3]
|
|
488
|
-
|
|
489
|
-
return Sensors, Heaters
|
|
490
|
-
|
|
491
|
-
def set_name(self, old_name: str, new_name: str):
|
|
492
|
-
"""Modifies the name of the specified channel (input or output)."""
|
|
493
|
-
|
|
494
|
-
self.temp.write(f'({old_name}.Name) "{new_name}"')
|
|
495
|
-
|
|
496
|
-
def clear_error(self):
|
|
497
|
-
"""
|
|
498
|
-
Erases all error messages for the port over which the instruction was transmitted. Also clears all messages
|
|
499
|
-
from the System.Com. Errors window regardless of which port generated them.
|
|
500
|
-
"""
|
|
501
|
-
|
|
502
|
-
self.temp.write("clearerrors")
|
|
503
|
-
|
|
504
|
-
def stop(self):
|
|
505
|
-
"""
|
|
506
|
-
kill.all stops all currently running macros with the given runtime name. The runtime name is assigned with the
|
|
507
|
-
"name" instruction and is not necessarily the same as the file name that a macro may be saved under.
|
|
508
|
-
The kill.all instruction stops all currently-running macros regardless of name or which port started the macro.
|
|
509
|
-
"""
|
|
510
|
-
|
|
511
|
-
self.temp.write("kill.all")
|
|
512
|
-
|
|
513
|
-
def standby(self):
|
|
514
|
-
"""
|
|
515
|
-
Puts the PTC10 into stby mode, in which the outputs are turned off, data acquisition is paused, macros are
|
|
516
|
-
paused, the front panel display and system fan are shut off, and the system does not respond to remote commands.
|
|
517
|
-
The PTC321's excitation currents remain on, and the chassis cooling fan may switch on occassionally.
|
|
518
|
-
Press the "Output Enable" key to exit standby mode. There is no remote command to leave stand by mode.
|
|
519
|
-
"""
|
|
520
|
-
|
|
521
|
-
self.temp.write("standby")
|
|
522
|
-
|
|
523
|
-
def reset(self):
|
|
524
|
-
"""
|
|
525
|
-
Resets the PTC10.
|
|
526
|
-
|
|
527
|
-
The *RST instruction is equivalent to turning the instrument off and back on again, except the Power On bit of
|
|
528
|
-
the Event Status Register is not set. *RST has the following effects:
|
|
529
|
-
- Outputs are disabled (as if the “Output enable” button were pressed).
|
|
530
|
-
- All currently-running macros are stopped, regardless of whether the macros were started by the GPIB interface,
|
|
531
|
-
another I/O port, or the Program screen.
|
|
532
|
-
- The instrument returns to the Select screen.
|
|
533
|
-
-Partially-received instructions on all I/O ports are cleared.
|
|
534
|
-
- All pending transmissions on all I/O ports are cancelled.
|
|
535
|
-
- The error queues for all I/O ports are cleared.
|
|
536
|
-
- The plot screen returns to showing the most recent data on autoscaled Y axes.
|
|
537
|
-
- The instrument automatically triggers at the rate set with the “A/D rate” control.
|
|
538
|
-
- Clears all locally-stored log data. Logs on USB devices are not affected. If data is not being logged to a
|
|
539
|
-
USB storage device, the Plot screen shows no accumulated data immediately after a *RST command.
|
|
540
|
-
"""
|
|
541
|
-
|
|
542
|
-
self.temp.write("*RST")
|
|
543
|
-
|
|
544
|
-
def read_temperature(self) -> list:
|
|
545
|
-
"""Reads the temperature from the 3 PT1000 corresponding to TRP2/TRP3/TRP4."""
|
|
546
|
-
|
|
547
|
-
Sensor_names = self.get_names()[0]
|
|
548
|
-
Sensors_values = []
|
|
549
|
-
for channel_name in Sensor_names:
|
|
550
|
-
self.temp.write(f"({channel_name}?)")
|
|
551
|
-
Sensors_values.append(float(self.temp.read()))
|
|
552
|
-
return Sensors_values
|
|
553
|
-
|
|
554
|
-
def read_heater(self) -> tuple:
|
|
555
|
-
"""
|
|
556
|
-
Reads the 3x heater outputs with the unit (W, A or V).
|
|
557
|
-
Returns a tuple. 1st element is a list with the 3 values of the heaters. 2nd element is a string with the unit
|
|
558
|
-
('W', 'A' or 'V').
|
|
559
|
-
"""
|
|
560
|
-
|
|
561
|
-
Heater_names = self.get_names()[1]
|
|
562
|
-
Heaters_values = []
|
|
563
|
-
for channel_name in Heater_names:
|
|
564
|
-
self.temp.write(f"({channel_name}?)")
|
|
565
|
-
Heaters_values.append(float(self.temp.read()))
|
|
566
|
-
self.temp.write(f"({Heater_names[0]}.Units?)")
|
|
567
|
-
heater_unit = self.temp.read()
|
|
568
|
-
return Heaters_values, heater_unit
|
|
569
|
-
|
|
570
|
-
def disable_heater(self, output_ch: int):
|
|
571
|
-
"""
|
|
572
|
-
Disables the specified heater output. output_ch = 1, 2, 3
|
|
573
|
-
|
|
574
|
-
Notes: <channel>.Off cancels any active autotuning process, turns PID feedback off, and sets the channel's
|
|
575
|
-
output to zero or the lower limit.
|
|
576
|
-
"""
|
|
577
|
-
|
|
578
|
-
self.temp.write(f"({self.get_names()[1][output_ch - 1]}.Off)")
|
|
579
|
-
|
|
580
|
-
def outputs_enable(self):
|
|
581
|
-
"""Enables all outputs. Equivalent to press the red button twice on the front panel of the PTC10 when outputs disabled."""
|
|
582
|
-
|
|
583
|
-
self.temp.write("outputEnable = on")
|
|
584
|
-
|
|
585
|
-
def outputs_disable(self):
|
|
586
|
-
"""Disables all outputs. Equivalent to press the red button on the front panel of the PTC10 when output enabled."""
|
|
587
|
-
|
|
588
|
-
self.temp.write("outputEnable = off")
|
|
589
|
-
|
|
590
|
-
def disable_all(self):
|
|
591
|
-
"""Both disable_heater function used for all heaters AND outputs_disable."""
|
|
592
|
-
|
|
593
|
-
for output_ch in [1,2,3]:
|
|
594
|
-
self.disable_heater(output_ch)
|
|
595
|
-
self.outputs_disable()
|
|
596
|
-
|
|
597
|
-
def is_outputs_enable(self) -> bool:
|
|
598
|
-
"""
|
|
599
|
-
Returns a boolean corresponding to the state of the red button/light on the front panel of the PTC10.
|
|
600
|
-
True means outputs enabled (red light switch on)
|
|
601
|
-
False means outputs disabled (red light switch off)
|
|
602
|
-
"""
|
|
603
|
-
|
|
604
|
-
is_enable = {"On": True, "Off": False}
|
|
605
|
-
self.temp.write("outputEnable?")
|
|
606
|
-
return is_enable[self.temp.read()]
|
|
607
|
-
|
|
608
|
-
def output_limit(self, output_ch: int, low: float, high: float):
|
|
609
|
-
"""
|
|
610
|
-
Sets the min and max output and can be used to prevent the PID loop for delivering excessive power to a
|
|
611
|
-
heater. The limits must be expressed in the same units that the output is expressed in. The limits must
|
|
612
|
-
normally be reset when the output units are changed, since the limits are not converted to the new units.
|
|
613
|
-
output_ch = 1, 2, 3
|
|
614
|
-
low = float >= 0
|
|
615
|
-
high = float > low
|
|
616
|
-
|
|
617
|
-
Notes:
|
|
618
|
-
by default the DC heater driver output is measured in watts. But can be changed to either A or V.
|
|
619
|
-
<channel>.Units{W, A, V}
|
|
620
|
-
"""
|
|
621
|
-
|
|
622
|
-
heater = self.get_names()[1][output_ch - 1]
|
|
623
|
-
self.temp.write(f"({heater}.Low lmt) {low}")
|
|
624
|
-
self.temp.write(f"({heater}.Hi lmt) {high}")
|
|
625
|
-
|
|
626
|
-
def output_unit(self, unit: str):
|
|
627
|
-
"""
|
|
628
|
-
Sets the unit for the 3 heaters
|
|
629
|
-
unit = W, A, V, or in lowercase w, a, v
|
|
630
|
-
"""
|
|
631
|
-
|
|
632
|
-
unit = unit.upper()
|
|
633
|
-
for output_ch in [1, 2, 3]:
|
|
634
|
-
heater = self.get_names()[1][output_ch - 1]
|
|
635
|
-
self.temp.write(f'({heater}.Units) "{unit}"')
|
|
636
|
-
|
|
637
|
-
def set_heater_input(self, output_ch: int, input: str):
|
|
638
|
-
"""
|
|
639
|
-
Sets the sensor as input for the specified heater.
|
|
640
|
-
output_ch = 1, 2, 3
|
|
641
|
-
input = name of the sensor (e.g. TRP2)
|
|
642
|
-
"""
|
|
643
|
-
|
|
644
|
-
heater = self.get_names()[1][output_ch - 1]
|
|
645
|
-
self.temp.write(f'({heater}.PID.Input) "{input}"')
|
|
646
|
-
|
|
647
|
-
def setpoint(self, output_ch: int, setpoint: float):
|
|
648
|
-
"""
|
|
649
|
-
Sets the temperature setpoint. The PID attemps to keep the input at this value by changing the output.
|
|
650
|
-
output_ch = 1, 2, 3
|
|
651
|
-
setpoint = float (°C)
|
|
652
|
-
|
|
653
|
-
Notes:
|
|
654
|
-
usage: <channel>.PID.Setpoint<setpoint>
|
|
655
|
-
"""
|
|
656
|
-
|
|
657
|
-
heater = self.get_names()[1][output_ch - 1]
|
|
658
|
-
self.temp.write(f"({heater}.PID.Setpoint) {setpoint}")
|
|
659
|
-
|
|
660
|
-
def get_PID(self, output_ch: int) -> dict:
|
|
661
|
-
"""
|
|
662
|
-
Returns a dictionary with P, I and D parameters as float, {"P": P_value, "I": I_value, "D": D_value}
|
|
663
|
-
output_ch = 1, 2, 3
|
|
664
|
-
"""
|
|
665
|
-
heater = self.get_names()[1][output_ch - 1]
|
|
666
|
-
|
|
667
|
-
self.temp.write(f"({heater}.PID.P?)")
|
|
668
|
-
P = float(self.temp.read())
|
|
669
|
-
self.temp.write(f"({heater}.PID.I?)")
|
|
670
|
-
I = float(self.temp.read())
|
|
671
|
-
self.temp.write(f"({heater}.PID.D?)")
|
|
672
|
-
D = float(self.temp.read())
|
|
673
|
-
|
|
674
|
-
return {"P": P, "I": I, "D": D}
|
|
675
|
-
|
|
676
|
-
def set_PID(self, input_ch: int, output_ch: int, PID: List[float]):
|
|
677
|
-
"""
|
|
678
|
-
The input must be stable before either Step or Relay tuning is started. Furthermore, the output must be greater
|
|
679
|
-
than half the step height before starting relay tuning. The best time to start a step response is when the
|
|
680
|
-
system is first turned on at the beginning of the day, i.e the heater is cold and its temperature stable.
|
|
681
|
-
See User Manual for further details.
|
|
682
|
-
input_ch parameter sets the PID input channel which is the temperature that the PID feedback loop controls. intput_ch = 1, 2, 3
|
|
683
|
-
output_ch parameter sets the PID output channel. output_ch = 1, 2, 3
|
|
684
|
-
PID parameter sets the three coefficients respectively in P, I and D. PID = [float, float, float]
|
|
685
|
-
|
|
686
|
-
Notes
|
|
687
|
-
PID: <channel>.PID.D<value>, <channel>.PID.I<value>, <channel>.PID.P<value>
|
|
688
|
-
<channel>.PID.Input<channel name>
|
|
689
|
-
"""
|
|
690
|
-
|
|
691
|
-
sensor = self.get_names()[0][input_ch - 1]
|
|
692
|
-
heater = self.get_names()[1][output_ch - 1]
|
|
693
|
-
|
|
694
|
-
self.temp.write(f'({heater}.PID.Input) "{sensor}"')
|
|
695
|
-
PID_dict = {"P": PID[0], "I": PID[1], "D": PID[2]}
|
|
696
|
-
for corrector in PID_dict:
|
|
697
|
-
self.temp.write(f"({heater}.PID.{corrector}) {PID_dict[corrector]}")
|
|
698
|
-
|
|
699
|
-
def autotune_PID(self, input_ch: int, output_ch: int):
|
|
700
|
-
"""
|
|
701
|
-
Configures the PID with autotune.
|
|
702
|
-
User Manual p.50 "If the system has never been tuned, start with the feedback turned off and the heater at ambient temperature.
|
|
703
|
-
If the system has been tuned before, it’s better to wait for the temperature to stabilize at the setpoint.
|
|
704
|
-
In either case, the key to successful autotuning is to start with a stable temperature."
|
|
705
|
-
Prints message if failure to autotune PID. Old values for P, I and D are retained.
|
|
706
|
-
input_ch parameter sets the PID input channel which is the temperature that the PID feedback loop controls. intput_ch = 1, 2, 3
|
|
707
|
-
output_ch parameter sets the PID output channel. output_ch = 1, 2, 3
|
|
708
|
-
"""
|
|
709
|
-
|
|
710
|
-
sensor = self.get_names()[0][input_ch - 1]
|
|
711
|
-
heater = self.get_names()[1][output_ch - 1]
|
|
712
|
-
output_enable_state = self.is_outputs_enable()
|
|
713
|
-
self.temp.write(f"({heater}.PID.Mode?)")
|
|
714
|
-
PID_mode = self.temp.read()
|
|
715
|
-
self.temp.write(f"({heater}.Value?)")
|
|
716
|
-
heater_initial_value = self.temp.read()
|
|
717
|
-
|
|
718
|
-
PID_initial = self.get_PID(output_ch)
|
|
719
|
-
|
|
720
|
-
self.temp.write(f"({heater}.PID.Mode) off")
|
|
721
|
-
self.temp.write(f'({heater}.PID.Input) "{sensor}"')
|
|
722
|
-
if not output_enable_state:
|
|
723
|
-
self.temp.write("outputEnable = on")
|
|
724
|
-
self.temp.write(f"({heater}.Tune.Mode) Auto")
|
|
725
|
-
|
|
726
|
-
self.temp.write(f"({heater}.Tune.mode?)")
|
|
727
|
-
Tune_mode = self.temp.read()
|
|
728
|
-
while Tune_mode != "Off":
|
|
729
|
-
self.temp.write(f"({heater}.Tune.mode?)")
|
|
730
|
-
Tune_mode = self.temp.read()
|
|
731
|
-
self.temp.write(f"({heater}.PID.Mode) {PID_mode}")
|
|
732
|
-
if PID_mode == "Off":
|
|
733
|
-
self.temp.write(f"({heater}.Value) {heater_initial_value}")
|
|
734
|
-
if not output_enable_state:
|
|
735
|
-
self.temp.write("outputEnable = off")
|
|
736
|
-
|
|
737
|
-
#TODO: investigate to find a better way to know if autotune was successful or not (maybe with status function?)
|
|
738
|
-
PID_final = self.get_PID(output_ch)
|
|
739
|
-
if PID_initial == PID_final:
|
|
740
|
-
print(f"Failure to autotune PID. Old values for P, I and D are retained.\nP = {PID_final['P']}\nI = {PID_final['I']}\nD = {PID_final['D']}\n"
|
|
741
|
-
"The key to successful autotuning is to start with a stable temperature.")
|
|
742
|
-
else:
|
|
743
|
-
print(f"Successful PID autotuning!!\nP = {PID_final['P']}\nI = {PID_final['I']}\nD = {PID_final['D']}")
|
|
744
|
-
|
|
745
|
-
def set_auto(self, output_ch: int, setpoint: float):
|
|
746
|
-
"""
|
|
747
|
-
Enables the specified output to reach the specified setpoint automatically.
|
|
748
|
-
output_ch = 1, 2, 3
|
|
749
|
-
setpoint = float (°C)
|
|
750
|
-
"""
|
|
751
|
-
|
|
752
|
-
heater = self.get_names()[1][output_ch - 1]
|
|
753
|
-
self.temp.write(f"({heater}.PID.Setpoint) {setpoint}")
|
|
754
|
-
self.temp.write(f"({heater}.PID.mode) on")
|
|
755
|
-
|
|
756
|
-
if not self.is_outputs_enable():
|
|
757
|
-
self.temp.write("outputEnable = on")
|
|
758
|
-
|
|
759
|
-
def set_manual(self, output_ch: int, value: float):
|
|
760
|
-
"""
|
|
761
|
-
Enables the specified output manually with the specified value.
|
|
762
|
-
The unit is the one currently in effect (W, A or V).
|
|
763
|
-
output_ch = 1, 2, 3
|
|
764
|
-
value = float >= 0
|
|
765
|
-
"""
|
|
766
|
-
|
|
767
|
-
heater = self.get_names()[1][output_ch - 1]
|
|
768
|
-
output_enable_state = self.is_outputs_enable()
|
|
769
|
-
if not output_enable_state:
|
|
770
|
-
self.temp.write("outputEnable = on")
|
|
771
|
-
|
|
772
|
-
self.temp.write(f"({heater}.PID.mode) off")
|
|
773
|
-
self.temp.write(f"({heater}.Value) {value}")
|
|
774
|
-
response = self.temp.read()
|
|
775
|
-
if response != "":
|
|
776
|
-
print(f"{response}. The old value is retained.")
|
|
777
|
-
if not output_enable_state:
|
|
778
|
-
self.temp.write("outputEnable = off")
|
|
779
|
-
|
|
780
|
-
def set_survival(self):
|
|
781
|
-
"""
|
|
782
|
-
Sets all outputs to the min Non op temperature for TRP2, TRP3 and TRP4 as given in the Setup YAML file.
|
|
783
|
-
We assume that P, I and D coefficients are already correctly set.
|
|
784
|
-
"""
|
|
785
|
-
|
|
786
|
-
for output_ch in [1,2,3]:
|
|
787
|
-
self.set_auto(output_ch, self.T_min_NOP)
|
|
788
|
-
|
|
789
|
-
def set_stable(self, setpoint: float):
|
|
790
|
-
"""
|
|
791
|
-
Sets all outputs to the same temperature setpoint given as parameter.
|
|
792
|
-
We assume that P, I and D coefficients are already correctly set.
|
|
793
|
-
"""
|
|
794
|
-
|
|
795
|
-
for output_ch in [1, 2, 3]:
|
|
796
|
-
self.set_auto(output_ch, setpoint)
|
|
797
|
-
|
|
798
|
-
def set_custom(self, outputs_dict: dict):
|
|
799
|
-
"""
|
|
800
|
-
Sets the outputs given as parameter to the corresponding temperature given as parameter.
|
|
801
|
-
If an output channel is not given as parameter in the dictionary outputs_dict, this output channel will remain
|
|
802
|
-
at the same state and with same setpoint as before.
|
|
803
|
-
outputs_dict = {output_ch: setpoint} for example: {3: -110, 1: -106}
|
|
804
|
-
"""
|
|
805
|
-
|
|
806
|
-
channels = [1,2,3]
|
|
807
|
-
for output_ch in channels:
|
|
808
|
-
if output_ch in outputs_dict:
|
|
809
|
-
self.set_auto(output_ch, outputs_dict[output_ch])
|
|
810
|
-
|
|
811
|
-
def heater_sensor_error(self) -> list:
|
|
812
|
-
"""
|
|
813
|
-
Returns a list with names of sensors (TRP) and heaters which cannot be read by the PTC10.
|
|
814
|
-
"""
|
|
815
|
-
|
|
816
|
-
INPUTS_OUTPUTS = self.read_temperature() + self.read_heater()[0]
|
|
817
|
-
NAMES = self.get_names()
|
|
818
|
-
NAMES = NAMES[0] + NAMES[1]
|
|
819
|
-
ERROR = []
|
|
820
|
-
for i in range(len(INPUTS_OUTPUTS)):
|
|
821
|
-
in_out = INPUTS_OUTPUTS[i]
|
|
822
|
-
if in_out != in_out: # This line tests if in_out is NaN
|
|
823
|
-
ERROR.append(NAMES[i])
|
|
824
|
-
return ERROR
|
|
825
|
-
|
|
826
|
-
def disable_heater_error(self):
|
|
827
|
-
"""
|
|
828
|
-
Disables heaters whose PT1000 sensors are faulty.
|
|
829
|
-
This function does not re-enable heater if a PT1000 is no longer faulty.
|
|
830
|
-
"""
|
|
831
|
-
|
|
832
|
-
list_error = self.heater_sensor_error()
|
|
833
|
-
sensor_names = self.get_names()[0]
|
|
834
|
-
for i in sensor_names:
|
|
835
|
-
if i in list_error[:4]:
|
|
836
|
-
self.disable_heater(sensor_names.index(i) + 1)
|
|
837
|
-
|
|
838
|
-
def update_time(self):
|
|
839
|
-
"""Updates the PTC10 date and time in UTC from the server's time which is ntp synchronised."""
|
|
840
|
-
self.temp.write("systemtime.dmy " + strftime("%d/%m/%Y", gmtime()))
|
|
841
|
-
self.temp.write("systemtime.hms " + strftime("%H:%M:%S", gmtime()))
|
|
842
|
-
|
|
843
|
-
def get_time(self) -> str:
|
|
844
|
-
smhdmy = self.temp.trans("Systemtime.smh?")
|
|
845
|
-
timestamp = format_datetime(datetime.strptime(smhdmy + " +0000", '%S %M %H %d %m %Y %z'))
|
|
846
|
-
return timestamp
|
|
847
|
-
|
|
848
|
-
class ptc10Proxy(Proxy, ptc10Interface):
|
|
849
|
-
"""The ptc10Proxy class is used to connect to the control server and send commands to
|
|
850
|
-
the SRS PTC10 device remotely."""
|
|
851
|
-
def __init__(
|
|
852
|
-
self,
|
|
853
|
-
protocol=CTRL_SETTINGS.PROTOCOL,
|
|
854
|
-
hostname=CTRL_SETTINGS.HOSTNAME,
|
|
855
|
-
port=CTRL_SETTINGS.COMMANDING_PORT,
|
|
856
|
-
timeout=CTRL_SETTINGS.TIMEOUT * 1000 # timeout in ms
|
|
857
|
-
):
|
|
858
|
-
"""
|
|
859
|
-
Args:
|
|
860
|
-
protocol: the transport protocol [default is taken from settings file]
|
|
861
|
-
hostname: location of the control server (IP address)
|
|
862
|
-
[default is taken from settings file]
|
|
863
|
-
port: TCP port on which the control server is listening for commands
|
|
864
|
-
[default is taken from settings file]
|
|
865
|
-
"""
|
|
866
|
-
super().__init__(connect_address(protocol, hostname, port))
|
|
867
|
-
|