.

西门子PLC编程技巧,就是好用

我国知名研究白癜风的专家 http://m.39.net/disease/a_5481255.html

本文通过例程的方式总结一些常用的西门子PLC编程技巧,从简单到复杂,从梯形图到SCL,希望对大家有所帮助。

(一)PLC系统常闭点PLC程序的绝对常闭点,可以作为逻辑支路断开、调试或检修的屏蔽开关,尽量使用比较独立的存储位。(二)PLC系统常开点

PLC程序的绝对常开点,可以作为逻辑支路接通、调试或检修的接通开关,尽量使用比较独立的存储位。

(三)PLC系统上电脉冲

PLC程序的系统上电脉冲,可以作为系统初始化脉冲来复位、清零和设置系统重要参数,尽量使用比较独立的存储位。

(四)一键触发启停功能

用一个按钮实现启动和停止功能,可以作为操作按钮不够时的一个补救措施。

(五)模拟量输入标定功能

将整数的模拟量标定为实数的工程量,相当于博途中自带的SCALE_X,但该子程序结合高低量程限制后,标定和调试都更加方便。

(1)子程序调用

(2)子程序变量声明

(3)SCL代码IF(#Emin#Emax)AND(#Dmin#Dmax)THENIF#Raw#DminTHEN#RawTemp:=#Dmin;END_IF;IF#Raw#DmaxTHEN#RawTemp:=#Dmax;END_IF;IF(#Raw=#Dmin)AND(#Raw=#Dmax)THEN#RawTemp:=#Raw;END_IF;#OutReal:=(INT_TO_REAL(#RawTemp-#Dmin)/INT_TO_REAL(#Dmax-#Dmin))*(#Emax-#Emin)+#Emin;#OutPercentage:=(#OutReal/(#Emax-#Emin))*.0;ELSE#OutReal:=0.0;#OutPercentage:=0.0;END_IF;(六)模拟量输出标定功能

将实数的工程量标定为整数的数字量,相当于博途中自带的NORM_X,但该子程序结合高低量程限制后,标定和调试都更加方便。

(1)子程序调用

(2)子程序变量声明

(3)SCL代码IF(#Dmin#Dmax)AND(#Emin#Emax)THENIF#Raw#EminTHEN#RawTemp:=#Emin;END_IF;IF#Raw#EmaxTHEN#RawTemp:=#Emax;END_IF;IF(#Raw=#Emin)AND(#Raw=#Emax)THEN#RawTemp:=#Raw;END_IF;#OutInteger:=REAL_TO_INT(((#RawTemp-#Emin)/(#Emax-#Emin))*INT_TO_REAL(#Dmax-#Dmin)+INT_TO_REAL(#Dmin));#OutPercentage:=((((#RawTemp-#Emin)/(#Emax-#Emin))*INT_TO_REAL(#Dmax-#Dmin)+INT_TO_REAL(#Dmin))/INT_TO_REAL((#Dmax-#Dmin)))*.0;ELSE#OutInteger:=0;#OutPercentage:=0.0;END_IF;RETURN;(七)冒泡法排序功能

通过冒泡法升序或降序模式排序数组。

(1)子程序调用

(2)子程序变量声明

(3)模式为1(升序)的运行结果如下图所示:

(4)模式为0(降序)的运行结果如下图所示:

(5)SCL代码

IF#EnableTHEN

//获取数组上限

#L:=LOWER_BOUND(ARR:=#Array,DIM:=1);

//获取数组下限

#H:=UPPER_BOUND(ARR:=#Array,DIM:=1);

//冒泡法排序

FOR#i:=#LTO#H-1DO

FOR#j:=#LTO#H-1-#iDO

IF#ModeTHEN

//升序

IF#Array[#j]#Array[#j+1]THEN

#temp1:=#Array[#j];

#Array[#j]:=#Array[#j+1];

#Array[#j+1]:=#temp1;

END_IF;

ELSE

//降序

IF#Array[#j]#Array[#j+1]THEN

#temp1:=#Array[#j];

#Array[#j]:=#Array[#j+1];

#Array[#j+1]:=#temp1;

END_IF;

END_IF;

END_FOR;

END_FOR;

END_IF;

(八)斜坡函数功能

输出值按照指定斜率(单位/秒)跟随设定值,可以用来防止数值突变,这个功能可以在博途中添加扩展库函数(LGF)后直接调用Ramp函数。

(1)子程序调用

(2)子程序变量声明

(3)SCL代码#rv1:=RD_SYS_T(#ActualTime);IF#InitFB=trueTHEN#LastTime:=#ActualTime;#AuxOut:=#SetPoint;#Out:=#AuxOut;END_IF;#DeltaTime_T:=T_DIFF(IN1:=#ActualTime,IN2:=#LastTime);#DeltaTime_DI:=TIME_TO_DINT(#DeltaTime_T);#DeltaTime:=DINT_TO_REAL(#DeltaTime_DI);#DeltaTime:=#DeltaTime/0.0;#LastTime:=#ActualTime;IF#SetPoint#AuxOutTHEN#Out:=#AuxOut;#auxR:=#AuxOut-(#Rate*#DeltaTime);#Out:=#AuxOut;#AuxOut:=MAX(IN1:=#auxR,IN2:=#SetPoint);#Out:=#AuxOut;RETURN;ELSEIF#SetPoint#AuxOutTHEN#Out:=#AuxOut;#auxR:=(#Rate*#DeltaTime)+#AuxOut;#Out:=#AuxOut;#AuxOut:=MIN(IN1:=#auxR,IN2:=#SetPoint);#Out:=#AuxOut;END_IF;END_IF;RETURN;例程说明以上例程均在博途V15.1环境下测试通过,大家有什么好的编程技巧,欢迎留言!老敬




转载请注明:http://www.abachildren.com/hbyx/280.html