توقيت وظيفة للتحكم الصناعي Simatic S7-1200

حتى بالنسبة لسلسلة S7-300 و S7-400 ، في إطار الخطوة 7 ، كانت الإصدارات الكلاسيكية من أجهزة ضبط الوقت المقدمة للمطور كافية تمامًا - هذه هي أجهزة ضبط الوقت القياسية IEC ، والتي يتم تنفيذها ككتل وظيفية ، وأجهزة ضبط الوقت S5 (والتي ، بالمناسبة ، لا تزال موجودة لسلسلة S7- 1500). ومع ذلك ، في بعض الحالات ، لم يستخدم المطور الأدوات القياسية وقام بتطبيق أجهزة ضبط الوقت الخاصة به ، في معظم الأحيان في شكل وظائف. كانت وظائف المؤقتات هذه ضرورية مع نهج "تكنولوجيا المعلومات" للبرمجة ، حيث لم تعمل مع حالات منفصلة من الكتل الوظيفية للمعدات التكنولوجية ، مع الربط المقابل للمدخلات والمخرجات ، ولكن مع صفائف من الهياكل. على سبيل المثال ، صفيف من بنية نوع إدخال منفصلة. أو مصفوفة بنية مجمعة. هذا النهج للبرمجة له ​​الحق في الوجود ، لأنه يسمح لك بحفظ الذاكرة العاملة لوحدة المعالجة المركزية بجدية ، ولكن ،من ناحية أخرى ، يجعل من الصعب قراءة رمز البرنامج. لا يمكن لمبرمج تابع لجهة خارجية وبنظرة بسيطة على برنامج LAD معرفة ذلك على الفور ، ولكن لا توجد أي أكوام من المؤشرات والمصفوفات والوظائف اللازمة لمعالجتها ؛ هنا ، بدون وثائق للبرنامج (وبدون نصف لتر ، بالطبع) ، في أي مكان.

عادة ما تتم معالجة هذه الصفائف من الهياكل في وظائف. من حيث المبدأ ، لم يمنع أي شيء من معالجة كتل الوظائف ، ولكن كان هناك دائمًا سؤال مهم - كيف تعمل مع المؤقتات في هذه الحالات؟ تفترض أجهزة ضبط الوقت القياسية إما رقم (S5) أو مثيل كتلة دالة (IEC). هذا ، أذكركم ، يتعلق بمعالجة صفائف من الهياكل لـ PLCs Simatic الكلاسيكية ، وللف أرقام الموقت في هذه الهياكل ، والأكثر من ذلك ، إما أن الحالات صعبة أو ببساطة مستحيلة.

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

بالنسبة للسلسلة 300 و 400 ، كانت هناك طريقتان لتحديد هذه المرة. الأول هو النظر في وقت تشغيل OB1 الرئيسي (هناك متغير مناظر في OB1 نفسه) أو OBs الدورية وزيادة تراكم الوقت الداخلي مع كل مكالمة للمؤقت ، شريطة أن تكون "الحقيقة" هي الإدخال. ليس خيارًا جيدًا ، لأن هذا الوقت يختلف عن OB1 و OBs الدورية. الطريقة الثانية هي وظيفة نظام TIME_TCK ، والتي ، مع كل مكالمة ، تقوم بإرجاع قيمة واحدة - عداد المللي ثانية الداخلي للمعالج المركزي.

صورة

وبالتالي ، بالنسبة لمؤقت من نوع TON (عند التأخير) ، كانت خوارزمية التشغيل على النحو التالي:

  • في الحافة الصاعدة من طلب الاستجابة ، أعد تعيين الإخراج وتذكر القيمة الحالية لمؤقت النظام TIME_TCK
  • «» , ( , TIME_TCK 0 (2 ^ 31 — 1), ). , . , «», — «»
  • «»,

