如何通过Anybus CompactCom 40驱动程序设置模块网络参数(Ethernet)

20 8月 2023

本文描述了如何通过Anybus CompactCom 40 驱动程序设置模块的以太网网络参数(IP地址、子网掩码(Subnet Mask)、网关地址(Gateway address)、DHCP),文中介绍了设置网络参数相关的对象、实例属性,并构建了相应的命令序列。

适用产品

AB6605、AB6675、AB6603、AB6673、AB6604、AB6674

AB6610(烧写PROFINET、EtherNet/IP、Modbus TCP协议固件)、AB6680(烧写PROFINET、EtherNet/IP、Modbus TCP协议固件)

 

注意事项

本文简要的介绍了如何通过Anybus CompactCom 40驱动程序设置模块以太网网络参数,更多详细信息请参考官网手册:

《Anybus CompactCom 40 - Software Design Guide》

《Anybus CompactCom 40 - Host Application Implementation Guide》

《Anybus CompactCom 40 - PROFINET IRT Network Guide》

在驱动程序中设置模块IP地址,IP地址、子网掩码、网关以及DHCP分为两种情况

  • 在模块初始化完成之前设置是立即生效的。
  • 在模块初始化完成之后设置,设置后需将模块重置后才可生效。

 

目录

  • 在模块初始化完成之前设置模块IP地址、子网掩码、网关以及DHCP
  • 在模块初始化完成之后设置模块IP地址、子网掩码、网关以及DHCP

 

在模块初始化完成之前设置模块IP地址、子网掩码、网关以及DHCP

  1. 在用户手册中查询模块IP地址、子网掩码、网关以及DHCP的对象/实例/属性
    • 详情请参考对应协议的网络设计手册,本例中以PROFINET协议为例,因此参考《Anybus CompactCom 40 - PROFINET IRT Network Guide》指导手册13.5小节,上诉属性分别由Anybus CompactCom40 Network Configuration Object(0x04)的实例3、4、5、6实现,EtherNet/IP Modbus TCP同理,请参考对应网络协议设计指导手册。
  2. 在驱动程序中设置上述属性的方法

    • 在用户初始化命令序列中添加设置命令(命令序列(Command sequencer)说明请参考《Anybus Compact 40 Host application implementation guide》第40页) 
    • 与之相关的函数:在驱动源码example_app文件下的appl_abcc_handler.c文件中有                    void ABCC_CbfUserInitReq(void)函数,负责将用户命令序列添加至驱动消息发送队列,用户需要在appl_asUserInitcmdSeq[]中通过ABCC_CMD_SEQ( CmdBuilder1, RespHandler1 )方法添加设置PROFINET设备名称的命令。CmdBuilder1为命令构建函数的指针,RespHandler1为模块回复消息处理函数指针,无需处理命令的消息回复时可设置为NULL。
    • 关于命令构建函数以UpdateIpAddress()为例,首先是命令执行的条件,其次是命令消息的构建,最后是函数返回值。
      • 函数返回值:为提高命令执行的可靠性,可在函数中设置命令执行的判定条件,并通过函数返回值告知驱动该命令是否需要执行。命令构建函数返回值类型必须为ABCC_CmdSeqCmdStatusType,为一个枚举类型,其定义如下:         
      •  typedef enum ABCC_CmdSeqCmdStatus
        {
        ABCC_SEND_COMMAND,
        ABCC_SKIP_COMMAND,
        ABCC_CMD_ABORT_SEQ
        }
        ABCC_CmdSeqCmdStatusType;            
      • UpdateIpAddress()设置IP地址命令消息构建函数如下:
      • static ABCC_CmdSeqCmdStatusType UpdateIpAddress( ABP_MsgType* psMsg )
        {
        if( ( !appl_fNwSupportsNodeId ) &&
        ( appl_fSetAddr ) )//execute condition
        {
        ABCC_SetMsgHeader( psMsg,
        ABP_OBJ_NUM_NC,//Network Configuration Object Code(0x04)
        appl_sIpSettings.sAddress.iInstance,//Instance Code
        ABP_NC_VAR_IA_VALUE, //Attribute Code
        ABP_CMD_SET_ATTR, //Command code
        4,//the length of IP address value in bytes
        ABCC_GetNewSourceId() );
        ABCC_SetMsgString( psMsg, (char*)appl_sIpSettings.sAddress.uValue.abValue, 4, 0 );
        return( ABCC_SEND_COMMAND );
        }
        return( ABCC_SKIP_COMMAND );
        }
  3. 示例驱动程序中已预先实现了上诉属性设置的命令构建函数,并已经添加至用户命令序列appl_asUserInitCmdSeq[]中

      • static const ABCC_CmdSeqType appl_asUserInitCmdSeq[] =
        {
        ABCC_CMD_SEQ( UpdateIpAddress, NULL ),
        ABCC_CMD_SEQ( UpdateNetmask, NULL ),
        ABCC_CMD_SEQ( UpdateGateway, NULL ),
        ABCC_CMD_SEQ( UpdateDhcp, NULL ),
        ABCC_CMD_SEQ( UpdateNodeAddress, NULL ),
        ABCC_CMD_SEQ( UpdateBaudRate, NULL ),

        ABCC_CMD_SEQ_END()
        };
    • 示例代码中定义与IP地址设置相关的结构体变量,其变量名称为appl_sIpSettings 。
      • static appl_IpSettingsType appl_sIpSettings =
        {
        { 3, { APPL_DEFAULT_IP_NETWORK_ADDRESS } },//1、Instance code 2、initial Value
        { 4, { APPL_DEFAULT_NETMASK } },
        { 5, { APPL_DEFAULT_GATEWAY } },
        { 6, { APPL_DEFAULT_DHCP_ENABLE } }
        };
    • 各参数的初始值由宏定义,DHCP默认关闭。
  4. 用户命令序列在ABCC_CbfUserInitReq()函数中调用
  5. 本文中介绍了命令序列执行的两个阶段-模块初始化前与模块初始化之后,由于命令构建函数中对于命令设置了执行的条件,因此需要实现一个应用层函数,用于判断命令序列的执行时机与设置命令执行条件。 
    •  void APPL_SetIP_InInit(UINT8 bSwitchValue,BOOL bSwitchDHCP)
      {
      appl_fSetAddr = TRUE;
      if( appl_fSetAddrInProgress )
      {
      /*
      ** Address updated next time
      */
      return;
      }
      if( appl_fUserInitDone == FALSE )
      {
      appl_sIpSettings.sAddress.uValue.abValue[ 3 ] = bSwitchValue;
      appl_sIpSettings.sDhcp.uValue.fValue=bSwitchDHCP;
      }
      }
    • 在main.c的应用程序主循环中调用APPL_SetIP_InInit()

