tuscan 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/tuscan/iec60584.rb +10 -2
- data/lib/tuscan/iec60751.rb +26 -16
- data/lib/tuscan/version.rb +1 -1
- data/spec/tuscan/iec60584_spec.rb +62 -63
- data/tuscan.gemspec +13 -10
- metadata +17 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ad738c50ed39a35ff52fcef068d2b6aa9b59a549
|
4
|
+
data.tar.gz: 05d787b303178093ae55ce8fe0e92622f9faa79c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0eed9648923f011a331c3652b08f3e634d99c4ebcde32c13a535121d27f1fc43389f942aa4ea85220c5836ace14404a7d82d6e963f05a3b97f6e6c2e01bdcc8b
|
7
|
+
data.tar.gz: de21fa4fd6d4af6822410735b6840f2ded1dce8a2b8e1e4f07a9158ca71888d3ee7ee76e54772d07159fbf76cb99d4a1bcd9f200db4c84ee02556a817149a364
|
data/lib/tuscan/iec60584.rb
CHANGED
@@ -10,12 +10,20 @@ module Tuscan
|
|
10
10
|
result += a[0] * exp(a[1] * (t90 - a[2])**2)
|
11
11
|
end
|
12
12
|
|
13
|
-
def t90r emf, type,
|
14
|
-
|
13
|
+
def t90r emf, type, err: 1e-3, num: 100
|
14
|
+
guess = t90r_guess emf, type
|
15
|
+
Rical.inverse_for f: method(:emfr), fargs: type,
|
16
|
+
x0: guess - 0.5, x1: guess + 0.5,
|
17
|
+
y: emf, method: :secant,
|
18
|
+
num: num, err: err * 1e-3
|
15
19
|
end
|
16
20
|
|
17
21
|
|
18
22
|
private
|
23
|
+
def t90r_guess emf, type
|
24
|
+
t90_coeffs(emf, type).each_with_index.map{ |d,i| d*emf**i }.reduce(:+)
|
25
|
+
end
|
26
|
+
|
19
27
|
def emf_c_coeffs t90, type
|
20
28
|
case type
|
21
29
|
when :b then emf_c_coeffs_b t90
|
data/lib/tuscan/iec60751.rb
CHANGED
@@ -1,8 +1,15 @@
|
|
1
|
+
require 'rical'
|
2
|
+
|
1
3
|
module Tuscan
|
2
4
|
module Iec60751
|
5
|
+
R0 = 100.0
|
6
|
+
A = 3.9083e-03
|
7
|
+
B = -5.7750e-07
|
8
|
+
C = -4.1830e-12
|
9
|
+
|
3
10
|
extend self
|
4
11
|
|
5
|
-
def r t90, r0:
|
12
|
+
def r t90, r0: R0, a: A, b: B, c: C
|
6
13
|
t90 >= 0 ?
|
7
14
|
r0*(1 + a*t90 + b*t90**2) :
|
8
15
|
r0*(1 + a*t90 + b*t90**2 - 100*c*t90**3 + c*t90**4)
|
@@ -10,26 +17,29 @@ module Tuscan
|
|
10
17
|
alias_method :res, :r
|
11
18
|
alias_method :resistance, :r
|
12
19
|
|
13
|
-
def t90 r, r0:
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
end
|
23
|
-
|
20
|
+
def t90 r, r0: R0, a: A, b: B, c: C, num: 10, err: 1e-4
|
21
|
+
if r >= r0
|
22
|
+
(-a + (a**2 - 4 * b * (1 - r / r0))**(0.5)) / (2 * b)
|
23
|
+
else
|
24
|
+
args = { r0: r0, a: a, b: b, c: c }
|
25
|
+
Rical.inverse_for f: method(:r), fargs: args,
|
26
|
+
df: method(:dr), dfargs: args,
|
27
|
+
x0: t90_guess(r, args), y: r,
|
28
|
+
method: :n, num: num, err: err
|
29
|
+
end.to_f
|
30
|
+
rescue RangeError
|
31
|
+
Float::NAN
|
24
32
|
end
|
25
33
|
alias_method :t, :t90
|
26
34
|
alias_method :temperature, :t90
|
27
35
|
|
28
36
|
private
|
29
|
-
def
|
30
|
-
r
|
31
|
-
|
32
|
-
|
37
|
+
def t90_guess r, r0:, a:, b:, c:
|
38
|
+
((r / r0) - 1) / (a + 100 * b) # valid for r < r0
|
39
|
+
end
|
40
|
+
|
41
|
+
def dr t90, r0:, a:, b:, c:
|
42
|
+
r0 * (a + 2*b*t90 - 300*c*t90**2 + 4*c*t90**3) # valid for t90 < 0
|
33
43
|
end
|
34
44
|
end
|
35
45
|
end
|
data/lib/tuscan/version.rb
CHANGED
@@ -2,89 +2,88 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
#
|
4
4
|
# TODO:
|
5
|
-
# 1.
|
6
|
-
# 2.
|
7
|
-
# 3. implement deviation function (polynomial)
|
5
|
+
# 1. implement deviation function (polynomial)
|
6
|
+
# 2. check B, 0 mV t90 computation (errorin inverse coeffs?)
|
8
7
|
#
|
9
8
|
module Tuscan
|
10
9
|
describe Iec60584 do
|
11
10
|
context 'reference functions' do
|
12
11
|
examples = {
|
13
12
|
b: [
|
14
|
-
# { emf: 0.
|
15
|
-
{ emf: 0.
|
16
|
-
{ emf: 1.
|
17
|
-
{ emf: 1.
|
18
|
-
{ emf: 5.
|
19
|
-
{ emf: 13.
|
13
|
+
# { emf: 0.000000, t90: 0.0 },
|
14
|
+
{ emf: 0.291279, t90: 250.0 },
|
15
|
+
{ emf: 1.974546, t90: 630.0 },
|
16
|
+
{ emf: 1.980771, t90: 631.0 },
|
17
|
+
{ emf: 5.779517, t90:1100.0 },
|
18
|
+
{ emf: 13.820279, t90:1820.0 }
|
20
19
|
],
|
21
20
|
c: [
|
22
|
-
{ emf:
|
23
|
-
{ emf: 1.
|
24
|
-
{ emf: 11.
|
25
|
-
{ emf: 20.
|
26
|
-
{ emf: 29.
|
27
|
-
{ emf: 37.
|
21
|
+
{ emf: -0.000311, t90: 0.0 },
|
22
|
+
{ emf: 1.450711, t90: 100.0 },
|
23
|
+
{ emf: 11.778492, t90: 660.0 },
|
24
|
+
{ emf: 20.066070, t90:1100.0 },
|
25
|
+
{ emf: 29.402461, t90:1680.0 },
|
26
|
+
{ emf: 37.106593, t90:2320.0 }
|
28
27
|
],
|
29
28
|
e: [
|
30
|
-
|
31
|
-
{ emf: -8.
|
32
|
-
{ emf: -5.
|
33
|
-
{ emf: 0.
|
34
|
-
{ emf: 6.
|
35
|
-
{ emf: 49.
|
36
|
-
{ emf: 76.
|
29
|
+
{ emf: -9.834951, t90:-270.0 },
|
30
|
+
{ emf: -8.824581, t90:-200.0 },
|
31
|
+
{ emf: -5.237184, t90:-100.0 },
|
32
|
+
{ emf: 0.000000, t90: 0.0 },
|
33
|
+
{ emf: 6.318930, t90: 100.0 },
|
34
|
+
{ emf: 49.917224, t90: 660.0 },
|
35
|
+
{ emf: 76.372826, t90:1000.0 }
|
37
36
|
],
|
38
37
|
j: [
|
39
|
-
{ emf: -8.
|
40
|
-
{ emf: -4.
|
41
|
-
{ emf: 0.
|
42
|
-
{ emf: 36.
|
43
|
-
{ emf: 43.
|
44
|
-
{ emf: 69.
|
38
|
+
{ emf: -8.095380, t90:-210.0 },
|
39
|
+
{ emf: -4.632524, t90:-100.0 },
|
40
|
+
{ emf: 0.000000, t90: 0.0 },
|
41
|
+
{ emf: 36.675405, t90: 660.0 },
|
42
|
+
{ emf: 43.559497, t90: 770.0 },
|
43
|
+
{ emf: 69.553180, t90:1200.0 }
|
45
44
|
],
|
46
45
|
k: [
|
47
|
-
|
48
|
-
{ emf: -5.
|
49
|
-
{ emf: -3.
|
50
|
-
{ emf: 0.
|
51
|
-
{ emf: 5.
|
52
|
-
{ emf: 27.
|
53
|
-
{ emf: 54.
|
46
|
+
{ emf: -6.457738, t90:-270.0 },
|
47
|
+
{ emf: -5.891404, t90:-200.0 },
|
48
|
+
{ emf: -3.553631, t90:-100.0 },
|
49
|
+
{ emf: 0.000000, t90: 0.0 },
|
50
|
+
{ emf: 5.206093, t90: 127.0 },
|
51
|
+
{ emf: 27.447068, t90: 660.0 },
|
52
|
+
{ emf: 54.886364, t90:1372.0 }
|
54
53
|
],
|
55
54
|
n: [
|
56
|
-
|
57
|
-
{ emf: -3.
|
58
|
-
{ emf: -2.
|
59
|
-
{ emf: 0.
|
60
|
-
{ emf: 2.
|
61
|
-
{ emf: 22.
|
62
|
-
{ emf: 47.
|
55
|
+
{ emf: -4.3451354, t90:-270.0 },
|
56
|
+
{ emf: -3.990376, t90:-200.0 },
|
57
|
+
{ emf: -2.406811, t90:-100.0 },
|
58
|
+
{ emf: 0.000000, t90: 0.0 },
|
59
|
+
{ emf: 2.774124, t90: 100.0 },
|
60
|
+
{ emf: 22.957828, t90: 660.0 },
|
61
|
+
{ emf: 47.512772, t90:1300.0 }
|
63
62
|
],
|
64
63
|
r: [
|
65
|
-
|
66
|
-
{ emf: -0.
|
67
|
-
{ emf: 0.
|
68
|
-
{ emf: 6.
|
69
|
-
{ emf: 11.
|
70
|
-
{ emf: 21.
|
64
|
+
{ emf: -0.226465, t90: -50.0 },
|
65
|
+
{ emf: -0.123155, t90: -25.0 },
|
66
|
+
{ emf: 0.000000, t90: 0.0 },
|
67
|
+
{ emf: 6.273327, t90: 660.0 },
|
68
|
+
{ emf: 11.849642, t90:1100.0 },
|
69
|
+
{ emf: 21.101477, t90:1768.0 }
|
71
70
|
],
|
72
71
|
s: [
|
73
|
-
{ emf: -0.
|
74
|
-
{ emf: -0.
|
75
|
-
{ emf: 0.
|
76
|
-
{ emf: 5.
|
77
|
-
{ emf: 10.
|
78
|
-
{ emf: 18.
|
72
|
+
{ emf: -0.235555, t90: -50.0 },
|
73
|
+
{ emf: -0.126831, t90: -25.0 },
|
74
|
+
{ emf: 0.000000, t90: 0.0 },
|
75
|
+
{ emf: 5.856769, t90: 660.0 },
|
76
|
+
{ emf: 10.756545, t90:1100.0 },
|
77
|
+
{ emf: 18.692510, t90:1768.0 }
|
79
78
|
],
|
80
79
|
t: [
|
81
|
-
|
82
|
-
{ emf: -5.
|
83
|
-
{ emf: -3.
|
84
|
-
{ emf: 0.
|
85
|
-
{ emf: 4.
|
86
|
-
{ emf: 9.
|
87
|
-
{ emf: 20.
|
80
|
+
{ emf: -6.257505, t90:-270.0 },
|
81
|
+
{ emf: -5.602961, t90:-200.0 },
|
82
|
+
{ emf: -3.378582, t90:-100.0 },
|
83
|
+
{ emf: 0.000000, t90: 0.0 },
|
84
|
+
{ emf: 4.278519, t90: 100.0 },
|
85
|
+
{ emf: 9.288102, t90: 200.0 },
|
86
|
+
{ emf: 20.871970, t90: 400.0 }
|
88
87
|
]
|
89
88
|
}
|
90
89
|
|
@@ -93,7 +92,7 @@ module Tuscan
|
|
93
92
|
context "on a type #{type.upcase} thermocouple" do
|
94
93
|
examples[type].each do |example|
|
95
94
|
it "yields #{example[:emf]} mV when t90 equals #{example[:t90]} ºC" do
|
96
|
-
expect(Iec60584.emfr(example[:t90], type)).to be_within(1e-
|
95
|
+
expect(Iec60584.emfr(example[:t90], type)).to be_within(1e-6).of(example[:emf])
|
97
96
|
end
|
98
97
|
end
|
99
98
|
end
|
@@ -105,7 +104,7 @@ module Tuscan
|
|
105
104
|
context "on a type #{type.upcase} thermocouple" do
|
106
105
|
examples[type].each do |example|
|
107
106
|
it "yields #{example[:t90]} ºC when emf equals #{example[:emf]} mV" do
|
108
|
-
expect(Iec60584.t90r(example[:emf], type)).to be_within(
|
107
|
+
expect(Iec60584.t90r(example[:emf], type)).to be_within(1e-3).of(example[:t90])
|
109
108
|
end
|
110
109
|
end
|
111
110
|
end
|
data/tuscan.gemspec
CHANGED
@@ -4,22 +4,25 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
require 'tuscan/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
7
|
+
spec.name = 'tuscan'
|
8
8
|
spec.version = Tuscan::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
9
|
+
spec.authors = ['Luis Bacelar']
|
10
|
+
spec.email = ['lmbacelar@gmail.com']
|
11
11
|
spec.summary = %q{Converts to and from temperature for standard (S)PRT's and thermocouples}
|
12
|
-
spec.description =
|
13
|
-
|
14
|
-
|
12
|
+
spec.description = <<-DESC
|
13
|
+
Converts from from temperature sensor's electrical signal to temperature and vice-versa.
|
14
|
+
Allowable sensors: ITS-90 compliant SPRT's, IEC 60751 compliant PRT's and IEC 60584 compliant thermocouples.
|
15
|
+
DESC
|
16
|
+
spec.homepage = ''
|
17
|
+
spec.license = 'MIT'
|
15
18
|
|
16
19
|
spec.files = `git ls-files -z`.split("\x0")
|
17
20
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
21
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
-
spec.require_paths = [
|
22
|
+
spec.require_paths = ['lib']
|
23
|
+
spec.add_development_dependency 'rical', '~> 1.2'
|
20
24
|
|
21
|
-
spec.add_development_dependency
|
22
|
-
spec.add_development_dependency
|
25
|
+
spec.add_development_dependency 'bundler', '~> 1.7'
|
26
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
23
27
|
spec.add_development_dependency 'rspec'
|
24
|
-
spec.add_development_dependency 'byebug'
|
25
28
|
end
|
metadata
CHANGED
@@ -1,59 +1,59 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tuscan
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Luis Bacelar
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-01-
|
11
|
+
date: 2015-01-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: rical
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '1.
|
19
|
+
version: '1.2'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '1.
|
26
|
+
version: '1.2'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '1.7'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '1.7'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
47
|
+
version: '10.0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
54
|
+
version: '10.0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: rspec
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - ">="
|
@@ -66,8 +66,9 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
-
description:
|
70
|
-
|
69
|
+
description: |
|
70
|
+
Converts from from temperature sensor's electrical signal to temperature and vice-versa.
|
71
|
+
Allowable sensors: ITS-90 compliant SPRT's, IEC 60751 compliant PRT's and IEC 60584 compliant thermocouples.
|
71
72
|
email:
|
72
73
|
- lmbacelar@gmail.com
|
73
74
|
executables: []
|