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

📄 modbus.lst

📁 一个超全的仿真程序含C源码,包括1602LED显示,两位共阴数码管显示,ADC0809模块转换,拔码地址开关,18B20温度显示,max485联机通迅,max232串口通迅
💻 LST
📖 第 1 页 / 共 2 页
字号:
 296   2      		{
 297   3      			case 1://读取线圈状态(读取点 16位以内)
 298   3      			case 3://读取保持寄存器(一个或多个)
 299   3      			case 5://强制单个线圈
C51 COMPILER V6.12  MODBUS                                                                 03/19/2008 10:34:01 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 V6.12  MODBUS                                                                 03/19/2008 10:34:01 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;		
 398   2      		case 5:
 399   2      				break;
 400   2      		case 6:
 401   2      				break;			
 402   2      		case 7:
 403   2      				break;		
 404   2      		case 8:
 405   2      				break;		
 406   2      		case 9:
 407   2      				break;		
 408   2      		case 10:
 409   2      				break;
 410   2      		case 11:
 411   2      				break;
 412   2      		case 12:
 413   2      				break;
 414   2      		case 13:
 415   2      				break;
 416   2      		case 14:
 417   2      				break;
 418   2      		case 15:
 419   2      				break;
 420   2      		case 16:
 421   2      				break;														
 422   2      		default:
 423   2      				break;		
C51 COMPILER V6.12  MODBUS                                                                 03/19/2008 10:34:01 PAGE 8   

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

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

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


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1028    ----
   CONSTANT SIZE    =    512    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      7      53
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  4 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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