2020-09-04

                       Igh1.5.2 etherCAT接口分析
  1. 用户空间库
    本地应用程序接口驻留在内核空间中,因此只能从内核访问。 为了使应用程序接口在用户空间程序中可用,已经创建了一个用户空间库,该用户空间库可以根据LGPL版本2 [5]的条款和条件链接到程序。
    这个库被命名为libethercat。 它的源代码驻留在lib /子目录中,并且在使用make时默认生成。 它被安装在安装前的lib /路径下,如libethercat.a(用于静态链接),libethercat.la(用于libtool)和libethercat.so(用于动态链接)。
  2. 使用库
    应用程序接口头文件ecrt.h可以在内核和用户上下文中使用。以下简单的显示了如何使用EtherCAT功能构建程序。 整个示例可以在主源文件的examples / user /路径中找到。
    #include <ecrt .h>
    int main (void)
    {
    ec_master_t * master = ecrt_request_master (0);
    if (! master )
    return 1; // error
    pause (); // wait for signal
    return 0;
    }
    该程序可以编译并通过以下命令动态链接到库:
    列表2.1:使用用户空间库的链接器命令
    gcc ethercat .c -o ectest -I/opt/ etherlab / include -L/opt / etherlab /lib -lethercat
    -Wl ,-- rpath -Wl ,/ opt / etherlab /lib
    该库也可以静态编译:
    gcc -static ectest .c -o ectest -I/opt/ etherlab / include
    /opt/ etherlab /lib/ libethercat .a
  3. 实现
    内核API基本上是通过主字符设备传输到用户空间的。内核API的函数调用通过ioctl()接口映射到用户空间。 用户空间API函数共享一组通用的ioctl()调用。 接口的内核部分直接调用相应的API函数,导致最小的附加延迟。
    出于性能方面的原因,实际的域进程数据不会在每次访问时在内核和用户内存之间进行复制:而是将数据映射到用户空间应用程序。主站配置和激活后,主模块会创建一个跨所有域的过程数据存储区,并将其映射到用户空间,以便应用程序可以直接访问过程数据。 因此,从用户空间访问过程数据时不会有额外的延迟。
    内核/用户API差异由于过程数据的内存映射,内存由库函数内部管理。因此,为域提供外部内存是不可能的,例如在内核API中。相应的函数只能在kernelspace中使用。这是在用户空间中使用应用程序接口时唯一的区别。
  4. RTDM接口
    当使用Xenomai或RTAI等实时扩展的用户空间接口时,不推荐使用ioctl(),因为它可能会干扰实时操作。 为此,实时设备模型(RTDM)[17]已经被开发出来。 主模块提供了一个RTDM接口,除了普通的字符设备,如果主源配置了–enable-rtdm。要强制应用程序使用RTDM接口而不是普通字符设备,它必须与libethercat rtdm库而不是libethercat链接。 libethercat rtdm的使用是透明的,所以具有完整API的EtherCAT头ecrt.h可以照常使用。
    为了使代码清单2.1中的例子使用RTDM库,链接器命令必须改变如下:
    gcc ethercat -with - rtdm .c -o ectest -I/opt/ etherlab / include
    -L/ opt/ etherlab / lib - lethercat_rtdm
    -Wl ,-- rpath -Wl ,/ opt/ etherlab / lib
  5. 应用程序接口
    应用程序接口为应用程序提供访问EtherCAT主站的功能和数据结构。 接口的完整文档作为Doxygen [13]注释包含在头文件include/ecrt.h中。 它可以直接从文件注释中读取,也可以作为更舒适的HTML文档读取。
  6. ecrt.h接口分析
    应用程序使用IGH提供的接口时,需要包含“ecrt.h”头文件,该文件中包含了相应的数据结构和函数的声明。ecrt.h提供的接口分为以下几部分:全局函数、主站方法、从站配置方法、域方法、SDO请求方法、VOE处理方法、寄存器请求方法。
    6.1全局函数
    6.1.1 ecrt_version_magic
    功能:返回实时接口的版本信息。
    函数原型:unsigned int ecrt_version_magic(void);
    参数:master_index – 请求的主机的索引
    返回值:成功 – 指向主机的指针;失败 – NULL
    6.1.2 ecrt_request_master
    功能:请求EtherCAT主机进行实时操作。在应用程序可以访问EtherCAT主程序之前,它必须保留一个供独占使用。在用户空间中,这是一个方便ecrt_open_master()和ecrt_master_reserveecrt_open_master()的功能。此函数必须是应用程序调用以使用EtherCAT的第一个函数。 函数以master的索引作为其参数。第一个主有索引0,第n个主有索引n-1。 加载主模块时必须指定主模块的数量。
    函数原型:ec_master_t *ecrt_request_master(unsigned int master_index);
    参数:master_index – 请求的主机的索引
    返回值:成功 – 指向主机的指针;失败 – NULL
    6.1.3 ecrt_release_master
    功能: 释放请求的ethercat主机
    函数原型:void ecrt_release_master(ec_master_t *master);
    参数:master – ethercat主机
    返回值:无

6.2主站方法
6.2.1 ecrt_master_callbacks
功能:设置锁定回调。对于并发主访问,即如果应用程序以外的其他实例希望在总线上发送和接收数据报,应用程序必须提供回调机制。 该方法以两个函数指针作为参数。 异步主访问(如EoE处理)是唯一的如果回调已经设置。发送回调(\a send_cb)的任务是决定总线当前是否可访问,以及是否调用ecrt_master_send_ext()方法。接收回调(\a receive_cb)的任务是决定是否允许调用ecrt_master_receive()并分别执行它。
函数原型:void ecrt_master_callbacks(ec_master_t *master,
void (*send_cb)(void *), void (*receive_cb)(void *),
void *cb_data);
参数:master – ethercat主机;send_cb – 发送回调函数;
receive_cb – 接收回调函数;cb_data – 传递给回调函数的任意指针
返回值:无
6.2.2 ecrt_master_create_domain
功能: 创建新的流程数据域。对于过程数据交换,至少需要一个过程数据域。此方法创建一个新的过程数据域,并返回指向新域对象的指针。该对象可用于注册pdo并在循环操作中交换它们。此方法分配内存,应在ecrt_master_activate()之前在非实时上下文中调用
函数原型:ec_domain_t *ecrt_master_create_domain(ec_master_t *master);
参数:master – ethercat主机
返回值:成功 – 指向新域对象的指针;失败 – NULL
6.2.3 ecrt_master_slave_config
功能: 获取从站的配置,为给定的别名和位置元组创建从属配置对象并返回它。如果存在相同的配置,则重新使用该配置,在后一种情况下,将给定的PID和VID与存储的值进行匹配,如果不匹配,则返回错误。
使用别名和位置参数进行寻址。如果别名为零,则一个位置被解释为所需的从站的环位置。如果别名为非零,则它与给定别名匹配从属别名。在这种情况下,一个位置被解释为从别名开始的环偏移量,因此位置为零表示别名从属对象本身,正值与别名后的第n个从属对象匹配。如果在总线配置过程中找到具有给定地址的从设备,则其供应商ID和产品代码将与给定值相匹配。如果不匹配,则未配置从属服务器,并引发错误消息。如果在总线配置期间,不同的从机配置指向同一从机,则会发出警告,并且只有第一个配置是申请。
这个方法分配内存,并应在ecrt_master_activate()之前在非实时上下文中调用。
函数原型:ec_slave_config_t *ecrt_master_slave_config(
ec_master_t *master, uint16_t alias, uint16_t position,
uint32_t vendor_id, uint32_t product_code );
参数:master – ethercat主机;alias – 从站别名;position – 从站位置;
vendor_id – 厂商ID; product_code – 产品ID
返回值:成功 – 指向从站配置结构的指针;失败 – NULL
6.2.4 ecrt_master_select_reference_clock
功能: 为分布式时钟选择参考时钟,如果某个主节点没有调用此方法,或者配置指针为空,则具有DC功能的第一个从机将提供参考时钟。
函数原型:int ecrt_master_select_reference_clock(
ec_master_t *master, ec_slave_config_t *sc );
参数:master – ethercat主机;sc – 指向从站配置的指针
返回值:成功 – 返回0;失败 – 返回错误代码
6.2.5 ecrt_master
功能: 获取主站信息。此函数的堆上不分配内存。注意指向此结构的指针必须指向有效变量。
函数原型:int ecrt_master(
ec_master_t *master, ec_master_info_t *master_info );
参数:master – ethercat主机;master_info – 指向主机输出信息结构的指针
返回值:成功 – 返回0;失败 – 返回 < 0
6.2.6 ecrt_master_get_slave
功能: 获取从站的信息,尝试找到具有给定环位置的从属对象。获得的信息存储在一个结构中。此函数的堆上不分配内存。
函数原型:int ecrt_master_get_slave(ec_master_t *master,
uint16_t slave_position, ec_slave_info_t *slave_info);
参数:master – ethercat主机;slave_position –从站的位置;slave_info – 指向从站输出信息结构的指针
返回值:成功 – 指向主机的指针;失败 – NULL
6.2.7 ecrt_master_sdo_download
功能: 执行SDO下载请求以将数据写入从站设备。此请求由主状态机处理。此方法会阻塞,直到请求被处理,并且可能不会在实时上下文中调用。
函数原型:int ecrt_master_sdo_download(ec_master_t *master,
uint16_t slave_position, uint16_t index, uint8_t subindex, uint8_t *data, size_t data_size, uint32_t *abort_code);
参数:master – ethercat主机;slave_position --从站的位置;index – SDO索引;subindex – SDO子索引;data – 下载的缓冲区;data_size – 缓冲区的大小;abort_code – 中止SDO下载代码
返回值:成功 – 返回0;失败 – 返回 < 0
6.2.8 ecrt_master_sdo_download_complete
功能: 执行SDO下载请求,通过完全访问将数据写入从设备。此请求由主状态机处理。此方法会阻塞,直到请求被处理,并且可能不会在实时上下文中调用。
函数原型:int ecrt_master_sdo_download_complete(
ec_master_t *master, uint16_t slave_position, uint16_t index, uint8_t *data, size_t data_size, uint32_t *abort_code);
参数:master – ethercat主机;slave_position --从站的位置;index – SDO索引; data – 下载的缓冲区;data_size – 缓冲区的大小;abort_code – 中止SDO下载代码
返回值:成功 – 返回0;失败 – 返回 < 0
6.2.9 ecrt_master_sdo_upload
功能: 执行SDO 上传请求以从服务器读取数据。此请求由主状态机处理。此方法会被阻塞,直到请求被处理。
函数原型:int ecrt_master_sdo_upload(ec_master_t *master,
uint16_t slave_position, uint16_t index, uint8_t subindex, uint8_t *target, size_t target_size, size_t *result_size, uint32_t *abort_code);
参数:master – ethercat主机;slave_position --从站的位置;index – SDO索引;subindex – SDO子索引;target – 上传的目标缓冲区;target_size – 目标缓冲区的大小;result_size – 已上传的数据的大小;abort_code – 中止SDO上传代码
返回值:成功 – 返回0;失败 – 返回 < 0
6.2.10 ecrt_master_write_idn
功能:执行SoE写入请求。开始写入IDN并阻塞,直到处理完请求或发生错误。
函数原型:int ecrt_master_write_idn(ec_master_t *master,
uint16_t slave_position, uint8_t drive_no,
uint16_t idn, uint8_t *data,
size_t data_size, uint16_t *error_code);
参数:master – ethercat主机; slave_position – 从站位置;
drive_no – 驱动号;idn – SOE IDN;
data – 写入数据的缓冲区; data_size – 数据大小;
error_code – 保存SOE返回的错误码
返回值:成功 – 返回0;失败 – 返回 < 0
6.2.11 ecrt_master_read_idn
功能:执行SoE读取请求。开始读取IDN并阻塞,直到处理完请求或发生错误。
函数原型:int ecrt_master_read_idn(ec_master_t *master,
uint16_t slave_position, uint8_t drive_no,
uint16_t idn, uint8_t *target,
size_t target_size, size_t *result_size,
uint16_t *error_code
);
参数:master – ethercat主机; slave_position – 从站位置;
drive_no – 驱动号;idn – SOE IDN;
target – 读取数据的缓冲区; target_size – 数据大小;
result_size – 实际接收数据的大小; error_code – 保存SOE返回的错误码
返回值:成功 – 返回0;失败 – 返回 < 0
6.2.12 ecrt_master_activate
功能: 完成配置阶段并准备循环操作。此函数告诉主机配置阶段已完成,实时操作将开始。函数为域分配内部内存,并计算域成员的逻辑FMMU地址。它告诉主状态机总线配置现在将被应用。
注意:调用此函数后,实时应用程序负责循环调用ecrt_master_send()和ecrt_master_receive(),以确保总线通信。在调用这个函数之前,由主线程负责,所以不能调用这些函数!方法本身分配内存,不应在实时上下文中调用。
函数原型:int ecrt_master_activate(ec_master_t *master);
参数:master – ethercat主机
返回值:成功 – 返回0;失败 – 返回 < 0
6.2.13 ecrt_master_set_send_interval
功能:设置调用ecrt_master_send()的间隔。此信息帮助主状态机决定主状态机可以向帧追加多少数据。当主线程配置为–enable hrtimers时,它用于计算主线程的调度。
函数原型:int ecrt_master_set_send_interval(
ec_master_t *master, size_t send_interval);
参数:master – ethercat主机; send_interval – 发送时间间隔,us
返回值:成功 – 返回0;失败 – 返回 < 0
6.2.14 ecrt_master_send
功能: 发送队列中的所有数据报。该方法接收所有排队等待传输的数据报,将它们放入帧中,并将它们传递给以太网设备进行发送。
函数原型:void ecrt_master_send(ec_master_t *master);
参数:master – ethercat主机
返回值:无
6.2.15 ecrt_master_deactivate
功能:删除总线配置。创建的所有对象ecrt_master_create_domain()、ecrt_master_slave_config()、ecrt_domain_data()、ecrt_slave_config_create_sdo_request()和
ecrt_slave_config_create_voe_handler()已释放,因此指向它们的指针将无效。不应在实时上下文中调用此方法。。
函数原型:void ecrt_master_deactivate(ec_master_t *master);
参数:master – ethercat主机
返回值:无
6.2.16 ecrt_master_receive
功能: 从硬件获取接收到的帧并处理数据报。通过调用中断服务例程查询网络设备接收到的帧。提取接收到的数据报并将结果发送到队列中的数据报对象。
接收到的数据报和超时的数据报将被标记并退出队列。
函数原型:void ecrt_master_receive(ec_master_t *master);
参数:master – ethercat主机
返回值:无
6.2.17 ecrt_master_state
功能: 读取当前主机的状态
函数原型:void ecrt_master_state(
const ec_master_t *master, ec_master_state_t *state);
参数:master – ethercat主机;state – 保存主机的状态信息
返回值:无
6.2.18 ecrt_master_link_state
功能: 读取冗余链路的当前状态。
函数原型:int ecrt_master_link_state(const ec_master_t *master,
unsigned int dev_idx, ec_master_link_state_t *state );
参数:master – ethercat主机;dev_idx – 设备索引;state – 存储链路状态的信息;
返回值:成功 – 返回0;失败 – 返回 < 0
6.2.19 ecrt_master_application_time
功能:设置应用程序时间。在使用分布式时钟操作从机时,主机必须知道应用程序的时间。时间不是由主机本身增加的,因此必须循环调用此方法。
注意:此方法的第一次调用用于计算从站SYNC0/1中断的相位延迟。必须在第一个实时周期中调用实时周期,或者只能在第一个实时周期中调用。否则会出现同步问题。该时间用于设置从机的系统时间偏移量循环操作开始时间寄存器,以及通过ecrt_master_sync_reference_clock()将直流参考时钟与应用程序时间同步时使用。时间定义为2000-01-01 00:00的纳秒。转换历元时间可以用EC_TIMEVAL2NANO()宏完成。
函数原型:void ecrt_master_application_time(
ec_master_t *master, uint64_t app_time);
参数:master – ethercat主机; app_time – 应用时间
返回值:无
6.2.20 ecrt_master_sync_reference_clock
功能: 将DC参考时钟漂移补偿数据报排队发送,参考时钟将与上次取消ecrt_master_application_time()提供的应用程序时间同步。
函数原型:void ecrt_master_sync_reference_clock(ec_master_t *master);
参数:master – ethercat主机
返回值:无
6.2.21 ecrt_master_sync_slave_clocks
功能:将DC时钟漂移补偿数据报排队发送,所有的子时钟与基准时钟同步
函数原型:void ecrt_master_sync_slave_clocks(ec_master_t *master);
参数:master – ethercat主机
返回值:无
6.2.21 ecrt_master_reference_clock_time
功能: 获取参考时钟系统时间的低32位,可用于使主时钟与基准时钟同步。参考时钟系统时间通过ecrt_master_sync_slave_clocks()方法,读取参考时钟的系统时间并将其写入子时钟(因此请确保循环调用它以获取有效数据)。
注意:返回的时间是参考时钟的系统时间减去参考时钟的传输延迟。
函数原型:int ecrt_master_reference_clock_time(
ec_master_t *master, uint32_t *time);
参数:master – ethercat主机;time – 指向查询的系统时间的指针
返回值:成功 – 返回0;失败 – 返回 < 0
6.2.22 ecrt_master_sync_monitor_queue
功能:将DC同步监视数据报排队以进行发送。数据报广播读取所有“系统时差”寄存器(\a 0x092c)以获得直流同步的上限估计。可以使用ecrt_master_sync_monitor_process()方法检查结果。
函数原型:void ecrt_master_sync_monitor_queue(ec_master_t *master);
参数:master – ethercat主机
返回值:无
6.2.23 ecrt_master_sync_monitor_process
功能:处理DC同步监控数据报。如果同步监视数据报是在
ecrt_master_sync_monitor_queue(),可以使用此方法查询结果。
函数原型:uint32_t ecrt_master_sync_monitor_process(
ec_master_t *master);
参数:master – ethercat主机
返回值:返回最大时差的上估计值,单位:ns
6.2.24 ecrt_master_reset
功能:重新配置从站设备
函数原型:void ecrt_master_reset(ec_master_t *master);
参数:master – ethercat主机
返回值:无
6.3从站配置方法
6.3.1 ecrt_slave_config_sync_manager
功能: 配置同步管理器。设置同步管理器的方向。这将覆盖来自SII的默认控制寄存器的方向位。此方法之前必须在非实时上下文中调用ecrt_master_activate()。
函数原型:int ecrt_slave_config_sync_manager(
ec_slave_config_t *sc, uint8_t sync_index,
ec_direction_t direction, ec_watchdog_mode_t watchdog_mode);
参数:sc – 从站配置;sync_index – 同步管理器索引;
direction – 输入/输出;watchdog_mode – 看门狗模式
返回值:成功 – 返回0;失败 – 返回 < 0
6.3.2 ecrt_slave_config_watchdog
功能: 配置从站的看门狗时。此方法之前必须在非实时上下文中调用ecrt_master_activate()。
函数原型:void ecrt_slave_config_watchdog(
ec_slave_config_t *sc, uint16_t watchdog_divider,
uint16_t watchdog_intervals);
参数:sc – 从站配置;watchdog_divider – 40ns间隔的数量。用作所有从站看门狗的基本单元;watchdog_intervals – 过程数据监视程序的基本间隔数;
返回值:无
6.3.3 ecrt_slave_config_pdo_assign_add
功能: 将PDO添加到同步管理器的PDO分配中。此方法之前必须在非实时上下文中调用ecrt_master_activate()。
函数原型:int ecrt_slave_config_pdo_assign_add(
ec_slave_config_t *sc, uint8_t sync_index,
uint16_t index);
参数:sc – 从站配置;sync_index – 同步管理器索引;
index – 分配PDO索引
返回值:成功 – 返回0;失败 – 返回 < 0
6.3.4 ecrt_slave_config_pdo_assign_clear
功能: 清除同步管理器的PDO配置。这可以在分配PDO之前通过调用ecrt_slave_config_pdo_assign_add(),清除同步管理器的默认分配。
此方法之前必须在非实时上下文中调用ecrt_master_activate()。
函数原型:void ecrt_slave_config_pdo_assign_clear(
ec_slave_config_t *sc, uint8_t sync_index );
参数:sc – 从站配置;sync_index – 同步管理器索引;
返回值:无
6.3.5 ecrt_slave_config_pdo_mapping_add()函数
功能: 在PDO映射中添加一个PDO条目。此方法之前必须在非实时上下文中调用ecrt_master_activate()。
函数原型:int ecrt_slave_config_pdo_mapping_add(
ec_slave_config_t *sc, uint16_t pdo_index,
uint16_t entry_index, uint8_t entry_subindex,
uint8_t entry_bit_length);
参数:sc – 从站配置;pdo_index – PDO索引;
entry_index – 要添加到PDO映射的PDO条目的索引;entry_subindex – 要添加到PDO映射的PDO项的子索引;entry_bit_length – PDO项的大小;
返回值:成功 – 返回0;失败 – 返回 < 0
6.3.6 ecrt_slave_config_pdo_mapping_clear
功能: 清除给定的PDO映射。此方法之前必须在非实时上下文中调用ecrt_master_activate()。
函数原型:void ecrt_slave_config_pdo_mapping_clear(
ec_slave_config_t *sc, uint16_t pdo_index);
参数:sc – 从站配置;pdo_index – PDO索引;
返回值:无
6.3.7 ecrt_slave_config_pdos
功能: 指定完整的PDO配置。此函数是函数的方便包装器
ecrt_slave_config_sync_manager(),ecrt_slave_config_pdo_assign_clear(),
ecrt_slave_config_pdo_assign_add(),ecrt_slave_config_pdo_mapping_clear()
ecrt_slave_config_pdo_mapping_add(),它们更适合自动代码生成。
下面的示例演示如何指定完整的配置,包括PDO映射。有了这些信息,主机可以保留完整的过程数据,即使在配置时从机不存在:
ec_pdo_entry_info_t el3162_channel1[]={
{0x3101,1,8},//状态
{0x3101,2,16}//值
};
ec_pdo_entry_info_t el3162_channel2[]={
{0x3102,1,8},//状态
{0x3102,2,16}//值
};
ec_pdo_info_t el3162_pdos[]={
{0x1A00,2,el3162_channel1},
{0x1A01,2,el3162_channel2}
};
ec_sync_info_t el3162_syncs[] = {
{2, EC_DIR_OUTPUT},
{3, EC_DIR_INPUT, 2, el3162_pdos},
{0xff}
};
if(ecrt_slave_config_pdos(sc_ana_in,EC_END,el3162_syncs)){
//处理错误
}
下一个示例显示如何仅配置PDO分配。每个分配的PDO的条目取自PDO的默认映射。请注意,如果PDO配置为空并且从机离线,PDO条目注册将失败。
ec_pdo_info_t pdos[] = {
{0x1600}, // Channel 1
{0x1601} // Channel 2
};
ec_sync_info_t syncs[] = {
{3, EC_DIR_INPUT, 2, pdos},
};
if (ecrt_slave_config_pdos(slave_config_ana_in, 1, syncs)) {
// handle error
}
如果-已处理的项目数达到syncs,或-ec sync_info_t项的索引成员为0xff,则同步的处理将停止。在这种情况下,同步应设置为大于列表项数的数字;建议使用EC_END命令。
此方法之前必须在非实时上下文中调用ecrt_master_activate()。
函数原型:int ecrt_slave_config_pdos(
ec_slave_config_t *sc, unsigned int n_syncs,
const ec_sync_info_t syncs[]);
参数:sc – 从站配置;n_syncs – 同步管理器的配置数;
syncs[] – 同步管理器配置数组
返回值:成功 – 返回0;失败 – 返回 < 0
6.3.8 ecrt_slave_config_reg_pdo_entry
功能: 为域中的过程数据交换注册PDO条目。在指定的PDO中搜索给定的PDO条目。如果给定的条目未映射,则引发错误。否则,为从机配置提供相应的同步管理器和FMMU配置,并将各自的同步管理器分配的pdo附加到给定的域中,
如果还没有完成。返回请求的PDO条目数据在域的进程数据中的偏移量。可选地,可以通过\a bit_position输出参数检索PDO入口位位置(0-7)。此指针可能为NULL,在这种情况下,如果PDO项没有字节对齐,则会引发错误。此方法之前必须在非实时上下文中调用ecrt_master_activate()。
函数原型:int ecrt_slave_config_reg_pdo_entry(
ec_slave_config_t *sc, uint16_t entry_index,
uint8_t entry_subindex, ec_domain_t *domain,
unsigned int *bit_position
);
参数:sc – 从站配置;entry_index – 要注册的PDO项的索引;
entry_subindex --要注册的PDO项的子索引;domain – 域;
bit_position – 如果需要位寻址,则选择地址
返回值:成功 – 返回 >= 0;失败 – 返回 < 0
6.3.9 ecrt_slave_config_reg_pdo_entry_pos
功能: 使用其位置注册PDO条目,类似于ecrt_slave_config_reg_pdo_entry(),但不使用pdo索引,而是在pdo映射中使用偏移量,因为pdo条目索引在从属pdo映射中可能不是唯一的。如果某个给定位置超出范围,则会引发错误。此方法之前必须在非实时上下文中调用ecrt_master_activate()。
函数原型:int ecrt_slave_config_reg_pdo_entry_pos(
ec_slave_config_t *sc, uint8_t sync_index,
unsigned int pdo_pos, unsigned int entry_pos,
ec_domain_t *domain,unsigned int *bit_position);
参数:sc – 从站配置;sync_index –同步管理器索引;
pdo_pos – PDO在SM中的位置;entry_pos – PDO中入口的位置;
domain – 域;bit_position – 如果需要位寻址,则选择地址
返回值:成功 – 返回 >= 0;失败 – 返回 < 0
6.3.10 ecrt_slave_config_dc()函数
功能: 配置分布式时钟。为同步信号设置AssignActivate字以及周期和移位时间。AssignActivate单词是特定于供应商的,可以从XML设备描述文件(device->Dc->AssignActivate)获取。如果从机在没有分布式时钟的情况下运行(默认),则将此设置为零。此方法之前必须在非实时上下文中调用ecrt_master_activate()。
函数原型:void ecrt_slave_config_dc(
ec_slave_config_t *sc, uint16_t assign_activate,
uint32_t sync0_cycle, int32_t sync0_shift,
uint32_t sync1_cycle, int32_t sync1_shift);
参数:sc – 从站配置;assign_activate – 赋值激活字;
sync0_cycle – SYNC0周期时间ns;sync0_shift – SYNC0转移时间;
sync1_cycle – SYNC0周期时间ns;sync1_shift – SYNC0转移时间;
返回值:成功 – 指向主机的指针;失败 – NULL
6.3.11 ecrt_slave_config_sdo
功能: 添加SDO配置,SDO配置存储在从配置对象中,并在主配置从机时下载到从机。这通常在主设备激活时发生一次,但可以在随后重复,例如在从设备的电源发生故障后。
注意:PDO分配(\p 0x1C10-\p 0x1C2F)和PDO映射(\p 0x1600-\p 0x17FF和\p 0x1A00-\p 0x1BFF)的sdo不应配置为此函数,因为它们是主配置完成的从配置的一部分。请使用ecrt_slave_config_pdos()。这是用于添加SDO配置的通用函数。请注意,此函数不会进行任何端接校正。如果需要特定于数据类型的函数(自动更正endianness),请查看ecrt_slave_config_sdo8()、ecrt_slave_config_sdo16()和ecrt_slave_config_sdo32()。此方法之前必须在非实时上下文中调用ecrt_master_activate()。
函数原型:int ecrt_slave_config_sdo(ec_slave_config_t *sc,
uint16_t index, uint8_t subindex,
const uint8_t *data, size_t size);
参数:sc – 从站配置;index – SDO索引;
entry_index –SDO子索引;data – 指向data的指针;
size – data的大小
返回值:成功 – 返回0;失败 – 返回 < 0
6.3.12 ecrt_slave_config_complete_sdo
功能: 为完整的SDO添加配置数据。SDO数据通过CompleteAccess传输。必须包括第一个子索引(0)的数据。此方法之前必须在非实时上下文中调用ecrt_master_activate()。
函数原型:int ecrt_slave_config_complete_sdo(
ec_slave_config_t *sc, uint16_t index,
const uint8_t *data, size_t size);
参数:sc – 从站配置;index – SDO索引;
data – 指向data的指针;size – data的大小
返回值:成功 – 返回0;失败 – 返回 < 0
6.3.13 ecrt_slave_config_create_sdo_request
功能: 在实时操作期间创建一个SDO请求来交换SDO。释放主节点时,创建的SDO请求对象将自动释放。此方法之前必须在非实时上下文中调用ecrt_master_activate()。
函数原型:ec_sdo_request_t *ecrt_slave_config_create_sdo_request(
ec_slave_config_t *sc, uint16_t index,
uint8_t subindex, size_t size);
参数:sc – 从站配置;index – SDO索引;
subindex – SDO子索引;size – data的大小
返回值:成功 – 指向新的SDO请求指针;失败 – NULL
6.3.14 ecrt_slave_config_create_voe_handler
功能:创建一个VoE处理程序,以便在实时操作期间交换特定于供应商的数据。每个从配置的VoE处理程序的数量不受限制,但是如果可以同时创建一个用于发送和一个用于接收,通常就足够了。创建的VoE处理程序对象在释放主对象时自动释放。此方法之前必须在非实时上下文中调用ecrt_master_activate()。
函数原型:ec_voe_handler_t *ecrt_slave_config_create_voe_handler(
ec_slave_config_t *sc, size_t size);
参数:sc – 从站配置;size – 数据大小
返回值:成功 – 指向新的VOE处理指针;失败 – NULL
6.3.15 ecrt_slave_config_create_reg_request
功能:创建一个寄存器请求,在实时操作期间交换EtherCAT寄存器内容。此接口不应用于接管主功能,而是用于调试和监视的原因。创建的register request对象将在释放主节点时自动释放。此方法之前必须在非实时上下文中调用ecrt_master_activate()。
函数原型:ec_reg_request_t *ecrt_slave_config_create_reg_request(
ec_slave_config_t *sc, size_t size);
参数:sc – 从站配置;size – 数据大小
返回值:成功 – 指向新的寄存器请求指针;失败 – NULL
6.3.16 ecrt_slave_config_state
功能: 输出从站的配置状态
函数原型:void ecrt_slave_config_state(
const ec_slave_config_t *sc, ec_slave_config_state_t *state);
参数:sc – 从站配置;state – 需要写入的state对象
返回值:无
6.4域方法
6.4.1 ecrt_domain_reg_pdo_entry_list
功能: 为一个域注册一组PDO条目,此方法之前必须在非实时上下文中调用ecrt_master_activate()。
函数原型:int ecrt_domain_reg_pdo_entry_list(ec_domain_t *domain,
const ec_pdo_entry_reg_t *pdo_entry_regs);
参数:domain – 域;pdo_entry_regs – 注册的PDO数组
返回值:成功 – 返回0;失败 – 返回 < 0
6.4.2 ecrt_domain_size
功能: 返回域中process数据的大小
函数原型:size_t ecrt_domain_size(const ec_domain_t *domain);
参数:domain – 域
返回值:成功 –process数据映像的大小;失败 --返回 < 0
6.4.3 ecrt_domain_data
功能: 返回域的进程数据。-在内核上下文中:如果外部内存与ecrt_domain_external_memory()一起提供,则返回的指针将包含该内存的地址。
否则它将指向内部分配的内存。在这种情况下,不能在调用master()之前调用后者。—在用户空间上下文中:必须在ecrt_master_activate()以获取映射的域进程数据内存。
函数原型:uint8_t *ecrt_domain_data(ec_domain_t *domain);
参数:domain – 域
返回值:成功 – 进程数据内存的指针;失败 – NULL
6.4.4 ecrt_domain_process
功能: 确定域数据报的状态。评估接收到的数据报的工作计数器,并在必要时输出统计信息。必须在ecrt_master_receive()接收域数据报之后调用此函数,以便ecrt_domain_state()返回上一次进程数据交换的结果。
函数原型:void ecrt_domain_process(ec_domain_t *domain);
参数:domain – 域
返回值:无
6.4.5 ecrt_domain_queue
功能: 将主数据报队列中的所有域数据报排队。调用此函数可标记域的数据报以便在ecrt_master_send()的下一次调用。
函数原型:void ecrt_domain_queue(ec_domain_t *domain);
参数:domain – 域
返回值:无
6.4.6 ecrt_domain_state
功能: 读取域中的状态。利用该方法,可以实时监控过程数据交换。
函数原型:void ecrt_domain_state(
const ec_domain_t *domain, ec_domain_state_t *state);
参数:domain – 域; state – 域的状态信息
返回值:无
6.5 SDO请求方法
6.5.1 ecrt_sdo_request_index
功能: 设置SDO索引和子索引。
注意:如果SDO索引和/或子索引在ecrt_sdo_request_state()返回EC_request_BUSY,这可能会导致意外结果。
函数原型:void ecrt_sdo_request_index(ec_sdo_request_t req,
uint16_t index, uint8_t subindex);
参数:req – SDO请求; index – SDO 索引;
Subindex – SDO子索引
返回值:无
6.5.2 ecrt_sdo_request_timeout
功能: 设置SDO请求超时。如果无法在指定时间内处理请求,则If将标记为失败。超时永久存储在请求对象中,并且在下次调用此方法之前有效。
函数原型:void ecrt_sdo_request_timeout(
ec_sdo_request_t req, uint32_t timeout);
参数:req – SDO请求; timeout – 超时时间,ms;
返回值:无
6.5.3 ecrt_sdo_request_data
功能: 访问SDO请求的数据。-读取操作成功后,可以像往常一样使用EC_READ_
()宏计算整数数据。例子:
uint16_t value=EC_READ_U16(ecrt_sdo_request_data(sdo)));
-如果要触发写入操作,则必须将数据写入内存。如果要写入整型数据,请使用EC_WRITE_x
()宏。确保数据能放入内存中。内存大小是ecrt_slave_config_create_sdo_request()的参数。EC_WRITE_U16(ecrt_sdo_request_data(sdo),0xFFFF);
注意:在读取操作期间,返回值可能无效,因为如果读取的SDO数据不在内部,则可能会重新分配内部SDO数据内存
函数原型:uint8_t *ecrt_sdo_request_data(
ec_sdo_request_t *req);
参数:req – SDO请求;
返回值:成功 – 指向请求内部SDO数据内存的指针;失败 – NULL
6.5.4 ecrt_sdo_request_data_size
功能: 返回当前SDO数据大小。当创建SDO请求时,数据大小被设置为保留内存的大小。 在读取操作之后,大小被设置为读取数据的大小。尺寸不在其他任何情况下修改。
函数原型:size_t ecrt_sdo_request_data_size(
const ec_sdo_request_t *req);
参数:req – SDO请求;
返回值:成功 – 指向主机的指针;失败 – NULL
6.5.5 ecrt_sdo_request_state
功能: 返回当前SDO数据的大小
函数原型:ec_request_state_t ecrt_sdo_request_state(
const ec_sdo_request_t *req);
参数:req – SDO请求;
返回值:SDO数据的大小
6.5.6 ecrt_sdo_request_write
功能: 调度SDO写操作。注意,当ecrt_sdo_request_state()返回EC_REQUEST_BUSY时,可能不会调用此方法。
函数原型:void ecrt_sdo_request_write(ec_sdo_request_t *req);
参数:req – SDO请求;
返回值:无
6.5.7 ecrt_sdo_request_read
功能:安排SDO读操作。注意,当ecrt_sdo_request_state()返回EC_REQUEST_BUSY时,可能不会调用此方法。
函数原型:void ecrt_sdo_request_read(ec_sdo_request_t *req);
参数:req – SDO请求;
返回值:无
6.6 VOE处理方法
6.6.1 ecrt_voe_handler_send_header
功能:为将来的发送操作设置VoE头。VoE消息应包含一个4字节的供应商ID,后跟as报头处的2字节供应商类型。这些数字可以用这个函数设置。
这些值是有效的,将用于以后的发送操作,直到下次调用此方法为止。
函数原型:void ecrt_voe_handler_send_header(ec_voe_handler_t *voe,
uint32_t vendor_id, uint16_t vendor_type);
参数:voe – VOE 句柄;vendor_id – VID;
vendor_type – 厂商指定的类型
返回值:无
6.6.2 ecrt_voe_handler_received_header
功能:读取接收到的VoE消息的头数据。此方法可用于在读取操作成功后获取接收到的VoE报头信息。头信息存储在指针参数指定的内存中。
函数原型:void ecrt_voe_handler_received_header(
const ec_voe_handler_t *voe, uint32_t *vendor_id,
uint16_t *vendor_type);
参数:voe – VOE 句柄;vendor_id – VID;
vendor_type – 厂商指定的类型;
返回值:无
6.6.3 ecrt_voe_handler_data
功能:访问VoE处理程序的数据。此函数返回指向VoE处理程序的内部内存的指针,该指针指向VoE标题后面的实际VoE数据(请参见ecrt_voe_处理程序_send_header())。-读取操作成功后,内存包含接收到的数据。接收数据的大小可以通过ecrt_voe_handler_data_size()。-在触发写入操作之前,必须将数据写入内存。确保数据能放入内存中。保留内存大小是ecrt_slave_config_create_voe_handler()的参数。
注意:返回的指针不一定是持久的:在读取之后操作时,内存可能已重新分配。这可能是通过的size参数保留足够的内存来避免。
函数原型:uint8_t *ecrt_voe_handler_data(ec_voe_handler_t *voe);
参数:voe – VOE 句柄;
返回值:返回指向VoE处理程序的内部内存的指针。
6.6.4 ecrt_voe_handler_data_size
功能:返回当前数据大小。数据大小是没有头的VoE数据的大小(请参见ecrt_VoE_handler_send_header())。创建VoE处理程序时,数据大小设置为保留内存的大小。在写入操作中,数据大小设置为要写入的字节数。读取操作后,大小设置为读取数据的大小。在任何其他情况下都不会修改大小。
函数原型:size_t ecrt_voe_handler_data_size(
const ec_voe_handler_t *voe);
参数:voe – VOE 句柄;
返回值:当前数据的大小
6.6.5 ecrt_voe_handler_write
功能:启动VoE写入操作。调用此函数后,ecrt_voe_handler_execute()方法必须在每个总线周期中调用,只要它返回EC_REQUEST_BUSY。处理程序繁忙时,不能启动其他操作。
函数原型:void ecrt_voe_handler_write(
ec_voe_handler_t *voe, size_t size);
参数:voe – VOE 句柄;size – 写入的字节数;
返回值:无
6.6.6 ecrt_voe_handler_read
功能:启动VoE读取操作。调用此函数后,ecrt_voe_handler_execute()方法。必须在每个总线周期中调用,只要它返回EC_REQUEST_BUSY。处理程序繁忙时,不能启动其他操作。状态机查询从服务器的发送邮箱,以获取要发送到主服务器的新数据。如果在EC_VOE_RESPONSE_TIMEOUT(在master/VOE_handler.c中定义)内没有数据出现,则操作失败。成功后,可以通过ecrt_voe_handler_data_size(),而接收数据的voe报头可以使用ecrt_voe_handler_received_header()检索。
函数原型:void ecrt_voe_handler_read(
ec_voe_handler_t *voe);
参数:voe – VOE 句柄;
返回值:无
6.6.7 ecrt_voe_handler_execute
功能:执行处理程序。此方法执行VoE处理程序。它必须在每个总线周期中调用,只要它返回EC_REQUEST_BUSY。
函数原型:ec_request_state_t ecrt_voe_handler_execute(
ec_voe_handler_t *voe);
参数:req – SDO请求;
返回值:返回处理程序状态

6.7寄存器请求方法
6.7.1 ecrt_reg_request_data
功能:访问寄存器请求的数据。此函数返回指向请求内部内存的指针。
-读取操作成功后,可以像往常一样使用EC_READ_()宏计算整数数据。例子:uint16_t value=EC_READ_U16(ecrt_reg_request_data(reg_request)));
-如果要触发写入操作,则必须将数据写入内存。如果要写入整型数据,请使用EC_WRITE_x
()宏。确保数据能放入内存中。内存大小是ecrt_slave_config_create_reg_request()的参数。
EC_WRITE_U16(ecrt_reg_request_data(reg_request),0xFFFF);。
函数原型:uint8_t *ecrt_reg_request_data(ec_reg_request_t *req );
参数:req – 寄存器请求;
返回值:返回指向内存的指针。
6.7.2 ecrt_reg_request_state
功能:获取寄存器请求的当前状态。
函数原型:ec_request_state_t ecrt_reg_request_state(
const ec_reg_request_t *req);
参数:req – 寄存器请求;
返回值:返回请求状态。
6.7.3 ecrt_reg_request_write
功能:安排寄存器写入操作。
注意:当ecrt_reg_request_state()返回EC_request_BUSY时,不能调用此方法。
size参数被截断为请求创建时给定的大小。
函数原型:void ecrt_reg_request_write(ec_reg_request_t *req,
uint16_t address, size_t size);
参数:req – 寄存器请求;address – 寄存器地址;
size – 写入的大小
返回值:无
6.7.4 ecrt_reg_request_read
功能:安排寄存器读取操作。
注意:当ecrt_reg_request_state()返回EC_request_BUSY时,不能调用此方法。
size参数被截断为请求创建时给定的大小。。
函数原型:void ecrt_reg_request_read(ec_reg_request_t *req,
uint16_t address, size_t size);
参数:req – SDO请求;
返回值:无

  • 19
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值