Permalink
Browse files

modified: assemblies/assembly006/assembly006.tcl

	modified:   assemblies/assembly006/measure.tcl
	modified:   assemblies/assembly006/tester.tcl
	modified:   assemblies/assembly006/utils.tcl
	modified:   measure/chart.tcl
  • Loading branch information...
1 parent 35facfc commit ac4368ad3b1151675d10fbd4f73ac57815d48653 @andrey-nakin committed Apr 24, 2012
View
4 assemblies/assembly006/assembly006.tcl
@@ -202,9 +202,9 @@ proc setTemperature { lst } {
set runtime(error) [format "%0.2f \u00b1 %0.2f" $state(error) $state(measureError)]
}
-proc addPointToChart { t r } {
+proc addPointToChart { t r { series "result" } } {
global chartCanvas
- measure::chart::${chartCanvas}::addPoint $t $r
+ measure::chart::${chartCanvas}::addPoint $t $r $series
}
###############################################################################
View
44 assemblies/assembly006/measure.tcl
@@ -21,6 +21,13 @@ package require measure::tsclient
package require scpi
###############################################################################
+# Константы
+###############################################################################
+
+# макс. время ожидания благоприятного момента для старта измерения, мс
+set MAX_WAIT_TIME 3000
+
+###############################################################################
# Подпрограммы
###############################################################################
@@ -40,12 +47,12 @@ proc doMeasure { } {
set newTimeout [expr int(10000 * $n)]
# запускаем измерение напряжения
- scpi::cmd $mm "INIT"
+ scpi::cmd $mm "SAMPLE:COUNT $n;:INIT"
fconfigure $mm -timeout $newTimeout
if { [info exists cmm] } {
# запускаем измерение тока
- scpi::cmd $cmm "INIT"
+ scpi::cmd $cmm "SAMPLE:COUNT $n;:INIT"
fconfigure $cmm -timeout $newTimeout
}
@@ -143,7 +150,6 @@ proc setupMM {} {
# Настраиваем мультиметр для измерения постоянного напряжения
hardware::agilent::mm34410a::configureDcVoltage \
-nplc $settings(mm.nplc) \
- -sampleCount $settings(measure.numOfSamples) \
-scpiVersion $hardware::agilent::mm34410a::SCPI_VERSION \
-text2 "V1 VOLTAGE" \
$mm
@@ -175,7 +181,6 @@ proc setupCMM {} {
# Настраиваем мультиметр для измерения постоянного тока
hardware::agilent::mm34410a::configureDcCurrent \
-nplc $settings(cmm.nplc) \
- -sampleCount $settings(measure.numOfSamples) \
-scpiVersion $hardware::agilent::mm34410a::SCPI_VERSION \
-text2 "V2 CURRENT" \
$cmm
@@ -185,7 +190,6 @@ proc setupCMM {} {
# Настраиваем мультиметр для измерения постоянного напряжения
hardware::agilent::mm34410a::configureDcVoltage \
-nplc $settings(cmm.nplc) \
- -sampleCount $settings(measure.numOfSamples) \
-scpiVersion $hardware::agilent::mm34410a::SCPI_VERSION \
-text2 "V2 VOLTAGE" \
$cmm
@@ -243,7 +247,7 @@ proc makeMeasurement { } {
lappend rs $r; lappend srs $sr
# Выводим результаты в окно программы
- display $v $sv $c $sc $r $sr
+ display $v $sv $c $sc $r $sr $T "result"
# Выводим результаты в результирующий файл
measure::datafile::write $settings(result.fileName) $settings(result.format) [list TIMESTAMP $T $dT $c $sc $v $sv $r $sr]
@@ -254,9 +258,11 @@ proc makeMeasurement { } {
set v [math::statistics::mean $vs]; set sv [math::statistics::mean $svs]
set r [math::statistics::mean $rs]; set sr [math::statistics::mean $srs]
- # добавляем точку на график
- measure::interop::cmd [list addPointToChart $T $r]
-
+ # переводим мультиметры в режим одиночных измерений
+ scpi::cmd $mm "SAMPLE:COUNT 1"
+ if { [info exists cmm] } {
+ scpi::cmd $cmm "SAMPLE:COUNT 1"
+ }
}
# Отправляем команду термостату
@@ -269,7 +275,7 @@ proc setPoint { t } {
}
# Процедура вычисляет продолжительность измерения сопротивления в мс,
-# включая все нужные переполюсовки.
+# включая все нужные переполюсовки и паузы между ними.
proc calcMeasureTime {} {
global settings
@@ -283,12 +289,13 @@ proc calcMeasureTime {} {
return [expr 2.0 * $tm + $d]
}
- return $tm
+ return [expr $tm + 100]
}
# Процедура определяет, вышли ли мы на нужные температурные условия
+# и готовы ли к измерению сопротивления
proc canMeasure { stateArray setPoint } {
- global settings connectors
+ global settings connectors MAX_WAIT_TIME
upvar $stateArray state
# скорость измерения температуры, К/мс
@@ -310,9 +317,12 @@ proc canMeasure { stateArray setPoint } {
# можно измерять!
# вычислим задержку в мс для получения минимального отклонения температуры от уставки
set delay [expr int($err / $tspeed - 0.5 * $tm) - ([clock milliseconds] - $state(timestamp))]
- if { $delay > 0 } {
+ if { $delay > $MAX_WAIT_TIME } {
+ # нет, слишком долго ждать, отложим измерения до следующего раза
+ set flag 0
+ } elseif { $delay > 0 } {
# выдержим паузу перед началом измерений
- measure::interop::sleep [::tcl::mathfunc::min $delay 5000]
+ measure::interop::sleep $delay
}
}
@@ -415,8 +425,12 @@ foreach t [measure::ranges::toList [measure::config::get ts.program ""]] {
break
}
+ # Производим тестовое измерение сопротивления
+ set tm [clock milliseconds]
+ testMeasureAndDisplay
+
# Ждём или 1 сек или пока не изменится переменная doSkipSetPoint
- after 1000 set doSkipSetPoint timeout
+ after [expr int(1000 - ([clock milliseconds] - $tm))] set doSkipSetPoint timeout
vwait doSkipSetPoint
after cancel set doSkipSetPoint timeout
}
View
53 assemblies/assembly006/tester.tcl
@@ -20,51 +20,6 @@ package require measure::tsclient
# Подпрограммы
###############################################################################
-# Измеряет ток и напряжение на образце
-# Возвращает напряжение, погрешность в милливольтах, ток и погрешность в миллиамперах, сопротивление и погрешность в омах
-proc doMeasure { } {
- global mm cmm settings
-
- # измеряем напряжение на образце
- set v [expr abs([scpi::query $mm "READ?"])]
- # инструментальная погрешность
- set vErr [hardware::agilent::mm34410a::dcvSystematicError $v "" [measure::config::get mm.nplc]]
-
- # измеряем силу тока
- switch -exact -- $settings(current.method) {
- 0 {
- # измеряем непосредственно ток
- set c [expr abs([scpi::query $cmm "READ?"])]
- # инструментальная погрешность
- set cErr [hardware::agilent::mm34410a::dciSystematicError $c "" [measure::config::get cmm.nplc]]
- }
- 1 {
- # измеряем падение напряжения на эталоне
- set vv [expr abs([scpi::query $cmm "READ?"])]
- set rr [measure::config::get current.reference.resistance 1.0]
- set c [expr $vv / $rr]
- # инструментальная погрешность
- set vvErr [hardware::agilent::mm34410a::dcvSystematicError $vv "" [measure::config::get cmm.nplc]]
- set rrErr [measure::config::get current.reference.error 0.0]
- set cErr [measure::sigma::div $vv $vvErr $rr $rrErr]
- }
- 2 {
- # ток измеряется вручную
- set c [expr 0.001 * [measure::config::get current.manual.current 1.0]]
- # инструментальная погрешность задаётся вручную
- set cErr [expr 0.001 * [measure::config::get current.manual.error 0.0]]
- }
- }
-
- # вычисляем сопротивление
- set r [expr abs($v / $c)]
- # определяем инструментальную погрешность
- set rErr [measure::sigma::div $v $vErr $c $cErr]
-
- # возвращаем результат измерений, переведённый в милливольты и милливольты
- return [list [expr 1000.0 * $v] [expr 1000.0 * $vErr] [expr 1000.0 * $c] [expr 1000.0 * $cErr] $r $rErr]
-}
-
# Инициализация вольтметра
proc setupMM {} {
global mm settings
@@ -146,11 +101,11 @@ proc run {} {
while { ![measure::interop::isTerminated] } {
set tm [clock milliseconds]
- # Снимаем показания
- lassign [doMeasure] v sv c sc r sr
+ # Измеряем сопротивление и выводим результаты в окно программы
+ testMeasureAndDisplay
- # Выводим результаты в окно программы
- display $v $sv $c $sc $r $sr
+ # Считываем значение температуры выводим её на экран
+ measure::interop::cmd [list setTemperature [measure::tsclient::state]]
# Выдерживаем паузу
measure::interop::sleep [expr int(500 - ([clock milliseconds] - $tm))]
View
62 assemblies/assembly006/utils.tcl
@@ -90,7 +90,7 @@ proc finish {} {
after 1000
}
-proc display { v sv c sc r sr } {
+proc display { v sv c sc r sr { T "" } { series "result" } } {
set cf [format "%0.9g \u00b1 %0.2g" $c $sc]
set vf [format "%0.9g \u00b1 %0.2g" $v $sv]
set rf [format "%0.9g \u00b1 %0.2g" $r $sr]
@@ -105,7 +105,65 @@ proc display { v sv c sc r sr } {
measure::interop::setVar runtime(voltage) $vf
measure::interop::setVar runtime(resistance) $rf
measure::interop::setVar runtime(power) $pf
- measure::interop::cmd "addValueToChart $r"
+ if { $T != "" } {
+ measure::interop::cmd [list addPointToChart $T $r $series]
+ }
}
}
+# Процедура тестового измерения сопротивления
+# Измеряет ток и напряжение на образце
+# Возвращает напряжение, погрешность в милливольтах, ток и погрешность в миллиамперах, сопротивление и погрешность в омах
+proc testMeasure { } {
+ global mm cmm settings
+
+ # измеряем напряжение на образце
+ set v [expr abs([scpi::query $mm "READ?"])]
+ # инструментальная погрешность
+ set vErr [hardware::agilent::mm34410a::dcvSystematicError $v "" [measure::config::get mm.nplc]]
+
+ # измеряем силу тока
+ switch -exact -- $settings(current.method) {
+ 0 {
+ # измеряем непосредственно ток
+ set c [expr abs([scpi::query $cmm "READ?"])]
+ # инструментальная погрешность
+ set cErr [hardware::agilent::mm34410a::dciSystematicError $c "" [measure::config::get cmm.nplc]]
+ }
+ 1 {
+ # измеряем падение напряжения на эталоне
+ set vv [expr abs([scpi::query $cmm "READ?"])]
+ set rr [measure::config::get current.reference.resistance 1.0]
+ set c [expr $vv / $rr]
+ # инструментальная погрешность
+ set vvErr [hardware::agilent::mm34410a::dcvSystematicError $vv "" [measure::config::get cmm.nplc]]
+ set rrErr [measure::config::get current.reference.error 0.0]
+ set cErr [measure::sigma::div $vv $vvErr $rr $rrErr]
+ }
+ 2 {
+ # ток измеряется вручную
+ set c [expr 0.001 * [measure::config::get current.manual.current 1.0]]
+ # инструментальная погрешность задаётся вручную
+ set cErr [expr 0.001 * [measure::config::get current.manual.error 0.0]]
+ }
+ }
+
+ # вычисляем сопротивление
+ set r [expr abs($v / $c)]
+ # определяем инструментальную погрешность
+ set rErr [measure::sigma::div $v $vErr $c $cErr]
+
+ # возвращаем результат измерений, переведённый в милливольты и милливольты
+ return [list [expr 1000.0 * $v] [expr 1000.0 * $vErr] [expr 1000.0 * $c] [expr 1000.0 * $cErr] $r $rErr]
+}
+
+# Процедура производит тестовое измерение сопротивления,
+# и выводит результаты в окне
+proc testMeasureAndDisplay {} {
+ # Снимаем показания
+ lassign [testMeasure] v sv c sc r sr
+
+ # Выводим результаты в окно программы
+ display $v $sv $c $sc $r $sr
+}
+
View
2 measure/chart.tcl
@@ -190,7 +190,7 @@ proc measure::chart::staticChart { args } {
set yValues [list]
}
- proc ::measure::chart::${canvas}::addPoint { x y } {
+ proc ::measure::chart::${canvas}::addPoint { x y { series "series1" } } {
variable xValues
variable yValues
variable options

0 comments on commit ac4368a

Please sign in to comment.