المكتبة (كتل الوظائف + الوظائف)
نظرة عامة
مكتبة ForgeIEC هي المجموعة المركزية لكافة الكتل البنائية القابلة لإعادة
الاستخدام التي يمكن لبرنامج التطبيق استدعاؤها من مشروع .forge — وتغطي
كلاً من كتل الوظائف والوظائف القياسية وفق IEC 61131-3 بالإضافة إلى
الامتدادات الخاصة بالمشروع أو الخاصة بـ ForgeIEC.
تُعرض المكتبة في لوحة المكتبة (الإرساء الافتراضي: الشريط الجانبي الأيمن). اضغط F1 أثناء تركيز لوحة المكتبة لفتح هذه الصفحة.
Library
+-- Standard Function Blocks (Bistable, Edge, Counter, Timer, ...)
+-- Standard Functions (Arithmetic, Comparison, Bitwise, ...)
+-- User Library (project-specific blocks)
تتضمن المكتبة حالياً ما يقارب 100 كتلة وما يزيد قليلاً عن 30 وظيفة. كل عنصر يحمل:
- الاسم (مثل
TON،JK_FF) - قائمة الدبابيس (المدخلات + المخرجات مع النوع والموضع)
- النوع (
FUNCTION_BLOCKبحالة، أوFUNCTIONبدون حالة) - الوصف + نص المساعدة مع ملاحظات الاستخدام
- مثال على الكود (مرئي في لوحة مساعدة المكتبة)
شجرة الفئات
كتل الوظائف القياسية
| المجموعة | الكتل |
|---|---|
| ثنائية الاستقرار | SR، RS — تعيين/إعادة تعيين بأولوية |
| اكتشاف الحافة | R_TRIG، F_TRIG — حافة صاعدة/هابطة |
| العدّادات | CTU، CTD، CTUD — العد للأعلى/للأسفل/كلاهما |
| المؤقتات | TON، TOF، TP — تأخير التشغيل/تأخير الإيقاف/نبضة |
| الحركة | المسارات والمنحدرات والمسارات (قيد الإعداد) |
| توليد الإشارات | كتل وظائف لتوليد إشارات الاختبار والتحقق |
| معالجات الوظائف | الإمساك، التثبيت، السجل |
| التحكم بالحلقة المغلقة | PID، الهستيريسيس، التحكم النقطي الثنائي |
| التطبيق (ForgeIEC) | JK_FF، DEBOUNCE — كتل قريبة من التطبيق أثبتت فائدتها العامة عملياً |
الوظائف القياسية
| المجموعة | المحتويات |
|---|---|
| الحساب | ADD، SUB، MUL، DIV، MOD (على أي نوع ANY_NUM) |
| المقارنة | EQ، NE، LT، LE، GT، GE |
| البتات | AND، OR، XOR، NOT (على ANY_BIT — انظر help/st) |
| الإزاحة البتية | SHL، SHR، ROL، ROR |
| الاختيار | SEL، MAX، MIN، LIMIT، MUX |
| العددية | ABS، SQRT، LN، LOG، EXP، SIN، COS، TAN، ASIN، ACOS، ATAN |
| النصوص | LEN، LEFT، RIGHT، MID، CONCAT، INSERT، DELETE، REPLACE، FIND |
| تحويل النوع | BOOL_TO_INT، REAL_TO_DINT، STRING_TO_INT، … |
مكتبة المستخدم
كتل الوظائف والوظائف المعرفة في المشروع — أي شيء يُعلَن كـ
FUNCTION_BLOCK أو FUNCTION يُدرج تلقائياً في هذه الفئة ويمكن
استدعاؤه من أي مكان في المشروع، تماماً مثل الكتل القياسية.
لوحة المكتبة — الاستخدام
| الإجراء | التأثير |
|---|---|
| بحث (العدسة في الأعلى) | يصفّي عرض الشجرة بحسب اسم الكتلة — كتابة to تجد TON. |
| النقر المزدوج على كتلة | يفتح مساعدة الكتلة في جزء تفاصيل: أوصاف الدبابيس + مثال الكود. |
| سحب إلى محرر ST | يُدرج استدعاء الكتلة في موضع المؤشر، بما في ذلك إعلان النسخة في قسم VAR_INST المحلي. |
| النقر بالزر الأيمن > “Insert Call…” | نفس السحب، عبر قائمة السياق. |
| F1 على كتلة | يفتح هذه الصفحة. |
مثال 1 — تنقية ارتداد الزر باستخدام DEBOUNCE
DEBOUNCE يصفّي نبضات الضوضاء القصيرة من تماسات الأزرار الميكانيكية.
لا يتغير Q إلا بعد بقاء IN مستقراً طوال مدة T_Debounce —
على الحافتين الصاعدة والهابطة.
تخطيط الدبابيس
| الدبوس | الاتجاه | النوع | المعنى |
|---|---|---|---|
IN | INPUT | BOOL | الإدخال الخام (عادة %IX، يرتد ميكانيكياً) |
tDebounce | INPUT | TIME | الحد الأدنى لزمن الاستقرار (عادة T#10ms…T#50ms) |
Q | OUTPUT | BOOL | الإخراج بعد التنقية |
مثال على الكود
جسم PROGRAM يقوم بتنقية ارتداد زر ضغط على %IX0.0 ويحوّل
الإشارة المنقاة كحافة لمرة واحدة إلى مرحل ذاتي الإمساك:
PROGRAM PLC_PRG
VAR
button_raw AT %IX0.0 : BOOL; (* bouncing contact *)
button_clean : BOOL; (* after DEBOUNCE *)
button_pressed : BOOL; (* single-shot per press *)
relay_lamp AT %QX0.0 : BOOL; (* lamp as self-hold *)
fbDeb : DEBOUNCE; (* instance *)
fbTrig : R_TRIG; (* edge detector *)
END_VAR
fbDeb(IN := button_raw, tDebounce := T#20ms);
button_clean := fbDeb.Q;
fbTrig(CLK := button_clean);
button_pressed := fbTrig.Q;
(* Self-hold: toggle on every rising edge *)
IF button_pressed THEN
relay_lamp := NOT relay_lamp;
END_IF;
END_PROGRAM
DEBOUNCE مبني داخلياً من كتلتي TON (في الاتجاهين العالي والمنخفض)
— واحدة تدفع Q إلى TRUE فقط بعد T_Debounce من نشاط IN،
والأخرى تدفعه إلى FALSE فقط بعد T_Debounce من خمول IN.
هذا يجعل المرشّح متماثلاً: لا ارتداد التماس عند الضغط ولا عند التحرير
ينتج خللاً.
ملاحظة: الاستخدامات النموذجية: أزرار الضغط الميكانيكية، مفاتيح الحدود، المستشعرات التماسية. للحصول على “نبضة واحدة لكل ضغطة” — كما أعلاه — اربط
R_TRIGبعدQ.
مثال 2 — إمساك ذاتي مع تجاوز الوضع (JK_FF)
JK_FF هو فليب فلوب تبديل مدمج معه تنقية ارتداد الزر. عند كل حافة
صاعدة مستقرة لـ xButton يبدّل Q بين TRUE و FALSE — بحيث يصبح
زر الضغط البسيط مفتاح “تشغيل/إيقاف” دون الحاجة لأن يقوم
برنامج التطبيق بربط DEBOUNCE + R_TRIG + منطق التبديل يدوياً.
تخطيط الدبابيس
| الدبوس | الاتجاه | النوع | المعنى |
|---|---|---|---|
xButton | INPUT | BOOL | تماس الزر الخام (مرتد) |
tDebounce | INPUT | TIME | زمن التنقية (عادة T#20ms) |
J | INPUT | BOOL | “تعيين” (يفرض Q إلى TRUE أثناء النشاط) |
K | INPUT | BOOL | “إعادة تعيين” (يفرض Q إلى FALSE أثناء النشاط) |
Q | OUTPUT | BOOL | الحالة الحالية |
Q_N | OUTPUT | BOOL | الحالة المنفية (NOT Q) |
xStable | OUTPUT | BOOL | TRUE أثناء استقرار xButton لمدة tDebounce |
مثال على الكود
تحكم بالمصباح مع ثلاثة أزرار: T1 يبدّل المصباح، T_Mains يفرض
تشغيله (مثلاً “إضاءة رئيسية في كل مكان”)، T_Off يفرض إطفاء كل شيء:
PROGRAM PLC_PRG
VAR
bButtons AT %IX0.0 : ARRAY [0..3] OF BOOL;
relay_lamp AT %QX0.0 : BOOL;
fbToggle : JK_FF;
END_VAR
fbToggle(
xButton := bButtons[0], (* toggle button T1 *)
tDebounce := T#20ms,
J := bButtons[1], (* main light ON while held *)
K := bButtons[2] (* main light OFF while held *)
);
relay_lamp := fbToggle.Q;
END_PROGRAM
جدول الحقيقة لمدخلات J/K:
J | K | السلوك |
|---|---|---|
| FALSE | FALSE | تبديل عند كل ضغطة منقاة |
| TRUE | FALSE | Q := TRUE (تعيين، يتجاوز التبديل) |
| FALSE | TRUE | Q := FALSE (إعادة تعيين، يتجاوز التبديل) |
| TRUE | TRUE | غير محدد — يُتجنّب |
xStable يتيح لك تنفيذ منطق “الزر مضغوط حالياً” (مثلاً LED
يُظهر الضغطة دون انتظار حدوث تأثير التبديل).
مزامنة المكتبة بين المحرر و PLC
تعيش المكتبة القياسية في موضعين:
- جانب المحرر:
editor/resources/library/standard_library.json(مُترجَم داخل الـ.exeعبر نظام موارد Qt). - جانب PLC: الوحدة الفرعية لـ anvild، نفس ملف JSON، يضمها
خطوة
makeعلى مصادر C المرفوعة.
مزامنة المكتبة تقارن SHA-256 لكلا الإصدارين عند الاتصال. عند الانحراف يظهر تلميح في لوحة الإخراج؛ ردة الفعل قابلة للضبط:
Preferences > Library > Auto-Pushمعطّل (افتراضي): دفع يدوي عبرTools > Sync Library. يحمي بيئة تشغيل إنتاجية من الكتابة العرضية من محرر أقدم.Preferences > Library > Auto-Pushمفعّل: الانحراف يُطلق دفعاً تلقائياً. مفيد في إعدادات التطوير بمبرمج واحد.
امتدادات ForgeIEC
الكتل التالية ليست موحّدة في IEC 61131-3 لكنها تأتي ضمن المكتبة القياسية لأن استخدامها أثبت فائدته العامة عملياً:
| الكتلة | الغرض |
|---|---|
JK_FF | فليب فلوب تبديل مع تنقية ارتداد الزر مدمجة (انظر المثال 2). |
DEBOUNCE | تنقية ارتداد الزر المتماثلة (انظر المثال 1). |
تعيش هذه الكتل تحت Standard Function Blocks / Application وتُعلَّم
بـ isStandard: true في مصدر JSON، مما يحدّدها على أنها “غير قابلة
للحذف” (أي لا يمكن إزالتها بطريق الخطأ من لوحة المكتبة).
إضافة كتلك الخاصة إلى مكتبة المستخدم
كل إعلان FUNCTION_BLOCK وFUNCTION في المشروع الحالي يدرج تلقائياً
تحت User Library. توقيت الظهور:
- في لوحة المكتبة: فور إعلان وحفظ POU.
- في مكمّل الكود (Ctrl-Space): فوراً.
- في محرر FBD/LD ككتلة: فوراً.
- على PLC بعد
Compile + Upload.
لإعادة استخدام كتلة عبر المشاريع، صدّر POU عبر
File > Export POU... كملف .forge-pou واستورده في المشروع الهدف
— “مكتبة مساحة عمل” تمتد عبر المشاريع موجودة في قائمة المهام.
مواضيع ذات صلة
- بناء جملة Structured Text — كيف يبدو استدعاء الكتلة في ST.
- محرر مخطط كتل الوظائف — كيف تُربط الكتلة رسومياً.
- لوحة المتغيرات — كيف يرى مجمّع العناوين النسخة.