تالار گفتگوی سایت مهندس ماهر

Notifications
Clear all

تایمر با زمان رندوم  

  RSS

PLCMAN
(@plcman)
New Member
عضو شده: 6 سال قبل
ارسال‌ها: 1
۲۵/۰۶/۱۳۹۸ ۹:۰۰ ب.ظ  

سلام خدمت دوستان عزیز.

توی PCS7 (بیشتر برنامه بایستی با بلوک های لایبرری CEMAT نوشته بشه) یه تایمر (به فرض ON DELAY) می خوام که حد بالا و پایین بگیره و هربار بعد RESET شدن، تایمر یه زمان رندوم در بازه تعریف شده به خودش بگیره و بر اون اساس عمل کنه. 

ممنون از پاسخگویی توووون 


نقل‌قول
SGH
 SGH
(@sgh)
Trusted Member
عضو شده: 7 سال قبل
ارسال‌ها: 91
۱۱/۰۷/۱۳۹۸ ۸:۱۶ ق.ظ  

سلام وقت بخیر

به نظر بنده برای این کار بلاک آماده ای در cfc نیست و لزوماً باید از زبان scl برای نوشتن Source آن استفاده کنید. 


پاسخنقل‌قول
kolahi
(@kolahi)
Estimable Member
عضو شده: 7 سال قبل
ارسال‌ها: 234
۰۴/۰۴/۱۴۰۱ ۷:۰۸ ب.ظ  

با سلام

ابتدا شما نیاز به فانکشن برای تولید عدد رندوم دارید. چنین فانکشنی را در لایبراری های زیمنس ندیدم و لازمه طراحی بشه.

اگر فانکشن 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

 


پاسخنقل‌قول
amir omidi
(@amiromidi)
Trusted Member
عضو شده: 7 سال قبل
ارسال‌ها: 56
۱۳/۰۴/۱۴۰۱ ۸:۲۱ ق.ظ  

درود بر شما

به نظرم برای این موضوع بلوک noise generator مفید هست و میتونید یه آفست با دامنه نوسان دلخواه به ورودی هاش بدید و خروجی رو نهایتا با بلوک limit  بین حدود مطلوب محدود کنید

موفق باشید.


پاسخنقل‌قول
Share: