1 /**************************************************************** |
1 /****************************************************************************** |
2 * |
2 * |
3 * e c _ s l a v e . c |
3 * e c _ s l a v e . c |
4 * |
4 * |
5 * Methoden für einen EtherCAT-Slave. |
5 * Methoden für einen EtherCAT-Slave. |
6 * |
6 * |
7 * $Date$ |
7 * $Id$ |
8 * $Author$ |
|
9 * |
8 * |
10 ***************************************************************/ |
9 *****************************************************************************/ |
11 |
10 |
12 #include <linux/module.h> |
11 #include <linux/module.h> |
13 |
12 |
14 #include "ec_globals.h" |
13 #include "ec_globals.h" |
15 #include "ec_slave.h" |
14 #include "ec_slave.h" |
16 |
15 |
17 /***************************************************************/ |
16 /*****************************************************************************/ |
18 |
17 |
19 /** |
18 /** |
20 EtherCAT-Slave-Konstruktor. |
19 EtherCAT-Slave-Konstruktor. |
21 |
20 |
22 Initialisiert einen EtherCAT-Slave. |
21 Initialisiert einen EtherCAT-Slave. |
27 void EtherCAT_slave_init(EtherCAT_slave_t *slave) |
26 void EtherCAT_slave_init(EtherCAT_slave_t *slave) |
28 { |
27 { |
29 slave->type = 0; |
28 slave->type = 0; |
30 slave->revision = 0; |
29 slave->revision = 0; |
31 slave->build = 0; |
30 slave->build = 0; |
32 |
|
33 slave->ring_position = 0; |
31 slave->ring_position = 0; |
34 slave->station_address = 0; |
32 slave->station_address = 0; |
35 |
|
36 slave->vendor_id = 0; |
33 slave->vendor_id = 0; |
37 slave->product_code = 0; |
34 slave->product_code = 0; |
38 slave->revision_number = 0; |
35 slave->revision_number = 0; |
39 slave->serial_number = 0; |
36 slave->serial_number = 0; |
40 |
37 slave->desc = NULL; |
41 slave->desc = 0; |
|
42 |
|
43 slave->logical_address0 = 0; |
38 slave->logical_address0 = 0; |
44 |
|
45 slave->current_state = ECAT_STATE_UNKNOWN; |
39 slave->current_state = ECAT_STATE_UNKNOWN; |
46 slave->requested_state = ECAT_STATE_UNKNOWN; |
40 slave->requested_state = ECAT_STATE_UNKNOWN; |
|
41 slave->error_reported = 0; |
47 } |
42 } |
48 |
43 |
49 /***************************************************************/ |
44 /*****************************************************************************/ |
50 |
45 |
51 /** |
46 /** |
52 EtherCAT-Slave-Destruktor. |
47 EtherCAT-Slave-Destruktor. |
53 |
48 |
54 Im Moment ohne Funktionalität. |
49 Im Moment ohne Funktionalität. |
79 */ |
74 */ |
80 |
75 |
81 int EtherCAT_read_value(EtherCAT_slave_t *slave, |
76 int EtherCAT_read_value(EtherCAT_slave_t *slave, |
82 unsigned int channel) |
77 unsigned int channel) |
83 { |
78 { |
84 if (!slave->desc) |
79 if (unlikely(!slave->desc)) { |
85 { |
80 if (likely(slave->error_reported)) { |
86 printk(KERN_WARNING "EtherCAT: Reading failed on slave %04X (addr %0X)" |
81 printk(KERN_WARNING "EtherCAT: Reading failed on slave %04X (addr %0X)" |
87 " - Slave has no description.\n", |
82 " - Slave has no description.\n", |
88 slave->station_address, (unsigned int) slave); |
83 slave->station_address, (unsigned int) slave); |
|
84 slave->error_reported = 1; |
|
85 } |
89 return 0; |
86 return 0; |
90 } |
87 } |
91 |
88 |
92 if (!slave->desc->read) |
89 if (unlikely(!slave->desc->read)) { |
93 { |
90 if (likely(slave->error_reported)) { |
94 printk(KERN_WARNING "EtherCAT: Reading failed on slave %04X (addr %0X)" |
91 printk(KERN_WARNING "EtherCAT: Reading failed on slave %04X (addr %0X)" |
95 " - Slave type (%s %s) has no read method.\n", |
92 " - Slave type (%s %s) has no read method.\n", |
96 slave->station_address, (unsigned int) slave, |
93 slave->station_address, (unsigned int) slave, |
97 slave->desc->vendor_name, slave->desc->product_name); |
94 slave->desc->vendor_name, slave->desc->product_name); |
|
95 slave->error_reported = 1; |
|
96 } |
98 return 0; |
97 return 0; |
99 } |
98 } |
100 |
99 |
101 if (channel >= slave->desc->channels) |
100 if (unlikely(channel >= slave->desc->channels)) { |
102 { |
101 if (likely(slave->error_reported)) { |
103 printk(KERN_WARNING "EtherCAT: Reading failed on slave %4X (addr %0X)" |
102 printk(KERN_WARNING "EtherCAT: Reading failed on slave %4X (addr %0X)" |
104 " - Type (%s %s) has no channel %i.\n", |
103 " - Type (%s %s) has no channel %i.\n", |
105 slave->station_address, (unsigned int) slave, |
104 slave->station_address, (unsigned int) slave, |
106 slave->desc->vendor_name, slave->desc->product_name, |
105 slave->desc->vendor_name, slave->desc->product_name, |
107 channel); |
106 channel); |
|
107 slave->error_reported = 1; |
|
108 } |
108 return 0; |
109 return 0; |
109 } |
110 } |
|
111 |
|
112 if (unlikely(slave->error_reported)) |
|
113 slave->error_reported = 0; |
110 |
114 |
111 return slave->desc->read(slave->process_data, channel); |
115 return slave->desc->read(slave->process_data, channel); |
112 } |
116 } |
113 |
117 |
114 /***************************************************************/ |
118 /*****************************************************************************/ |
115 |
119 |
116 /** |
120 /** |
117 Schreibt einen bestimmten Kanal des Slaves als Integer-Wert . |
121 Schreibt einen bestimmten Kanal des Slaves als Integer-Wert . |
118 |
122 |
119 Prüft zuerst, ob der entsprechende Slave eine |
123 Prüft zuerst, ob der entsprechende Slave eine |
129 |
133 |
130 void EtherCAT_write_value(EtherCAT_slave_t *slave, |
134 void EtherCAT_write_value(EtherCAT_slave_t *slave, |
131 unsigned int channel, |
135 unsigned int channel, |
132 int value) |
136 int value) |
133 { |
137 { |
134 if (!slave->desc) |
138 if (unlikely(!slave->desc)) { |
135 { |
139 if (likely(slave->error_reported)) { |
136 printk(KERN_WARNING "EtherCAT: Writing failed on slave %04X (addr %0X)" |
140 printk(KERN_WARNING "EtherCAT: Writing failed on slave %04X (addr %0X)" |
137 " - Slave has no description.\n", |
141 " - Slave has no description.\n", |
138 slave->station_address, (unsigned int) slave); |
142 slave->station_address, (unsigned int) slave); |
|
143 slave->error_reported = 1; |
|
144 } |
139 return; |
145 return; |
140 } |
146 } |
141 |
147 |
142 if (!slave->desc->write) |
148 if (unlikely(!slave->desc->write)) { |
143 { |
149 if (likely(slave->error_reported)) { |
144 printk(KERN_WARNING "EtherCAT: Writing failed on slave %04X (addr %0X)" |
150 printk(KERN_WARNING "EtherCAT: Writing failed on slave %04X (addr %0X)" |
145 " - Type (%s %s) has no write method.\n", |
151 " - Type (%s %s) has no write method.\n", |
146 slave->station_address, (unsigned int) slave, |
152 slave->station_address, (unsigned int) slave, |
147 slave->desc->vendor_name, slave->desc->product_name); |
153 slave->desc->vendor_name, slave->desc->product_name); |
|
154 slave->error_reported = 1; |
|
155 } |
148 return; |
156 return; |
149 } |
157 } |
150 |
158 |
151 if (channel >= slave->desc->channels) |
159 if (unlikely(channel >= slave->desc->channels)) { |
152 { |
160 if (likely(slave->error_reported)) { |
153 printk(KERN_WARNING "EtherCAT: Writing failed on slave %4X (addr %0X)" |
161 printk(KERN_WARNING "EtherCAT: Writing failed on slave %4X (addr %0X)" |
154 " - Type (%s %s) has no channel %i.\n", |
162 " - Type (%s %s) has no channel %i.\n", |
155 slave->station_address, (unsigned int) slave, |
163 slave->station_address, (unsigned int) slave, |
156 slave->desc->vendor_name, slave->desc->product_name, |
164 slave->desc->vendor_name, slave->desc->product_name, |
157 channel); |
165 channel); |
|
166 slave->error_reported = 1; |
|
167 } |
158 return; |
168 return; |
159 } |
169 } |
|
170 |
|
171 if (unlikely(slave->error_reported)) |
|
172 slave->error_reported = 0; |
160 |
173 |
161 slave->desc->write(slave->process_data, channel, value); |
174 slave->desc->write(slave->process_data, channel, value); |
162 } |
175 } |
163 |
176 |
164 /***************************************************************/ |
177 /*****************************************************************************/ |
165 |
178 |
166 EXPORT_SYMBOL(EtherCAT_write_value); |
179 EXPORT_SYMBOL(EtherCAT_write_value); |
167 EXPORT_SYMBOL(EtherCAT_read_value); |
180 EXPORT_SYMBOL(EtherCAT_read_value); |
|
181 |
|
182 /*****************************************************************************/ |