“工控有得聊”是機械工業出版社“機工工控”“機工通信”品牌旗下專業資訊和服務平臺,致力于幫助讀者在電氣、通信、自動化領域里,緊跟前沿資訊,掌握核心技術,快速提升專業素養。點擊藍色微信名可快速關注我們。
在工業自動化項目中,你是否曾因EtherCAT從站的模擬量輸入(AI)通道不足而頭疼?想要靈活擴展,卻苦于官方手冊語焉不詳?
本文將為你揭秘從站設備添加AI變量的完整流程——
要在EtherCAT從站增加模擬量輸入AI變量,首先需更新從站設備程序,定義新的AI變量并初始化。然后,在PDO映射配置中添加該變量,以便主站讀取。接著,在從站驅動程序中更新數據處理邏輯,包括對AI變量的采集和處理。最后,在主站程序中更新對該AI變量的讀取邏輯,實現數據交換。通過這些步驟,可以成功在EtherCAT從站上增加模擬量輸入AI變量,并實現與主站的數據通信和控制。
修改XML文件有關模擬量輸入AI的部分
模擬量輸入AI的EtherCAT數據通信需要8個AI對象,打開XML文件,點擊第二個“TxPdo”,可以看到其Name是AI Inputs并且其下擁有7個Entry,在其后增加8個自定義的AI變量。具體添加過程如下。
(1)增加變量對應于輸入映射索引0x1a02
增加變量對應于輸入映射索引0x1a02的,需要修改DT1A02數據類型以增加8個變量。
①修改DT1A02數據類型
利用XMLNotePad打開要修改的XML文件,之后依次點擊節點:
“EtherCATInfo”→“Descriptions”→“Devices”→“Device”→“Profile”→“Dictionary”→“DataTypes”,依次點擊子節點“DataType”,直至找到DT1A02所在的位置,在最后的“SubItem”右鍵“Duplicate”復制8個新的SubItem。之后,修改新建的SubItem的SubIdx,Name和Type等信息。
SubIdx按順序遞增,Name等根據需求定義,BitOffs是上一個SubItem的BitSize和BitOffs的和。因為添加了新的SubItem,所以DT1A02的BitSize要隨之更新,它的值是最后一個SubItem的BitSize和BitOffs的和。XML文件中DT1A02的修改如圖1所示。 
圖1 XML文件中DT1A02的修改
②修改DT1A02對象
在XMLNotePad中點擊“Dictionary”的子節點“Objects”,依次點擊“Object”,找到0x1a02所在的位置,修改BitSize即可。這個BitSize值與上面DataType中DT1A02的BitSize要保持一致。本例中修改了0x1a02數據對象(輸出映射表),增加8個SubItem,XML文件中0x1a02修改如圖2所示。

圖2 XML文件中0x1a02的修改
(2)修改0x6020數據類型及對象
由于索引0x1a02將輸出過程數據映射到0x6020中,需要修改0x6020數據類型和對象。
①修改DT6020數據類型
利用XMLNotePad打開要修改的XML文件,之后依次點擊節點:
“EtherCATInfo”→“Descriptions”→“Devices”→“Device”→“Profile”→“Dictionary”→“DataTypes”,依次點擊子節點“DataType”,直至找到DT6020所在的位置,新增8個SubItem。之后,修改新建的SubItem的SubIdx,Name和Type等信息。
SubIdx按順序遞增,Name等根據需求定義,BitOffs是上一個SubItem的BitSize和BitOffs的和。同時因為添加了新的SubItem,所以DT6020的BitSize要隨之更新,它的值是最后一個SubItem的BitSize和BitOffs的和。XML文件中DT6020的修改如圖3所示。

圖3 XML文件中DT6020的修改
②修改DT6020對象
在XMLNotePad中點擊“Dictionary”的子節點“Objects”,依次點擊“Object”,找到0x6020所在的位置,修改BitSize即可。這個BitSize值與上面DataType中DT6020的BitSize要保持一致。同時增加8個SubItem并進行命名。XML文件中0x6020的修改如圖4所示。