مع ظهور سلسلة "الألف" ، تغير الوضع قليلاً. الحقيقة هي أن خط S7-1500 ورث دعمًا لاستدعاء نظام TIME_TCK ، وعشاق نهج "الوقوف في الأرجوحة" (كيف يمكنك الاتصال ببرنامج يقوم فقط بمعالجة صفائف الهياكل ، أثناء العمل باستخدام فهارس زاحفة؟) الاستمرار في استخدام أفضل ممارساتهم بهدوء.

تعتمد سلسلة وحدات التحكم الأساسية S7-1200 على بنية مختلفة ، ولديها عدد من الاختلافات عن S7-1500. بما في ذلك عدم وجود اتصال بنظام TIME_TCK. في صفوف المطورين الذين ليس لديهم مرونة كافية في التفكير ، ذهب عدم الرضا - من المستحيل تنفيذ نسخ / عجائن من البرامج القديمة. ومع ذلك ، يمكن تحديد مهمة تحديد مقدار الوقت المنقضي منذ إجراء المكالمة السابقة باستخدام وظيفة وقت التشغيل.

تُرجع هذه الدالة الوقت المنقضي منذ المكالمة السابقة ، بالثواني ، كرقم حقيقي مزدوج الدقة LREAL. يتم وصف التفاصيل في المساعدة. للأغراض الداخلية ، مطلوب متغير MEM إضافي (من نوع LREAL).

سأقدم مصادر التقريب الأول للوظيفة ، وسأقدم بعض الملاحظات.

إعلان الوظيفة:

FUNCTION "PerversionTON" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_INPUT 
      IN : Bool;   //  
      PT : Real;   //    
   END_VAR

   VAR_OUTPUT 
      Q : Bool;   //  
   END_VAR

   VAR_IN_OUT 
      INPrv : Bool;
      MEM : LReal;
      TimeACC : UDInt;
   END_VAR

   VAR_TEMP 
      udiCycle : UDInt;
      udiPT : UDInt;
   END_VAR

مع المدخلات / المخرجات ، كل شيء واضح: IN و Q و PT. لقد قمت بتعيين إعداد الوقت على شكل إعداد حقيقي ، إنه ثواني. أردت فقط (ولكن دون جدوى ، ولكن المزيد عن ذلك أدناه). مزيد من المعلومات حول متغيرات منطقة InOut. نظرًا لأن لدينا وظيفة ، ليس لدينا منطقة STAT ، ولا توجد متغيرات تحتفظ بقيمتها أثناء استدعاء الوظيفة التالية ، وهذه المتغيرات مطلوبة:

INPrv - لتحديد الحافة الإيجابية لطلب

MEM - متغير إضافي لاستدعاء النظام إلى وقت التشغيل

TimeACC - تراكم الوقت ، والتي ستخزن عدد الميكروثانية من التأخير الجاري حاليًا.

يتم تحديد المتغيرات TimeACC و udiCycle و udiPT بتنسيق UDINT ، عدد صحيح بدون إشارة ، 4 بايت. على الرغم من أنني حددت الوقت على أنه حقيقي ، وأن وظيفة وقت التشغيل ترجع إلى الدقة الحقيقية مثل الدقة المزدوجة ، إلا أنني أفضل إجراء عمليات بسيطة للجمع والمقارنة مع المعاملات الصحيحة لتوفير وقت المعالج. يتم أخذ الوقت في حالتي بعين الاعتبار إلى الميكروثانية. والسبب بسيط - إذا كنت تقصر الوقت على المللي ثانية ، ثم مع OB1 الفارغ تقريبًا (على سبيل المثال ، إذا تم استدعاء مؤقت واحد فقط في برنامج وحدة التحكم بالكامل وليس أكثر) ، فإن "تخطي" الدورات ممكن ، يتم تشغيل البرنامج في بعض الأحيان لمدة 250 μs. ولكن في هذه الحالة ، ستكون القيمة القصوى المسموح بها لمراكم الوقت 4،294 ثانية ، تقريبًا 4،295 (2 ^ 32 - 1 = 4،294،967،295). لا يوجد شيء يجب القيام به ، مثل هذا "التحسين" يتطلب التضحية.

نص الوظيفة.

#udiCycle := LREAL_TO_UDINT(RUNTIME(#MEM) * 1000000); //     
#udiPT := REAL_TO_UDINT(#PT * 1000000); //   

IF (#IN AND (NOT #INPrv)) THEN //         
    #TimeACC := 0;
    #Q := FALSE;
ELSIF (#IN AND #INPrv) THEN //     ""
    #TimeACC += #udiCycle; //     "    "
    IF #TimeACC >=  #udiPT THEN //      
        #Q := TRUE; //  ""
        #TimeACC := #udiPT; //  
    ELSE //      
        #Q := FALSE; // 
    END_IF;
ELSE //    -      
    #Q := FALSE;
    #TimeACC := 0;
END_IF;

#INPrv := #IN; //  

ENO := #Q; // ENO         LAD  FBD

أول سطرين هما إعادة حساب إعداد المؤقت من عدد الثواني المحدد في التنسيق الحقيقي إلى عدد الميكروثانية. يتم تحديد الوقت بالميكرو ثانية المنقضي من استدعاء كتلة البرنامج السابق أيضًا.

علاوة على ذلك ، الخوارزمية هي كما يلي ، وقد أعطيتها بالفعل:

  • على الحافة الصاعدة للمدخلات IN ، قم بإعادة تعيين الإخراج Q وإعادة تراكم الوقت
  • إذا استمرت "الحقيقة" في الإدخال ، فنحن نزيد من تراكم الوقت بقيمة udiCycle المعروفة بالفعل ونقارنها بإعداد الوقت. إذا تم تجاوز إعداد الوقت ، فهذا يعني أن المؤقت يعمل ، ويعطي الناتج "صحيح" ، وإلا ، يعطي الناتج "خطأ"
  • في حالة تطبيق إدخال كاذب على إدخال IN ، قم بإعادة تعيين إخراج Q وإعادة تراكم الوقت.

في نهاية الوظيفة ، لتحديد حافة الإدخال IN ، تذكر قيمتها السابقة. قم أيضًا بإعطاء المخرجات ENO (عند استخدام دالة باللغات الرسومية ، مثل LAD) قيمة الإخراج Q.

نتأكد من أن الوظيفة تعمل ، وبعد ذلك يصبح من المثير للاهتمام تقييم سرعتها ، وإذا لزم الأمر ، تحسين (يبدو بالفعل للوهلة الأولى أن عددًا من الحسابات يذهب إلى الخمول وإضاعة وقت CPU عبثا). لتقييم الأداء ، أعلن عن مجموعة من 1000 بنية بيانات عداد الوقت.

إعلان الهيكل. تكرر حقولها متغيرات الإدخال والإخراج لوظيفة المؤقت.

TYPE "typePervTONdata"
VERSION : 0.1
   STRUCT
      IN : Bool;   //  
      PT : Real;   //   
      Q : Bool;   //  
      INPrv : Bool;   //    
      MEM : LReal;   //    
      TimeACC : UDInt;   //  
   END_STRUCT;

END_TYPE

يتم الإعلان عن مجموعة من الهياكل في كتلة البيانات العالمية TortureTON:

TONs : Array[0..999] of "typePervTONdata";

يتم تنفيذ الكود التالي في الكتلة التنظيمية OB1:

FOR #i := 0 TO 999 DO
    "TortureTON".TONs[#i].IN := "startton";
    "PerversionTON"(IN := "TortureTON".TONs[#i].IN,
                    PT := "TortureTON".TONs[#i].PT,
                    Q := "TortureTON".TONs[#i].Q,
                    INPrv := "TortureTON".TONs[#i].INPrv,
                    MEM := "TortureTON".TONs[#i].MEM,
                    TimeACC := "TortureTON".TONs[#i].TimeACC);
END_FOR;

تم الإعلان عن 1000 "مثيل" من المؤقتات ، كل منها تحدده 10 ثوانٍ. تبدأ جميع أجهزة ضبط الوقت 1000 في حساب الوقت بقيمة متغير علامة startton.

أقوم بتشغيل الوظائف التشخيصية لوحدة التحكم (S7-1214C DC / DC / DC ، الإصدار FW 4.4 ، الإصدار Step7 - V16) ومشاهدة وقت دورة المسح الضوئي لوحدة التحكم. عند "الخمول" (عند وصول "false" عند إدخال أجهزة ضبط الوقت) ، تتم معالجة الألف بالكامل في المتوسط ​​لمدة 36-42 مللي ثانية. خلال العد التنازلي لمدة عشر ثوانٍ ، تنمو هذه القراءة بحوالي 6-8 مللي ثانية وأحيانًا تتدحرج لمدة 50 مللي ثانية.

نحن ننظر إلى ما يمكن تحسينه في رمز الوظيفة. أولاً ، الخطوط الموجودة في بداية كتلة البرنامج:

#udiCycle := LREAL_TO_UDINT(RUNTIME(#MEM) * 1000000); //     
#udiPT := REAL_TO_UDINT(#PT * 1000000); //   

يتم استدعاؤهم دائمًا ، بغض النظر عما إذا كان المؤقت يحسب الوقت أم لا يحسب أو تم حسابه بالفعل. مضيعة كبيرة للمال هو تحميل وحدة المعالجة المركزية غير القوية لسلسلة 1200 بحسابات تنطوي على مواد مزدوجة الدقة. من المعقول نقل كلا الخطين إلى جزء الشفرة الذي يعالج العد التنازلي (إذا استمرت "الحقيقة" في الظهور). من الضروري أيضًا تكرار حساب udiCycle في رمز يعالج ميزة إيجابية عند إدخال المؤقت. يجب أن يخفف هذا من "عملية الخمول" للمؤقت عندما تكون قيمة الإدخال خاطئة. من الناحية العملية ، تعمل أجهزة ضبط الوقت في وحدات التحكم المنطقية القابلة للبرمجة في الغالب "خاملة". على سبيل المثال ، وقت التصفية لترتد الاتصال هو عشرات المللي ثانية. نبض التحكم في خرج منفصل هو بضع مئات من المللي ثانية ، عادة من 0.5 إلى 1.0 ثانية.الوقت لرصد تنفيذ أمر الوحدة (على سبيل المثال ، الوقت الذي يفتح فيه الصمام تمامًا) من عشرات الثواني إلى عدة دقائق. يعمل PLC في الإنتاج 24 ساعة في اليوم و 365 (وأحيانًا أكثر!) أيام في السنة. بمعنى ، غالبًا ما يكون إدخال المؤقت إما "صفر" ، ولا يحسب المؤقت أي شيء ، أو تصل "الوحدة" لفترة طويلة ، وقد أحصى المؤقت كل شيء بالفعل. لتفريغ المرحلة الثانية من وحدة المعالجة المركزية في وضع الخمول (تم حساب المؤقت بالفعل) ، من الضروري التحقق في المرحلة "يستمر الإدخال في تلقي الحقيقة" - إذا كان المؤقت قد قام بالفعل بحساب كل الوقت وتعيين الإخراج إلى true. في هذه الحالة ، لا ينبغي إجراء أي حسابات.غالبًا ما يكون إدخال المؤقت إما "صفر" ، ولا يحسب المؤقت أي شيء ، أو تصل "الوحدة" لفترة طويلة ، وقد أحصى المؤقت كل شيء بالفعل. لتفريغ المرحلة الثانية من وحدة المعالجة المركزية في وضع الخمول (تم حساب المؤقت بالفعل) ، من الضروري التحقق في المرحلة "يستمر الإدخال في تلقي الحقيقة" - إذا كان المؤقت قد قام بالفعل بحساب كل الوقت وتعيين الإخراج إلى true. في هذه الحالة ، لا ينبغي إجراء أي حسابات.غالبًا ما يكون إدخال المؤقت إما "صفر" ، ولا يحسب المؤقت أي شيء ، أو تصل "الوحدة" لفترة طويلة ، وقد أحصى المؤقت كل شيء بالفعل. لتفريغ المرحلة الثانية من وحدة المعالجة المركزية في وضع الخمول (تم حساب المؤقت بالفعل) ، من الضروري التحقق في المرحلة "يستمر الإدخال في تلقي الحقيقة" - إذا كان المؤقت قد قام بالفعل بحساب كل الوقت وتعيين الإخراج إلى true. في هذه الحالة ، لا ينبغي إجراء أي حسابات.

لإجراء هذه التغييرات ، من الضروري نقل إخراج موقت Q من منطقة OUTPUT إلى منطقة IN_OUT ، وسيتم تخزين قيمة الإخراج في المتغيرات الخارجية (في هذا المثال ، في مجموعة من الهياكل). بعد التنقيح ، يكون رمز الوظيفة بالكامل ، بما في ذلك الإعلان ، على النحو التالي:

FUNCTION "PerversionTON" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_INPUT 
      IN : Bool;   //  
      PT : Real;   //    
   END_VAR

   VAR_IN_OUT 
      Q : Bool;   //  
      INPrv : Bool;
      MEM : LReal;
      TimeACC : UDInt;
   END_VAR

   VAR_TEMP 
      udiCycle : UDInt;
      udiPT : UDInt;
   END_VAR


BEGIN
	IF (#IN AND (NOT #INPrv)) THEN //         
	    #TimeACC := 0;
	    #Q := FALSE;
	    #udiCycle := LREAL_TO_UDINT(RUNTIME(#MEM) * 1000000); // " "  
	ELSIF (#IN AND #INPrv) THEN //     ""
	    IF (NOT #Q) THEN
	        #udiCycle := LREAL_TO_UDINT(RUNTIME(#MEM) * 1000000); //     
	        #udiPT := REAL_TO_UDINT(#PT * 1000000); //   
	        #TimeACC += #udiCycle; //     "    "
	        IF #TimeACC >= #udiPT THEN //      
	            #Q := TRUE; //  ""
	            #TimeACC := #udiPT; //  
	        END_IF;
	    END_IF;
	ELSE //    -      
	    #Q := FALSE;
	    #TimeACC := 0;
	END_IF;
	
	#INPrv := #IN; //  
	
	ENO := #Q; // ENO         LAD  FBD
END_FUNCTION

بعد ذلك ، يتحسن وقت التنفيذ: معالجة وقت الخمول للمؤقتات هي 23 مللي ثانية ، مع وقت تصفية عامل يبلغ 37-40 مللي ثانية.

لا يتحقق رمز الوظيفة هذا من وجود قيمة غير صالحة لإعداد المؤقت - قيمة سالبة (إذا تم تحويل المادة إلى عدد صحيح بدون إشارة ، فسيتم تشويه الإعداد) أو قيمة أكبر من 4294.9 ثانية (سيتجاوز إعداد الوقت ويشوه). يجب عليك إما التحكم في قيمة قيمة PT في الرمز ، أو تكليف مهمة التحقق من نطاق إعداد الوقت (من 0 إلى 4294.9 ثانية) إلى نظام المشغل ذي المستوى الأعلى. يؤدي التحقق من النطاق عن طريق برنامج PLC إلى زيادة وقت المعالجة إلى حوالي 45-46 مللي ثانية (وبشكل عام ، فإن الطريقة الأكثر صحة هي ضبط وقت المؤقت ليس بتنسيق REAL ، ولكن بتنسيق UDINT بالمللي ثانية والقيام بهراء).

مشروع التطبيق مع جهاز ضبط الوقت لبيئة الإصدار 16 من TIA Portal Step 7 متاح هنا .

All Articles