找回密码
 立即注册
查看: 729|回复: 12

Modbus 从机读写 赚点积分 勿喷

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:375
  • 最近打卡:2025-04-26 15:51:33
已绑定手机

27

主题

301

回帖

822

积分

高级会员

积分
822
发表于 2024-10-28 13:51:34 | 显示全部楼层 |阅读模式
赚点积分 勿喷{:5_313:}
/******************************************************************/
/*** 函数名称:void  ReadReg(void)                                       *******/
/*** 函数说明:读读寄存器                                                             *******/
/*** 参数:none                                                                             *******/
/*** 编写: 小坤                                                               *******/
/*** 备注:2024-2-23   V1.0                                                   *******/
/******************************************************************/
void  ReadReg(void)
{  
        Buff_u16_u8 Buff1={0};       
        INT8U buff_n[255];       
        INT16U i=0;
        INT8U n=0;
       
        Modbus.Reg_Len = Modbus.buff[4]*256+Modbus.buff[5];                                //寄存器长度       
       
        if((Modbus.Reg_Len<1)||(Modbus.Reg_Len>125))        return;                                //寄存器个数范围   1<=寄存器数量<=125       
        if(Modbus.Reg_addr+Modbus.Reg_Len >  Reg_len)   return;                      //起始地址+寄存器长度<=总寄存器数量
               
        buff_n[n++] = GSPCCommControlComponent.address;                                                        //地址  
        buff_n[n++] = Modbus.CMD;                                                        //功能码
        buff_n[n++] = Modbus.Reg_Len*2;                                         //数据长度       
        for(i=Modbus.Reg_addr; i<(Modbus.Reg_addr+Modbus.Reg_Len); i++ )                       
        {
                //Buff1.Dat = Modbus.Read_Reg[i];
                Buff1.Dat = Get_Read_Data(i);               
                buff_n[n++] = Buff1.Byte[1];
                buff_n[n++] = Buff1.Byte[0];                                        //数据       
        }
        Modbus.CRC_data = crc16( buff_n, n);       
        buff_n[n++] = Modbus.CRC_data>>8;
        buff_n[n++] = Modbus.CRC_data&0xFF;                                        //校验

        //putchars4_8th(buff_n, n);                                                        //串口4发送
        UART4_Send_n(buff_n, n);
}

/******************************************************************/
/*** 函数名称:void WriteReg(void)                                       *******/
/*** 函数说明:写寄存器                                                         *******/
/*** 参数:none                                                                             *******/
/*** 编写: 小坤                                                               *******/
/*** 备注:2024-2-23   V1.0                                                   *******/
/******************************************************************/
void WriteReg(void)
{
        Buff_u16_u8 Buff1;       
        INT8U buff_n[10];       
        INT16U i=0;
        INT8U n=0;
       
        if( Modbus.CMD == 0X06 )                //写单个寄存器
        {
                if( Modbus.Reg_addr <=         Reg_len)                //判断地址是否合规
                {
                        Buff1.Byte[1] = Modbus.buff[4];
                        Buff1.Byte[0] = Modbus.buff[5];        //获取数据
                        Modbus.Write_Reg[Modbus.Reg_addr] = Buff1.Dat;        //寄存器赋值
                        Modbus.Write_state        = 1;                 /*  加入存储 */
                        goto END;
                }       
        }       
        if( Modbus.CMD == 0X10 )                //写多个寄存器
        {
                Modbus.Reg_Len = Modbus.buff[4]*256+Modbus.buff[5];
                if((Modbus.Reg_Len<1)||(Modbus.Reg_Len>123))        return;                        //寄存器个数范围   1<=寄存器数量<=123
        if(Modbus.Reg_Len*2!=Modbus.buff[6])         return;                                //数据字节数据范围  Modbus.Reg_Len*2
                if(Modbus.Reg_addr+Modbus.Reg_Len >  Reg_len)   return;             //起始地址+寄存器长度<=总寄存器数量       
               
                for(i=Modbus.Reg_addr; i<(Modbus.Reg_addr+Modbus.Reg_Len); i++ )                       
                {               
                        Buff1.Byte[1] = Modbus.buff[n+7];               
                        n++;
                        Buff1.Byte[0] = Modbus.buff[n+7];;
                        n++;                       
                        Modbus.Write_Reg[i] = Buff1.Dat;                        //寄存器赋值                       
                }
               
                Modbus.Write_state        = 1;                 /*  加入存储 */
        }
       
END:
        for(n=0; n<6; n++)
        {
                buff_n[n] = Modbus.buff[n];                 //返回值
        }
        Modbus.CRC_data = crc16(buff_n, n);       
        buff_n[n++] = Modbus.CRC_data>>8;
        buff_n[n++] = Modbus.CRC_data&0xFF;                //校验       
        //putchars4_8th(buff_n, n);                                //串口4发送
        UART4_Send_n(buff_n, n);
}

       
/******************************************************************/
/*** 函数名称:void ZT_Moddus_Cail_Task(void)                         *******/
/*** 函数说明:Modbus任务处理 从机                                              *******/
/*** 参数:none                                                                             *******/
/*** 编写: 小坤                                                               *******/
/*** 备注:2024-2-23   V1.0                                                   *******/
/******************************************************************/

void Moddus_Task(void)
{
        INT8U i=0;

        for( i=0; i<Uart4.Rx_counter; i++ )
        {
                Modbus.buff[i] = Uart4.Rx_buff[i];               
        }
       
        Modbus.len = Uart4.Rx_counter;       
       
        Modbus.CRC_data = crc16((INT8U*)&Modbus.buff, (Modbus.len-2));                         //计算CRC校验值
       
        Modbus.CRC_H = Modbus.CRC_data >> 8;
        Modbus.CRC_L = Modbus.CRC_data & 0xFF;                                                                                //拆分高低位       
       

        if((Modbus.buff[Modbus.len - 2] == Modbus.CRC_H) && (Modbus.buff[Modbus.len - 1] == Modbus.CRC_L))  //判断CRC校验是否正确                       
        {       
                Modbus.address = Modbus.buff[0];                                                                                //地址               
       
                if((Modbus.address == GSPCCommControlComponent.address)||(Modbus.address == 255))                //判断地址               
                {
                        Modbus.CMD = Modbus.buff[1];                                                                                //功能码       
               
                        Modbus.Reg_addr =  Modbus.buff[2]*256+Modbus.buff[3];                                //寄存器地址                       
                        switch(Modbus.CMD )
                        {
                                case 0x03:        ReadReg();                                break;                                                //读寄存器
                               
                                case 0x06:       
                                case 0x10:  WriteReg();                                break;                                                //写寄存器                                                        
                                //default:        Send_Err(Err_CMD);                break;                                                //异常功能码
                        }                                       
                }                                       
        }       
}

1.png
2.png
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:177
  • 最近打卡:2025-04-30 13:52:43

10

主题

134

回帖

993

积分

高级会员

积分
993
发表于 2024-10-28 14:26:45 | 显示全部楼层
代码编辑使用“<>"展示的排版效果更好{:5_275:}
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:239
  • 最近打卡:2025-05-02 03:42:37

22

主题

283

回帖

905

积分

高级会员

积分
905
发表于 2024-10-28 17:33:54 来自手机 | 显示全部楼层
{:5_332:}
REMOVEUNUSED
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:47
  • 最近打卡:2025-04-30 20:21:43

9

主题

62

回帖

697

积分

高级会员

积分
697
发表于 2024-10-28 19:35:44 | 显示全部楼层
{:5_284:}
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:375
  • 最近打卡:2025-04-26 15:51:33
已绑定手机

27

主题

301

回帖

822

积分

高级会员

积分
822
发表于 2024-10-30 08:10:09 | 显示全部楼层
远行*** 发表于 2024-10-28 14:26
代码编辑使用“"展示的排版效果更好

截图看看,我也试试
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:177
  • 最近打卡:2025-04-30 13:52:43

10

主题

134

回帖

993

积分

高级会员

积分
993
发表于 2024-10-30 10:40:47 | 显示全部楼层
小*** 发表于 2024-10-30 08:10
截图看看,我也试试

在回帖的上方有个尖括号“<>", 点击它再输入代码即可
最终效果.png
排版区的-尖括号.png
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:375
  • 最近打卡:2025-04-26 15:51:33
已绑定手机

27

主题

301

回帖

822

积分

高级会员

积分
822
发表于 2024-10-30 11:43:27 | 显示全部楼层
远行*** 发表于 2024-10-30 10:40
在回帖的上方有个尖括号“", 点击它再输入代码即可
  1. 了解
复制代码
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:375
  • 最近打卡:2025-04-26 15:51:33
已绑定手机

27

主题

301

回帖

822

积分

高级会员

积分
822
发表于 2024-11-2 13:02:48 | 显示全部楼层
{:5_332:}
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:199
  • 最近打卡:2025-05-02 00:28:39
已绑定手机

24

主题

345

回帖

1633

积分

金牌会员

积分
1633
发表于 2024-11-2 13:45:53 | 显示全部楼层
学习学习,顺便赚点积分
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:375
  • 最近打卡:2025-04-26 15:51:33
已绑定手机

27

主题

301

回帖

822

积分

高级会员

积分
822
发表于 2024-11-12 13:25:55 | 显示全部楼层
{:5_332:}
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 13:07 , Processed in 0.129903 second(s), 114 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表