Skip to content

Instantly share code, notes, and snippets.

@pwood
Created June 26, 2012 13:56
Show Gist options
  • Save pwood/2995925 to your computer and use it in GitHub Desktop.
Save pwood/2995925 to your computer and use it in GitHub Desktop.
Home Modbus
# Set up the serial
require 'rubygems'
require 'rmodbus'
# Start Modbus server
srv = ModBus::RTUViaTCPServer.new(10002,1, {:host => "0.0.0.0"})
srv.start
# Data
data = [ 0 ] * 15
srv.holding_registers = data
# Set up serial interface
mstr = ModBus::RTUClient.new("/dev/ttyS0", 9600)
slave = mstr.with_slave(1)
# Loop
while (true) do
# Time Loop
time_start = Time.now.to_f
# Volts
data[0..1] = slave.holding_registers[769..770]
# Amps
data[2..3] = slave.holding_registers[781..782]
# kWh Energy
data[4..5] = slave.holding_registers[805..806]
# Power Factor
data[6] = slave.holding_registers[0x33d][0]
# Power Factor Sector
data[7] = slave.holding_registers[0x33f][0]
# Hz
data[8] = slave.holding_registers[0x339][0]
# Active Power - Watts
data[9..10] = slave.holding_registers[0x319..0x31a]
data[11] = slave.holding_registers[0x347][0]
# Reactive Power - VAr
data[12..13] = slave.holding_registers[0x31d..0x31e]
data[14] = slave.holding_registers[0x34c][0]
# End Timing
time_duration = Time.now.to_f - time_start
# Update server
srv.holding_registers = data
# Notify
puts "Updating data, run took #{time_duration} seconds..."
puts data.collect { |d| d.to_s }.join(",")
# Delay
sleep(5 - time_duration) if (time_duration < 5)
end
# End Modbus Server
srv.shutdown
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment