rmodbus 0.5.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. data/NEWS.md +52 -0
  2. data/README.md +87 -0
  3. data/Rakefile +22 -36
  4. data/examples/perfomance_rtu.rb +35 -37
  5. data/examples/perfomance_tcp.rb +36 -38
  6. data/examples/use_rtu_via_tcp_modbus.rb +8 -5
  7. data/examples/use_tcp_modbus.rb +10 -6
  8. data/lib/rmodbus/client.rb +52 -174
  9. data/lib/rmodbus/common.rb +45 -18
  10. data/lib/rmodbus/{exceptions.rb → errors.rb} +3 -0
  11. data/lib/rmodbus/ext.rb +25 -2
  12. data/lib/rmodbus/proxy.rb +54 -0
  13. data/lib/rmodbus/{crc16.rb → rtu.rb} +73 -2
  14. data/lib/rmodbus/rtu_client.rb +20 -116
  15. data/lib/rmodbus/rtu_server.rb +28 -57
  16. data/lib/rmodbus/rtu_slave.rb +59 -0
  17. data/lib/rmodbus/rtu_via_tcp_client.rb +22 -86
  18. data/lib/rmodbus/rtu_via_tcp_server.rb +31 -95
  19. data/lib/rmodbus/rtu_via_tcp_slave.rb +58 -0
  20. data/lib/rmodbus/{parsers.rb → server.rb} +24 -15
  21. data/lib/rmodbus/slave.rb +268 -0
  22. data/lib/rmodbus/sp.rb +45 -0
  23. data/lib/rmodbus/tcp.rb +49 -0
  24. data/lib/rmodbus/tcp_client.rb +19 -88
  25. data/lib/rmodbus/tcp_server.rb +16 -19
  26. data/lib/rmodbus/tcp_slave.rb +64 -0
  27. data/lib/rmodbus/version.rb +17 -0
  28. data/lib/rmodbus.rb +20 -4
  29. data/spec/client_spec.rb +19 -45
  30. data/spec/exception_spec.rb +26 -27
  31. data/spec/ext_spec.rb +24 -1
  32. data/spec/logging_spec.rb +31 -37
  33. data/spec/proxy_spec.rb +73 -0
  34. data/spec/read_rtu_response_spec.rb +2 -4
  35. data/spec/rtu_client_spec.rb +17 -19
  36. data/spec/rtu_server_spec.rb +1 -3
  37. data/spec/rtu_via_tcp_client_spec.rb +69 -63
  38. data/spec/slave_spec.rb +55 -0
  39. data/spec/tcp_client_spec.rb +77 -69
  40. data/spec/tcp_server_spec.rb +34 -49
  41. metadata +123 -37
  42. data/AUTHORS +0 -3
  43. data/ChangeLog +0 -82
  44. data/LICENSE +0 -675
  45. data/README +0 -53
  46. data/examples/add_new_function.rb +0 -19
data/spec/client_spec.rb CHANGED
@@ -1,57 +1,31 @@
1
- require 'rmodbus/client'
2
-
1
+ require 'rmodbus'
3
2
  include ModBus
4
3
 
5
4
  describe Client do
6
-
7
5
  before do
8
- @cl_mb = Client.new
9
- @cl_mb.stub!(:query).and_return('')
10
- end
11
-
12
- it "should support function 'read coils'" do
13
- @cl_mb.should_receive(:query).with("\x1\x0\x13\x0\x13").and_return("\xcd\x6b\x5")
14
- @cl_mb.read_coils(0x13,0x13).should == [1,0,1,1, 0,0,1,1, 1,1,0,1, 0,1,1,0, 1,0,1]
6
+ @cl = Client.new
15
7
  end
16
8
 
17
- it "should support function 'read discrete inputs'" do
18
- @cl_mb.should_receive(:query).with("\x2\x0\xc4\x0\x16").and_return("\xac\xdb\x35")
19
- @cl_mb.read_discrete_inputs(0xc4,0x16).should == [0,0,1,1, 0,1,0,1, 1,1,0,1, 1,0,1,1, 1,0,1,0, 1,1]
9
+ it "should give object provider for slave" do
10
+ slave = @cl.with_slave(1)
11
+ slave.uid.should eq(1)
20
12
  end
21
13
 
