تُتحكّم عدسات التكبير المحرّكة من 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 | — |
| التماثل | لا شيء | — |
| منفذ TCP | 4196 | يُستخدم عند الاتصال عبر الواجهة الشبكية |
| الفاصل | 0x0D | في كلا الاتجاهين |
قبل أن يعني أيّ من هذا شيئاً، يجب أن يكون التوصيل صحيحاً: اربط كبل المحرك وكبل RS-232 وقفلهما قبل توصيل الطاقة. إن توصيل كبل المحرك أثناء تشغيل المتحكّم هو أكثر الأفعال تخريباً في الميدان — إذ قد يلحق ضرراً دائماً بالمحرك. وإذا كان كبل المحرك يحتاج إلى تجاوز 5 م، فاطلب كبل المصنع الطويل بدل لحام عدة كبلات قصيرة، لأن الكبلات الملحومة أو المصنّعة ذاتياً لا تستوفي متطلبات المعاوقة والتدريع.
شكل كل أمر هو 'X' + <حرف الأمر> + 0x0D.
| # | الوظيفة | ASCII | HEX | الرد |
|---|---|---|---|---|
| 1 | العودة إلى الأصل (المنزل) | X H CR | 0x58 0x48 0x0D | لا شيء |
| 2 | الحركة إلى موضع هدف بالنبضات | X G + 6 خانات HEX + CR | 0x58 0x47 … 0x0D | لا شيء |
| 3 | استعلام حالة الحركة | X Z CR | 0x58 0x5A 0x0D | 1 بايت |
| 4 | قراءة إجمالي المدى (أقصى نبضة) | X M CR | 0x58 0x4D 0x0D | 9 بايت |
| 5 | قراءة الموضع الحالي | X N CR | 0x58 0x4E 0x0D | 9 بايت |
XHTX: 0x58 0x48 0x0D # 'X' 'H' CR
تعود العدسة إلى أصلها الميكانيكي. لاحظ أن العدسة تُجري هذا الإعادة أيضاً تلقائياً في كل مرة تُشغَّل، ويستغرق التهيئة 25–35 ثانية، لا تقبل العدسة خلالها أي أمر على الإطلاق. لذلك يجب أن ينتظر التطبيق المضيف 35 ثانية على الأقل بعد التشغيل قبل فتح المنفذ.
XGيُنسَّق الحمولة بسلسلة التنسيق C "%C%C%6X%C": الحرف X، والحرف G، وعدد سداسي عشري من ست خانات يُبطَّن على اليسار بمسافات (0x20) عندما يكون أقصر من ست خانات، يليه الفاصل 0x0D.
| النبضة الهدف | أحرف ASCII | تسلسل البايتات |
|---|---|---|
| 100 | X G ␠␠␠␠ 6 4 CR | 0x58 0x47 0x20 0x20 0x20 0x20 0x36 0x34 0x0D |
| 1000 | X G ␠␠␠ 3 E 8 CR | 0x58 0x47 0x20 0x20 0x20 0x33 0x45 0x38 0x0D |
| 5000 | X G ␠␠ 1 3 8 8 CR | 0x58 0x47 0x20 0x20 0x31 0x33 0x38 0x38 0x0D |
| 10000 | X G ␠␠ 2 7 1 0 CR | 0x58 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;
}
XZTX: 0x58 0x5A 0x0D
انتظر 20 ms
RX: 1 بايت
| الرد | المعنى |
|---|---|
0x55 | انتهت الحركة — توقفت العدسة |
| أي قيمة أخرى | لا تزال تتحرك |
| لا بيانات على الإطلاق | يُعامل أيضاً كـ «لا يزال يتحرك» |
هذه أهم تفصيلة سلوكية في البروتوكول كله، وقد وثّقها الصانع: أثناء قيادة بطاقة التحكم للمحرك، تُعلَّق الاتصالات. قد لا يُرجِع رابط المنفذ التسلسلي أو الشبكة أي شيء على الإطلاق خلال حركة التكبير.
والنتيجة العملية هي أن حلقة الاستطلاع يجب أن تُبنى حول إعادة المحاولة لا حول كشف الأعطال. والتنفيذ المرجعي هو:
XZ.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; // عطل في الاتصال أو الحركة
}
XMTX: 0x58 0x4D 0x0D
انتظر 20 ms
RX: 9 بايت
| البايت | المحتوى |
|---|---|
| 1 | 0x58 (ثابت) |
| 2 | فارغ |
| 3–7 | بيانات المدى — خمسة بايتات، تُحلَّل كعدد صحيح بـ "%5X" إلى readData |
| 8 | 0x0D |
| 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.
XNTX: 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 قراءة الموضع الحالي -> قارن مع الهدف (حلقة مغلقة)
نقطتان تجعلان هذا التسلسل يعمل بثقة:
البروتوكول بأسره متسلسل بصرامة في المعنى — أمر → حركة → قراءة مرتدة للحالة → أمر تالٍ. وهو لا يدعم إصدار أوامر بالتزامن إلى نفس العدسة.
يوفّر هذا البروتوكول قراءة الموضع مرتدةً فقط. فهو لا يُعرّف ولا يضمن قيمة تكرارية. وتُغطّى منهجية الاختبار في المقال المصاحب عن ربط التكبير بالنبضات؛ وأي ادعاء رقمي بالدقة يجب أن يأتي من قياساتك الخاصة في ظروفك الخاصة.
تعني أمرين مختلفين تماماً، واختيار النموذج الخاطئ خطأ شائع ومكلف.
| الشكل | علامة النموذج | القدرة الفعلية |
|---|---|---|
| تغذية راجعة سلبية بالتكبير | لاحقة DS9 أو DS6، مثل PMS-LZ-63100DS9 | التكبير لا يزال يدوياً. لا يُخرج RS-232 إلا التكبير الحالي أو موضع التوقف. لا يمكنه قبول الأوامر. |
| تحكّم محرّك نشط | رمز نوع التكبير 04 أو 05 أو 09 أو 10، مثل PMS-LZ-650104 | تُقبل الأوامر الخمسة كلها. ويقود RS-232 التكبير بنشاط. |
افحص لاحقة النموذج قبل الطلب. يمكن قراءة عدسة DS9 لكن لا يمكن التحكّم بها.
ليس عطلاً. تُعلّق بطاقة التحكم الاتصالات أثناء قيادتها للمحرك. هذا سلوك مصمَّم. تعامل معه بأسلوب المهلة وإعادة المحاولة، لا بإنذار عطل أو إعادة تشغيل.
إذا تساوى الهدف مع الموضع الحالي، فتبقى العدسة ساكنة وتنجح بصمت. إمّا أن تتتبّع الموضع الحالي في التطبيق المضيف، أو تقرأه مرتدةً بـ XN قبل كل حركة.
مواضع النبضات خاصة بكل نموذج. تأتي من جدول النبضات الخاص بكل نموذج المرفق مع SDK، وتتطابق نفس التكبيرات مع عدّادات نبضات مختلفة على نماذج ونوع محرك مختلفين. اقرأ إجمالي المدى بـ XM أولاً، وأكّد أن الهدف يقع ضمن النطاق الصالح.
| أمر البروتوكول | واجهة 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 |
لا تخلط المنهجين على نفس الرابط. فكلاهما يتناول نفس سجلّات الأجهزة، والخلط بينهما — خصوصاً حول مرجع العودة إلى المنزل — يُنتج حالة غير متسقة.
9600 بود، 8 بتات بيانات، بلا تماثل. ويستخدم خيار إيثرنت منفذ TCP 4196.
لأن بطاقة التحكم تُعلّق الاتصالات عمداً أثناء قيادتها للمحرك. أعِد محاولة استعلام الحالة مع مهلة بدلاً من اعتبار الصمت فشلاً.
افحص رمز نوع التكبير في رقم النموذج. تدل الرموز 04 و05 و09 و10 على الأنواع المحرّكة. وتدل لاحقة DS9 أو DS6 على تغذية راجعة سلبية فقط، حيث يبقى التكبير يدوياً.
نعم. مجموعة الأوامر عبارة عن خمسة سلاسل نصية ASCII، فيستطيع PLC ذو منفذ تسلسلي متاح تنسيقها وإرسالها مباشرة. وبرنامج جانب PLC متروك لك لكتابته؛ وتزوّد POMEAS بتعريف البروتوكول، لا بكتلة وظائف PLC.
لا. DLL طبقة تيسير على Windows فوق نفس البروتوكول على مستوى البايتات. أي منصة تستطيع فتح منفذ تسلسلي أو مقبس TCP يمكنها التحكّم بالعدسة.
XG
أدخل بريدك الإلكتروني فقط لتتصلك آخر الأخبار والمستجدّات من بيومياس. ابقَ على تواصل مع بيومياس وكن أوّل من يعلم بأحدث الابتكارات في عالم البصريات.