📄 arithmetic.lst
字号:
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 + -