مكتبة ناقلات الفرز
تتيح هذه الأداة لمستخدم AnyLogic بناء مجموعة من شبكات ناقلات الفرز تلقائيًا باستخدام نقاط بيانات محددة في ملف تهيئة Excel. يوفر هذا النهج مرونة، مما يسمح بتعديلات وإضافات سهلة لمكونات مختلفة مثل الناقلات الحلقية وطاولات النقل والفروع وغيرها. بالإضافة إلى ذلك، تتيح لك هذه الأداة الاتصال عبر بروتوكول TCP/IP مع أي أداة خارجية لقراءة البيانات المتعلقة بالموضع الحالي للوكلاء في شبكة الناقلات، وإرسال المعلومات مرة أخرى إلى هذه الأداة لإعادة التوجيه وإعادة تحديد الأولويات.
شاهد هذه المكتبة أثناء العمل عبر الرابط التالي: https://cloud.anylogic.com/model/34810d29-661b-4d2c-95dd-46ecd95c221b يمكنك أيضًا مشاهدة العرض التوضيحي بالفيديو هنا: https://youtu.be/fQwLOUNW2s4
كيفية التحميل
يمكنك الحصول على النسخة المجانية مع قيود هنا، مع جميع الملفات المهمة التي ستحتاجها:
https://github.com/noorjax/sorting_conveyors
ستحتاج إلى ترخيص للحصول على الوظائف الكاملة. النسخة المجانية محدودة بحد أقصى ساعة واحدة من وقت المحاكاة.
كيفية الحصول على ترخيص
للحصول على ترخيص، اتبع التعليمات في الرابط التالي:
/ar/blog/getting-a-license-for-a-library/
سعر هذه المكتبة:
-
الاستخدام التجاري - سنة واحدة: 3,000 يورو
-
الدعم للتنفيذ: 1,000 يورو
أسعارنا قابلة للتغيير في أي وقت دون إشعار مسبق
التوثيق
تم اختبار هذه المكتبة مع AnyLogic 8.9.1. لن تعمل الإصدارات السابقة.
أول شيء تريد فعله مع هذه المكتبة هو بناء شبكات الناقلات الخاصة بك، وللقيام بذلك ستحدد الموقع الفعلي للناقلات والفروع وطاولات النقل في Excel.
ملف تهيئة Excel
يحتوي ملف تهيئة Excel على العديد من التبويبات. سنناقش ما يفعله كل واحد منها.
الترخيص
في هذا التبويب ستكتب الرمز الذي ستتلقاه عند الحصول على النسخة المدفوعة من هذه الأداة. إذا لم يكن لديك رمز، لا تقلق يمكنك الاستمرار في استخدام المكتبة في نسختها المحدودة.
عام
-
وحدة الطول: يمكن أن تكون بالمتر أو القدم. ستكون هذه وحدة الطول لجميع المعلمات التي لها لاحقة “بوحدات الطول”. ستحكم هذه جميع المسافات والسرعات والتسارعات.
-
مسار Python (اختياري): هنا ستضيف مسار موقع برنامج Python على حاسوبك، والذي سيُستخدم لعرض معاينة لشبكة الناقلات. إذا كان لديك هذا مُفعّلاً بشكل صحيح، ستتمكن من النقر على زر “show 3D plot” في تبويب Conveyors config لرؤية معاينة للشبكة التي تبنيها في Excel قبل استخدامها في AnyLogic. إذا كنت جديدًا مع Python، ننصحك بتحميل Anaconda Navigator (يمكنك إيجاده عبر الإنترنت) واستخدام مسار Python من Anaconda.
ملف Python للتصور المسبق لشبكة الناقلات (زر Show 3D)
لمعرفة كيف تبدو شبكة الناقلات قبل تشغيلها في AnyLogic، يمكنك الضغط على زر “show 3D plot” في صفحة Conveyors config في ملف تهيئة Excel. لكن قبل الضغط على الزر يجب تهيئة بعض الأشياء:
-
ملف preVisualizationScript.py موجود في نفس المجلد مع ملف تهيئة Excel.
-
لتشغيل “preVisualizationScript.py” بنجاح، من الضروري تثبيت مكتبات Python اللازمة. تُمكّن هذه المكتبات وظائف مختلفة مثل معالجة البيانات والرسم والتصور ثلاثي الأبعاد والتعبيرات النمطية والعمليات العددية والتكامل مع Excel. فيما يلي قائمة بالمكتبات المطلوبة:
-
Pandas
-
Matplotlib
-
mplot3d
-
re (Regular Expressions)
-
numpy
-
xlwings
لتثبيت جميع المكتبات المطلوبة، يمكنك استخدام أوامر pip التالية:
pip install pandas matplotlib numpy xlwings
وحدة re هي جزء من مكتبة Python القياسية، لذلك لا حاجة لتثبيت إضافي لها.
تهيئة الناقلات:
في هذه الصفحة يتم تعريف معلمات كائن الناقل. بالإضافة إلى ذلك لديك زر يُسمى “show 3D plot” يستخدم Python إذا كان مُهيّأً بشكل صحيح ليعرض لك معاينة لكيفية ظهور شبكات الناقلات حتى الآن أثناء تقدمك في إضافتها.
-
A: المعرف: معرف فريد للناقل.
-
B: معرف الشبكة: هو المعرف الفريد للشبكة التي ينتمي إليها هذا الناقل.
C: النقاط بوحدات الطول (انظر الصورة أدناه): جميع نقاط الناقل، حيث الأولى هي نقطة الأصل، والأخيرة هي نهاية الناقل. يمكن أن تكون الإحداثيات بالمتر أو القدم، كما هو محدد في صفحة General. استخدم هذا التركيب: {{x0,y0,z0},{x1,y1,z1},{x2,y2,z2},…,{xn,yn,zn}}
-
لاحظ أن الترتيب الذي تُكتب به النقاط سيحدد اتجاه حركة الناقل وأن هذا الاتجاه لا يمكن تعديله أثناء وقت التشغيل.
-
إذا كانت النقاط تحدد ناقلاً حلقيًا، تأكد من استخدام نفس نقطتي البداية والنهاية.
-
D: النوع: ثلاثة خيارات ممكنة: Cell و Belt و Roller.
-
E: الفجوة بوحدات الطول (انظر الصورة أدناه): حجم الخلية حيث سيكون الوكيل إذا تم اختيار النوع “Cell”. وحدات الطول محددة في صفحة General.
-
F: حجم الخلية بوحدات الطول (انظر الصورة أدناه): حجم الخلية حيث سيكون الوكيل إذا تم اختيار النوع “Cell”. وحدات الطول محددة في صفحة General. إذا كنت تستخدم حلقة بخلايا، تأكد من أن الحلقة وحجم الخلايا وفجوات الخلايا (العمودان E و F) منطقية، بمعنى أنها تتناسب مع طول الناقل. إذا لم تتناسب، ستحسب خوارزميتنا حجم الفجوة بالتقريب إلى أقرب قيمة للعمود E التي تتناسب فيها الأحجام بشكل صحيح. عند تشغيل النموذج، ستحصل على إشعار في وحدة التحكم بحجم الفجوة المستخدم.
-
G: العرض بوحدات الطول (انظر الصورة أدناه): عرض الناقل. وحدات الطول محددة في صفحة General.
-
H: السرعة الأولية بوحدات الطول في الثانية: السرعة الأولية للناقل بالمتر/ثانية أو القدم/ثانية.
-
I: السرعة القصوى بوحدات الطول في الثانية: السرعة القصوى للناقل بالمتر/ثانية أو القدم في الثانية.
-
J: التسارع بوحدات الطول في الثانية²: تسارع الناقل بالمتر/ثانية² أو القدم/ثانية².
-
K: اللون: لون الناقل. يساعد في التحقق والتصديق على النموذج.
تهيئة الفروع
تحدد هذه الصفحة الاتصال الموجود بين الناقلات المختلفة باستخدام الفروع.
-
A: المعرف: معرف فريد للفرع.
-
B. معرف الشبكة: هو المعرف الفريد للشبكة التي ينتمي إليها هذا الفرع.
-
C. ناقل الفرع (انظر الصورة أدناه): معرف الناقل المتصل مباشرة بهذا الفرع. معرف الناقل هو الموجود في العمود A من صفحة تهيئة الناقلات.
-
D. الناقل الرئيسي (انظر الصورة أدناه): معرف الناقل المربوط به الفرع. معرف الناقل هو الموجود في العمود A من صفحة تهيئة الناقلات.
-
E. اللون: لون الفرع، يساعد في التحقق والتصديق على النموذج.

