Могу ли я автоматически настроить макет 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 не может (или не хочет) настраивать подчиненное устройство? Может ли конфигурация подчиненного устройства быть автоматизирована?
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(...);
}
}
}
Это, однако, на самом деле не отвечает на вопрос, почему (или если) все это необходимо. Чтобы быть более точным в отношении чистоты: было бы неплохо, если бы можно было избежать Пирамиды Судьбы. Тем более, что я говорю рабу что-то, что он сказал мне одной строкой раньше.