📄 zhu19200.c.bak
字号:
void timeout2() //超时,送FFFF无效数据
{
FalseTime2=0;
memset(RealTimeData+6+B00AI*4+B11AI*4,0x46,B22AI*4); //AI量
}
void timeout3() //超时,送FFFF无效数据
{
FalseTime3=0;
memset(RealTimeData+6+AIsum-B33AI*4,0x46,B33AI*4); //AI量
memset(RealTimeData+12+AIsum+B00DI/2,0x46,B33DI/2); //DI量
}
void SendPermit1()
{
#ifdef OpenEn
SendEn |= 0x02;
#else
SendEn |= 0x06;
#endif
XBYTE[0xE000] = SendEn; //允许发送进中断1
SendCount1 = 0; //串口1发送计数器清零
SendingFlag1 = 1;
if( ResetAnsFlag ) //系统复位(死循环)
{
ResetAnsFlag=0;
while(1);
}
}
void SendPermit2()
{
#ifdef OpenEn
#else
uchar xdata i=0;
#endif
#ifdef OpenEn
SendEn |= 0x20;
#else
SendEn |= 0x28;
#endif
XBYTE[0xE000] = SendEn; //允许发送进中断1
#ifdef OpenEn
#else
while(i++<100) _nop_(); //延时
#endif
SendCount2 = 0; //串口2发送计数器清零
SendingFlag2 = 1;
if( ResetAnsFlag ) //系统复位(死循环)
{
ResetAnsFlag=0;
while(1);
}
}
void testAODO()
{
#ifdef TestDO
controlFlag=1;
DotType = 0x83;
DotModule = 0;
DotChunnel = 0;
Dotparam = 0;
#endif
_nop_();
}
void BaoCunZhengCh() //保存曲线历史记录
{
uint data kk,kk0; //曲线历史记录保存768条记录,0x40000-0xFFFFF;
uchar data RamRam;
uchar xdata temp_a[MaxSend],YYMMDD[6];
//组织正常历史记录
temp_a[0] = 0x7E; //起始符
temp_a[1] = VERh; //版本号
temp_a[2] = VERl; //版本号
temp_a[3] = 0x30; //扩展地址(随意)
temp_a[4] = 0x30;
temp_a[7] = 0x34; //命令类型
temp_a[8] = 0x38;
temp_a[9] = 0x30; //返回状态
temp_a[10]= 0x30;
hex2asc0( temp_a + 5, Read_ID() ); //采集箱地址
hex2asc1( temp_a + 11, AIDIsum+12); //数据块长度
clock_read(YYMMDD); //读取日期时间
hex2asc0( temp_a + 15, YYMMDD[0]); //年//日期时间
hex2asc0( temp_a + 17, YYMMDD[1]); //月
hex2asc0( temp_a + 19, YYMMDD[2]); //日
hex2asc0( temp_a + 21, YYMMDD[3]); //时
hex2asc0( temp_a + 23, YYMMDD[4]); //分
hex2asc0( temp_a + 25, YYMMDD[5]); //秒
memcpy(temp_a+27,RealTimeData,AIDIsum); //实时数据
kk=CrcCheck(temp_a+1,26+AIDIsum); //计算CRC
hex2asc1(temp_a+27+AIDIsum,kk); //CRC校验
temp_a[31+AIDIsum] = '\r'; //结束符
temp_a[32+AIDIsum] = '\n'; //停止发送符
//保存正常历史记录
AddLed=ZhengChZhi/64+4+(AddLed&0xF0);//确定扇区//选通扇区
ledled = AddLed; //选通扇区
kk0 = ZhengChZhi%64*0x400; //第几条,哪k
if(ZhengChZhi%64<8)
{
for(kk=0;kk<33+AIDIsum;kk++) //628128存到628512RAM
{
RamRom_Convert= 1;//选通628128RAM
RamIO_Convert = 1;
RamRam = temp_a[kk];
RamRom_Convert= 0;
RamIO_Convert = 0;//选通628512RAM
XBYTE[kk0+kk]=RamRam;
}
}
else
{
RamRom_Convert= 1;
RamIO_Convert = 0;//选通628512RAM
for(kk=0;kk<33+AIDIsum;kk++) //628128存到628512RAM
{
XBYTE[kk0+kk]=temp_a[kk];
}
}
RamRom_Convert= 1;//选通628128RAM
RamIO_Convert = 1;
if(ZhengChZhi<ZhengChRongL-1) //调整正常历史记录第n条;
{
ZhengChZhi++;
}
else if(ZhengChZhi==ZhengChRongL-1) //调整正常历史记录第n条加1;
{ //方便读取
ZhengChZhi=0;
}
else //地址乱了
{
ZhengChZhi=0;
ZhengChTiao=0;
}
if(ZhengChTiao<ZhengChRongL) //调整保存的断开历史记录条数
{
ZhengChTiao++;
}
else if(ZhengChTiao==ZhengChRongL) //保存的断开历史记录条数
{
;
}
else //指针出错
{
ZhengChZhi=0;
ZhengChTiao=0;
}
}
void BaoCunDuanKai() //保存断开历史记录
{
uint data kk,kk0; //断开历史记录保存256条记录,0x00000-0x3FFFF;
uchar data RamRam;
uchar xdata temp_a[MaxSend],YYMMDD[6];
JiaoTiFlag = 0; //断开后先发送实时记录
//组织断开历史记录
temp_a[0] = 0x7E; //起始符
temp_a[1] = VERh; //版本号
temp_a[2] = VERl; //版本号
temp_a[3] = 0x30; //扩展地址(随意)
temp_a[4] = 0x30;
temp_a[7] = 0x34; //命令类型
temp_a[8] = 0x32;
temp_a[9] = 0x30; //返回状态
temp_a[10]= 0x30;
hex2asc0( temp_a + 5, Read_ID() ); //采集箱地址
hex2asc1( temp_a + 11, AIDIsum+12); //数据块长度
clock_read(YYMMDD); //读取日期时间
hex2asc0( temp_a + 15, YYMMDD[0]); //年//日期时间
hex2asc0( temp_a + 17, YYMMDD[1]); //月
hex2asc0( temp_a + 19, YYMMDD[2]); //日
hex2asc0( temp_a + 21, YYMMDD[3]); //时
hex2asc0( temp_a + 23, YYMMDD[4]); //分
hex2asc0( temp_a + 25, YYMMDD[5]); //秒
memcpy(temp_a+27,RealTimeData,AIDIsum); //实时数据
kk0=CrcCheck(temp_a+1,26+AIDIsum); //计算CRC
hex2asc1( temp_a+27+AIDIsum,kk0); //CRC校验
temp_a[31+AIDIsum] = '\r'; //结束符
temp_a[32+AIDIsum] = '\n'; //停止发送符
//保存断开历史记录
if(DuanKaiZhi==DuanKaiRongL-1) //调整断开历史记录第n条;
{ //方便读取
DuanKaiZhi=0;
}
else if(DuanKaiZhi<DuanKaiRongL-1) //断开历史记录第n条加1;
{ //方便读取
DuanKaiZhi++;
}
else //地址乱了
{
DuanKaiZhi=0;
DuanKaiTiao=0;
}
AddLed = (AddLed&0xF0)+DuanKaiZhi/64; //存放到什么扇区?//选通扇区
ledled = AddLed; //选通扇区
kk0 = DuanKaiZhi%64*0x400; //第几条,哪k
if(DuanKaiZhi%64<8)
{
for(kk=0;kk<33+AIDIsum;kk++) //628128存到628512RAM
{
RamRom_Convert= 1;//选通628128RAM
RamIO_Convert = 1;
RamRam = temp_a[kk];
RamRom_Convert= 0;
RamIO_Convert = 0;//选通628512RAM
XBYTE[kk0+kk]=RamRam;
}
}
else
{
RamRom_Convert= 1;
RamIO_Convert = 0;//选通628512RAM
for(kk=0;kk<33+AIDIsum;kk++) //628128存到628512RAM
{
XBYTE[kk0+kk]=temp_a[kk];
}
}
RamRom_Convert= 1;//选通628128RAM
RamIO_Convert = 1;
if(DuanKaiTiao<DuanKaiRongL) //调整保存的断开历史记录条数
{
DuanKaiTiao++;
}
else if(DuanKaiTiao==DuanKaiRongL) //保存的断开历史记录条数
{
;
}
else
{
DuanKaiZhi=0;
DuanKaiTiao=0;
}
//2003.12.05 duan kai 18 minutes reset
//if(DuanKaiCount++>20) //断开历史纪录保存20条后,系统重起
//{
//DuanKaiCount=0;
while(1);
//}
}
void Test512()
{
uchar data test0c;
uint data test0i;
bit testFlag=0;
FeedDogFlag=0; //喂狗
_nop_();
FeedDogFlag=1;
for(test0c=0;test0c<16;test0c++)
{
RamRom_Convert= 1;
RamIO_Convert = 1; //选通628512RAM
Feed_watchdog();
AddLed=(AddLed&0xF0)+test0c; //选择扇区
ledled=AddLed;
RamRom_Convert= 0;
RamIO_Convert = 0; //选通628512RAM
for(test0i=0;test0i<0x1FFF;test0i++) //test 512 0x0000-0x1FFF
{
XBYTE[test0i]=0x55;
if(XBYTE[test0i]!=0x55)
{
testFlag=1;
break;
}
XBYTE[test0i]=0xAA;
if(XBYTE[test0i]!=0xAA)
{
testFlag=1;
break;
}
}
if(testFlag)
{
break;
}
RamRom_Convert= 1;
RamIO_Convert = 0;//选通628512RAM
for(test0i=0x2000;test0i<0xFFFF;test0i++)//test 512 0x2000-0xFFFF
{
XBYTE[test0i]=0x55;
if(XBYTE[test0i]!=0x55)
{
testFlag=1;
break;
}
XBYTE[test0i]=0xAA;
if(XBYTE[test0i]!=0xAA)
{
testFlag=1;
break;
}
FeedDogFlag=0; //喂狗
_nop_();
FeedDogFlag=1;
}
if(testFlag)
{
break;
}
}
RamRom_Convert= 1;
RamIO_Convert = 1; //选通628512RAM
if(testFlag)
{
KuaiShFlag=1; //512坏,快闪
memcpy(SendSbuf1,"SRAM test Fail\r\n\0",18);
}
else
{
ManShFlag=1; //512好,慢闪
memcpy(SendSbuf1,"SRAM test Pass\r\n\0",18);
}
SendPermit1();
}
void KaiJiRengZhen() //开机认证
{
uchar data iii0;
bit KaiJiFlag=0;
for(iii0=0;iii0<8;iii0++)
{
if(iii0!=KaiJiRZh[iii0])
{
KaiJiFlag=1;
break;
}
}
if(KaiJiFlag)
{
Test512();
for(iii0=0;iii0<8;iii0++)
{
KaiJiRZh[iii0]=iii0;
}
DuanKaiTiao=0;
DuanKaiZhi=0;
ZhengChTiao=0;
ZhengChZhi=0;
}
if(DuanKaiTiao>DuanKaiRongL||DuanKaiZhi>=DuanKaiRongL)
{
DuanKaiTiao=0;
DuanKaiZhi=0;
}
if(ZhengChTiao>ZhengChRongL||DuanKaiZhi>=ZhengChRongL)
{
ZhengChTiao=0;
ZhengChZhi=0;
}
}
void System_init() //系统初始化
{
uchar xdata ii3;
TMOD = 0x10; SCON = 0x90;//串行方式2,波特率为172.8k;定时器0:计数,1:定时
PCON = 0x00; TCON = 0x40;//1:波特率增大一倍;0:INT0/1为电平触发;1:为边沿触发
TL0 = 0xFF; TH0 = 0xFF;//上层中断3准备
TL1 = 0xFA; TH1 = 0x3C;//定时50ms:0x1000-0x3cfa=49926
IP = 0x10; IE = 0x1D;//串行中断级别优先;开串口中断,总中断
TBUS_EN = 0; //打开与从CPU的422通信使能
//初始化8251:异步,波特率因子为16,8为数据位,一位停止位;接收开放
AddLed = 0xB0;
ledled=AddLed;//亮灯,鸣叫
#ifdef OpenEn
SendEn = 0x0C;
#else
SendEn = 0;
#endif
XBYTE[0xE000] = SendEn;//扩展串口
XBYTE[0x4001] = 0;
XBYTE[0x4001] = 0;
XBYTE[0x4001] = 0;
XBYTE[0x4001] = 0x40;
Delay_nop0(5);
XBYTE[0x4001] = 0x4E; //送方式选择字
XBYTE[0x4001] = 5; //送命令字,允许发送接受
ii3 = XBYTE[0x4000];
XBYTE[0x6001] = 0;
XBYTE[0x6001] = 0;
XBYTE[0x6001] = 0;
XBYTE[0x6001] = 0x40;
Delay_nop0(5);
XBYTE[0x6001] = 0x4E; //送方式选择字
XBYTE[0x6001] = 5; //送命令字,允许发送接受
ii3 = XBYTE[0x6000];
baud_select( 1,5 ); //通道1波特率设为19200
baud_select( 2,5 ); //通道2波特率设为19200
Feed_watchdog(); //喂狗
#ifdef TestSendEn //测试发送使能
SendEn=0x0C; //打开光端机的发送使能
XBYTE[0xE000]=SendEn; //扩展串口发送使能控制
//(继电器掉电不影响环路的通信,模拟开关跟环路无关)
while(1) //测试继电器,模拟开关;
{
RamIO_Convert = 1;
for( ii3=0; ii3<200; ii3++ )
{
Delay_nop0(255);
}
Feed_watchdog();
SendEn3Flag = !SendEn3Flag;
XBYTE[0xE000] = SendEn; //扩展串口发送使能控制
}
#endif
EA =1;
}
void valueCLK()
{
RamRom_Convert = 1;
RamIO_Convert = 1;
lockFlagDn = 0;
controlFlag = 0;
ReceConFlag = 0;
ReceEndFlag0 = 0;
SendingFlag1 = 0;
ReceEndFlag1 = 0;
SendingFlag2 = 0;
ReceEndFlag2 = 0;
bNeedSend1 = 0;
bNeedSend2 = 0;
SendCount0 = 0;
ReceCount0 = 0;
SendCount1 = 0;
ReceCount1 = 0;
SendCount2 = 0;
ReceCount2 = 0;
DelayCount = 0;
ResetAnsFlag = 0;
BaudAnsFlag = 0;
NoReceFlag = 0; //开始设为有发送
ReBaudFlag = 0;
ReBaudCount = 0;
FalseTime0 = 0;
FalseTime1 = 0;
FalseTime2 = 0;
FalseTime3 = 0;
memset( SendSbuf0, 0, sizeof(SendSbuf0) ); //缓冲区清零
memset( ReceSbuf0, 0, sizeof(ReceSbuf0) ); //缓冲区清零
memset( SendSbuf1, 0, sizeof(SendSbuf1) ); //缓冲区清零
memset( ReceSbuf1, 0, sizeof(ReceSbuf1) ); //缓冲区清零
memset( SendSbuf2, 0, sizeof(SendSbuf2) ); //缓冲区清零
memset( ReceSbuf2, 0, sizeof(ReceSbuf2) ); //缓冲区清零
memset(RealTimeData,0x46,sizeof(RealTimeData)); //实时数据送无效数据0xFF
RealTimeData[0]=0x38; //AI标号
RealTimeData[1]=0x30;
hex2asc1(RealTimeData+2,75+B33AI); //AI通道数
RealTimeData[AIsum+6]=0x38; //DI标号
RealTimeData[AIsum+7]=0x31;
hex2asc1(RealTimeData+AIsum+8,(8+B33DI)/4); //DI通道数,压缩
}
main()
{
uchar iii = 0;
uchar data broad = 10;//,ExecuteCom;
#ifdef TestClock
uchar xdata writeclock[6]={03,10,30,13,24,14};
setup_write();
clock_write(writeclock);
#endif
valueCLK(); //全局变量清零
testAODO();
System_init(); //系统初始化
KaiJiRengZhen();
EA=1;
while(1)
{
FeedDogFlag=0; //喂狗
_nop_();
FeedDogFlag=1;
if( ReceEndFlag0 ) //解析串口0
{
Analyse0();
}
if( ReceEndFlag1 ) //解析串口1
{
Analyse1();
}
if( bNeedSend1 ) //串口1是否要发
{
SendPermit1();
}
if(ReBaudFlag) //10分钟没发送就保存断开历史记录
{
ReBaudFlag = 0;
BaoCunDuanKai(); //保存断开历史记录
}
if( ReceEndFlag2 ) //解析串口2
{
Analyse2();
}
if( bNeedSend2 ) //串口2是否要发
{
SendPermit2();
}
if( BaudAnsFlag ) //修改波特率
{
for( iii=0; iii<110; iii++ ) //延时110ms
{
Delay_nop0(61);
Feed_watchdog();
}
BaudAnsFlag=0;
baud_select(portBaud,NewBaud);
}
if( ReceEndFlag0 ) //解析串口0
{
Analyse0();
}
if( lockFlagDn == 0 ) //向下发送上锁?
{
if(controlFlag == 0) //轮询下发要实时数据
{
if(broad++>Broadsum-2)
{
broad=0;
}
TurnOnCom(broad);
switch(broad)
{
case 0:
if( FalseTime0++>6)
{
timeout0();//从模块0超时(4次)
}
break;
case 1:
if(FalseTime1++>5)
{
timeout1();//从模块1超时
}
break;
case 2:
if(FalseTime2++>5)
{
timeout2();//从模块2超时
}
break;
case 3:
if(FalseTime3++>5)
{
timeout3();//从模块3超时
}
break;
}
}
else ControlComm(); //下发遥调遥测数据
}
if(ZhengChFlag) //保存正常历史记录(10分钟)
{
ZhengChFlag = 0;
BaoCunZhengCh();//保存曲线历史纪录
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -