📄 zijian_task.c
字号:
// 处理床体F76 和地震仪的任务==================================
// 处理床体F76 和地震仪的任务==================================
// 处理床体F76 和地震仪的任务==================================
// 处理床体F76 和地震仪的任务==================================
// 处理床体F76 和地震仪的任务==================================
// 处理床体F76 和地震仪的任务==================================
// 处理床体F76 和地震仪的任务==================================
// 处理床体F76 和地震仪的任务==================================
// 处理床体F76 和地震仪的任务==================================
#include "all.h"
//对码命令
code uchar DuiMa_Command[8]={0XEE,0XEE,2,0,2,0XAB}; //对码命令
code uchar DuiMaBoard_ZiJian_Command[8]={0XEE,0XEE,99,0,99,0XAB}; //对码命令
//返回 sum=99;
// ShangZhuang_message(99, &sum, 1);
code uchar DuiMa_Clear_Command[8]={0XEE,0XEE,3,0,3,0XAB}; //清除对码命令
bit Xin_Status_B; //新自检 状态标志
void Ying_da_error(uchar);
void Ying_da_ok(uchar);
//void F76_Attand_485(void) ;
uchar ZiJian_ChuangTi_Once() ;
uchar ZiJian_DiZhenYi_Once() ;
/**********************************************************************
**函数原型: void Attand_485(void)
**入口参数: Xin_F76_RX_B=1
**出口参数: 无
**返 回 值: 无
**说 明: 处理床体F76 和地震仪的任务
************************************************************************/
uchar zi_s_cnt;
uchar zi_M_cnt;
bit En_zijian_B=0; //强行自检位
//自检任务
void ZiJian_ATAND (void) _task_ ZIJIAN {
while(1) {
os_wait2(K_TMO,2);
Dog_ZIJIAN_cnt=0; //看门狗计数器
if( En_zijian_B) { //强行自检位)
goto Ziiiiiiii;
}
En_zijian_B=0;
if(Second_ZiJian==0xff) { //自检计时
Second_ZiJian=0;
if(++zi_s_cnt>=60) { //分钟
zi_s_cnt=0;
if(Para_all_True.ZiJian_Time!=0) {
if(++zi_M_cnt>=Para_all_True.ZiJian_Time) {
Ziiiiiiii:
zi_M_cnt=0;
if(ZiJian_ChuangTi_Once()==0)
ZiJian_ChuangTi_Once();
if(ZiJian_DiZhenYi_Once()==0)
ZiJian_DiZhenYi_Once();
if(En_zijian_B==0)
Xin_Status_B=1; //让KEY_232_ATTAND进行发送
En_zijian_B=0; //强行自检位
Para_all_True.Change_Flag=1;
}
}
else ; //等于0 则不自检
}
}
// F76_Attand_485() ;
}
}
/**********************************************************************
**函数原型: void Attand_485(void)
**入口参数: Xin_F76_RX_B=1
**出口参数: 无
**返 回 值: 1: 成功进行了一次自检
**说 明: 床体自检一次子程序。
上位机指令格式
'@' '2' '1' '0' 0dH
床体回复:
1当床体正常工作,压力正常,正确接收到指令时候通讯格式:
'@' 'O' 'K' '.' 0dH
OK. :即为工作正常
2当床体正常工作,压力不正常,正确接收到指令时候通讯格式:
'@' 'P' 'N' 'O' 0dH
PNO:即为压力不正常。
3当床体正常工作,压力正常,不能正确接收到指令时候通讯格式:
如收到的指令是错误的,床体将不发送任何信息和动作。
4当床体正常工作,压力不正常,不能正确接收到指令时候通讯格式:
同第3条。
5当床体不正常工作
当床体在待机工作情况时,将不发送任何信息,如果床体在运行过程中,出现停止,而影响设备的运行,将发送信息,其通讯格式为:
'@' 'N' 'O' '. ' 0dH
NO. :即为工作不正常。
************************************************************************/
code char ChuangTi_ZiJian_Command_1[8]="@210\r"; //床体自检自检命令
uchar ZiJian_ChuangTi_Once() { //f76
bit okbb=0;
MoveByte(F76_TX_Buff, (uchar *)ChuangTi_ZiJian_Command_1, 8);
Xin_DiZh_RX_B=0;
// FA_f76_Buff();
F76_TX_Len=5; // DiZh_Tx_Buff[3]+6;
F76_TX_cnt=0;
if(bUartBusy==0){ //判断发送中断是否处于激活状态,若没有激活则:
SCON1|=2; //TI=1; //激活MCU的串口发送程序
bUartBusy=1; //置发送程序已经激活的标志
}
//FA_F76_Buff();
okbb=0;
os_wait2(K_TMO,60);
if(Xin_F76_RX_B) {
Xin_F76_RX_B=0;
if(strstr(DiZh_Rx_Buff,"@OK.\r")!=0) { //如果收到确ok
okbb=1;
Para_all_True.ChuangTi_status[0]=1; // 1:床体正常工作
Para_all_True.ChuangTi_status[1]=1; // 压力正常
Para_all_True.ChuangTi_status[2]=1;
Para_all_True.Is_ChuangTi_Ok=1; // 正常
}
else if( strstr(DiZh_Rx_Buff,"@PNO\r")!=0 ) {
okbb=1;
Para_all_True.ChuangTi_status[0]=1; //1:床体正常工作
Para_all_True.ChuangTi_status[1]=0; // 压力不正常
Para_all_True.ChuangTi_status[2]=0;
Para_all_True.Is_ChuangTi_Ok=0; //不正常
}
else if( strstr(DiZh_Rx_Buff,"@NO.\r")!=0 ) {
okbb=1;
Para_all_True.ChuangTi_status[0]=0; //1:床体不正常工作
Para_all_True.ChuangTi_status[1]=0; // 压力不正常
Para_all_True.ChuangTi_status[2]=0;
Para_all_True.Is_ChuangTi_Ok=0; //不正常
}
else {
return(0); //应答出错
}
}
else {
Para_all_True.ChuangTi_status[0]=0; //1:床体不正常工作
Para_all_True.ChuangTi_status[1]=0; // 压力不正常
Para_all_True.ChuangTi_status[2]=0;
Para_all_True.Is_ChuangTi_Ok=0; //不正常
return(0); //没有应答
}
if(okbb==1) {
Para_all_True.DiZhenYi_status[0]=1; //正常
Para_all_True.Is_DiZhenYi_Ok=1; //正常
}
else {
Para_all_True.DiZhenYi_status[0]=0; //不正常
Para_all_True.Is_DiZhenYi_Ok=0; //不正常
}
return(1);
}
/*
3字节数据(Byte1Byte2Byte3)
Byte1: 0:床体不正常工作,1:床体正常工作
Byte2: 0:压力不正常 1:压力正常
Byte3: (备用)
*/
/**********************************************************************
**函数原型: void Attand_485(void)
**入口参数: Xin_F76_RX_B=1
**出口参数: 无
**返 回 值: 1:成功进行了一次自检
**说 明: 地震仪自检一次子程序。
收到上位机命令(4字节):ZJ+空格+回车
强震仪进行自检,如无故障向上位机发送(4字节):TU+空格+回车
如有故障向上位机发送(4字节):FS+空格+回车
************************************************************************/
code char Dizh_ZiJian_Command[8]="ZJ \r"; //地震仪自检命令
code char Dizh_ZiJian_OK[8]="TU \r"; //地震仪自检OK
uchar ZiJian_DiZhenYi_Once() {
bit okbb=0;
MoveByte(DiZh_Tx_Buff, (uchar *)Dizh_ZiJian_Command, 8);
Xin_DiZh_RX_B=0;
//FA_DiZhen_Buff();
DiZh_TX_Len=4; // DiZh_Tx_Buff[3]+6;
DiZh_TX_cnt=0;
if(bUartBusy==0){ //判断发送中断是否处于激活状态,若没有激活则:
SCON1|=2; //TI=1; //激活MCU的串口发送程序
bUartBusy=1; //置发送程序已经激活的标志
}
//FA_DiZhen_Buff();
okbb=0;
os_wait2(K_TMO,60);
if(Xin_DiZh_RX_B) {
Xin_DiZh_RX_B=0;
if(strstr(DiZh_Rx_Buff,"TU \r")!=0) {
//如果收到确ok
okbb=1;
}
}
else {
Para_all_True.DiZhenYi_status[0]=0; //不正常
Para_all_True.Is_DiZhenYi_Ok=0; //不正常
return(0);
}
if(okbb==1) {
Para_all_True.DiZhenYi_status[0]=1; //正常
Para_all_True.Is_DiZhenYi_Ok=1; //正常
}
else {
Para_all_True.DiZhenYi_status[0]=0; //不正常
Para_all_True.Is_DiZhenYi_Ok=0; //不正常
}
return(1);
}
/*
2字节数据 (Byte1Byte2)
Byte1: 0:地震仪发生故障,1:地震仪正常工作
Byte2: (备用)
*/
/**********************************************************************
**函数原型: void Attand_485(void)
**入口参数: Xin_F76_RX_B=1
**出口参数: 无
**返 回 值: 无
**说 明: 处理报警板 485 命令之子程序。
************************************************************************/
/*
void F76_Attand_485(void) //注:中断里面使用寄存器组0,??是否与主程序有冲突
{ unsigned int i; // 不用寄存器组0的话,RW24XX不能正常读写时钟
uchar j; //,Mlen;
uchar fun;
//uchar Tem_lei;
uchar sum;
// uchar *Poit;
//uchar Tem_nuff[32];
fun=0;
if( Xin_F76_RX_B==1)
{
//Wait(250);
Xin_F76_RX_B=0;
i=F76_RX_Buff[1];
i=i+2;
sum=0;
//goto dddd;
for(j=0;j<i;j++)
{
sum=sum+F76_RX_Buff[j]; // 求代数和
}
if(sum==F76_RX_Buff[i]&&F76_RX_Buff[i+1]==0xab) //校验和等且最后的字节为0XAB
{
switch (F76_RX_Buff[0])
{
case 0: //接收到error ***********************************************************************
break;
case 1: //接收到OK ***********************************************************************
break;
case 2: //***********************************************************
break;
case 3: //**********************************************************
break;
case 4: //********************************************************
break;
case 5: //************* 查询所返回数据:Byte2 Byte1 Byte0*******************************************
Ying_da_ok(5);
break;
case 6: //接收警情的功能码子程序************************************************************
break;
//状态上传
// 10:发生 车辆熄火
//11:发生 车辆点火
case 7: //***********************************
break;
//车辆的当前状态(布防,撤防, 修车)变化上传送
case 8: //***********************************
break;
case 16: //***********************************
Ying_da_ok(16);
break;
case 17: //********************************
Ying_da_ok(17);
break;
case 18: //****************************
break;
default: ;
break;
} // switch (GPRS_F76_RX_Buff[0]) de
} //if de
else {
Ying_da_error(F76_RX_Buff[0]);
}
}
}
*/
//=====================================================================================
//------以上是对上位机的485命令进行处理------------------------------
//=====================================================================================
/**********************************************************************
**函数原型: void Ying_da_error(uchar)
**入口参数: 485的功能码uchar fun
**出口参数: 无
**返 回 值: 无
**说 明: 485应答出错信息的子程序。
************************************************************************/
void Ying_da_error(uchar fun)
{
//========== get fa 232 right=============================
while(F76_TX_is_over_B==0) { //TX所完标志位,没发完再发时要等待
os_wait2(K_TMO, 25); //50ms
}
F76_TX_is_over_B=0; //抢到标志,处暑、延时100MS再发, 串间隔
os_wait2(K_TMO, 5); //10ms
//==========get fa 232 right=============================
Fa_F76_buffer(0,&fun,1);
}
//===============================================================================
/**********************************************************************
**函数原型: void Ying_da_ok(uchar fun)
**入口参数: 485的功能码uchar fun
**出口参数: 无
**返 回 值: 无
**说 明: 485应答正确信息的子程序。
************************************************************************/
void Ying_da_ok(uchar fun)
{
//========== get fa 232 right=============================
while(F76_TX_is_over_B==0) { //TX所完标志位,没发完再发时要等待
os_wait2(K_TMO, 25); //50ms
}
F76_TX_is_over_B=0; //抢到标志,处暑、延时100MS再发, 串间隔
os_wait2(K_TMO, 5); //10ms
//==========get fa 232 right=============================
Fa_F76_buffer(1,&fun,1);
}
//===============================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -