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 |
---|
0x1A00 | 6000:01 | BOOL | BOOL | 0.1 | 6000:02 | BOOL | BOOL | 0.1 | 6000:03 | BOOL | BOOL | 0.1 | 6000:04 | BOOL | BOOL | 0.1 | 6000:05 | BOOL | BOOL | 0.1 | 6000:06 | BOOL | BOOL | 0.1 | 6000:07 | BOOL | BOOL | 0.1 | 6000:08 | BOOL | BOOL | 0.1 |
8個(gè)數(shù)字量輸出我們分別分配索引0x1600,子索引7000:01~7000:08。如下表所示
索引 | 子索引 | IEC Type | C type | size |
---|
0x1600 | 7000:01 | BOOL | BOOL | 1bit | 7000:02 | BOOL | BOOL | 1bit | 7000:03 | BOOL | BOOL | 1bit | 7000:04 | BOOL | BOOL | 1bit | 7000:05 | BOOL | BOOL | 1bit | 7000:06 | BOOL | BOOL | 1bit | 7000:07 | BOOL | BOOL | 1bit | 7000:08 | BOOL | BOOL | 1bit |
數(shù)字量DI,DO
對(duì)于輸入數(shù)出模塊的增加我們先要修改STM32代碼:
STM32 程序修改el9800appl.h
- 修改對(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;
- 修改對(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;
- 在函數(shù)PROTO TOBJ1A00 sDITxPDOMap中修改對(duì)象0x1A00的變量來處理對(duì)象數(shù)據(jù)
PROTO TOBJ1A00 sDITxPDOMap
= {8,
{0x60000101,
0x60000201,
0x60000301,
0x60000401,
0x60000501,
0x60000601,
0x60000701,
0x60000801, }
};
- 在函數(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);
}
}
}
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)容編寫,可能存在某些不正確的地方,僅供參考。
|