商丘市网站建设_网站建设公司_服务器部署_seo优化
2026/1/16 6:40:08 网站建设 项目流程
///////////////////////////////////////////////////////////////////////////////////////// /** \param maxChannel 被检查的最后一个SM \return 0: 成功或者返回AL的状态码 \brief 这个函数检查所有的SM通道 *//////////////////////////////////////////////////////////////////////////////////////// UINT8 CheckSmSettings(UINT8 maxChannel) { UINT8 i; UINT8 result = 0; TSYNCMAN ESCMEM *pSyncMan; UINT16 SMLength = 0; UINT16 SMAddress = 0; /* 检查接收邮箱的的SM参数(SM0) */ pSyncMan = HW_GetSyncMan(MAILBOX_WRITE); SMLength = pSyncMan->Length; SMAddress = pSyncMan->PhysicalStartAddress; if (!(pSyncMan->Settings[SM_SETTING_ACTIVATE_OFFSET] & SM_SETTING_ENABLE_VALUE)) /* 接收邮箱不能使能 */ result = ALSTATUSCODE_INVALIDMBXCFGINPREOP; else if ( (pSyncMan->Settings[SM_SETTING_CONTROL_OFFSET] & SM_SETTING_DIRECTION_MASK) != SM_SETTING_DIRECTION_WRITE_VALUE) /* 接收邮箱由主站不能写*/ result = ALSTATUSCODE_INVALIDMBXCFGINPREOP; else if ( (pSyncMan->Settings[SM_SETTING_CONTROL_OFFSET] & SM_SETTING_MODE_MASK) != SM_SETTING_MODE_ONE_BUFFER_VALUE ) /* 接收邮箱不是在一个缓存模式 */ result = ALSTATUSCODE_INVALIDMBXCFGINPREOP; else if ( SMLength < MIN_MBX_SIZE ) /* 接收邮箱的大小太小 */ result = ALSTATUSCODE_INVALIDMBXCFGINPREOP; else if ( SMLength > MAX_MBX_SIZE ) /* 接收邮箱大小太大 */ result = ALSTATUSCODE_INVALIDMBXCFGINPREOP; else if ( SMAddress < MIN_MBX_WRITE_ADDRESS ) /* 接收邮箱的地址太小 */ result = ALSTATUSCODE_INVALIDMBXCFGINPREOP; else if ( SMAddress > MAX_MBX_WRITE_ADDRESS) /* 接收邮箱地址太大 */ result = ALSTATUSCODE_INVALIDMBXCFGINPREOP; if ( result == 0 )//则说明接收邮箱通过上面的检查 { /* 检查发送邮箱的SM参数(SM1) */ pSyncMan = HW_GetSyncMan(MAILBOX_READ); SMLength = pSyncMan->Length; SMAddress = pSyncMan->PhysicalStartAddress; if (!(pSyncMan->Settings[SM_SETTING_ACTIVATE_OFFSET] & SM_SETTING_ENABLE_VALUE)) /* 发送邮箱不使能 */ result = ALSTATUSCODE_INVALIDMBXCFGINPREOP; else if ( (pSyncMan->Settings[SM_SETTING_CONTROL_OFFSET] & SM_SETTING_DIRECTION_MASK) != SM_SETTING_DIRECTION_READ_VALUE) /* 接收邮箱不能被主站读*/ result = ALSTATUSCODE_INVALIDMBXCFGINPREOP; else if ( (pSyncMan->Settings[SM_SETTING_CONTROL_OFFSET] & SM_SETTING_MODE_MASK) != SM_SETTING_MODE_ONE_BUFFER_VALUE ) /* 接收邮箱不是一个缓冲区模式 */ result = ALSTATUSCODE_INVALIDMBXCFGINPREOP; else if ( SMLength < MIN_MBX_SIZE ) /* 发送邮箱的大小太小 */ result = ALSTATUSCODE_INVALIDMBXCFGINPREOP; else if ( SMLength > MAX_MBX_SIZE ) /* 发送邮箱的大小太大 */ result = ALSTATUSCODE_INVALIDMBXCFGINPREOP; else if ( SMAddress < MIN_MBX_READ_ADDRESS ) /* 发送邮箱的地址太小 */ result = ALSTATUSCODE_INVALIDMBXCFGINPREOP; else if ( SMAddress > MAX_MBX_READ_ADDRESS ) /* 发送邮箱的地址太大 */ result = ALSTATUSCODE_INVALIDMBXCFGINPREOP; } if ( result == 0 && maxChannel > PROCESS_DATA_IN )//发送邮箱通过上面的检查 { /* 当离开这个函数的时候,b3BufferMode被设置,如果输入和输出运行在3个缓冲区模式 */ b3BufferMode = TRUE; /* 检查SM的参数给输入通道(SM的通道3) */ pSyncMan = HW_GetSyncMan(PROCESS_DATA_IN); SMLength = pSyncMan->Length; SMAddress = pSyncMan->PhysicalStartAddress; if ( (pSyncMan->Settings[SM_SETTING_ACTIVATE_OFFSET] & SM_SETTING_ENABLE_VALUE) != 0 && SMLength == 0 ) /* SM3的大小是等于0和SM3是激活的 */ result = SYNCMANCHSETTINGS+1; else if (pSyncMan->Settings[SM_SETTING_ACTIVATE_OFFSET] & SM_SETTING_ENABLE_VALUE) { /* SM3是激活的,输入大小是大于0的 */ if ( SMLength != nPdInputSize || nPdInputSize == 0 || SMLength > MAX_PD_INPUT_SIZE) /* 大小不想符合sizes don't match */ result = SYNCMANCHSIZE+1; else /* 大小相互符合sizes matches */ if ( (pSyncMan->Settings[SM_SETTING_CONTROL_OFFSET] & SM_SETTING_DIRECTION_MASK) == SM_SETTING_DIRECTION_READ_VALUE ) { /* settings match */ if ( ( ( nAlStatus == STATE_PREOP )&&( SMAddress >= MIN_PD_READ_ADDRESS )&&( SMAddress <= MAX_PD_READ_ADDRESS ) ) ||( ( nAlStatus != STATE_PREOP )&&( SMAddress == nEscAddrInputData ) ) ) { /* 地址符合addresses match */ if ( (pSyncMan->Settings[SM_SETTING_CONTROL_OFFSET] & SM_SETTING_MODE_MASK) == SM_SETTING_MODE_ONE_BUFFER_VALUE ) /* 如果输入输入运行在1个缓冲区的模式,重置b3BufferMode inputs are running in 1-Buffer-Mode, reset flag b3BufferMode */ b3BufferMode = FALSE; } else /* 输入地址是超越了允许的范围,或者已经在SAFEOP和OP之间改变input address is out of the allowed area or has changed in SAFEOP or OP */ result = SYNCMANCHADDRESS+1; } else /* 输入设置不相符合input settings do not match */ result = SYNCMANCHSETTINGS+1; } else if ( SMLength != 0 || nPdInputSize != 0 ) /* 输入大小不等于0,即使SM3的通道是不能使能input size is not zero although the SM3 channel is not enabled */ result = SYNCMANCHSIZE+1; if ( result != 0 )//则出错处理 { result = ALSTATUSCODE_INVALIDSMINCFG; } }//结束result==0&&maxChannel... if ( result == 0 && maxChannel > PROCESS_DATA_OUT ) { /* 检查SM参数给输入(SM2)check the Sync Manager Parameter for the Outputs (Sync Manager Channel 2) */ pSyncMan = HW_GetSyncMan(PROCESS_DATA_OUT); SMLength = pSyncMan->Length; SMAddress = pSyncMan->PhysicalStartAddress; if ( (pSyncMan->Settings[SM_SETTING_ACTIVATE_OFFSET] & SM_SETTING_ENABLE_VALUE) != 0 && SMLength == 0 ) /* SM2的大小是等于0或者SM2是使能the SM2 size is 0 and the SM2 is active */ result = SYNCMANCHSETTINGS+1; else if (pSyncMan->Settings[SM_SETTING_ACTIVATE_OFFSET] & SM_SETTING_ENABLE_VALUE) { /* 如果SM2的通道是激活的,输出的大小是比0大Sync Manager Channel 2 is active, output size has to greater 0 */ if ( SMLength == nPdOutputSize && nPdOutputSize != 0 && SMLength <= ((UINT16)MAX_PD_OUTPUT_SIZE)) { /* 大小相互符合sizes match */ if ( (pSyncMan->Settings[SM_SETTING_CONTROL_OFFSET] & SM_SETTING_DIRECTION_MASK) == SM_SETTING_DIRECTION_WRITE_VALUE ) { /* 设置符合要求settings match */ if ( ( ( nAlStatus == STATE_PREOP )&&( SMAddress >= MIN_PD_WRITE_ADDRESS )&&( SMAddress <= MAX_PD_WRITE_ADDRESS ) ) ||( ( nAlStatus != STATE_PREOP )&&( SMAddress == nEscAddrOutputData ) ) ) { /* 地址符合addresses match */ { /* 检查是否看门狗触发使能check, if watchdog trigger is enabled */ if (pSyncMan->Settings[SM_SETTING_CONTROL_OFFSET] & SM_SETTING_WATCHDOG_VALUE) { bWdTrigger = TRUE; } else { bWdTrigger = FALSE; } if ( (pSyncMan->Settings[SM_SETTING_CONTROL_OFFSET] & SM_SETTING_MODE_MASK) == SM_SETTING_MODE_ONE_BUFFER_VALUE ) /* 输出是运行在1个缓冲区的模式,重置标志位b3BufferMode */ b3BufferMode = FALSE; } } else /* 输出地址已经超越允许的范围或者在SAFEOP和OP里面转变output address is out of the allowed area or has changed in SAFEOP or OP */ result = SYNCMANCHADDRESS+1; } else /* 输出设置不相符合output settings do not match */ result = SYNCMANCHSETTINGS+1; } else /* 输出大小不相符合output sizes don't match */ result = SYNCMANCHSIZE+1; } else if ( SMLength != 0 || nPdOutputSize != 0 ) /* 输出大小不等于0,虽然SM2通道不使能output size is not zero although the SM2 channel is not enabled */ result = SYNCMANCHSIZE+1; if ( result != 0 )//出错状态 { result = ALSTATUSCODE_INVALIDSMOUTCFG; } }//对应上面的result==0&&maxChannel... if ( result == 0 ) { UINT8 SMActivate = 0; /* 其它SM通道的使能字节被读来响应SM-改变-中断the Enable-Byte of the rest of the SM channels has to be read to acknowledge the SM-Change-Interrupt */ for (i = maxChannel; i < nMaxSyncMan; i++) { pSyncMan = HW_GetSyncMan(i); SMActivate = pSyncMan->Settings[SM_SETTING_ACTIVATE_OFFSET]; } } return result; }

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询