| شرح بسيط ل indirect addressing | |
|
+4RAMA Online mr/slc500 marocautomatique 8 مشترك |
كاتب الموضوع | رسالة |
---|
marocautomatique عريف
عدد الرسائل : 16 العمر : 34 تاريخ التسجيل : 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.8The 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 العمر : 34 تاريخ التسجيل : 07/07/2014
| موضوع: رد: شرح بسيط ل indirect addressing الأحد 17 مايو 2015 - 14:26 | |
| الم يتوصل احد للحل بعد أم ان الموضوع لم يلفت انتباه احد؟ | |
|
| |
marocautomatique عريف
عدد الرسائل : 16 العمر : 34 تاريخ التسجيل : 07/07/2014
| موضوع: رد: شرح بسيط ل indirect addressing الإثنين 18 مايو 2015 - 14:14 | |
|
عدل سابقا من قبل marocautomatique في الثلاثاء 19 مايو 2015 - 15:47 عدل 5 مرات | |
|
| |
mr/slc500 فريق أول
عدد الرسائل : 5693 العمر : 44 الموقع : EgyPt OlDeSt schOol in the wOrlD العمل/الترفيه : عندما تنتفض الامة ستكون البيعة على تراب فلسطين تاريخ التسجيل : 21/11/2010
| موضوع: رد: شرح بسيط ل indirect addressing الإثنين 18 مايو 2015 - 17:10 | |
| | |
|
| |
marocautomatique عريف
عدد الرسائل : 16 العمر : 34 تاريخ التسجيل : 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 العمر : 34 تاريخ التسجيل : 07/07/2014
| موضوع: رد: شرح بسيط ل indirect addressing الخميس 21 مايو 2015 - 8:38 | |
| و هذا ملف البرنامج مرفقا
https://drive.google.com/file/d/0B0MLsWsQwi3vYzRYcVNCOS1oVmM/view?usp=sharing | |
|
| |
marocautomatique عريف
عدد الرسائل : 16 العمر : 34 تاريخ التسجيل : 07/07/2014
| موضوع: رد: شرح بسيط ل indirect addressing الخميس 21 مايو 2015 - 8:58 | |
| ارجو من كل من وجد لبسا او غلطا في المحتوى ان لا يتردد في مشاركتي رأيه، فقد كنت متوقعا مشاركات و مناقشات في الموضوع لكن مع الاسف ربما لم ينشر الموضوع بالطريقة المناسبة، على كل حال اتمنى ان اكون حققت و لو جزء بسيط في شرح indirect adressing و السلام عليكم و رحمته تعالى و بركاته. | |
|
| |
Online ملازم
عدد الرسائل : 70 العمر : 38 تاريخ التسجيل : 16/01/2015
| موضوع: رد: شرح بسيط ل indirect addressing الخميس 21 مايو 2015 - 14:08 | |
| Kindly have a look at this link http://www.plcdev.com/siemens_s7_indirect_addressing | |
|
| |
marocautomatique عريف
عدد الرسائل : 16 العمر : 34 تاريخ التسجيل : 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 العمر : 38 تاريخ التسجيل : 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 العمر : 34 تاريخ التسجيل : 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 العمر : 53 الموقع : almadinah almnora العمل/الترفيه : PLC PROGRAMMER تاريخ التسجيل : 25/06/2008
| موضوع: رد: شرح بسيط ل indirect addressing السبت 30 مايو 2015 - 3:36 | |
| الاخ عبد الرحيم موضوع اكثر من ممتاز ومجهود تشكر عليه واذا كان لديك امثلة اخرى الرجاء ادرجها من اجل فهم الموضوع بشكل افضل | |
|
| |
marocautomatique عريف
عدد الرسائل : 16 العمر : 34 تاريخ التسجيل : 07/07/2014
| موضوع: رد: شرح بسيط ل indirect addressing الإثنين 1 يونيو 2015 - 3:20 | |
| شكرا اخي ساحاول إن شاء الله إدراج المزيد من الامثلة كلما اتيحت الفرصة | |
|
| |
marocautomatique عريف
عدد الرسائل : 16 العمر : 34 تاريخ التسجيل : 07/07/2014
| موضوع: رد: شرح بسيط ل indirect addressing الأربعاء 3 يونيو 2015 - 8:50 | |
| | |
|
| |
marocautomatique عريف
عدد الرسائل : 16 العمر : 34 تاريخ التسجيل : 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 العمر : 34 تاريخ التسجيل : 07/07/2014
| موضوع: رد: شرح بسيط ل indirect addressing الخميس 4 يونيو 2015 - 7:10 | |
| اود من كل من له تساؤل او لبس ان لا يجد حرجا في السؤال فما أوتينا من العلم إلا قليلا ، كما اود ان ادعو الجميع إلى التفاعل مع الموضوع لأنه هام جدا فظني انه لا يمكن ان نبلغ درجة من الفهم و الإتقان لانضمة التحم الاوتوماتيكي دون ان نلمس هذا الجانب، كما اريد ان يتفضل احد الإخوة ممن سبق لهم التعامل مع البونتر ا ن يقدمو شروحات في هذا الصدد | |
|
| |
spyshow مساعد
عدد الرسائل : 47 العمر : 38 تاريخ التسجيل : 21/07/2011
| موضوع: رد: شرح بسيط ل indirect addressing الأحد 23 أغسطس 2015 - 4:48 | |
| شكرا جزيلا على هذا الموضوع المتقدم في برمجة ال PLC | |
|
| |
eng_mo7amed_3ly عقيد
عدد الرسائل : 601 العمر : 40 الموقع : Egypt العمل/الترفيه : Instrumentation & Automation Engineer تاريخ التسجيل : 06/10/2011
| موضوع: رد: شرح بسيط ل indirect addressing الإثنين 24 أغسطس 2015 - 19:22 | |
| جزاكم الله خيرا زميلنا العزيز | |
|
| |
metwally.mustafa فريق أول
عدد الرسائل : 4226 العمر : 38 الموقع : Egypt العمل/الترفيه : automation engineer تاريخ التسجيل : 12/01/2009
| موضوع: رد: شرح بسيط ل indirect addressing الخميس 27 أغسطس 2015 - 9:52 | |
| جزاكم الله خيرا ....شرح رائع _________________ I am so far behind, I think i am first
| |
|
| |
معتزمراد ملازم أول
عدد الرسائل : 91 العمر : 40 تاريخ التسجيل : 13/07/2011
| موضوع: رد: شرح بسيط ل indirect addressing الأربعاء 1 يونيو 2016 - 15:49 | |
| بارك الله فيك اخي عبد الرحيم فقد حللت عقدة من عقد siemens فكثيرا ما يستخدم هذا الموشر في البرمجة وخصوصا في برمجة الربط بينsnemeis وبين باقي المنتجات مثل الrexrothe & allen bradleay .....................الخ فبارك الله فيك على التبسيط والشرح المميز كما لاانسى الشكر الكبير للاخ ابو روان الذي سهل علينا الدخول الى جبل من العقد في siemens . سهل الله دربه الى الجنة واياكم | |
|
| |
| شرح بسيط ل indirect addressing | |
|