class Simatic::Plc
Public Class Methods
exchange(address, args = {}) { |plc| ... }
click to toggle source
# File lib/simatic/plc.rb, line 15 def self.exchange address, args = {}, timeout = 500 plc = self.new address, args plc.connect timeout yield plc plc.disconnect end
new(address, args = {})
click to toggle source
# File lib/simatic/plc.rb, line 9 def initialize address, args = {} @address = address @rack = args[:rack] || 0 @slot = args[:slot] || 2 end
Public Instance Methods
connect(timeout = 500)
click to toggle source
# File lib/simatic/plc.rb, line 71 def connect timeout = 500 @socket = Socket.tcp @address, 102, connect_timeout: timeout / 1000.0 setup = Sessions::SetupSession.new @rack, @slot @socket.send setup.make_request, 0 setup.parse_response @socket.recv BUFFER_SIZE open = Sessions::OpenSession.new @socket.send open.make_request, 0 open.parse_response @socket.recv BUFFER_SIZE end
disconnect()
click to toggle source
# File lib/simatic/plc.rb, line 84 def disconnect @socket.close end
read(*args)
click to toggle source
# File lib/simatic/plc.rb, line 23 def read *args if @socket.nil? raise "Plc #{@address} is not connected" end read = Sessions::ReadSession.new memory_mappers = [] args.each do |verbal| memory_mappers << MemoryMapper.new(verbal) end request = read.make_request memory_mappers @socket.send request, 0 # debug_print request response = @socket.recv BUFFER_SIZE # debug_print response result = read.parse_response response # Hash[result.map { |memory_mapper| [memory.verbal, memory.value] }] end
write(args)
click to toggle source
# File lib/simatic/plc.rb, line 48 def write args if @socket.nil? raise "Plc #{@address} is not connected" end memory_mappers = [] args.each do |verbal, value| memory_mappers << MemoryMapper.new(verbal, value: value) end write = Sessions::WriteSession.new request = write.make_request memory_mappers @socket.send request, 0 # debug_print request response = @socket.recv BUFFER_SIZE # debug_print response result = write.parse_response response end
Private Instance Methods
debug_print(raw)
click to toggle source
# File lib/simatic/plc.rb, line 90 def debug_print raw puts '-'*80 raw.bytes.each_with_index do |byte, i| ends = (i+1)%16 == 0 ? "\n" : ' ' printf '%02X '+ ends, byte end puts '' puts '-'*80 end