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

📄 modbus.lst

📁 这是基本的485通讯实例希望对大家有用。C语言编写用户可根据自己的情况修改相应的传输速率。
💻 LST
📖 第 1 页 / 共 2 页
字号:
 291          
 292           if(receCount > 4)
 293           {
 294            switch(receBuf[1])
 295            {
 296             case 1://读取线圈状态(读取点 16位以内)
 297             case 3://读取保持寄存器(一个或多个)
 298             case 5://强制单个线圈
 299             case 6://设置单个寄存器
 300               if(receCount >= 8)
 301               {//接收完成一组数据
C51 COMPILER V7.09   MODBUS                                                                03/27/2007 15:48:08 PAGE 6   

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

 364                }
 365                receCount = 0;
 366                checkoutError = 0;
 367               }
 368               break;
 369          
 370             default:
 371               break;
 372            }
 373           }
 374          }//void checkComm0(void)
 375          
 376          //取线圈状态 返回0表示成功
 377          uint16 getCoilVal(uint16 addr,uint16 *tempData)
 378          {
 379           uint16 result = 0;
 380           uint16 tempAddr;
 381          
 382           tempAddr = addr & 0xfff;
 383           //只取低8位地址
 384           switch(tempAddr & 0xff)
 385           {
 386            case 0:
 387              break;
 388            case 1:
 389              *tempData = testCoil;
 390              break;
 391            case 2:
 392              break;
 393            case 3:
 394              break;
 395            case 4:
 396              break;
 397            case 5:
 398              break;
 399            case 6:
 400              break;
 401            case 7:
 402              break;
 403            case 8:
 404              break;
 405            case 9:
 406              break;
 407            case 10:
 408              break;
 409            case 11:
 410              break;
 411            case 12:
 412              break;
 413            case 13:
 414              break;
 415            case 14:
 416              break;
 417            case 15:
 418              break;
 419            case 16:
 420              break;
 421            default:
 422              break;
 423           }
 424          
 425           return result;
C51 COMPILER V7.09   MODBUS                                                                03/27/2007 15:48:08 PAGE 8   

 426          }//uint16 getCoilVal(uint16 addr,uint16 *data)
 427          
 428          
 429          //设定线圈状态 返回0表示成功
 430          uint16 setCoilVal(uint16 addr,uint16 tempData)
 431          {
 432           uint16 result = 0;
 433           uint16 tempAddr;
 434          
 435           tempAddr = addr & 0xfff;
 436          
 437          
 438           switch(tempAddr & 0xff)
 439           {
 440            case 0:
 441              break;
 442            case 1:
 443              testCoil = tempData;
 444              break;
 445            case 2:
 446              break;
 447            case 3:
 448              break;
 449            case 4:
 450              break;
 451            case 5:
 452              break;
 453            case 6:
 454              break;
 455            case 7:
 456              break;
 457            case 8:
 458              break;
 459            case 9:
 460              break;
 461            case 10:
 462              break;
 463            case 11:
 464              break;
 465            case 12:
 466              break;
 467            case 13:
 468              break;
 469            case 14:
 470              break;
 471            case 15:
 472              break;
 473            case 16:
 474              break;
 475            default:
 476              break;
 477           }
 478          
 479          
 480           return result;
 481          }//uint16 setCoilVal(uint16 addr,uint16 data)
 482          
 483          //取寄存器值 返回0表示成功
 484          uint16 getRegisterVal(uint16 addr,uint16 *tempData)
 485          {
 486           uint16 result = 0;
 487           uint16 tempAddr;
C51 COMPILER V7.09   MODBUS                                                                03/27/2007 15:48:08 PAGE 9   

 488          
 489           tempAddr = addr & 0xfff;
 490          
 491           switch(tempAddr & 0xff)
 492           {
 493            case 0:
 494              break;
 495            case 1:
 496              break;
 497            case 2:
 498              break;
 499            case 3:
 500              break;
 501            case 4:
 502              break;
 503            case 5:
 504              break;
 505            case 6:
 506              break;
 507            case 7:
 508              break;
 509            case 8:
 510              break;
 511            case 9:
 512              break;
 513            case 10:
 514              break;
 515            case 11:
 516              break;
 517            case 12:
 518              break;
 519            case 13:
 520              break;
 521            case 14:
 522              break;
 523            case 15:
 524              break;
 525            case 16:
 526              *tempData = testRegister;
 527              break;
 528            default:
 529              break;
 530           }
 531          
 532           return result;
 533          }//uint16 getRegisterVal(uint16 addr,uint16 &data)
 534          
 535          //设置寄存器值 返回0表示成功
 536          uint16 setRegisterVal(uint16 addr,uint16 tempData)
 537          {
 538           uint16 result = 0;
 539           uint16 tempAddr;
 540          
 541           tempAddr = addr & 0xfff;
 542          
 543           switch(tempAddr & 0xff)
 544           {
 545            case 0:
 546              break;
 547            case 1:
 548              break;
 549            case 2:
C51 COMPILER V7.09   MODBUS                                                                03/27/2007 15:48:08 PAGE 10  

 550              break;
 551            case 3:
 552              break;
 553            case 4:
 554              break;
 555            case 5:
 556              break;
 557            case 6:
 558              break;
 559            case 7:
 560              break;
 561            case 8:
 562              break;
 563            case 9:
 564              break;
 565            case 10:
 566              break;
 567            case 11:
 568              break;
 569            case 12:
 570              break;
 571            case 13:
 572              break;
 573            case 14:
 574              break;
 575            case 15:
 576              break;
 577            case 16:
 578              testRegister = tempData;
 579              break;
 580            default:
 581              break;
 582           }
 583          
 584           return result;
 585          }//uint8 setRegisterVal(uint16 addr,uint16 data)

C51 COMPILATION COMPLETE.  1 WARNING(S),  1 ERROR(S)

⌨️ 快捷键说明

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