22
- it "should support function 'read holding registers'" do
23
- @cl_mb.should_receive(:query).with("\x3\x0\x6b\x0\x3").and_return("\x2\x2b\x0\x0\x0\x64")
24
- @cl_mb.read_holding_registers(0x6b,0x3).should == [0x022b, 0x0000, 0x0064]
14
+ it "should give object provider for slave in block" do
15
+ @cl.with_slave(1) do |slave|
16
+ slave.uid.should eq(1)
17
+ end
25
18
  end
26
-
27
- it "should support function 'read input registers'" do
28
- @cl_mb.should_receive(:query).with("\x4\x0\x8\x0\x1").and_return("\x0\xa")
29
- @cl_mb.read_input_registers(0x8,0x1).should == [0x000a]
30
- end
31
-
32
- it "should support function 'write single coil'" do
33
- @cl_mb.should_receive(:query).with("\x5\x0\xac\xff\x0").and_return("\xac\xff\x00")
34
- @cl_mb.write_single_coil(0xac,0x1).should == @cl_mb
19
+
20
+ it "should connect with TCP server" do
21
+ Client.connect do |cl|
22
+ cl.should be_instance_of(Client)
23
+ end
35
24
  end
36
-
37
- it "should support function 'write single register'" do
38
- @cl_mb.should_receive(:query).with("\x6\x0\x1\x0\x3").and_return("\x1\x0\x3")
39
- @cl_mb.write_single_register(0x1,0x3).should == @cl_mb
25
+
26
+ it ":new alias :connect" do
27
+ Client.new do |cl|
28
+ cl.should be_instance_of(Client)
29
+ end
40
30
  end
41
-
42
- it "should support function 'write multiple coils'" do
43
- @cl_mb.should_receive(:query).with("\xf\x0\x13\x0\xa\x2\xcd\x1").and_return("\x13\x0\xa")
44
- @cl_mb.write_multiple_coils(0x13,[1,0,1,1, 0,0,1,1, 1,0]).should == @cl_mb
45
- end
46
-
47
- it "should support function 'write multiple registers'" do
48
- @cl_mb.should_receive(:query).with("\x10\x0\x1\x0\x3\x6\x0\xa\x1\x2\xf\xf").and_return("\x1\x0\x3")
49
- @cl_mb.write_multiple_registers(0x1,[0x000a,0x0102, 0xf0f]).should == @cl_mb
50
- end
51
-
52
- it "should support function 'mask write register'" do
53
- @cl_mb.should_receive(:query).with("\x16\x0\x4\x0\xf2\x0\2").and_return("\x4\x0\xf2\x0\x2")
54
- @cl_mb.mask_write_register(0x4, 0xf2, 0x2).should == @cl_mb
55
- end
56
-
57
31
  end
@@ -1,10 +1,8 @@
1
1
  require 'rmodbus'
2
2
 
3
- include ModBus
4
3
  include ModBus::Errors
5
4
 
6
5
  describe ModBus::TCPClient do
7
-
8
6
  before(:all) do
9
7
  @srv = ModBus::TCPServer.new(1502, 1)
10
8
  @srv.coils = [0] * 8
@@ -13,100 +11,101 @@ describe ModBus::TCPClient do
13
11
  @srv.input_registers = [0] * 8
14
12
  @srv.start
15
13
 
16
- @cl =TCPClient.new('127.0.0.1', 1502, 1)
14
+ @cl = TCPClient.new('127.0.0.1', 1502)
15
+ @slave = @cl.with_slave(1)
17
16
  end
18
17
 
19
18
  # Read coil status
20
19
  it "should read coil status" do
21
- @cl.read_coils(0, 4).should == [0] * 4
20
+ @slave.read_coils(0, 4).should == [0] * 4
22
21
  end
23
22
 
24
23
  it "should raise exception if illegal data address" do
25
- lambda { @cl.read_coils(501, 34) }.should raise_error(IllegalDataAddress)
24
+ lambda { @slave.read_coils(501, 34) }.should raise_error(IllegalDataAddress)
26
25
  end
27
26
 
28
27
  it "should raise exception if too many data" do
29
- lambda { @cl.read_coils(0, 0x07D1) }.should raise_error(IllegalDataValue)
28
+ lambda { @slave.read_coils(0, 0x07D1) }.should raise_error(IllegalDataValue)
30
29
  end
31
30
 
