西门子SCL编程实例——冒泡排序算法(更新版)
之前我曾写过一篇SCL冒泡排序算法的文章(西门子SCL语言编程实例——冒泡排序 | 北岛夜话),文中的算法在某些情况下会出现错误,原因是SCL语言的数组的上限和下限可以自由定义,这点与C/C++的不同。今天这篇文章,给大家介绍下更新版的冒泡排序算法,它不但适用于下限从0开始的数组,还适用于下限是负数或其它任意数的数组。
为了能支持上升沿信号检测,我不用之前的函数(FC),而是采用函数块(FB)来实现该算法。
在博途环境下新建函数块FB5011_BubleSort,声明变量如下图所示:
其中:
enable:使能排序算法(内部上升沿信号检测);mode:排序的方式,0=升序,1=降序;arraySort:变长数组,排序数据的来源;代码如下:
使用之前文章介绍的生产随机数的函数初始化多个数组,然后使用该算法对数组中的元素进行排序,结果如下:
①数组arraySort的下限为1,上限为20,采用升序排序:
②数组arraySort2的下限为-2,上限为20,采用升序排序:
③数组arraySort3的下限为10,上限为30,采用降序排序:
④数组arraySort4的下限为0,上限为30,采用降序排序:
关于冒泡排序更新版就先介绍到这里,如果你有任何问题欢迎留言讨论。
我的书《西门子S7-1200/1500 PLC SCL语言编程》比较详细的介绍了SCL的编程,感兴趣的话可以看看下面的链接:
#pgc-card .pgc-card-href { text-decoration: none; outline: none; display: block; width: 100%; height: 100%; } #pgc-card .pgc-card-href:hover { text-decoration: none; } /*pc 样式*/ .pgc-card { box-sizing: border-box; height: 164px; border: 1px solid #e8e8e8; position: relative; padding: 20px 94px 12px 180px; overflow: hidden; } .pgc-card::after { content: " "; display: block; border-left: 1px solid #e8e8e8; height: 120px; position: absolute; right: 76px; top: 20px; } .pgc-cover { position: absolute; width: 162px; height: 162px; top: 0; left: 0; background-size: cover; } .pgc-content { overflow: hidden; position: relative; top: 50%; -webkit-transform: translateY(-50%); transform: translateY(-50%); } .pgc-content-title { font-size: 18px; color: #222; line-height: 1; font-weight: bold; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .pgc-content-desc { font-size: 14px; color: #444; overflow: hidden; text-overflow: ellipsis; padding-top: 9px; overflow: hidden; line-height: 1.2em; display: -webkit-inline-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; } .pgc-content-price { font-size: 22px; color: #f85959; padding-top: 18px; line-height: 1em; } .pgc-card-buy { width: 75px; position: absolute; right: 0; top: 50px; color: #406599; font-size: 14px; text-align: center; } .pgc-buy-text { padding-top: 10px; } .pgc-icon-buy { height: 23px; width: 20px; display: inline-block; background: url(https://lf6-cdn-tos.bytescm.com/obj/cdn-static-resource/pgc/v2/pgc_tpl/static/image/commodity_buy_f2b4d1a.png); } 西门子S7-1200/1500 PLC SCL语言编程从入门到精通 ¥69 购买新手西门子PLC编程技巧,就是简单快速好用
本文通过例程的方式总结一些常用的西门子PLC编程技巧,从简单到复杂,从梯形图到SCL,希望对大家有所帮助。
(一)PLC系统常闭点
PLC程序的绝对常闭点,可以作为逻辑支路断开、调试或检修的屏蔽开关,尽量使用比较独立的存储位。
(二)PLC系统常开点
PLC程序的绝对常开点,可以作为逻辑支路接通、调试或检修的接通开关,尽量使用比较独立的存储位。
(三)PLC系统上电脉冲
PLC程序的系统上电脉冲,可以作为系统初始化脉冲来复位、清零和设置系统重要参数,尽量使用比较独立的存储位。
(四)一键触发启停功能
用一个按钮实现启动和停止功能,可以作为操作按钮不够时的一个补救措施。
(五)模拟量输入标定功能
将整数的模拟量标定为实数的工程量,相当于博途中自带的SCALE_X ,但该子程序结合高低量程限制后,标定和调试都更加方便。
(1)子程序调用
(2)子程序变量声明
(3)SCL代码
IF (#Emin < #Emax) AND (#Dmin < #Dmax) THEN
IF #Raw < #Dmin THEN
#RawTemp := #Dmin;
END_IF;
IF #Raw > #Dmax THEN
#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)) * 100.0;
ELSE
#OutReal := 0.0;
#OutPercentage := 0.0;
END_IF;
(六)模拟量输出标定功能
将实数的工程量标定为整数的数字量,相当于博途中自带的NORM_X ,但该子程序结合高低量程限制后,标定和调试都更加方便。
(1)子程序调用
(2)子程序变量声明
(3)SCL代码
IF (#Dmin < #Dmax) AND (#Emin < #Emax) THEN
IF #Raw < #Emin THEN
#RawTemp := #Emin;
END_IF;
IF #Raw > #Emax THEN
#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))) * 100.0;
ELSE
#OutInteger := 0;
#OutPercentage := 0.0;
END_IF;
RETURN;
(七)冒泡法排序功能
通过冒泡法升序或降序模式排序数组。
(1)子程序调用
(2)子程序变量声明
(3)模式为1(升序)的运行结果如下图所示:
(4)模式为0(降序)的运行结果如下图所示:
(5)SCL代码
IF #Enable THEN
//获取数组上限
#L := LOWER_BOUND(ARR := #Array, DIM := 1);
//获取数组下限
#H := UPPER_BOUND(ARR := #Array, DIM := 1);
//冒泡法排序
FOR #i := #L TO #H-1 DO
FOR #j := #L TO #H-1-#i DO
IF #Mode THEN
//升序
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 = true THEN
#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 / 1000.0;
#LastTime := #ActualTime;
IF #SetPoint < #AuxOut THEN
#Out := #AuxOut;
#auxR := #AuxOut - (#Rate * #DeltaTime);
#Out := #AuxOut;
#AuxOut := MAX(IN1 := #auxR, IN2 := #SetPoint);
#Out := #AuxOut;
RETURN;
ELSE
IF #SetPoint > #AuxOut THEN
#Out := #AuxOut;
#auxR := (#Rate * #DeltaTime) + #AuxOut;
#Out := #AuxOut;
#AuxOut := MIN(IN1 := #auxR, IN2 := #SetPoint);
#Out := #AuxOut;
END_IF;
END_IF;
RETURN;
例程说明
以上例程均在博途V15.1环境下测试通过,大家有什么好的编程技巧,欢迎留言!
相关问答
PLC300冒泡排序法程序怎么写?
冒泡排序每一趟排序把最大的放在最右边。比如:871256457887和12交换:128756457887和56交换:5687457887和45交换:458778...
plc冒泡排序算法?
你好,PLC(可编程逻辑控制器)通常不是用于执行排序算法的。但是,如果要使用PLC实现冒泡排序算法,可以使用以下步骤:1.初始化数组并将其存储在PLC中。2....
co2细化器为什么不冒泡?
1、通信线是否制作正确,根据不同品牌的PLC通信线的焊接脚顺序是不同的。2、检查波特率设置,PLC端口的和触摸屏的波特率站号校验性都要一直。3、硬件配置...
带“水”字旁或带“金”字旁的成语有哪些?
6、水利枢纽造句:该文就一个水利枢纽的计算机网络的建设,描述了网络提供的功能、网络拓扑以及所采用的软硬件技术,简要介绍了网络建设的一般步骤方法。解...
吊扇调速开关的改装_一起装修网
有专业的变频器/直流调速/PLC/伺服系统维修室维修设备。地址:成青羊区培风路80号16栋38号希望我的回答能够帮助到您。7那种装饰用的吊扇好吗这个要根据家里...
各位大佬谁清楚,蜂蜜设备加工流水线有什么特点?
[回答]蜂蜜设备加工流水线1.制定了不锈钢板活塞缸精密机械加工加工工艺,确保灌装一致,使密封环长期运作不容易损坏。2.活塞机灌装方法,由PLC相互配合工业...
burberry酒是什么牌子?
burberry酒是burberry的贴牌酒,当赠品或者福利卖的。博柏利(Burberry)是英国的奢侈品品牌,隶属于博柏利集团(BurberryGroupPlc),也称巴宝莉。经营的产......
大神们!麻烦回答一下啤酒教学试验设备有些什么工具?
[回答]啤酒教学试验设备葡萄酒、果酒教学试验设备与法国国际酿酒师团队(CLOVITIS)联合开发设计,本产品可满足红葡萄酒、白葡萄酒、桃红葡萄酒、起泡葡萄酒...
楼主请问:蜂蜜设备加工流水线有什么特点?
[回答]蜂蜜设备加工流水线1.制定了不锈钢板活塞缸精密机械加工加工工艺,确保灌装一致,使密封环长期运作不容易损坏。2.活塞机灌装方法,由PLC相互配合工业...
敢问大家,啤酒教学试验设备有些什么工具?
[回答]控制系统完全采用西门子可编程控制器PLC、工控机及其他自控元件,其特点便于集中管理、离散控制、抗干扰性强、可靠性强、可以和多种PLC及过程计算机...