phaserunner 0.1.0 → 0.1.1
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/phaserunner/main.rb +27 -18
- data/lib/phaserunner/modbus.rb +22 -8
- data/lib/phaserunner/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b1dcf2ac4e83fe77fc1eb60f4992253de50c9ace
|
4
|
+
data.tar.gz: 91728742cf1a696bc2570ee28d0dde63b9f9e1da
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ca1bdc6f822340a8a0033411951b4fdcb7b3e1c5469749e671ac5461f97576936ec2c7667708eaa861c30e363586332205ac54995545e1f1a96b91c5152cf41d
|
7
|
+
data.tar.gz: fc303b29ccee47bd3e1504925ced6935215f21b7d780106b7e2844b05e2acab4f088a93d01dbeb13f0c037b7e58585de8cffce571decff9ef424ca0ee648d08f
|
data/lib/phaserunner/main.rb
CHANGED
@@ -3,17 +3,23 @@ require 'json'
|
|
3
3
|
require 'pp'
|
4
4
|
|
5
5
|
module Phaserunner
|
6
|
+
# Handle Ctl-C exit
|
7
|
+
trap "SIGINT" do
|
8
|
+
puts "Exiting"
|
9
|
+
exit 130
|
10
|
+
end
|
6
11
|
|
7
12
|
class Cli
|
8
13
|
attr_reader :modbus
|
9
14
|
attr_reader :dict
|
10
15
|
attr_reader :loop
|
16
|
+
attr_reader :quiet
|
11
17
|
attr_reader :phaserunnerOutFd
|
12
18
|
|
13
19
|
include GLI::App
|
14
20
|
|
15
21
|
def main
|
16
|
-
program_desc 'Read values from the Grin PhaseRunner Controller for logging'
|
22
|
+
program_desc 'Read values from the Grin PhaseRunner Controller primarily for logging'
|
17
23
|
|
18
24
|
version Phaserunner::VERSION
|
19
25
|
|
@@ -42,10 +48,12 @@ module Phaserunner
|
|
42
48
|
flag [:d, :dictionary_file]
|
43
49
|
|
44
50
|
desc 'Loop the command n times'
|
45
|
-
default_value
|
51
|
+
default_value :forever
|
46
52
|
arg 'loop', :optional
|
47
|
-
flag [:l, :loop]
|
48
|
-
|
53
|
+
flag [:l, :loop]
|
54
|
+
|
55
|
+
desc 'Do not output to stdout'
|
56
|
+
switch [:q, :quiet]
|
49
57
|
|
50
58
|
desc 'Read a single or multiple adjacent registers from and address'
|
51
59
|
arg_name 'register_address'
|
@@ -59,33 +67,28 @@ module Phaserunner
|
|
59
67
|
address = args[0].to_i
|
60
68
|
count = args[1].to_i
|
61
69
|
node = dict[address]
|
62
|
-
puts modbus.range_address_header(address, count).join(",")
|
70
|
+
puts modbus.range_address_header(address, count).join(",") unless quiet
|
63
71
|
(0..loop).each do |i|
|
64
|
-
puts modbus.read_raw_range(address, count).join(",")
|
72
|
+
puts modbus.read_raw_range(address, count).join(",") unless quiet
|
65
73
|
end
|
66
74
|
end
|
67
75
|
end
|
68
76
|
|
69
|
-
desc 'Logs
|
77
|
+
desc 'Logs interesting Phaserunner registers to stdout and file'
|
70
78
|
long_desc %q(Logs interesting Phaserunner registers to stdout and a CSV file. File name in the form: phaserunner.#{Time.now.strftime('%Y-%m-%d_%H-%M-%S')}.csv)
|
71
79
|
command :log do |log|
|
72
|
-
log.desc 'Do not output to stdout'
|
73
|
-
log.switch [:q, :quiet]
|
74
80
|
log.action do |global_options, options, args|
|
75
|
-
|
76
|
-
|
77
|
-
count = 12
|
78
|
-
misc_addresses =[277,334]
|
79
|
-
header = modbus.bulk_log_header(start_address, count, misc_addresses)
|
80
|
-
data = modbus.bulk_log_data(start_address, count, misc_addresses)
|
81
|
+
header = modbus.bulk_log_header
|
82
|
+
data = modbus.bulk_log_data
|
81
83
|
|
84
|
+
# Generate and output header line
|
82
85
|
hdr = %Q(Timestamp,#{header.join(",")})
|
83
|
-
puts hdr
|
86
|
+
puts hdr unless quiet
|
84
87
|
phaserunnerOutFd.puts hdr
|
85
88
|
|
86
89
|
(0..loop).each do |i|
|
87
90
|
str = %Q(#{Time.now.utc.round(10).iso8601(6)},#{data.join(",")})
|
88
|
-
puts str
|
91
|
+
puts str unless quiet
|
89
92
|
phaserunnerOutFd.puts str
|
90
93
|
sleep 0.2
|
91
94
|
end
|
@@ -100,7 +103,13 @@ module Phaserunner
|
|
100
103
|
# on that command only
|
101
104
|
@modbus = Modbus.new(global)
|
102
105
|
@dict = @modbus.dict
|
103
|
-
|
106
|
+
# Handle that loop can be :forever or an Integer
|
107
|
+
if global[:loop] == :forever
|
108
|
+
@loop = Float::INFINITY
|
109
|
+
else
|
110
|
+
@loop = global[:loop].to_i
|
111
|
+
end
|
112
|
+
@quiet = global[:quiet]
|
104
113
|
@phaserunnerOutFd = File.open("phaserunner.#{Time.now.strftime('%Y-%m-%d_%H-%M-%S')}.csv", 'w')
|
105
114
|
end
|
106
115
|
|
data/lib/phaserunner/modbus.rb
CHANGED
@@ -5,6 +5,13 @@ require 'asi_bod'
|
|
5
5
|
module Phaserunner
|
6
6
|
# Methods for communicating with the Modbus interface to the Phaserunner
|
7
7
|
class Modbus
|
8
|
+
# The registers of interest for logging
|
9
|
+
# First a range
|
10
|
+
REGISTERS_START_ADDRESS = 258
|
11
|
+
REGISTERS_COUNT = 12
|
12
|
+
# Sparse Registers of interest
|
13
|
+
REGISTERS_MISC =[277,334]
|
14
|
+
|
8
15
|
# Contains the Grin Phaesrunner Modbus Dictionary
|
9
16
|
# @params [Hash<Integer, Hash>] dict The Dictionary with a key for each register address
|
10
17
|
# @option dict [String] :name Name of the register
|
@@ -18,6 +25,10 @@ module Phaserunner
|
|
18
25
|
# @option dict [Stirng] :type Further info on how to interpret the value
|
19
26
|
attr_reader :dict
|
20
27
|
|
28
|
+
attr_reader :registers_start_address
|
29
|
+
attr_reader :registers_count
|
30
|
+
attr_reader :registers_misc
|
31
|
+
|
21
32
|
# Returns the path to the default BODm.json file
|
22
33
|
def self.default_file_path
|
23
34
|
AsiBod::Bod.default_file_path
|
@@ -36,6 +47,9 @@ module Phaserunner
|
|
36
47
|
opts.each_pair do |name, value|
|
37
48
|
self.class.send(:attr_accessor, name)
|
38
49
|
instance_variable_set("@#{name}", value)
|
50
|
+
@registers_start_address = REGISTERS_START_ADDRESS
|
51
|
+
@registers_count = REGISTERS_COUNT
|
52
|
+
@registers_misc = REGISTERS_MISC
|
39
53
|
end
|
40
54
|
|
41
55
|
@bod = AsiBod::Bod.new(bod_file: dictionary_file)
|
@@ -70,20 +84,20 @@ module Phaserunner
|
|
70
84
|
end
|
71
85
|
|
72
86
|
# More optimized data fetch. Gets an address range + misc individual addresses
|
73
|
-
# @param start_address [Integer] Initial address of the range
|
74
|
-
# @param count [Integer] Count of addresses in range
|
75
|
-
# @param misc_addresses [Array<Integer>] List of misc individual addresses
|
87
|
+
# @param start_address [Integer] Initial address of the range. Optional, has a default
|
88
|
+
# @param count [Integer] Count of addresses in range. Optional, has a default
|
89
|
+
# @param misc_addresses [Array<Integer>] List of misc individual addresses. Optional, has a default
|
76
90
|
# @return [Array<Integer>] List of the register values in the order requested
|
77
|
-
def bulk_log_data(start_address, count, misc_addresses)
|
91
|
+
def bulk_log_data(start_address=registers_start_address, count=registers_count, misc_addresses=registers_misc)
|
78
92
|
read_raw_range(start_address, count) + read_addresses(misc_addresses)
|
79
93
|
end
|
80
94
|
|
81
95
|
# Get the headers for the bulk_log data
|
82
|
-
# @param start_address [Integer] Initial address of the range
|
83
|
-
# @param count [Integer] Count of addresses in range
|
84
|
-
# @param misc_addresses [Array<Integer>] List of misc individual addresses
|
96
|
+
# @param start_address [Integer] Initial address of the range. Optional, has a default
|
97
|
+
# @param count [Integer] Count of addresses in range. Optional, has a default
|
98
|
+
# @param misc_addresses [Array<Integer>] List of misc individual addresses. Optional, has a default
|
85
99
|
# @return [Array<String>] Array of the headers
|
86
|
-
def bulk_log_header(start_address, count, misc_addresses)
|
100
|
+
def bulk_log_header(start_address=registers_start_address, count=registers_count, misc_addresses=registers_misc)
|
87
101
|
range_address_header(start_address, count) +
|
88
102
|
bulk_addresses_header(misc_addresses)
|
89
103
|
end
|
data/lib/phaserunner/version.rb
CHANGED