用485总线,modbus协议通讯,移植完了不会用,网上看的程序也糊里糊涂的

2019-07-14 20:31发布

大家好,本人用的板子是STM32vet6,用到modbus通讯,但是初次接触modbus,modbus的文档也看了不少,但是程序里不知道怎么写来实现modbus的强大功能,目前我想先用modbus先实现接受和发送数据,但是不知道代码是怎样的,求大家能指导一下,或者大家有做过modbus这一块的,希望可以分享一下经验或者资料,感激不尽,帮助小白我,谢谢谢谢
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
17条回答
meimengxing2014
2019-07-16 19:07
/***********************************************************
函数名称:MBRTU_Fun03
函数功能: ModBus功能03协议(读多个寄存器)
输    入:RcvDataBuf            接收数据的指针
输    出:无      
返    回:无
*************************************************************/
static void MBRTU_Fun03(uint8_t *RcvDataBuf)                                           
{
    uint8_t SendBuf[64];                                                        //存储从机响应消息帧
    uint8_t SendLen = 0;
    uint8_t i,k;
    uint32_t Data_Buf;
    uint16_t ReadAdr = (uint16_t)RcvDataBuf[2] * 256 + RcvDataBuf[3];
    uint16_t Register_Num = (uint16_t)RcvDataBuf[4] * 256 + RcvDataBuf[5];
   
    SendBuf[SendLen++] = (MBRTU_GetSlaveAddr(RcvDataBuf)) ? ComAddr : 0x00;
    SendBuf[SendLen++] = MB_FUNC_READ_HOLDING_REGISTER;                                //功能码
    SendBuf[SendLen++] = Register_Num * 2;                                        //数据长度                  

    if (!(((ReadAdr >= HOLDING_REG_REGION1_BGEIN) && (ReadAdr <= HOLDING_REG_REGION1_END)
            && (ReadAdr + Register_Num <= (HOLDING_REG_REGION1_END + 1))) && (0 != Register_Num)))
    {
        MBRTU_SendErr(RcvDataBuf, MB_EX_ILLEGAL_DATA_ADDRESS);
        return;
    }

    for (k = 0; k < Register_Num; ReadAdr++, k++)
    {
        switch (ReadAdr)
        {
            case 0x0030:
                Data_Buf = PWMPara.PWM_Frequency;                                //PWM频率
                break;

            case 0x0031:
                Data_Buf = PWMPara.Duty;                                        //PWM占空比
                break;

            case 0x0032:
                Data_Buf = PWMPara.PulseCount;                                        //PWM脉冲个数
                break;
               
            default:
                Data_Buf = 0;
                break;
        }

        for (i = 2; i > 0; i--)
        {
            SendBuf[SendLen++] = (uint8_t)(Data_Buf >> ((i - 1) * 8));          //把数据分成两个字节
        }
    }
    MBRTU_SendMsg(SendBuf, SendLen);
}

一周热门 更多>