libmodbus4r 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
data/NEWS ADDED
@@ -0,0 +1,6 @@
1
+ libmodbus 0.2.1 (2009-08-10)
2
+ - Fix bug in Master::read_input_coils
3
+
4
+ libmodbus 0.2.0 (2009-07-30)
5
+ ===========================
6
+ - First public release
data/README CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Binding use *libmodbus* (free implementation of modbus for Linux\MacOS) for Ruby.
4
4
 
5
- == Futures
5
+ == Features
6
6
 
7
7
  * Use only Ruby-1.9.x
8
8
  * Use C library *libmodbus*;
@@ -32,7 +32,7 @@ Aleksey Timin <atimin@gmail.com>
32
32
 
33
33
  == Refernces
34
34
 
35
- Home page projects : http://flipback.github.com/libmodbus4r
35
+ Home page projects : http://flipback.github.com/libmodbus4r/
36
36
  Hosting on RubyForge : http://rubyforge.org/projects/libmodbus4r
37
37
  Hosting on GitHub : http://github.com/flipback/libmodbus4r/tree/master
38
38
 
data/TODO ADDED
@@ -0,0 +1,5 @@
1
+ Next release 0.3.0
2
+ ======================
3
+ - Migrate on libmodbus-2.2.0
4
+ - Add TCP\RTU slave
5
+
@@ -0,0 +1,81 @@
1
+ /* libmodbus4r - binding use libmodbus for Ruby.
2
+ Copyright (C) 2009 Timin Aleksey
3
+
4
+ This program is free software: you can redistribute it and/or modify
5
+ it under the terms of the GNU General Public License as published by
6
+ the Free Software Foundation, either version 3 of the License, or
7
+ (at your option) any later version.
8
+
9
+ This program is distributed in the hope that it will be useful,
10
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ GNU General Public License for more details. */
13
+
14
+ #include "modbus4r.h"
15
+
16
+ VALUE mErrors, eModBusError, eIllegalFunction,
17
+ eIllegalDataAddress, eIllegalDataValue,
18
+ eSlaveDeviceFailure, eAcknowledge,
19
+ eSlaveDeviceBusy, eNegativeAcknowledge,
20
+ eMemoryParityError, eGatewayProblemPath, eGatewayProblemTarget;
21
+
22
+ void mb_raise_error(int exception)
23
+ {
24
+ switch (exception) {
25
+ case ILLEGAL_FUNCTION:
26
+ rb_raise(eIllegalFunction, "Illegal function code (%i)", ILLEGAL_FUNCTION);
27
+ break;
28
+ case ILLEGAL_DATA_ADDRESS:
29
+ rb_raise(eIllegalDataAddress, "Illegal data address (%i)", ILLEGAL_DATA_ADDRESS);
30
+ break;
31
+ case ILLEGAL_DATA_VALUE:
32
+ rb_raise(eIllegalDataValue, "Illegal data value (%i)", ILLEGAL_DATA_VALUE);
33
+ break;
34
+ case SLAVE_DEVICE_FAILURE:
35
+ rb_raise(eSlaveDeviceFailure, "Slave device or server failure (%i)", SLAVE_DEVICE_FAILURE);
36
+ break;
37
+ case ACKNOWLEDGE:
38
+ rb_raise(eAcknowledge, "Acknowledge (%i)", ACKNOWLEDGE);
39
+ break;
40
+ case SLAVE_DEVICE_BUSY:
41
+ rb_raise(eSlaveDeviceBusy, "Slave device or server busy (%i)", SLAVE_DEVICE_BUSY);
42
+ break;
43
+ case NEGATIVE_ACKNOWLEDGE:
44
+ rb_raise(eNegativeAcknowledge, "Negative acknowledge (%i)", NEGATIVE_ACKNOWLEDGE);
45
+ break;
46
+ case MEMORY_PARITY_ERROR:
47
+ rb_raise(eMemoryParityError, "Memory parity error (%i)", MEMORY_PARITY_ERROR);
48
+ break;
49
+ case GATEWAY_PROBLEM_PATH:
50
+ rb_raise(eGatewayProblemPath, "Gateway problem path (%i)", GATEWAY_PROBLEM_PATH);
51
+ break;
52
+ case GATEWAY_PROBLEM_TARGET:
53
+ rb_raise(eGatewayProblemTarget, "Gateway problem target (%i)", GATEWAY_PROBLEM_TARGET);
54
+ break;
55
+ case COMM_TIME_OUT:
56
+ rb_raise(eModBusError, "Communication timeout (%i)", COMM_TIME_OUT);
57
+ break;
58
+ case PORT_SOCKET_FAILURE:
59
+ rb_raise(eModBusError, "Port socket failure (%i)", PORT_SOCKET_FAILURE);
60
+ break;
61
+ case SELECT_FAILURE:
62
+ rb_raise(eModBusError, "Select failure (%i)", SELECT_FAILURE);
63
+ break;
64
+ case TOO_MANY_DATA:
65
+ rb_raise(eModBusError, "Too many data (%i)", TOO_MANY_DATA);
66
+ break;
67
+ case INVALID_CRC:
68
+ rb_raise(eModBusError, "Invalid CRC (%i)", INVALID_CRC);
69
+ break;
70
+ case INVALID_EXCEPTION_CODE:
71
+ rb_raise(eModBusError, "Invalid exception code (%i)", INVALID_EXCEPTION_CODE);
72
+ break;
73
+ case CONNECTION_CLOSED:
74
+ rb_raise(eModBusError, "Connection closed (%i)", CONNECTION_CLOSED);
75
+ break;
76
+ default:
77
+ rb_raise(eModBusError, "Unknow exception with code %i", exception);
78
+ }
79
+ }
80
+
81
+
@@ -0,0 +1,24 @@
1
+ /* libmodbus4r - binding use libmodbus for Ruby.
2
+ Copyright (C) 2009 Timin Aleksey
3
+
4
+ This program is free software: you can redistribute it and/or modify
5
+ it under the terms of the GNU General Public License as published by
6
+ the Free Software Foundation, either version 3 of the License, or
7
+ (at your option) any later version.
8
+
9
+ This program is distributed in the hope that it will be useful,
10
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ GNU General Public License for more details. */
13
+
14
+ #ifndef ERRORS_H
15
+ #define ERRORS_H
16
+
17
+ extern VALUE mErrors, eModBusError, eIllegalFunction,
18
+ eIllegalDataAddress, eIllegalDataValue,
19
+ eSlaveDeviceFailure, eAcknowledge,
20
+ eSlaveDeviceBusy, eNegativeAcknowledge,
21
+ eMemoryParityError, eGatewayProblemPath, eGatewayProblemTarget;
22
+
23
+ extern void mb_raise_error(int exception);
24
+ #endif
@@ -1,4 +1,4 @@
1
1
  require 'mkmf'
2
2
 
3
3
  have_library 'modbus'
4
- create_makefile 'modbus4r'
4
+ create_makefile '_modbus4r'
@@ -0,0 +1,225 @@
1
+ /* libmodbus4r - binding use libmodbus for Ruby.
2
+ Copyright (C) 2009 Timin Aleksey
3
+
4
+ This program is free software: you can redistribute it and/or modify
5
+ it under the terms of the GNU General Public License as published by
6
+ the Free Software Foundation, either version 3 of the License, or
7
+ (at your option) any later version.
8
+
9
+ This program is distributed in the hope that it will be useful,
10
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ GNU General Public License for more details. */
13
+
14
+ #include "modbus4r.h"
15
+ #include "errors.h"
16
+
17
+ VALUE mb_mstr_is_closed(VALUE self)
18
+ {
19
+ modbus_param_t *mb_param;
20
+ Data_Get_Struct(self, modbus_param_t, mb_param);
21
+
22
+ if (read(mb_param->fd, NULL, 0) || mb_param->fd == 0) {
23
+ return Qtrue;
24
+ }
25
+ return Qfalse;
26
+ }
27
+
28
+ VALUE mb_mstr_connect(VALUE self)
29
+ {
30
+ modbus_param_t *mb_param;
31
+ Data_Get_Struct(self, modbus_param_t, mb_param);
32
+
33
+ if (modbus_connect(mb_param)) {
34
+ rb_raise(eModBusError, "Connection refused");
35
+ }
36
+ return self;
37
+ }
38
+
39
+ VALUE mb_mstr_close(VALUE self)
40
+ {
41
+ modbus_param_t *mb_param;
42
+ Data_Get_Struct(self, modbus_param_t, mb_param);
43
+
44
+ modbus_close(mb_param);
45
+
46
+ return self;
47
+ }
48
+
49
+ VALUE mb_mstr_read_coil(VALUE self, VALUE slave,
50
+ VALUE start_addr, VALUE nb,
51
+ int (*func)(modbus_param_t*, int, int, int, uint8_t*))
52
+ {
53
+ modbus_param_t *mb_param;
54
+ Data_Get_Struct(self, modbus_param_t, mb_param);
55
+
56
+ slave = rb_funcall(slave, rb_intern("to_i"), 0);
57
+ start_addr = rb_funcall(start_addr, rb_intern("to_i"), 0);
58
+ nb = rb_funcall(nb, rb_intern("to_i"), 0);
59
+
60
+ uint8_t dest[FIX2INT(nb)];
61
+ int status = (*func)(mb_param, FIX2INT(slave), FIX2INT(start_addr), FIX2INT(nb), dest);
62
+
63
+ if (status < 0) {
64
+ mb_raise_error(status);
65
+ }
66
+
67
+ int i;
68
+ VALUE ret = rb_ary_new();
69
+ for (i = 0; i < FIX2INT(nb); i++) {
70
+ dest[i] == 1 ? rb_ary_push(ret, Qtrue) : rb_ary_push(ret, Qfalse);
71
+ }
72
+
73
+ return ret;
74
+ }
75
+
76
+ VALUE mb_mstr_read_coil_status(VALUE self, VALUE slave,
77
+ VALUE start_addr, VALUE nb)
78
+ {
79
+ return mb_mstr_read_coil(self, slave, start_addr, nb,
80
+ read_coil_status);
81
+ }
82
+
83
+ VALUE mb_mstr_read_input_status(VALUE self, VALUE slave,
84
+ VALUE start_addr, VALUE nb)
85
+ {
86
+ return mb_mstr_read_coil(self, slave, start_addr, nb,
87
+ read_input_status);
88
+ }
89
+
90
+ VALUE mb_mstr_read_registers(VALUE self, VALUE slave,
91
+ VALUE start_addr, VALUE nb,
92
+ int (*func)(modbus_param_t*, int, int, int, uint16_t*))
93
+ {
94
+ modbus_param_t *mb_param;
95
+ Data_Get_Struct(self, modbus_param_t, mb_param);
96
+
97
+ slave = rb_funcall(slave, rb_intern("to_i"), 0);
98
+ start_addr = rb_funcall(start_addr, rb_intern("to_i"), 0);
99
+ nb = rb_funcall(nb, rb_intern("to_i"), 0);
100
+
101
+ uint16_t dest[FIX2INT(nb)];
102
+ int status = (*func)(mb_param, FIX2INT(slave), FIX2INT(start_addr), FIX2INT(nb), dest);
103
+
104
+ if (status < 0) {
105
+ mb_raise_error(status);
106
+ }
107
+
108
+ int i;
109
+ VALUE ret = rb_ary_new();
110
+ for (i = 0; i < FIX2INT(nb); i++) {
111
+ rb_ary_push(ret, INT2FIX(dest[i]));
112
+ }
113
+
114
+
115
+ return ret;
116
+ }
117
+
118
+ VALUE mb_mstr_read_holding_registers(VALUE self, VALUE slave,
119
+ VALUE start_addr, VALUE nb)
120
+ {
121
+ return mb_mstr_read_registers(self, slave, start_addr, nb,
122
+ read_holding_registers);
123
+ }
124
+
125
+ VALUE mb_mstr_read_input_registers(VALUE self, VALUE slave,
126
+ VALUE start_addr, VALUE nb)
127
+ {
128
+ return mb_mstr_read_registers(self, slave, start_addr, nb,
129
+ read_input_registers);
130
+ }
131
+
132
+ VALUE mb_mstr_force_single_coil(VALUE self, VALUE slave,
133
+ VALUE coil_addr, VALUE state)
134
+ {
135
+ modbus_param_t *mb_param;
136
+ Data_Get_Struct(self, modbus_param_t, mb_param);
137
+
138
+ slave = rb_funcall(slave, rb_intern("to_i"), 0);
139
+ coil_addr = rb_funcall(coil_addr, rb_intern("to_i"), 0);
140
+
141
+ int status = force_single_coil(mb_param, FIX2INT(slave), FIX2INT(coil_addr), (state == Qfalse ? 0 : 1));
142
+
143
+ if (status < 0) {
144
+ mb_raise_error(status);
145
+ }
146
+
147
+ return self;
148
+ }
149
+
150
+
151
+ VALUE mb_mstr_preset_single_register(VALUE self, VALUE slave,
152
+ VALUE reg_addr, VALUE value)
153
+ {
154
+ modbus_param_t *mb_param;
155
+ Data_Get_Struct(self, modbus_param_t, mb_param);
156
+
157
+ slave = rb_funcall(slave, rb_intern("to_i"), 0);
158
+ reg_addr = rb_funcall(reg_addr, rb_intern("to_i"), 0);
159
+ value = rb_funcall(value, rb_intern("to_i"), 0);
160
+
161
+ int status = preset_single_register(mb_param, FIX2INT(slave), FIX2INT(reg_addr), FIX2INT(value));
162
+
163
+ if (status < 0) {
164
+ mb_raise_error(status);
165
+ }
166
+
167
+ return self;
168
+ }
169
+
170
+ VALUE mb_mstr_force_multiple_coils(VALUE self, VALUE slave,
171
+ VALUE start_addr, VALUE data)
172
+ {
173
+ modbus_param_t *mb_param;
174
+ Data_Get_Struct(self, modbus_param_t, mb_param);
175
+
176
+ slave = rb_funcall(slave, rb_intern("to_i"), 0);
177
+ start_addr = rb_funcall(start_addr, rb_intern("to_i"), 0);
178
+ data = rb_funcall(data, rb_intern("to_a"), 0);
179
+
180
+ uint8_t buf[RARRAY_LEN(data)];
181
+ VALUE *ary = RARRAY_PTR(data);
182
+ int i;
183
+
184
+ for (i = 0; i < RARRAY_LEN(data); i++) {
185
+ buf[i] = (*ary == Qfalse ? 0 : 1);
186
+ ary++;
187
+ }
188
+
189
+ int status = force_multiple_coils(mb_param, FIX2INT(slave), FIX2INT(start_addr), RARRAY_LEN(data), buf);
190
+
191
+ if (status < 0) {
192
+ mb_raise_error(status);
193
+ }
194
+
195
+ return self;
196
+ }
197
+
198
+ VALUE mb_mstr_preset_multiple_registers(VALUE self, VALUE slave,
199
+ VALUE start_addr, VALUE data)
200
+ {
201
+ modbus_param_t *mb_param;
202
+ Data_Get_Struct(self, modbus_param_t, mb_param);
203
+
204
+ slave = rb_funcall(slave, rb_intern("to_i"), 0);
205
+ start_addr = rb_funcall(start_addr, rb_intern("to_i"), 0);
206
+ data = rb_funcall(data, rb_intern("to_a"), 0);
207
+
208
+ uint16_t buf[RARRAY_LEN(data)];
209
+ VALUE *ary = RARRAY_PTR(data);
210
+ int i;
211
+
212
+ for (i = 0; i < RARRAY_LEN(data); i++) {
213
+ *ary = rb_funcall(*ary, rb_intern("to_i"), 0);
214
+ buf[i] = FIX2INT(*ary);
215
+ ary++;
216
+ }
217
+
218
+ int status = preset_multiple_registers(mb_param, FIX2INT(slave), FIX2INT(start_addr), RARRAY_LEN(data), buf);
219
+
220
+ if (status < 0) {
221
+ mb_raise_error(status);
222
+ }
223
+
224
+ return self;
225
+ }
@@ -0,0 +1,36 @@
1
+ /* libmodbus4r - binding use libmodbus for Ruby.
2
+ Copyright (C) 2009 Timin Aleksey
3
+
4
+ This program is free software: you can redistribute it and/or modify
5
+ it under the terms of the GNU General Public License as published by
6
+ the Free Software Foundation, either version 3 of the License, or
7
+ (at your option) any later version.
8
+
9
+ This program is distributed in the hope that it will be useful,
10
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ GNU General Public License for more details. */
13
+
14
+ #ifndef MASTER_H
15
+ #define MASTER_H
16
+
17
+ extern VALUE mb_mstr_is_closed(VALUE self);
18
+ extern VALUE mb_mstr_connect(VALUE self);
19
+ extern VALUE mb_mstr_close(VALUE self);
20
+ extern VALUE mb_mstr_read_coil_status(VALUE self, VALUE slave,
21
+ VALUE start_addr, VALUE nb);
22
+ extern VALUE mb_mstr_read_input_status(VALUE self, VALUE slave,
23
+ VALUE start_addr, VALUE nb);
24
+ extern VALUE mb_mstr_read_holding_registers(VALUE self, VALUE slave,
25
+ VALUE start_addr, VALUE nb);
26
+ extern VALUE mb_mstr_read_input_registers(VALUE self, VALUE slave,
27
+ VALUE start_addr, VALUE nb);
28
+ extern VALUE mb_mstr_force_single_coil(VALUE self, VALUE slave,
29
+ VALUE coil_addr, VALUE state);
30
+ extern VALUE mb_mstr_preset_single_register(VALUE self, VALUE slave,
31
+ VALUE reg_addr, VALUE value);
32
+ extern VALUE mb_mstr_force_multiple_coils(VALUE self, VALUE slave,
33
+ VALUE start_addr, VALUE data);
34
+ extern VALUE mb_mstr_preset_multiple_registers(VALUE self, VALUE slave,
35
+ VALUE start_addr, VALUE data);
36
+ #endif
@@ -0,0 +1,79 @@
1
+ /* libmodbus4r - binding use libmodbus for Ruby.
2
+ Copyright (C) 2009 Timin Aleksey
3
+
4
+ This program is free software: you can redistribute it and/or modify
5
+ it under the terms of the GNU General Public License as published by
6
+ the Free Software Foundation, either version 3 of the License, or
7
+ (at your option) any later version.
8
+
9
+ This program is distributed in the hope that it will be useful,
10
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ GNU General Public License for more details. */
13
+
14
+ #include "modbus4r.h"
15
+ #include "errors.h"
16
+ #include "master.h"
17
+ #include "tcp_master.h"
18
+ #include "rtu_master.h"
19
+
20
+ VALUE mModBus, cMaster, cTCPMaster, cRTUMaster;
21
+
22
+ void Init__modbus4r()
23
+ {
24
+ mModBus = rb_define_module("ModBus");
25
+ /* Master */
26
+ cMaster = rb_define_class_under(mModBus, "Master", rb_cObject);
27
+ rb_define_method(cMaster, "closed?", mb_mstr_is_closed, 0);
28
+ rb_define_method(cMaster, "connect", mb_mstr_connect, 0);
29
+ rb_define_method(cMaster, "close", mb_mstr_close, 0);
30
+ rb_define_method(cMaster, "read_coil_status",
31
+ mb_mstr_read_coil_status, 3);
32
+ rb_define_method(cMaster, "read_input_status",
33
+ mb_mstr_read_input_status, 3);
34
+ rb_define_method(cMaster, "read_holding_registers",
35
+ mb_mstr_read_holding_registers, 3);
36
+ rb_define_method(cMaster, "read_input_registers",
37
+ mb_mstr_read_holding_registers, 3);
38
+ rb_define_method(cMaster, "force_single_coil",
39
+ mb_mstr_force_single_coil, 3);
40
+ rb_define_method(cMaster, "preset_single_register",
41
+ mb_mstr_preset_single_register, 3);
42
+ rb_define_method(cMaster, "force_multiple_coils",
43
+ mb_mstr_force_multiple_coils, 3);
44
+ rb_define_method(cMaster, "preset_multiple_registers",
45
+ mb_mstr_preset_multiple_registers, 3);
46
+
47
+ /* TCPMaster */
48
+ cTCPMaster = rb_define_class_under(mModBus, "TCPMaster", cMaster);
49
+ rb_define_singleton_method(cTCPMaster, "new", mb_tcp_mstr_new, 2);
50
+
51
+ /* RTUMaster */
52
+ cRTUMaster = rb_define_class_under(mModBus, "RTUMaster", cMaster);
53
+ rb_define_singleton_method(cRTUMaster, "new", mb_rtu_mstr_new, 5);
54
+
55
+ /* Errors */
56
+ mErrors = rb_define_module_under(mModBus, "Errors");
57
+ eModBusError = rb_define_class_under(mErrors, "ModBusError",
58
+ rb_eStandardError);
59
+ eIllegalFunction = rb_define_class_under(mErrors, "IllegalFunction",
60
+ eModBusError);
61
+ eIllegalDataAddress = rb_define_class_under(mErrors, "IllegalDataAddress",
62
+ eModBusError);
63
+ eIllegalDataValue = rb_define_class_under(mErrors, "IllegalDataValue",
64
+ eModBusError);
65
+ eSlaveDeviceFailure = rb_define_class_under(mErrors, "SlaveDeviceFailure",
66
+ eModBusError);
67
+ eAcknowledge = rb_define_class_under(mErrors, "Acknowledge",
68
+ eModBusError);
69
+ eSlaveDeviceBusy = rb_define_class_under(mErrors, "SlaveDeviceBusy",
70
+ eModBusError);
71
+ eNegativeAcknowledge = rb_define_class_under(mErrors, "NegativeAcknowledge",
72
+ eModBusError);
73
+ eMemoryParityError = rb_define_class_under(mErrors, "MemoryParityError",
74
+ eModBusError);
75
+ eGatewayProblemPath = rb_define_class_under(mErrors, "GatewayProblemPath",
76
+ eModBusError);
77
+ eGatewayProblemTarget = rb_define_class_under(mErrors, "GatewayProblemTarget",
78
+ eModBusError);
79
+ }
@@ -0,0 +1,21 @@
1
+ /* libmodbus4r - binding use libmodbus for Ruby.
2
+ Copyright (C) 2009 Timin Aleksey
3
+
4
+ This program is free software: you can redistribute it and/or modify
5
+ it under the terms of the GNU General Public License as published by
6
+ the Free Software Foundation, either version 3 of the License, or
7
+ (at your option) any later version.
8
+
9
+ This program is distributed in the hope that it will be useful,
10
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ GNU General Public License for more details. */
13
+
14
+ #ifndef MODBUS_H
15
+ #define MODBUS_H
16
+
17
+ #include "ruby/ruby.h"
18
+ #include "ruby/intern.h"
19
+ #include "modbus/modbus.h"
20
+
21
+ #endif
@@ -0,0 +1,38 @@
1
+ /* libmodbus4r - binding use libmodbus for Ruby.
2
+ Copyright (C) 2009 Timin Aleksey
3
+
4
+ This program is free software: you can redistribute it and/or modify
5
+ it under the terms of the GNU General Public License as published by
6
+ the Free Software Foundation, either version 3 of the License, or
7
+ (at your option) any later version.
8
+
9
+ This program is distributed in the hope that it will be useful,
10
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ GNU General Public License for more details. */
13
+
14
+ #include "modbus4r.h"
15
+
16
+ void mb_rtu_mstr_free(modbus_param_t *mb_param )
17
+ {
18
+ modbus_close(mb_param);
19
+ free(mb_param);
20
+ }
21
+
22
+ VALUE mb_rtu_mstr_new(VALUE self, VALUE device, VALUE baud,
23
+ VALUE parity, VALUE data_bit, VALUE stop_bit)
24
+ {
25
+ modbus_param_t *mb_param;
26
+
27
+ mb_param = malloc(sizeof(modbus_param_t));
28
+ device = rb_funcall(device, rb_intern("to_s"), 0);
29
+ baud = rb_funcall(baud, rb_intern("to_i"), 0);
30
+ parity = rb_funcall(parity, rb_intern("to_s"), 0);
31
+ data_bit = rb_funcall(data_bit, rb_intern("to_i"), 0);
32
+ stop_bit = rb_funcall(stop_bit, rb_intern("to_i"), 0);
33
+
34
+ modbus_init_rtu(mb_param, RSTRING_PTR(device), FIX2INT(baud),
35
+ RSTRING_PTR(parity), FIX2INT(data_bit), FIX2INT(stop_bit));
36
+
37
+ return Data_Wrap_Struct(self, 0, mb_rtu_mstr_free, mb_param);
38
+ }
@@ -0,0 +1,20 @@
1
+ /* libmodbus4r - binding use libmodbus for Ruby.
2
+ Copyright (C) 2009 Timin Aleksey
3
+
4
+ This program is free software: you can redistribute it and/or modify
5
+ it under the terms of the GNU General Public License as published by
6
+ the Free Software Foundation, either version 3 of the License, or
7
+ (at your option) any later version.
8
+
9
+ This program is distributed in the hope that it will be useful,
10
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ GNU General Public License for more details. */
13
+
14
+ #ifndef RTU_MASTER_H
15
+ #define RTU_MASTER_H
16
+
17
+ extern VALUE mb_rtu_mstr_new(VALUE self, VALUE device, VALUE baud,
18
+ VALUE parity, VALUE data_bit, VALUE stop_bit);
19
+
20
+ #endif
@@ -0,0 +1,33 @@
1
+ /* libmodbus4r - binding use libmodbus for Ruby.
2
+ Copyright (C) 2009 Timin Aleksey
3
+
4
+ This program is free software: you can redistribute it and/or modify
5
+ it under the terms of the GNU General Public License as published by
6
+ the Free Software Foundation, either version 3 of the License, or
7
+ (at your option) any later version.
8
+
9
+ This program is distributed in the hope that it will be useful,
10
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ GNU General Public License for more details. */
13
+
14
+ #include "modbus4r.h"
15
+
16
+ void mb_tcp_mstr_free(modbus_param_t *mb_param )
17
+ {
18
+ modbus_close(mb_param);
19
+ free(mb_param);
20
+ }
21
+
22
+ VALUE mb_tcp_mstr_new(VALUE self, VALUE ip_address, VALUE port)
23
+ {
24
+ modbus_param_t *mb_param;
25
+
26
+ mb_param = malloc(sizeof(modbus_param_t));
27
+ ip_address = rb_funcall(ip_address, rb_intern("to_s"), 0);
28
+ port = rb_funcall(port, rb_intern("to_i"), 0);
29
+
30
+ modbus_init_tcp(mb_param, RSTRING_PTR(ip_address), FIX2INT(port));
31
+
32
+ return Data_Wrap_Struct(self, 0, mb_tcp_mstr_free, mb_param);
33
+ }
@@ -0,0 +1,19 @@
1
+ /* libmodbus4r - binding use libmodbus for Ruby.
2
+ Copyright (C) 2009 Timin Aleksey
3
+
4
+ This program is free software: you can redistribute it and/or modify
5
+ it under the terms of the GNU General Public License as published by
6
+ the Free Software Foundation, either version 3 of the License, or
7
+ (at your option) any later version.
8
+
9
+ This program is distributed in the hope that it will be useful,
10
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ GNU General Public License for more details. */
13
+
14
+ #ifndef TCP_MASTER_H
15
+ #define TCP_MASTER_H
16
+
17
+ extern VALUE mb_tcp_mstr_new(VALUE self, VALUE ip_address, VALUE port);
18
+
19
+ #endif
@@ -0,0 +1,14 @@
1
+ #libmodbus4r - binding use libmodbus for Ruby.
2
+ #Copyright (C) 2009 Timin Aleksey
3
+
4
+ #This program is free software: you can redistribute it and/or modify
5
+ #it under the terms of the GNU General Public License as published by
6
+ #the Free Software Foundation, either version 3 of the License, or
7
+ #(at your option) any later version.
8
+
9
+ #This program is distributed in the hope that it will be useful,
10
+ #but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ #GNU General Public License for more details. */
13
+
14
+ require '_modbus4r'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: libmodbus4r
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aleksey Timin
@@ -9,7 +9,7 @@ autorequire: libmodbus4r
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-07-30 00:00:00 +06:00
12
+ date: 2009-08-10 00:00:00 +06:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -22,16 +22,29 @@ extensions:
22
22
  extra_rdoc_files:
23
23
  - README
24
24
  - LICENSE
25
- - ChangeLog
25
+ - NEWS
26
+ - TODO
26
27
  files:
27
- - lib/modbus4r.so
28
+ - lib/modbus4r.rb
28
29
  - examples/use_rtu_master.rb
29
30
  - examples/use_tcp_master.rb
30
31
  - spec/rtu_master_spec.rb
31
32
  - spec/tcp_master_spec.rb
33
+ - ext/tcp_master.c
34
+ - ext/errors.c
35
+ - ext/modbus4r.h
36
+ - ext/extconf.rb
37
+ - ext/master.h
38
+ - ext/rtu_master.c
39
+ - ext/tcp_master.h
40
+ - ext/rtu_master.h
41
+ - ext/master.c
42
+ - ext/errors.h
43
+ - ext/modbus4r.c
32
44
  - README
33
45
  - LICENSE
34
- - ChangeLog
46
+ - NEWS
47
+ - TODO
35
48
  has_rdoc: true
36
49
  homepage:
37
50
  licenses: []
data/ChangeLog DELETED
@@ -1,8 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
-
3
- 2009-07-30 Timin Aleksey <atimin@gmail.com>
4
- * ext/master.c, ext/master.h, ext/tcp_master.c, ext/tcp_master.h, ext/rtu_master.c, ext/rtu_master,h : Create base Master class for TCPMaster and RTUMaster
5
- * ext/error.c ext/error.h : Add suppot all exception of libmodbus
6
- * spec/rtu_master_spec.rb: Add test for RTUMaster, but it not run!
7
- * ChageLog: Start log of shanges.
8
-
Binary file