تهيئة طاولات النقل
-
A. المعرف: معرف فريد لطاولة النقل.
-
B. معرف الشبكة: هو المعرف الفريد للشبكة التي تنتمي إليها طاولة النقل هذه.
-
C. المسارات: خريطة يتم فيها تعريف اتصال الناقلات. يلزم ناقلان على الأقل ويمكن تعريف أربعة كحد أقصى. مفاتيح الخريطة هي معرفات الناقلات، والقيمة هي نوع النقطة حيث تتصل هذه الناقلات بطاولة النقل. مثال: {conveyor1:end,conveyor2:end,conveyor3:begin}، هذا المثال يحدد طاولة نقل لها 3 ناقلات متصلة، تبدأ عند نهاية conveyor1 و conveyor2، ومتصلة ببداية conveyor3 (انظر الصورة أدناه)”
-
D. تأخير التبديل بالثانية: الوقت المطلوب للتبديل إلى ناقل آخر (بالثواني).
-
E. لون التعبئة: لون تعبئة الشكل.
-
F. لون الخط: لون خط الشكل.
-
G. عرض الخط بالنقاط: عرض خط المربع (بالبكسل).

تهيئة أجهزة الاستشعار
الهدف من هذه الصفحة هو تعريف مواضع على الناقلات ستُستخدم كأجهزة استشعار في التقاطعات، من أجل إنشاء تسلسل إطلاق الوكلاء بناءً على أولوياتهم. تُستخدم أجهزة الاستشعار في الفرازات من أجل إعادة توجيه وتحديد أولوية العناصر وهذا هو المكان الذي يتم فيه تعريف أجهزة الاستشعار. (لمزيد من التفاصيل حول أجهزة الاستشعار وكيفية استخدامها في نموذج المحاكاة، ارجع إلى فقرة “الناقلات المتقاربة”)
-
a. المعرف: معرف فريد لجهاز الاستشعار.
-
b. معرف الشبكة: هو المعرف الفريد للشبكة التي ينتمي إليها جهاز الاستشعار هذا
-
c. الناقل: الناقل الذي سيتواجد فيه الموضع.
-
d. الإزاحة بوحدات الطول: هذه المسافة من النقطة الأولى للناقل.
-
e. نوع الموضع: خياران ممكنان فقط: enter و exit. يحدد هذا ما إذا كان جهاز الاستشعار يُستخدم عند خروج ناقل أو عند مدخله. يمكن استخدام مدخل واحد فقط وعدة مخارج لتقاطع واحد.
-
f. معرف التقاطع: معرف فريد للتقاطع.
g. نوع الاتحاد: ثلاثة خيارات ممكنة هنا:
-
i. فجوة: إذا كان نوع الموضع خروج، فهذا يعني أن هناك مساحة بين ناقل هذا المستشعر وناقل الدخول.
-
ii. فرع: إذا كان نوع الموضع خروج، فهذا يعني أن ناقل هذا المستشعر متصل بناقل الدخول بفرع. لذلك يجب إنشاء فرع في صفحة تهيئة الفروع.
-
iii. بلا: إذا كان نوع الموضع “دخول”، فهذا هو الخيار الوحيد الممكن.

المسارات
المسارات هي جميع التسلسلات المتوقعة للناقلات التي قد تتبعها المواد (الوكلاء)
-
a. المعرف: معرف فريد للتسلسل.
-
b. التسلسل: قائمة الناقلات التي يمكن للوكيل المرور عبرها. استخدم هذا التركيب: {c1,c3,c5} مع تحديد معرفات الناقلات وتأكد من عدم إضافة أي مسافات بين معرفات الناقلات أو بجانب الأقواس لأن ذلك سيسبب خطأ.
ملاحظة: لجميع المعرفات الموصوفة أعلاه التي تحتاج إلى الإشارة إليها في ملف Excel، لا يمكن أن تحتوي الأسماء على أي حرف خاص غير الشرطة السفلية ”_”. هذا هو الحرف المقبول الوحيد الذي يمكن استخدامه كجزء من أسماء المعرفات.
SpecialConveyorItem
لاستخدام جميع ميزات هذه المكتبة، ستحتاج إلى إنشاء وكيلك الخاص الذي سيتحرك عبر الناقلات، لكن وكيلك يجب أن يكون امتدادًا من SpecialConveyorItem الخاص بهذه المكتبة، وهو نوع Material Item. لهذا تحتاج إلى الذهاب إلى القسم المتقدم من خصائص نوع وكيلك وفعل ذلك هناك كما هو موضح في الصورة التالية:

من خلال الامتداد من نوع الوكيل الخاص هذا، يحصل الوكيل على الوصول إلى ما يلي:
set_id(String id): يحدد المعرف الفريد للوكيل في حالة رغبتك في استخدام ميزات HTTP (القسم التالي).
priority: هو متغير من نوع double يمثل الأولوية الحالية للوكيل، كلما زاد الرقم زادت الأولوية.
setLength(double lengthInUnits, LengthUnits units): افتراضيًا يكون طول الوكيل متر واحد، عند إنشاء الوكيل يمكنك تحديد طول جديد للوكيل.
setWidth(double lengthInUnits, LengthUnits units): افتراضيًا يكون عرض الوكيل متر واحد، عند إنشاء الوكيل يمكنك تحديد عرض جديد للوكيل.
setHeight(double lengthInUnits, LengthUnits units): افتراضيًا يكون ارتفاع الوكيل متر واحد، عند إنشاء الوكيل يمكنك تحديد ارتفاع جديد للوكيل.
بالطبع يجب إنشاء رسوم متحركة خاصة بوكيلك، وإلا لن ترى شيئًا عند تشغيل المحاكاة.
ConveyorNetworkSettings
يخزن هذا الوكيل معلومات حول إعدادات شبكات الناقلات. يساعد في ربط النموذج بخوادم في حالة الحاجة لاستخدام اتصالات HTTP (القسم التالي).
معلمات هذا الوكيل هي التالية:
-
استخدام اتصال HTTP: يحدد ما إذا كان سيتم استخدام اتصال HTTP أم لا.
-
المضيف: هذا هو اسم النطاق أو عنوان IP للخادم حيث يوجد المورد. يحدد الخادم المحدد الذي سيتعامل مع طلب HTTP. مثلاً، في عنوان URL http://www.example.com:8080/index.html، www.example.com هو المضيف.
-
المنفذ: هذا هو الرقم الذي يحدد نقطة نهاية الاتصال على المضيف. يحدد المنفذ كيفية نقل البيانات إلى الخادم. مثلاً، في عنوان URL http://www.example.com:8080/index.html، 8080 هو المنفذ.
-
طباعة حالة الاتصال: ضع علامة true إذا أردت رؤية حالة الاتصال في وحدة التحكم.
اتصال HTTP و JSON
هناك ثلاث دوال تعمل كعملاء في علاقة عميل-خادم: httpRequestAll و httpRequestCurrentSeq و httpRequestPriorities و httpRequestInject. ترسل هذه الدوال ملف JSON بمواضع الوكلاء المخزنة في مجموعة materialPositions ثم يعتمد العائد المتوقع على كل دالة محددة.
httpRequestCurrentSeq():
تعيد معلومات بالتسلسل الجديد للوكلاء وتغير الناقل المستهدف الحالي. مثال: {“Id”: “0”, “RouteId”: “5”, “Priority”: 10}، حيث Id يعني المعرف الفريد للوكيل، RouteId هو المسار التالي للوكيل و Priority هي الأولوية الجديدة للوكيل.
httpRequestPriorities():
- تعيد الأولويات الجديدة للوكلاء المحددين. لذلك تغير الدالة أولوية الوكلاء ديناميكيًا. مثال: {“Id”: “100”, “Priority”: 25}، تحدد الأولوية الجديدة 25 للوكيل ذي المعرف “100”.
httpRequestInject(ConveyorNetworkLogic cnLogic, Object classInstance, String addPopulationMethodString, Object… agentArgs):
-
تعيد معلومات متعلقة بإنشاء أو حقن وكلاء جدد في منطق شبكة الناقلات المحدد. مثلاً، رسالة JSON من الخادم {“Id”: 2, “RouteId”: “2”, “Priority”: 20}، حيث Id هو المعرف الفريد للوكيل الجديد المراد إضافته إلى شبكة الناقلات، RouteId هو المسار الذي سيتبعه هذا الوكيل الجديد، و priority هي الأولوية الأولية للوكيل.
-
سيتم إنشاء الوكلاء بناءً على الوسيط addPopulationMethodString وهو الطريقة التي تنشئ وكلاء جدد في مجموعة. مثلاً، إذا كان لديك مجموعة تُسمى “pallets” بسبب نوع وكيل Pallet، فإن طريقة السلسلة ستكون “add_pallets”. اعتبر أن الوكيل Pallet يجب أن يكون امتدادًا لوكيل SpecialConveyorItem.
-
إذا كان addPopulationMethodString يتطلب بعض الوسائط الأولية، يمكنك تعريفها في وسيط agentArgs مع جميع المعلمات المطلوبة للوكيل الذي تقوم بتهيئته مع addPopulationMethodString. اعتبر أنه إذا لم تكن هناك وسائط مطلوبة، يمكن حذف الوسائط المتعلقة بـ agentArgs للدالة. متابعة للمثال الأخير، إذا كان الوكيل Pallet له معلمتان: SKU و Material، فيجب إضافة هذه القيم لتلك المعلمات مفصولة بفواصل (يجب أن تكون بنفس الترتيب كما لو كنت تستخدم دالة add_pallets()).
-
classInstance هو الوكيل حيث توجد طريقة إضافة المجموعة، أو بعبارة أخرى، حيث توجد مجموعة الوكلاء. مثلاً، إذا كانت مجموعة pallets في main، وكنت تنفذ دالة HTTP مباشرة من main، يجب وضع this كـ classInstance.
مثلاً وباستخدام الأمثلة الأخيرة، إذا كان منطق شبكة الناقلات حيث سيتم حقن الوكلاء يُسمى conveyorNetworkLogic، ستبدو الدالة كالتالي: httpRequestInject(conveyorNetworkLogic, this, “add_pallets”, 123, “wood”); إذا لم يكن للوكيل معلمات أو يجب تهيئة الوكيل الجديد بقيم المعلمات الافتراضية، ستبدو كالتالي: httpRequestInject(conveyorNetworkLogic, this, “add_pallets”);
- إذا كان addPopulationMethodString أو classInstance فارغًا (null)، فسيكون الوكيل المحقون من نوع SpecialConveyorItem.
conveyorNetworkAnimation.httpRequestAll(ConveyorNetworkLogic cnLogic, Object classInstance, String addPopulationMethodString, Object… agentArgs):
تعيد معلومات من الدوال الثلاث المذكورة أعلاه. لذلك، ستكون استجابة الخادم خريطة بالتسلسلات الجديدة لوكلاء معينين والأولويات الجديدة وحقن آخرين في النظام. الاستجابة هي قائمة تحتوي على ثلاث قوائم من الخرائط: newSeq و priority و inject. يُستخدم الوسيط cnLogic و classInstance و addPopulationMethodString و agentArgs إذا كان مطلوبًا حقن جديد (اقرأ دالة httpRequestInject لفهم هذا).
خطوات لجعل هذا يعمل
لجعل هذا يعمل، هذه هي الخطوات اللازمة:
-
تأكد من أن متغير “id” للوكلاء تم تهيئته. إذا لم يكن كذلك، قم بتهيئة معرفات الوكلاء باستخدام id=String id على الوكيل. هذا ضروري من أجل إرسال معرفات الوكلاء إلى الخادم.
-
شغّل إحدى الدوال حسب ما تريد فعله:
-
conveyorNetworkAnimation.httpRequestCurrentSeq
-
conveyorNetworkAnimation.httpRequestInject
-
conveyorNetworkAnimation.httpRequestPriorities
-
conveyorNetworkAnimation.httpRequestAll
ملاحظات:
عند استخدام httpRequestCurrentSeq، تأكد من أن التسلسل الجديد المقدم ممكن التنفيذ مع الأخذ في الاعتبار الناقل الحالي الذي يتواجد فيه الوكيل. إذا لم يكن كذلك، ستحصل على خطأ مثل: lang.RuntimeException: root.conveyorNetworkAgent.convey: Path not found
خادم HTTP
لاستخدام دوال HTTP المدمجة في المكتبة، ستحتاج إلى إعداد خادم باستخدام بروتوكول HTTP. المكتبة تحتوي على العميل المدمج، لذلك من مسؤولية المستخدم إنشاء خادمه الخاص.
عند استخدام دوال HTTP في هذه المكتبة، ستقوم بإرسال بيانات إلى الخادم، ومن مسؤولية الخادم تحديد ما يفعله بتلك البيانات وإعادة ملف JSON إلى AnyLogic (العميل).
تحقق من ملف Python النموذجي المضمن في المكتبة الذي يعمل كخادم. (ملف Python main v4.py في مجلد helper)
ستصف النقاط التالية الدالة الثانية للخادم، المتعلقة بدالة httpRequestCurrentSeq في AnyLogic:
@app.route(“/update-current-conveyor”, methods=[“POST”]) يحدد هذا السطر مسارًا في تطبيق Flask. لنفصله:
-
@app.route(…): هذا مُزخرف Flask يُستخدم لربط عنوان URL محدد بدالة Python. في هذه الحالة، العنوان هو “/update-current-conveyor”.
-
methods=[“POST”]: يحدد هذا أن هذا المسار سيقبل فقط طلبات HTTP POST. طلبات POST تُستخدم عمومًا لإرسال بيانات إلى الخادم.
-
def update_currentConveyor(): يحدد هذا السطر دالة اسمها update_currentConveyor. ستُنفذ هذه الدالة عند إجراء طلب POST إلى مسار “/update-current-conveyor”.
data = request.get_json()
-
request: هذا كائن Flask يحتوي على جميع بيانات طلب HTTP المُرسل إلى الخادم.
-
get_json(): تُستخدم هذه الطريقة للحصول على بيانات JSON المُرسلة في طلب POST. في هذا السياق، ستحتفظ data بالبيانات التي أرسلها العميل إلى الخادم بتنسيق JSON.
التعليقات في الكود:
-
create a random route: تعليق يشير إلى أنه يجب تعريف معرف مسار هنا لإعادته لاحقًا. يقترح أن هذا الجزء من الوظيفة لم ينفذه المستخدم بعد.
response = [ … ] هنا يتم تعريف قائمة من القواميس، تمثل الاستجابة التي ستُرسل مرة أخرى إلى العميل. كل قاموس في القائمة يحتوي على:
-
“Id”: سلسلة تمثل المعرف الفريد للوكيل.
-
“RouteId”: سلسلة تمثل معرف المسار.
-
“Priority”: عدد صحيح يشير إلى أولوية المسار.
return jsonify(response), 201
-
jsonify(response): هي دالة Flask تحول قائمة response إلى استجابة HTTP بتنسيق JSON.
-
201: هذا رمز حالة HTTP يشير إلى أن المورد تم إنشاؤه بنجاح. يُستخدم رمز الحالة 201 عادةً لاستجابات طلبات POST التي تؤدي إلى إنشاء مورد.
فهم هذا، الجزء الوحيد الذي يجب أن يكون بنفس التنسيق المذكور هو “response”. لأن هذا هو JSON الذي سيقوم AnyLogic بفك تشفيره لإجراء التغييرات المطلوبة.
لاحظ أن الخادم يمكن كتابته بأي لغة برمجة، لكن يجب إرسال الاستجابة كـ JSON.
الناقل الدائري
هناك بعض القواعد لإنشاء ناقل دائري أو مغلق:
-
من المهم أن تكون النقطة الأولى والأخيرة للناقل متطابقتين. مثال: {{10, 10, 1}, {10, 15, 1}, {46, 15, 1}, {46, 10, 1}, {10, 10, 1}}.
-
في الحالات التي يكون لديك فيها ناقل دائري مع ناقلين مستقيمين يتفرعان منه بحيث يكون لهذين الناقلين المستقيمين اتجاهات متعاكسة، من الضروري أن يتم اختيار رأس الناقل الدائري (نقطة البداية والنهاية) على طول الجزء من الناقل الدائري الذي يقع بين الناقلين المستقيمين المتفرعين. مثال: الدائرة الحمراء لـ conveyorLoop: begin & end.

