?? zhu1126_96.c.bak
字號:
case ClockCom: //時鐘校正命令
typeCom = ClockAns;
TemLen = 20 + 12;
for(i = 0;i < 12;) //更新時鐘
{
RTclock[i/2]=16 * toint(ReceSbuf1[15+i]) + toint(ReceSbuf1[16+i]);
i+=2;
}
setup_write(); //設置實時時鐘操作方式
clock_write(RTclock); //修改時鐘命令
for(i=0;i<6;i++)
{
RTclock[i]=0;
}
clock_read(RTclock); //讀修改后的時鐘
for(i=0;i<6;i++) //讀取修改后的實時時鐘
{
hex2asc0(ReceSbuf1+15+2*i,RTclock[i]);
}
break;
case BaudCom: //串口設置命令
typeCom = BaudAns;
TemLen = 20 + 16;
for( i = 27;i < 31;i++) //保存參數
{
SendSbuf1[i] = ReceSbuf1[i];
}
BaudAnsFlag = 1; //波特率修改標志位置一
ReceCheck = 4096 * toint(ReceSbuf1[27]) + 256 * toint(ReceSbuf1[28]) + 16 * toint(ReceSbuf1[29]) + toint(ReceSbuf1[30]);
switch( ReceCheck ) //是否是正確的波特率
{
case 1200: NewBaud=1;break;
case 2400: NewBaud=2;break;
case 4800: NewBaud=3;break;
case 9600: NewBaud=4;break;
case 19200: NewBaud=5;break;
default :
state= 06 ;
NewBaud = 0;
BaudAnsFlag = 0;
break;
}
portBaud = 1 ; //要修改波特率的串口
break;
case RTdataCom: //實時數據命令
if(DuanKaiTiao&&JiaoTiFlag) //有斷開歷史記錄,該發送斷開歷史記錄
{
JiaoTiFlag = 0; //實時歷史記錄交替發送標志位
AddLed=(AddLed&0xF0)+DuanKaiZhi/64; //確定扇區
ledled = AddLed; //選通扇區
kk0=DuanKaiZhi%64*0x400; //第幾條,哪k
if(DuanKaiZhi%64<8)
{
for(kk=0;kk<33+AIDIsum;kk++)//斷開歷史記錄COPY到發送緩沖區
{
RamRom_Convert= 0;//切換為RAM628512操作
RamIO_Convert = 0;
data00=XBYTE[kk0+kk];//切換
RamRom_Convert= 1;//切換為RAM628128及IO口操作
RamIO_Convert = 1;
SendSbuf1[kk]=data00; //
}
}
else
{
RamRom_Convert= 1;//切換為RAM628128及IO口操作
RamIO_Convert = 0;
for(kk=0;kk<33+AIDIsum;kk++)//斷開歷史記錄COPY到發送緩沖區
{
SendSbuf1[kk]=XBYTE[kk0+kk]; //
}
}
RamRom_Convert= 1;//切換為RAM628128及IO口操作
RamIO_Convert = 1;
SendSbuf1[32+AIDIsum]='\n'; //字符結束符
DuanKaiTiao--; //調整斷開歷史記錄條數
if(DuanKaiZhi) //調整斷開歷史記錄存放位置
{
DuanKaiZhi--;//
}
else
{
DuanKaiZhi=DuanKaiRongL-1; //斷開歷史記錄條數容量
}
bNeedSend1 = 1; //啟動發送
ReceCount1 = 0; //串口1接收計數器清零
memset( ReceSbuf1, 0, 20 ); //串口1接收緩沖區清零
return;
}
else //沒有斷開歷史記錄,斷開后第一次連上發送實時數據,一條實時,一條歷史
{
JiaoTiFlag = 1; //實時歷史記錄交替發送標志位
TemLen=32+AIDIsum; //
typeCom = RTdataAns;
memcpy( SendSbuf1+27,RealTimeData,AIDIsum+12 );//讀取實時數據(包括AIDI標志字符)
}
break;
case ControlCom: //遙調遙控命令
typeCom = ControlAns;
ReceConFlag = 1; //收到控制標志位(閃燈用)
TemLen = 20 + 22; //
for( i = 27;i < 37;i++) //保存參數
{
SendSbuf1[i] = ReceSbuf1[i];
}
DotType = 16*toint(ReceSbuf1[27]) + toint(ReceSbuf1[28]); //測點類型
DotChunnel = 16*toint(ReceSbuf1[31]) + toint(ReceSbuf1[32]); //接收測點號(測點號不大0xFF)
controlFlag = 1; //要發控制標志位置一
if( DotType == TypeAO ) //測點量測試
{
if(DotChunnel>AOsum-1) //?????????是否減1
{
state=0x08; //參數出錯
controlFlag = 0;
}
DotModule = 0x1F-B33ID; //測點模塊
}
else if( DotType == TypeDO )
{
if( DotChunnel>DOsum-1) //?????????是否減1
{
state=0x08; //參數出錯
controlFlag = 0;
}
for( j = 0;j < Broadsum;j++ )
{
if( DotChunnel < DOarr[j] )
{
DotModule=j; //查找到模塊地址
break;
}
else
{ DotChunnel-=DOarr[j];}
}
} //測點號錯
else //測點類型校驗
{
state=0x07; //測點類型出錯
controlFlag = 0;
}
Dotparam = 4096 * toint(ReceSbuf1[33])+256 * toint(ReceSbuf1[34]) + 16 * toint(ReceSbuf1[35]) + toint(ReceSbuf1[36]);
break;
case HistoryNuCom: //查詢歷史記錄條數
typeCom = HistoryNuAns;
TemLen= 20 + 12 + 4; //數據包長度
if(ZhengChTiao>ZhengChRongL)
{
memcpy(SendSbuf1+27,"0000",4);
state = 6; //參數出錯
ZhengChZhi=0;
ZhengChTiao=0;
}
else
{
hex2asc1( SendSbuf1+27,ZhengChTiao); //曲線歷史記錄條數
}
break;
case HistoryNoCom: //查詢第n條曲線歷史記錄
kk = 0;
for(i=0;i<4;i++)//存放地址
{
kk=kk*16+toint(ReceSbuf1[27+i]);
}
if(kk>=ZhengChTiao)
{
TemLen= 20 + 12 + 4; //數據包長度
typeCom=HistoryNoAns;
state=6;
break;
}
AddLed=kk/64+4+(AddLed&0xF0); //選通扇區
ledled=AddLed; //選通扇區
kk0 = kk%64*0x400; //第幾條,哪k
if(kk%64<8)
{
for(kk=0;kk<33+AIDIsum;kk++)//斷開歷史記錄COPY到發送緩沖區
{
RamRom_Convert= 0;//切換為RAM628512操作
RamIO_Convert = 0;
data00=XBYTE[kk0+kk];//切換
RamRom_Convert= 1;//切換為RAM628128及IO口操作
RamIO_Convert = 1;
SendSbuf1[kk]=data00; //
}
}
else
{
RamRom_Convert= 1;//切換為RAM628128及IO口操作
RamIO_Convert = 0;
for(kk=0;kk<33+AIDIsum;kk++)//斷開歷史記錄COPY到發送緩沖區
{
SendSbuf1[kk]=XBYTE[kk0+kk];
}
}
RamRom_Convert= 1;//切換為RAM628128及IO口操作
RamIO_Convert = 1;
SendSbuf1[32+AIDIsum]='\n'; //發送結束符
bNeedSend1 = 1; //啟動發送
ReceCount1 = 0; //串口1接收計數器清零
memset( ReceSbuf1, 0, 20 ); //串口1接收緩沖區清零
return; //切換取出曲線歷史記錄送發送緩沖區
default :
state = 3; //命令類型有錯
break;
}
SendSbuf1[0] = 0x7E; //起始符
SendSbuf1[1] = VERh; //版本號
SendSbuf1[2] = VERl; //版本號
SendSbuf1[3] = 0x30; //擴展地址(隨意)
SendSbuf1[4] = 0x30;
hex2asc0( SendSbuf1 + 5, Read_ID() ); //采集箱地址
hex2asc0( SendSbuf1 + 7, typeCom ); //命令類型
hex2asc0( SendSbuf1 + 9, state ); //返回狀態
hex2asc1( SendSbuf1 + 11, TemLen-20 ); //數據塊長度
memcpy( SendSbuf1+15, ReceSbuf1+15, 12);//日期時間
SumCheck=CrcCheck(SendSbuf1+1,TemLen-6);//計算CRC
hex2asc1( SendSbuf1+TemLen-5,SumCheck); //CRC校驗
SendSbuf1[TemLen-1] = '\r'; //結束符
SendSbuf1[TemLen] = '\n'; //停止發送符
bNeedSend1 = 1; //啟動發送
ReceCount1 = 0; //串口1接收計數器清零
memset( ReceSbuf1, 0, 20 ); //串口1接收緩沖區清零
}
void Analyse2()
{
uchar data j,i,data00;
uint data kk,TemLen,kk0;
uchar length, readID, state, typeCom, ReceLen, RTclock[6];
uint SumCheck, ReceCheck;
ReceEndFlag2=0;
if( ReceSbuf2[0] != 0x7E ) //沒有數據包頭
{
memset( ReceSbuf2, 0, 50 ); //串口2接收緩沖區清零
ReceCount2 = 0; //串口2接收計數器清零
return;
}
for( i = 0;i < MaxRece2;i++ ) //計算包長度
{
if( ReceSbuf2[i] == '\r')
{
length = i+1;
break;
}
}
if( length < 10 && length > 60 ) //無效數據包
{
memset( ReceSbuf2, 0, 50 ); //串口2接收緩沖區清零
ReceCount2 = 0; //串口2接收計數器清零
return;
}
readID = toint( ReceSbuf2[5] ) * 16 + toint( ReceSbuf2[6] );
if( readID != Read_ID() )
{
memset( ReceSbuf2, 0, 50 ); //串口2接收緩沖區清零
ReceCount2 = 0; //串口2接收計數器清零
return; //采集箱的ID號校驗
}
SendSbuf2[SendCount2++] = '\r'; //結束上次發送(最好發送)
SendSbuf2[SendCount2] = '\n'; //結束上次發送(結束發送)
state = 0; //返回狀態
if( ReceSbuf2[0] != 0x7E ) state = 1; //起始符校驗
if( ReceSbuf2[1] != VERh && ReceSbuf2[2] != VERl)
{ //版本號校驗
state = 2;
}
/*
if( ReceSbuf2[18] >0x36 || ReceSbuf2[19] >0x36 || ReceSbuf2[21] >0x36 || ReceSbuf2[23] >0x36 || ReceSbuf2[25] >0x36)
{
state = 10; //日期時間錯
return;
}*/
SumCheck=CrcCheck( ReceSbuf2+1,length-6 ); //計算CRC //接收CRC
ReceCheck=4096 * toint( ReceSbuf2[length-5] )+256 * toint( ReceSbuf2[length-4] )+16 * toint( ReceSbuf2[length-3] )+toint( ReceSbuf2[length-2] );
if( SumCheck != ReceCheck ) state=5; //crc校驗
ReceLen = 0x10*toint( ReceSbuf2[13] ) + toint( ReceSbuf2[14] );
if(ReceLen != length-20) state=4; //數據塊長度
typeCom = 16 * toint( ReceSbuf2[7] ) + toint( ReceSbuf2[8] );
TemLen=0;
if(KaiJiShZhFlag) //開機時鐘校正
{
for(i = 0;i < 12;) //更新時鐘
{
RTclock[i/2]=16 * toint(ReceSbuf2[15+i]) + toint(ReceSbuf2[16+i]);
i+=2;
}
setup_write(); //設置實時時鐘操作方式
clock_write(RTclock); //修改時鐘命令
KaiJiShZhFlag=0;
}
switch( typeCom )
{
case ResetCom: //系統復位命令
typeCom = ResetAns;
TemLen = 32;
ResetAnsFlag = 1; //復位標志位置一
break;
case ClockCom: //時鐘校正命令
typeCom = ClockAns;
TemLen = 32;
for(i = 0;i < 12;) //更新時鐘
{
RTclock[i/2]=16 * toint(ReceSbuf2[15+i]) + toint(ReceSbuf2[16+i]);
i+=2;
}
setup_write(); //設置實時時鐘操作方式
clock_write(RTclock); //修改時鐘命令
for(i=0;i<6;i++)
{
RTclock[i]=0;
}
clock_read(RTclock); //讀修改后的時鐘
for(i=0;i<6;i++) //讀取修改后的實時時鐘
{
hex2asc0(ReceSbuf2+15+2*i,RTclock[i]);
}
break;
case BaudCom: //串口設置命令
typeCom = BaudAns;
TemLen = 36;
for( i = 27;i < 31;i++) //保存參數
{
SendSbuf2[i] = ReceSbuf2[i];
}
BaudAnsFlag = 1; //波特率修改標志位置一
ReceCheck = 4096 * toint(ReceSbuf2[27]) + 256 * toint(ReceSbuf2[28]) + 16 * toint(ReceSbuf2[29]) + toint(ReceSbuf2[30]);
switch( ReceCheck ) //是否是正確的波特率
{
case 1200: NewBaud=1;break;
case 2400: NewBaud=2;break;
case 4800: NewBaud=3;break;
case 9600: NewBaud=4;break;
case 19200: NewBaud=5;break;
default :
state = 06;
NewBaud = 0;
BaudAnsFlag = 0;
break;
}
portBaud = 2 ; //要修改波特率的串口
break;
case RTdataCom: //實時數據命令
if(DuanKaiTiao&&JiaoTiFlag) //有斷開歷史記錄,該發送斷開歷史記錄
{
JiaoTiFlag = 0; //實時歷史記錄交替發送標志位
AddLed=(DuanKaiZhi/64)+(AddLed&0xF0);//確定扇區
ledled = AddLed; //選通扇區
kk0=DuanKaiZhi%64*0x400; //第幾條,哪k
if(DuanKaiZhi%64<8)
{
for(kk=0;kk<33+AIDIsum;kk++)//斷開歷史記錄COPY到發送緩沖區
{
RamRom_Convert= 0;//切換為RAM628512操作
RamIO_Convert = 0;
data00=XBYTE[kk0+kk];//切換
RamRom_Convert= 1;//切換為RAM628128及IO口操作
RamIO_Convert = 1;
SendSbuf2[kk]=data00; //
}
}
else
{
RamRom_Convert= 1;//切換為RAM628512操作
RamIO_Convert = 0;
for(kk=0;kk<33+AIDIsum;kk++)//斷開歷史記錄COPY到發送緩沖區
{
SendSbuf2[kk]=XBYTE[kk0+kk]; //
}
}
RamRom_Convert= 1;//切換為RAM628512操作
RamIO_Convert = 1;
SendSbuf2[32+AIDIsum]='\n'; //字符結束符
DuanKaiTiao--; //調整斷開歷史記錄條數
if(DuanKaiZhi) //調整斷開歷史記錄存放位置
{
DuanKaiZhi--;//
}
else
{
DuanKaiZhi=DuanKaiRongL-1; //斷開歷史記錄條數容量
}
bNeedSend2 = 1; //啟動發送
ReceCount2 = 0; //串口1接收計數器清零
memset( ReceSbuf2, 0, 10 ); //串口1接收緩沖區清零
return;
}
else //沒有斷開歷史記錄,斷開后第一次連上發送實時數據,一條實時,一條歷史
{
JiaoTiFlag = 1; //實時歷史記錄交替發送標志位
TemLen= 32+AIDIsum; //數據包長度
typeCom = RTdataAns;
memcpy( SendSbuf2+27,RealTimeData,AIDIsum+12 );//讀取實時數據(包括AIDI標志字符)
}
break;
case ControlCom: //遙調遙控命令
typeCom = ControlAns;
ReceConFlag = 1; //收到控制標志位(閃燈用)
TemLen = 20 + 22; //
for( i = 27;i < 37;i++) //保存參數
{
SendSbuf2[i] = ReceSbuf2[i];
}
DotType = 16 * toint(ReceSbuf2[27]) + toint(ReceSbuf2[28]); //測點類型
DotChunnel = 16 * toint(ReceSbuf2[31]) + toint(ReceSbuf2[32]); //接收測點號(測點號不大0xFF)
controlFlag = 1; //要發控制標志位置一
if( DotType == TypeAO ) //測點量測試
{
if(DotChunnel>AOsum-1) //?????????是否減1
{
state=0x08; //參數出錯
controlFlag = 0;
}
DotModule = 0x1F-B33ID; //測點模塊
}
else if( DotType == TypeDO )
{
if( DotChunnel>DOsum-1) //?????????是否減1
{
state=0x08; //參數出錯
controlFlag = 0;
}
for( j = 0;j < Broadsum;j++ )
{
if( DotChunnel < DOarr[j] )
{
DotModule=j; //查找到模塊地址
break;
}
else
{ DotChunnel-=DOarr[j];}
}
} //測點號錯
else //測點類型校驗
{
state=0x07; //測點類型出錯
controlFlag = 0;
}
Dotparam = 4096 * toint(ReceSbuf2[33])+256 * toint(ReceSbuf2[34]) + 16 * toint(ReceSbuf2[35]) + toint(ReceSbuf2[36]);
break;
case HistoryNuCom: //查詢歷史記錄條數
typeCom = HistoryNuAns;
TemLen= 20 + 12 + 4; //數據包長度
if(ZhengChTiao>ZhengChRongL)
{
memcpy(SendSbuf2+27,"0000",4);
state = 6; //參數出錯
ZhengChZhi=0;
ZhengChTiao=0;
}
else
{
hex2asc1( SendSbuf2+27,ZhengChTiao); //曲線歷史記錄條數
}
break;
case HistoryNoCom: //查詢第n條曲線歷史記錄
kk = 0;
for(i=0;i<4;i++)//存放地址
{
kk=kk*16+toint(ReceSbuf2[27+i]);
}
if(kk>=ZhengChTiao)
{
TemLen= 36; //數據包長度
typeCom=HistoryNoAns;
state=6;
break;
}
AddLed = (AddLed&0xF0)+kk/64+4; //選通扇區
ledled = AddLed; //選通扇區
kk0 = kk%64*0x400; //第幾條,哪k
if(kk%64<8)
{
for(kk=0;kk<AIDIsum+33;kk++)//斷開歷史記錄COPY到發送緩沖區
{
RamRom_Convert= 0;//切換為RAM628512操作
RamIO_Convert = 0;
data00=XBYTE[kk0+kk];//切換
RamRom_Convert= 1;//切換為RAM628128及IO口操作
RamIO_Convert = 1;
SendSbuf2[kk]=data00; //
}
}
else
{
RamRom_Convert= 1;//切換為RAM628128及IO口操作
RamIO_Convert = 0;
for(kk=0;kk<AIDIsum+33;kk++)//斷開歷史記錄COPY到發送緩沖區
{
SendSbuf2[kk]=XBYTE[kk0+kk]; //
}
}
RamRom_Convert= 1;//切換為RAM628512操作
RamIO_Convert = 1;
SendSbuf2[AIDIsum+32]='\n';
bNeedSend2 = 1; //啟動發送
ReceCount2 = 0; //串口1接收計數器清零
memset( ReceSbuf2, 0, 20 ); //串口1接收緩沖區清零
return; //切換取出曲線歷史記錄送發送緩沖區
default :
state = 3; //命令類型有錯
break;
}
SendSbuf2[0] = 0x7E; //起始符
SendSbuf2[1] = VERh; //版本號
SendSbuf2[2] = VERl; //版本號
SendSbuf2[3] = 0x30; //擴展地址(隨意)
SendSbuf2[4] = 0x30;
hex2asc0( SendSbuf2 + 5, Read_ID() ); //采集箱地址
hex2asc0( SendSbuf2 + 7, typeCom ); //命令類型
hex2asc0( SendSbuf2 + 9, state ); //返回狀態
hex2asc1( SendSbuf2 + 11, TemLen-20 ); //數據塊長度
memcpy( SendSbuf2+15, ReceSbuf2+15, 12); //日期時間
SumCheck=CrcCheck(SendSbuf2+1,TemLen-6);//計算CRC
hex2asc1( SendSbuf2+TemLen-5,SumCheck); //CRC校驗
SendSbuf2[TemLen-1] = '\r'; //結束符
SendSbuf2[TemLen] = '\n'; //停止發送符
bNeedSend2 = 1; //啟動發送
ReceCount2 = 0; //串口0接收計數器清零
memset( ReceSbuf2, 0, 20 ); //串口2接收緩沖區清零
}
void TurnOnCom(uchar call00) //輪詢點名,參數是板地址
{
uchar leni=0;
uint crci;
uchar xdata PreSbuf00[] = "04100000000\r\n";
PreSbuf00[0] = 0x1F - call00; //從模塊地址
crci = CrcCheck(PreSbuf00, 7); //CRC校驗
hex2asc1( PreSbuf00+7, crci); //crc校驗高八bits
memcpy( SendSbuf0, PreSbuf00, sizeof(PreSbuf00) );//送發送緩沖區
SendCount0 = 0;
ReceCount0 = 0;
TB8 = 1; //發送地址
SBUF = SendSbuf0[SendCount0++]; //啟動發送
lockFlagDn = 1; //下發上鎖
}
void ControlComm() //下發遙控遙調命令
{
uchar leni=0;
uint crci;
uchar xdata PreSbuf00[]="0430008HHHHGGGG0000\r\n";
controlFlag = 0;
PreSbuf00[0]=0x1F-DotModule; //從模塊地址
hex2asc0( PreSbuf00 + 7, DotType ); //測點類型
hex2asc0( PreSbuf00 + 9, DotChunnel ); //測點通道
hex2asc1( PreSbuf00 + 11, Dotparam ); //測點參數
crci=CrcCheck( PreSbuf00, 15 ); //CRC校驗
hex2asc1( PreSbuf00 + 15,crci ); //crc校驗;
memcpy( SendSbuf0, PreSbuf00, sizeof(PreSbuf00) );//送發送緩沖區
ReceCount0 = 0;
SendCount0 = 0;
TB8 = 1; //發送地址
SBUF = SendSbuf0[SendCount0++]; //啟動發送
lockFlagDn = 1; //下發上鎖
}
void timeout0() //超時,送FFFF無效數據
{
FalseTime0=0;
memset(RealTimeData+6,0x46,B00AI*4); //AI量
memset(RealTimeData+AIsum+12,0x46,B00DI/2); //DI量
}
void timeout1() //超時,送FFFF無效數據
{
FalseTime1=0;
memset(RealTimeData+6+B00AI*4,0x46,B11AI*4); //AI量
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -