Ethercat学习-从站源码移植

这篇具有很好参考价值的文章主要介绍了Ethercat学习-从站源码移植。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介

移植平台GD32F450,从站芯片AX58100,从站源码版本V5.12

移植源码
1.源码结构

源码使用之前SSC生成的源码,如下图所示

ethercat协议移植,Ethercat,学习,单片机,嵌入式硬件

因为配置SSC的时候只选择了COE的功能,所以源码比较少。移植过程中重点关注红笔圈出的几个文件。其中ecat_def.h就是SSC中的配置项。el9800.c和el9800.h文件是根据EL9800的硬件生成的硬件接口文档,我们需要将它修改为GD32的接口。myapp.c、myapp.h、myappObjects.h是根据我之前定义的Excel文件生成的。

2.GD32硬件接口准备
1.SPI接口

ESI文件的ConfigData中,PDI的配置选择的SPI,另外SPI的极性也在PDI的配置中。下面是部分代码

/* SPI3初始化 */
void bsp_spi3_init(void)
{
    spi_parameter_struct spi_init_struct;

    rcu_periph_clock_enable(SPI3_CS_GPIO_CLK);
    rcu_periph_clock_enable(SPI3_MISO_GPIO_CLK);
    rcu_periph_clock_enable(SPI3_MOSI_GPIO_CLK);
    rcu_periph_clock_enable(SPI3_SCK_GPIO_CLK);
    rcu_periph_clock_enable(RCU_SPI3);
    
    /* MISO 引脚配置*/
    gpio_mode_set(SPI3_MISO_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_NONE, SPI3_MISO_GPIO);
    gpio_output_options_set(SPI3_MISO_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_25MHZ, SPI3_MISO_GPIO);
    gpio_af_set(SPI3_MISO_GPIO_PORT, GPIO_AF_5, SPI3_MISO_GPIO);
    
    /* MOSI 引脚配置 */
    gpio_mode_set(SPI3_MOSI_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_NONE, SPI3_MOSI_GPIO);
    gpio_output_options_set(SPI3_MOSI_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_25MHZ, SPI3_MOSI_GPIO);
    gpio_af_set(SPI3_MOSI_GPIO_PORT, GPIO_AF_5, SPI3_MOSI_GPIO);
    /* SCK 引脚配置*/
    gpio_mode_set(SPI3_SCK_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_NONE, SPI3_SCK_GPIO);
    gpio_output_options_set(SPI3_SCK_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_25MHZ, SPI3_SCK_GPIO);
    gpio_af_set(SPI3_SCK_GPIO_PORT, GPIO_AF_5, SPI3_SCK_GPIO);

    /* CS 引脚配置 */
    gpio_mode_set(SPI3_CS_GPIO_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, SPI3_CS_GPIO);
    gpio_output_options_set(SPI3_CS_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, SPI3_CS_GPIO);
    gpio_output_options_set(SPI3_CS_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, SPI3_CS_GPIO);
    gpio_bit_set(SPI3_CS_GPIO_PORT,SPI3_CS_GPIO);

    spi_init_struct.trans_mode           = SPI_TRANSMODE_FULLDUPLEX;       /* 全双工*/
    spi_init_struct.device_mode          = SPI_MASTER;                     /* 主机模式*/
    spi_init_struct.frame_size           = SPI_FRAMESIZE_8BIT;             /* 8位帧格式*/
    spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE;         /* 时钟相位极性,空闲时位低电平,第一个时钟边沿进行采样 */
    spi_init_struct.nss                  = SPI_NSS_SOFT;                   /* 软件NSS */ 
    spi_init_struct.prescale             = SPI_PSC_32;                     /* 时钟32分频 */
    spi_init_struct.endian               = SPI_ENDIAN_MSB;                 /* 高位在前 */
    spi_init(SPI3, &spi_init_struct);

    /* 使能SPI */
    spi_enable(SPI3);
}
/* SPI的单字节收发 */
u8 spi_data_rw(u8 data)
{
    u16 tmp;
    /* 等待发送缓冲区清空 */
    while(RESET == spi_i2s_flag_get(Ethercat_SPI,SPI_FLAG_TBE));
    /* 发送要写的寄存器地址 */
    spi_i2s_data_transmit(Ethercat_SPI,data);
    /* 等待接收完成 SPI收发一体的,必须等到接收完成才代表一次完整的发送完成*/
    while(RESET == spi_i2s_flag_get(Ethercat_SPI,SPI_FLAG_RBNE));
    /* 读取缓存取得值,清空缓存区,准备发送 */
    tmp = spi_i2s_data_receive(Ethercat_SPI);   
    return (u8)tmp;
}
2.PDI中断配置

PDI中断是一个外部引脚中断

void ethercat_pdi_init(void)
{
    rcu_periph_clock_enable(RCU_SYSCFG);
    rcu_periph_clock_enable(RCU_GPIOE);
    gpio_mode_set(GPIOE, GPIO_MODE_INPUT, GPIO_PUPD_NONE,GPIO_PIN_3);
    /* 外部中断配置 */
    syscfg_exti_line_config(EXTI_SOURCE_GPIOE, EXTI_SOURCE_PIN3);
    exti_init(EXTI_3, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
    exti_interrupt_flag_clear(EXTI_3); 
}
3.Sync0中断配置

Sync0中断是一个外部引脚中断

void ethercat_sync0_init(void)
{
    rcu_periph_clock_enable(RCU_SYSCFG);
    rcu_periph_clock_enable(RCU_GPIOC);
    gpio_mode_set(GPIOC, GPIO_MODE_INPUT, GPIO_PUPD_NONE,GPIO_PIN_13);
    /* 外部中断配置 */
    syscfg_exti_line_config(EXTI_SOURCE_GPIOC, EXTI_SOURCE_PIN13);
    exti_init(EXTI_13, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
    exti_interrupt_flag_clear(EXTI_13); 
}
4.Sync1中断配置

Sync1中断是一个外部引脚中断

void ethercat_sync1_init(void)
{
    rcu_periph_clock_enable(RCU_SYSCFG);
    rcu_periph_clock_enable(RCU_GPIOF);
    gpio_mode_set(GPIOF, GPIO_MODE_INPUT, GPIO_PUPD_NONE,GPIO_PIN_1);
    /* 外部中断配置 */
    syscfg_exti_line_config(EXTI_SOURCE_GPIOF, EXTI_SOURCE_PIN1);
    exti_init(EXTI_1, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
    exti_interrupt_flag_clear(EXTI_1); 
}
5.定时器中断配置

因为我们在配置SSC的时候选择了ECAT_TIMER_INT选项,所以需要配置一个1ms的定时器中断,用来喂看门狗

void bsp_time4_init(void)
{
    timer_parameter_struct timer_initpara;

    rcu_periph_clock_enable(RCU_TIMER4);
  
    rcu_timer_clock_prescaler_config(RCU_TIMER_PSC_MUL4); //四倍频,定时器1的时钟来自 APB1 = AHB/4 AHB=SYS,所以定时器的时钟就是200M

    timer_deinit(TIMER4);

    /* TIMER1 配置 */
    timer_initpara.prescaler         = TIM4_PSC;             /* 预分频值,计数时钟=定时器时钟/(PSC+1) */
    timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;   /* 无对齐模式*/
    timer_initpara.counterdirection  = TIMER_COUNTER_UP;     /* 向上计数 */
    timer_initpara.period            = TIM4_CAR;             /* 自动重装值 */
    timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;     /* 时钟分频,规定定时器时钟与死区时间和数字滤波采样时钟之间的系数*/
    timer_initpara.repetitioncounter = 0;                    /* 中断的产生频率,计数器溢出N+1次后产生中断*/
    timer_init(TIMER4,&timer_initpara); 
    timer_interrupt_enable(TIMER4,TIMER_INT_UP);   

    timer_enable(TIMER4); 						 
}
3.移植准备

在GD32的工程下面新建一个Ethercat文件夹,在Ethercat文件夹下面新建一个src文件夹和inc文件夹。将源码中的头文件(.h文件)都复制到inc文件夹下面,将源码中的源文件(.c文件)都复制到src文件夹下面。

ethercat协议移植,Ethercat,学习,单片机,嵌入式硬件

ethercat协议移植,Ethercat,学习,单片机,嵌入式硬件

修改文件名字(个人喜好)将el9800hw.c和el9800.h改为ecatport.c和ecatport.h ,将源码加入到Keil的工程中。

4.源码移植
1.修改头文件名

因为我将源码的文件名字从el9800.h改为了ecatport.h,所以我需要将源码中调用el9800.h都改为ecatport.h,好像就两处。

2.ecatport.c文件修改
1.SPI部分修改

这里面的读写函数与SPI相关的有三个,RxTxSpiData、SELECT_SPI、DESELECT_SPI。

RxTxSpiData是SPI单字节读写,原先的RxTxSpiData函数是基于PIC单片机硬件的,我们将原先的RxTxSpiData函数删除掉,通过宏定义替换为我们自己定义的。

SELECT_SPI和DESELECT_SPI是对SPI CS引脚进行控制,我们也通过宏定义实现。

/*-----------------------------------------------------------------------------------------
------
------    SPI defines/macros
------
-----------------------------------------------------------------------------------------*/
#define RxTxSpiData         spi_data_rw
#define SELECT_SPI          gpio_bit_reset(GPIOE, GPIO_PIN_4);  
#define DESELECT_SPI        gpio_bit_set(GPIOE, GPIO_PIN_4);
2.中断部分

首先修改中断函数的写法,并增加一个定时器中断函数,修改如下

/* 修改前 __attribute__ ((__interrupt__, no_auto_psv))是PIC单片机的中断的写法,在GD32中不需要 */
void __attribute__ ((__interrupt__, no_auto_psv)) EscIsr(void)
{
     PDI_Isr();

    /* reset the interrupt flag */
    ACK_ESC_INT;

}

void __attribute__((__interrupt__, no_auto_psv)) Sync0Isr(void)
{
    Sync0_Isr();

    /* reset the interrupt flag */
    ACK_SYNC0_INT;
}

void __attribute__((__interrupt__, no_auto_psv)) Sync1Isr(void)
{
    Sync1_Isr();

    /* reset the interrupt flag */
    ACK_SYNC1_INT;
}

/*******************************修改后***********************************************/
void EscIsr(void)
{
     PDI_Isr();

    /* reset the interrupt flag */
    ACK_ESC_INT;

}

void Sync0Isr(void)
{
    Sync0_Isr();

    /* reset the interrupt flag */
    ACK_SYNC0_INT;
}

void Sync1Isr(void)
{
    Sync1_Isr();

    /* reset the interrupt flag */
    ACK_SYNC1_INT;
}

void ethercat_timer_isr(void)
{
    ECAT_CheckTimer();
    ACK_TIMER_INT;
}

将函数通过宏定义映射一下

/*PDI 映射 */
#define ACK_ESC_INT         exti_interrupt_flag_clear(EXTI_3);
#define EscIsr              EXTI3_IRQHandler
/*Sync0 映射 */
#define ACK_SYNC0_INT      exti_interrupt_flag_clear(EXTI_13)
#define Sync0Isr           EXTI10_15_IRQHandler
/*Sync1 映射 */
#define ACK_SYNC1_INT      exti_interrupt_flag_clear(EXTI_1)
#define Sync1Isr           EXTI1_IRQHandler
/*定时器 映射 */
#define ethercat_timer_isr TIMER4_IRQHandler
#define ACK_TIMER_INT      timer_interrupt_flag_clear(TIMER4, TIMER_INT_UP)

除了这几个中断,可以看到程序里还用到了全局中断的使能与失能。也需要宏定义一下

#define DISABLE_GLOBAL_INT      __disable_irq()			
#define ENABLE_GLOBAL_INT       __enable_irq()
3.修改HW_Init()
UINT8 HW_Init(void)
{
    UINT32 intMask;
    sysTick_init();
    nvic_configuration();	
    ethercat_gpio_init();
    bsp_spi3_init();
    do
    {
        intMask = 0x93;
        HW_EscWriteDWord(intMask, ESC_AL_EVENTMASK_OFFSET);
        intMask = 0;
        HW_EscReadDWord(intMask, ESC_AL_EVENTMASK_OFFSET);
    } while (intMask != 0x93);
    intMask = 0x00;
    HW_EscWriteDWord(intMask, ESC_AL_EVENTMASK_OFFSET);
    INIT_ESC_INT;
    INIT_SYNC0_INT;
    INIT_SYNC1_INT;
    INIT_ECAT_TIMER;
    /* enable all interrupts */
    ENABLE_GLOBAL_INT;
    return 0;
}

HW_Init初始化中的有些宏定义我没有去实现,直接删去了。因为外设在初始化的时候已经使能,不需要额外进行使能了。我只是先了如下几个宏定义

#define INIT_ESC_INT       ethercat_pdi_init()
#define INIT_SYNC0_INT     ethercat_sync0_init()
#define INIT_SYNC1_INT     ethercat_sync1_init()
#define INIT_ECAT_TIMER    ethercat_timer_init()

暂时不管应用层逻辑,先编译一下,看看硬件部分修改是否还有问题。

4.报错修改

提示没有 Nop ,我直接把Nop删除掉了。

提示没有定义DISABLE_ESC_INT和ENABLE_ESC_INT,因为这定义要在多个文件中引用,所以定义到ecatport.h文件中

#define DISABLE_ESC_INT()     exti_interrupt_disable(EXTI_3)
#define ENABLE_ESC_INT()      exti_interrupt_enable(EXTI_3)
3.myapp.c文件修改

这个文件主要实现我们的应用逻辑。需要修改的函数有三个

void APPL_InputMapping(UINT16* pData);
void APPL_OutputMapping(UINT16* pData);
void APPL_Application(void);

函数APPL_InputMapping是将TPDO数据从单片机中拷贝到ESC中;函数APPL_OutputMapping是将ESC中的RPDO数据拷贝到单片机的内存中。APPL_Application是本地应用逻辑,处理APPL_OutputMapping中得到的数据,打包APPL_InputMapping中需要的数据。

修改如下:

/************myapp.h ************/
typedef struct{
  unsigned int  data1;
  unsigned int  data2;
} __attribute__((__packed__)) _tpdo1A00_t;

typedef struct{
  unsigned int  data1;
  unsigned int  data2;
} __attribute__((__packed__)) _rpdo1600_t;

/***************myapp.c ***********/
static volatile _tpdo1A00_t tpdodata;
static volatile _rpdo1600_t rpdodata;

在myapp.h定义了两个结构体用来存放TPDO和RPDO的数据。结构体的定义需要和PDO的映射对应。之前配置的时候我们的TPDO映射了两个32位的数,所以这里结构体里也是定义了两个32位的元素,另外需要取消字节对齐。

void APPL_InputMapping(UINT16* pData)
{
    UINT16 j = 0;
    UINT16 *pTmpData = (UINT16 *)pData;
   for (j = 0; j < sTxPDOassign.u16SubIndex0; j++)
   {
      switch (sTxPDOassign.aEntries[j])
      {
      /* TxPDO 1 */
      case 0x1A00:
         memcpy(pTmpData,(void *)&tpdodata,sizeof(_tpdo1A00_t));
         pTmpData+=sizeof(_tpdo1A00_t);
         break;
      case 0x1A01:
         break;
      default:
        break;
      }
   }
}

APPL_InputMapping参数中pData就是传入进来的单片机本地的内存地址,在PDO_InputMappings函数中会将该内存地址的数据拷贝到ESC中,拷贝长度为总的映射长度。

TxPDOassign的aEntries中记录了0x1C13中所包含的对象字典。因为目前我们值映射了0x1A00,所以相当于只执行了memcpy这句话,将tpdodata的数据拷贝到pData的地址中。

如果0x1C13映射了0x1A00、0x1A01,那么在执行了memcpy这句话,可以将地址指针移位sizeof(_tpdo1A00_t)个长度,在继续拷贝0x1A01所对应的TPDO数据。

void APPL_OutputMapping(UINT16* pData)
{
    UINT16 j = 0;
    UINT16 *pTmpData = (UINT16 *)pData;
    for (j = 0; j < sRxPDOassign.u16SubIndex0; j++)
    {
        switch (sRxPDOassign.aEntries[j])
        {
        /* RxPDO 1 */
        case 0x1600:
            memcpy(&rpdodata,pTmpData,sizeof(_rpdo1600_t));
            pTmpData = pTmpData+sizeof(_rpdo1600_t);
            break;
        default:
            break;
        }
    }
}

APPL_OutputMapping的修改与APPL_InputMapping的思路差不多,不同的是memcpy的方向,是将传入地址的数据拷贝到rpdodata中。

void APPL_Application(void)
{

}

APPL_Application暂时没有修改,因为是简单的测试程序,我只通过debug观察rpdodata和tpdodata这两个变量就可以知道通信是否正常, 没有别的应用逻辑。

移植主要需要修改的源码有两个文件一个是myapp.c这个是SSC根据excel表格自动生成的文件,每个人的excel表格的名字不一样,所以文件名也不一样。另一个文件就是ecatport.c。其中myapp.c是我们实现应用逻辑的文件,而ecatport.c是实现我们硬件接口的地方。

修改 static UINT8 RxTxSpiData(UINT8 MosiByte) 这个是EL9800的SPI收发接口,将它改为我们自己的

5.其他

32位的单片机还需要修改ecat_def.h中的两个宏定义,改为如下:

/** 
OBJ_DWORD_ALIGN: Shall be set if the object structures are not Byte aligned and 32bit entries are implicitly padded to even 32bit memory addresses. */
#ifndef OBJ_DWORD_ALIGN
#define OBJ_DWORD_ALIGN                           1
#endif

/** 
OBJ_WORD_ALIGN: Shall be set if the object structures are not Byte aligned and 16bit entries are implicitly padded to even 16bit memory addresses. */
#ifndef OBJ_WORD_ALIGN
#define OBJ_WORD_ALIGN                            0
#endif

如果不修改,在初始化状态跳转的时候可能会报0x001E或0x001D的错误。该错误是因为CheckSmSettings函数在检查邮箱配置的时候发现ESC中配置的SM2或者SM3的长度与从站代码中的nPdInputSize变量或nPdOutputSize变量的值不相同所返回的。理论上主站在配置ESC的SM2和SM3长度的时候是先读取从站代码中的TPDO和RPDO的映射内容,然后根据映射内容来计算映射的数据长度,再将所计算的长度填写到ESC中。而从站代码的nPdInputSize和nPdOutputSize这两个变量的值也是根据TPDO和RPDO的映射内容计算得到的,所以ESC所配置的值应该和代码中的值一样才对。而在调用APPL_GenerateMapping获取nPdInputSize和nPdOutputSize的值的时候会调用OBJ_GetEntryOffset 来计算结构体中元素的地址的偏移量,如果OBJ_DWORD_ALIGN = 0 ,OBJ_WORD_ALIGN =1就会按照16位对齐来计算,而GD32是32位对齐的,所以计算后得到的地址是错误的,所得出的长度也是错误的。因此要设置OBJ_DWORD_ALIGN = 1 ,OBJ_WORD_ALIGN =0。

UINT16 APPL_GenerateMapping(UINT16 *pInputSize,UINT16 *pOutputSize)
{
    .....
      pPDOEntry = (UINT32 *)((UINT16 *)pPDO->pVarPtr + (OBJ_GetEntryOffset((PDOEntryCnt+1),pPDO)>>3)/2);    
    .....
}

需要注意的是OBJ_GetEntryOffset得到的值单位是bit,右移3位相当于除以8,转换位字节;后面又除了2是因为前面的pPDO->pVarPtr被强制转换位了(UINT16 *)类型,那么pPDO->pVarPtr+1 就相当于跨了两个字节。

移植工程链接:https://github.com/IJustLoveMyself/csdn-example文章来源地址https://www.toymoban.com/news/detail-520250.html

到了这里,关于Ethercat学习-从站源码移植的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • EtherCAT主站源码 基于STM32F407和STM32H743两款芯片 通过移植开源SOME主站代码,使两款芯片具有EtherCAT主站功能,支持DC同步功能

    EtherCAT主站源码基于STM32F407和STM32H743两款芯片,通过移植开源SOME主站代码,使两款芯片具有EtherCAT主站功能,支持DC同步功能。可支持汇川IS620N、松下A5B/A6B、欧姆龙G5系列、埃斯顿ProNet、迈信EP3E、台达A2-E,伟创SD700这几款EtherCAT总线伺服。支持的这些驱动器可以混用,主站自动

    2024年02月04日
    浏览(50)
  • DEVICENET转ETHERCAT网关连接ethercat通讯协议详细解析

    你有没有遇到过生产管理系统中,设备之间的通讯问题?两个不同协议的设备进行通讯,是不是很麻烦?今天,我们为大家介绍一款神奇的产品,能够将不同协议的设备进行连接,让现场的数据交换不再困扰! 远创智控YC-ECT-DNT是一款DEVICENET从站功能的通讯网关,可以将DEVI

    2024年02月13日
    浏览(37)
  • PROFINET转ETHERCAT协议网关三菱plc支持ethercat吗

    捷米特JM–ECAT-PN是自主研发的一款 PROFINET 从站功能的通讯网关。该产品主要功能是将 PROFINET 网络和 ETHERCAT 网络连接起来。 捷米特JM-ECAT-PN连接到 PROFINET 总线中做为从站使用,连接到 ETHERCAT 总线中做为从站使用。 3.技术参数 PROFINET 技术参数 网关做为 PROFINET 网络的 Device 设备

    2024年02月14日
    浏览(35)
  • IGH(EtherCAT开源主站)移植到beaglebone black(AM3358)开发板上

    本文是在已经打上xenomai补丁的linux-3.8.13-bone86内核源码上进行的,参看使用xenomai与linux内核源码交叉编译,移植到beaglebone black(AM3358)开发板上 igh软件下载地址: IgH EtherCAT Master for Linux (etherlab.org) 将打入xenomai补丁,写入sd卡的系统的sd卡挂载(插入电脑,自动挂载)到ubuntu系统

    2024年02月11日
    浏览(46)
  • EtherCAT 开源主站 IGH 在 linux 开发板的移植和伺服通信测试

    手边有一套正点原子linux开发板imax6ul,一直在吃灰,周末业余时间无聊,把EtherCAT的开源IGH主站移植到开发板上玩玩儿,搞点事情做。顺便学习研究下EtherCAT总线协议及其对伺服驱动器的运动控制过程。实验很有意思,这里总结下实验过程,分享给有需要的小伙伴。 igh EtherC

    2024年04月29日
    浏览(123)
  • Modbus tcp转ETHERCAT网关modbus tcp/ip协议

    捷米JM-ECT-TCP网关能够连接到Modbus tcp总线和ETHERCAT总线中,实现两种不同协议设备之间的通讯。这个网关能够大大提高工业生产的效率和生产效益,让生产变得更加智能化。捷米JM-ECT-TCP 是自主研发的一款 ETHERCAT 从站功能的通讯网关。该产品主要功能是将 ETHERCAT 网络和 MODB

    2024年02月15日
    浏览(74)
  • ​EtherNet/IP 库卡机器人和EtherCAT倍福PLC总线协议连接案例​

    EtherNet/IP 是一种适合于工业环境和对时间要求比较苛刻的应用的网络。而远创智控YC-EIPM-ECT通讯网关,是一款自主研发的EtherNet/IP 从站功能的通讯网关。它不仅可以实现EtherNet/IP 和EtherCAT的无缝连接,还可以将EtherNet/IP 作为从站连接到EtherCAT总线中。此外,它还具有高度集成、

    2024年02月06日
    浏览(46)
  • Ethercat学习-GD32以太网学习

    1、GD32F4以太网简介 GD32F4系列以太网模块包含10/100Mbps以太网MAC,数据的收发都通过DMA进行操作,支持MII(媒体独立接口)与RMII(简化的媒体独立接口)两种与物理层(PHY)通讯的标准接口。 2、以太网模框图简介 ​ 以太网需要外接一个PHY(以太网芯片)才可以进行通信。与PH

    2024年02月06日
    浏览(46)
  • ETHERCAT转ETHERCAT网关西门子为什么不支持ethercat两个ETHERCAT设备互联

    1.1 产品功能 远创智控YC-ECT-ECT是自主研发的一款ETHERCAT从站功能的通讯网关。该产品主要功能是将2个ETHERCAT网络连接起来。 本网关连接到ETHERCAT总线中做为从站使用。 1.2 技术参数 1.2.1 远创智控YC-ECT-ECT技术参数 ● 网关做为ETHERCAT网络的从站,可以连接倍福、欧姆龙、基恩士等

    2024年02月16日
    浏览(34)
  • EtherCAT转TCP/IP网关ethercat最大通讯距离

    天啊!你们听说了吗?数据互联互通问题终于迎来了突破性进展!作为生产管理系统的关键部分,数据互联互通一直是个大问题。然而,ETHERCAT和TCP/IP是两个不同的协议,它们之间的通讯一直是个大 问题。但是,现在有一款神奇的产品出现了,它叫做远创智控YC-ECT-TCPIP,它可

    2024年02月13日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包