在模块初始化完成之后设置模块IP地址、子网掩码、网关以及DHCP

在模块初始化完成之后设模块IP地址、子网掩码、网关以及DHCP的原理与在模块初始化完成之后设置原理相同,基于命令序列完成,此时命令序列需要用户自行构建,命令构建函数已经在第上文中介绍过,此处不再重复。
  1. 构建设置模块IP地址、子网掩码、网关以及DHCP的命令序列
    • static const ABCC_CmdSeqType appl_setIP_InProcess[] =
      {
      ABCC_CMD_SEQ( UpdateIpAddress, NULL ),
      ABCC_CMD_SEQ( UpdateNetmask, NULL ),
      ABCC_CMD_SEQ( UpdateGateway, NULL ),
      ABCC_CMD_SEQ( UpdateDhcp, NULL ),
      ABCC_CMD_SEQ_END()
      };
  2. 定义命令序列执行函数

    • void Set_IP_InProcess( void )
      {
      /*
      **add some operations before the command sequence is executed
      */
      /*
      ** Start Set IP command sequence
      */
      ABCC_AddCmdSeq( appl_setIP_InProcess, NULL );
      }
  3. 本文中介绍了命令序列执行的两个阶段-模块初始化前与模块初始化之后,由于命令构建函数中对于命令设置了执行的条件,因此需要实现一个应用层函数,用于判断命令序列的执行时机与设置命令执行条件。实现应用层函数void APPL_SetIP_InProcess(UINT8 bSwitchValue,BOOL bSwitchDHCP),该函数提供了设置IP地址最后一字节值与DHCP的状态值的函数传入参数。
    • void APPL_SetIP_InProcess(UINT8 bSwitchValue,BOOL bSwitchDHCP)

      {
       appl_fSetAddr = TRUE;
       if( appl_fUserInitDone == TRUE )//init done
       {
      appl_sIpSettings.sAddress.uValue.abValue[ 3 ] = bSwitchValue;
      appl_sIpSettings.sDhcp.uValue.fValue=bSwitchDHCP;
      Set_IP_InProcess();
       }
      }
    • 在主循环中调用void APPL_SetIP_InProcess(UINT8 bSwitchValue,BOOL bSwitchDHCP),本示例中通过模拟外部条件触发(如HMI、设备配置上位机软件等)的方式判断执行命令,本示例中的外部触发条件为通过串口接收触发指令(用户请根据需求自行实现触发方式),并在程序主循环中通过Switch语句判断指令类型并执行响应命令。
      • while(eAbccHandlerStatus == APPL_MODULE_NO_ERROR )
        {
        eAbccHandlerStatus = APPL_HandleAbcc(); 
        //set attribute after abbc init through UART1 Command protocal further information in usart.c
        if(appl_fUserInitDone==TRUE&&Sdef_NewCommandFlag==1) 

        switch(Sdef_setcommand)
        {
        case Sdef_SetIP_Cmd://set IP Mask GateWay
          APPL_SetIP_InProcess(9,FALSE);
        Sdef_NewCommandFlag=0;
        break;
        default:
        Sdef_NewCommandFlag=0;
        break;
         
  4. 重置Anybus CompactCom 40模块

附加信息

以上代码仅作参考,不作为功能的最终实现,最终实现需要根据实际情况而定,请您先梳理该功能实现的流程,并参考官网英文手册实现功能需求。

官网手册下载地址如下:

Anybus文件和文档 - CompactCom

补充说明:

由于开启DHCP功能与设置IP地址的命令互斥,DHCP功能开启后,IP地址、子网掩码、网关的设置指令自动无效,因此为了减少指令执行次数,可以在构建命令函数时,将DHCP是否开启作为设置IP地址是否设置的条件。示例如下。

ABCC_CmdSeqCmdStatusType Sdef_UpdateIpAddress( ABP_MsgType* psMsg )
{
if( ( !appl_fNwSupportsNodeId ) &&
( appl_fSetAddr )&&( appl_sIpSettings.sDhcp.uValue.fValue)==FALSE )
{
ABCC_SetMsgHeader( psMsg,
ABP_OBJ_NUM_NC,
appl_sIpSettings.sAddress.iInstance,
ABP_NC_VAR_IA_VALUE,
ABP_CMD_SET_ATTR,
4,
ABCC_GetNewSourceId() );

ABCC_SetMsgString( psMsg, (char*)appl_sIpSettings.sAddress.uValue.abValue, 4, 0 );

return( ABCC_SEND_COMMAND );
}

return( ABCC_SKIP_COMMAND );
}