تالار گفتگوی سایت مهندس ماهر
سلام خدمت دوستان عزیز.
توی PCS7 (بیشتر برنامه بایستی با بلوک های لایبرری CEMAT نوشته بشه) یه تایمر (به فرض ON DELAY) می خوام که حد بالا و پایین بگیره و هربار بعد RESET شدن، تایمر یه زمان رندوم در بازه تعریف شده به خودش بگیره و بر اون اساس عمل کنه.
ممنون از پاسخگویی توووون
سلام وقت بخیر
به نظر بنده برای این کار بلاک آماده ای در cfc نیست و لزوماً باید از زبان scl برای نوشتن Source آن استفاده کنید.
با سلام
ابتدا شما نیاز به فانکشن برای تولید عدد رندوم دارید. چنین فانکشنی را در لایبراری های زیمنس ندیدم و لازمه طراحی بشه.
اگر فانکشن Random Generator را داشته باشید می تونید خروجی آن را به تایمر Timer_P در CFC بدید و لاجیک تحریک تایمر و مد کاری آن را به دلخواه در CFC طراحی کنید.
من در اینجا یک فانکشن را که با اقتباس از کتاب SCL استاد ماهر نوشته ام را میفرستم تا استفاده کنید .
این فانکشن طبق عکس ضمیمه با یک شدن پایه Generate یک عدد رندوم در بازه hi و lo که به دلخواه وارد می کنید بهتون میده. این عدد Real است و به پایه Time0 تایمر وصل می کنید بنابراین واحد آن ثانیه خواهد بود.
چون در منطق کنترل از Clock Memory استفاده کرده ام لازمه در Hwconfig پالس CPU را فعال کنید و آدرس بایت آن را به پایه ClockByte فانکشن بدید.
عملکرد فانکشن به این شکله که زمان را از SFC64 به نام TIME_TCKمیگیره که این زمان بطور مداوم در حال تغییره . بعد از Clocl Memory استفاده می کنه و اونو در یک Double Word هر بار یک بیت به راست می چرخونه با دستور Rotate و آخر این دو را با هم XOR می کنه و عدد رندوم را بدست میاره . سپس عددی که در بازه lo و hi باشه را وقتی Generate یک شد به شما میده
فانکشن را در SCL Source بصورت زیر بنویسید و تست کنید.
موفق باشید
FUNCTION_BLOCK FB3
TITLE = 'Random Generator'
VERSION: '1.0'
AUTHOR: Kolahi
VAR_INPUT
generate:BOOL;
hi,lo :REAL;
clockbyte:INT;
END_VAR
VAR_OUTPUT
random:real;
END_VAR
VAR
v1:TIME;
v2,v3:WORD;
v4 :real;
END_VAR
md[clockbyte]:=ROR(in:=md[clockbyte] , n:=1);
v1:=TIME_TCK(); // TIME
v2:= DINT_TO_WORD(TIME_TO_DINT(v1));
v3:=v2 XOR mw[clockbyte];
v4:=DINT_TO_REAL(WORD_TO_DINT(v3));
IF generate AND v4>lo*1000 AND v4<hi*1000 THEN
random:=v4/1000;
END_IF;
END_FUNCTION_BLOCK
درود بر شما
به نظرم برای این موضوع بلوک noise generator مفید هست و میتونید یه آفست با دامنه نوسان دلخواه به ورودی هاش بدید و خروجی رو نهایتا با بلوک limit بین حدود مطلوب محدود کنید
موفق باشید.