بهذه الطريقة يمكنك ببساطة تعريف تسلسل مثل: {conveyor1,conveyor2} وسيمر الوكيل عبر conveyor1، ثم يقوم بنصف لفة على الناقل الدائري (conveyorLoop) وسيأخذ الفرع الأزرق لإنهاء التسلسل في conveyor2. هذا ممكن فقط لأن نقطة بداية ونهاية الناقل الحلقي ليست في مسار الوكيل، وإلا إذا كانت النقطة في المسار، ستحتاج إلى تعريف الحلقة كجزء من التسلسل. إذا أردت أن يقوم الوكيل بلفة كاملة في الحلقة، تحتاج فقط إلى تعريف التسلسل هكذا: {conveyor1,conveyorLoop,conveyor2}. ستكون النتيجة conveyor1، ثم لفة كاملة زائد نصف لفة ثم conveyor2. ملاحظة: إذا كان آخر ناقل في تسلسل المسار هو ناقل حلقي، فسيكون الوكيل في الحلقة للأبد، ما لم يتم تنفيذ دالة httpRequestCurrentConv، التي تغير تسلسل الوكيل.
الناقلات المتقاربة
إذا كان ناقلان أو أكثر يندمجان في ناقل واحد، سيكون من الضروري استخدام أولويات الوكلاء لتحديد ترتيب أو تسلسل الوكلاء. لذلك سيكون استخدام صفحة تهيئة أجهزة الاستشعار ضروريًا. المواضع على الناقل هي أجهزة الاستشعار التي ستساعد في تحديد تسلسل الوكلاء. إليك مثالاً سريعًا لكيفية تهيئة نقطة تقارب الناقلات:


-
في صفحة تهيئة أجهزة الاستشعار، يتم تعريف أجهزة استشعار الناقلات، هناك ناقلان يندمجان في واحد. معرف التقاطع لتحديد أي أجهزة استشعار مرتبطة.
-
الناقلان اللذان يتصلان عند النقطة هما conveyor1 و conveyor2، لذلك كلاهما لديه exit كنوع الموضع.
-
لاستخدام الأولويات من الضروري تقسيم الناقل الرئيسي (في هذه الحالة conveyor2 و conveyor3) إلى جزأين، لأن هذه هي الطريقة لاستخدام أجهزة الاستشعار.
-
conveyor2 لديه gap كنوع اتحاد لأن هناك مساحة بين conveyor2 و conveyor3. في الواقع، هذه الفجوة أو المساحة غير موجودة، في الحقيقة هذا مجرد ناقل مستقيم واحد. ومع ذلك، في التهيئة وبالتالي النموذج، من الضروري تقسيم الناقل إلى جزأين عند التقاطع حتى نتمكن من إضافة أجهزة الاستشعار وفقًا لذلك. عند تقسيم الناقل المستقيم إلى ناقلين، يجب أن تكون إحداثيات نهاية الناقل الأول هي نفس إحداثيات بداية الناقل الثاني. بهذه الطريقة سيعمل الناقلان كما لو كانا واحدًا.
-
في المقابل، conveyor1 لديه اتصال مباشر بـ conveyor3 مع فرع (أزرق).
-
في صورة المثال، الآن بعد أن مر الوكيل البنفسجي ذو الأولوية 6 عبر مستشعر “conveyor1 exit” للـ conveyor1، يجب على الوكيلين الأحمرين على conveyor2 الانتظار في نهاية الناقل، لأن أول وكيل لهذا الناقل لديه أولوية أقل (5). بعد أن يمر الوكيل الأول ذو الأولوية 6 عبر مستشعر “conveyor3 enter” في conveyor3، سيتم إرسال إشارة للسماح للوكلاء على conveyor2 بالبدء في التحرك، لكن لاحظ أن الوكلاء الحمر سيتحركون للأمام فقط إذا لم يكن الوكيل البنفسجي الثاني ذو الأولوية 6 قد وصل إلى مستشعر “conveyor1 exit” في conveyor1 بعد.
لاحظ أن إزاحات أجهزة الاستشعار يجب أن تكون متسقة مع التخطيط، إليك بعض الأشياء التي يجب مراعاتها:
-
لا يمكن أن يكون لمستشعر الدخول إزاحة تساوي صفر، لأنه لن يكون هناك مساحة لكشف الوكلاء الجدد القادمين، ولن تعمل الأولويات في التقاطع.
-
لا يمكن أن يكون مستشعر الدخول في نفس خط الفرع الذي يوفر وكلاء من ناقل الفرع. يجب أن يكون المستشعر بعد شكل الفرع (انظر الصورة التالية)

- لا يمكن أن تكون إزاحة أجهزة الاستشعار أكبر من الطول الإجمالي للناقل.
كيفية استخدام النموذج
-
أولاً قم بتحميل المكتبة (انظر أعلى هذا التوثيق) مع مجلد lib واحفظها في مكان آمن.
-
داخل AnyLogic، أضف مكتبة ناقلات الفرز إلى لوحة الأدوات الخاصة بك باستخدام زر + في تبويب اللوحة، وابحث عن ملف sortingConveyors.jar الذي قمت بتحميله… احتفظ دائمًا بملف .jar هذا في نفس الموقع، وإلا ستواجه مشاكل.

الآن عند إنشاء نموذج أو إذا أردت استخدام نموذج موجود مع هذه المكتبة:
-
من مجلد helper، ضع ملف configMacroV Excel في مجلد نموذجك (لا تغير الاسم لأن هذا هو الاسم المستخدم في المكتبة. أيضًا لا تغير هيكل Excel، أو التبويبات أو أسماء التبويبات)
-
إذا كان لديك Python مثبتًا، أضف preVisualizationScript.py من مجلد helper إلى مجلد نموذجك. سيُستخدم هذا من قبل ملف Excel كماكرو لعرض رسم ثلاثي الأبعاد لنظام الناقلات.
-
اسحب وأسقط ConveyorNetworkSettings في نموذجك. قم بتهيئة المعلمات كما تحتاج.
-
اسحب وأسقط ConveyorNetworkAnimation في نموذجك. اختر وكيل conveyorNetworkSettings.

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

