تالار گفتگوی سایت مهندس ماهر
درود بر همکاران
اگر در PLC چند OB داشته باشیم مانند OB1 و OB35 و OB34 و ... که CPU همه را پردازش می کند و بخواهیم زمان اجرای برنامه در هر کدام را داشته باشیم و ازش ترند بگیریم چه روشی را پیشنهاد می کنید
مرسی
درود بر شما
می توان از متغیر های محلی با نام OB1_PREV_CYCLE (برای OB1) استفاده نمود و آن ها را به مموری وردها یا دیتا بلاک منتقل کرد و در WINCC ان ها را آرشیو و به ترند تبدیل نمود.
برای OB های سیکلی، متغیرهای محلی OB35_EXC_FREQ بازه زمانی فراخوانی ob را به ما میدهد و زمان اجرای برنامه را نمیدهد که شاید با برنامه نویسی بتوان این زمان را بدست آورد.
موفق باشید.
در S7-1200/1500 از اطلاعات لینک زیر استفاده کنید
در S7-300/400 برای زمان اجرای OB1 همان روشی که آقای مهندس امیدی گفتن بهترین روشه
برای زمان اجرای OB35 روش بالایی را نداریم پارامتر OB1_PREV_CYCLE در این OB ها نیست و OB35_EXC_FREQ هم فقط عدد تنظیمی برای اجرای این OB ها را نشون میده . راه حل اینه که زمان در ابتدای برنامه OB35 ثبت بشه و در انتهای برنامه هم ثبت بشه بعدش اختلاف اونا حساب بشه تا زمان پردازش برنامه محاسبه بشه . فانکشن های آماده برای این منظور هست. نمونه اش دو فانکشن در لایبراری CFC هست که در عکس پیوست می بینید. Time_BEG را در اول OB35 صدا بزنید خروجیش زمان فعلی را ثبت می کنه . Time_END را در انتهای برنامه OB35 صدا بزنین و به ورودیش زمان ثبت شده قبلی را بدین این فانکشن اختلاف دو زمان را محاسبه می کنه و نتیجه را بهتون میده که می تونید ازش ترند بگیرید یا ماکزیممش را حساب کنید . با توجه به زمان کوتاه و تغییرات زیادی که ممکنه سیکل اسکن داشته باشه حتی اگر ترند را روی Upon change تنظیم کنید تغییرات درست دیده نمیشه بنابراین بهتره همیشه ماکزیمم را مانیتور کنید . برای ماکزیمم گیری جنس متغیر ها را DINT بگیرید تا بشه کار محاسباتی روش انجام داد مثلا می تونید کد SCL زیر را در یک فانکشن بنویسید
FUNCTION_BLOCK FB10
VAR_INPUT
val : DINT;
END_VAR
VAR_OUTPUT
MX :DINT;
END_VAR
IF val> mx THEN mx:=val; END_IF;
END_FUNCTION_BLOCK
موفق باشید