منتدى التحكم الآلي والإلكترونيات
مرحبا بك عزيزي الزائر يشرفنا أن تقوم بالدخول إذا كنت من الأعضاء أو التسجيل إذا كنت زائرا ويمكنك إنشاء حسابك ببساطة ويمكنك التفعيل عن طريق البريد أو الانتظار قليلا حتى تقوم الإدارة بالتفعيل
منتدى التحكم الآلي والإلكترونيات

Automatic control , PLC , Electronics , HMI , Machine technology development , Arabic & Islamic topics , Management studies and more
 
الرئيسيةالبوابة*مكتبة الصوراليوميةس .و .جبحـثالتسجيلالأعضاءالمجموعاتدخول

شاطر | 
 

 شرح بسيط ل indirect addressing

استعرض الموضوع السابق استعرض الموضوع التالي اذهب الى الأسفل 
كاتب الموضوعرسالة
marocautomatique
عريف
عريف


عدد الرسائل : 16
العمر : 28
تاريخ التسجيل : 07/07/2014

مُساهمةموضوع: شرح بسيط ل indirect addressing   الثلاثاء 12 مايو 2015 - 9:14

الطريقة اﻷكثر شيوعا للعنونة في step7 هي بدون الشك العنونة المباشرة و العنونة بالرموز symbolic addressing, في هذه الحالة تكون الذاكرة المراد استعمالها معروفة مسبقا و هذه أمثلة للعنونة المباشرة :

INPUT : I0.0; IB10; IW20; ID40

OUTPUT : Q0.0; QB30; QW50; QD60

MARKERS : M124.0; MB132; MW200; MD300

TIMERS: T2; T54

COUNTERS : C30

LOCAL : L0.1; LB52; LW300; LD30

DATA BLOCK : DB5.DBX4.0; DB6.DBB2; DB20.DBW6; DB60.DBD4

لكن قد يقتضي الامر استعمال العنونة غير المباشرة و ذلك لعدة اسباب نذكر منها على سبيل المثال لا الحصر :

تقليص عدد التعليمات في برنامج ما و بالتالي تقليص حجم البرنامج

تمرير البيانات الغير معروفة حتى وقت التشغيل

مع هذا يبقى استعمال العنونة غير المباشرة محفوفا بالمخاطر ان صح التعبير لاسيما و ان استعماله بدون حذر قد يؤدي الى تجاوب غير منتضر من قبل الحاكم المنطقى زد على ذلك ان تتبع الاعطال يصبح اكثر صعوبة

لذلك يتوجب استعماله بحذر و ان يستعمل في العمليات الحسابية ان كانت هذه الاخيرة طويلة

سنستعرض ان شاء الله تعالى بعض الشروحات اللتى اود ان يصححها الاخ مدير هذا المنتدى او ان يعلق عليها على الاقل للتاكد من سلامتها من الاخطاء و ذلك لكي نقدم ان شاء الله مادة مفيدة.

و سوف استعرض في الاخير ان شاء الله برنامجا قمت بصياغته بعون الله و اللذي يشعل مخارج الحاكم الواحدة تلو الاخرى حيت يمكننا اختيار تردد اشتعال المخارج.


مميزات العنونة غير المباشرة كثيرة فهي تقلص عدد التعليمات بشكل ملحوظ و تستعمل ايضا في بعض الدوال المبرمجة مسبقا و التي توجد في step7 library كالدالة بلوك موڤ (BLOCK MOVE) التي تعمل على نقل و ارسال مساحات كبيرة من الذاكرة.

قبل ان نخوض في التفاصيل يجب ان نفهم اولا عنصرا مهما في البرمجة و اود من كل من له دراية بهذا الامر ان يدلي بدلوه حتى نصل الى شرح ممل لهذا الجزء الذي هو المؤشر the pointer

THE POINTER

هذا العنصر المهم الذي لا يتجزء عن البرمجة و هو يستعمل لتشكيل عدد يستعمل في شكل عنوان عوضا عن قيمة، هذا يعني ان العدد او القيمة المخزنة في المؤشر هي عنوان لمكان ما في الذاكرة و ليست قيمة محضة و يكتب المؤشر مسبوقا ب #P

