تلعب تكنولوجيا الحصول على البيانات دورا هاما في التحكم الصناعي والأتمتة وغيرها من المجالات. العملية العامة لجمع البيانات هي كما يلي:
①أرسل أمر اختيار القناة إلى بطاقة الالتقاط. ②حدد رقم القناة المراد جمعها. ③بدء التحويل A/D. ④انتظر حتى يكتمل التحويل. ⑤قراءة البيانات من بطاقة الاستحواذ. بالنسبة للاقتناء متعدد القنوات، يتم استخدام طريقتين بشكل عام في تصميم البرنامج. طريقة الاستعلام أو طريقة المقاطعة. ما يسمى بطريقة الاستعلام هو استخدام حلقة لجمع كل قناة بيانات بالتسلسل. ميزة طريقة الاستعلام هي أن البرنامج بسيط وسهل التنفيذ، والعيب هو أنه أثناء عملية التجميع، تقضي وحدة المعالجة المركزية معظم وقتها في الانتظار، مما يؤدي إلى إهدار الموارد. تعتمد طريقة المقاطعة شكل مقاطعة الأجهزة - ابدأ أولاً التحويل A/D، وأرسل إشارة مقاطعة في نهاية التحويل - تقرأ وحدة المعالجة المركزية البيانات المجمعة عند الاستجابة لمقاطعة بيانات الاستحواذ. بهذه الطريقة، أثناء انتظار التحويل، يمكن لوحدة المعالجة المركزية إجراء عمليات حسابية أخرى دون أن تكون في حالة انتظار. ميزة طريقة المقاطعة هي أنه يمكن استخدام الموارد بالكامل، ومع ذلك، فإن تصميم البرنامج معقد، خاصة عندما تكون موارد مقاطعة أجهزة النظام محدودة، فمن السهل التسبب في تعارضات المقاطعة، بالإضافة إلى ذلك، في أنظمة التشغيل مثل Windows أو WIN95، لا يُسمح للمستخدمين بتثبيت وقت معالجات المقاطعة، ولا يمكن تحقيق ذلك.
---- الطريقتان اللتان تمت مناقشتهما أعلاه هما طريقتان تحت نظام DOS وتحت نظام التشغيل Win95، وهناك الآن طريقة أفضل - تقنية الخيوط المتعددة. الآن، يمكننا الاستفادة من تقنية الخيوط المتعددة لجمع البيانات.
---- 1. مزايا استخدام الخيوط المتعددة لجمع البيانات
---- الشيء الأكثر شيوعًا في Win95/98، إلى جانب الواجهة الجميلة، هو تعدد الخيوط والمهام المتعددة. في بيئة DOS، يمكن لبرنامج التنفيذ احتكار جميع الموارد في بيئة Windows، على الرغم من كونها بيئة بدائية متعددة المهام، إلا أن برنامجك لا يزال بإمكانه التحكم في كل وقت وحدة المعالجة المركزية طالما أردت. ومع ذلك، في نظامي التشغيل Windows 95 وWindows NT، لا يمكن للبرنامج احتكار كل وقت تنفيذ وحدة المعالجة المركزية. علاوة على ذلك، فإن البرنامج ليس سطرًا واحدًا من البداية إلى النهاية. على العكس من ذلك، يمكن تقسيم البرنامج إلى أجزاء برنامج متعددة أثناء التنفيذ وتنفيذها في وقت واحد. تسمى أجزاء البرنامج التي يمكن تنفيذها في وقت واحد بالخيوط. في نظامي التشغيل Windows 95 وWindows NT، يمكن لنظام التشغيل أن يتناوب في تنفيذ برامج متعددة في نفس الوقت، وهو ما يعد تعدد المهام.
---- يمكن أن يؤدي استخدام مؤشرات الترابط المتعددة لجمع البيانات إلى تسريع سرعة استجابة البرنامج بشكل فعال وزيادة كفاءة التنفيذ. يجب أن تقوم البرامج العامة بمعالجة إدخال المستخدم، ولكن بالمقارنة مع سرعة تنفيذ وحدة المعالجة المركزية، فإن سرعة إدخال المستخدم تشبه المشي أو الطيران. بهذه الطريقة، ستضيع وحدة المعالجة المركزية الكثير من الوقت في انتظار إدخال المستخدم (كما هو الحال في بيئة DOS). إذا تم استخدام مؤشرات الترابط المتعددة، فيمكن استخدام مؤشر ترابط واحد لانتظار إدخال المستخدم؛ ويمكن لمؤشر الترابط الآخر إجراء معالجة البيانات أو أعمال أخرى. بالنسبة لبرامج جمع البيانات، يمكن استخدام مؤشر ترابط منفصل لجمع البيانات. بهذه الطريقة، يمكن ضمان طبيعة التجميع في الوقت الفعلي إلى أقصى حد، بينما يمكن للخيوط الأخرى الاستجابة لعمليات المستخدم أو إجراء معالجة البيانات في الوقت المناسب. وبخلاف ذلك، لا يمكن للبرنامج الاستجابة لعمليات المستخدم عند جمع البيانات؛ ولا يمكنه جمع البيانات عند الاستجابة لعمليات المستخدم. خاصة عندما تكون كمية البيانات التي تم جمعها كبيرة وتكون مهمة معالجة البيانات ثقيلة، فإن الانتظار الطويل أثناء التجميع يكون مقبولًا جدًا إذا لم يتم استخدام مؤشرات الترابط المتعددة.
---- ومع ذلك، تعد تعدد العمليات أكثر تعقيدًا من البرمجة العادية. نظرًا لأنه قد يتم تنفيذ عدة سلاسل رسائل في نفس الوقت في أي وقت، فقد يتم تعديل العديد من المتغيرات والبيانات بواسطة سلاسل رسائل أخرى. هذه هي مشكلة التحكم في المزامنة الأكثر أهمية بين سلاسل العمليات في البرامج متعددة الخيوط.
---- 2. المشكلات التي يجب حلها عن طريق الخيوط المتعددة لجمع البيانات
---- في الواقع، تعقيد البرمجة متعددة الخيوط مؤقت؛ إذا كنت تستخدم لغة C التقليدية للتصميم متعدد الخيوط، فيجب عليك التحكم في المزامنة بين الخيوط بنفسك. سيكون ذلك معقدا. ومع ذلك، إذا كنت تستخدم أساليب التصميم الموجهة للكائنات واستخدمت دلفي للبرمجة متعددة الخيوط، فستكون المشكلة أبسط بكثير. وذلك لأن دلفي قد تعاملت مع تعقيد الخيوط المتعددة بالنسبة لنا، وكل ما يتعين علينا القيام به هو الميراث.
---- على وجه التحديد، يحتاج جمع البيانات متعددة الخيوط إلى إكمال العمل التالي:
---- ① اشتق فئتك SampleThread من فئة TThread. هذا هو الفصل الذي نستخدمه لجمع البيانات. عند التجميع، ما عليك سوى إنشاء مثيل لـ SampleThread.
---- ② قم بتحميل طريقة التنفيذ للفئة الفائقة TThread. في هذه الطريقة، سيتم تنفيذ مهمة جمع البيانات على وجه التحديد.
---- ③ إذا كنت تريد التجميع والعرض في نفس الوقت، فاكتب عدة عمليات لعرض تقدم التجميع لطريقة التنفيذ للاتصال.
----السمات/الأساليب الأكثر استخدامًا في فئة TThread هي كما يلي:
طريقة الإنشاء: إنشاء المنشئ
(إنشاء معلق: منطقي)؛
---- تحدد المعلمة CreateSuspending ما إذا كان سيتم تنفيذ مؤشر الترابط فورًا عند إنشائه. إذا كان صحيحًا، فسيتم تعليق الخيط الجديد بعد الإنشاء؛ وإذا كان خطأ، فسيتم تنفيذ الخيط مباشرة بعد الإنشاء.
خاصية FreeOnTerminate:
خاصية FreeOnTerminate: منطقية؛
---- تحدد هذه السمة ما إذا كان المبرمج مسؤولاً عن إلغاء هذا الموضوع. إذا كانت هذه الخاصية صحيحة، فسيقوم VCL تلقائيًا بتدمير كائن مؤشر الترابط عند انتهاء مؤشر الترابط. قيمته الافتراضية هي False.
خصائص OnTerminate:
الخاصية OnTerminate: TNotifyEvent;
---- تحدد هذه السمة الحدث الذي يحدث عند انتهاء مؤشر الترابط.
---- دعونا نلقي نظرة على مثال محدد:
---- 3. تنفيذ جمع البيانات متعددة الخيوط
---- هذا برنامج تم تطويره من قبل المؤلف لقياس مخطط أداء وحدة الضخ. وتتمثل مهمتها في جمع بيانات الحمل والإزاحة لنقطة التعليق لوحدة الضخ، ثم عمل مخطط عمل لوحدة الضخ بعد المعالجة. ويبين الشكل 1 (محذوف) الواجهة أثناء جمع البيانات. بعد النقر على زر "جمع البيانات"، سيقوم البرنامج بإنشاء موضوع جديد وتعيين خصائصه. سيكمل هذا الموضوع الجديد مهمة جمع البيانات. الإجراء هو كما يلي:
الإجراءTsampleForm.
DoSampleBtnClick(Sender: TObject);
يبدأ
ReDrawBtn.Enabled := صحيح؛
DoSampleBtn.Enabled := خطأ؛
FFTBtn.Enabled := صحيح؛
TheSampler := SampleThread.Create(False);
إنشاء موضوع المجموعة
TheSampler.OnTerminate := FFTBtnClick;
المهام التي سيتم تنفيذها بعد الانتهاء من المجموعة
TheSampler.FreeOnTerminate := True;
التراجع بعد اكتمال التجميع
نهاية؛
---- تعريف فئة سلسلة المجموعة كما يلي:
يكتب
سامبليثريد = الفئة (تثريد)
عام
وظيفة AdRead(ach: بايت): عدد صحيح؛
وظيفة قراءة بطاقة A/D
الإجراء UpdateCaption؛
عرض وقت التجميع
خاص
{تصريحات خاصة}
محمي
ثيس، ص: حقيقي؛
dt: حقيقي؛
المعرف: عدد صحيح؛
الأول، إد: LongInt؛
تجاوز الإجراء؛
هذا هو المفتاح.
نهاية؛
---- في هذه الفئة تم تعريف وظيفة AdRead لتشغيل بطاقة A/D، ويتم استخدام العمليتين لعرض التقدم ووقت التحصيل. تجدر الإشارة إلى أن وظيفة AdRead مكتوبة في التجميع، ويجب أن يكون تنسيق استدعاء المعلمة آمنًا.
---- رمز تنفيذ طريقة التحميل الزائد للمفتاح هو كما يلي:
الإجراء SampleThread.Execute;
يبدأ
StartTicker := GetTickCount;
المعرف := 0;
يكرر
هذه := Adread(15) * ad2mv * mv2l;
الحصول على القناة 15
thep := Adread(3) * ad2mv * mv2n;
الحصول على القناة 3
dt := GetTickCount - StartTicker;
sarray[id] := thes;
parray[id] := thep;
tarray[id] := dt;
المؤتمر الوطني العراقي (معرف)؛
Synchronize(UpdateCaption);
ملاحظة: عرض تقدم المجموعة
حتى المعرف >=4096;
ed := GetTickCount;
Synchronize(ShowCostTime);
ملحوظة: أظهر الوقت المستغرق
نهاية؛
---- كما يتبين من الكود أعلاه، لا يوجد فرق جوهري بين الكود التنفيذي والكود العادي. والفرق الوحيد هو أنه عند عرض تقدم المجموعة وعرض الوقت المنقضي، لا يمكن استدعاء الإجراءات المعنية مباشرة، ولكن بشكل غير مباشر عن طريق استدعاء المزامنة. يتم ذلك للحفاظ على التزامن بين العمليات.
---- 4. الخاتمة
---- تمت برمجة البرنامج أعلاه باستخدام Delphi 4.0 وتم تنفيذه على AMD-K6-2/300. نتائج الاختبار هي كما يلي: باستخدام الخيوط المتعددة، يستغرق الأمر بشكل عام من 10 إلى 14 ثانية لجمع 4096 نقطة؛ إذا لم يتم استخدام الخيوط المتعددة، فسيستغرق الأمر من دقيقة واحدة إلى دقيقة ونصف. يمكن ملاحظة أن تعدد الخيوط يمكن أن يحسن بشكل كبير من كفاءة تنفيذ البرنامج.