class Simatic::Sessions::ExchangeSession

Parent of all exchange sessions classes

Public Instance Methods

make_request(param, data = '', udata = '') click to toggle source
Calls superclass method
# File lib/simatic/sessions/exchange_session.rb, line 7
def make_request param, data = '', udata = ''
  super [0x02, 0xf0, 0x80, # 24bit pdu_start
              0x32, # 8bit header_start
              0x01, # 8bit header_type
              0x00, # 16bit
              packet_number,    # 16bit pdu_number
              param.length, # 16bit param_length
              data.length,   # 16bit data_length
              ].pack('CCCCCnnnn') + param + data
end
parse_response(raw_data) click to toggle source
Calls superclass method
# File lib/simatic/sessions/exchange_session.rb, line 18
def parse_response raw_data
  super

  pdu_start = raw_data[4,3].unpack('C*')
  unless [0x02, 0xF0, 0x80] == pdu_start
    raise "unknown response recived on #{self.class} with pdu start by #{pdu_start}"
  end

  header_type  = raw_data[8,  1].unpack('C').first
  @pdu_number   = raw_data[11, 2].unpack('n').first
  param_length = raw_data[13, 2].unpack('n').first
  data_length  = raw_data[15, 2].unpack('n').first

  if (2..3).member? header_type
    udata_length = raw_data[17,2].unpack('n').first
    data_start = 19
  else
    data_start = 17
  end

  @params = raw_data[data_start,  param_length]
  @data   = raw_data[data_start + param_length,  data_length]
  @udata  = raw_data[data_start + param_length + data_length,  udata_length] if (2..3).member? header_type

  @function = @params[0,1].unpack('C').first
  @block_count = @params[1,1].unpack('C').first unless @function == FuncOpenS7Connection

  # print "params "; @params.bytes.each{|byte| printf "%02X ", byte}; puts '' if DEBUG
  # print "data "; @data.bytes.each{|byte| printf "%02X ", byte}; puts '' if DEBUG
end