?? modbus.c
字號(hào):
{
v->Index=0; //對(duì)數(shù)據(jù)記錄部分詢問無效
}
}
v->CommFlag=SEND_DATA;
} //end switch16
}
break;
//其他功能代碼,不處理
default:
{
v->CommFlag = WAIT_DATA_HEAD;
}
} //end switch5
} //end if
else
{
v->CommFlag = WAIT_DATA_HEAD;
}
}
break;
//發(fā)送數(shù)據(jù)
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)
{
//接受報(bào)頭
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; //跳出本循環(huán)
v->CommCount=0;
}
}
}
break;
//接受數(shù)據(jù)
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)
{ //數(shù)據(jù)必須正確
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;
//處理報(bào)文,產(chǎn)生響應(yīng)報(bào)文
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]); //參數(shù)起始地址
switch(TempA)
{ //switch3
//菜單頁參數(shù)讀命令
case 919:
{
//固定長(zhǎng)度響應(yīng)報(bào)文
v->CommData[2]=32;
DataPoint=&Para_Tab[v->ParaNum][0] ;
//讀取PARA_TAB中的數(shù)據(jù)
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++;
}
//寫入實(shí)際數(shù)據(jù)
TablePoint=MenuInfo;
DataPoint=(int *)TablePoint[v->ParaNum];
v->CommData[29]=(*DataPoint>>8)&0xff; //寫入報(bào)文地址
v->CommData[30]=(*DataPoint)&0x0ff; //寫入報(bào)文地址
TempA=CRC_cal(v->CommData,35); //固定長(zhǎng)度
v->CommData[35]=(TempA>>8)&0x00ff; //寫入CRC校驗(yàn)位
v->CommData[36]=TempA&0x00ff;
v->Index = 36; //共計(jì)發(fā)送36個(gè)數(shù)據(jù)
v->CommCount = 0;
v->CommFlag = SEND_DATA; //轉(zhuǎn)入發(fā)送
}
break;
//故障頁讀取
case 900:
{
v->CommData[2]=9*2; //固定報(bào)文格式
DataPoint=&Fault_Tab[v->FaultNum][0];
//讀取PARA_TAB中的數(shù)據(jù)
TempA=3;
while(TempA<(9*2+3))
{
v->CommData[TempA++]= (*DataPoint)&0x00ff;
v->CommData[TempA++]= (*DataPoint>>8)&0x00ff;
DataPoint++;
}
//寫入實(shí)際數(shù)據(jù)
TempA=CRC_cal(v->CommData,21); //固定長(zhǎng)度
v->CommData[21]=(TempA>>8)&0x00ff; //寫入CRC校驗(yàn)位
v->CommData[22]=TempA&0x00ff;
v->Index = 22; //共計(jì)發(fā)送36個(gè)數(shù)據(jù)
v->CommCount = 0;
v->CommFlag = SEND_DATA; //轉(zhuǎn)入發(fā)送
}
break;
//其他,狀態(tài)頁讀取
default:
{
if(TempA<PARAMETER_MAX_NUMBER)
{
TablePoint=StatusInfo;
TempB=(v->CommData[4]<<8)|(v->CommData[5])-1; //數(shù)據(jù)個(gè)數(shù) - 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); //個(gè)數(shù)=標(biāo)號(hào)+1;
v->CommData[v->Index]=(TempB>>8)&0xff;
v->Index++;
v->CommData[v->Index]=TempB&0xff;
v->CommCount = 0;
v->CommFlag = SEND_DATA; //轉(zhuǎn)入發(fā)送
}
else
{
v->CommFlag = WAIT_DATA_HEAD;
}
}
} //end switch3
} //end switch2 case3
break;
//MODBUS功能16 寫數(shù)據(jù)
case 16:
{
TempA=(v->CommData[2]<<8)|(v->CommData[3]); //參數(shù)起始地址
switch(TempA)
{ //switch16
case 932:
{
TablePoint=MenuInfo;
DataPoint=(int *)TablePoint[v->ParaNum]; //數(shù)據(jù)地址
*DataPoint=(v->CommData[7]<<8)+(v->CommData[8]);
TempB=CRC_cal(v->CommData,6); //個(gè)數(shù)=標(biāo)號(hào)+1;
v->CommData[6]=(TempB>>8)&0xff;
v->CommData[7]=TempB&0xff;
v->Index = 7;
v->CommCount = 0;
v->CommFlag = SEND_DATA; //轉(zhuǎn)入發(fā)送
}
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); //個(gè)數(shù)=標(biāo)號(hào)+1;
v->CommData[6]=(TempB>>8)&0xff;
v->CommData[7]=TempB&0xff;
v->Index = 7;
v->CommCount = 0;
v->CommFlag = SEND_DATA; //轉(zhuǎn)入發(fā)送
}
break;
default:
{
if(TempA < PARAMETER_MAX_NUMBER)
{
TablePoint=StatusInfo;
TempB=(v->CommData[4]<<8)|(v->CommData[5])-1; //數(shù)據(jù)個(gè)數(shù)
TempC=TempB+(v->CommData[2]<<8)|(v->CommData[3]); //數(shù)據(jù)地址
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); //個(gè)數(shù)=標(biāo)號(hào)+1;
v->CommData[6]=(TempB>>8)&0xff;
v->CommData[7]=TempB&0xff;
v->Index = 7;
v->CommCount = 0;
v->CommFlag = SEND_DATA; //轉(zhuǎn)入發(fā)送
}
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;
//發(fā)送數(shù)據(jù)
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 //////////////////////////////
//////////////////////////////////////////////////////
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -