0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何在EtherCAT从站上增加模拟量输入AI变量

工控论坛 来源:工控有得聊 2026-03-11 16:30 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

“工控有得聊”是机械工业出版社“机工工控”“机工通信”品牌旗下专业资讯和服务平台,致力于帮助读者在电气通信、自动化领域里,紧跟前沿资讯,掌握核心技术,快速提升专业素养。点击蓝色微信名可快速关注我们。

工业自动化项目中,你是否曾因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所示。 97631fba-1c8a-11f1-90a1-92fbcf53809c.png

图1 XML文件中DT1A02的修改

②修改DT1A02对象

在XMLNotePad中点击“Dictionary”的子节点“Objects”,依次点击“Object”,找到0x1a02所在的位置,修改BitSize即可。这个BitSize值与上面DataType中DT1A02的BitSize要保持一致。本例中修改了0x1a02数据对象(输出映射表),增加8个SubItem,XML文件中0x1a02修改如图2所示。

97c61020-1c8a-11f1-90a1-92fbcf53809c.png

图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所示。

9822fd94-1c8a-11f1-90a1-92fbcf53809c.png

图3 XML文件中DT6020的修改

②修改DT6020对象

在XMLNotePad中点击“Dictionary”的子节点“Objects”,依次点击“Object”,找到0x6020所在的位置,修改BitSize即可。这个BitSize值与上面DataType中DT6020的BitSize要保持一致。同时增加8个SubItem并进行命名。XML文件中0x6020的修改如图4所示。

987d02da-1c8a-11f1-90a1-92fbcf53809c.png

图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

    文章

    551

    浏览量

    35199
  • AI
    AI
    +关注

    关注

    91

    文章

    41972

    浏览量

    303061
  • ethercat
    +关注

    关注

    20

    文章

    1620

    浏览量

    46344

原文标题:【留言赠书限5名】EtherCAT从站AI通道不够用?手把手教你扩容模拟量输入!

文章出处:【微信号:gkongbbs,微信公众号:工控论坛】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    模拟量和开关

    模拟量和开关 在控制系统中,一个常见的术语就是模拟量和开关。 不论输入还是输出,一个参数要么是
    发表于 12-11 11:38 3370次阅读

    LabVIEW入门到精通之模拟量输入(AI)程序设计

    【LabVIEW入门到精通】7.1 模拟量输入(AI)程序设计(利用LabVIEW实现)
    发表于 01-08 11:25 0次下载

    模拟量输入AI)程序设计(利用LabVIEW实现)

    【LabVIEW入门到精通】8.1 模拟量输入AI)程序设计(利用LabVIEW实现)
    发表于 01-08 16:03 0次下载

    通过DAQ实现模拟量输入AI)_labview程序案例

    程序案例通过DAQ实现模拟量输入AI),喜欢的朋友可以下载来学习。
    发表于 01-13 16:12 34次下载

    模拟量输入AI)_labview程序案例

    程序案例模拟量输入AI),喜欢的朋友可以下载来学习。
    发表于 01-13 16:12 18次下载

    模拟量输入AI)【集合】DAQ+DLL+普通控件_程序案例

    程序案例 模拟量输入AI)【集合】DAQ+DLL+普通控件
    发表于 01-13 16:22 24次下载

    利用LabVIEW实现模拟量输入AI)_程序案例

    程序案例 利用LabVIEW实现模拟量输入AI
    发表于 01-13 16:22 28次下载

    利用LabWindowsCVI实现模拟量输入AI_程序案例

    程序案例 利用LabWindowsCVI实现模拟量输入AI
    发表于 01-13 16:22 30次下载

    基于PLC模拟量输入接线方式

    本文档内容介绍了基于PLC模拟量输入接线方式,模拟量是指变量在一定范围连续变化的;也就是在一定范围(定义域)内可以取任意值(在值域内)。
    发表于 09-25 17:31 7次下载
    基于PLC<b class='flag-5'>模拟量</b>的<b class='flag-5'>输入</b>接线方式

    plc中的模拟量信号如何读取

    PLC读取模拟量信号必须要有模拟量输入模块,即常说的AI模块。
    的头像 发表于 11-12 16:21 1.4w次阅读

    什么是模拟量?什么是AI和什么是AO?AI输入还是输出?

    进行数据采集,其经过抽样和量化后可以转换为数字量。说到模拟量,就不得不提AI和AO,下面就来讲解下AI和AO。 AI和AO的讲解 (1)AI
    的头像 发表于 09-03 10:46 3.6w次阅读

    什么是模拟量,它的概念是怎样的

    数据采集,它通过采样和量化后可转换成数字量。谈到模拟量,不得不提AI和AO,下面来解释一下这两个概念。 对AI和AO的解释。 AI信号:即模拟量
    发表于 03-03 14:59 3.2w次阅读

    plc带模拟量输入输出和不带模拟量输入输出有什么区别啊?

    plc带模拟量输入输出和不带模拟量输入输出有什么区别啊? PLC是一种广泛应用的自动化控制器,它可通过输入和输出控制信号来管理各种自动化过程
    的头像 发表于 10-17 16:44 3154次阅读

    请问PLC是如何读取模拟量信号的?

    PLC读取模拟量信号必须要有模拟量输入模块,即常说的AI模块。
    的头像 发表于 01-02 09:35 2429次阅读
    请问PLC是如何读取<b class='flag-5'>模拟量</b>信号的?

    Modbus TCP或EtherNet/IP站转6通道输入模拟量AI)

    FAD-3160是一款将6路模拟量输入信号(AI)连接到Modbus TCP或者EtherNet/IP网络的模块,每个模拟量输入通道支持电压
    的头像 发表于 07-17 15:06 651次阅读
    Modbus TCP或EtherNet/IP<b class='flag-5'>从</b>站转6通道<b class='flag-5'>输入</b><b class='flag-5'>模拟量</b>(<b class='flag-5'>AI</b>)