32
31
  # Read input status
33
32
  it "should read discrete inputs" do
34
- @cl.read_discrete_inputs(0, 4).should == [0] * 4
33
+ @slave.read_discrete_inputs(0, 4).should == [0] * 4
35
34
  end
36
35
 
37
36
  it "should raise exception if illegal data address" do
38
- lambda { @cl.read_discrete_inputs(50, 23) }.should raise_error(IllegalDataAddress)
37
+ lambda { @slave.read_discrete_inputs(50, 23) }.should raise_error(IllegalDataAddress)
39
38
  end
40
39
 
41
40
  it "should raise exception if too many data" do
42
- lambda { @cl.read_discrete_inputs(0, 0x07D1) }.should raise_error(IllegalDataValue)
41
+ lambda { @slave.read_discrete_inputs(0, 0x07D1) }.should raise_error(IllegalDataValue)
43
42
  end
44
43
 
45
44
  # Read holding registers
46
45
  it "should read discrete inputs" do
47
- @cl.read_holding_registers(0, 4).should == [0, 0, 0, 0]
46
+ @slave.read_holding_registers(0, 4).should == [0, 0, 0, 0]
48
47
  end
49
48
 
50
49
  it "should raise exception if illegal data address" do
51
- lambda { @cl.read_holding_registers(402, 99) }.should raise_error(IllegalDataAddress)
50
+ lambda { @slave.read_holding_registers(402, 99) }.should raise_error(IllegalDataAddress)
52
51
  end
53
52
 
54
53
 
55
54
  it "should raise exception if too many data" do
56
- lambda { @cl.read_holding_registers(0, 0x007E) }.should raise_error(IllegalDataValue)
55
+ lambda { @slave.read_holding_registers(0, 0x007E) }.should raise_error(IllegalDataValue)
57
56
  end
58
57
 
59
58
  # Read input registers
60
59
  it "should read discrete inputs" do
61
- @cl.read_input_registers(0, 4).should == [0, 0, 0, 0]
60
+ @slave.read_input_registers(0, 4).should == [0, 0, 0, 0]
62
61
  end
63
62
 
64
63
  it "should raise exception if illegal data address" do
65
- lambda { @cl.read_input_registers(402, 9) }.should raise_error(IllegalDataAddress)
64
+ lambda { @slave.read_input_registers(402, 9) }.should raise_error(IllegalDataAddress)
66
65
  end
67
66
 
68
67
  it "should raise exception if too many data" do
69
- lambda { @cl.read_input_registers(0, 0x007E) }.should raise_error(IllegalDataValue)
68
+ lambda { @slave.read_input_registers(0, 0x007E) }.should raise_error(IllegalDataValue)
70
69
  end
71
70
 
72
71
  # Force single coil
73
72
  it "should force single coil" do
74
- @cl.write_single_coil(4, 1).should == @cl
75
- @cl.read_coils(4, 4).should == [1, 0, 0, 0]
73
+ @slave.write_single_coil(4, 1).should == @slave
74
+ @slave.read_coils(4, 4).should == [1, 0, 0, 0]
76
75
  end
77
76
 
78
77
  it "should raise exception if illegal data address" do
79
- lambda { @cl.write_single_coil(501, true) }.should raise_error(IllegalDataAddress)
78
+ lambda { @slave.write_single_coil(501, true) }.should raise_error(IllegalDataAddress)
80
79
  end
81
80
 
82
81
  # Preset single register
83
82
  it "should preset single register" do
84
- @cl.write_single_register(4, 0x0AA0).should == @cl
85
- @cl.read_holding_registers(4, 1).should == [0x0AA0]
83
+ @slave.write_single_register(4, 0x0AA0).should == @slave
84
+ @slave.read_holding_registers(4, 1).should == [0x0AA0]
86
85
  end
87
86
 
88
87
  it "should raise exception if illegal data address" do
89
- lambda { @cl.write_single_register(501, 0x0AA0) }.should raise_error(IllegalDataAddress)
88
+ lambda { @slave.write_single_register(501, 0x0AA0) }.should raise_error(IllegalDataAddress)
90
89
  end
91
90
 
92
91
  # Force multiple coils
93
92
  it "should force multiple coils" do
94
- @cl.write_multiple_coils(4, [0,1,0,1]).should == @cl
95
- @cl.read_coils(3, 5).should == [0,0,1,0,1]
93
+ @slave.write_multiple_coils(4, [0,1,0,1]).should == @slave
94
+ @slave.read_coils(3, 5).should == [0,0,1,0,1]
96
95
  end
97
96
 
98
97
  it "should raise exception if illegal data address" do
99
- lambda { @cl.write_multiple_coils(501, [1,0]) }.should raise_error(IllegalDataAddress)
98
+ lambda { @slave.write_multiple_coils(501, [1,0]) }.should raise_error(IllegalDataAddress)
100
99
  end
101
100
 
102
101
  # Preset multiple registers
103
102
  it "should preset multiple registers" do
104
- @cl.write_multiple_registers(4, [1, 2, 3, 0xAACC]).should == @cl
105
- @cl.read_holding_registers(3, 5).should == [0, 1, 2, 3, 0xAACC]
103
+ @slave.write_multiple_registers(4, [1, 2, 3, 0xAACC]).should == @slave
104
+ @slave.read_holding_registers(3, 5).should == [0, 1, 2, 3, 0xAACC]
106
105
  end
107
106
 
108
107
  it "should raise exception if illegal data address" do
109
- lambda { @cl.write_multiple_registers(501, [1, 2]) }.should raise_error(IllegalDataAddress)
108
+ lambda { @slave.write_multiple_registers(501, [1, 2]) }.should raise_error(IllegalDataAddress)
110
109
  end
111
110
 
112
111
  after(:all) do
data/spec/ext_spec.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  require 'rmodbus'
2
2
 
3
3
  describe Array do
4
-
5
4
  before do
6
5
  @arr = [1,0,1,1, 0,0,1,1, 1,1,0,1, 0,1,1,0, 1,0,1]
7
6
  @test = [0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0]
@@ -19,5 +18,29 @@ describe Array do
19
18
  "test".unpack_bits == @test
20
19
  end
21
20
 
21
+ it "should turn an array into 32b ints" do
22
+ [20342, 17344].to_32i.should == [1136676726]
23
+ [20342, 17344, 20342, 17344].to_32i.size.should == 2
24
+ end
25
+
26
+ it "should turn an array into 32b floats" do
27
+ [20342, 17344].to_32f[0].should be_within(0.1).of(384.620788574219)
28
+ [20342, 17344, 20342, 17344].to_32f.size.should == 2
29
+ end
30
+
31
+ it "should turn an array from 32b ints into 16b ints, big endian" do
32
+ [1136676726].from_32i.should == [20342, 17344]
33
+ [1136676726, 1136676725].from_32i.should == [20342, 17344, 20341, 17344]
34
+ end
35
+
36
+ it "should turn an array from 32b floats into 16b ints, big endian" do
37
+ [384.620788].from_32f.should == [20342, 17344]
38
+ [384.620788, 384.620788].from_32f.should == [20342, 17344, 20342, 17344]
39
+ end
40
+
41
+ it "should raise exception if uneven number of elements" do
42
+ lambda { [20342, 17344, 123].to_32f }.should raise_error(StandardError)
43
+ lambda { [20342, 17344, 123].to_32i }.should raise_error(StandardError)
44
+ end
22
45
  end
23
46
 
data/spec/logging_spec.rb CHANGED
@@ -1,71 +1,65 @@
1
1
  require 'rmodbus'
2
-
3
2
  include ModBus
4
3
 
5
4
  describe TCPClient do
6
-
7
- UID = 1
8
-
9
5
  before(:each) do
6
+ @uid = 1
10
7
  @sock = mock("Socket")
11
8
  @adu = "\000\001\000\000\000\001\001"
12
9
 
13
10
  TCPSocket.should_receive(:new).with('127.0.0.1', 1502).and_return(@sock)
14
11
  @sock.stub!(:read).with(0).and_return('')
15
12
 
16
- @mb_client = TCPClient.new('127.0.0.1', 1502)
13
+ @slave = TCPClient.new('127.0.0.1', 1502).with_slave(@uid)
17
14
  end
18
15
 
19
16
  it 'should log rec\send bytes' do
20
17
  request, response = "\x3\x0\x6b\x0\x3", "\x3\x6\x2\x2b\x0\x0\x0\x64"
21
18
  mock_query(request,response)
22
- @mb_client.debug = true
19
+ @slave.debug = true
23
20
  $stdout.should_receive(:puts).with("Tx (12 bytes): [00][01][00][00][00][06][01][03][00][6b][00][03]")
24
21
  $stdout.should_receive(:puts).with("Rx (15 bytes): [00][01][00][00][00][09][01][03][06][02][2b][00][00][00][64]")
25
- @mb_client.query(request)
22
+ @slave.query(request)
26
23
  end
27
24
 
28
25
  it "should don't logging if debug disable" do
29
26
  request, response = "\x3\x0\x6b\x0\x3", "\x3\x6\x2\x2b\x0\x0\x0\x64"
30
27
  mock_query(request,response)
31
- @mb_client.query(request)
28
+ @slave.query(request)
32
29
  end
33
30
 
34
-
35
31
  def mock_query(request, response)
36
- @adu = @mb_client.transaction.next.to_word + "\x0\x0\x0\x9" + UID.chr + request
37
- @sock.should_receive(:write).with(@adu[0,4] + "\0\6" + UID.chr + request)
32
+ @adu = @slave.transaction.next.to_word + "\x0\x0\x0\x9" + @uid.chr + request
33
+ @sock.should_receive(:write).with(@adu[0,4] + "\0\6" + @uid.chr + request)
38
34
  @sock.should_receive(:read).with(7).and_return(@adu[0,7])
39
35
  @sock.should_receive(:read).with(8).and_return(response)
40
36
  end
41
-
42
37
  end
43
38
 
44
- describe RTUClient do
39
+ unless RUBY_PLATFORM == "java"
40
+ describe RTUClient do
41
+ before do
42
+ @sp = mock('Serial port')
43
+ SerialPort.should_receive(:new).with("/dev/port1", 9600, 7, 2, SerialPort::ODD).and_return(@sp)
44
+
45
+ @sp.stub!(:read_timeout=)
46
+
47
+ @slave = RTUClient.new("/dev/port1", 9600, :data_bits => 7, :stop_bits => 2, :parity => SerialPort::ODD).with_slave(1)
48
+ @slave.read_retries = 0
49
+ end
45
50
 
46
- before do
47
- @sp = mock('Serial port')
48
- SerialPort.should_receive(:new).with("/dev/port1", 9600, 7, 2, SerialPort::ODD).and_return(@sp)
49
-
50
- @sp.stub!(:read_timeout=)
51
-
52
- @mb_client = RTUClient.new("/dev/port1", 9600, 1, :data_bits => 7, :stop_bits => 2, :parity => SerialPort::ODD)
53
- @mb_client.read_retries = 0
51
+ it 'should log rec\send bytes' do
52
+ request = "\x3\x0\x1\x0\x1"
53
+ @sp.should_receive(:write).with("\1#{request}\xd5\xca")
54
+ @sp.should_receive(:read).with(2).and_return("\x1\x3")
55
+ @sp.should_receive(:read).with(1).and_return("\x2")
56
+ @sp.should_receive(:read).with(4).and_return("\xff\xff\xb9\xf4")
57
+
58
+ @slave.debug = true
59
+ $stdout.should_receive(:puts).with("Tx (8 bytes): [01][03][00][01][00][01][d5][ca]")
60
+ $stdout.should_receive(:puts).with("Rx (7 bytes): [01][03][02][ff][ff][b9][f4]")
61
+
62
+ @slave.query(request).should == "\xff\xff"
63
+ end
54
64
  end
55
-
56
- it 'should log rec\send bytes' do
57
- request = "\x3\x0\x1\x0\x1"
58
- @sp.should_receive(:write).with("\1#{request}\xd5\xca")
59
- @sp.should_receive(:read).with(2).and_return("\x1\x3")
60
- @sp.should_receive(:read).with(1).and_return("\x2")
61
- @sp.should_receive(:read).with(4).and_return("\xff\xff\xb9\xf4")
62
-
63
- @mb_client.debug = true
64
- $stdout.should_receive(:puts).with("Tx (8 bytes): [01][03][00][01][00][01][d5][ca]")
65
- $stdout.should_receive(:puts).with("Rx (7 bytes): [01][03][02][ff][ff][b9][f4]")
66
-
67
- @mb_client.query(request).should == "\xff\xff"
68
- end
69
-
70
65
  end
71
-
@@ -0,0 +1,73 @@
1
+ require 'rmodbus'
2
+
3
+ describe Array do
4
+ before do
5
+ @slave = mock('ModBus Slave')
6
+ @coil_proxy = ModBus::ReadWriteProxy.new(@slave, :coil)
7
+ @discrete_input_proxy = ModBus::ReadOnlyProxy.new(@slave, :discrete_input)
8
+ @holding_register_proxy = ModBus::ReadWriteProxy.new(@slave, :holding_register)
9
+ @input_register_proxy = ModBus::ReadOnlyProxy.new(@slave, :input_register)
10
+ end
11
+
12
+ # Handle all of the coil methods
13
+ it "should call read_coil" do
14
+ @slave.should_receive(:read_coil).with(0, 1)
15
+ @coil_proxy[0]
16
+ end
17
+ it "should call read_coils" do
18
+ @slave.should_receive(:read_coils).with(0, 2)
19
+ @coil_proxy[0..1]
20
+ end
21
+ it "should call write_coil" do
22
+ @slave.should_receive(:write_coil).with(0, 1)
23
+ @coil_proxy[0] = 1
24
+ end
25
+ it "should call write_coils" do
26
+ @slave.should_receive(:write_coils).with(0, [0, 0])
27
+ @coil_proxy[0..1] = [0, 0]
28
+ end
29
+
30
+
31
+ # Discrete input tests
32
+ it "should call read_discrete_input" do
33
+ @slave.should_receive(:read_discrete_input).with(0, 1)
34
+ @discrete_input_proxy[0]
35
+ end
36
+
37
+ it "should call read_discrete_inputs" do
38
+ @slave.should_receive(:read_discrete_inputs).with(0, 2)
39
+ @discrete_input_proxy[0..1]
40
+ end
41
+
42
+
43
+ # Holding Register Tess
44
+ it "should call read_holding_register" do
45
+ @slave.should_receive(:read_holding_register).with(0, 1)
46
+ @holding_register_proxy[0]
47
+ end
48
+ it "should call read_holding_registers" do
49
+ @slave.should_receive(:read_holding_registers).with(0, 2)
50
+ @holding_register_proxy[0..1]
51
+ end
52
+ it "should call write_holding_register" do
53
+ @slave.should_receive(:write_holding_register).with(0, 1)
54
+ @holding_register_proxy[0] = 1
55
+ end
56
+ it "should call write_holding_registers" do
57
+ @slave.should_receive(:write_holding_registers).with(0, [0, 0])
58
+ @holding_register_proxy[0..1] = [0, 0]
59
+ end
60
+
61
+
62
+ # Input Register Tests
63
+ it "should call read_discrete_input" do
64
+ @slave.should_receive(:read_input_register).with(0, 1)
65
+ @input_register_proxy[0]
66
+ end
67
+
68
+ it "should call read_discrete_inputs" do
69
+ @slave.should_receive(:read_input_registers).with(0, 2)
70
+ @input_register_proxy[0..1]
71
+ end
72
+ end
73
+
@@ -1,10 +1,9 @@
1
- require 'rmodbus/client'
2
-
1
+ require 'rmodbus'
3
2
  include ModBus
4
3
 
5
4
  #Use public wrap method
6
-
7
5
  class Client
6
+ include RTU
8
7
  def test_read_method(msg)
9
8
  io = TestIO.new(msg)
10
9
  read_rtu_response(io)
@@ -85,7 +84,6 @@ describe "#read_rtu_response" do
85
84
  }
86
85
  end
87
86
 
88
-
89
87
  def make_resp(msg)
90
88
  "\x1" + msg + "\x2\x2" # slave + msg + mock_crc
91
89
  end
@@ -1,22 +1,16 @@
1
- begin
2
- require 'rubygems'
3
- rescue
4
- end
5
1
  require 'rmodbus'
6
-
7
2
  include ModBus
8
3
 
9
4
  describe RTUClient do
10
-
11
5
  before do
12
6
  @sp = mock('Serial port')
13
7
  SerialPort.should_receive(:new).with("/dev/port1", 9600, 8, 1, 0).and_return(@sp)
14
8
  @sp.stub!(:read_timeout=)
15
9
  @sp.stub!(:read)
16
10
 
17
- @mb_client = RTUClient.new("/dev/port1", 9600, 1,
18
- :data_bits => 8, :stop_bits => 1, :parity => SerialPort::NONE)
19
- @mb_client.read_retries = 0
11
+ @cl = RTUClient.new("/dev/port1", 9600, :data_bits => 8, :stop_bits => 1, :parity => SerialPort::NONE)
12
+ @slave = @cl.with_slave(1)
13
+ @slave.read_retries = 0
20
14
  end
21
15
 
22
16
  it "should ignore frame with other UID" do
@@ -24,7 +18,7 @@ describe RTUClient do
24
18
  @sp.should_receive(:write).with("\1#{request}\xA6\x31")
25
19
  @sp.should_receive(:read).with(2).and_return("\x2\x10")
26
20
  @sp.should_receive(:read).with(6).and_return("\x0\x1\x0\x1\x1C\x08")
27
- lambda {@mb_client.query(request)}.should raise_error(ModBus::Errors::ModBusTimeout)
21
+ lambda {@slave.query(request)}.should raise_error(ModBus::Errors::ModBusTimeout)
28
22
  end
29
23
 
30
24
  it "should ignored frame with incorrect CRC" do
@@ -32,7 +26,7 @@ describe RTUClient do
32
26
  @sp.should_receive(:write).with("\1#{request}\xA6\x31")
33
27
  @sp.should_receive(:read).with(2).and_return("\x2\x10")
34
28
  @sp.should_receive(:read).with(6).and_return("\x0\x1\x0\x1\x1C\x08")
35
- lambda {@mb_client.query(request)}.should raise_error(ModBus::Errors::ModBusTimeout)
29
+ lambda {@slave.query(request)}.should raise_error(ModBus::Errors::ModBusTimeout)
36
30
  end
37
31
 
38
32
  it "should return value of registers"do
@@ -41,18 +35,17 @@ describe RTUClient do
41
35
  @sp.should_receive(:read).with(2).and_return("\x1\x3")
42
36
  @sp.should_receive(:read).with(1).and_return("\x2")
43
37
  @sp.should_receive(:read).with(4).and_return("\xff\xff\xb9\xf4")
44
- @mb_client.query(request).should == "\xff\xff"
38
+ @slave.query(request).should == "\xff\xff"
45
39
  end
46
40
 
47
- it 'should sugar connect method' do
48
- port, baud, slave = "/dev/port1", 4800, 3
41
+ it 'should sugar connect method' do
42
+ port, baud = "/dev/port1", 4800
49
43
  SerialPort.should_receive(:new).with(port, baud, 8, 1, SerialPort::NONE).and_return(@sp)
50
44
  @sp.should_receive(:closed?).and_return(false)
51
45
  @sp.should_receive(:close)
52
- RTUClient.connect(port, baud, slave) do |cl|
46
+ RTUClient.connect(port, baud) do |cl|
53
47
  cl.port.should == port
54
48
  cl.baud.should == baud
55
- cl.slave.should == slave
56
49
  cl.data_bits.should == 8
57
50
  cl.stop_bits.should == 1
58
51
  cl.parity.should == SerialPort::NONE
@@ -61,16 +54,21 @@ describe RTUClient do
61
54
 
62
55
  it 'should have closed? method' do
63
56
  @sp.should_receive(:closed?).and_return(false)
64
- @mb_client.closed?.should == false
57
+ @cl.closed?.should == false
65
58
 
66
59
  @sp.should_receive(:closed?).and_return(false)
67
60
  @sp.should_receive(:close)
68
61
 
69
- @mb_client.close
62
+ @cl.close
70
63
 
71
64
  @sp.should_receive(:closed?).and_return(true)
72
- @mb_client.closed?.should == true
65
+ @cl.closed?.should == true
73
66
  end
74
67
 
68
+ it 'should give slave object in block' do
69
+ @cl.with_slave(1) do |slave|
70
+ slave.uid = 1
71
+ end
72
+ end
75
73
  end
76
74
 
@@ -1,5 +1,4 @@
1
1
  require 'rmodbus'
2
-
3
2
  include ModBus
4
3
 
5
4
  describe RTUServer do
@@ -27,5 +26,4 @@ describe RTUServer do
27
26
  @server.stop_bits.should == 2
28
27
  @server.parity.should == SerialPort::NONE
29
28
  end
30
-
31
- end
29
+ end