fp@0: /**************************************************************** fp@0: * fp@0: * e c _ s l a v e . c fp@0: * fp@0: * Methoden für einen EtherCAT-Slave. fp@0: * fp@0: * $Date$ fp@0: * $Author$ fp@0: * fp@0: ***************************************************************/ fp@0: fp@24: #include fp@0: fp@0: #include "ec_globals.h" fp@0: #include "ec_slave.h" fp@0: #include "ec_dbg.h" fp@0: fp@0: /***************************************************************/ fp@0: fp@0: /** fp@0: EtherCAT-Slave-Konstruktor. fp@0: fp@0: Initialisiert einen EtherCAT-Slave. fp@0: fp@0: @param slave Zeiger auf den zu initialisierenden Slave fp@0: */ fp@0: fp@0: void EtherCAT_slave_init(EtherCAT_slave_t *slave) fp@0: { fp@0: slave->type = 0; fp@0: slave->revision = 0; fp@0: slave->build = 0; fp@0: fp@0: slave->ring_position = 0; fp@0: slave->station_address = 0; fp@0: fp@0: slave->vendor_id = 0; fp@0: slave->product_code = 0; fp@0: slave->revision_number = 0; fp@5: slave->serial_number = 0; fp@5: fp@0: slave->desc = 0; fp@5: fp@0: slave->logical_address0 = 0; fp@0: fp@0: slave->current_state = ECAT_STATE_UNKNOWN; fp@0: slave->requested_state = ECAT_STATE_UNKNOWN; fp@0: } fp@0: fp@0: /***************************************************************/ fp@0: fp@0: /** fp@0: EtherCAT-Slave-Destruktor. fp@0: fp@0: Im Moment ohne Funktionalität. fp@0: fp@0: @param slave Zeiger auf den zu zerstörenden Slave fp@0: */ fp@0: fp@0: void EtherCAT_slave_clear(EtherCAT_slave_t *slave) fp@0: { fp@0: // Nothing yet... fp@0: } fp@0: fp@0: /***************************************************************/ fp@0: fp@0: /** fp@0: Liest einen bestimmten Kanal des Slaves als Integer-Wert. fp@0: fp@0: Prüft zuerst, ob der entsprechende Slave eine fp@0: bekannte Beschreibung besitzt, ob dort eine fp@0: read()-Funktion hinterlegt ist und ob die angegebene fp@0: Kanalnummer gültig ist. Wenn ja, wird der dekodierte fp@0: Wert zurückgegeben, sonst ist der Wert 0. fp@0: fp@0: @param slave EtherCAT-Slave fp@0: @param channel Kanalnummer fp@0: fp@0: @return Gelesener Wert bzw. 0 fp@0: */ fp@0: fp@0: int EtherCAT_read_value(EtherCAT_slave_t *slave, fp@0: unsigned int channel) fp@0: { fp@0: if (!slave->desc) fp@0: { fp@2: EC_DBG(KERN_WARNING "EtherCAT: Reading failed on slave %04X (addr %0X)" fp@2: " - Slave has no description.\n", fp@0: slave->station_address, (unsigned int) slave); fp@0: return 0; fp@0: } fp@0: fp@0: if (!slave->desc->read) fp@0: { fp@2: EC_DBG(KERN_WARNING "EtherCAT: Reading failed on slave %04X (addr %0X)" fp@2: " - Slave type (%s %s) has no read method.\n", fp@2: slave->station_address, (unsigned int) slave, fp@0: slave->desc->vendor_name, slave->desc->product_name); fp@0: return 0; fp@0: } fp@0: fp@0: if (channel >= slave->desc->channels) fp@0: { fp@2: EC_DBG(KERN_WARNING "EtherCAT: Reading failed on slave %4X (addr %0X)" fp@2: " - Type (%s %s) has no channel %i.\n", fp@2: slave->station_address, (unsigned int) slave, fp@2: slave->desc->vendor_name, slave->desc->product_name, fp@2: channel); fp@0: return 0; fp@0: } fp@0: fp@0: return slave->desc->read(slave->process_data, channel); fp@0: } fp@0: fp@0: /***************************************************************/ fp@0: fp@0: /** fp@0: Schreibt einen bestimmten Kanal des Slaves als Integer-Wert . fp@0: fp@0: Prüft zuerst, ob der entsprechende Slave eine fp@0: bekannte Beschreibung besitzt, ob dort eine fp@0: write()-Funktion hinterlegt ist und ob die angegebene fp@0: Kanalnummer gültig ist. Wenn ja, wird der Wert entsprechend fp@0: kodiert und geschrieben. fp@0: fp@0: @param slave EtherCAT-Slave fp@0: @param channel Kanalnummer fp@0: @param value Zu schreibender Wert fp@0: */ fp@0: fp@0: void EtherCAT_write_value(EtherCAT_slave_t *slave, fp@0: unsigned int channel, fp@0: int value) fp@0: { fp@0: if (!slave->desc) fp@0: { fp@2: EC_DBG(KERN_WARNING "EtherCAT: Writing failed on slave %04X (addr %0X)" fp@2: " - Slave has no description.\n", fp@0: slave->station_address, (unsigned int) slave); fp@0: return; fp@0: } fp@0: fp@0: if (!slave->desc->write) fp@0: { fp@2: EC_DBG(KERN_WARNING "EtherCAT: Writing failed on slave %04X (addr %0X)" fp@2: " - Type (%s %s) has no write method.\n", fp@2: slave->station_address, (unsigned int) slave, fp@0: slave->desc->vendor_name, slave->desc->product_name); fp@0: return; fp@0: } fp@0: fp@0: if (channel >= slave->desc->channels) fp@0: { fp@2: EC_DBG(KERN_WARNING "EtherCAT: Writing failed on slave %4X (addr %0X)" fp@2: " - Type (%s %s) has no channel %i.\n", fp@2: slave->station_address, (unsigned int) slave, fp@2: slave->desc->vendor_name, slave->desc->product_name, fp@2: channel); fp@0: return; fp@0: } fp@0: fp@0: slave->desc->write(slave->process_data, channel, value); fp@0: } fp@0: fp@24: /***************************************************************/ fp@24: fp@23: EXPORT_SYMBOL(EtherCAT_write_value); fp@24: EXPORT_SYMBOL(EtherCAT_read_value);