⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 modbus.lst

📁 用于单片机的开发 用modbus协议 实现上位机与下位机的通讯
💻 LST
📖 第 1 页 / 共 3 页
字号:
 196   1              sendBuf[byteCount] = crcData >> 8;
 197   1              byteCount++;
 198   1              sendBuf[byteCount] = crcData & 0xff;
 199   1              
 200   1              sendCount = byteCount + 1;
 201   1              beginSend();
 202   1      }//void readRegisters(void)
*** WARNING C280 IN LINE 166 OF MODBUS.C: 'result': unreferenced local variable
*** WARNING C280 IN LINE 170 OF MODBUS.C: 'finsh': unreferenced local variable
 203          
 204          
 205          //强制单个线圈
 206          void forceSingleCoil(void)
 207          {
 208   1              uint8 addr;
 209   1              uint8 tempAddr;
 210   1              uint16 tempData;
 211   1              uint8  onOff;
 212   1              uint8 i;
 213   1              
 214   1              //addr = (receBuf[2]<<8) + receBuf[3];  
 215   1              //tempAddr = addr & 0xfff;
 216   1              addr = receBuf[3];
 217   1              tempAddr = addr;
 218   1      
 219   1              //onOff = (receBuf[4]<<8) + receBuf[5]; 
 220   1              onOff = receBuf[4];
 221   1              
 222   1              //if(onOff == 0xff00)
 223   1              if(onOff == 0xff)
 224   1              {       //设为ON
 225   2                      tempData = 1;
 226   2              } 
 227   1              //else if(onOff == 0x0000)
 228   1              else if(onOff == 0x00)
 229   1              {       //设为OFF
 230   2                      tempData = 0;
 231   2              }
 232   1      
 233   1              setCoilVal(tempAddr,tempData);  
 234   1              
 235   1              for(i=0;i<receCount;i++)
 236   1              {
 237   2                      sendBuf[i] = receBuf[i];
 238   2              }
C51 COMPILER V7.06   MODBUS                                                                03/16/2005 16:48:06 PAGE 5   

 239   1              sendCount = receCount;
 240   1              beginSend();    
 241   1      }//void forceSingleCoil(void)
 242          
 243          
 244          //设置多个寄存器
 245          void presetMultipleRegisters(void)
 246          {
 247   1              uint8 addr;
 248   1              uint8 tempAddr;
 249   1              uint8 byteCount;
 250   1              uint8 setCount;
 251   1              uint16 crcData;
 252   1              uint16 tempData;
 253   1              uint8  finsh;   //为1时完成 为0时出错
 254   1              uint8 i;
 255   1              
 256   1              //addr = (receBuf[2]<<8) + receBuf[3];
 257   1              //tempAddr = addr & 0xfff;
 258   1              addr = receBuf[3];
 259   1              tempAddr = addr & 0xff;
 260   1      
 261   1              //setCount = (receBuf[4]<<8) + receBuf[5];
 262   1              setCount = receBuf[5];
 263   1              byteCount = receBuf[6]; 
 264   1              
 265   1              for(i=0;i<setCount;i++,tempAddr++)
 266   1              {
 267   2                      tempData = (receBuf[i*2+7]<<8) + receBuf[i*2+8];
 268   2              
 269   2                      setRegisterVal(tempAddr,tempData);                      
 270   2              }
 271   1              
 272   1              sendBuf[0] = localAddr;
 273   1              sendBuf[1] = 16;
 274   1              sendBuf[2] = addr >> 8;
 275   1              sendBuf[3] = addr & 0xff;
 276   1              sendBuf[4] = setCount >> 8;
 277   1              sendBuf[5] = setCount & 0xff;
 278   1              crcData = crc16(sendBuf,6);
 279   1              sendBuf[6] = crcData >> 8;
 280   1              sendBuf[7] = crcData & 0xff;
 281   1              sendCount = 8;
 282   1              beginSend();    
 283   1      }//void presetMultipleRegisters(void)
*** WARNING C280 IN LINE 253 OF MODBUS.C: 'finsh': unreferenced local variable
 284          
 285          
 286          
 287          //检查uart0数据
 288          void checkComm0Modbus(void)
 289          {
 290   1              uint16 crcData;
 291   1              uint16 tempData;
 292   1              
 293   1              if(receCount > 4)
 294   1              {
 295   2                      switch(receBuf[1])
 296   2                      {
 297   3                              case 1://读取线圈状态(读取点 16位以内)
 298   3                              case 3://读取保持寄存器(一个或多个)
 299   3                              case 5://强制单个线圈
C51 COMPILER V7.06   MODBUS                                                                03/16/2005 16:48:06 PAGE 6   

 300   3                              case 6://设置单个寄存器
 301   3                                              if(receCount >= 8)
 302   3                                              {//接收完成一组数据
 303   4                                                      //应该关闭接收中断
 304   4                                                      
 305   4                                                      if(receBuf[0]==localAddr && checkoutError==0)
 306   4                                                      {
 307   5                                                              crcData = crc16(receBuf,6);
 308   5                                                              if(crcData == receBuf[7]+(receBuf[6]<<8))
 309   5                                                              {//校验正确
 310   6                                                                      if(receBuf[1] == 1)
 311   6                                                                      {//读取线圈状态(读取点 16位以内)
 312   7                                                                              readCoil();                                                             
 313   7                                                                      }
 314   6                                                                      else if(receBuf[1] == 3)
 315   6                                                                      {//读取保持寄存器(一个或多个)
 316   7                                                                              readRegisters();
 317   7                                                                      }
 318   6                                                                      else if(receBuf[1] == 5)
 319   6                                                                      {//强制单个线圈
 320   7                                                                              forceSingleCoil();                                                              
 321   7                                                                      }
 322   6                                                                      else if(receBuf[1] == 6)
 323   6                                                                      {
 324   7                                                                              //presetSingleRegister();                                                               
 325   7                                                                      }
 326   6      
 327   6                                                              }
 328   5                                                      }                                               
 329   4                                                      receCount = 0;  
 330   4                                                      checkoutError = 0;
 331   4                                              }
 332   3                                              break;
 333   3                              
 334   3                              case 15://设置多个线圈
 335   3                                              tempData = receBuf[6]; 
 336   3                                              tempData += 9;  //数据个数
 337   3                                              if(receCount >= tempData)
 338   3                                              {
 339   4                                                      if(receBuf[0]==localAddr && checkoutError==0)
 340   4                                                      {
 341   5                                                              crcData = crc16(receBuf,tempData-2);
 342   5                                                              if(crcData == (receBuf[tempData-2]<<8)+ receBuf[tempData-1])
 343   5                                                              {
 344   6                                                                      //forceMultipleCoils();                 
 345   6                                                              }
 346   5                                                      }       
 347   4                                                      receCount = 0;
 348   4                                                      checkoutError = 0;
 349   4                                              }
 350   3                                              break;
 351   3                              
 352   3                              case 16://设置多个寄存器
 353   3                                              tempData = (receBuf[4]<<8) + receBuf[5];
 354   3                                              tempData = tempData * 2;        //数据个数
 355   3                                              tempData += 9;
 356   3                                              if(receCount >= tempData)
 357   3                                              {
 358   4                                                      if(receBuf[0]==localAddr && checkoutError==0)
 359   4                                                      {
 360   5                                                              crcData = crc16(receBuf,tempData-2);
 361   5                                                              if(crcData == (receBuf[tempData-2]<<8)+ receBuf[tempData-1])
C51 COMPILER V7.06   MODBUS                                                                03/16/2005 16:48:06 PAGE 7   

 362   5                                                              {
 363   6                                                                      presetMultipleRegisters();                      
 364   6                                                              }
 365   5                                                      }       
 366   4                                                      receCount = 0;
 367   4                                                      checkoutError = 0;
 368   4                                              }
 369   3                                              break;
 370   3                                                                      
 371   3                              default:
 372   3                                              break;                  
 373   3                      }
 374   2              }
 375   1      }//void checkComm0(void)
 376          
 377          //取线圈状态 返回0表示成功
 378          uint16 getCoilVal(uint16 addr,uint16 *tempData)
 379          {
 380   1              uint16 result = 0;
 381   1              uint16 tempAddr;
 382   1              
 383   1              tempAddr = addr & 0xfff;
 384   1              //只取低8位地址
 385   1              switch(tempAddr & 0xff)
 386   1              {
 387   2                      case 0:
 388   2                                      break;
 389   2                      case 1: 
 390   2                                      *tempData = testCoil;
 391   2                                      break;
 392   2                      case 2:         
 393   2                                      break;          
 394   2                      case 3:
 395   2                                      break;          
 396   2                      case 4:
 397   2                                      break;          

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -