本文描述了如何通过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
- 在用户手册中查询模块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同理,请参考对应网络协议设计指导手册。
- 详情请参考对应协议的网络设计手册,本例中以PROFINET协议为例,因此参考《Anybus CompactCom 40 - PROFINET IRT Network Guide》指导手册13.5小节,上诉属性分别由Anybus CompactCom40 Network Configuration Object(0x04)的实例3、4、5、6实现,EtherNet/IP Modbus TCP同理,请参考对应网络协议设计指导手册。
-
在驱动程序中设置上述属性的方法
- 在用户初始化命令序列中添加设置命令(命令序列(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 );
}
- 在用户初始化命令序列中添加设置命令(命令序列(Command sequencer)说明请参考《Anybus Compact 40 Host application implementation guide》第40页)
-
示例驱动程序中已预先实现了上诉属性设置的命令构建函数,并已经添加至用户命令序列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默认关闭。
-
- 用户命令序列在ABCC_CbfUserInitReq()函数中调用
- 本文中介绍了命令序列执行的两个阶段-模块初始化前与模块初始化之后,由于命令构建函数中对于命令设置了执行的条件,因此需要实现一个应用层函数,用于判断命令序列的执行时机与设置命令执行条件。
-
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的命令序列
-
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()
};
-
-
定义命令序列执行函数
-
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 );
}
-
- 本文中介绍了命令序列执行的两个阶段-模块初始化前与模块初始化之后,由于命令构建函数中对于命令设置了执行的条件,因此需要实现一个应用层函数,用于判断命令序列的执行时机与设置命令执行条件。实现应用层函数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;
-
-
- 重置Anybus CompactCom 40模块
附加信息
以上代码仅作参考,不作为功能的最终实现,最终实现需要根据实际情况而定,请您先梳理该功能实现的流程,并参考官网英文手册实现功能需求。
官网手册下载地址如下:
补充说明:
由于开启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 );
}