启动初始化样例程序:
#include "iostream"
#include "stdio.h"
#include "sys/stat.h"
#include "fcntl.h"
#include "soem/ethercat.h"
#include "unistd.h"
char IOmap[4096];
pthread_t thread1, thread2;
static int32_t latency_target_value = 0;
static int latency_target_fd = -1;
#define stack64k (64 * 1024)
static void set_latency_target(void)// 消除时钟偏移
{
struct stat s;
int ret;
if (stat("/dev/cpu_dma_latency", &s) == 0)
{
latency_target_fd = open("/dev/cpu_dma_latency", O_RDWR);
if (latency_target_fd == -1)
return;
ret = write(latency_target_fd, &latency_target_value, 4);
if (ret == 0)
{
printf("# error setting cpu_dma_latency to %d!: %s\n", latency_target_value, strerror(errno));
close(latency_target_fd);
return;
}
printf("# /dev/cpu_dma_latency set to %dus\n", latency_target_value);
}
}
int main(int argc, char *argv[])
{
printf("SOEM (Simple Open EtherCAT Master)\nSimple test\n");
// signal(SIGINT, endsignal);
if (argc > 1)
{
int res = 0;
set_latency_target(); //消除时钟偏移
osal_thread_create(&thread2, stack64k * 4, &ecx_statecheck, NULL);
// osal_thread_create(&thread1, stack64k * 4, &scanKeyboard, NULL);
// printf("create thread ");
// ec_init();
}
else
{
ec_adaptert * adapter = NULL;
printf("Usage: simple_test ifname1\nifname = eth0 for example\n");
printf ("\nAvailable adapters:\n");
adapter = ec_find_adapters ();
while (adapter != NULL)
{
printf (" - %s (%s)\n", adapter->name, adapter->desc);
adapter = adapter->next;
}
ec_free_adapters(adapter);
}
printf("End program\n");
return (0);
}
函数介绍:
ec_find_adapters ()
创建可用网络适配器列表。 返回: 可用网络适配器列表中的第一个元素。
使用方法:
ec_adaptert * adapter = NULL;
printf("Usage: simple_test ifname1\nifname = eth0 for example\n");
printf ("\nAvailable adapters:\n");
adapter = ec_find_adapters ();
while (adapter != NULL)
{
printf (" - %s (%s)\n", adapter->name, adapter->desc);
adapter = adapter->next;
}
ec_free_adapters(adapter);
ec_init()
初始化SOEM,将socket绑定到ifname
if (ec_init(ifname)){}
ec_config_init(FALSE)
将所有从站设置成OP模式,成功返回>0;
/* find and auto-config slaves */
if ( ec_config_init(FALSE) > 0 )
{
rprintp("%d slaves found and configured.\n",ec_slavecount);
ec_config_map(&IOmap)
将所有PDO从从机映射到IOmap,输出/输入按顺序排列(传统SOEM方式)。
char IOmap[128]; ec_config_map(&IOmap);
ec_slavecount
返回在网络上找到的从属设备数,判断从站是否全部在线
#define NUMBER_OF_SLAVES 9 if (ec_slavecount < NUMBER_OF_SLAVES)
ec_slave[]
从站结构体
主从数据阵列。在网络上找到的每个从站都有自己的记录。ec_slave[0]为master保留。结构由配置函数ec_config()填充。
#define EK1100_1 1 // 定义从站号 #define EL4001_1 2 #define EL2622_3 8 #define EL2622_4 9 if (strcmp(ec_slave[EK1100_1].name,"EK1100")) return 0; else if (strcmp(ec_slave[EL4001_1].name,"EL4001")) return 0; else if (strcmp(ec_slave[EL2622_4].name,"EL2622")) return 0;
ec_configdc()
返回ecx_configdc(),定位从站,测量传播延迟,如果找到具有DC的从机返回一个bool值未测试返回内容
ec_configdc();
ec_send_processdata()
ec_send_processdata在NIC上发送帧,并将帧保存在堆栈上,以便接收获取。
ec_send_processdata();
ec_receive_processdata()
ec_receive_processdata(EC_TIMEOUTRET)尝试获取堆栈上的帧。我们发送一个参数,说明我们将尝试获取帧的时间。ec_receive_processdata返回工作计数器。
int ec_receive_processdata(int timeout);
ec_writestate()
写入从机状态,如果从机= 0,则写入所有从机。该函数不检查实际状态是否发生了变化。
ec_writestate(0);
ec_statecheck()
检查实际从机状态。这是一个阻塞函数。
ec_statecheck(0, EC_STATE_OPERATIONAL, EC_TIMEOUTSTATE);
// 等待所有从站达到OP状态 ec_statecheck(0, EC_STATE_OPERATIONAL, EC_TIMEOUTSTATE);
ecx_SDOwrite()
CoE SDO写入,阻塞。单个子索引或完全访问。 发出“正常”下载请求,除非我们有小数据,然后使用“加速”传输。如果参数大于邮箱大小,则下载被分段。该函数将参数数据分割成段,并将它们逐个发送到从机。
Parameters
[in] | context | = context struct |
[in] | Slave | = Slave number |
[in] | Index | = Index to write |
[in] | SubIndex | = Subindex to write, must be 0 or 1 if CA is used. |
[in] | CA | = FALSE = single subindex. TRUE = Complete Access, all subindexes written. |
[in] | psize | = Size in bytes of parameter buffer. |
[out] | p | = Pointer to parameter buffer |
[in] | Timeout | = Timeout in us, standard is EC_TIMEOUTRXM |
Returns
Workcounter from last slave response
int retval; uint16 u16val; retval = 0; /* Map velocity PDO assignment via Complete Access*/ uint16 map_1c12[4] = {0x0003, 0x1601, 0x1602, 0x1604}; uint16 map_1c13[3] = {0x0002, 0x1a01, 0x1a03}; retval += ec_SDOwrite(slave, 0x1c12, 0x00, TRUE, sizeof(map_1c12), &map_1c12, EC_TIMEOUTSAFE); retval += ec_SDOwrite(slave, 0x1c13, 0x00, TRUE, sizeof(map_1c13), &map_1c13, EC_TIMEOUTSAFE);
ec_configdc()---
返回ecx_configdc(),定位从站,测量传播延迟,如果找到具有DC的从机返回一个bool值未测试返回内容
ec_configdc();
ec_configdc()---
返回ecx_configdc(),定位从站,测量传播延迟,如果找到具有DC的从机返回一个bool值未测试返回内容
ec_configdc();
ec_configdc()---
返回ecx_configdc(),定位从站,测量传播延迟,如果找到具有DC的从机返回一个bool值未测试返回内容
ec_configdc();