Class: Simatic::Sessions::ReadSession
- Inherits:
-
ExchangeSession
- Object
- Session
- ExchangeSession
- Simatic::Sessions::ReadSession
- Defined in:
- lib/simatic/sessions/read_session.rb
Overview
Read communication session
Instance Method Summary collapse
-
#initialize ⇒ ReadSession
constructor
A new instance of ReadSession.
-
#make_request(memory_mappers) ⇒ Object
def add memory @read_memory << memory if memory.instance_of? MemoryMapper end.
- #parse_response(raw_data) ⇒ Object
Methods inherited from Session
Constructor Details
#initialize ⇒ ReadSession
7 8 9 |
# File 'lib/simatic/sessions/read_session.rb', line 7 def initialize @read_memory = [] end |
Instance Method Details
#make_request(memory_mappers) ⇒ Object
def add memory
@read_memory << memory if memory.instance_of? MemoryMapper
end
15 16 17 18 19 20 21 22 23 24 25 26 |
# File 'lib/simatic/sessions/read_session.rb', line 15 def make_request memory_mappers @memory_mappers = memory_mappers param = [ FuncRead, # 8bit function @memory_mappers.count, # count of read-requests ].pack('C2') @memory_mappers.each do |memory_mapper| param += read_request memory_mapper end super param end |
#parse_response(raw_data) ⇒ Object
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
# File 'lib/simatic/sessions/read_session.rb', line 28 def parse_response raw_data super raw_data unless FuncRead == @function raise "unknown function 0x#{@function.to_s(16)} in #{self.class} response" end start_byte = 0 data_block_number = 0 while start_byte < @data.length unless @data[start_byte, 1].unpack('C').first == 0xff || @data[start_byte+=1, 1].unpack('C').first == 0xff raise "one of data block is broken in #{self.class} response" end data_lenght_type = @data[start_byte+1,1].unpack('C').first # 4 - bits, # 9 - bytes, # 3 - bits + byte data_lenght_raw = @data[start_byte+2,2].unpack('n').first data_lenght = data_lenght_raw data_lenght = data_lenght_raw / 8 if data_lenght_type == 4 @memory_mappers[data_block_number].raw_data = @data[start_byte + 4, data_lenght] start_byte += 4 + data_lenght data_block_number += 1 end @memory_mappers = @memory_mappers.first if @memory_mappers.count == 1 @memory_mappers end |