- قم بتهيئة معلمات وكيل conveyorNetworkLogic، باختيار الرسوم المتحركة لشبكة الناقلات.
تذكر شيئين مهمين:
- الوكيل الذي يستخدم منطق شبكة الناقلات يجب أن يمتد من SpecialConveyorItem كما شُرح سابقًا.
قبل أن يدخل الوكيل الكتلة، يجب استخدام هذه الدالة: conveyorNetworkAnimation.updateCurrentSequence(SpecialConveyorItem agent, String sequenceId, double priority); هذا لتهيئة المعلمات الأساسية للوكيل ليتم توجيهه في شبكة الناقلات. مثلاً إذا كان source متصلاً بكتلة منطق شبكة الناقلات، يمكنك تنفيذ ذلك الكود في إجراء “on at exit”.
- شغّل النموذج واستمتع.
ملاحظات/توصيات
-
تذكر استخدام النقاط للأرقام العشرية، الفواصل غير مسموح بها لهذه الأرقام.
-
للاتحادات، مثل الفروع أو طاولات النقل، من الضروري ترك مساحة بين الناقلات المعنية. هذا لتوفير المساحة الفعلية اللازمة لإنشاء الخطوط التي تمثل الفروع وطاولات النقل. في الصورة التالية ثلاثة ناقلات متصلة بطاولة نقل، ونقاط الاتصال ليست في نفس الإحداثيات لأن المساحة بينها مطلوبة، لأنه بهذه الطريقة يمكن إنشاء شكل الناقل.

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

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

النموذج المُصدّر لا يعمل
عند تصدير نموذج، لا يتطلب ترخيصًا، طالما قمت بتصديره مع ترخيص (سواء للسحابة أو تصدير JAVA). لتصديره، يجب أن تكون قد شغلت نموذج المحاكاة مرة واحدة على الأقل في AnyLogic مع تشغيل الإنترنت، مما سيولد ملف licenseKey.txt صالح (إذا اشتريت ترخيصًا). يجب دمج هذا الملف في أي إصدار مُصدّر، وللقيام بذلك تحتاج إلى الذهاب إلى خصائص resources/data/licenseKey.txt وتشغيل “Resource is referrenced from user code”. سيسمح هذا للنموذج بتصدير ملف licenseKey.txt، كما ترى في الصورة التالية:
