مرجع أوامر RS-232 التسلسلية لعدسات التكبير المحرّكة من POMEAS

تُتحكّم عدسات التكبير المحرّكة من POMEAS عبر RS-232 (أو إيثرنت) ببروتوكول ASCII مُدمج مكوّن من خمسة أوامر. كل أمر عبارة عن ثلاثة بايتات: الحرف X، وحرف الأمر، والحرف المرتجع 0x0D. ويجيب المتحكّم عن استعلامات الموضع والمدى بإطار من تسعة بايتات، ويبلغ عن انتهاء الحركة ببايت الحالة الوحيد 0x55. يوثّق هذا المرجع البروتوكول كما هو مُنفَّذ تماماً، بما في ذلك صيغتا التحويل والسلوك الذي يفاجئ المندمجين أكثر من غيره: يتوقف المتحكّم عن الإجابة أثناء حركة المحرك.

كُتب للمهندسين الذين يربطون عدسة تكبير محرّكة بوحدة تحكم منطقية قابلة للبرمجة (PLC)، أو وحدة تحكم بالحركة، أو حاسوب أحادي اللوحة، أو مضيف Linux — وهي أوضاع لا يتوفّر فيها برنامج Windows SDK ويكون تيار البايتات الخام هو الخيار الوحيد.

معلومات أساسية في لمحة

البندالقيمة
الأوامر5 (XH، XG، XZ، XM، XN)
فاصل الإطار0x0D (CR) — يُستخدم في الأوامر والردود معاً
إعداد المنفذ التسلسلي9600 بود، 8 بتات بيانات، بلا تماثل
منفذ إيثرنت4196
مؤشر الإيقاف0x55 — أي قيمة أخرى، أو انقضاء مهلة القراءة، تعني «لا يزال يتحرك»
صيغة المدىmaxLength = (readData − 750) × 1.3
صيغة الموضعpos = (readData − 500) × 1.3
توجيهات الاستطلاعانتظر 50 مللي ثانية على الأقل بين استدعاءات الحالة؛ واستخدم مهلة شاملة قدرها 10 ثوانٍ أو أكثر

إعدادات المنفذ وشروط التوصيل

المعاملالقيمةملاحظات
الطبقة الفيزيائيةRS-232 (مباشرة أو عبر USB-to-RS-232) أو إيثرنتيدعم المتحكّم أحدهما دون الآخر — وليس كلاهما في آن واحد
معدل البود9600يتفق كل من وثيقة البروتوكول ووثيقة واجهة برمجة بطاقة التحكم على هذه القيمة
بتات البيانات8—
التماثللا شيء—
منفذ TCP4196يُستخدم عند الاتصال عبر الواجهة الشبكية
الفاصل0x0Dفي كلا الاتجاهين

قبل أن يعني أيّ من هذا شيئاً، يجب أن يكون التوصيل صحيحاً: اربط كبل المحرك وكبل RS-232 وقفلهما قبل توصيل الطاقة. إن توصيل كبل المحرك أثناء تشغيل المتحكّم هو أكثر الأفعال تخريباً في الميدان — إذ قد يلحق ضرراً دائماً بالمحرك. وإذا كان كبل المحرك يحتاج إلى تجاوز 5 م، فاطلب كبل المصنع الطويل بدل لحام عدة كبلات قصيرة، لأن الكبلات الملحومة أو المصنّعة ذاتياً لا تستوفي متطلبات المعاوقة والتدريع.

الأوامر الخمسة

شكل كل أمر هو 'X' + <حرف الأمر> + 0x0D.

#الوظيفةASCIIHEXالرد
1العودة إلى الأصل (المنزل)X H CR0x58 0x48 0x0Dلا شيء
2الحركة إلى موضع هدف بالنبضاتX G + 6 خانات HEX + CR0x58 0x47 … 0x0Dلا شيء
3استعلام حالة الحركةX Z CR0x58 0x5A 0x0D1 بايت
4قراءة إجمالي المدى (أقصى نبضة)X M CR0x58 0x4D 0x0D9 بايت
5قراءة الموضع الحاليX N CR0x58 0x4E 0x0D9 بايت

1. العودة إلى الأصل — XH

TX:  0x58 0x48 0x0D          # 'X' 'H' CR

تعود العدسة إلى أصلها الميكانيكي. لاحظ أن العدسة تُجري هذا الإعادة أيضاً تلقائياً في كل مرة تُشغَّل، ويستغرق التهيئة 25–35 ثانية، لا تقبل العدسة خلالها أي أمر على الإطلاق. لذلك يجب أن ينتظر التطبيق المضيف 35 ثانية على الأقل بعد التشغيل قبل فتح المنفذ.

2. الحركة إلى موضع هدف — XG

يُنسَّق الحمولة بسلسلة التنسيق C "%C%C%6X%C": الحرف X، والحرف G، وعدد سداسي عشري من ست خانات يُبطَّن على اليسار بمسافات (0x20) عندما يكون أقصر من ست خانات، يليه الفاصل 0x0D.

النبضة الهدفأحرف ASCIIتسلسل البايتات
100X G ␠␠␠␠ 6 4 CR0x58 0x47 0x20 0x20 0x20 0x20 0x36 0x34 0x0D
1000X G ␠␠␠ 3 E 8 CR0x58 0x47 0x20 0x20 0x20 0x33 0x45 0x38 0x0D
5000X G ␠␠ 1 3 8 8 CR0x58 0x47 0x20 0x20 0x31 0x33 0x38 0x38 0x0D
10000X G ␠␠ 2 7 1 0 CR0x58 0x47 0x20 0x20 0x32 0x37 0x31 0x30 0x0D

سلوك مهم: إذا تساوى الموضع المطلوب مع الموضع الحالي، فإن العدسة لا تتحرك ولا تبلّغ عن خطأ. لذلك يجب ألا يعتبر التطبيق المضيف أبداً «إرسال الأمر» دليلاً على عمل الرابط. إن قراءة الموضع مرتدةً هي المسبار الموثوق للرابط.

// الحركة إلى موضع نبضي مطلق
int moveTo(int fd, long pulse) {
    char buf[16];
    // "%C%C%6X%C" - ست خانات سداسية عشرية، مبطّنة بمسافات، منتهية بـ CR
    int n = snprintf(buf, sizeof(buf), "%c%c%6lX%c", 'X', 'G', pulse, '\r');
    return write(fd, buf, n) == n ? 0 : -1;
}

3. استعلام حالة الحركة — XZ

TX:  0x58 0x5A 0x0D
انتظر 20 ms
RX:  1 بايت
الردالمعنى
0x55انتهت الحركة — توقفت العدسة
أي قيمة أخرىلا تزال تتحرك
لا بيانات على الإطلاقيُعامل أيضاً كـ «لا يزال يتحرك»

هذه أهم تفصيلة سلوكية في البروتوكول كله، وقد وثّقها الصانع: أثناء قيادة بطاقة التحكم للمحرك، تُعلَّق الاتصالات. قد لا يُرجِع رابط المنفذ التسلسلي أو الشبكة أي شيء على الإطلاق خلال حركة التكبير.

والنتيجة العملية هي أن حلقة الاستطلاع يجب أن تُبنى حول إعادة المحاولة لا حول كشف الأعطال. والتنفيذ المرجعي هو:

  1. أرسل XZ.
  2. انتظر 20 مللي ثانية على الأقل.
  3. اقرأ بايتاً واحداً.
  4. إذا انقضت مهلة القراءة، أو لم يكن البايت 0x55، فانتظر وأعد المحاولة — دون إعلان عطل.

يستخدم مخطط واجهة برمجة التطبيقات الخاص بالصانع انتظار 50 مللي ثانية قبل كل استدعاء حالة، ومهلة شاملة قدرها 10 ثوانٍ أو أكثر. ولا ينبغي للتطبيق المضيف أن يستنتج فشل اتصال العدسة إلا عند انقضاء تلك المهلة الشاملة دون رد صالح.

// انتظار انتهاء الحركة: 50 مللي ثانية لكل استطلاع، ومهلة شاملة 10 ثوانٍ
int waitStop(int fd, int timeout_ms) {
    int waited = 0;
    char c;
    while (waited < timeout_ms) {
        usleep(50 * 1000);              // مخطط التدفق المرجعي: انتظر 50 مللي ثانية أو أكثر
        write(fd, "XZ\r", 3);           // 0x58 0x5A 0x0D
        usleep(20 * 1000);              // البروتوكول: انتظر 20 مللي ثانية قبل القراءة
        if (read(fd, &c, 1) == 1 && (unsigned char)c == 0x55)
            return 0;                   // توقفت
        waited += 70;
    }
    return -1;                          // عطل في الاتصال أو الحركة
}

