
معظم المبرمجين "العاديين" ، بعبارة ملطفة ، لديهم موقف غامض تجاه تقنية LabVIEW . هنا يمكنك أن تجادل لفترة طويلة ولكن دون جدوى. يتفاقم الموقف من حقيقة أن هناك الكثير من الأمثلة على برامج LabVIEW على الشبكة ، لكنها كلها موجهة نحو المبتدئين وتختزل إلى "أوه ، انظر كم هو بسيط ، قم بربط الالتواء بالمؤشر ، لف المفتاح ، قم بتغيير الرقم" ، أو في أحسن الأحوال ، إلى الرسم البياني في الدورة يتم عرض رقم أو جيب عشوائي ، كل هذا مصحوبًا بواجهة غاضبة في شكل مفاتيح تبديل عملاقة ، ومقابض دوارة ومؤشرات قرصية. شخصياً ، هذا الأسلوب من التبسيط الواعي يزعجني. في سلسلة قصيرة من المقالات ، سأحاول تقديم القارئ لعملية تطوير البرامج التطبيقية في LabVIEW. لكي لا نكرس الكثير من الوقت لمنطقة الموضوع ، سنستخدم الخوارزمية التفصيلية لتحميل ملف التكوين إلى FPGA عبر FTDI في وضع MPSSE ( تنزيل التكوين إلى FPGA عبر USB أو تفكيك FTDI MPSSE ). في هذه المقالة سأوضح كيفية تنفيذ نفس محمل FPGA ، ولكن بلغة LabVIEW.
كما ذكر أعلاه ، تم وصف خوارزمية تحميل FPGA في وضع Serial Passive (SP) ومبدأ تشغيل FTDI جيدًا في المقالة السابقة. لن أكرر نفسي. نعتقد أن الخوارزمية يتم اختبارها والتعرف عليها على أنها مناسبة. ونعم ، لنفترض أن القارئ على الأقل سطحيًا على دراية بمفهوم LabVIEW وهو على دراية جيدة بالبرمجة الكلاسيكية.
على الرغم من أن عملية إنشاء محمل إقلاع لا تستغرق الكثير من الوقت ، إلا أن وصف العملية لم ينجح في احتواء حجم مقال واحد ، لذلك سيكون هناك سلسلة صغيرة. نظرًا لأن مرحلة التجارب قد اكتملت بالفعل ، وأنا واثق من قابلية تشغيل الخوارزمية ، سأسمح لنفسي ببدء التطوير من واجهة المستخدم. في المقالة الأولى ، سنقوم بإنشاء واجهة مستخدم المحمل وتنفيذ هيكل البرنامج. في الثانية - من خلال برنامج تشغيل برنامج تشغيل FTDI ، نقوم بتنفيذ تحميل ملف * .rbf إلى FPGA.
لإنتاجية المحادثة ، ليس من غير الضروري تذكر المصطلحات المعتمدة في LabVIEW. في LabVIEW ، يُطلق على البرنامج التطبيقي الأداة الافتراضية ، والمعروفة أيضًا باسم السادس ، والمعروف أيضًا باسم الأداة الافتراضية أو السادس للاختصار. يحتوي VP على "جانبين": اللوحة الأمامية ، حيث توجد عناصر التحكم والمؤشرات ، ومخطط الكتلة (مخطط المخطط) ، حيث تكون هذه العناصر مترابطة ويتم تنفيذ الوظائف وتدفق معالجة البيانات. كقاعدة عامة ، يمتلك نائب الرئيس هيكلًا هرميًا ؛ عادةً ما يطلق على جميع نواب الرئيس في نائب رئيس أعلى مستوى جهاز فرعي أو SubVI.
واجهة المستخدم
يجب أن يقوم تطبيقنا بتحميل ملف التكوين إلى FPGA. في الوقت نفسه ، نعني أنه يمكن توصيل العديد من FTDI بالكمبيوتر في نفس الوقت ، ويمكن استخدام بعضها لتكوين FPGA. أقترح إجراء اختيار الجهاز من القائمة المنسدلة ، وتحديد ملف من خلال زر بإخراج مسار. لبدء التنزيل ، أضف زر "البرنامج". سيشير مؤشر LED الظاهري إلى حالة العملية. قم بتشغيل LabVIEW.
أضف العناصر المطلوبة إلى اللوحة الأمامية (اللوحة الأمامية). سأستخدم أسلوب "الفضة" لنائب الرئيس. يوضح الشكل أدناه النتيجة ، جميع العناصر في حالتها الأصلية. بالاسم ، إذا لزم الأمر ، من السهل العثور عليها في اللوحة.

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

ومخطط الكتلة:

ألفت انتباهكم. يحتوي كل عنصر على خاصيتين تحدد الاسم - Label and Caption.

تقوم الخاصية الأولى بتعيين اسم العنصر ، وسيتم عرضه تحت هذا الاسم على الرسم التخطيطي للكتلة. التسمية ، على عكس التسمية التوضيحية ، لا يمكن تغييرها أثناء تنفيذ السادس. فيما يتعلق بهذه الميزة ، أوصيك بإخفاء التسمية في VIs الخاصة بك على اللوحة الأمامية وعرض التسمية التوضيحية. بالنسبة إلى Label ، اختر اسمًا ذا معنى ، كمتغير في لغة البرمجة الكلاسيكية ، ويفضل أن يكون ذلك في تخطيط لاتيني. بالنسبة إلى Caption ، سنقدم اسمًا موجهًا نحو الإنسان ، ويمكن أن يكون طويلًا جدًا ، ويتضمن مسافات ، وإذا لزم الأمر ، باللغة الروسية. باستخدام LabVIEW ، يمكنك تخصيص خط العرض للتعليق. يجب أن أقول أنه لا أحد يجبرنا على العبث مع تسمية توضيحية: يمكن إجراء أي نقش مباشرة على FP في أي مكان مجاني.
نقوم بتنفيذ عملية VP وفقًا للمخطط الكلاسيكي: أثناء التكرار ومعالج الأحداث. أضف حلقة while (البرمجة -> الهياكل -> While
التكرار) إلى مخطط الكتلة وهيكل معالج الأحداث (البرمجة -> الهياكل -> هيكل الحدث).
تعليمات موجزة عن هيكل الحدثينتظر الهيكل حدوث الحدث ، ثم ينفذ المعالج المقابل. يحتوي هيكل الأحداث على مخطط فرعي واحد أو أكثر - معالجات الأحداث ، ما يسمى بالحالات ، والتي يتم تنفيذ واحدة منها عند وقوع حدث. باستخدام الطرفية في الزاوية العلوية اليسرى ، يمكنك تحديد عدد المللي ثانية التي يتوقع خلالها الهيكل حدثًا. إذا لم يحدث أي حدث خلال هذا الوقت ، فسيتم تنفيذ المخطط الفرعي "المهلة". القيمة الافتراضية هي ناقص 1 ، مما يعني أن المهلة لا تنتهي صلاحيتها أبدًا.

- يشير تصنيف محدد الأحداث إلى الأحداث التي تؤدي إلى الحالة الحالية. لعرض معالجات أخرى ، يمكنك النقر فوق السهم لأسفل بجوار اسم الحدث.
- يعيّن طرف
timeout
عدد المللي ثانية لانتظار حدث. إذا كانت القيمة غير -1 ، فيجب تنفيذ المخطط الفرعي للمهلة. - محطة لدخول الأحداث الديناميكية. لا يتم عرض هذه المحطة بشكل افتراضي. لعرضه ، حدد "إظهار محطات الحدث الديناميكية" في قائمة السياق.
- عقدة بيانات الحدث. عند حدوث حدث ، ينشئ LabVIEW البيانات المرتبطة بهذا الحدث. توفر هذه العقدة هذه البيانات إلى المعالج. يمكنك استخدام الماوس لتغيير حجم العقدة عموديًا وتحديد العناصر الضرورية. بعض البيانات ، مثل
Type
Time
، شائعة في جميع الأحداث ، والبعض الآخر ، مثل Char
و VKey
، يعتمد على نوع الحدث الذي تم تكوينه. - تحدد عقدة عامل تصفية الحدث بيانات الأحداث التي يمكنك تعديلها قبل معالجة واجهة المستخدم لهذه البيانات. يتم عرض هذه العقدة فقط في تلك المعالجات التي تتوفر فيها التصفية. يمكنك توصيل العناصر وتغييرها من عقدة بيانات الحدث إلى عقدة عامل تصفية الحدث. يمكنك أيضًا تغيير هذه الأحداث من خلال ربط القيم الجديدة بأطراف العقدة. هل يمكنني إلغاء رد فعل الواجهة تمامًا تجاه الحدث إذا قمت بالتقديم
true
إلى طرف Discard?
. إذا لم تقم بتوصيل القيمة بعنصر التصفية ، فسيظل عنصر البيانات هذا دون تغيير. - مثل بنية
Case
، تدعم بنية الحدث الأنفاق. إذا قمت بإضافة نفق في حالة واحدة ، فسيتم إنشاؤه تلقائيًا لكل معالج. ومع ذلك ، بشكل افتراضي لا توجد حاجة لربط أنفاق الإخراج لبنية الحدث في كل معالج. تستخدم جميع الأنفاق غير المتصلة القيمة الافتراضية لنوع بيانات النفق. من المحتمل أن يؤدي ذلك إلى أخطاء يصعب اكتشافها. يمكنك إعادة الوضع الذي يجب أن يكون فيه النفق سلكيًا في جميع المعالجات ، لذلك ، حدد "Use Default If Unwired" في قائمة السياق.
بادئ ذي بدء ، سنهتم بكيفية انتهاء الدورة والخروج من البرنامج. أسهل طريقة هي إضافة زر إيقاف ، والذي سيوقف الدورة ، ولكن في رأيي ، من المعتاد إنهاء البرنامج بعلامة حمراء في الزاوية العلوية من النافذة.
قم بإضافة المعالج المناسب إلى Event Structure
. في قائمة السياق ، حدد "إضافة حالة حدث". كمصدر للحدث ، حدد "This VI" ، يشير الحدث إلى "إغلاق اللوحة؟"
تحرير الأحداث
صورة قابلة للنقر
يرجى ملاحظة أنه إذا حددت "إغلاق اللوحة" (بدون سؤال) ، فإن هذا الحدث بدون فلتر ، فلا يمكن التراجع عنه. وإذا كان لديك سؤال ، فعند النقر على الصليب ، يمكننا التحكم وإكمال البرنامج بشكل صحيح بشكل مستقل. في "إغلاق اللوحة؟" من خلال النفق نقوم بتوصيل الثابت المنطقي مع الطرفية لإيقاف while
. إدخال "تجاهل؟" تخدم أيضا true
.
الآن لا يوجد فارق بسيط واضح: إذا تم تشغيل الإصدار السادس الحالي ليس في بيئة LabVIEW ، ولكن كتطبيق مترجم ، فلن يؤدي النقر فوق علامة الصليب إلى إغلاق النافذة ، ولكن سيتم إيقاف التطبيق ، والذي لا نحتاجه. لحل هذه المشكلة ، بعد الانتهاء من الدورة الرئيسية ، سوف نتحقق مما إذا كنا في بيئة التطوير أو في وضع البرنامج ، إذا كنا لا نزال في وضع البرنامج ، فسننهي التطبيق. لفهم مكان تشغيل VI الحالي ، استخدم عقدة الخصائص (البرمجة -> التحكم في التطبيق -> عقدة الخصائص). توفر هذه العقدة الوصول إلى خصائص الكائن بالرجوع إلى هذا الكائن. في هذه الحالة ، يجب أن نحصل على رابط للتطبيق بأكمله ككل. حدد ثابت VI Server Reference
من نفس اللوحة. بعد تعيين الثابت إلى مخطط الكتلة ، تحتاج إلى تغيير نوعه إلى This Application
(زر الماوس الأيسر). نحن نربط الرابط الناتج مع عقدة الملكية. حدد خاصية Application:Kind Property
- إرجاع نوع نظام LabVIEW الذي يتم تشغيل السادس الحالي. نربط إخراج الخاصية بهيكل الحالة ، ونضيف حالة "نظام وقت التشغيل" ، حيث ننهي التطبيق ( Quit LabVIEW
). من أجل تنفيذ هذه الكتلة بعد الدورة ، وليس قبل ذلك ، نقوم بتوصيل error in
محطة الإدخال error in
الدورة عبر النفق.

صورة قابلة للنقر
الآن عند بدء تشغيل البرنامج ، يمكنك إيقافه عن طريق النقر على تقاطع النافذة. يبدو البرنامج الذي تم إطلاقه كما يلي:

في رأيي ، الكثير من الفائض. انتقل إلى خصائص VI (ملف -> قائمة خصائص VI) ، وحدد فئة "مظهر النافذة" ، وقم بتعيين مخصص.
قم بإيقاف تشغيل عرض القائمة (يظل في وضع التحرير) ، وقم بإيقاف تشغيل شريط التمرير ، وإخفاء شريط الأدوات عند تشغيل التطبيق (إظهار شريط الأدوات عند التشغيل). نحن نحظر تغيير حجم النافذة ، ونسمح بتصغير النافذة وتصغيرها. هذا أفضل:

بالطبع ، سيكون من المفيد إزالة نقش "National Instruments. LabVIEW Evaluation Software" ، لكنني لا أريد شراء ترخيص لجهاز كمبيوتر منزلي بعد ، وسوف نتحمل النقش وندير الفترة التجريبية التي تبلغ 45 يومًا.
بطبيعة الحال ، يمكنك ضبط لون الخلفية وكل عنصر ، واختيار الخطوط ، لكنني لست مصممًا ، ولكن شيئًا يخبرني أنني سأجعل الأمر أسوأ فقط.
قائمة الأدوات
يجب أن يعرض VP على المستخدم قائمة بالأجهزة المتصلة بالكمبيوتر المناسبة لبرامج FPGA الثابتة حتى يتمكن المستخدم من تحديد الجهاز المطلوب. في مكتبة FTD2XX ، تكون FT_CreateDeviceInfoList
و FT_GetDeviceInfoDetail
لهذا الغرض المقصود. كما تمت مناقشته في مقال سابق ، يمكن استخدام مكتبات برامج التشغيل لاستخدام FTD2XX API. لدى LabVIEW آلية مناسبة للتفاعل مع المكتبات الديناميكية - عقدة وظيفة مكتبة الاتصال ، يمكنك العثور عليها في لوحة "الاتصال -> المكتبات والملفات التنفيذية". يجب تكوين عقدة استدعاء الوظيفة: أولاً ، حدد المسار إلى dll (علامة التبويب "الوظيفة") ، وبعد ذلك يقوم النظام بمسح المكتبة ويطالبك بتحديد اسم الوظيفة في قائمة "اسم الوظيفة" - حدد FT_CreateDeviceInfoList
، اصطلاح الاستدعاء - حدد stdcall (WINAPI) . ثانيًا ، في علامة التبويب "المعلمات" ، تحتاج إلى إدخال قائمة بمعلمات الدوال ، حيث يكون العنصر الأول في القائمة هو القيمة المرجعة. سيكون من الجيد هنا أن تضع في اعتبارك وثائق واجهة برمجة التطبيقات ، أو ملف الرأس. عند ضبط المعلمات في منطقة "النموذج الأولي للوظيفة" ، يتم عرض النموذج الأولي للوظيفة المستوردة. عندما يتطابق التوقيع من الوثائق مع النموذج الأولي الذي تم تكوينه ، انقر فوق OK.
افترض أن المسح يجب أن يتم مرة واحدة في الثانية. نضع عقدة الاتصال في بنية معالج الأحداث في علامة التبويب "المهلة" ، قم بتعيين وقت الانتظار على 1000 مللي ثانية. نضيف مؤشرات إلى دبابيس العقدة ، وإذا تم عمل كل شيء بشكل صحيح ، فعند بدء تشغيل VI ، يجب عرض عدد الأجهزة المتصلة بـ FTDI:
اللوحة الأمامية ومخطط الكتلة
صورة قابلة للنقر

وبالمثل ، قم بإنشاء عقدة للدالة FT_GetDeviceInfoDetail
. النموذج الأولي للوظيفة هو:
FTD2XX_API FT_STATUS WINAPI FT_GetDeviceInfoDetail( DWORD dwIndex, LPDWORD lpdwFlags, LPDWORD lpdwType, LPDWORD lpdwID, LPDWORD lpdwLocId, LPVOID lpSerialNumber, LPVOID lpDescription, FT_HAN
عند وصف المعلمات ، تجدر الإشارة إلى أن lpdwFlags
و lpdwType
و lpdwID
و lpdwLocId
يتم تمريرها كمؤشرات إلى uint32
. المعلمات lpSerialNumber
و lpDescription
هي جوهر سلاسل البايت (صفائف char
مع char
نهاية فارغة). يمكن تنسيق المعلمات من هذا النوع في عقدة الاستدعاء بطرق مختلفة ، يمكنك إدخالها في مجموعة من الكلمات ذات 8 بت ، ولكن أعتقد أنه من الأنسب الإشارة فورًا إلى أن هذه سلسلة وتعيين الحجم المتوقع. في هذه الحالة ، سيكون الناتج على الفور خطًا "متاهة" صالحًا ولن تكون هناك حاجة إلى تحويلات إضافية.

وظيفة مكتبة الاتصال
تقوم هذه الوظيفة بارجاع المعلومات بواسطة الرقم التسلسلي لـ dwIndex
. إذا تم توصيل العديد من FTDI بالكمبيوتر ، لقراءة المعلومات الخاصة بكل محول ، يجب استدعاء الوظيفة في حلقة. سيتم إعطاء عدد مرات تكرار الحلقة إلينا بواسطة الوظيفة السابقة FT_CreateDeviceInfoList
.
اللوحة الأمامية ومخطط الكتلة
صورة قابلة للنقر

هناك ميزة غير سارة: يجب توصيل جميع منافذ عقدة الاتصال على جانب واحد على الأقل. لذلك ، يتم إنشاء نفق في الحلقة لمحطات الإخراج تلك التي لن نستخدمها.
صفيف Types
يحتوي على أنواع شرائح FTDI ، فنحن نحتاجها من أجل قصر الاختيار على تلك التي تدعم MPSSE ويمكن استخدامها لبرمجة FPGA. ومع ذلك ، فإن العمل باستخدام "الأرقام السحرية" أمر غير مريح - أقترح ترتيب أنواع FTDI في شكل enum
. علاوة على ذلك ، يوجد هذا enum
بالفعل في ملف الرأس ftd2xx.h. في LabVIEW ، يمكنك استخدام عنصري تحكم لإنشاء تعداد: Ring Ring و Enum نفسه. يحتوي كلاهما على قوائم سلاسل ذات قيم رقمية يمكنك التبديل بينها. والفرق الرئيسي هو أن "Enum" يتطلب أن تكون القيم الرقمية أعدادًا متتالية صحيحة ، في حين أن "Ring Text" تتمتع بحرية أكبر - يمكنك تحديد أي قيم.
تعداد. الخلق
ندخل القيم يدويًا ، من المؤسف أنه لا توجد وظيفة لاستيراد enum
من C

على اللوحة الأمامية يبدو هذا المؤشر هكذا

تحديد قيمة بالنقر بزر الماوس الأيسر
من أجل ربط ومزامنة جميع النسخ المستقبلية من القائمة التي تم إنشاؤها ، من المناسب استخدام "Make Type Def." (التحديد عبر قائمة سياق العنصر). ونتيجة لذلك ، سيتم إنشاء نوع بيانات مخصص. يتم وضع النوع الجديد في ملف منفصل بالملحق * .ctl. سيؤدي تعديل هذا الملف إلى تعديل جميع مثيلات هذا العنصر. أعتقد أنه لا يستحق شرح مدى ملاءمة ذلك. يمكن الحصول على الوصول إلى ملف التعريف من قائمة السياق الخاصة بالمثيل عن طريق تحديد "Open Type Def" ، في نفس القائمة يجب الانتباه إلى العناصر "التحديث التلقائي من Type Def". و "قطع الاتصال من النوع Def".
نقوم بتغيير مؤشر Types
إلى مجموعة من المؤشرات من FTDI Type
ونتيجة لذلك ، عندما يبدأ السادس ، يتم عرض نوع المحول المتصل:

تم العثور على ثلاثة أجهزة
من السهل ملاحظة اكتمال عمل الشفرة الناتجة في حالة "المهلة" ، وبالتالي يمكن نقلها إلى SubVI منفصل. حدد العناصر التي نريد نقلها إلى الجهاز الفرعي وحدد "إنشاء SubVI" من القائمة الرئيسية تعديل.
رسم تخطيطي باستخدام أداة فرعية تم إنشاؤهابقيت جميع المؤشرات ، وتم تشكيل VI جديد برمز قياسي بدلاً من عقد الاستدعاء.

صورة قابلة للنقر
سيؤدي النقر المزدوج على subVI الجديد إلى تشغيل نافذة التحرير الخاصة به. بادئ ذي بدء ، نقوم بحفظه وإعطاء اسم له معنى ، على سبيل المثال ، "FT_GetDeviceInfo". قم بإعداد أطراف الإدخال / الإخراج. للقيام بذلك ، استخدم جزء الموصل:

اللوحة عبارة عن مجموعة من المحطات المقابلة للضوابط والمؤشرات VI.
إذا قمت بتحديد طرف طرفية في لوحة الاتصال ، فسيتم تمييز العنصر المقابل في اللوحة الأمامية. إذا حددت محطة طرفية فارغة ثم نقرت على عنصر في اللوحة الأمامية ، فسيتم إرفاق العنصر إلى المحطة الطرفية ، ولكن قبل ذلك لن يتم تعيينه إلى محطة طرفية أخرى. في قائمة السياق ، يمكنك بشكل فردي أو للجميع فصل المحطات عن العناصر مرة واحدة ، يمكنك تغيير نمط اللوحة ككل.
أنا لا أحب كيف تم تعيين المحطات الطرفية عند إنشاء subVI الحالي ، لذلك اخترت "قطع اتصال جميع المحطات الطرفية" وترميزها يدويًا. أوصي بوضع أطراف الإدخال على اليسار ، والإخراج على اليمين ، ويمكن وضع الإدخال الاختياري في الأعلى ، والإخراج الاختياري في الأسفل. سيضمن ذلك سهولة قراءة التعليمات البرمجية والترتيب المرئي في مخطط الكتلة.
للتحكم في الأخطاء ، قم بإنشاء عنصرين إضافيين ، Error in
and Error out
. موضوع التحكم في الخطأ في LabVIEW واسع للغاية ويتجاوز نطاق هذه المقالة ، لذلك سنقتصر على الحد الأدنى من التفسيرات ونلتزم بمبدأ "افعل ما أنا". لذلك ، نقوم بإنشاء محطتين للأخطاء - الإدخال والإخراج.
من السهل إنشائها باستخدام قائمة السياقانقر بزر الماوس الأيمن على طرف الخطأ لأي عقدة:

في LabVIEW ، من المعتاد وضع طرف إدخال الخطأ على لوحة الاتصال في أسفل اليسار ، ومحطة الإخراج في أسفل اليمين.
سيكون أكثر ملاءمة لدمج الناتج في هيكل. للإخراج ، سنقوم بعمل مصفوفتين: الصفيف الأول سيحتوي على جميع أجهزة FTDI الموجودة ، والصفيف الثاني سيحتوي فقط على تلك التي يمكن أن تستخدم MPSSE ونظريًا يمكن استخدامها لتكوين FPGA.
اللمسة الأخيرة عند إنشاء أداة فرعية هي تكوين الرمز. يؤدي النقر المزدوج على الرمز في الزاوية العلوية اليمنى من النافذة إلى تشغيل المحرر. نحن نحاول إنشاء نوع من صورة ذات مغزى تسمح لنا بتفسير الغرض من الجهاز في الرسم التخطيطي بشكل لا لبس فيه.
FT_GetDeviceInfo.vi
اللوحة الأمامية

مخطط كتلة
هكذا تبدو حالة "المهلة" بعد ترتيب الأمور:

صورة قابلة للنقر
حتى هذه اللحظة ، كانت القائمة المنسدلة باسم "حدد جهازًا" فارغة ، والآن لدينا البيانات لملئها. نقوم بإنشاء عقدة خاصية للقائمة باستخدام خاصية "سلاسل []" (قائمة السياق -> إنشاء -> عقدة خاصية -> سلاسل []). أي خاصية قابلة للكتابة والقراءة ؛ يتم تحديد الوضع الحالي في قائمة السياق لعقدة الخصائص. عند إنشاء عقدة بشكل افتراضي ، يتم تكوين الخصائص للقراءة. التغيير للكتابة: "التغيير للكتابة".
من مصفوفة الهياكل ، حدد الصفيف مع الوصف Strings[]
إلى Strings[]
. يمكنك تحديد مصفوفة باستخدام For Loop
.
بعد بدء تشغيل VI ، بالضغط على الزر الأيسر في عنصر "تحديد جهاز" ، يمكنك تحديد الجهاز للتكوين. في هذه الحالة ، يتم تحديث قائمة الأجهزة مرتين في الثانية. بالطبع ، سيكون من الممكن تحديث الخاصية فقط إذا تم تحديث القائمة ، ولكن حتى الآن سيؤدي هذا إلى فوضى غير ضرورية في مخطط الكتلة.
ماذا حدث؟
اللوحة الأمامية

صورة قابلة للنقر
في وقت سابق ، نسيت أن أذكر مثل هذه الميزة المثيرة للاهتمام ، لا تحتاج الحلقة For إلى تحديد عدد التكرارات بشكل صريح ، يكفي إنشاء نفق إدخال للصفيف وستنفذ الحلقة لكل عنصر ، يشبه هذا السلوك foreach
في C ++ 11. ومع ذلك ، تحتاج إلى توخي الحذر عند وصول أكثر من صفيف واحد إلى إدخال الحلقة.
في هيكل الحدث ، قم بإضافة معالج للضغط على زر "برنامج". على الرغم من أنه ليس لدينا محرك VI مسؤول عن تحميل الملف إلى FPGA ، فسنقوم بعمل "كعب روتين" للجهاز الفرعي. افترض أنه يأخذ المسار إلى ملف التكوين وواصف FTDI كمدخل ، ووفقًا لنتائج العملية ، فإنه يعيد حالة البرنامج الثابت: ناجح أم لا. ولجعل اختبار واجهة البرنامج أكثر إثارة للاهتمام ، سنجعل هذه الحالة عشوائية.
كعب FT_MPSSE_SP_FPGA.vi
اللوحة الأمامية

مخطط كتلة
سنمرر واصف FTDI إلى إدخال كعب الروتين عبر خاصية القائمة (قائمة السياق -> إنشاء -> عقدة الخاصية -> نص الحلقة -> نص) ، لنقل مسار الملف إلى عنصر "مسار الملف" ، وإنشاء متغير محلي (قائمة السياق -> إنشاء -> محلي متغير) واضبطها على القراءة (تغيير للقراءة). وربط إخراج الحالة مباشرة بمؤشر Status
. يتم سحب الزر Programm
إلى معالج الأحداث. من الممارسات الجيدة وضع العناصر التي تم تكوين الحدث عليها في معالجات - الآن النقر المزدوج على هذا العنصر في اللوحة الأمامية لن يظهر العنصر المقابل في مخطط الكتلة فحسب ، بل سيظهر أيضًا معالج الأحداث المرتبط بهذا العنصر.
الآن ، عن طريق الضغط على زر "البرنامج" ، يصبح المؤشر إما أخضر (نجاح) أو أخضر داكن (لا نجاح). ليس واضحا جدا. في خصائص المؤشر ، قم بتغيير اللون "إيقاف" إلى اللون الأحمر. هذا أفضل. إذا كان المؤشر باللون الأخضر ، فيمكننا القول أن FPGA على الجهاز المحدد تم تكوينه بواسطة ملف ، والمسار المشار إليه في النافذة:

اللوحة الأمامية
لكن هذه العبارة تصبح خاطئة إذا قمنا بتغيير الملف أو اخترنا جهازًا آخر. في الوقت نفسه ، لا يمكننا تلوين المؤشر باللون الأحمر ، لأنه لم يحدث خطأ في البرمجة. في حالة تغيير الملف أو الجهاز ، من الملائم التأكيد على أن قيمة المؤشر ليست ذات صلة - قم بتغميقها. لهذا ، يمكنك استخدام خاصية المؤشر المعطل. يمكن أن تأخذ هذه الخاصية ثلاث قيم. Enabled
- عرض عادي ، يمكن للمستخدم التحكم في الكائن ؛ Disabled
- يتم عرض الكائن على اللوحة الأمامية كالمعتاد ، ولكن لا يمكن للمستخدم التحكم في الكائن ؛ Disabled and Grayed Out
- يتم عرض الكائن على اللوحة الأمامية مظلمة ، ولا يمكن للمستخدم التحكم في الكائن.
نقوم بإنشاء معالجات الأحداث Devices list
File Path
، وفيها نقوم بتغميق مؤشر الحالة ، وفي المعالج نقوم بتعيين زر "البرنامج" للخاصية Enabled
.
ماذا حدث
معالج "Programm": تغيير القيمة.

معالج قائمة الأجهزة: تغيير القيمة

هكذا يبدو المؤشر الخافت
دعونا نجعل البحث عن ملف التكوين مناسبًا للمستخدم - سنقوم بتهيئة نافذة عرض الملف. انتقل إلى خصائص عنصر File Path
، في علامة التبويب "خيارات التصفح" ، واملأ موجه ، وتسمية النمط ، وحدد عامل تصفية نوع الملف (النمط) واسم الزر (نص الزر).
نافذة اختيار الملف
يتم عرض ملفات rbf فقط

يمكن اعتبار إنشاء واجهة مستخدم كاملة.

تشغيل أداة تحميل التشغيل
ماذا التقيت اليوم؟
في هذه المقالة ، كمثال على إنشاء تطبيق كامل وظيفيًا بواجهة بسيطة ، حاولت إظهار طرق مختلفة للعمل في LabVIEW.
ونتيجة لذلك ، تطرقنا إلى ما يلي:
- تحديد خصائص الجهاز الظاهري. .
- : .
- .
- .
- dll.
- .
API FTD2XX MPSSE. .
- USB FTDI MPSSE
- labview_mpsse . .
- .
- Software Application Development D2XX Programmer's Guide . API D2XX.