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

Notifications
Clear all

اسکیل آنالوگ با قابلیت فریز کردن آخرین مقدار در صورت بروز فالت  

  RSS

Hamid
(@hamid)
Estimable Member
عضو شده: 5 سال قبل
ارسال‌ها: 126
۰۲/۰۳/۱۴۰۱ ۷:۰۰ ب.ظ  

درود بر همکاران

همونطور که میدونید فانکشن Scale   زیمنس  عملکردش اینه که در صورت بروز فالت  خروجی Ret_Val =8  میشه و خروجی out  روی Hi_Lim  یا Lo_Lim  ست میشه.

من میخام خودم ی اسکیل بنویسم  با این تفاوت که وقتی فالت مثه وایر بریک یا قطعی تغذیه AI  رخ میده  آخرین مقدار قبل از فالت را در خروجیش نگه داره و آلارم بده

 با SCL  برنامه اش را نوشتم  که اینه

Error:=0;

currentVal:= ((Hi-Lo)/27648)*Analog + Lo;

IF error=0 THEN   Out:= currentVal;  ELSE  Out:= oldVal;     END_IF;

IF Analog<0 OR Analog>27648  THEN Error:=1 ;  END_IF;

oldVal:= currentVal;

 

ولی مشکلم اینه که در زمان وایر بریک قبل از اینکه سیگنال به می نیمم برسه جریان  تغییرات جزیی داره  که در بازه معتبره  به همین علت مقدار فریز که نشون میده مقدار  معتبر قبلی نیست بلکه مقداری است که مربوط به تغییرات جریان در زمان قطعی در بازه معتبره

متوجه شدم که اگر ی تاخیر در زمان محاسبه فریز شدن بندازم مشکل حل میشه  ولی نمیدونم در SCL  چطوری از تایمر استفاده کنم

اگر میدونید لطفا بفرمایید


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

سلام

بنظر من حتی اگر تایمر به برنامه اضافه کنید برای wire break  جواب نمی گیرید 

ی راه اینه که دیتاها را  در چنر سیکل ذخیره کنید و در صورت قطعی سیم دیتای چند سیکل قبلی که فرضاً مربوط به 1 ثانیه قبل هستش را روی خروجی فریز کنید.


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

با سلام دوباره

چون بنظرم برنامه جالبی اومد وقت گذاشتم کاملش کردم تستش هم جواب داد متن برنامه را براتون میفرستم.  با لبه مثبت پالس (فرضاً پالس یک ثانیه) مقدار معتبر فعلی  در Oldval  ذخیره میشه تا در صورت بروز فالت در خروجی فریز بشه

موفق باشید

 

 

FUNCTION_BLOCK FB1

VAR_INPUT

analog:INT;

hi_lim , lo_lim: REAL;

pulse:BOOL;

END_VAR

 

VAR_OUTPUT

error:BOOL;

out:REAL;

END_VAR

 

VAR

  currentval , oldval:REAL;  ;

mem:BOOL;

END_VAR;

 

 error:=0;

 currentval:=((Hi_lim-Lo_Lim)/27648.0)*analog + Lo_lim;

 IF analog>27648 OR analog<0 THEN error:=1; END_IF;

 IF error THEN out:= oldval; ELSE out:=currentval; END_IF;

 IF pulse AND NOT mem  AND error=0 THEN  oldval:=currentval; END_IF;

 mem:=pulse;

END_FUNCTION_BLOCK

 

 

 

 


پاسخنقل‌قول
Hamid
(@hamid)
Estimable Member
عضو شده: 5 سال قبل
ارسال‌ها: 126
۰۷/۰۳/۱۴۰۱ ۴:۱۹ ب.ظ  

@kolahi

بسیارعالی

ببخشید از اینکه وقتتون را گرفتم


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