免费高清特黄a大片,九一h片在线免费看,a免费国产一级特黄aa大,国产精品国产主播在线观看,成人精品一区久久久久,一级特黄aa大片,俄罗斯无遮挡一级毛片

分享

EtherCAT從設(shè)備輸入輸出實(shí)現(xiàn)

 beginnow1 2023-12-18 發(fā)布于廣東

EtherCAT從站功能

EtherCAT是由德國(guó)BECKHOFF公司開發(fā)的一種通訊協(xié)議,并在2003年成立了ETG工作組,EtherCAT是一個(gè)可用于現(xiàn)場(chǎng)級(jí)別的超高速I/O,它使用標(biāo)準(zhǔn)的以太網(wǎng)物理層和常規(guī)的以太網(wǎng)卡,介質(zhì)可以為雙絞線或光纖,下面將介紹EtherCAT從站常用的數(shù)字量IO在通訊協(xié)議層的配置與應(yīng)用,此處不介紹部分算法的實(shí)現(xiàn)以及濾波函數(shù)的實(shí)現(xiàn)。

PDO映射關(guān)系

首先我們?cè)趯?shí)現(xiàn)我們的從站功能時(shí)先確定有哪些類型的輸入輸出,然后再確定輸入輸出的個(gè)數(shù)。在此處我們實(shí)現(xiàn)8個(gè)DI,8個(gè)DO。
8個(gè)數(shù)字量輸入我們分別分配索引0x1A00,子索引6000:01~6000:08。如下表所示

索引子索引IEC Type C type size
0x1A006000:01BOOL BOOL0.1
6000:02BOOL BOOL0.1
6000:03BOOL BOOL0.1
6000:04BOOL BOOL0.1
6000:05BOOL BOOL0.1
6000:06BOOL BOOL0.1
6000:07BOOL BOOL0.1
6000:08BOOL BOOL0.1
8個(gè)數(shù)字量輸出我們分別分配索引0x1600,子索引7000:01~7000:08。如下表所示
索引子索引IEC Type C type size
0x16007000:01BOOL BOOL1bit
7000:02BOOL BOOL1bit
7000:03BOOL BOOL1bit
7000:04BOOL BOOL1bit
7000:05BOOL BOOL1bit
7000:06BOOL BOOL1bit
7000:07BOOL BOOL1bit
7000:08BOOL BOOL1bit

數(shù)字量DI,DO

對(duì)于輸入數(shù)出模塊的增加我們先要修改STM32代碼:

STM32 程序修改el9800appl.h

  1. 修改對(duì)象0x1A00的數(shù)據(jù)結(jié)構(gòu)TOBJ1A00;
/** \brief 0x1A00 (Digital input TxPDO) data structure*/
typedef struct OBJ_STRUCT_PACKED_START {
   UINT16   u16SubIndex0; 	         /**< \brief SubIndex 0*/
   UINT32   aEntries[8];			 /**< \brief Entry buffer*/
} OBJ_STRUCT_PACKED_END
TOBJ1A00;
  1. 修改對(duì)象0x1600的數(shù)據(jù)結(jié)構(gòu)體TOBJ1600
/** \brief 0x1600(Digital output RxPDO) data structure*/
typedef struct OBJ_STRUCT_PACKED_START {
   UINT16   u16SubIndex0;           /**< \brief SubIndex 0*/
   UINT32   aEntries[8];            /**< \brief Entry buffer*/
} OBJ_STRUCT_PACKED_END
TOBJ1600;
  1. 在函數(shù)PROTO TOBJ1A00 sDITxPDOMap中修改對(duì)象0x1A00的變量來處理對(duì)象數(shù)據(jù)
PROTO TOBJ1A00 sDITxPDOMap
 = {8, 
  {0x60000101, 
   0x60000201, 
   0x60000301,
   0x60000401,
   0x60000501, 
   0x60000601, 
   0x60000701, 
   0x60000801, }
   };
  1. 在函數(shù)PROTO TOBJ1601 sDORxPDOMap中修改對(duì)象0x1600的變量來處理數(shù)據(jù)
PROTO TOBJ1601 sDORxPDOMap
= {8,
 {0x70000101, 
  0x70000201,
  0x70000301, 
  0x70000401,
  0x70000501, 
  0x70000601, 
  0x70000701, 
  0x70000801, }
  };

5.在結(jié)構(gòu)體OBJCONST TSDOINFOENTRYDESC OBJMEM asEntryDesc0x1A00[] 中修改對(duì)象0x1A00的條目的描述

OBJCONST TSDOINFOENTRYDESC	OBJMEM asEntryDesc0x1A00[] = {
  {DEFTYPE_UNSIGNED8, 0x8, ACCESS_READ },
  {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ},
  {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ},
  {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ},
  {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ},
  {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ},
  {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ},
  {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ},
  {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ},
  {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}};

6.在結(jié)構(gòu)體OBJCONST TSDOINFOENTRYDESC OBJMEM asEntryDesc0x1600[]中修改對(duì)象0x1600的條目的描述

OBJCONST TSDOINFOENTRYDESC	OBJMEM asEntryDesc0x1600[] = {
  {DEFTYPE_UNSIGNED8, 0x8, ACCESS_READ },
  {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ},
  {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ},
  {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ},
  {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ},
  {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ},
  {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ},
  {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ},
  {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ},
  {DEFTYPE_UNSIGNED32, 0x20, ACCESS_READ}};

7.修改TOBJ6000的結(jié)構(gòu)體

/** \brief 0x6000 (Digital input object) data structure*/
typedef struct OBJ_STRUCT_PACKED_START {
   UINT16   u16SubIndex0; /**< \brief SubIndex 0*/
   BOOLEAN(bSwitch1); /**< \brief Switch 1*/
   BOOLEAN(bSwitch2); /**< \brief Switch 2*/
   BOOLEAN(bSwitch3); /**< \brief Switch 3*/
   BOOLEAN(bSwitch4); /**< \brief Switch 4*/
   BOOLEAN(bSwitch5); /**< \brief Switch 5*/
   BOOLEAN(bSwitch6); /**< \brief Switch 6*/
   BOOLEAN(bSwitch7); /**< \brief Switch 7*/
   BOOLEAN(bSwitch8); /**< \brief Switch 8*/
   UINT8(SubIndex008) 
} OBJ_STRUCT_PACKED_END
TOBJ6000;

8.修改TOBJ7000的結(jié)構(gòu)體

/** \brief 0x7000 (Digital output object) data structure*/
typedef struct OBJ_STRUCT_PACKED_START {
   UINT16   u16SubIndex0; /**< \brief SubIndex 0*/
   BOOLEAN(bLED1); /**< \brief LED 1*/
   BOOLEAN(bLED2); /**< \brief LED 2*/
   BOOLEAN(bLED3); /**< \brief LED 3*/
   BOOLEAN(bLED4); /**< \brief LED 4*/
   BOOLEAN(bLED5); /**< \brief LED 5*/
   BOOLEAN(bLED6); /**< \brief LED 6*/
   BOOLEAN(bLED7); /**< \brief LED 7*/
   BOOLEAN(bLED8); /**< \brief LED 8*/
   UINT8(SubIndex008) 
} OBJ_STRUCT_PACKED_END
TOBJ7000;

9.修改函數(shù)OBJCONST TSDOINFOENTRYDESC OBJMEM asEntryDesc0x6000[]

OBJCONST TSDOINFOENTRYDESC    OBJMEM asEntryDesc0x6000[] = {
   {DEFTYPE_UNSIGNED8, 0x8, ACCESS_READ }, /* Subindex 000 */
   {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 001: Switch 1 */
   {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 002: Switch 2 */
   {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 003: Switch 3 */
   {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 004: Switch 4 */
   {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 005: Switch 5 */
   {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 006: Switch 6 */
   {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 007: Switch 7 */
   {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING}, /* SubIndex 008: Switch 8 */
}; 

10.修改函數(shù)OBJCONST TSDOINFOENTRYDESC OBJMEM asEntryDesc0x7000[]

OBJCONST TSDOINFOENTRYDESC    OBJMEM asEntryDesc0x7000[] = {
   {DEFTYPE_UNSIGNED8, 0x8, ACCESS_READ }, /* Subindex 000 */
   {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 001: LED 1 */
   {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 002: LED 2 */
   {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 003: LED 3 */
   {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 004: LED 4 */
   {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 005: LED 5 */
   {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 006: LED 6 */
   {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 007: LED 7 */
   {DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_RXPDOMAPPING}, /* SubIndex 008: LED 8 */
};

11.修改OBJCONST UCHAR OBJMEM aName0x6000[]

OBJCONST UCHAR OBJMEM aName0x6000[]= {
						/* 0  */  "DI Inputs" "\000"
						/* 1  */  "Switch 1" "\000"						/* 2  */  "Switch 2" "\000"						/* 3  */  "Switch 3" "\000"						/* 4  */  "Switch 4" "\000"						/* 5  */  "Switch 5" "\000"						/* 6  */  "Switch 6" "\000"						/* 7  */  "Switch 7" "\000"						/* 8  */  "Switch 8" "\000"						\377"
						};

12.修改OBJCONST UCHAR OBJMEM aName0x7000[]

OBJCONST UCHAR OBJMEM aName0x7010[] = {
						/* 0  */  "DO Outputs\000
						/* 1  */  "LED 1"   "\000"						/* 1  */  "LED 2"   "\000"						/* 1  */  "LED 3"   "\000"						/* 1  */  "LED 4"   "\000"						/* 1  */  "LED 5"   "\000"						/* 1  */  "LED 6"   "\000"						/* 1  */  "LED 7"   "\000"						/* 1  */  "LED 8"   "\000"						\377"
       					 };

13.修改PROTO TOBJ6000 sDIInputs

PROTO TOBJ6000 sDIInputs= {
	 8, 
	 0x00, 
	 0x00, 
	 0x00, 
	 0x00, 
	 0x00, 
	 0x00, 
	 0x00, 
	 0x00};

14.修改PROTO TOBJ7000 sDOOutputs

PROTO TOBJ7000 sDOOutputs= {
	 8, 
     0x00, 
     0x00, 
     0x00, 
     0x00, 
     0x00, 
     0x00, 
     0x00, 
     0x00};

STM32程序需要修改el9800appl.c文件的函數(shù)

1.修改函數(shù)void APPL_InputMapping(UINT16* pData)。

void APPL_InputMapping (UINT16* pData /*pointer to input process data*/)
{
  UINT16 j;
  UINT8 *pTmpData = (UINT8 *)pData;
  for (j = 0; j < sTxPDOassign.u16SubIndex0; j++) 
  {
    switch (sTxPDOassign.aEntries[j])
     {
      case 0x1A00:
        bsp_analog_input_update();
        memcpy(pTmpData, &_TOBJ6000.SubIndex008, sizeof(_TOBJ6000.SubIndex008));
        pTmpData += sizeof(_TOBJ6000.SubIndex008);
    }
  }
}

2.修改函數(shù)void APPL_OutputMapping(UINT16* pData)。

void APPL_OutputMapping (UINT16 * pData /*pointer to output process data*/)
{
  UINT16 j = 0;
  UINT8 *pTmpData = (UINT8 *)pData;

  for (j = 0; j < sRxPDOassign.u16SubIndex0; j++) {
    switch (sRxPDOassign.aEntries[j]) {
      case 0x1600:
        memcpy(&_TOBJ7000.SubIndex008, pTmpData, sizeof(_TOBJ7000.SubIndex008));
        pTmpData += sizeof(_TOBJ7000.SubIndex008);
    }
  }
}

XML文件修改

1.增加變量對(duì)應(yīng)于輸入映射索引0x1A00
增加變量對(duì)應(yīng)于輸出映射索引0x1A00的,需要修改DT1A00的數(shù)據(jù)類型。
1)修改DT1A00數(shù)據(jù)類型
利用Altova XMLSpy 2013軟件打開需要修改的xml文件,之后依次點(diǎn)擊“網(wǎng)格”→“EtherCATInfo”→“Descriptions”→“Devices”→“Device”→“Profile”→“Dictionary”→“DataTypes”→“DataType”找到DT1A00,點(diǎn)擊“SubItem”,修改其內(nèi)容如圖所示SubIdx需要按照順序遞增,Name名稱不能出現(xiàn)重復(fù)。Bitoffs是上一個(gè)SubItem的Bitsize與Bitoffs之和。
在這里插入圖片描述
2)修改0x1A00的參數(shù)
利用Altova XMLSpy 2013軟件打開需要修改的xml文件,之后依次點(diǎn)擊“網(wǎng)格”→“EtherCATInfo”→“Descriptions”→“Devices”→“Device”→“Profile”→“Dictionary”→“DataTypes”→“Object”找到0x1A00修改其參數(shù),此處的name,我們定義為DI TxPDO-Map,Type定義為上面修改好的數(shù)據(jù)類型DT1A00,BitSize按照數(shù)據(jù)類型大小填寫,點(diǎn)擊“Info”→“SubItem”修改其參數(shù),Name不可以重復(fù),Info內(nèi)容為其默認(rèn)數(shù)據(jù),也就是對(duì)應(yīng)子索引的地址值,修改結(jié)果如圖所示
在這里插入圖片描述

2.修改對(duì)應(yīng)子索引0x6000的數(shù)據(jù)類型及對(duì)象
由于索引0x1A00將TxPDO的數(shù)據(jù)映射到0x6000中,因此要修改0x6000的數(shù)據(jù)類型和對(duì)象
1)同樣按照修改DT1A00的方式打開xml文件,依次操作,找到DT6000,修改其內(nèi)容,修改方式按照DT1A00,修改結(jié)果如下圖所示,子索引值不可重復(fù),name值不可以重復(fù)
在這里插入圖片描述
2)同樣按照修改0x1A00的方式找到0x6000,name命名為“DI Input”,type為上面定義的“DT6000”size為DT6000的size,點(diǎn)擊“Info”→“SubItem”修改其參數(shù),name不可以重復(fù),Info信息為其默認(rèn)值。修改結(jié)果如下圖所示
在這里插入圖片描述
3.增加變量對(duì)應(yīng)于輸出映射索引0x1600
其修改方式按照0x1A00的方式修改,此處不再一一贅述。修改結(jié)果詳見下圖
1)DT1600
在這里插入圖片描述2)0x1600

在這里插入圖片描述
4.修改對(duì)應(yīng)子索引0x7000的數(shù)據(jù)類型及對(duì)象
其修改方式按照0x6000的方式修改,此處不再一一贅述。修改結(jié)果詳見下圖
1)DT7000
在這里插入圖片描述
2)0x7000
在這里插入圖片描述
5.修改TxPDO
利用Altova XMLSpy 2013軟件打開需要修改的xml文件,之后依次點(diǎn)擊“網(wǎng)格”→“EtherCATInfo”→“Descriptions”→“Devices”→“Device”→“TxPDO”
其中對(duì)象Fixed,配置為“ture”,Mandatory配置為“ture”SM配置為“3”Index配置為0x1A00,Name可自由配置,合理即可,此處我們命名為“DI TxPDO-Map”Entry填寫其子索引,Index配置為“#x6000”SubIndex配置為“1-8”BitLen配置為1,name可自由配置,合理即可,此處我們配置為"witch1-8"DataTy配置為“BOOL”下圖是配置好的TxPDO

在這里插入圖片描述
6.修改RxPDO
利用Altova XMLSpy 2013軟件打開需要修改的xml文件,之后依次點(diǎn)擊“網(wǎng)格”→“EtherCATInfo”→“Descriptions”→“Devices”→“Device”→“RxPDO”
其中對(duì)象Fixed,配置為“ture”,Mandatory配置為“ture”SM配置為“2”Index配置為0x1600,Name可自由配置,合理即可,此處我們命名為“DO RxPDO-Map”Entry填寫其子索引,Index配置為“#x7000”SubIndex配置為“1-8”BitLen配置為1,name可自由配置,合理即可,此處我們配置為"LED1-8"DataTy配置為“BOOL”下圖是配置好的RxPDO
在這里插入圖片描述
此時(shí)所有要修改的內(nèi)容均已修改完成。將編譯成功的STM32代碼下發(fā)到CPU,將編譯成功的XML文件通過EtherCATCfg.exe或EEPROM Programmer.exe或其他軟件燒寫到從站控制器Eeprom中,此處介紹利用EtherCATCfg.exe燒寫方案。

XML文件燒寫

EtherCATCfg.exe軟件是Beckhoff公司提供的一個(gè)用于從站測(cè)試的軟件,其功能齊全,某些情況下可能存在問題,但作為一個(gè)測(cè)試軟件,其功能已經(jīng)非常齊全了。有關(guān)于eeprom文件燒寫的方案介紹如下。
在桌面找到EtherCATCfg.exe圖標(biāo),單擊鼠標(biāo)右鍵→打開文件所在位置→打開EtherCAT文件夾,將剛才編寫成功的xml文件復(fù)制到此文件夾下,關(guān)閉文件夾,此時(shí)雙擊鼠標(biāo)左鍵打開EtherCATCfg.軟件,通過網(wǎng)線將電腦與EtherCAT從站模塊連接到一起,按照?qǐng)D示操作,
在這里插入圖片描述
1.依次點(diǎn)擊“確定”→“OK”→“是”→“是”→“是”此時(shí)已經(jīng)掃描到從站模塊,如圖中標(biāo)注所示。
在這里插入圖片描述
在這里插入圖片描述
2.點(diǎn)擊模塊“EtherCAT”→“Advanced Setting···”找到Write E2PROM,打開,
在這里插入圖片描述
3.選擇剛才修改好的XML文件,單擊“OK”即可燒寫到E2PROM
在這里插入圖片描述
待此窗口有自動(dòng)彈出后,表示E2PROM燒寫完畢,重啟EtherCATCfg及開發(fā)板,按照步驟1操作,即可掃描到設(shè)備,此時(shí)我們可以在“online”欄中看到此設(shè)備處于OP態(tài)。
在這里插入圖片描述
至此數(shù)字量輸入輸出模塊搭建完畢。

總結(jié)

本文章根據(jù)本人工作內(nèi)容編寫,可能存在某些不正確的地方,僅供參考。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約