class LadderDrive::Uploader

Attributes

protocol[RW]
source[RW]

Public Class Methods

new(options={}) click to toggle source
# File lib/ladder_drive/uploader.rb, line 35
def initialize options={}
  @protocol = options[:protocol] if options[:protocol]
end

Public Instance Methods

data() click to toggle source
# File lib/ladder_drive/uploader.rb, line 47
def data
  @data ||= begin
    hex = IntelHex.load @source
    hex.codes
  end
end
upload() click to toggle source
# File lib/ladder_drive/uploader.rb, line 39
def upload
  # stop plc
  stop_plc
  clear_program
  write_program
  run_plc
end
word_data() click to toggle source
# File lib/ladder_drive/uploader.rb, line 54
def word_data
  data.each_slice(2).map do |pair|
    pair << 0 if pair.size == 1
    pair.pack("C*").unpack("n*")
  end.flatten
end

Private Instance Methods

clear_program() click to toggle source
# File lib/ladder_drive/uploader.rb, line 72
def clear_program
  @protocol.set_word_to_device ESC_STATUS_TO_PLC_STOP_PLC_FLAG | ESC_STATUS_TO_PLC_CLEAR_PROGRAM, EscDevice.status_to_plc_device
  Timeout.timeout(5) do
    v = @protocol.get_word_from_device EscDevice.status_from_plc_device
    break if (v & ESC_STATUS_TO_PLC_CLEAR_PROGRAM) != 0
    sleep 0.1
  end
  @protocol.set_word_to_device ESC_STATUS_TO_PLC_STOP_PLC_FLAG, EscDevice.status_to_plc_device
end
run_plc() click to toggle source
# File lib/ladder_drive/uploader.rb, line 82
def run_plc
  @protocol.set_word_to_device 0, EscDevice.status_to_plc_device
  Timeout.timeout(5) do
    v = @protocol.get_word_from_device EscDevice.status_from_plc_device
    break if (v & ESC_STATUS_FROM_PLC_CYCLE_RUN) != 0
    sleep 0.1
  end
end
stop_plc() click to toggle source
# File lib/ladder_drive/uploader.rb, line 63
def stop_plc
  @protocol.set_word_to_device ESC_STATUS_TO_PLC_STOP_PLC_FLAG, EscDevice.status_to_plc_device
  Timeout.timeout(5) do
    v = @protocol.get_word_from_device EscDevice.status_from_plc_device
    break if (v & ESC_STATUS_TO_PLC_STOP_PLC_FLAG) != 0
    sleep 0.1
  end
end
write_program() click to toggle source
# File lib/ladder_drive/uploader.rb, line 91
def write_program
  word_data.each_slice(2*1024) do |chunk|
    @protocol.set_words_to_device chunk, EscDevice.program_area_device
  end
end