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

📄 modbus.c

📁 基于TMS320F2812的电动机控制源码(使用C语言)
💻 C
📖 第 1 页 / 共 2 页
字号:
								{
							 	v->Index=0;			//对数据记录部分询问无效
							  }
							}
					v->CommFlag=SEND_DATA;
						}	//end switch16
					} 
				break;
				//其他功能代码,不处理
				default:
					{
					v->CommFlag = WAIT_DATA_HEAD;
					}	
				}	//end	switch5
			}	//end if
			else
			{
			v->CommFlag = WAIT_DATA_HEAD;	
			}
		}
		break;
	
	//发送数据
	case SEND_DATA:
		{
		while((SciaRegs.SCIFFTX.bit.TXFFST<16)&&(v->CommCount<=v->Index))
			{
			SciaRegs.SCITXBUF=v->CommData[v->CommCount];
			v->CommCount++;   
			}
		if(v->CommCount>v->Index)
			v->CommFlag= WAIT_DATA_HEAD; 
		}
	default:	
		break;
	}	
}

///////////操作盘端口///////////////////////
void CommB(MODBUS *v)
{
	int	TempA,TempB,TempC;
	long * TablePoint;
	int * DataPoint;	
	//通讯帧故障清除
	if(ScibRegs.SCIRXST.bit.RXERROR)
	{
	ScibRegs.SCICTL1.bit.SWRESET=0;
	ScibRegs.SCICTL1.bit.SWRESET=1;
	}

	switch(v->CommFlag)	
	{
	//接受报头
	case WAIT_DATA_HEAD:	
		{
		while((ScibRegs.SCIFFRX.bit.RXFIFST!=0)&&(v->CommFlag==0))
			{
			TempA=ScibRegs.SCIRXBUF.all;
			if((TempA==0x00ff)||(TempA==v->Slave_Address))
				{
				v->CommData[0]=TempA;
				v->Index=1;
				v->CommFlag=READ_DATA;		//跳出本循环
				v->CommCount=0;
				}
			}
		}	
		break;
	//接受数据		
	case READ_DATA:
		{
		v->CommCount++;
		while(ScibRegs.SCIFFRX.bit.RXFIFST!=0)
			{
			v->CommData[v->Index]=ScibRegs.SCIRXBUF.all;
			//if((v->CommData[v->Index]&0x0ff00)==0)
				{		//数据必须正确
				v->Index++;
				if(v->Index>=PARANUMMAX)
					{
					v->Index=0;
					v->CommFlag = WAIT_DATA_HEAD;
					}
				v->CommCount=0;	
				}
			}	
		if(v->CommCount>=DELAYCOUNT)
			{
			v->CommFlag = PROCESSING_DATA;	
			}
		}	
		break;
	//处理报文,产生响应报文
	case PROCESSING_DATA:
		{
		if(CRC_cal(v->CommData,v->Index)==0)   //if1
			{
			switch(v->CommData[1])
				{	//switch2
				//MODBUS功能3
				case 3:				
					{
					TempA=(v->CommData[2]<<8)|(v->CommData[3]);		//参数起始地址
					switch(TempA)
						{	//switch3
						//菜单页参数读命令
						case 919:			
							{
							//固定长度响应报文
							v->CommData[2]=32;
							DataPoint=&Para_Tab[v->ParaNum][0] ;
							//读取PARA_TAB中的数据
							TempA=3;
			  				while(TempA<(16*2+3))
			  					{
			  					if((TempA>0*2+3)&&(TempA<9*2+3))
			  						{
			  						v->CommData[TempA++]= (*DataPoint)&0x00ff;
			  						v->CommData[TempA++]= ((*DataPoint)>>8)&0x00ff;
			  						}
			  					else
			  						{
			  						v->CommData[TempA++]= ((*DataPoint)>>8)&0x00ff;
			  						v->CommData[TempA++]= (*DataPoint)&0x00ff;
			  						}	
			  					DataPoint++;
			  					}
			  				//写入实际数据
			  				TablePoint=MenuInfo;
			  				DataPoint=(int *)TablePoint[v->ParaNum];		
							v->CommData[29]=(*DataPoint>>8)&0xff;    //写入报文地址 
							v->CommData[30]=(*DataPoint)&0x0ff;    //写入报文地址 
							TempA=CRC_cal(v->CommData,35);   //固定长度
							v->CommData[35]=(TempA>>8)&0x00ff;		//写入CRC校验位
							v->CommData[36]=TempA&0x00ff;

							v->Index = 36;			//共计发送36个数据
							v->CommCount = 0;
							v->CommFlag = SEND_DATA;  //转入发送
							}
						break;
						//故障页读取
						case 900:			
							{
							v->CommData[2]=9*2;			//固定报文格式
							DataPoint=&Fault_Tab[v->FaultNum][0]; 
							//读取PARA_TAB中的数据
							TempA=3;
			  				while(TempA<(9*2+3))
			  					{
			  					v->CommData[TempA++]= (*DataPoint)&0x00ff;
			  					v->CommData[TempA++]= (*DataPoint>>8)&0x00ff;
			  					DataPoint++;
			  					}
			  				//写入实际数据
							TempA=CRC_cal(v->CommData,21);   		//固定长度
							v->CommData[21]=(TempA>>8)&0x00ff;		//写入CRC校验位
							v->CommData[22]=TempA&0x00ff;

							v->Index = 22;			//共计发送36个数据
							v->CommCount = 0;
							v->CommFlag = SEND_DATA;  //转入发送
							}
						break;
						//其他,状态页读取
						default:			
							{
							if(TempA<PARAMETER_MAX_NUMBER)
								{
								TablePoint=StatusInfo;
								TempB=(v->CommData[4]<<8)|(v->CommData[5])-1;	//数据个数 - 1
								TempC=TempB+(v->CommData[2]<<8)|(v->CommData[3]);	//last data modbus address 
								v->CommData[2]=TempB*2;	//return modbus-read-data number
								v->Index=TempB*2+4+1;	//all send data number
								for(;TempB>=0;TempB--,TempC--)
									{
									DataPoint=(int *)TablePoint[TempC];
									TempA = TempB*2+4;
									v->CommData[TempA]=(*DataPoint)&0x0ff;
									TempA--;
									v->CommData[TempA]=(*DataPoint>>8)&0x0ff;
									}
								TempB=CRC_cal(v->CommData,v->Index);   //个数=标号+1;
						
								v->CommData[v->Index]=(TempB>>8)&0xff;
								v->Index++;
								v->CommData[v->Index]=TempB&0xff;
								v->CommCount = 0;
								v->CommFlag = SEND_DATA;  //转入发送
								}
							else 
								{
								v->CommFlag = WAIT_DATA_HEAD; 
								}	
							}
							 	
						} //end switch3	
					}	//end switch2 case3
				break;
				//MODBUS功能16  写数据
				case 16:			
					{
					TempA=(v->CommData[2]<<8)|(v->CommData[3]);		//参数起始地址
					switch(TempA)
						{	//switch16
						case 932:
							{
							TablePoint=MenuInfo;
							DataPoint=(int *)TablePoint[v->ParaNum];	//数据地址

							*DataPoint=(v->CommData[7]<<8)+(v->CommData[8]); 

							TempB=CRC_cal(v->CommData,6);   //个数=标号+1;
							
							v->CommData[6]=(TempB>>8)&0xff;
							v->CommData[7]=TempB&0xff;
							v->Index = 7;
							v->CommCount = 0;
							v->CommFlag = SEND_DATA;  //转入发送
							}
							break;
						case 918:	//翻页信息处理
							{
							TempB=(v->CommData[7]<<8)+(v->CommData[8]);  
							if(TempB==2)
								{
								v->ParaNum--; 
								if(v->ParaNum < 0 )
									v->ParaNum = MENU_MAX_NUMBER -1;
								}
							else if(TempB==1)
								{
								v->ParaNum++;
								if(v->ParaNum >= MENU_MAX_NUMBER)
									v->ParaNum = 0;
								}
							
								TempB=CRC_cal(v->CommData,6);   //个数=标号+1;
						
								v->CommData[6]=(TempB>>8)&0xff;
								v->CommData[7]=TempB&0xff;
								v->Index = 7;
								v->CommCount = 0;
								v->CommFlag = SEND_DATA;  //转入发送
							}
						break;
						default:
							{
							if(TempA < PARAMETER_MAX_NUMBER)
								{
								TablePoint=StatusInfo;
								TempB=(v->CommData[4]<<8)|(v->CommData[5])-1;	//数据个数
								TempC=TempB+(v->CommData[2]<<8)|(v->CommData[3]);	//数据地址
								v->Index=TempB*2+4+1;
								for(;TempB>=0;TempB--,TempC--)
									{
									DataPoint=(int *)TablePoint[TempC];
									TempA = TempB*2+7;
									*DataPoint=(v->CommData[TempA]<<8)+v->CommData[TempA+1] ;
									}
								TempB=CRC_cal(v->CommData,6);   //个数=标号+1;
						
								v->CommData[6]=(TempB>>8)&0xff;
								v->CommData[7]=TempB&0xff;
								v->Index = 7;
								v->CommCount = 0;
								v->CommFlag = SEND_DATA;  //转入发送
								}
							else
								{
							  	v->CommFlag = WAIT_DATA_HEAD;
							  	}
							}
					v->CommFlag=SEND_DATA;
						}	//end switch16
					} 
				break;
				//其他功能代码,不处理
				default:
					{
					v->CommFlag = WAIT_DATA_HEAD;
					}	
				}	//end	switch5
			}	//end if
			else
			{
			v->CommFlag = WAIT_DATA_HEAD;	
			}
		}
		break;
	
	//发送数据
	case SEND_DATA:
		{
		while((ScibRegs.SCIFFTX.bit.TXFFST<16)&&(v->CommCount<=v->Index))
			{
			ScibRegs.SCITXBUF=v->CommData[v->CommCount];
			v->CommCount++;   
			}
		if(v->CommCount>v->Index)
			v->CommFlag= WAIT_DATA_HEAD; 
		}
	default:	
		break;
	}	
}



unsigned int CRC_cal(Uint16 *puchMsg,Uint16 usDataLen)
{
	unsigned char uchCRCHi=0xff;
	unsigned char uchCRCLo=0xff;
	unsigned int  uIndex;
	while(usDataLen--)
	{
		uIndex=uchCRCHi^*puchMsg++;
		uchCRCHi=uchCRCLo^auchCRCHi[uIndex];
		uchCRCLo=auchCRCLo[uIndex];
	}
	return(uchCRCHi<<8|uchCRCLo);
}


////初始化部分////////////////////////////////////

void InitSciAPort()
{
	EALLOW;
	//GpioMuxRegs.GPFMUX.all |= 0x0030;  
	EDIS;
	//stop bit=1 ;parity=odd ; parity disable; 
	SciaRegs.SCICCR.all = 0x07;			
	
	SciaRegs.SCICTL1.all = 0x03;
	SciaRegs.SCICTL2.all = 0x00;
	
	SciaRegs.SCIHBAUD = 0x01;
	SciaRegs.SCILBAUD = 0xe7;
	SciaRegs.SCIFFTX.bit.SCIFFENA=1;
	SciaRegs.SCICTL1.all = 0x23;
}

void InitSciBPort()
{
	EALLOW;
	GpioMuxRegs.GPGMUX.all |= 0x0030;
	EDIS;
	ScibRegs.SCICCR.all = 0x07;
	
	ScibRegs.SCICTL1.all = 0x03;
	ScibRegs.SCICTL2.all = 0x00;
	
	ScibRegs.SCIHBAUD = 0x01;
	ScibRegs.SCILBAUD = 0xe7;
	ScibRegs.SCIFFTX.bit.SCIFFENA=1;
	ScibRegs.SCICTL1.all = 0x23;
}


//////////////////////////////////////////////////////
////////	no more		//////////////////////////////
//////////////////////////////////////////////////////


⌨️ 快捷键说明

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