4. قراءة إجمالي المدى — XM

TX:  0x58 0x4D 0x0D
انتظر 20 ms
RX:  9 بايت
البايتالمحتوى
10x58 (ثابت)
2فارغ
3–7بيانات المدى — خمسة بايتات، تُحلَّل كعدد صحيح بـ "%5X" إلى readData
80x0D
9فارغ
sscanf(tbuffer + 2, "%5X", &readData);
maxLength = (readData - 750) * 1.3;

مثال عملي من وثائق الصانع: ردّ من الشكل 0x58 -- -- -- '2' '7' '1' '0' 0x0D -- يعطي readData = 10000، إذن maxLength = (10000 − 750) × 1.3 = 12025.

5. قراءة الموضع الحالي — XN

TX:  0x58 0x4E 0x0D
انتظر 20 ms
RX:  9 بايت   (نفس بنية XM)
sscanf(tbuffer + 2, "%5X", &readData);
pos = (readData - 500) * 1.3;

مثال عملي: readData = 10000 يعطي pos = (10000 − 500) × 1.3 = 12350.

تسلسل التفاعل المرجعي

(1)  XH            العودة إلى الأصل        -> استطلاع XZ حتى التوقف
(2)  XM            قراءة إجمالي المدى        -> يتحقق من الرابط، ويعطي maxLength
(3)  XG <6 HEX>    الحركة إلى موضع هدف  -> استطلاع XZ حتى التوقف
(4)  XN            قراءة الموضع الحالي     -> قارن مع الهدف (حلقة مغلقة)

نقطتان تجعلان هذا التسلسل يعمل بثقة:

  • الخطوة 2 هي مسبار الرابط الموثوق الوحيد. لا يمكن استخدام الخطوة 3 لذلك الغرض، لأن طلب موضع مساوٍ للموضع الحالي لا يُنتج حركة ولا خطأ.
  • الخطوة 4 تُغلق الحلقة. ولا يمكن للتطبيق المضيف أن يطمئن إلى أن تغيير التكبير سُريان فعلاً إلا عند تطابق القيمة المرتدة مع القيمة المطلوبة.

البروتوكول بأسره متسلسل بصرامة في المعنى — أمر → حركة → قراءة مرتدة للحالة → أمر تالٍ. وهو لا يدعم إصدار أوامر بالتزامن إلى نفس العدسة.

يوفّر هذا البروتوكول قراءة الموضع مرتدةً فقط. فهو لا يُعرّف ولا يضمن قيمة تكرارية. وتُغطّى منهجية الاختبار في المقال المصاحب عن ربط التكبير بالنبضات؛ وأي ادعاء رقمي بالدقة يجب أن يأتي من قياساتك الخاصة في ظروفك الخاصة.

مفاهيم خاطئة شائعة

«عدسة تكبير محرّكة RS-232» تعني شيئاً واحداً

تعني أمرين مختلفين تماماً، واختيار النموذج الخاطئ خطأ شائع ومكلف.

الشكلعلامة النموذجالقدرة الفعلية
تغذية راجعة سلبية بالتكبيرلاحقة DS9 أو DS6، مثل PMS-LZ-63100DS9التكبير لا يزال يدوياً. لا يُخرج RS-232 إلا التكبير الحالي أو موضع التوقف. لا يمكنه قبول الأوامر.
تحكّم محرّك نشطرمز نوع التكبير 04 أو 05 أو 09 أو 10، مثل PMS-LZ-650104تُقبل الأوامر الخمسة كلها. ويقود RS-232 التكبير بنشاط.

افحص لاحقة النموذج قبل الطلب. يمكن قراءة عدسة DS9 لكن لا يمكن التحكّم بها.

«انقطع الاتصال أثناء التكبير — الرابط مكسور»

ليس عطلاً. تُعلّق بطاقة التحكم الاتصالات أثناء قيادتها للمحرك. هذا سلوك مصمَّم. تعامل معه بأسلوب المهلة وإعادة المحاولة، لا بإنذار عطل أو إعادة تشغيل.

