聚丰项目 > 自动灌溉
农业是用水大户,近年来农业用水量约占经济社会用水总量的62%,部分地区高达90%以上,农业用水效率不高,节水潜力很大。大力发展农业节水,在农业用水量基本稳定的同时扩大灌溉面积、提高灌溉保证率,是促进水资源可持续利用、保障国家粮食安全、加快转变经济发展方式的重要举措。 我们开发的自动灌溉可以有效解决目前的问题。
zhaobolove
分享zhaobolove
团队成员
赵波 工程师
自动灌溉系统由控制器、泵房触摸屏、团部信息中心、云端服务组成。
控制器作为系统核心设置泵房,由触摸屏对其状态进行监控。同时系统设置有无线GPRS网络,供应急使用。
团部信息中心与泵房连接通过以太网的方式连接,查看控制器数据、视频信息等。z
这里的控制器 是 :开发板 NUCLEO-F401RE
本项目中, 控制器的开发 ,是重点
软件采用:
mbed. 在线编译器
网址 https://www.mbed.com/en/platform/cloud/#
进入 后,点击 开发, 然后选择开发板
部分代码如下:
/*********************************************************************************/
//宏定义
/*********************************************************************************/
int xdata ModDI ;//0-16
int xdata ModDO ;
char xdata Read[45][2];
char xdata Hold[178][2];
sbit P3_2=P3^2;
/*---------------------------------------------------------------------------
调用方式:定时器0
函数说明: 1ms
---------------------------------------------------------------------------*/
void InitTimer0()
{
TMOD=TMOD&0xF0;
TMOD |= 0x01;//F8CD =1000@22.1184
TL0 = 0xCD ;//1085ns= FC18@11.0592 1000ns=FC18@12M
TH0 = 0xF8;
TR0 = 1;
ET0 =1 ; // 定时器0中断
}
/*---------------------------------------------------------------------------
调用方式:串口1
函数说明:串口初始化,不倍速0xFD波特率9600 @11.0592 or 19200 @22.1184
0xFA波特率9600 @22.1184
---------------------------------------------------------------------------*/
void initUart1(void)
{
SCON=0x50;//PCON &= 0x7F;//波特率不倍速
TMOD=TMOD&0x0f;
TMOD=TMOD|0x20;
TH1=0xFA;
TL1=0xFA;
TR1=1;
ES=1;
}
void SendByte1( char cSend)
{
SBUF=cSend;
while(!TI);
TI = 0; //发送, 当发送完毕硬件置1.
}
void SendStr1(char *pStr,unsigned char len)
{
unsigned char i=0;
unsigned char j=1;
/*do{
SendByte1(pStr[i++]);
while(j++);
}while(i<len); */
for(i=0;i<len;i++) //
{
SendByte1(pStr[i]); //发送当前字符
while(j++);//51单片机12M晶振,1us*255=2.6ms
}
}
/*---------------------------------------------------------------------------
调用方式:串口1
函数说明:串口初始化,不倍速0xFD波特率9600 @11.0592 19200 @22.1184
---------------------------------------------------------------------------*/
void initUart2(void)
{
S2CON = 0x50; //串口2工作在方式1 10位异步收发 S2REN=1允许接收
BRT = 0xFA; //独立波特率发生器初值 高4位 0:T0 12T 0:T1 12T 0:串口0 12T 1:允许独立波特率运行
AUXR = 0x10; //BRTR=1 独立波特率发生器开始计数 低4位,0:不倍频 0:12T 0:使用1KRAM 0:串口1选T1产生波特率
IE2 =0x01;//开串口2中断 ES2=1
}
void SendByte2(char dat)
{
S2BUF =dat; //写数据到UART2数据寄存器
while(!(S2CON&S2TI)); //若S2TI=0,在此等待
S2CON&=~S2TI; //S2TI=0
}
void SendStr2(char str[], unsigned char n)
{
unsigned char i=0;
unsigned char j=1;
if(n<25)
for(i=0;i<n;i++) //检测字符串结束标志
{
SendByte2(str[i]); //发送当前字符
while(j++);//51单片机12M晶振,1us*255=2.6ms
}
}
/*-------------------------------------------------------------------
软件延时
--------------------------------------------------------------------*/
void InitADC()
{
unsigned int i=5000;
P1ASF = 0xF0; //设置P1口为AD口 0x14=P1.2,1.4位AD
ADC_RES = 0; //清除结果寄存器
ADC_CONTR =ADC_POWER | ADC_SPEEDLL; //打开ADC电源 转换周期540
while(i--); //ADC上电并延时
}
unsigned char GetADCResult(unsigned char ch)
{
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
_nop_(); //等待4个NOP
_nop_();
_nop_();
_nop_();
_nop_(); //等待4个NOP
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR & ADC_FLAG));//等待ADC转换完成
ADC_CONTR &= ~ADC_FLAG; //Close ADC
//return ADC_RES;
return (ADC_RES <<2 + ADC_LOW2); //返回ADC结果
//return (ADC_RES*4 + ADC_LOW2);
} //float( ADC )*4.85/1024 , 4.85为电源电源即参考电压
// float (ADC) * 2.5/ ADCref, ADCref为2.5V的参考电压读数 串330-470电阻TL431
unsigned int ADCbufA[7];
unsigned int ADCbufB[7];
unsigned int ADCbufC[7];
unsigned int ADCbufD[7];
unsigned int readADC(unsigned char ch,unsigned int Buf[])
{
char i,j,N=7;
unsigned int temp;
for(i=0;i<6;i++)//后面的数据依次向前推。最前的数据丢掉。
Buf[i]=Buf[i+1];
Buf[6]= GetADCResult(ch) <<2 + ADC_LOW2; //把最新的数据放最后
for (j=0;j<N-1;j++) //重新排序
{
for (i=0;i<N-j;i++)
{
if ( Buf[i]>Buf[i+1] )
{
temp = Buf[i];
Buf[i] = Buf[i+1];
Buf[i+1] = temp;
}
}
}
temp=0;
for(i=1;i<(N-1);i++) //去掉最小,最大值,求和
{
temp = temp + Buf[i];
}
return temp/5; //求平均
}
/*********************************************************************************/
//变量定义
/*********************************************************************************/
bit bDoAuto ;
bit bConfirm ;
bit bManStop;
bit bBKAuto ;
bit bBKChange ;
bit bBKNG ;
bit bBKDoing ;
sbit DO_Fa = P0^0;
sbit DO_Pump = P0^1;
sbit DO_2 = P0^2;
sbit DO_3 = P0^3;
sbit DI_0 = P0^4;
sbit DI_1 = P0^5;
sbit DI_2 = P0^6;
sbit DI_3 = P0^7;
bit flagA=0;
bit flagB=0;
bit bSend=0;
bit err=0;
bit bStandby=1;
bit bTimeUp=0;//手动定时时间关
bit bStop=0;// 手动停止
unsigned char rx_countA=0;
unsigned char rx_countB=0;
char xdata RxBufA[100];
char RxBufB[5];
char xdata ModBK [100];
char TxCom [8];
unsigned int timeoutA =0;
unsigned int timeoutB =0;
unsigned int oneSecond =0;
unsigned int nTimeUp=0;
unsigned char ChangeDelay=0;
unsigned char DecodeAddr=1;
unsigned char nStopDelay=0;
union var
{
char c[6];
unsigned long i;
}p;
struct node
{
int X00:1; //位段a,占4位
int X01:1;
int X02:1;
int X03:1;
int X04:1;
int X05:1; //位段a,占4位
int X06:1;
int X07:1;
int X10:1; //位段a,占4位
int X11:1;
int X12:1;
int X13:1;
int X14:1;
int X15:1; //位段a,占4位
int X16:1;
int X17:1;
};
union varnode
{
struct node D;
int Mod;
}DI,DO;
void update()
{
// ModDI= (char)DI_3<<7 | (char)DI_2<<6 | (char)DI_1<<5 | (char)DI_0 <<4 |(char)bBKDoing<<3 | (char)bBKNG<<2 |(char)bBKChange << 1 | (char)bBKAuto ; ;;
// ModDO= (char)!DO_3<<7 | (char)!DO_2<<6 | (char)!DO_Pump<<5 | (char)!DO_Fa <<4 |(char)bBKDoing<<3 | (char)bBKNG<<2 |(char)bBKChange << 1 | (char)bBKAuto ; ;;
DI.D.X00= bBKAuto;
DI.D.X01= bBKChange;
DI.D.X02= bBKNG;
DI.D.X03= bBKDoing;
DI.D.X04= DI_0;
DI.D.X05= DI_1;
DI.D.X06= DI_2;
DI.D.X07= DI_3;
ModDI=DI.Mod;
DO.D.X00= bDoAuto;//手自动
DO.D.X01=bConfirm;//确认
DO.D.X02=bManStop;//手动停
//DO.D.X03=buf[4]!=0?1:0;
DO.D.X04=!DO_Fa; //DO -00
DO.D.X05=!DO_Pump; //DO-01
ModDO=DO.Mod;
}
void sendGroup()
{
TxCom[0]= 06 ;// Group:06 32 N1 N2 N3 N4 0x0d先发高位后发低位
TxCom[1] = Hold[3][0] ;
TxCom[2] = Hold[3][1] ;
TxCom[3] = Hold[4][0] ;
TxCom[4] = Hold[4][1] ;
TxCom[5] = Hold[5][0] ;
TxCom[6] = Hold[5][1] ;
SendStr2(TxCom,7);
bSend=1;
}
void sendCheck(char addr ,char cmd)
{
TxCom[0]= 02 ;// Group:06 32 N1 N2 N3 N4 0x0d先发高位后发低位
TxCom[1]= addr ;
switch(cmd)
{
case 1: // read status
TxCom[2]= 0x15 ;
break;
case 2: // ctrol On
TxCom[2]= 0x11 ;
break;
case 3: // ctrol Off
TxCom[2]= 0x22 ;
break;
case 4: // Reset
TxCom[2]= 0x77 ;
break;
}
SendStr2(TxCom,3);
bSend=1;
}
void ManStop(unsigned int i)
{
DO_Pump=DO_OFF;
if(bStop==0)nStopDelay =0;
bStop=1;
if(nStopDelay >= i)
{
bConfirm=0;
p.i=0 ;
sendGroup();
nStopDelay =0;
bManStop=0;
bTimeUp=0;
nTimeUp=0;
}
}
//#define GetBitH(dat,i) ((dat&((int)1<<i)) 1:0)
//#define SetBitH(dat,i) ((dat)|=((int)1<<(i)))
//#define ClearBitH(dat,i) ((dat)&=(~((int)0x01<<(i))))
//int a = 127; bit_set(&a,8,1);
// position是指定位(取值范围为1~48);flag表示置0还是置1操作
void SetBit( unsigned char position, bit flag)
{
unsigned long a = _lrol_(1,position-1);// 1<<(position-1);
if (flag)
p.i |= a;
else
p.i &= ~a;
Read[20][0]=p.c[0];
Read[20][1]=p.c[1];
Read[21][0]=p.c[2];
Read[21][1]=p.c[3];
Read[22][0]=p.c[4];
Read[22][1]=p.c[5];
}
void SetBitNG( unsigned char position, bit flag)
{
unsigned long a = _lrol_(1,position-1);// 1<<(position-1);
if (flag)
p.i |= a;
else
p.i &= ~a;
Read[23][0]=p.c[0];
Read[23][1]=p.c[1];
Read[24][0]=p.c[2];
Read[24][1]=p.c[3];
Read[25][0]=p.c[4];
Read[25][1]=p.c[5];
}
/*
bit GetBit(unsigned char position)//1-48
{
unsigned long a = _lrol_(1,position-1);
if(p.i&a==0x1)
return 1;
return 0;
} */
/*---------------------------------------------------------------------------
函数说明:CRC 高位字节值表
---------------------------------------------------------------------------*/
static unsigned char code Cal_CRC_Hi[] = {
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
} ;
/*---------------------------------------------------------------------------
函数说明:CRC低位字节值表
---------------------------------------------------------------------------*/
static unsigned char code Cal_CRC_Lo[] = {
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,
0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,
0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,
0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,
0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,
0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,
0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,
0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,
0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,
0x43, 0x83, 0x41, 0x81, 0x80, 0x40
};
unsigned int CRC_chek(unsigned char *puchMsg, unsigned char usDataLen)
{
unsigned char uchCRCHi = 0xFF ; // 高CRC字节初始化
unsigned char uchCRCLo = 0xFF ; // 低CRC 字节初始化
unsigned int uIndex ; // CRC循环中的索引
while (usDataLen--) // 传输消息缓冲区
{
uIndex = uchCRCHi ^ *puchMsg++ ; // 计算CRC
uchCRCHi = uchCRCLo ^ Cal_CRC_Hi[uIndex] ;
uchCRCLo = Cal_CRC_Lo[uIndex] ;
}
// uchCRCHi=1;
//uchCRCLo=2;
return (((unsigned int)(uchCRCLo) << 8) | uchCRCHi) ;
//return (uchCRCHi << 8 | uchCRCLo) ;
}
void ProcessModbus(char buf[],count)
{
char i;
unsigned int temp;
char addr,len;
//int crcData=buf[count]*256 + buf[count-1];
// if(crcData==CRC_chek(buf,count) && buf[0]==0x01 )
addr=buf[3];
if( buf[0]==0x01 )
{
switch(buf[1])
{
case 0x01: // 读 数字输出
ModBK[0]=0x01; //buf[0]
ModBK[1]=0x01; //buf[1] buf[2,3]=RegAddr
ModBK[2]=0x01;
ModBK[3]=ModDO ;
temp=CRC_chek(ModBK,4);
ModBK[5]=(char)(temp%256);
ModBK[6]=(char)temp/256;
SendStr1(ModBK,6);
break;
case 0x02: // 读 数字输入
ModBK[0]=0x01; //buf[0]
ModBK[1]=0x01; //buf[1] buf[2,3]=RegAddr
ModBK[2]=0x01;
ModBK[3]=ModDI ;
temp=CRC_chek(ModBK,4);
ModBK[5]=(char)(temp%256);
ModBK[6]=(char)temp/256;
SendStr1(ModBK,6);
break;
case 0x05: // 写 数字输输出
switch(buf[3])
{
case 0:
bDoAuto=DO.D.X00= buf[4]!=0?1:0;//手自动
break;
case 1:
bConfirm=DO.D.X01=buf[4]!=0?1:0;//确认
break;
case 2:
bManStop=DO.D.X02=buf[4]!=0?1:0;//手动停
break;
case 3:
DO.D.X03=buf[4]!=0?1:0;
break;
case 4:
DO_Fa=DO.D.X04=buf[4]!=0?1:0; //DO -00
break;
case 5:
DO_Pump=DO.D.X05=buf[4]!=0?1:0; //DO-01
break;
case 6:
DO.D.X06=buf[4]!=0?1:0;
break;
case 7:
DO.D.X07=buf[4]!=0?1:0;
break;
}
SendStr1(buf, count+1);
break;
case 0x03://读 多个Hold
ModBK[0]=0x01; //buf[0]
ModBK[1]=0x03; //buf[1] buf[2,3]=RegAddr
len= buf[5];
ModBK[2]=len*2;
for(i=0;i<len;i++)
{
ModBK[3+2*i]=Hold[addr][1]; //第一个字节存放高位值 //电流[16]L,[17]H
ModBK[4+2*i]=Hold[addr][0]; //第二个字节存放地位值
addr++;
}
temp=CRC_chek(ModBK,2*len+3);
ModBK[3+2*len]=(char)(temp%256);
ModBK[4+2*len]=(char)temp/256;
SendStr1(ModBK,2*len+5);
break;
case 0x06: //写一个 Hold 返回相同
Hold[buf[3]][1]=buf[4];
Hold[buf[3]][0]=buf[5];
SendStr1(buf, count+1);
break;
case 0x10://写多个 hold
ModBK[0]=0x01; //buf[0]
ModBK[1]=0x10; //buf[1] buf[2,3]=RegAddr
ModBK[2]=buf[2] ;
ModBK[3]=buf[3];
ModBK[4]=buf[4];
ModBK[5]=buf[5];
for(i=0;i<buf[5];i++)
{
Hold[buf[3]][1] =buf[7+2*i];
Hold[buf[3]++][0]=buf[8+2*i];
}
temp=CRC_chek(ModBK,6);
ModBK[6]=(char)(temp%256);
ModBK[7]=(char)temp/256;
SendStr1(ModBK,8);
break;
case 0x04: //读 多个Read
ModBK[0]=0x01; //buf[0]
ModBK[1]=0x04; //buf[1] buf[2,3]=RegAddr
ModBK[2]=buf[5]*2;
for(i=0;i<buf[5];i++)
{
ModBK[3+2*i]=Read[buf[3]][1]; //第一个字节存放高位值 //电流[16]L,[17]H
ModBK[4+2*i]=Read[buf[3]++][0]; //第二个字节存放地位值
}
temp=CRC_chek(ModBK,2*buf[5]+3);
ModBK[3+2*buf[5]]=(char)(temp%256);
ModBK[4+2*buf[5]]=(char)temp/256;
SendStr1(ModBK,2*buf[5]+5);
break;
}
P3_2=1;
}
else
P3_2=0;
}
/*********************************************************************************/
// 主函数
/*********************************************************************************/
void main(void)
{
InitTimer0();
initUart1();
initUart2();
InitADC();
EA=1;
P0M1= 0xFF; // 1111,1111 高4位设置10. 高阻输入
P0M0=0x0F;//0000,1111 低4位设置11,开漏输出,
P0=0x0F;//低4位 输出为1,经过8550,不吸合。
while(1)
{
if( DI_0 || DI_1) //压力,变频器异常停泵 报警
{
bBKNG=1;
DO_Pump=DO_OFF;
bBKDoing=0;
}
if( bBKNG==0)
{
if(bDoAuto )//自动模式
{
bBKAuto =1;
bBKChange=1;
bManStop=0;
DO_Fa=DO_ON; //出水阀
DO_Pump=DO_OFF;//泵
Read[2][0] =ChangeDelay;
if(ChangeDelay >=6 && bBKChange )
{
ChangeDelay=0;
bBKChange=0;
}
if(bConfirm)//确定 bConfirm设为1bConfirm
{
//开始根据设置的逻辑进行灌溉; ----------------------------------------------------------
bStandby=1;
if(ChangeDelay >=10 && DO_Pump==0 )
{
ChangeDelay=0;
DO_Pump=DO_ON;
bBKDoing=1;
bStandby=1;
flagB=1;
}
}
else ///重新设置 bConfirm设为0
{
DO_Pump=DO_OFF;
bBKDoing=0;
bStandby=0;
flagB=0;
}
}
else //手动模式
{
bBKAuto =0;
bBKChange=1;
DO_Fa=DO_ON; //出水阀
DO_Pump=DO_OFF;//泵
Read[2][0] =ChangeDelay;
if(ChangeDelay >=6 && bBKChange )
{
ChangeDelay=0;
bBKChange=0;
}
if(bConfirm) //确定 bConfirm设为1
{
sendGroup(); //执行手动的泵
if(ChangeDelay >=10 && DO_Pump==0 )
{
ChangeDelay=0;
DO_Pump=DO_ON;
bBKDoing=1;
bStandby=0;
bStop=0;
flagB=1;
bStandby=1;
}
}
else////重新设置 bConfirm设为0
{
DO_Pump=DO_OFF;
bBKDoing=0;
bStandby=0;
flagB=0;
}
switch(Hold[2][0])//手动停止方式
{
case 0:// 人工按停止
if(bManStop)
{
ManStop(10);
}
break;
case 1://定时到停止
if(bBKDoing)
{
bTimeUp=1;
if(nTimeUp >= ( Hold[6][1]<<8 + Hold[6][0] ))
{
ManStop(10);
}
}
break;
case 2://水量到停止
/* if( >= ( Hold[6][1]<<8 + Hold[6][0] ))
{
DO_Pump=DO_OFF;
}
*/
if(bBKDoing)
// if( Read[nHumidity][1]<<8+Read[nHumidity][0] >= ( Hold[6][1]<<8 + Hold[6][0] ))
{
ManStop(30);
}
break;
case 3://湿度到停止
if(bBKDoing)
// if( Read[nHumidity][1]<<8+Read[nHumidity][0] >= ( Hold[6][1]<<8 + Hold[6][0] ))
{
ManStop(30);
}
break;
}
}
}
if(flagA)
{
// 处理modbus
//SendStr1(RxBufA,rx_countA);
ProcessModbus(RxBufA,rx_countA-1);
bDoAuto =Hold[1][0]^0;
bConfirm=Hold[1][0]^1;
bManStop=Hold[1][0]^2;
bConfirm=Hold[1][0]^3;
rx_countA=0;
timeoutA =0;
flagA=0;
}
if(flagB || err)
{
if(bStandby )
{
if(err)
{
err=0;
//NG 写入
SetBitNG( DecodeAddr, 1) ;
}
else if( DecodeAddr==RxBufB[1])
{
//OK 写入 ,ONOFF写入RxBufB
SetBit(DecodeAddr,(bit)(RxBufB[2]&0x1));
<