Class: Simatic::Sessions::ExchangeSession

Inherits:
Session
  • Object
show all
Defined in:
lib/simatic/sessions/exchange_session.rb

Overview

Parent of all exchange sessions classes

Direct Known Subclasses

OpenSession, ReadSession, WriteSession

Instance Method Summary collapse

Methods inherited from Session

#packet_number

Instance Method Details

#make_request(param, data = '', udata = '') ⇒ Object



7
8
9
10
11
12
13
14
15
16
# 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) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# 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