
ESP-0806
قابل استفاده برای تمامی مدلها
ردر این آموزش با رله های داخلی M و نحوه استفاده از آنها در پیالسی ایرانی ESP-0806 آشنا میشوید.
ساختار رله داخلی M
رله های داخلی در زبان STL با ساختاری بنام Relay تعریف شده اند که دارای عناصر زیر می باشد:
– Value: نشان دهنده مقدار ورودی دیجیتال است که میتواند 0 یا 1 باشد.
– Rising: نشان دهنده لبه بالارونده رله داخلی M است که بمدت یک سیکل اسکن فعال می شود.
– Falling: نشاندهنده لبه پایین رونده رله داخلی M است که بمدت یک سیکل اسکن فعال می شود.
روشهای دسترسی به رله ها
1- دسترسی مستقیم
// تنظیم مستقیم مقدار M[0].Value = 1; // فعال کردن M0 M[1].Value = 0; // غیرفعال کردن M1 // بررسی وضعیت if (M[0].Value) { // M0 فعال است }
2- نامگذاری روی رله های داخلی
در اینحالت ابتدا باید یک اشاره گر با نام مورد نظر از نوع Relay ایجاد کرده و سپس آنرا به رله مورد نظر اختصاص دهیم
// اشارهگرهای رلههای داخلی Relay *systemRunning; // وضعیت اجرای سیستم Relay *motorUpActive; // موتور بالا فعال Relay *motorDownActive; // موتور پایین فعال Relay *emergencyStop; // توقف اضطراری Relay *safetyOK; // شرایط ایمنی Relay *manualMode; // حالت دستی Relay *autoMode; // حالت خودکار Relay *step1Complete; // تکمیل مرحله 1 Relay *step2Complete; // تکمیل مرحله 2 Relay *step3Complete; // تکمیل مرحله 3 Relay *errorDetected; // خطا تشخیص داده شده Relay *maintenanceMode; // حالت تعمیر // مقداردهی اشارهگرها به آدرسهای رلههای داخلی systemRunning = &M[0]; motorUpActive = &M[1]; motorDownActive = &M[2]; emergencyStop = &M[3]; safetyOK = &M[4]; manualMode = &M[5]; autoMode = &M[6]; step1Complete = &M[10]; step2Complete = &M[11]; step3Complete = &M[12]; errorDetected = &M[20]; maintenanceMode = &M[21];
// استفاده از رله های داخلی نامگذاری شده
if (manualMode->Value)
{
//do manual Control
}
else
{
// do Automatic control
}
مزایای استفاده از اشارهگر
- خوانایی: نامهای معنادار به جای شمارههای رله
- نگهداری: تغییر آسان آدرس رلهها
- قابلیت اطمینان: کاهش خطاهای تایپی
- سازماندهی: گروهبندی منطقی رلهها
- قابلیت توسعه: اضافه کردن آسان رلههای جدید
توابع مرتبط با رله های داخلی M
علاوه بر دسترسی مستقیم, برای راحتی هر چه بیشتر یکسری توابع دیگر در کتابخانه STL تعریف شده است که عبارتند از:
– SetRelay
– ResetRelay
تشخیص لبه ها
// تشخیص لبه صعودی (0 به 1) if (M0[0].Rising) { // M0 از 0 به 1 تغییر کرده } // تشخیص لبه نزولی (1 به 0) if (M[0].Falling) { // M0 از 1 به 0 تغییر کرده // بررسی لبه صعودی if (systemRunning->Rising) { // سیستم تازه شروع شده motorUpActive->Value = 0; motorDownActive->Value = 0; } // بررسی لبه نزولی if (emergencyStop->Falling) { // توقف اضطراری برداشته شده safetyOK->Value = 1; }
مثال های کاربردی:
مثال 1: کنترل سیستم بالابر
// تعریف اشارهگرها Relay *elevatorRunning; Relay *doorOpen; Relay *doorClosed; Relay *floorReached; Relay *movingUp; Relay *movingDown; void initializeElevatorSystem() { elevatorRunning = &M[100]; doorOpen = &M[101]; doorClosed = &M[102]; floorReached = &M[103]; movingUp = &M[104]; movingDown = &M[105]; } void elevatorControl() { // شروع سیستم آسانسور if (I0[0].Value && !emergencyStop->Value) { elevatorRunning->Value = 1; } // کنترل درب if (I0[1].Value) { doorOpen->Value = 1; doorClosed->Value = 0; } else { doorOpen->Value = 0; doorClosed->Value = 1; } // کنترل حرکت if (I0[2].Value && doorClosed->Value) { movingUp->Value = 1; movingDown->Value = 0; } else if (I0[3].Value && doorClosed->Value) { movingUp->Value = 0; movingDown->Value = 1; } else { movingUp->Value = 0; movingDown->Value = 0; } // تشخیص رسیدن به طبقه if (I0[4].Value) { floorReached->Value = 1; movingUp->Value = 0; movingDown->Value = 0; } }
مثال2: کنترل خط تولید
// تعریف اشارهگرها Relay *conveyorRunning; Relay *productDetected; Relay *robotWorking; Relay *qualityOK; Relay *rejectProduct; Relay *maintenanceNeeded; void initializeProductionLine() { conveyorRunning = &M[200]; productDetected = &M[201]; robotWorking = &M[202]; qualityOK = &M[203]; rejectProduct = &M[204]; maintenanceNeeded = &M[205]; } void productionControl() { // شروع نوار نقاله if (I0[0].Value && !emergencyStop->Value) { conveyorRunning->Value = 1; } // تشخیص محصول if (I0[1].Value) { productDetected->Value = 1; } else { productDetected->Value = 0; } // کنترل ربات if (productDetected->Value && !robotWorking->Value) { robotWorking->Value = 1; // شروع کار ربات } // بررسی کیفیت if (I0[2].Value) { qualityOK->Value = 1; rejectProduct->Value = 0; } else { qualityOK->Value = 0; rejectProduct->Value = 1; } // تشخیص نیاز به تعمیر if (I0[3].Value) { maintenanceNeeded->Value = 1; conveyorRunning->Value = 0; } }
مثال 3: سیستم هشدار و امنیتی
// تعریف اشارهگرها Relay *fireAlarm; Relay *smokeDetected; Relay *sprinklerActive; Relay *evacuationAlarm; Relay *emergencyLights; Relay *systemNormal; void initializeSafetySystem() { fireAlarm = &M[300]; smokeDetected = &M[301]; sprinklerActive = &M[302]; evacuationAlarm = &M[303]; emergencyLights = &M[304]; systemNormal = &M[305]; } void safetyControl() { // تشخیص دود if (I0[0].Value) { smokeDetected->Value = 1; systemNormal->Value = 0; } else { smokeDetected->Value = 0; } // فعال کردن هشدار آتش if (smokeDetected->Value) { fireAlarm->Value = 1; evacuationAlarm->Value = 1; emergencyLights->Value = 1; } // فعال کردن سیستم آبپاش if (fireAlarm->Value && I0[1].Value) { sprinklerActive->Value = 1; } // بازگشت به حالت عادی if (!smokeDetected->Value && !I0[0].Value && !I0[1].Value) { systemNormal->Value = 1; fireAlarm->Value = 0; evacuationAlarm->Value = 0; emergencyLights->Value = 0; sprinklerActive->Value = 0; } }
مثال 4: کنترل توالی عملیات
// تعریف اشارهگرها Relay *sequenceStart; Relay *step1Active; Relay *step2Active; Relay *step3Active; Relay *sequenceComplete; Relay *sequenceError; void initializeSequenceControl() { sequenceStart = &M[400]; step1Active = &M[401]; step2Active = &M[402]; step3Active = &M[403]; sequenceComplete = &M[404]; sequenceError = &M[405]; } void sequenceControl() { // شروع توالی if (I0[0].Value && !sequenceStart->Value) { sequenceStart->Value = 1; step1Active->Value = 1; } // مرحله 1 if (step1Active->Value) { // انجام عملیات مرحله 1 if (I0[1].Value) { // تکمیل مرحله 1 step1Active->Value = 0; step2Active->Value = 1; } } // مرحله 2 if (step2Active->Value) { // انجام عملیات مرحله 2 if (I0[2].Value) { // تکمیل مرحله 2 step2Active->Value = 0; step3Active->Value = 1; } } // مرحله 3 if (step3Active->Value) { // انجام عملیات مرحله 3 if (I0[3].Value) { // تکمیل مرحله 3 step3Active->Value = 0; sequenceComplete->Value = 1; sequenceStart->Value = 0; } } // تشخیص خطا if (I0[4].Value) { sequenceError->Value = 1; step1Active->Value = 0; step2Active->Value = 0; step3Active->Value = 0; sequenceStart->Value = 0; } }
مثال 5: مثال کامل سیستم کنترل
// تعریف تمام اشارهگرها Relay *systemStatus, *operationMode, *safetyStatus, *errorStatus; Relay *motor1Status, *motor2Status, *sensor1Status, *sensor2Status; void initializeSystem() { // مقداردهی اشارهگرها systemStatus = &M[0]; operationMode = &M[1]; safetyStatus = &M[2]; errorStatus = &M[3]; motor1Status = &M[10]; motor2Status = &M[11]; sensor1Status = &M[20]; sensor2Status = &M[21]; } void mainControlLoop() { // بررسی وضعیت سیستم if (I0[0].Value && !errorStatus->Value) { systemStatus->Value = 1; } else { systemStatus->Value = 0; } // تعیین حالت عملیات if (I0[1].Value) { operationMode->Value = 1; // حالت خودکار } else { operationMode->Value = 0; // حالت دستی } // بررسی ایمنی if (I0[2].Value && I0[3].Value) { safetyStatus->Value = 1; } else { safetyStatus->Value = 0; } // کنترل موتورها if (systemStatus->Value && safetyStatus->Value) { if (operationMode->Value) { // حالت خودکار if (I0[4].Value) { motor1Status->Value = 1; } else { motor1Status->Value = 0; } if (I0[5].Value) { motor2Status->Value = 1; } else { motor2Status->Value = 0; } } else { // حالت دستی if (I0[6].Value) { motor1Status->Value = 1; } if (I0[7].Value) { motor2Status->Value = 1; } } } else { // توقف موتورها motor1Status->Value = 0; motor2Status->Value = 0; } // تشخیص خطا if (!safetyStatus->Value || I0[8].Value) { errorStatus->Value = 1; systemStatus->Value = 0; } }