المكتبة (كتل الوظائف + الوظائف)

نظرة عامة

مكتبة 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 — على الحافتين الصاعدة والهابطة.

تخطيط الدبابيس

الدبوسالاتجاهالنوعالمعنى
ININPUTBOOLالإدخال الخام (عادة %IX، يرتد ميكانيكياً)
tDebounceINPUTTIMEالحد الأدنى لزمن الاستقرار (عادة T#10msT#50ms)
QOUTPUTBOOLالإخراج بعد التنقية

مثال على الكود

جسم 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 + منطق التبديل يدوياً.

تخطيط الدبابيس

الدبوسالاتجاهالنوعالمعنى
xButtonINPUTBOOLتماس الزر الخام (مرتد)
tDebounceINPUTTIMEزمن التنقية (عادة T#20ms)
JINPUTBOOL“تعيين” (يفرض Q إلى TRUE أثناء النشاط)
KINPUTBOOL“إعادة تعيين” (يفرض Q إلى FALSE أثناء النشاط)
QOUTPUTBOOLالحالة الحالية
Q_NOUTPUTBOOLالحالة المنفية (NOT Q)
xStableOUTPUTBOOLTRUE أثناء استقرار 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:

JKالسلوك
FALSEFALSEتبديل عند كل ضغطة منقاة
TRUEFALSEQ := TRUE (تعيين، يتجاوز التبديل)
FALSETRUEQ := FALSE (إعادة تعيين، يتجاوز التبديل)
TRUETRUEغير محدد — يُتجنّب

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. توقيت الظهور:

  1. في لوحة المكتبة: فور إعلان وحفظ POU.
  2. في مكمّل الكود (Ctrl-Space): فوراً.
  3. في محرر FBD/LD ككتلة: فوراً.
  4. على PLC بعد Compile + Upload.

لإعادة استخدام كتلة عبر المشاريع، صدّر POU عبر File > Export POU... كملف .forge-pou واستورده في المشروع الهدف — “مكتبة مساحة عمل” تمتد عبر المشاريع موجودة في قائمة المهام.

مواضيع ذات صلة