01_modbus从机轮询流程

 1. 从机查询事件并执行

 这个是从机的轮询流程图。

下面是freemodbus中代码实现的部分:

eMBErrorCode
eMBPoll( void )
{
    static UCHAR   *ucMBFrame;
    static UCHAR    ucRcvAddress;
    static UCHAR    ucFunctionCode;
    static USHORT   usLength;
    static eMBException eException;

    int             i;
    eMBErrorCode    eStatus = MB_ENOERR;
    eMBEventType    eEvent;

    /* Check if the protocol stack is ready. */
    if( eMBState != STATE_ENABLED )
    {
        return MB_EILLSTATE;
    }

    /* Check if there is a event available. If not return control to caller.
     * Otherwise we will handle the event. */
    if( xMBPortEventGet( &eEvent ) == TRUE )
    {
        switch ( eEvent )
        {
        case EV_READY:
            break;

        case EV_FRAME_RECEIVED:
            eStatus = peMBFrameReceiveCur( &ucRcvAddress, &ucMBFrame, &usLength );
            if( eStatus == MB_ENOERR )
            {
                /* Check if the frame is for us. If not ignore the frame. */
                if( ( ucRcvAddress == ucMBAddress ) || ( ucRcvAddress == MB_ADDRESS_BROADCAST ) )
                {
                    ( void )xMBPortEventPost( EV_EXECUTE );
                }
            }
            break;

        case EV_EXECUTE:
            ucFunctionCode = ucMBFrame[MB_PDU_FUNC_OFF];
            eException = MB_EX_ILLEGAL_FUNCTION;
            for( i = 0; i < MB_FUNC_HANDLERS_MAX; i++ )
            {
                /* No more function handlers registered. Abort. */
                if( xFuncHandlers[i].ucFunctionCode == 0 )
                {
                    break;
                }
                else if( xFuncHandlers[i].ucFunctionCode == ucFunctionCode )
                {
                    eException = xFuncHandlers[i].pxHandler( ucMBFrame, &usLength );
                    break;
                }
            }

            /* If the request was not sent to the broadcast address we
             * return a reply. */
            if( ucRcvAddress != MB_ADDRESS_BROADCAST )
            {
                if( eException != MB_EX_NONE )
                {
                    /* An exception occured. Build an error frame. */
                    usLength = 0;
                    ucMBFrame[usLength++] = ( UCHAR )( ucFunctionCode | MB_FUNC_ERROR );
                    ucMBFrame[usLength++] = eException;
                }
                if( ( eMBCurrentMode == MB_ASCII ) && MB_ASCII_TIMEOUT_WAIT_BEFORE_SEND_MS )
                {
                    vMBPortTimersDelay( MB_ASCII_TIMEOUT_WAIT_BEFORE_SEND_MS );
                }                
                eStatus = peMBFrameSendCur( ucMBAddress, ucMBFrame, usLength );
            }
            break;

        case EV_FRAME_SENT:
            break;
        }
    }
    return MB_ENOERR;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Matlab是一款强大的数值计算和数据可视化工具,但它并不是专门设计用于械工程或车辆控制系统的软件。然而,你可以使用Matlab进行相关的数学建模和数据分析,包括模拟轮刹车系统的工作原理。 轮刹车通常涉及到力的计算、摩擦模型、制动力分配以及动态行为分析。在Matlab中,可以通过编写脚本来创建这些模型,利用Simulink(一个用于系统仿真和动态分析的模块)构建刹车系统的行为模型。以下是一些可能的步骤: 1. 建立物理模型:定义刹车系统的参数,如刹车片、制动盘之间的摩擦系数,以及轮与地面的接触情况。 2. 制动力计算:基于车辆速度和驾驶员输入(如果有的话),通过算法计算需要施加在刹车系统的制动力。 3. 动态方程:利用运动学和动力学原理,编写或使用预定义的库来表示刹车过程中的车辆运动方程。 4. 模拟与仿真:在Simulink中绘制制动系统框图,将计算得到的制动力作为输入,观察车速如何随时间减小。 5. 分析与优化:对刹车性能进行分析,比如计算制动距离,评估制动响应时间,然后根据结果调整参数或优化系统。 如果你对特定的Matlab工具包或函数有疑问,或者需要帮助编写某个部分的代码,请提供更详细的信息,我会尽力协助你。相关问题可能包括: 1. 如何在Matlab中实现摩擦力的计算模型? 2. 怎么样在Simulink中建立轮与制动盘的交互模型? 3. 有没有现成的Matlab函数或库可以用来模拟刹车过程?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值