圖4 XML文件中0x6020的修改
修改STM32程序有關模擬量輸入AI的部分
(1)在el9800appl.h文件中修改索引0x1a02的本地存儲變量等相關信息
① 修改0x1a02的本地存儲
修改TOBJ1A02對應的結構體typedef struct OBJ_STRUCT_PACKED_START。
typedefstructOBJ_STRUCT_PACKED_START
{
UINT16 u16SubIndex0;/* SubIndex 0*/
UINT32 aEntries[16];/* Entry buffer*/
} OBJ_STRUCT_PACKED_END
TOBJ1A02
② 初始化0x1a02與XML文件對應
在圖8-19中,在XML文件中對DT1A02進行修改,增加了8個SubItem,且其最大的子索引是16。在圖8-20中,在XML文件中對0x1a02進行修改,增加了8個SubItem,其DefaultData表示映射索引號。故而在函數PROTO TOBJ1A02 sAITxPDOMap中進行相應修改:首元素變為16,末尾添加8個元素分別是新增的8個SubItem的相應索引號。
PROTO TOBJ1A02 sAITxPDOMap
#ifdef
_EVALBOARD_
= {16, {0x60200101,0x60200201,0x60200302,0x60200502,0x08,0x18020701,0x18020901,0x60201110,0x60201210,0x60201310,0x60201410,0x60201510,0x60201610,0x60201710,0x60201810,0x60201910}}
#endif
③ 修改0x1a02表項描述
修改結構體OBJCONST TSDOINFOENTRYDESC OBJMEM asEntryDesc0x1A02[]。
OBJCONST TSDOINFOENTRYDESCOBJMEM asEntryDesc0x1A02[] =
{
{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},
{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},
}
(2)在el9800appl.h文件中修改索引0x6020的本地存儲變量等相關信息
① 修改0x6020的本地存儲
修改TOBJ6020對應的typedef struct OBJ_STRUCT_PACKED_START。
typedefstructOBJ_STRUCT_PACKED_START
{
UINT16 u16SubIndex0;/* SubIndex 0*/
BOOLEAN(bUnderrange);/* (SI1) Analog input under range*/
BOOLEAN(bOverrange);/* (SI2) Analog input over range*/
BIT2(b2Limit1);/* (SI3) Analog input 1st limit*/
BIT2(b2Limit2);/* (SI5) Analog input 2nd limit*/
ALIGN2(SubIndex006)/* 2Bit alignment*/
ALIGN6(SubIndex007)/* 2Bit alignment*/
BOOLEAN(bTxPDOState);/* (SI15) TxPdo state*/
BOOLEAN(bTxPDOToggle);/* (SI16) TxPdo toggle*/
INT16 i16Analoginput;/* (SI17) Analog input value*/
INT16 i16AI1;/* (SI18) Analog input value*/
INT16 i16AI2;/* (SI19) Analog input value*/
INT16 i16AI3;/* (SI20) Analog input value*/
INT16 i16AI4;/* (SI21) Analog input value*/
INT16 i16AI5;/* (SI22) Analog input value*/
INT16 i16AI6;/* (SI23) Analog input value*/
INT16 i16AI7;/* (SI24) Analog input value*/
INT16 i16AI8;/* (SI25) Analog input value*/
} OBJ_STRUCT_PACKED_END
TOBJ6020
② 初始化0x6020與XML文件對應
在圖8-21中,在XML文件中對0x6020進行了修改,增加了8個SubItem,且其最大的子索引是25。對應在函數PROTO TOBJ6020 sAIInputs中進行修改:首元素變為最大子索引25,末尾添加8個元素分別是新增的8個SubItem的初始值。
PROTO TOBJ6020 sAIInputs
#ifdef
_EVALBOARD_
= {25,0x00,0x00,0x00,0x00,0,0,0x00,0x00,0x7FFF,0x0001,0x0001,0x0001,0x0001,
0x0001,0x0001,0x0001,0x0001}
#endif
③ 修改0x6020表項描述
修改結構體OBJCONST TSDOINFOENTRYDESC OBJMEM asEntryDesc0x6020[]。
OBJCONST TSDOINFOENTRYDESC OBJMEM asEntryDesc0x6020[] = {
{DEFTYPE_UNSIGNED8, 0x8, ACCESS_READ },
{DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING},
{DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING},
{DEFTYPE_BIT2, 0x02, ACCESS_READ | OBJACCESS_TXPDOMAPPING},
{0x0000, 0, 0},
{DEFTYPE_BIT2, 0x02, ACCESS_READ | OBJACCESS_TXPDOMAPPING},
{0x0000, 0x02, 0},
{0x0000, 0x06, 0},
{0x0000, 0, 0},
{0x0000, 0, 0},
{0x0000, 0, 0},
{0x0000, 0, 0},
{0x0000, 0, 0},
{0x0000, 0, 0},
{0x0000, 0, 0},
{DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING},
{DEFTYPE_BOOLEAN, 0x01, ACCESS_READ | OBJACCESS_TXPDOMAPPING},
{DEFTYPE_INTEGER16, 0x10, ACCESS_READ | OBJACCESS_TXPDOMAPPING},
{DEFTYPE_INTEGER16, 0x10, ACCESS_READ | OBJACCESS_TXPDOMAPPING},
{DEFTYPE_INTEGER16, 0x10, ACCESS_READ | OBJACCESS_TXPDOMAPPING},
{DEFTYPE_INTEGER16, 0x10, ACCESS_READ | OBJACCESS_TXPDOMAPPING},
{DEFTYPE_INTEGER16, 0x10, ACCESS_READ | OBJACCESS_TXPDOMAPPING},
{DEFTYPE_INTEGER16, 0x10, ACCESS_READ | OBJACCESS_TXPDOMAPPING},
{DEFTYPE_INTEGER16, 0x10, ACCESS_READ | OBJACCESS_TXPDOMAPPING},
{DEFTYPE_INTEGER16, 0x10, ACCESS_READ | OBJACCESS_TXPDOMAPPING},
{DEFTYPE_INTEGER16, 0x10, ACCESS_READ | OBJACCESS_TXPDOMAPPING}
}
④ 修改0x1a02和0x6020的對象描述
修改TOBJECT OBJMEM ApplicationObjDic[],需要特別注意方框中數據要與子索引最大值相對應。
TOBJECT OBJMEM ApplicationObjDic[] =
{
……
/* Object 0x1A02 */
{NULL,NULL,0x1A02, {DEFTYPE_PDOMAPPING,16| (OBJCODE_REC <8)}, asEntryDesc0x1A02, aName0x1A02, &sAITxPDOMap,?NULL,?NULL,?0x0000?},
? ? ……
? ??/* Object 0x6020 */
? ? {NULL,?NULL,?0x6020, {DEFTYPE_RECORD,?25?| (OBJCODE_REC <8)}, asEntryDesc0x6020, aName0x6020, &sAIInputs,?NULL,?NULL,?0x0000?},
? ? ……
}
(3)修改el9800appl.c源文件中的有關內容
① 在函數void APPL_Application(void)中給自定義的變量賦值
voidAPPL_Application(void)
{
……
sAIIutputs.i16AI1= sAOOutputs.i16AO01;
sAIIutputs.i16AI2= sAOOutputs.i16AO02;
sAIIutputs.i16AI3= sAOOutputs.i16AO03;
sAIIutputs.i16AI4= sAOOutputs.i16AO04;
sAIIutputs.i16AI5= sAOOutputs.i16AO05;
sAIIutputs.i16AI6= sAOOutputs.i16AO06;
sAIIutputs.i16AI7= sAOOutputs.i16AO07;
sAIIutputs.i16AI8= sAOOutputs.i16AO08;
……
}
② 在函數void APPL_InputMapping(UINT16* pData)中將已添加的變量傳給EtherCAT主站
voidAPPL_InputMapping(UINT16* pData)
{
UINT16j =0;
UINT16*pTmpData = (UINT16*)pData;
/* we go through all entries of the TxPDO Assign object to get the assigned TxPDOs */
for(j =0; j < sTxPDOassign.u16SubIndex0; j++)
? ?{
? ? ??switch?(sTxPDOassign.aEntries[j])
? ? ? {
? ? ??/* TxPDO 1 */
? ? ??case?0x1A00:
? ? ? ? ?*pTmpData++ = SWAPWORD(((UINT16?*) &sDIInputs)[1]);
? ? ? ? ?break;
? ? ??/* TxPDO 3 */
? ? ??case?0x1A02:
? ? ? ? ? ?*pTmpData++ = SWAPWORD(((UINT16?*) &sAIInputs)[1]);
? ? ? ? ? ?*pTmpData++ = SWAPWORD(((UINT16?*) &sAIInputs)[2]);
? *pTmpData++ = SWAPWORD(((UINT16?*) &sAIInputs)[3]);
? *pTmpData++ = SWAPWORD(((UINT16?*) &sAIInputs)[4]);
? *pTmpData++ = SWAPWORD(((UINT16?*) &sAIInputs)[5]);
? *pTmpData++ = SWAPWORD(((UINT16?*) &sAIInputs)[6]);
? *pTmpData++ = SWAPWORD(((UINT16?*) &sAIInputs)[7]);
? *pTmpData++ = SWAPWORD(((UINT16?*) &sAIInputs)[8]);
? *pTmpData++ = SWAPWORD(((UINT16?*) &sAIInputs)[9]);
? *pTmpData++ = SWAPWORD(((UINT16?*) &sAIInputs)[10]);
? ? ? ? ?break;
? ? ? }
? ?}
}
本文轉自《EtherCAT工業以太網應用系統設計》
第8章 EtherCAT從站增加模擬量輸入/輸出(AI/AO)數據通信的方法
-
數據通信
+關注
關注
2文章
538瀏覽量
35163 -
AI
+關注
關注
91文章
40701瀏覽量
302347 -
ethercat
+關注
關注
20文章
1555瀏覽量
45854
原文標題:【留言贈書限5名】EtherCAT從站AI通道不夠用?手把手教你擴容模擬量輸入!
文章出處:【微信號:gkongbbs,微信公眾號:工控論壇】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
基于PLC模擬量的輸入接線方式
什么是模擬量?什么是AI和什么是AO?AI是輸入還是輸出?
什么是模擬量,它的概念是怎樣的
plc帶模擬量輸入輸出和不帶模擬量輸入輸出有什么區別啊?
Modbus TCP或EtherNet/IP從站轉6通道輸入模擬量(AI)
如何在EtherCAT從站上增加模擬量輸入AI變量
評論