تالار گفتگوی سایت مهندس ماهر
درود بر همکاران
همونطور که میدونید فانکشن 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 چطوری از تایمر استفاده کنم
اگر میدونید لطفا بفرمایید
سلام
بنظر من حتی اگر تایمر به برنامه اضافه کنید برای wire break جواب نمی گیرید
ی راه اینه که دیتاها را در چنر سیکل ذخیره کنید و در صورت قطعی سیم دیتای چند سیکل قبلی که فرضاً مربوط به 1 ثانیه قبل هستش را روی خروجی فریز کنید.
با سلام دوباره
چون بنظرم برنامه جالبی اومد وقت گذاشتم کاملش کردم تستش هم جواب داد متن برنامه را براتون میفرستم. با لبه مثبت پالس (فرضاً پالس یک ثانیه) مقدار معتبر فعلی در 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