Могу ли я настроить макет PDO (по умолчанию) автоматически?

Если я вызову ecrt_slave_config_reg_pdo_entry для создания смещения домена, я получу сообщение:

Не удалось зарегистрировать запись PDO: нет такого файла или каталога

Я считаю, что мне нужно позвонить ecrt_slave_config_pdos, чего я сейчас не делаю. Однако я не понимаю, почему я должен его вызывать. В моем случае подчиненный, с которым я люблю разговаривать, уже подключен к шине. Если я ввожу ec cstruct -p [SLAVE_POS] в терминал, я получаю макет PDO.

me@here:~$ ec cstruct -p 1
/* Master 0, Slave 1, "..."
 * Vendor ID:       0x...
 * Product code:    0x...
 * Revision number: 0x...
 */

ec_pdo_entry_info_t slave_1_pdo_entries[] = {
    {0x6040, 0x00, 16},
    ...
};

ec_pdo_info_t slave_1_pdos[] = {
    {0x1600, 2, slave_1_pdo_entries + 0},
    ...
};

ec_sync_info_t slave_1_syncs[] = {
    {0, EC_DIR_OUTPUT, 0, NULL, EC_WD_DISABLE},
    ...
    {0xff}
};

Почему я могу получить все входные аргументы для ecrt_slave_config_pdos из команды терминала, а EtherCat не может (или не хочет) настроить сам слейв? Можно ли автоматизировать настройку подчиненного устройства?


person Marian    schedule 23.09.2014    source источник


Ответы (1)


Вы можете использовать функции ecrt_master_get_slave(), ecrt_master_get_sync_manager(), ecrt_master_get_pdo() и (конечно) ecrt_master_get_pdo_entry() для получения всей необходимой информации. ecrt_master_get_sync_manager(), например, не будет устанавливать информацию PDO, но вернет количество позиций PDO для диспетчера синхронизации.

Так что что-то подобное работает для меня (проверки кода ошибки опущены для ясности):

ecrt_master_get_slave(..., &slaveInformation);

// For every synchronization manager...
for (size_t syncIndex = 0; syncIndex < slaveInformation.sync_count; ++syncIndex) {
    ecrt_master_get_sync_manager(..., &syncInformation);
    ecrt_slave_config_sync_manager(...);

    // For every PDO field...
    for (size_t pdoIndex = 0; pdoIndex < syncInformation.n_pdos; ++pdoIndex) {
        ecrt_master_get_pdo(..., &pdoInformation);
        ecrt_slave_config_pdo_assign_add(...);

        // For every entry in the pdo field...
        for (size_t entryIndex = 0; entryIndex < pdoInformation.n_entries; ++entryIndex) {
            ecrt_master_get_pdo_entry(..., &entryInformation);
            ecrt_slave_config_pdo_mapping_add(...);
        }
    }
}

Это, однако, на самом деле не отвечает на вопрос, зачем (или нужно ли) все это. Конкретно по чистильщику: было бы неплохо, если бы можно было избежать Пирамиды Судьбы. Тем более, что я говорю рабу то, что он сказал мне одной строкой раньше.

person Marian    schedule 23.09.2014