📄 zhu1126_96.c
字号:
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 + -