
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;
}
}
