مقدمه
این راهنما نحوه استفاده از حلقههای `while` را با توابع مختلف تعریف شده در کتابخانه ESP توضیح میدهد
۱. حلقههای while با ورودیهای دیجیتال
۱.۱ انتظار برای فعال شدن ورودی
۱.۲ انتظار برای غیرفعال شدن ورودی
۱.۳ انتظار برای تغییر وضعیت ورودی
۱.۴ انتظار برای لبه صعودی (Rising Edge)
۱.۵ انتظار برای لبه نزولی (Falling Edge)
۲. حلقههای while با خروجیهای دیجیتال
۲.۱ انتظار برای فعال شدن خروجی
۲.۲ انتظار برای غیرفعال شدن خروجی
۲.۳ انتظار برای تغییر وضعیت خروجی
۳. حلقههای while با رلههای داخلی (M)
۳.۱ انتظار برای فعال شدن رله داخلی
// فعال شود M100 انتظار تا زمانی که رله
while (!M[100].Value) {
espRun();
HAL_Delay(10);
}
۳.۲ انتظار برای غیرفعال شدن رله داخلی
// غیرفعال شود M101 انتظار تا زمانی که رله
while (M[101].Value) {
espRun();
HAL_Delay(10);
} ۳.۳ انتظار برای لبه صعودی رله
//M102 انتظار برای لبه صعودی رله
while (!M[102].Rising) {
espRun();
HAL_Delay(10);
}
۴. حلقههای while با تایمرها
۴.۱ انتظار برای اتمام تایمر
// تمام شود T[0] انتظار تا زمانی که تایمر
while (!T[0].Q) {
espRun();
HAL_Delay(10);
}
۴.۲ انتظار برای شروع تایمر
// شروع شود T[1] انتظار تا زمانی که تایمر
while (T[1].Q) {
espRun();
HAL_Delay(10);
}
۴.۳ انتظار برای زمان مشخص
// انتظار برای ۵ ثانیه
uint32_t startTime = espGetTimerTicks();
while ((espGetTimerTicks() - startTime) < 500) { // 500 * 10ms = 5s
espRun();
HAL_Delay(10);
}
۵. حلقههای while با پالسهای ساعت
۵.۱ انتظار برای پالس ۰.۱ ثانیه
۵.۲ انتظار برای پالس ۱ ثانیه
۵.۳ انتظار برای پالس ۱ دقیقه
۶. حلقههای while با ارتباطات سریال
۶.۱ انتظار برای دریافت داده از COM1
//COM1 انتظار برای دریافت داده از
while (!COM1_Request_In) {
espRun();
HAL_Delay(10);
}
۶.۲ انتظار برای اتمام ارسال به COM2
//COM2 انتظار برای اتمام ارسال به
while (COM2_RequestOut) {
espRun();
HAL_Delay(10);
}
۶.۳ انتظار برای اتمام کار ارتباطی
//COM1 انتظار برای اتمام کار
while (!COM1_JobFinished) {
espRun();
HAL_Delay(10);
}
۷. حلقههای while با Modbus
۷.۱ انتظار برای اتمام خواندن Modbus
// Modbus انتظار برای اتمام خواندن داده
while (!modbusData.coils[0]) { // انتظار برای تغییر coil 0
espRun();
HAL_Delay(10);
}
۷.۲ انتظار برای مقدار مشخص در رجیستر
// holding 0 انتظار برای مقدار ۱۰۰ در رجیستر
while (modbusData.holding_registers[0] != 100) {
espRun();
HAL_Delay(10);
}
۸. حلقههای while با نمایشگر
۸.۱ انتظار برای اتمام بهروزرسانی نمایشگر
// انتظار برای اتمام بهروزرسانی نمایشگر
uint32_t displayStart = HAL_GetTick();
while ((HAL_GetTick() - displayStart) < 100) {
espRun();
HAL_Delay(10);
}
Display_UpdateScreen();
۹. حلقههای while ترکیبی
۹.۱ انتظار برای چندین شرط همزمان
۹.۲ انتظار برای فعال شدن خروجی و تایمر
۱۰. نکات مهم و بهترین شیوهها
۱۰.۱ جلوگیری از حلقه بینهایت
۱۰.۲ استفاده از تاخیر مناسب
// همیشه از تاخیر مناسب استفاده کنید تا سی پی یو بیش از حد بار نشود
while (condition) {
espRun();
HAL_Delay(10); // تاخیر ۱۰ میلیثانیه
}
۱۰.۳ بررسی وضعیت سیستم
۱۱. مثالهای کاربردی
۱۱.۱ کنترل ساده موتور
۱۱.۲ کنترل توالی عملیات
۱۱.۳ کنترل با تایمر
۱۲. خلاصه
`while` در ESP-0806-DL برای:
- انتظار برای تغییر وضعیت ورودیها
- انتظار برای تغییر وضعیت خروجیها
- انتظار برای اتمام تایمرها
- انتظار برای پالسهای ساعت
- انتظار برای اتمام عملیات ارتباطی
- کنترل توالی عملیات
نکات کلیدی
1. همیشه از `espRun()` در حلقه استفاده کنید
2. از تاخیر مناسب (`HAL_Delay(10)`) استفاده کنید
3. از timeout برای جلوگیری از حلقه بینهایت استفاده کنید
4. وضعیت سیستم را بررسی کنید
5. از توابع مناسب برای هر نوع انتظار استفاده کنید
