SOEM使用记录

启动初始化样例程序:

#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()填充。

结构体具体参数见:ec_slaveicon-default.png?t=N7T8http://openethercatsociety.github.io/doc/soem/ethercatmain_8c.html#a309bc1e26d5c2ce80d69804b30bbb6a7

#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();

 

  • 26
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值