tuscan 0.0.1 → 0.0.2
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.
- 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: []
|