اذن فالمؤشر يحوي عنوان لذاكرة ما قد تكون مدخل، مخرج، ميركر، داتا بلوك، جزء من داتا بلوك، عداد، تايمر الخ و تنقسم المؤشرات في step7 الى 3 انواع :




1-Memory Indirect Addressing

اول طريقة لاستخدام العنونة غير المباشرة هي memory indirect addressing حيث انها تسمح لذاكرة ما ان تحدد او ان تؤشر لعنوان ذاكرة اخرى و تستعمل بهذا الشكل :
[operation identifier [memory

مثلا              [L     T  [MW2  

و هذا يعني : حمل قيمة التايمر اللذي رقمه متواجد في MW2 فلو كانت القيمة المخزنة في MW2 تساوي 4 مثلا فسوف يحمل قيمة الزمن المتواجدة في T4.

عند استعمال هذه الطريقة يجب مراعاة نوع البيانات التي نتعامل معها ف مثلا عند التعامل مع  T, C, DB, DI, FB and FC يجب ان يكون حجم الذاكرة المستخدمة للإشارة الى العناوين السابق ذكرها 16 بت اي WORD لذلك فقد استخدمت MW2 و لم استخدم MB2.

هذه بعض الامثلة:

                 L 5
            T MW2  
       [L T [MW2

حمل القيمة 5 في ACCU1

ارسل محتوى ACUU1  الى MW2

حمل قيمة التايمر المحدد بواسطة MW2 اي T5


[OPN DB [#DB_Temp

إفتح الداتا بلوك اللذي رقمه موجود في المتغير DB_Temp#


[CALL FC[MW6

نادي على الدالة المشار اليها بالرقم المتواجد في MW6

هذا في ما يخص T, C, DB, DI, FB and FC. اما بالنسبة لI, Q, M, L, DB فينطبق عليهم ما ينطبق على ما سبق باستثناء استعمال ذاكرة بحجم 32-bits بدلا من 16-bits

و هذه بعض الامثلة :

L P#0.5
T MD4
[A I[MD4
[Q[MD4=

حمل ACUU1 بالمؤشر P#0.5

ارسل محتوى ACUU1 الى MD4

إستجوب المدخل المشار إليه بواسطة MD4 في هذه الحالة I0.5

ارسل حالة المدخل I0.5 الى المخرج Q0.5

OPN DB   3

L P#4.0

T #TempPointer

[L DBW [#TempPointer

L 0

D<

افتح الداتا بلوك DB3

حمل المؤشر P#4.0  في ACUU1

ارسل المؤشر الى الذاكرة المؤقته TempPointer#

حمل WORD اللذي رقمه موجود داخل الذاكرة المؤقته TempPointer#

العمليات على المؤشرات :

يمكن تطبيق الجمع على المؤشرات بإستخدام التعليمة D+ و المثال التالي يوضح ذلك :

L P#3.0

L P#4.0

D+

T MD 6            //الآن تحتوي MD6 على  P#7.0


لكن هنا يجب ان لا ننسا ان البت لا يتجاوز العدد 7 لذلك فإن

  P 9.0  =  P# 6.7 + P# 2.1  

و ليس
   P# 8.8



The Address Registers

بالإضافة الى ACCU1 and ACCU2 يوجد هناك اثنين Address registers بسعة 32 بت لتخزين المؤشرات POINTERS المستعملة في العنونة غير المباشرة بإستعمال طريقة register indirect addressing

و  هذه هي التعليمات المستعملة مع







و ما ينطبق على AR1 في ما يخص التعليمات و العلميات ينطبق تماما على AR2


Area-Internal Register Indirect Addressing


هذه الطريقة تستعمل واحدا من (Address registers (AR1 or AR2 بالإضاعة الى مؤشر pointer لتحديد العنوان address الذي ستعمل عليه التعليمة instruction

و تستعمل هذه الطريقة بهذا الشكل :

[address identifier [address register (ar1 or ar2) , pointer

The address identifier يمكن ان يكون  DOUBLE WORD, WORD, BYTE, BIT, DB, DI, L, M, Q, I

يجب ان نحمل بمؤشر (يشير الى العنوان المراد التعامل معه) من نوع  DW اي 32 بت بدون ذكر address identifier بعد ذلك نحصل على العنوان الحقيقي بعد اضافة المؤشر الذي يحدد offset و هذا مثال على ما سبق ذكره :




           
            L P#0.7

                     LAR1

[A I [AR1, P#0.0

   [Q [AR1, P#1.1  =


حمل المؤشر P#0.7 في ACCU1

حمل AR1 بما في داخل ACCU1

إستجوب حالة المدخل  I0.7

ارسل حالة المدخل I0.7 إلى المخرج Q2.0  

لاحظ ان القيمة التي كانت في AR1 هي P#0.7 و بعد إضافة ال OFFSET الذي يساوي P#1.1 اصبح العنوان المراد الإشارة إليه هو 2.0 #P                  

0.7 #P#1.1  +P


لذلك فقد اشار البرنامج للمخرج Q2.0 في السطر الرابع



Area-Crossing Register Indirect Addressing

هذه الطريقة مشابهة لطريقة  Area-Internal Register Indirect Addressing بإستثناء ان المؤشر المستعمل هنا يكون محملا مسبقا بنوع الذاكرة المراد التعامل معها، لاحظ انه في الطريقة السابقة حملنا المؤشر برقم فقط لكن في هذه الطريقة سنحمله بنوع الذاكرة ايضا اي  I, Q, M, DB...

و هذا مثال على ذلك :

        L P#I0.7

                  LAR1

   L P#Q124.0

                 LAR2

[A [AR1, P#0.0

[AR2, P#1.1]      =

حمل ACCU1 بالمؤشرP#I0.7

حمل AR1 بمحتوى ACCU1

حمل ACCU1 بالمؤشر   P#Q124.0

حمل AR2 بمحتوى ACUU1

إستجوب حالة المدخل  I0.7

ارسل حالة المدخل I0.7 إلى Q124.0




L P#M0.0

LAR1

[L W [AR1, P#10.0


حمل ACUU1 بالمؤشر P#M0.0

حمل AR1 بمحتوى ACCU1

حمل WORD الذي عنوانه محدد بمحتوى AR1 زائد 10 BYTES






هكذا إخواني نكون قد إستعرضنا مختلف الطرق للعنونة غير المباشرة في STEP7. اتمنى ان ينال الموضوع إعجابكم إن لم يكن ذلك فاتمنى على الاقل ان اسمع بعض التعليقات إجابية كانت او سلبية و ذلك لنجدد ما يمكن تحسينه.

و هذا مضمون البرنامج الذي انشئته و الذي ارغب ان اترك لكم بعض الوقت للتفكير في حل له بإستعمال  indirect addressing :

لنفترض انه لدينا مخرج  QW0

نريد عند RUNTIME ان نشعل اللمبة Q0.0 ثم بعد وقت وجيز جدا نريد ان نشعل  Q0.1 ثم  Q0.2 و هكذا على ان تبقى اللمبات التي سبق إشعالها مشتعلة

عند إشتعال جميع اللمبات QW0= ffff نريد ان نطفئ جميع اللمبات و نكرر الامر من جديد

كما نريد ان نستطيع تغير الوقت الذي تشتعل فيه اللمبة بعد التي سبقتها بإستعمال MARKER CLOCK



نسيت ان اذكر بانه يمكننا ان نحول DOUBLE INTEGER إلى POINTER فقط بعمل شيفت إلى اليسار ب 3 بت او بضربه في 8

و ذلك باستعمال التعليمة  SLD


و سوف ادرج كود البرنامج مرفوقا بالبرنامج كاملا بعد فترة إن شاء الله تعالى

إخوكم عبد الرحيم من المغرب
الرجوع الى أعلى الصفحة اذهب الى الأسفل
معاينة صفحة البيانات الشخصي للعضو
marocautomatique
عريف
عريف


عدد الرسائل : 16
العمر : 28
تاريخ التسجيل : 07/07/2014

مُساهمةموضوع: رد: شرح بسيط ل indirect addressing   الأحد 17 مايو 2015 - 14:26

الم يتوصل احد للحل بعد أم ان الموضوع لم يلفت انتباه احد؟
الرجوع الى أعلى الصفحة اذهب الى الأسفل
معاينة صفحة البيانات الشخصي للعضو
marocautomatique
عريف
عريف


عدد الرسائل : 16
العمر : 28
تاريخ التسجيل : 07/07/2014

مُساهمةموضوع: رد: شرح بسيط ل indirect addressing   الإثنين 18 مايو 2015 - 14:14

كما وعدتكم سوف ادرج انشاء الله كود البرنامج الذي يشعل اللمبات الواحدة تلو الأخرى و ذلك مع امكانية اختيار التردد او وقت اشتعال اللمبة الموالية ان صح التعبير و هذا بالطبع بإستعمال العنونة غير المباشرة بإذن الله

اولا لابد ان اوضح امرا لإخواننا الملتحقين الجدد، في هذا البرنامج تم إستخدام clock memory و هى خاصية تمكننا من إستخدام 8 مخارج تصبح 1 و 0 بتناوب طوال الوقت و وفقا لتردد معين و هذه الصورة توضح ذلك




كما يجب الإشارة انه يمكننا إختيار اي memory من نوع MB لهذا الغرض، و ذلك بضبط إعدادات CPU




في هذه الصورة إستعملت البايت 0 لكن في البرنامج استعملت البايت 100, كما سبق و قلت يمكننا إستخدام أي بايت أخر مع الحذر الا نستعمله مرة اخرى في البرنامج نفسه


و الآن دعونا نستعرض كود البرنامج الذي يتكون ككل برامج ستپ 7 من OB1 حيث تقوم بقراءة و تنفيذ كل ما بداخله, و في OB1 اقوم بإستدعاء FC1 التي ستقوم بإشعال اللمبات وفقا ل الغوريثم محدد.

تتكون FC1 من networks 2 و هذا محتوى network 1






في هذا الجزء من البرنامج استعملت 2 ذاكرات MD10 و MB20, الاولى اي MD10 لتخزين البونتر الذي يشير الى البايت 100 و هي لن تتغير مادمنا  حددنا clock memory في الذاكرة MB100

و MB20 لإختيار البت المناسب لضبط التردد او الوقت الذي تشتعل عنده اللمبات.

فلنبدأ التعليق على محتوى كل سطر :

حمل البونتر P#100.0 داخل  ACUU1

ارسل محتوى ACUU1 إلى الذاكرة MD10

تحقق ان قيمة الذاكرة MB20 اكبر من او تساوي 0 و اصغر من او تساوي 7 : في هذه الذاكرة إخواني سنقوم بإدخال البت الخاص بالتردد المراد إستعماله، كما سبق و ذكرت فالترددات الممكن إستعمالها في هذه الطريقة محصورة في ثمانية ترددات فقط.

إذا كانت القيمة المدخلة إلى MB20 اصغر من 0 او اكبر من 7 إقفز إلى 003_

إ ذا كانت القيمة المدخلة إلى MB20 محصورة بين 0 و 7 ا ضف محتوى MD10 إلى MB20 و ارسل النتيجة إلى الذاكرة TEMPORARY المسماة FREQUENCY #

إذا تحقق شرط القفز إلى 003_  فلن يحدث شيء لاننا إستعملنا التعليمة NOP 0.


هذا في ما يخص النتوورك الاول من البرنامج و الذي يقوم بتحديد الذاكرة التي سيشتغل عليها البرنامج لتنفيد الاوامر المتعلقة بإشعال اللمبات.


هذه صورة network 2  :





ساكمل التعليق على هذا الكود غدا إن شاء الله تعالى


عدل سابقا من قبل marocautomatique في الثلاثاء 19 مايو 2015 - 15:47 عدل 5 مرات
الرجوع الى أعلى الصفحة اذهب الى الأسفل
معاينة صفحة البيانات الشخصي للعضو
mr/slc500
فريق أول
فريق أول
avatar

عدد الرسائل : 5693
العمر : 38
الموقع : EgyPt OlDeSt schOol in the wOrlD
العمل/الترفيه : عندما تنتفض الامة ستكون البيعة على تراب فلسطين
تاريخ التسجيل : 21/11/2010

مُساهمةموضوع: رد: شرح بسيط ل indirect addressing   الإثنين 18 مايو 2015 - 17:10

جزاك الله كل خير
الرجوع الى أعلى الصفحة اذهب الى الأسفل
معاينة صفحة البيانات الشخصي للعضو http://WwW.islamway.Com
marocautomatique
عريف
عريف


عدد الرسائل : 16
العمر : 28
تاريخ التسجيل : 07/07/2014

مُساهمةموضوع: رد: شرح بسيط ل indirect addressing   الأربعاء 20 مايو 2015 - 8:46

لنبدا التعليق على النتوورك الثاني :

في السطر الاول احمل حالة المخارج من Q0.0 إلى Q1.7 اي QW0 في ACUU1

حمل القيمة W#16#FFFF اي 2#1111111111111111 بالبايناري في ACCU1

قارن حالة QW0 و القيمة W#FFFF

اذا كانت قيمة QW0 مختلفة عن W#16#FFFF اقفز الى 001_

اذا كانت قيمة QW0 تساوي W#16#FFFF :

حمل 0 في ACCU1

ارسل محتوى ACCU1 إلى الذاكرة INDEX# التى هي من نوع TEMPORARY

ارسل محتوى ACCU1 إلى QW0 اي قم بتصفير جميع المخارج من Q0.0 إلى Q1.7

إذا تحقق شرط القفز :

إستجوب حالة الذاكرة المشار إليها بالقيمة المخزنة في FREQUENCY# و التي تحتوي عنوان البت المناسب للذاكرة MB100

Detect the positive edge of the selected memory إذا لم نستعمل FP فإن PLC سيقوم بإشعال اللمبات وفقا ل SCAN TIME إلا اذا كان زمن SCAN  اطول من تردد البت المختار

إذا تحقق شرط القفز و الذي هو في حالة ان تكون حالة البت المختار 0 في  clock memory فإن البرنامج سيقفز إلى 002_

اما إذا كانت حالة البت 1 فإن البرنامج سيكمل البرنامج بعد تعليمة القفز :

حمل قيمة INDEX# في LAR1 ( قيمة INDEX# الاولية هي 0)

إعمل SET للمخرج الذي عنوانه محدد بمحتوى LAR1

حمل INDEX# في ACCU1

اضف 1 إلى القيمة المتواجدة ب ACUU1

ارسل القيمة الجديدة إلى INDEX#

الرجوع الى أعلى الصفحة اذهب الى الأسفل
معاينة صفحة البيانات الشخصي للعضو
marocautomatique
عريف
عريف


عدد الرسائل : 16
العمر : 28
تاريخ التسجيل : 07/07/2014

مُساهمةموضوع: رد: شرح بسيط ل indirect addressing   الخميس 21 مايو 2015 - 8:38

الرجوع الى أعلى الصفحة اذهب الى الأسفل
معاينة صفحة البيانات الشخصي للعضو
marocautomatique
عريف
عريف


عدد الرسائل : 16
العمر : 28
تاريخ التسجيل : 07/07/2014

مُساهمةموضوع: رد: شرح بسيط ل indirect addressing   الخميس 21 مايو 2015 - 8:58

ارجو من كل من وجد لبسا او غلطا في المحتوى ان لا يتردد في مشاركتي رأيه، فقد كنت متوقعا مشاركات و مناقشات في الموضوع لكن مع الاسف ربما لم ينشر الموضوع بالطريقة المناسبة، على كل حال اتمنى ان اكون حققت و لو جزء بسيط في شرح indirect adressing و السلام عليكم و رحمته تعالى و بركاته.
الرجوع الى أعلى الصفحة اذهب الى الأسفل
معاينة صفحة البيانات الشخصي للعضو
Online
ملازم
ملازم


عدد الرسائل : 70
العمر : 32
تاريخ التسجيل : 16/01/2015

مُساهمةموضوع: رد: شرح بسيط ل indirect addressing   الخميس 21 مايو 2015 - 14:08

الرجوع الى أعلى الصفحة اذهب الى الأسفل
معاينة صفحة البيانات الشخصي للعضو
marocautomatique
عريف
عريف


عدد الرسائل : 16
العمر : 28
تاريخ التسجيل : 07/07/2014

مُساهمةموضوع: رد: شرح بسيط ل indirect addressing   الجمعة 22 مايو 2015 - 1:28

Indeed most of the content of what i showed and explained was token from that link that u posted, thus where is the problem?
Regards
الرجوع الى أعلى الصفحة اذهب الى الأسفل
معاينة صفحة البيانات الشخصي للعضو
Online
ملازم
ملازم


عدد الرسائل : 70
العمر : 32
تاريخ التسجيل : 16/01/2015

مُساهمةموضوع: رد: شرح بسيط ل indirect addressing   الجمعة 22 مايو 2015 - 3:17

Hello
Thanks for your explaining in this topic
I add the previous link for extra benfit
الرجوع الى أعلى الصفحة اذهب الى الأسفل
معاينة صفحة البيانات الشخصي للعضو
marocautomatique
عريف
عريف


عدد الرسائل : 16
العمر : 28
تاريخ التسجيل : 07/07/2014

مُساهمةموضوع: رد: شرح بسيط ل indirect addressing   الجمعة 22 مايو 2015 - 5:04

Thank for your reminding, i would love if someone explain how to handle the ANY parameters in step7 and give an example of the use of them.

Regards
الرجوع الى أعلى الصفحة اذهب الى الأسفل
معاينة صفحة البيانات الشخصي للعضو
RAMA
رائد
رائد


عدد الرسائل : 276
العمر : 47
الموقع : almadinah almnora
العمل/الترفيه : PLC PROGRAMMER
تاريخ التسجيل : 25/06/2008

مُساهمةموضوع: رد: شرح بسيط ل indirect addressing   السبت 30 مايو 2015 - 3:36

الاخ عبد الرحيم
موضوع اكثر من ممتاز ومجهود تشكر عليه
واذا كان لديك امثلة اخرى الرجاء ادرجها
من اجل فهم الموضوع بشكل افضل
الرجوع الى أعلى الصفحة اذهب الى الأسفل
معاينة صفحة البيانات الشخصي للعضو
marocautomatique
عريف
عريف


عدد الرسائل : 16
العمر : 28
تاريخ التسجيل : 07/07/2014

مُساهمةموضوع: رد: شرح بسيط ل indirect addressing   الإثنين 1 يونيو 2015 - 3:20

شكرا اخي ساحاول إن شاء الله إدراج المزيد من الامثلة كلما اتيحت الفرصة
الرجوع الى أعلى الصفحة اذهب الى الأسفل
معاينة صفحة البيانات الشخصي للعضو
marocautomatique
عريف
عريف


عدد الرسائل : 16
العمر : 28
تاريخ التسجيل : 07/07/2014

مُساهمةموضوع: رد: شرح بسيط ل indirect addressing   الأربعاء 3 يونيو 2015 - 8:50

كما وعدت هذا مثال اخر نستعمل فيه العنونة بدون ان يكون لنا الإختيار فمن الصعب عمل ما ساتكلم عليه لاحقا في الكود بالطريقة التقليدية إن لم يكن مستحيلا و هذا كود البرنامج





سوف اكمل شرح ما يفعله الكود لاحقا إن شاء الله


هذا الكود الذي ادرجته هو جزء من برنامج لمخزن اوتوماتيكي AUTOMATIC WHAREHOUSE مصمم بواسطة برنامج لمحاكاة الانظمة الاوتوماتيكية و إسم البرنامج هو ITS MHJ لشركة البرامج REAL GAMES. طبعا البرنامج موجود على الإنترنت و هناك فيديوهات على اليوتوب تعرض هذا البرنامج










لن اخوض في تفاصيل البرنامج و ساقتصر الشرح فقط على الكود الذي وضعته اعلاه على ان اعود لبرنامج ITS MHJ في وقت لاحق عندما تسمح الظروف، إذن كما قلت هذا الكود هو جزء من البرنامج الذي يتحكم في مخزن اوتوماتيكي، يحتوي المخزن على 50 رف لإحتواء صناديق او شيء من هذا القبيل بالإضافة إلى عربتين واحدة للتزويد الرفوف بالصناديق و الاخرى لتسليم الصناديق التي تم إخراجها من المخزن، و يتكون ايضا من رافعة عمودية يمكنها الحركة يمينا و يسارا إلى الاعلى و إلى الاسفل و يمكنها إدخال الصناديق داخل الرفوف





اتمنا ان تكون الامور واضحة إلى حد الان


و الان سابدا التطرق إلى محتوى الكود :


اولا قمت بإنشاء ARRAY ل 50 بت داخل DB1 كل بت يمثل رف محددا بعناية :






بواسطة كود اخر استطيع ان اعمل set لبت ما و الذي يعني ان الرف الذي يقابل هذا البت محجوز او يحتوي صندوقا  و كل بت حالته صفر يعني انه فارغ و جاهز لإستقبال صندوق ما [/b


إذن في السطر الاول اقوم بفتح الداتا بلوك 1 الذي اسميته RACK :

                       "OPN "RACK

                 L     P#DBX 0.0                حمل بونتر الذي يشير إلى اول بت من الداتا بلوك 1

             T     #myPOINTER                ارسل البونتر إلى الذاكرة المؤقتة myPOINTER

                           L     50                حمل القيمة 50 (التي سنستعملها لعمل لووب )



لنكمل لاحقا إن شاء الله و المرجو ممن لا يدرون ما هي LOOP ان يبحتو في الموضوع فهي بسيطة لكنها مهمة في كتير من التطبيقات
الرجوع الى أعلى الصفحة اذهب الى الأسفل
معاينة صفحة البيانات الشخصي للعضو
marocautomatique
عريف
عريف


عدد الرسائل : 16
العمر : 28
تاريخ التسجيل : 07/07/2014

مُساهمةموضوع: رد: شرح بسيط ل indirect addressing   الخميس 4 يونيو 2015 - 6:35

لنكمل شرح الكود :

بعد ان قمت بتحميل القيمة 50 التي ستستعمل لتكرير جزء من هذا البرنامج 50 مرة (و هذا هو عدد الرفوف الموجود بالمخزن)

L     50                حمل القيمة 50

T     #COUNT        ارسل هذه القيمة (50) إلى الذاكرة المؤقتة  COUNT#

LAR1  #myPOINTER   حمل رجيستر العنونة AR1 بالقيمة الموجودة في myPOINTER#

[A     DBX [AR1,P#0.0          إستجوب حالة البت الذي عنوانه موجود داخل AR1 (في البداية يبدأ الكود بإستجواب أول بت في ال ARRAY  يعني  [1]RACK او DB1.DBX0.0)

إذا كان البت الاول 0 او بمعنى آخر فارغا (إذا إفترضنا ان البت الاول يمثل الرف رقم 1) فإن الكود سيكمل البرنامج إلى السطر الذي يتلو تعليمة القفز JC _001


و بالتالي سوف يحمل قيمة البونتر الذي يشير إلى البت الفارغ :   L     #myPOINTER

و سوف يرسل هذه القيمة إلى الذاكرة   Arack_address# :

T     #Arack_address     ( تعني Arack_address تعني address of the available rack)

(و ساستعمل هذه القيمة اي Arack_address لتوجيه الرافعة إلى الرف الفارغ بواسطة كود اخر)


اما إذا كانت حالة البت السابق ذكره 1 اي ان الرف غير شاغر فإن تعليمة القفز سوف تأخد البرنامج إلى 001_

و بالتالي ساحمل البونتر الذي اشار إلى بت غير شاغر و سأضيف عليه 1 لكي ينتقل البرنامج إلى الرف الموالي :

L     #myPOINTER  

INC   1  (اضف 1 إلى قيمة البونتر)

T     #myPOINTER ارسل القيمة الجديدة إلى الذاكرة  myPOINTER#

بما اننا صادفنا بت غير شاغر فيجب ان نكرر العملية إلى ان نجد بت فارغ لإستقبال صندوق جديد و هنا يكمن سر إستخدام لووب

L     #COUNT  إحمل قيمة التكرير (اي كم مرة اريد ان يكرر هذا الجزء المحصور بين _003: T     #COUNT  و  LOOP _003)

LOOP  _003  تقوم هذه التعليمة بطرح العدد 1 من قيمة التكرير COUNT# ثم ترسل البرنامج ليبدأ من الجزء 003_ و من هنا جائت التسمية لووپ اي في حلقة

عند إكتمال عدد المرات التي يعيد فيها الكود الجزء المعين يعود البرنامج لسيرورته الطبيعية و يبدأ من أول سطر من جديد
الرجوع الى أعلى الصفحة اذهب الى الأسفل
معاينة صفحة البيانات الشخصي للعضو
marocautomatique
عريف
عريف


عدد الرسائل : 16
العمر : 28
تاريخ التسجيل : 07/07/2014

مُساهمةموضوع: رد: شرح بسيط ل indirect addressing   الخميس 4 يونيو 2015 - 7:10

اود من كل من له تساؤل او لبس ان لا يجد حرجا في السؤال فما أوتينا من العلم إلا قليلا ، كما اود ان ادعو الجميع إلى التفاعل مع الموضوع لأنه هام جدا فظني انه لا يمكن ان نبلغ درجة من الفهم و الإتقان لانضمة التحم الاوتوماتيكي دون ان نلمس هذا الجانب، كما اريد ان يتفضل احد الإخوة ممن سبق لهم التعامل مع البونتر ا ن يقدمو شروحات في هذا الصدد
الرجوع الى أعلى الصفحة اذهب الى الأسفل
معاينة صفحة البيانات الشخصي للعضو
spyshow
مساعد
مساعد


عدد الرسائل : 46
العمر : 31
تاريخ التسجيل : 21/07/2011

مُساهمةموضوع: رد: شرح بسيط ل indirect addressing   الأحد 23 أغسطس 2015 - 4:48

شكرا جزيلا على هذا الموضوع المتقدم في برمجة ال PLC
الرجوع الى أعلى الصفحة اذهب الى الأسفل
معاينة صفحة البيانات الشخصي للعضو
eng_mo7amed_3ly
عقيد
عقيد
avatar

عدد الرسائل : 601
العمر : 34
الموقع : Egypt
العمل/الترفيه : Instrumentation & Automation Engineer
تاريخ التسجيل : 06/10/2011

مُساهمةموضوع: رد: شرح بسيط ل indirect addressing   الإثنين 24 أغسطس 2015 - 19:22

جزاكم الله خيرا زميلنا العزيز
الرجوع الى أعلى الصفحة اذهب الى الأسفل
معاينة صفحة البيانات الشخصي للعضو
metwally.mustafa
فريق أول
فريق أول
avatar

عدد الرسائل : 4222
العمر : 31
الموقع : Egypt
العمل/الترفيه : automation engineer
تاريخ التسجيل : 12/01/2009

مُساهمةموضوع: رد: شرح بسيط ل indirect addressing   الخميس 27 أغسطس 2015 - 9:52

جزاكم الله خيرا ....شرح رائع

_________________
I am so far behind, I think i am first
الرجوع الى أعلى الصفحة اذهب الى الأسفل
معاينة صفحة البيانات الشخصي للعضو
معتزمراد
ملازم
ملازم


عدد الرسائل : 85
العمر : 34
تاريخ التسجيل : 13/07/2011

مُساهمةموضوع: رد: شرح بسيط ل indirect addressing   الأربعاء 1 يونيو 2016 - 15:49

بارك الله فيك اخي عبد الرحيم فقد حللت عقدة من عقد siemens
فكثيرا ما يستخدم هذا الموشر في البرمجة وخصوصا في برمجة الربط بينsnemeis وبين باقي المنتجات مثل الrexrothe & allen bradleay .....................الخ
فبارك الله فيك على التبسيط والشرح المميز كما لاانسى الشكر الكبير للاخ ابو روان الذي سهل علينا الدخول الى جبل من العقد في siemens . سهل الله دربه الى الجنة واياكم
الرجوع الى أعلى الصفحة اذهب الى الأسفل
معاينة صفحة البيانات الشخصي للعضو
 
شرح بسيط ل indirect addressing
استعرض الموضوع السابق استعرض الموضوع التالي الرجوع الى أعلى الصفحة 
صفحة 1 من اصل 1

صلاحيات هذا المنتدى:لاتستطيع الرد على المواضيع في هذا المنتدى
منتدى التحكم الآلي والإلكترونيات :: منتديات الحاكمات المنطقية PLC :: منتدى الدورات التدريبية PLC-
انتقل الى: