laurent@2022: /* laurent@2022: * Etherlab Asynchronous execution code laurent@2022: * laurent@2022: * */ laurent@2022: laurent@2022: #include laurent@2022: #include laurent@2022: #include laurent@2022: laurent@2022: #include "ecrt.h" laurent@2022: #include "ec_rtdm.h" laurent@2022: laurent@2022: #ifdef _WINDOWS_H laurent@2022: #include "iec_types.h" laurent@2022: #else laurent@2022: #include "iec_std_lib.h" laurent@2022: #endif laurent@2022: laurent@2022: // declaration of interface variables laurent@2022: %(located_variables_declaration)s laurent@2022: laurent@2022: // Optional features laurent@2022: #define CONFIGURE_PDOS %(configure_pdos)d laurent@2022: laurent@2022: // process data laurent@2022: static uint8_t *domain1_pd = NULL; laurent@2022: %(used_pdo_entry_offset_variables_declaration)s laurent@2022: laurent@2022: const static ec_pdo_entry_reg_t domain1_regs[] = { laurent@2022: %(used_pdo_entry_configuration)s laurent@2022: {} laurent@2022: }; laurent@2022: /*****************************************************************************/ laurent@2022: laurent@2022: #if CONFIGURE_PDOS laurent@2022: %(pdos_configuration_declaration)s laurent@2022: #endif laurent@2022: laurent@2022: int rt_fd = -1; laurent@2022: CstructMstrAttach MstrAttach; laurent@2022: char rt_dev_file[64]; laurent@2022: long long wait_period_ns = 100000LL; laurent@2022: laurent@2022: // EtherCAT laurent@2022: static ec_master_t *master = NULL; laurent@2022: static ec_domain_t *domain1 = NULL; laurent@2022: %(slaves_declaration)s laurent@2022: laurent@2022: /* Beremiz plugin functions */ laurent@2022: int __init_%(location)s(int argc,char **argv) laurent@2022: { laurent@2022: int rtstatus; laurent@2022: laurent@2022: MstrAttach.masterindex = %(master_number)d; laurent@2022: laurent@2022: master = ecrt_request_master(MstrAttach.masterindex); laurent@2022: if (!master) return -1; laurent@2022: laurent@2022: domain1 = ecrt_master_create_domain(master); laurent@2022: if (!domain1) return -1; laurent@2022: laurent@2022: #if CONFIGURE_PDOS laurent@2022: %(slaves_configuration)s laurent@2022: #endif laurent@2022: laurent@2022: if (ecrt_domain_reg_pdo_entry_list(domain1, domain1_regs)) { laurent@2022: fprintf(stderr, "PDO entry registration failed!\n"); laurent@2022: return -1; laurent@2022: } laurent@2022: laurent@2022: sprintf(&rt_dev_file[0],"%%s%%u",EC_RTDM_DEV_FILE_NAME,0); laurent@2022: rt_fd = rt_dev_open( &rt_dev_file[0], 0); laurent@2022: if (rt_fd < 0) { laurent@2022: printf("Can't open %%s\n", &rt_dev_file[0]); laurent@2022: return -1; laurent@2022: } laurent@2022: laurent@2022: // attach the master over rtdm driver laurent@2022: MstrAttach.domainindex = ecrt_domain_index(domain1); laurent@2022: rtstatus = ecrt_rtdm_master_attach(rt_fd, &MstrAttach); laurent@2022: if (rtstatus < 0) { laurent@2022: printf("Cannot attach to master over rtdm\n"); laurent@2022: return -1; laurent@2022: } laurent@2022: laurent@2022: if (ecrt_master_activate(master)) laurent@2022: return -1; laurent@2022: laurent@2022: if (!(domain1_pd = ecrt_domain_data(domain1))) { laurent@2022: fprintf(stderr, "domain1_pd: 0x%%.6lx\n", (unsigned long)domain1_pd); laurent@2022: return -1; laurent@2022: } laurent@2022: laurent@2022: fprintf(stdout, "Master %(master_number)d activated...\n"); laurent@2022: return 0; laurent@2022: } laurent@2022: laurent@2022: void __cleanup_%(location)s(void) laurent@2022: { laurent@2022: if (rt_fd >= 0) { laurent@2022: rt_dev_close(rt_fd); laurent@2022: } dgkang@2024: //release master dgkang@2025: ecrt_release_master(master); laurent@2022: } laurent@2022: laurent@2022: void __retrieve_%(location)s(void) laurent@2022: { laurent@2022: // receive ethercat laurent@2022: ecrt_rtdm_master_recieve(rt_fd); laurent@2022: ecrt_rtdm_domain_process(rt_fd); laurent@2022: laurent@2022: rt_task_sleep(rt_timer_ns2tsc(wait_period_ns)); laurent@2022: laurent@2022: // send process data laurent@2022: ecrt_rtdm_domain_queque(rt_fd); laurent@2022: ecrt_rtdm_master_send(rt_fd); laurent@2022: laurent@2022: %(retrieve_variables)s laurent@2022: } laurent@2022: laurent@2022: void __publish_%(location)s(void) laurent@2022: { laurent@2022: %(publish_variables)s laurent@2022: }