ladder_drive 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +11 -0
- data/Gemfile +8 -0
- data/Gemfile.lock +41 -0
- data/LICENSE +21 -0
- data/README.md +191 -0
- data/README_jp.md +193 -0
- data/Rakefile +9 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/exe/ladder_drive +28 -0
- data/ladder_drive.gemspec +33 -0
- data/lib/ladder_drive/asm.rb +211 -0
- data/lib/ladder_drive/cli.rb +55 -0
- data/lib/ladder_drive/config.rb +107 -0
- data/lib/ladder_drive/config_target.rb +93 -0
- data/lib/ladder_drive/console.rb +113 -0
- data/lib/ladder_drive/intel_hex.rb +79 -0
- data/lib/ladder_drive/ladder_drive.rb +36 -0
- data/lib/ladder_drive/plc_define.rb +35 -0
- data/lib/ladder_drive/plc_device.rb +171 -0
- data/lib/ladder_drive/protocol/emulator/emu_protocol.rb +54 -0
- data/lib/ladder_drive/protocol/emulator/emulator.rb +29 -0
- data/lib/ladder_drive/protocol/keyence/keyence.rb +31 -0
- data/lib/ladder_drive/protocol/keyence/kv_device.rb +51 -0
- data/lib/ladder_drive/protocol/keyence/kv_protocol.rb +187 -0
- data/lib/ladder_drive/protocol/mitsubishi/mc_protocol.rb +268 -0
- data/lib/ladder_drive/protocol/mitsubishi/mitsubishi.rb +30 -0
- data/lib/ladder_drive/protocol/mitsubishi/qdevice.rb +114 -0
- data/lib/ladder_drive/protocol/protocol.rb +107 -0
- data/lib/ladder_drive/tasks/build.rb +101 -0
- data/lib/ladder_drive/uploader.rb +101 -0
- data/lib/ladder_drive/version.rb +26 -0
- data/lib/ladder_drive.rb +32 -0
- data/lib/plc/LICENSE +21 -0
- data/lib/plc/emulator/emu_device.rb +121 -0
- data/lib/plc/emulator/emu_plc.rb +482 -0
- data/lib/plc/emulator/emu_plc_server.rb +71 -0
- data/lib/plc/emulator/emulator.rb +28 -0
- data/lib/plc/keyence/kv/kv-5000/DocumentWindowInfo.xml +91 -0
- data/lib/plc/keyence/kv/kv-5000/KvsMon.ini +0 -0
- data/lib/plc/keyence/kv/kv-5000/LadderDrive.mod +0 -0
- data/lib/plc/keyence/kv/kv-5000/LbkMdm.ini +0 -0
- data/lib/plc/keyence/kv/kv-5000/Main.mod +0 -0
- data/lib/plc/keyence/kv/kv-5000/MonEnv.kmu +1 -0
- data/lib/plc/keyence/kv/kv-5000/PlcSended.dky +0 -0
- data/lib/plc/keyence/kv/kv-5000/SensorMonitorInfo.xml +4 -0
- data/lib/plc/keyence/kv/kv-5000/TransInfo.tif +0 -0
- data/lib/plc/keyence/kv/kv-5000/UnitSet.ue2 +0 -0
- data/lib/plc/keyence/kv/kv-5000/UnitSet.ue2.old +0 -0
- data/lib/plc/keyence/kv/kv-5000/WsTreeEnv.xml +28 -0
- data/lib/plc/keyence/kv/kv-5000/kv-5000.cm1 +0 -0
- data/lib/plc/keyence/kv/kv-5000/kv-5000.cm2 +0 -0
- data/lib/plc/keyence/kv/kv-5000/kv-5000.ftc +0 -0
- data/lib/plc/keyence/kv/kv-5000/kv-5000.kpr +0 -0
- data/lib/plc/keyence/kv/kv-5000/kv-5000.lbl +0 -0
- data/lib/plc/keyence/kv/kv-5000/kv-5000.mil +0 -0
- data/lib/plc/keyence/kv/kv-5000/kv-5000.spl +0 -0
- data/lib/plc/keyence/kv/kv-5000/operand-history.txt +16 -0
- data/lib/plc/keyence/kv/kv-5000/sample.al2 +2 -0
- data/lib/plc/mitsubishi/iq-r/r08/r08.gx3 +0 -0
- data/lib/plc/plc.rb +27 -0
- data/sample/ladder_drive/sample1.esc +4 -0
- data/sample/ladder_drive/sample2.esc +28 -0
- data/sample/ladder_drive/sample2.png +0 -0
- data/template/escalator/config/plc.yml +27 -0
- data/template/ladder_drive/Rakefile +1 -0
- data/template/ladder_drive/asm/main.esc +70 -0
- data/template/ladder_drive/config/plc.yml +27 -0
- metadata +174 -0
@@ -0,0 +1,35 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2016 ITO SOFT DESIGN Inc.
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
# a copy of this software and associated documentation files (the
|
6
|
+
# "Software"), to deal in the Software without restriction, including
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
# the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be
|
13
|
+
# included in all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
|
23
|
+
module LadderDrive
|
24
|
+
module PlcDefine
|
25
|
+
|
26
|
+
# status flags
|
27
|
+
# SD0
|
28
|
+
ESC_STATUS_TO_PLC_STOP_PLC_FLAG = 2 # bit 1
|
29
|
+
ESC_STATUS_TO_PLC_CLEAR_PROGRAM = 4 # bit 2 require bit 1 on
|
30
|
+
# SD1
|
31
|
+
ESC_STATUS_FROM_PLC_CYCLE_RUN = 2
|
32
|
+
ESC_STATUS_FROM_PLC_ACK_CLEAR_PROGRAM = 4
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,171 @@
|
|
1
|
+
# The MIT License (MIT)
|
2
|
+
#
|
3
|
+
# Copyright (c) 2016 ITO SOFT DESIGN Inc.
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
# a copy of this software and associated documentation files (the
|
7
|
+
# "Software"), to deal in the Software without restriction, including
|
8
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
# the following conditions:
|
12
|
+
#
|
13
|
+
# The above copyright notice and this permission notice shall be
|
14
|
+
# included in all copies or substantial portions of the Software.
|
15
|
+
#
|
16
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
23
|
+
|
24
|
+
module LadderDrive
|
25
|
+
|
26
|
+
class PlcDevice
|
27
|
+
|
28
|
+
attr_reader :suffix, :number
|
29
|
+
attr_accessor :value
|
30
|
+
|
31
|
+
NUMBER_TYPE_DEC = 0
|
32
|
+
NUMBER_TYPE_DEC_HEX = 1
|
33
|
+
NUMBER_TYPE_HEX = 2
|
34
|
+
|
35
|
+
ESC_SUFFIXES = %w(X Y M - C T L SC CC TC D - CS TS H SD)
|
36
|
+
|
37
|
+
class << self
|
38
|
+
|
39
|
+
def status_to_plc_device
|
40
|
+
@status_to_plc_device ||= new "SD0"
|
41
|
+
end
|
42
|
+
|
43
|
+
def status_from_plc_device
|
44
|
+
@status_from_plc_device ||= new "SD1"
|
45
|
+
end
|
46
|
+
|
47
|
+
def program_area_device
|
48
|
+
@program_area_device ||= new "PRG0"
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|
53
|
+
def initialize a, b = nil
|
54
|
+
@suffix = nil
|
55
|
+
@value = 0
|
56
|
+
case a
|
57
|
+
when Fixnum
|
58
|
+
@suffix = ESC_SUFFIXES[a]
|
59
|
+
@number = b
|
60
|
+
when String
|
61
|
+
if b
|
62
|
+
@suffix = a.upcase
|
63
|
+
@number = b
|
64
|
+
else
|
65
|
+
/([A-Z]+)?(\d+)/i =~ a
|
66
|
+
@suffix = ($1 || "").upcase
|
67
|
+
case number_type
|
68
|
+
when NUMBER_TYPE_DEC_HEX
|
69
|
+
n = $2.to_i
|
70
|
+
@number = (n / 100) * 16 + (n % 100)
|
71
|
+
when NUMBER_TYPE_HEX
|
72
|
+
@number = $2.to_i(16)
|
73
|
+
else
|
74
|
+
@number = $2.to_i
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def name
|
81
|
+
case number_type
|
82
|
+
when NUMBER_TYPE_DEC
|
83
|
+
"#{@suffix}#{@number}"
|
84
|
+
when NUMBER_TYPE_DEC_HEX
|
85
|
+
a = [@number / 16, @number % 16]
|
86
|
+
ns = begin
|
87
|
+
s = a.last.to_s.rjust(2, "0")
|
88
|
+
s = a.first.to_s + s unless a.first == 0
|
89
|
+
s
|
90
|
+
end
|
91
|
+
"#{@suffix}#{ns}"
|
92
|
+
when NUMBER_TYPE_HEX
|
93
|
+
ns = @number.to_s(16)
|
94
|
+
ns = "0" + ns unless /^[0-9]/ =~ ns
|
95
|
+
"#{@suffix}#{ns}"
|
96
|
+
else
|
97
|
+
nil
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def next_device
|
102
|
+
d = self.class.new @suffix, @number + 1
|
103
|
+
d
|
104
|
+
end
|
105
|
+
|
106
|
+
def bit_device?
|
107
|
+
SUFFIXES_FOR_BIT.include? @suffix
|
108
|
+
end
|
109
|
+
|
110
|
+
def + value
|
111
|
+
self.class.new self.suffix, self.number + value
|
112
|
+
end
|
113
|
+
|
114
|
+
def - value
|
115
|
+
self.class.new self.suffix, [self.number - value, 0].max
|
116
|
+
end
|
117
|
+
|
118
|
+
def input?
|
119
|
+
suffixes_for_input.include? @suffix
|
120
|
+
end
|
121
|
+
|
122
|
+
def bool
|
123
|
+
case @value
|
124
|
+
when Fixnum
|
125
|
+
@value != 0
|
126
|
+
else
|
127
|
+
!!@value
|
128
|
+
end
|
129
|
+
end
|
130
|
+
def bool= v; @value = v; end
|
131
|
+
alias :word :value
|
132
|
+
alias :word= :value=
|
133
|
+
|
134
|
+
def device_code
|
135
|
+
ESC_SUFFIXES.index @suffix
|
136
|
+
end
|
137
|
+
|
138
|
+
def reset
|
139
|
+
@value = 0
|
140
|
+
end
|
141
|
+
|
142
|
+
private
|
143
|
+
|
144
|
+
SUFFIXES_FOR_DEC = %w(PRG M C T L SC CC TC D CS TS H SD)
|
145
|
+
SUFFIXES_FOR_DEC_HEX = %w()
|
146
|
+
SUFFIXES_FOR_HEX = %w(X Y)
|
147
|
+
SUFFIXES_FOR_BIT = %w(X Y M C T L SC)
|
148
|
+
SUFFIXES_FOR_INPUT = %w(X)
|
149
|
+
|
150
|
+
def suffixes_for_dec; SUFFIXES_FOR_DEC; end
|
151
|
+
def suffixes_for_dec_hex; SUFFIXES_FOR_DEC_HEX; end
|
152
|
+
def suffixes_for_hex; SUFFIXES_FOR_HEX; end
|
153
|
+
def suffixes_for_bit; SUFFIXES_FOR_BIT; end
|
154
|
+
def suffixes_for_input; SUFFIXES_FOR_INPUT; end
|
155
|
+
|
156
|
+
def suffixes
|
157
|
+
suffixes_for_dec + suffixes_for_dec_hex + suffixeds_for_hex
|
158
|
+
end
|
159
|
+
|
160
|
+
def number_type
|
161
|
+
return NUMBER_TYPE_DEC if suffixes_for_dec.include? @suffix
|
162
|
+
return NUMBER_TYPE_DEC_HEX if suffixes_for_dec_hex.include? @suffix
|
163
|
+
return NUMBER_TYPE_HEX if suffixes_for_hex.include? @suffix
|
164
|
+
nil
|
165
|
+
end
|
166
|
+
|
167
|
+
end
|
168
|
+
|
169
|
+
class EscDevice < PlcDevice; end
|
170
|
+
|
171
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# The MIT License (MIT)
|
2
|
+
#
|
3
|
+
# Copyright (c) 2016 ITO SOFT DESIGN Inc.
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
# a copy of this software and associated documentation files (the
|
7
|
+
# "Software"), to deal in the Software without restriction, including
|
8
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
# the following conditions:
|
12
|
+
#
|
13
|
+
# The above copyright notice and this permission notice shall be
|
14
|
+
# included in all copies or substantial portions of the Software.
|
15
|
+
#
|
16
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
23
|
+
|
24
|
+
module LadderDrive
|
25
|
+
module Protocol
|
26
|
+
module Emulator
|
27
|
+
|
28
|
+
class EmuProtocol < LadderDrive::Protocol::Keyence::KvProtocol
|
29
|
+
|
30
|
+
def initialize options={}
|
31
|
+
options.merge host:"localhost", port:5555
|
32
|
+
super
|
33
|
+
end
|
34
|
+
|
35
|
+
def execute line
|
36
|
+
@socket.puts(line)
|
37
|
+
@socket.gets
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def device_class
|
43
|
+
EscDevice
|
44
|
+
end
|
45
|
+
|
46
|
+
def local_device device
|
47
|
+
device
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# The MIT License (MIT)
|
2
|
+
#
|
3
|
+
# Copyright (c) 2016 ITO SOFT DESIGN Inc.
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
# a copy of this software and associated documentation files (the
|
7
|
+
# "Software"), to deal in the Software without restriction, including
|
8
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
# the following conditions:
|
12
|
+
#
|
13
|
+
# The above copyright notice and this permission notice shall be
|
14
|
+
# included in all copies or substantial portions of the Software.
|
15
|
+
#
|
16
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
23
|
+
|
24
|
+
$:.unshift File.dirname(__FILE__)
|
25
|
+
|
26
|
+
require 'socket'
|
27
|
+
require 'logger'
|
28
|
+
require 'timeout'
|
29
|
+
require 'emu_protocol'
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# The MIT License (MIT)
|
2
|
+
#
|
3
|
+
# Copyright (c) 2016 ITO SOFT DESIGN Inc.
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
# a copy of this software and associated documentation files (the
|
7
|
+
# "Software"), to deal in the Software without restriction, including
|
8
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
# the following conditions:
|
12
|
+
#
|
13
|
+
# The above copyright notice and this permission notice shall be
|
14
|
+
# included in all copies or substantial portions of the Software.
|
15
|
+
#
|
16
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
23
|
+
|
24
|
+
dir = File.expand_path(File.dirname(__FILE__))
|
25
|
+
$:.unshift dir unless $:.include? dir
|
26
|
+
|
27
|
+
require 'socket'
|
28
|
+
require 'logger'
|
29
|
+
require 'timeout'
|
30
|
+
require 'kv_device'
|
31
|
+
require 'kv_protocol'
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# The MIT License (MIT)
|
2
|
+
#
|
3
|
+
# Copyright (c) 2016 ITO SOFT DESIGN Inc.
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
# a copy of this software and associated documentation files (the
|
7
|
+
# "Software"), to deal in the Software without restriction, including
|
8
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
# the following conditions:
|
12
|
+
#
|
13
|
+
# The above copyright notice and this permission notice shall be
|
14
|
+
# included in all copies or substantial portions of the Software.
|
15
|
+
#
|
16
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
23
|
+
|
24
|
+
module LadderDrive
|
25
|
+
module Protocol
|
26
|
+
module Keyence
|
27
|
+
|
28
|
+
class KvDevice < PlcDevice
|
29
|
+
|
30
|
+
def initialize a, b = nil
|
31
|
+
super
|
32
|
+
@suffix = "R" if @suffix.nil? || @suffix.length == 0
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
SUFFIXES_FOR_DEC = %w(DM EM FM ZF TM Z T TC TS C CC CS CTH CTC AT CM VM)
|
38
|
+
SUFFIXES_FOR_DEC_HEX = %w(R MR LR CR)
|
39
|
+
SUFFIXES_FOR_HEX = %w(B VB W)
|
40
|
+
SUFFIXES_FOR_BIT = %w(R B MR LR CR VB)
|
41
|
+
|
42
|
+
def suffixes_for_dec; SUFFIXES_FOR_DEC; end
|
43
|
+
def suffixes_for_dec_hex; SUFFIXES_FOR_DEC_HEX; end
|
44
|
+
def suffixeds_for_hex; SUFFIXES_FOR_HEX; end
|
45
|
+
def suffixes_for_bit; SUFFIXES_FOR_BIT; end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,187 @@
|
|
1
|
+
# The MIT License (MIT)
|
2
|
+
#
|
3
|
+
# Copyright (c) 2016 ITO SOFT DESIGN Inc.
|
4
|
+
#
|
5
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
# a copy of this software and associated documentation files (the
|
7
|
+
# "Software"), to deal in the Software without restriction, including
|
8
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
# the following conditions:
|
12
|
+
#
|
13
|
+
# The above copyright notice and this permission notice shall be
|
14
|
+
# included in all copies or substantial portions of the Software.
|
15
|
+
#
|
16
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
23
|
+
|
24
|
+
module LadderDrive
|
25
|
+
module Protocol
|
26
|
+
module Keyence
|
27
|
+
|
28
|
+
class KvProtocol < Protocol
|
29
|
+
|
30
|
+
def initialize options={}
|
31
|
+
super
|
32
|
+
@host = options[:host] || "192.168.0.10"
|
33
|
+
@port = options[:port] || 8501
|
34
|
+
prepare_device_map
|
35
|
+
end
|
36
|
+
|
37
|
+
def open
|
38
|
+
open!
|
39
|
+
rescue
|
40
|
+
nil
|
41
|
+
end
|
42
|
+
|
43
|
+
def open!
|
44
|
+
@socket ||= TCPSocket.open(@host, @port)
|
45
|
+
end
|
46
|
+
|
47
|
+
def close
|
48
|
+
@socket.close if @socket
|
49
|
+
@socket = nil
|
50
|
+
end
|
51
|
+
|
52
|
+
def get_bit_from_device device
|
53
|
+
device = device_by_name device
|
54
|
+
get_bits_from_device(1, device).first
|
55
|
+
end
|
56
|
+
|
57
|
+
def get_bits_from_device count, device
|
58
|
+
values = get_words_from_device count, device
|
59
|
+
values = values.map{|v| v == 0 ? false : true}
|
60
|
+
values.each do |v|
|
61
|
+
device.bool = v
|
62
|
+
device = device_by_name (device+1).name
|
63
|
+
end
|
64
|
+
values
|
65
|
+
end
|
66
|
+
|
67
|
+
def set_bits_to_device bits, device
|
68
|
+
device = device_by_name device
|
69
|
+
bits = [bits] unless bits.is_a? Array
|
70
|
+
@logger.debug("#{device.name}[#{bits.size}] <= #{bits}")
|
71
|
+
bits.each do |v|
|
72
|
+
cmd = "ST"
|
73
|
+
case v
|
74
|
+
when false, 0
|
75
|
+
cmd = "RS"
|
76
|
+
end
|
77
|
+
packet = "#{cmd} #{device.name}\r"
|
78
|
+
@logger.debug("> #{dump_packet packet}")
|
79
|
+
open
|
80
|
+
@socket.puts(packet)
|
81
|
+
res = receive
|
82
|
+
raise res unless /OK/i =~ res
|
83
|
+
device = device_by_name (device+1).name
|
84
|
+
end
|
85
|
+
end
|
86
|
+
alias :set_bit_to_device :set_bits_to_device
|
87
|
+
|
88
|
+
|
89
|
+
def get_word_from_device device
|
90
|
+
device = device_by_name device
|
91
|
+
get_words_from_device(1, device).first
|
92
|
+
end
|
93
|
+
|
94
|
+
def get_words_from_device(count, device)
|
95
|
+
device = local_device device
|
96
|
+
packet = "RDS #{device.name} #{count}\r"
|
97
|
+
@logger.debug("> #{dump_packet packet}")
|
98
|
+
open
|
99
|
+
@socket.puts(packet)
|
100
|
+
res = receive
|
101
|
+
values = res.split(/\s+/).map{|v| v.to_i}
|
102
|
+
@logger.debug("#{device.name}[#{count}] => #{values}")
|
103
|
+
values
|
104
|
+
end
|
105
|
+
|
106
|
+
def set_words_to_device words, device
|
107
|
+
device = local_device device
|
108
|
+
words = [words] unless words.is_a? Array
|
109
|
+
packet = "WRS #{device.name} #{words.size} #{words.map{|w| w.to_s}.join(" ")}\r"
|
110
|
+
@logger.debug("> #{dump_packet packet}")
|
111
|
+
open
|
112
|
+
@socket.puts(packet)
|
113
|
+
res = receive
|
114
|
+
@logger.debug("#{device.name}[#{words.size}] <= #{words}")
|
115
|
+
raise res unless /OK/i =~ res
|
116
|
+
end
|
117
|
+
alias :set_word_to_device :set_words_to_device
|
118
|
+
|
119
|
+
|
120
|
+
def device_by_name name
|
121
|
+
case name
|
122
|
+
when String
|
123
|
+
device_class.new name
|
124
|
+
else
|
125
|
+
# it may be already Device
|
126
|
+
name
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
|
131
|
+
def receive
|
132
|
+
res = ""
|
133
|
+
begin
|
134
|
+
Timeout.timeout(0.1) do
|
135
|
+
res = @socket.gets
|
136
|
+
end
|
137
|
+
rescue Timeout::Error
|
138
|
+
end
|
139
|
+
@logger.debug("< #{dump_packet res}")
|
140
|
+
res.chomp
|
141
|
+
end
|
142
|
+
|
143
|
+
def dump_packet packet
|
144
|
+
packet.dup.chomp
|
145
|
+
end
|
146
|
+
|
147
|
+
private
|
148
|
+
|
149
|
+
def device_class
|
150
|
+
KvDevice
|
151
|
+
end
|
152
|
+
|
153
|
+
def prepare_device_map
|
154
|
+
@conv_dev_dict ||= begin
|
155
|
+
h = {}
|
156
|
+
[
|
157
|
+
["X", "R0", 1024],
|
158
|
+
["Y", "R0", 1024],
|
159
|
+
["M", "MR0", 1024],
|
160
|
+
["C", "C0", 256],
|
161
|
+
["T", "T0", 256],
|
162
|
+
["L", "L0", 1024],
|
163
|
+
["SC", "MR1024", 1024],
|
164
|
+
["D", "DM0", 1024],
|
165
|
+
["H", "DM1024", 1024],
|
166
|
+
["SD", "DM2048", 1024],
|
167
|
+
["PRG", "DM3072", 1024] # ..D4095
|
168
|
+
].each do |s,d,c|
|
169
|
+
h[s] = [KvDevice.new(d), c]
|
170
|
+
end
|
171
|
+
h
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
def local_device device
|
176
|
+
return device if device.is_a? KvDevice
|
177
|
+
d, c = @conv_dev_dict[device.suffix]
|
178
|
+
return nil unless device.number < c
|
179
|
+
ld = KvDevice.new(d.suffix, d.number + device.number)
|
180
|
+
device_by_name ld.name
|
181
|
+
end
|
182
|
+
|
183
|
+
end
|
184
|
+
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|