整体软件架构
intmain( void )
{
HW_Init(); /* 初始化,包括硬件和A/D、SPI口读写配置*/
MainInit(); /* 主函数初始化包含:ESC 和COE */
bRunApplication = TRUE; /* 处于运行状态标志*/
do
{
MainLoop(); /* 主循环函数,实现周期性和非周期性数据交换*/
} while (bRunApplication == TRUE); /* 检查是否处于运行状态*/
HW_Release(); // 无意义的函数
return 0; // 设置正确返回
}
Testappl.c
测试应用程序是一个特定的奴隶堆栈提供大部分的指定的EtherCAT 特点和生成机制,这是奴隶的行为不符合 标准。这可以用来检查主行为不正确的奴隶的行为。
反应
Cia402appl 从栈代码包含的cia402驱动剖面样品的实现
在[ 1 ]。此实现提供了运动控制器之间的接口应用层通信。
以下功能的支持:
- cia402对象(见8.1章对象)
- cia402状态机(见8.2章状态机)
这支持同步循环位置(CSP)和同步循环
速度(CSV)的操作模式。反应
EL9800appl应用程序层
void APPL_Application(void) 该函数在同步模式和自由模式中均被调用
void APPL_AckErrorInd(UINT16 stateTrans) // 当发生主站承认发生错误时调用改程序
下面是包含状态转换函数
UINT16 APPL_StartMailboxHandler( void ) // 从初始化状态向预运行状态转换
UINT16 APPL_StopMailboxHandler( void ) // 从预运行状态向初始化状态转换
UINT16 APPL_StartInputHandler(UINT16*pIntMask) // 从预运行状态向安全运行状态转换
UINT16 APPL_StopInputHandler( void ) // 从安全运行状态向预运行状态转换
UINT16 APPL_StartOutputHandler( void ) // 从安全运行状态向运行状态转换
UINT16 APPL_StopOutputHandler( void ) // 从运行状态向安全运行状态转换
UINT16 APPL_GenerateMapping(UINT16*pInputSize,UINT16* pOutputSize)计算过程数据的位数
voidAPPL_InputMapping(UINT16* pData) //copies the inputs from the local memory to the ESC memory
voidAPPL_OutputMapping(UINT16* pData) ESC->code
void APPL_Application( void ) //8 位灯控制函数LATB8-LATB15 端口控制
UINT8 ReadObject0x1802处 理SD0给TxPDO的读取应答
Main 函数
intmain( void )
{
/* initialize the Hardware and the EtherCATSlave Controller */
HW_Init(); /* 初始化,包括硬件和A/D、SPI口读写配置*/
MainInit(); /* 主函数初始化包含:ESC 和COE */
bRunApplication = TRUE; /* 处于运行状态标志*/
do
{
MainLoop(); /* 主循环函数,实现周期性和非周期性数据交换*/
} while(bRunApplication == TRUE); /* 检查是否处于运行状态*/
HW_Release(); // 无意义的函数
return 0; // 设置正确返回
}
Tiescappl.c
前面是一些变量定义
void PDO_ResetOutputs( void ) 复位输出
{
sDOOutputs.LEDs = 0x00;
sDO1Outputs.Cmd = 0x00;
sDO1Outputs.Count = 0x00;
sDO1Outputs.MotorData = 0x1000;
}
后面是与el9800appl内容一样
Ecatappl.c
void PDO_InputMapping() // 执行输入数据操作
void PDO_OutputMapping() /* 将ESC 缓存中的输出数据拷贝到当地缓存区
void ECAT_CheckTimer( void )
如果开关ecat_timer_int 是,在不用中断的情况下实现看门狗的控制
在这种情况下,每ecat_main 周期检查本地一个定时器寄存器
该函数在毫秒触发
void PDI_Isr( void ) //PDI 接口中断函数同步模式处理周期性数据 中断向量INT1 对应该中断程序
void Sync0_Isr( void ) // 中断中断向量,本程序INT3 不使能中断,(分布时钟不用)
void ECAT_SetLedIndication( void ) // 根据灯的状态设置运行或故障
voidECAT_Init(void)
{
UINT8 i; // 定义位整形变量
/*Get Maximum Number of SyncManagers*/
UINT16 TmpVar = 0; // 定义位整形变量
HW_EscReadWord(TmpVar, ESC_COMM_INFO_OFFSET); // 读FMMU 数 0-8个可配置
TmpVar = SWAPWORD(TmpVar); // 交换字 高低位互换
nMaxSyncMan = (UINT8) ((TmpVar & ESC_SM_CHANNELS_MASK)>>ESC_SM_CHANNELS_SHIFT); /*nMaxSyncMan 变量中位表示当前需要配置的SM 通道数,
,用于下面使能代码, 执行完后留下TmpVar的低位*/
/* disable all Sync Manager channels ,初始化时将所有的SM通道屏蔽,在应用层中根据需要使能相应的SM通道*/
for (i = 0; i < nMaxSyncMan;i++) // 不使能所有的单元
HW_DisableSyncManChannel(i); // 每个SM 通道操作不使能
/* initialize the mailbox handler */
MBX_Init(); // 邮箱通信机制初始化
/* initialize variables */
bApplEsmPending = FALSE; //AL 访问ESM 标志
bEcatWaitForAlControlRes = FALSE; //ESCAT 等待AL 控制寄存器
bEcatFirstOutputsReceived = FALSE; //ESCAT 输入输出正确标志mainloop 函数中用
bEcatOutputUpdateRunning = FALSE; // 运行模式下,输出更新运行标志mainloop 函数中用
bEcatInputUpdateRunning = FALSE; // 安全运行或运行模式下、输入更新运行标志mainloop 函数中用
bWdTrigger = FALSE; //SM2 看门狗使能不使能标志
EcatWdValue = 0;
Sync0WdCounter = 0;
Sync0WdValue = 0;
bDcSyncActive = FALSE; // 分布时钟同步使能,mainloop 函数中用
bLocalErrorFlag = FALSE;
u16LocalErrorCode = 0x00; // 错误标志
u16ALEventMask = 0; // 在预运行和安全运行状态下将被赋给X204
/* initialize the AL Status register */
nAlStatus = STATE_INIT; //AL 状态赋值X01 初始化状态
SetALStatus(nAlStatus, 0); // 初始化通信变量和外设灯控制情况 ,只设置al 故障状态指示led
nEcatStateTrans = 0; // 状态切换标志为
u8EcatErrorLed = LED_OFF; // 错误指示灯,运行状态错误指示灯初始值为
bEscIntEnabled = FALSE; //ESC 中断SM2/3使能标志,mainloop函数中用
/* initialize the COE part */
COE_Init(); //COE 部分变量初始化
}
void COE_Init(void)
{
pCoeSendStored = 0;
nSdoInfoFragmentsLeft = 0;
}
PROTO TMBX MBXMEM * VARMEM pCoeSendStored;
/** if the mailbox service could not be sent(or stored), the CoE service will be stored in this variable
and will be sentautomatically from the mailbox handler (COE_ContinueInd) when the send mailbox will be read
the next time from themaster
/ ** 如果邮箱服务无法发送(或存储),COE 服务将被存储在该变量,
当邮箱下次读取主战的时候,将自动从邮箱chǔ理程序发送
* /
PROTO UINT16 VARMEM nSdoInfoFragmentsLeft; /**< \brief Number of fragments which need to betransmitted*/ 需要被传输的片段数量
Ecatappl.c中
Mainloop ()
运行模式判断:
输入输出状态判断,并置为相应的标志位
Ecatapplication
APPL_Application(); /*/ 该函数主要实现个灯和个开关量以及一路A/D转换值,备与主站之间数据交换
位于tiescappl中,该函数被SYNCISR 调用,或在sync不被支持时被mainloop调用。
*/
调用ECAT-Main;完成非周期数据操作,实现ESM和mailbox
调用ECATCheckError
intmain( void )
{
HW_Init(); /* 初始化,包括硬件和A/D、SPI口读写配置*/
MainInit(); /* 主函数初始化包含:ESC 和COE */
bRunApplication = TRUE; /* 处于运行状态标志*/
do
{
MainLoop(); /* 主循环函数,实现周期性和非周期性数据交换*/
} while (bRunApplication == TRUE); /* 检查是否处于运行状态*/
HW_Release(); // 无意义的函数
return 0; // 设置正确返回
}
Testappl.c
测试应用程序是一个特定的奴隶堆栈提供大部分的指定的EtherCAT 特点和生成机制,这是奴隶的行为不符合 标准。这可以用来检查主行为不正确的奴隶的行为。
反应
Cia402appl 从栈代码包含的cia402驱动剖面样品的实现
在[ 1 ]。此实现提供了运动控制器之间的接口应用层通信。
以下功能的支持:
- cia402对象(见8.1章对象)
- cia402状态机(见8.2章状态机)
这支持同步循环位置(CSP)和同步循环
速度(CSV)的操作模式。反应
EL9800appl应用程序层
void APPL_Application(void) 该函数在同步模式和自由模式中均被调用
void APPL_AckErrorInd(UINT16 stateTrans) // 当发生主站承认发生错误时调用改程序
下面是包含状态转换函数
UINT16 APPL_StartMailboxHandler( void ) // 从初始化状态向预运行状态转换
UINT16 APPL_StopMailboxHandler( void ) // 从预运行状态向初始化状态转换
UINT16 APPL_StartInputHandler(UINT16*pIntMask) // 从预运行状态向安全运行状态转换
UINT16 APPL_StopInputHandler( void ) // 从安全运行状态向预运行状态转换
UINT16 APPL_StartOutputHandler( void ) // 从安全运行状态向运行状态转换
UINT16 APPL_StopOutputHandler( void ) // 从运行状态向安全运行状态转换
UINT16 APPL_GenerateMapping(UINT16*pInputSize,UINT16* pOutputSize)计算过程数据的位数
voidAPPL_InputMapping(UINT16* pData) //copies the inputs from the local memory to the ESC memory
voidAPPL_OutputMapping(UINT16* pData) ESC->code
void APPL_Application( void ) //8 位灯控制函数LATB8-LATB15 端口控制
UINT8 ReadObject0x1802处 理SD0给TxPDO的读取应答
Main 函数
intmain( void )
{
/* initialize the Hardware and the EtherCATSlave Controller */
HW_Init(); /* 初始化,包括硬件和A/D、SPI口读写配置*/
MainInit(); /* 主函数初始化包含:ESC 和COE */
bRunApplication = TRUE; /* 处于运行状态标志*/
do
{
MainLoop(); /* 主循环函数,实现周期性和非周期性数据交换*/
} while(bRunApplication == TRUE); /* 检查是否处于运行状态*/
HW_Release(); // 无意义的函数
return 0; // 设置正确返回
}
Tiescappl.c
前面是一些变量定义
void PDO_ResetOutputs( void ) 复位输出
{
sDOOutputs.LEDs = 0x00;
sDO1Outputs.Cmd = 0x00;
sDO1Outputs.Count = 0x00;
sDO1Outputs.MotorData = 0x1000;
}
后面是与el9800appl内容一样
Ecatappl.c
void PDO_InputMapping() // 执行输入数据操作
void PDO_OutputMapping() /* 将ESC 缓存中的输出数据拷贝到当地缓存区
void ECAT_CheckTimer( void )
如果开关ecat_timer_int 是,在不用中断的情况下实现看门狗的控制
在这种情况下,每ecat_main 周期检查本地一个定时器寄存器
该函数在毫秒触发
void PDI_Isr( void ) //PDI 接口中断函数同步模式处理周期性数据 中断向量INT1 对应该中断程序
void Sync0_Isr( void ) // 中断中断向量,本程序INT3 不使能中断,(分布时钟不用)
void ECAT_SetLedIndication( void ) // 根据灯的状态设置运行或故障
voidECAT_Init(void)
{
UINT8 i; // 定义位整形变量
/*Get Maximum Number of SyncManagers*/
UINT16 TmpVar = 0; // 定义位整形变量
HW_EscReadWord(TmpVar, ESC_COMM_INFO_OFFSET); // 读FMMU 数 0-8个可配置
TmpVar = SWAPWORD(TmpVar); // 交换字 高低位互换
nMaxSyncMan = (UINT8) ((TmpVar & ESC_SM_CHANNELS_MASK)>>ESC_SM_CHANNELS_SHIFT); /*nMaxSyncMan 变量中位表示当前需要配置的SM 通道数,
,用于下面使能代码, 执行完后留下TmpVar的低位*/
/* disable all Sync Manager channels ,初始化时将所有的SM通道屏蔽,在应用层中根据需要使能相应的SM通道*/
for (i = 0; i < nMaxSyncMan;i++) // 不使能所有的单元
HW_DisableSyncManChannel(i); // 每个SM 通道操作不使能
/* initialize the mailbox handler */
MBX_Init(); // 邮箱通信机制初始化
/* initialize variables */
bApplEsmPending = FALSE; //AL 访问ESM 标志
bEcatWaitForAlControlRes = FALSE; //ESCAT 等待AL 控制寄存器
bEcatFirstOutputsReceived = FALSE; //ESCAT 输入输出正确标志mainloop 函数中用
bEcatOutputUpdateRunning = FALSE; // 运行模式下,输出更新运行标志mainloop 函数中用
bEcatInputUpdateRunning = FALSE; // 安全运行或运行模式下、输入更新运行标志mainloop 函数中用
bWdTrigger = FALSE; //SM2 看门狗使能不使能标志
EcatWdValue = 0;
Sync0WdCounter = 0;
Sync0WdValue = 0;
bDcSyncActive = FALSE; // 分布时钟同步使能,mainloop 函数中用
bLocalErrorFlag = FALSE;
u16LocalErrorCode = 0x00; // 错误标志
u16ALEventMask = 0; // 在预运行和安全运行状态下将被赋给X204
/* initialize the AL Status register */
nAlStatus = STATE_INIT; //AL 状态赋值X01 初始化状态
SetALStatus(nAlStatus, 0); // 初始化通信变量和外设灯控制情况 ,只设置al 故障状态指示led
nEcatStateTrans = 0; // 状态切换标志为
u8EcatErrorLed = LED_OFF; // 错误指示灯,运行状态错误指示灯初始值为
bEscIntEnabled = FALSE; //ESC 中断SM2/3使能标志,mainloop函数中用
/* initialize the COE part */
COE_Init(); //COE 部分变量初始化
}
void COE_Init(void)
{
pCoeSendStored = 0;
nSdoInfoFragmentsLeft = 0;
}
PROTO TMBX MBXMEM * VARMEM pCoeSendStored;
/** if the mailbox service could not be sent(or stored), the CoE service will be stored in this variable
and will be sentautomatically from the mailbox handler (COE_ContinueInd) when the send mailbox will be read
the next time from themaster
/ ** 如果邮箱服务无法发送(或存储),COE 服务将被存储在该变量,
当邮箱下次读取主战的时候,将自动从邮箱chǔ理程序发送
* /
PROTO UINT16 VARMEM nSdoInfoFragmentsLeft; /**< \brief Number of fragments which need to betransmitted*/ 需要被传输的片段数量
Ecatappl.c中
Mainloop ()
运行模式判断:
输入输出状态判断,并置为相应的标志位
Ecatapplication
APPL_Application(); /*/ 该函数主要实现个灯和个开关量以及一路A/D转换值,备与主站之间数据交换
位于tiescappl中,该函数被SYNCISR 调用,或在sync不被支持时被mainloop调用。
*/
调用ECAT-Main;完成非周期数据操作,实现ESM和mailbox
调用ECATCheckError