搜索
bottom↓
回复: 19

Modbus RTU的程序我们公司早就做过啊 贴一部分出来

[复制链接]

出0入0汤圆

发表于 2007-3-17 13:28:17 | 显示全部楼层 |阅读模式
///M8

//TIMER0 initialisation - prescale:1024

// WGM: Normal

// desired value: 13mSec

// actual value: 12.917mSec (0.6%)

void timer0_init(void)

{

TCCR0 = 0x00; //stop

TCNT0 = 0xA3; //set count

TCCR0 = 0x05; //start timer

}



#pragma interrupt_handler timer0_ovf_isr:10

void timer0_ovf_isr(void)

{

TCNT0 = 0xA3; //reload counter value

  if(Time0_Ovf_ProgramBranch==0)

        Com0_Receive_Cout=0;   

  else

   {

          Com0_Receive_Complete_Flag=1;

          Com0_Receive_CRCcouter=Com0_Receive_Cout;

          UCSRB = 0xC8;///close the receiveing  interrupt

          Time0_Ovf_ProgramBranch=0;

         }

}

//UART0 initialisation

// desired baud rate: 9600

// actual: baud rate:9600 (0.0%)

// char size: 8 bit

// parity: Disabled

void uart0_init(void)

{

UCSRB = 0x00; //disable while setting baud rate

UCSRA = 0x00;

UCSRC = 0x86;

UBRRL = 0x2F; //set baud rate lo

UBRRH = 0x00; //set baud rate hi

UCSRB = 0xD8;

}



#pragma interrupt_handler uart0_rx_isr:12

void uart0_rx_isr(void)

{

//uart has received a character in UDR

   Com0_Receive_Data_Buffer[Com0_Receive_Cout]=UDR;

           if(Com0_Receive_Data_Buffer[0]==Com0_Send_Data_Buffer[0])

             {

                   if(Com0_Receive_Cout<18)

                  Com0_Receive_Cout++;

               Time0_Ovf_ProgramBranch=1;

              }         

       else

        {

               Com0_Receive_Cout=1;

               Time0_Ovf_ProgramBranch=0;

             }   

   TCNT0=0xB1;

}



#pragma interrupt_handler uart0_tx_isr:14

void uart0_tx_isr(void)

{

//character has been transmitted

   Com0_Send_Data_Pointer++;

   Com0_Send_Data_Bytes--;

   if(Com0_Send_Data_Bytes>0)

      UDR=*Com0_Send_Data_Pointer;

}

////////////////////////////////////////////////////////

unsigned short getCRC16(unsigned char *ptr,unsigned char len)

{

    unsigned char i;

        unsigned short crc=0xFFFF;

        if(len==0)

        len=1;

        while(len--)

          {  

             crc^=*ptr;

         for(i=0; i<8; i++)

                 {

           if(crc&1)

                     {

                           crc>>=1;

                           crc^=0xA001;

                          }

                        else

                           crc>>=1;

           }

         ptr++;

       }

    return(crc);

}

/////////////////////////////////////////////////////////////////////

void Modbus_Function_1(void)

{

    unsigned char  a, b,c,i;

    unsigned int temp;

    Com0_Send_Data_Buffer[1]=0x01;

        if((Com0_Receive_Data_Buffer[2]==0)&&(Com0_Receive_Data_Buffer[3]<=40))

           {

                  if(Com0_Receive_Data_Buffer[3]+Com0_Receive_Data_Buffer[5]<50)

                    {

                            a=Com0_Receive_Data_Buffer[3]>>3;

                                b=Com0_Receive_Data_Buffer[3]&0x07;

                                c=Com0_Receive_Data_Buffer[5]+b;

                                Com0_Send_Data_Buffer[2]=Com0_Receive_Data_Buffer[5]>>3;

                                if(Com0_Receive_Data_Buffer[5]&0x07)

                                   Com0_Send_Data_Buffer[2]+=1;

                                Com0_Send_Data_Bytes=Com0_Send_Data_Buffer[2]+3;

                                if(c&0x07)

                                 c=(c>>3)+1;

                                 else

                                 c=c>>3;

                                for(i=0;i<c;i++)

                                  {

                                      temp=IO_Battery_Voltage_Alarm[a];

                                          a++;

                                          temp+=(IO_Battery_Voltage_Alarm[a]<<8);

                                          temp>>=b;

                                          Com0_Send_Data_Buffer[i+3]=temp&0xff;

                                   }

                                 Com0_Send_Data_Buffer[i+3]=temp>>8;

                                 Com0_Send_Data_Buffer[i+3]<<=(8-Com0_Receive_Data_Buffer[5]&0x07);

                                 Com0_Send_Data_Buffer[i+3]>>=(8-Com0_Receive_Data_Buffer[5]&0x07);

                         }

                   else

                    {////show   error!

                     Com0_Send_Data_Buffer[1]=0xFF;

                     Com0_Send_Data_Buffer[2]=2;

                         Com0_Send_Data_Bytes=5;

                         Com0_Send_Data_Buffer[3]=0x00;

                         Com0_Send_Data_Buffer[4]=0x01;

                    }

                }

         else

          {////show   error!

             Com0_Send_Data_Buffer[1]=0xFF;

             Com0_Send_Data_Buffer[2]=2;

                 Com0_Send_Data_Bytes=5;

                 Com0_Send_Data_Buffer[3]=0x00;

                 Com0_Send_Data_Buffer[4]=0x02;

           }

}

///////////////////////////////////////////////////////////////////////

void Modbus_Function_3(void)

{

  unsigned char  i,a,b;

  //WDR();

  Com0_Send_Data_Buffer[1]=0x03;

  if((Com0_Receive_Data_Buffer[2]==0)&&(Com0_Receive_Data_Buffer[3]<=30))

     {

           if(Com0_Receive_Data_Buffer[3]+Com0_Receive_Data_Buffer[5]<40)   

              {

                        Com0_Send_Data_Buffer[2]=2*Com0_Receive_Data_Buffer[5];

                        Com0_Send_Data_Bytes=2*Com0_Receive_Data_Buffer[5]+3;

                        a=Com0_Receive_Data_Buffer[3];

                        b=Com0_Receive_Data_Buffer[5]*2;

                        for(i=0;i<b;i++)

                          {

                    Com0_Send_Data_Buffer[3+i]=Battery_Voltage_Value[2*a+i];

                           }

                   }

                 else

                   {////show   error!

                     Com0_Send_Data_Buffer[1]=0xFF;

                     Com0_Send_Data_Buffer[2]=2;

                         Com0_Send_Data_Bytes=5;

                         Com0_Send_Data_Buffer[3]=0x00;

                         Com0_Send_Data_Buffer[4]=0x03;

                    }

          }

   else

      {////show   error!

             Com0_Send_Data_Buffer[1]=0xFF;

             Com0_Send_Data_Buffer[2]=2;

                 Com0_Send_Data_Bytes=5;

                 Com0_Send_Data_Buffer[3]=0x00;

                 Com0_Send_Data_Buffer[4]=0x04;

           }

}

//////////////////////////////////////////////////////////////

void Modbus_Function_5(void)

{

   Com0_Send_Data_Buffer[1]=0x05;

   Com0_Send_Data_Buffer[2]=Com0_Receive_Data_Buffer[2];

   Com0_Send_Data_Buffer[3]=Com0_Receive_Data_Buffer[3];

   Com0_Send_Data_Buffer[4]=Com0_Receive_Data_Buffer[4];

   Com0_Send_Data_Buffer[5]=Com0_Receive_Data_Buffer[5];

   Com0_Send_Data_Bytes=6;

   if((Com0_Receive_Data_Buffer[2]==0)&&(Com0_Receive_Data_Buffer[3]==0))

     {

            if((Com0_Receive_Data_Buffer[4]==0xFF)&&(Com0_Receive_Data_Buffer[5]==0x00))

                   {

                          ALARM=1;

                          IO_Battery_Voltage_Alarm[0]|=0x01;

                         }

                else

                   {

                      ALARM=0;

                          IO_Battery_Voltage_Alarm[0]&=0xFE;

                         }

          }

   else

         {

             Com0_Send_Data_Buffer[1]=0xFF;

             Com0_Send_Data_Buffer[2]=2;

                 Com0_Send_Data_Bytes=5;

                 Com0_Send_Data_Buffer[3]=0x00;

                 Com0_Send_Data_Buffer[4]=0x05;

           }

}

/////////////////////////////////////////////////////////////

void Modbus_Function_16(void)

{



  Com0_Send_Data_Buffer[1]=0x10;

  Com0_Send_Data_Buffer[2]=Com0_Receive_Data_Buffer[2];

  Com0_Send_Data_Buffer[3]=Com0_Receive_Data_Buffer[3];

  Com0_Send_Data_Buffer[4]=Com0_Receive_Data_Buffer[4];

  Com0_Send_Data_Buffer[5]=Com0_Receive_Data_Buffer[5];

  Com0_Send_Data_Bytes=6;

  if((Com0_Receive_Data_Buffer[2]==0)&&(Com0_Receive_Data_Buffer[3]==20))

     {

           EEPROMwrite((int)&V_Bat_High_Alarm_H,Com0_Receive_Data_Buffer[7]);

           EEPROMwrite((int)&V_Bat_High_Alarm_L,Com0_Receive_Data_Buffer[8]);

           Battery_Voltage_Value[40]=Com0_Receive_Data_Buffer[7];

           Battery_Voltage_Value[41]=Com0_Receive_Data_Buffer[8];

           Battery_Voltage_High_Alarm=Battery_Voltage_Value[41];

       Battery_Voltage_High_Alarm|=(int)Battery_Voltage_Value[40] << 8;

          }

   else if((Com0_Receive_Data_Buffer[2]==0)&&(Com0_Receive_Data_Buffer[3]==21))

     {

           EEPROMwrite((int)&V_Bat_Low_Alarm_H,Com0_Receive_Data_Buffer[7]);

           EEPROMwrite((int)&V_Bat_Low_Alarm_L,Com0_Receive_Data_Buffer[8]);

           Battery_Voltage_Value[42]=Com0_Receive_Data_Buffer[7];

           Battery_Voltage_Value[43]=Com0_Receive_Data_Buffer[8];

           Battery_Voltage_Low_Alarm=Battery_Voltage_Value[43];

       Battery_Voltage_Low_Alarm|=(int)Battery_Voltage_Value[42] << 8;

          }

   else if((Com0_Receive_Data_Buffer[2]==0)&&(Com0_Receive_Data_Buffer[3]==22))

         {

           EEPROMwrite((int)&Alarm_Bat_Temperature_H,Com0_Receive_Data_Buffer[7]);

           EEPROMwrite((int)&Alarm_Bat_Temperature_L,Com0_Receive_Data_Buffer[8]);

           Battery_Voltage_Value[44]=Com0_Receive_Data_Buffer[7];

           Battery_Voltage_Value[45]=Com0_Receive_Data_Buffer[8];

           Battery_Temperature_High_Alarm=Battery_Voltage_Value[45];

       Battery_Temperature_High_Alarm|=(int)Battery_Voltage_Value[44] << 8;

          

          }

    else if((Com0_Receive_Data_Buffer[2]==0)&&(Com0_Receive_Data_Buffer[3]==23))

          {

            EEPROMwrite((int)&Address_Bat_check,Com0_Receive_Data_Buffer[8]);

            Com0_Send_Data_Buffer[0]=Com0_Receive_Data_Buffer[8];

                Battery_Voltage_Value[46]=0;

            Battery_Voltage_Value[47]=Com0_Receive_Data_Buffer[8];

           }

        else if((Com0_Receive_Data_Buffer[2]==0)&&(Com0_Receive_Data_Buffer[3]==24))

          {

             if((Com0_Receive_Data_Buffer[7]==0)&&(Com0_Receive_Data_Buffer[8]<=19))

                 {

                           EEPROMwrite((int)&Num_Bat_Node,Com0_Receive_Data_Buffer[8]);

                       Battery_Voltage_Value[48]=0;

                   Battery_Voltage_Value[49]=Com0_Receive_Data_Buffer[8];

                           }

           }

        else if((Com0_Receive_Data_Buffer[2]==0)&&(Com0_Receive_Data_Buffer[3]==25))

          {

             if((Com0_Receive_Data_Buffer[7]==0)&&(Com0_Receive_Data_Buffer[8]<=200))

                 {

                           EEPROMwrite((int)&Battery_Voltage_Value_potentiometer01_L,Com0_Receive_Data_Buffer[8]);

                       Battery_Voltage_Value[50]=0;

                   Battery_Voltage_Value[51]=Com0_Receive_Data_Buffer[8];

                           }

           }

        else if((Com0_Receive_Data_Buffer[2]==0)&&(Com0_Receive_Data_Buffer[3]==26))

          {

             if((Com0_Receive_Data_Buffer[7]==0)&&(Com0_Receive_Data_Buffer[8]<=200))

                 {

                           EEPROMwrite((int)&Battery_Voltage_Value_potentiometer02_L,Com0_Receive_Data_Buffer[8]);

                       Battery_Voltage_Value[52]=0;

                   Battery_Voltage_Value[53]=Com0_Receive_Data_Buffer[8];

                           }

           }

        else

           {

              Com0_Send_Data_Buffer[1]=0xFF;

                  Com0_Send_Data_Buffer[2]=Com0_Receive_Data_Buffer[2];

          Com0_Send_Data_Buffer[3]=Com0_Receive_Data_Buffer[3];

                  Com0_Send_Data_Buffer[4]=0x00;

                  Com0_Send_Data_Buffer[5]=0x05;

                  }

          

}

/////////////////////////////////////////////////////////////

void Com0_Communication(void)

{

   unsigned short crcresult;

   unsigned char   temp[2];

   crcresult= getCRC16(Com0_Receive_Data_Buffer,Com0_Receive_CRCcouter-2);

   temp[1]=crcresult & 0xff;

   temp[0]=(crcresult >> 8) & 0xff;

   if((Com0_Receive_Data_Buffer[Com0_Receive_CRCcouter-1]==temp[0])&&(Com0_Receive_Data_Buffer[Com0_Receive_CRCcouter-2]==temp[1]))

      {

             PORTB^=0x20;

             switch(Com0_Receive_Data_Buffer[1])

                       {

                              case 0x01:

                                           Modbus_Function_1();

                                                   break;

                          case 0x03:

                                           Modbus_Function_3();

                                                   break;

                                  case 0x05:

                                           Modbus_Function_5();

                                                   break;           

                                  case 0x10:

                                           Modbus_Function_16();

                                                   break;         

                                  default:

                                           {

                                                     Com0_Send_Data_Buffer[1]=0xFF;

                                     Com0_Send_Data_Buffer[2]=2;

                                     Com0_Send_Data_Bytes=5;

                                     Com0_Send_Data_Buffer[3]=0x00;

                                     Com0_Send_Data_Buffer[4]=0x06;

                                                    }

                                }

           }

    else

          {

            ////show   error!

                  

                  Com0_Send_Data_Buffer[1]=0xFF;

                  Com0_Send_Data_Buffer[2]=2;

                  Com0_Send_Data_Bytes=5;

                  Com0_Send_Data_Buffer[3]=0x00;

                  Com0_Send_Data_Buffer[4]=0x07;

           }

   crcresult= getCRC16(Com0_Send_Data_Buffer,Com0_Send_Data_Bytes);

   Com0_Send_Data_Buffer[Com0_Send_Data_Bytes]=crcresult & 0xff;

   Com0_Send_Data_Buffer[Com0_Send_Data_Bytes+1]=(crcresult >> 8) & 0xff;

   Com0_Send_Data_Bytes=Com0_Send_Data_Bytes+2;

   Com0_Send_Data_Pointer=Com0_Send_Data_Buffer;

   UDR=*Com0_Send_Data_Pointer;

}

//////////////////////////////////////////////////////////////////////////

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2007-3-17 16:21:04 | 显示全部楼层
顶一下,谢谢分享!

出0入0汤圆

发表于 2007-3-17 18:11:54 | 显示全部楼层
谢谢搂主!

要早那么几天就好了

我自己的程序找了好长时间的资料,上两天刚刚测试通过!!!

出0入0汤圆

发表于 2007-3-18 13:01:44 | 显示全部楼层
专业顶贴

出0入0汤圆

发表于 2007-3-19 00:08:33 | 显示全部楼层
好东西,谢谢!

出0入0汤圆

发表于 2007-11-13 15:56:16 | 显示全部楼层
写得不错

出0入0汤圆

发表于 2007-11-13 16:01:36 | 显示全部楼层
up

出0入0汤圆

发表于 2007-11-17 17:39:03 | 显示全部楼层
正在搞,modbus RTU控制变频器.

出0入0汤圆

发表于 2007-12-15 14:48:50 | 显示全部楼层
12.917mSec
这个时间是根据什么定的?是3.5个字符吗?
能讲一下吗

出0入0汤圆

发表于 2007-12-17 15:13:31 | 显示全部楼层
楼主:

您的定时器在什么地方或者什么情况下打开打开?

出0入0汤圆

发表于 2008-7-22 21:42:58 | 显示全部楼层
对程序中多次出现的

  if((Com0_Receive_Data_Buffer[2]==0)&&(Com0_Receive_Data_Buffer[3]<=30))
     {  
           if(Com0_Receive_Data_Buffer[3]+Com0_Receive_Data_Buffer[5]<40)  

部分 不明白。


这些部分貌似包含了地址和数据。

出0入0汤圆

发表于 2010-3-23 11:13:20 | 显示全部楼层
继续学习

出0入0汤圆

发表于 2010-3-23 12:56:12 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-8 14:03:18 | 显示全部楼层
mark

出0入8汤圆

发表于 2011-6-3 11:25:36 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-6-3 14:49:24 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-9-20 21:46:37 | 显示全部楼层

出0入0汤圆

发表于 2012-10-9 08:44:48 | 显示全部楼层
记录下……

出0入0汤圆

发表于 2012-11-27 22:58:43 | 显示全部楼层
谢谢分享
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-27 04:38

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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