«إرسال أمر يُنتج حركة دائماً»

إذا تساوى الهدف مع الموضع الحالي، فتبقى العدسة ساكنة وتنجح بصمت. إمّا أن تتتبّع الموضع الحالي في التطبيق المضيف، أو تقرأه مرتدةً بـ XN قبل كل حركة.

«يمكن صياغة أي قيمة موضع»

مواضع النبضات خاصة بكل نموذج. تأتي من جدول النبضات الخاص بكل نموذج المرفق مع SDK، وتتطابق نفس التكبيرات مع عدّادات نبضات مختلفة على نماذج ونوع محرك مختلفين. اقرأ إجمالي المدى بـ XM أولاً، وأكّد أن الهدف يقع ضمن النطاق الصالح.

أوامر تسلسلية خام أم SDK؟

أمر البروتوكولواجهة SDK القديمةSDK V4.4.7
XH المنزلMoveHome(Motor)GoHome
XG الحركةMoveGoto(Motor, long dest)MoveTo(pulse)
XZ الحالةMoveStatus(Motor) → 0 يتحرك / 1 خامل / 2 خطأGetStatus
XM المدىMoveMaxLength(Motor)GetMaxPos
XN الموضعMovePos(Motor)GetPos
  • الدمج مع PLC أو وحدة تحكم بالحركة أو متحكّم دقيق — استخدم الأوامر الخام أعلاه. لا حاجة إلى DLL، والبروتوكول ASCII خالص بلا اعتماد على منصة، لذا يعمل أيضاً على Linux وmacOS.
  • التطوير على Windows في C++ أو C# — استخدم مجموعة التطوير (SDK)، التي تتولّى تجميع الإطار وإعادة المحاولة وحالة المحرك المزدوج نيابةً عنك.

لا تخلط المنهجين على نفس الرابط. فكلاهما يتناول نفس سجلّات الأجهزة، والخلط بينهما — خصوصاً حول مرجع العودة إلى المنزل — يُنتج حالة غير متسقة.

الأسئلة الشائعة

ما معدل البود الذي تستخدمه عدسات التكبير المحرّكة من POMEAS؟

9600 بود، 8 بتات بيانات، بلا تماثل. ويستخدم خيار إيثرنت منفذ TCP 4196.

لماذا لا أستطيع قراءة أي شيء من العدسة أثناء التكبير؟

لأن بطاقة التحكم تُعلّق الاتصالات عمداً أثناء قيادتها للمحرك. أعِد محاولة استعلام الحالة مع مهلة بدلاً من اعتبار الصمت فشلاً.

كيف أعرف ما إذا كانت العدسة تدعم التحكّم النشط بـ RS-232؟

افحص رمز نوع التكبير في رقم النموذج. تدل الرموز 04 و05 و09 و10 على الأنواع المحرّكة. وتدل لاحقة DS9 أو DS6 على تغذية راجعة سلبية فقط، حيث يبقى التكبير يدوياً.

هل يمكنني ربط العدسة مباشرة بوحدة PLC؟

نعم. مجموعة الأوامر عبارة عن خمسة سلاسل نصية ASCII، فيستطيع PLC ذو منفذ تسلسلي متاح تنسيقها وإرسالها مباشرة. وبرنامج جانب PLC متروك لك لكتابته؛ وتزوّد POMEAS بتعريف البروتوكول، لا بكتلة وظائف PLC.

هل أحتاج إلى DLL للتحكّم بالعدسة؟

لا. DLL طبقة تيسير على Windows فوق نفس البروتوكول على مستوى البايتات. أي منصة تستطيع فتح منفذ تسلسلي أو مقبس TCP يمكنها التحكّم بالعدسة.

مقالات ذات صلة

منتجات ذات صلة

العودة إلى الأعلى
VK Message
WhatsApp

امسح رمز الاستجابة السريعة

رمز الاستجابة السريعة لـ WhatsApp
Wechat

امسح رمز الاستجابة السريعة

رمز الاستجابة السريعة لـ Wechat
رقم الهاتف
+8618598102007
تم النسخ!
رسالة عبر الإنترنت

رسالة عبر الإنترنت

انقر لتحديث الصفحة