-
Notifications
You must be signed in to change notification settings - Fork 45
/
exception_spec.rb
119 lines (93 loc) · 3.78 KB
/
exception_spec.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# -*- coding: ascii
require 'rmodbus'
describe ModBus::TCPClient do
before(:all) do
@srv = ModBus::TCPServer.new(1502, 1)
@srv.coils = [0] * 8
@srv.discrete_inputs = [0] * 8
@srv.holding_registers = [0] * 8
@srv.input_registers = [0] * 8
@srv.start
@cl = ModBus::TCPClient.new('127.0.0.1', 1502)
@slave = @cl.with_slave(1)
end
it "should raise ProxException" do
lambda { @slave.holding_registers[0..2] = [0,0] }.should raise_error(ModBus::Errors::ProxyException)
end
# Read coil status
it "should read coil status" do
@slave.read_coils(0, 4).should == [0] * 4
end
it "should raise exception if illegal data address" do
lambda { @slave.read_coils(501, 34) }.should raise_error(ModBus::Errors::IllegalDataAddress)
end
it "should raise exception if too many data" do
lambda { @slave.read_coils(0, 0x07D1) }.should raise_error(ModBus::Errors::IllegalDataValue)
end
# Read input status
it "should read discrete inputs" do
@slave.read_discrete_inputs(0, 4).should == [0] * 4
end
it "should raise exception if illegal data address" do
lambda { @slave.read_discrete_inputs(50, 23) }.should raise_error(ModBus::Errors::IllegalDataAddress)
end
it "should raise exception if too many data" do
lambda { @slave.read_discrete_inputs(0, 0x07D1) }.should raise_error(ModBus::Errors::IllegalDataValue)
end
# Read holding registers
it "should read discrete inputs" do
@slave.read_holding_registers(0, 4).should == [0, 0, 0, 0]
end
it "should raise exception if illegal data address" do
lambda { @slave.read_holding_registers(402, 99) }.should raise_error(ModBus::Errors::IllegalDataAddress)
end
it "should raise exception if too many data" do
lambda { @slave.read_holding_registers(0, 0x007E) }.should raise_error(ModBus::Errors::IllegalDataValue)
end
# Read input registers
it "should read discrete inputs" do
@slave.read_input_registers(0, 4).should == [0, 0, 0, 0]
end
it "should raise exception if illegal data address" do
lambda { @slave.read_input_registers(402, 9) }.should raise_error(ModBus::Errors::IllegalDataAddress)
end
it "should raise exception if too many data" do
lambda { @slave.read_input_registers(0, 0x007E) }.should raise_error(ModBus::Errors::IllegalDataValue)
end
# Force single coil
it "should force single coil" do
@slave.write_single_coil(4, 1).should == @slave
@slave.read_coils(4, 4).should == [1, 0, 0, 0]
end
it "should raise exception if illegal data address" do
lambda { @slave.write_single_coil(501, true) }.should raise_error(ModBus::Errors::IllegalDataAddress)
end
# Preset single register
it "should preset single register" do
@slave.write_single_register(4, 0x0AA0).should == @slave
@slave.read_holding_registers(4, 1).should == [0x0AA0]
end
it "should raise exception if illegal data address" do
lambda { @slave.write_single_register(501, 0x0AA0) }.should raise_error(ModBus::Errors::IllegalDataAddress)
end
# Force multiple coils
it "should force multiple coils" do
@slave.write_multiple_coils(4, [0,1,0,1]).should == @slave
@slave.read_coils(3, 5).should == [0,0,1,0,1]
end
it "should raise exception if illegal data address" do
lambda { @slave.write_multiple_coils(501, [1,0]) }.should raise_error(ModBus::Errors::IllegalDataAddress)
end
# Preset multiple registers
it "should preset multiple registers" do
@slave.write_multiple_registers(4, [1, 2, 3, 0xAACC]).should == @slave
@slave.read_holding_registers(3, 5).should == [0, 1, 2, 3, 0xAACC]
end
it "should raise exception if illegal data address" do
lambda { @slave.write_multiple_registers(501, [1, 2]) }.should raise_error(ModBus::Errors::IllegalDataAddress)
end
after(:all) do
@cl.close unless @cl.closed?
@srv.stop
end
end