⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 arithmetic.lst

📁 开发的一个温控仪完整代码
💻 LST
📖 第 1 页 / 共 2 页
字号:
 147   1              if(AdmitFlag==1)
 148   1              {
 149   2                      LedH(Temperature);
 150   2                      DPA();
 151   2                      LedL(Setted_Temperature);
 152   2                      DPB();
 153   2              }
 154   1      
 155   1      ///控制算法
 156   1              //PidOutput范围-100~0~+100,每次趋于0
 157   1              if(MeterSta!=STA_MAN)
 158   1              {//---------------在此添加控制算法----------------
 159   2      /////////////////////Bang-Bang-->Fuzzy-->Pid/////////////////
 160   2                      if((Error>-DeathZone)&&(Error<DeathZone))
 161   2                      {//死区控制:默认0.5
 162   3                              CtrlSta=RL_PID;
 163   3                              Output=0;
 164   3                      }
 165   2                      else if((Error>-LineC)&&(Error<LineC))          
 166   2                      {//Pid control
 167   3                              CtrlSta=RL_PID;
 168   3                              if(IdTimeCnt==0)
 169   3                                      x1=fK1*(LastTemperature-Temperature)+fK2*Error
 170   3                                              +fK3*(2*LastTemperature-Temperature-PreTemperature);
 171   3                              else
 172   3                                      x1=fK1*(FastLastTemperature-Temperature);
 173   3                              if(x1>100)
 174   3                                      x1=100;
 175   3                              if(x1<-100)
 176   3                                      x1=-100;
 177   3                              Output=x1;
 178   3                      }
 179   2                      //Fuzzy control
C51 COMPILER V7.50   ARITHMETIC                                                            03/06/2007 20:40:54 PAGE 4   

 180   2                      else if((Error>LineC)&&(Error<LineA)&&(IdTimeCnt==0))//升温区5s/sample
 181   2                      {
 182   3                              switch(CtrlSta)
 183   3                              {
 184   4                                      //急升温部分
 185   4                                      case NR_FAST://反向关闸门
 186   4                                              k0=Read(EP_oH);
 187   4                                              CloseOpenTimeCnt=-k0;//kf:uchar<--uint
 188   4                                              CtrlSta=NR_WAITING;
 189   4                                              WaitingCnt=0;
 190   4                                              break;
 191   4                                      case NR_WAITING://等候平温
 192   4                                              if(dError>0)//降温则退出等待
 193   4                                              {
 194   5                                                      CtrlSta=NR_FUZZY;
 195   5                                                      CloseOpenTimeCnt=0;
 196   5                                              }
 197   4                                              else if(dError==0)
 198   4                                              {
 199   5                                                      WaitingCnt++;
 200   5                                                      if(WaitingCnt>=5)//25s不变则为停止
 201   5                                                      {
 202   6                                                              CtrlSta=NR_FUZZY;
 203   6                                                              CloseOpenTimeCnt=0;
 204   6                                                      }
 205   5                                              }
 206   4                                              else
 207   4                                                      WaitingCnt=0;
 208   4                                              break;
 209   4                                      case RL_PID://pid失控
 210   4                                      case NR_FUZZY://慢速逼进
 211   4                                              if(Error>LineB)
 212   4                                                      k0=0;
 213   4                                              else
 214   4                                                      k0=1;
 215   4                                      //      LedBuf[0]=LedCode[k0];
 216   4      
 217   4                                              if(dError<NBP)//
 218   4                                                      k1=0;//NB
 219   4                                              else if(dError<NSP)
 220   4                                                      k1=1;//NS
 221   4                                              else if(dError<ZP)
 222   4                                                      k1=2;//ZZ
 223   4                                              else if(dError<PSP)
 224   4                                                      k1=3;//PS
 225   4                                              else
 226   4                                                      k1=4;//PB
 227   4                                      //      LedBuf[1]=LedCode[k1];
 228   4                                              Output=FuzzyRule[k1][k0];
 229   4                                              break;
 230   4                                      default:
 231   4                                              CtrlSta=NR_FUZZY;
 232   4                              }
 233   3                      }
 234   2                      else if((Error>-LineD)&&(Error<-LineC)&&(IdTimeCnt==0))//降温缓冲5s/sample
 235   2                      {//Fuzzy control
 236   3                              switch(CtrlSta)
 237   3                              {
 238   4                                      //降温部分
 239   4                                      case NL_FAST://闸门已经关了
 240   4                                              CtrlSta=NL_FUZZY;
 241   4                                              WaitingCnt=0;
C51 COMPILER V7.50   ARITHMETIC                                                            03/06/2007 20:40:54 PAGE 5   

 242   4                                              break;
 243   4                                      case RL_PID:
 244   4                                      case NL_FUZZY://逼进
 245   4                                              if(dError<NBP)//
 246   4                                                      k1=0;//NB
 247   4                                              else if(dError<NSP)
 248   4                                                      k1=1;//NS
 249   4                                              else if(dError<ZP)
 250   4                                                      k1=2;//ZZ
 251   4                                              else if(dError<PSP)
 252   4                                                      k1=3;//PS
 253   4                                              else
 254   4                                                      k1=4;//PB
 255   4      
 256   4                                              Output=FuzzyRule[k1][2];
 257   4                                              break;
 258   4                                      default:
 259   4                                              CtrlSta=NL_FUZZY;
 260   4                              }
 261   3                      }
 262   2                      //Bang-Bang control
 263   2                      else if(Error>LineA)
 264   2                      {
 265   3                              CtrlSta=NR_FAST;
 266   3                              Output=100;//全速加温
 267   3                      }
 268   2                      else if(Error<-LineA)
 269   2                      {
 270   3                              CtrlSta=NL_FAST;
 271   3                              Output=-100;//全速降温
 272   3                      }
 273   2              }
 274   1      //-----------------控制算法结束------------------
 275   1      //报警检查
 276   1              if((Temperature>UpperLimit)||(Temperature<LowerLimit))
 277   1              {
 278   2                      ALM_ON();
 279   2                      ALM_OUT=0;//警报接通
 280   2              }
 281   1              else
 282   1              {
 283   2                      ALM_OFF();
 284   2                      ALM_OUT=1;//警报停止
 285   2              }
 286   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1984    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -