研选课堂
HOME
研选课堂
正文内容
排序plc编程 新手西门子PLC编程技巧,就是简单快速好用
发布时间 : 2026-02-16
作者 : 小编
访问数量 : 23
扫码分享至微信

新手西门子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环境下测试通过,大家有什么好的编程技巧,欢迎留言!

资深工程师分享:PLC程序设计思路,初学者福利

前几天有个学员咨询一个程序设计的问题,程序的控制要求如下:需要控制5台电机的运行,每台电机运行时需要记录运行时间,电机启动运行时,根据记录的运行时间,从小到大,每个2s依次启动电机的运行。

我想对于这个程序的控制要求来讲,他的难点在于如何对这些电机运行时间进行排列,排列好了后,如何根据排列的顺序去起动电机的运行,从这个控制要求中我们可以看出,这主要是分为两个部分来完成这个程序的设计的:

第一部分:用于对电机的运行时间进行从小到大顺序的排列;

第二部分:根据排列好的数据,如何判断需要起动那一台电机。

这里我们以西门子S7-200SMART系列PLC为例,先说说,如何编写一个数据排列的带参数的子程序。

数据排列带参数子程序设计思路:

西门子S7-200系列的PLC中不像三菱的FX系列PLC具有数据排列的指令,因此我们要实现这个数据的排列功能,必须自己去搭建一个这样的功能块,在搭建这个功能块的时候,会使用到间接寻址和循环指令,同时还需要应用到带参数的子程序。那么如何编写一个数据排列的子程序呢?

假设有5个数据需要把他们的数据的大小按照顺序从小到大排列,那么我们可以先在这五个数中找到最大的数放在最后面。然后在剩下的四个数中找到最大的数放到倒数第二个的位置,接着在剩下的三个数中找到最大的值放到倒数第三的位置,依次下去,这样当全部比较完后,我们的数据就按照从小到大的顺序排列好了。那么很明显,我们需要用两个循环指令进行嵌套。外层的循环指令需要循环4次,而内层的循环指令的循环次数是会变化的,因为第一次从5个数据中找出最大值,循环4次,第二次的时候从4个数据中找出最大值,循环3次,依次下去,每次需要改变循环的次数。

如何找出最大值呢? 我们可以进行比较,首先用第二个数跟第一个数比较,如果第二个数比第一个数大,那么指针往下移动变成第二个数跟第三个数比较,如果第二个数比第三个数大,那么对第二个数和第三个数进行交换,依次下去,当比较完成后,最大的数就放到最后的地址里面去了。

程序设计:

(1)建立变量表

(2)根据变量表,编写数据排列子程序

第二部分的内容: 根据排列好的数据,如何判断需要起动那一台电机。

在启动电机时,我们需要把每一台电机运行的时间拿过来与排列好的数据进行比较,看看他是位于我们这个排列好的数据中的的什么位置。然后根据这个位置来判断启动的时候。

设计思路:

在这里面我们会用到两个功能,第一个功能时把我们电机运行的时间,按照编号顺序放到表格中,例如VW20到VW28分别表示电机1到电机5的运行时间,把它放到表格中,而后把我们排列好的数据,拿过来与表格中的数据进行比较(可以使用查表指令),看看最小的值时位于表格中的哪个位置,根据查表指令所查找的位置来启动那条电机,比如查找出来的值时3则表示的就是第三台电机的运行时间最少,可以启动这第三台电机,这里我们需要用到表格指令及间接寻址。

程序:

总结

本程序作为一个框架程序,主要应用到了以下几个内容,间接寻址的应用,循环指令的应用,带参数子程序的应用,查表指令的使用,希望读者看完后,对自己以后设计程序时思路会有所启发,若有考虑不周之处或更好的方法,望指出,谢谢。

本文为技成曾鑫老师原创作品,未经同意转载必究

↓↓↓下载可免费观看西门子系列课程

相关问答

plc数据排序方法?

在PLC(可编程逻辑控制器)中进行数据排序主要有两种方法。第一种是使用数组或者数据表格进行排序。首先,将待排序的数据存储在一个数组或者数据表格中,然后使...

plc怎么实现优先级?

PLC可以通过设置不同的触发条件和时间延迟来实现优先级控制。例如,可以将紧急停机按钮设置为最高优先级触发条件,确保在任何情况下都能立即停机。同时,设定一...

plc阵列的计算方法?

PLC阵列的计算方法是按照所需控制逻辑的真值表,以及PLC的输入/输出点数和存储容量进行计算。具体来说,需要先将工艺流程及控制逻辑转换为真值表,然后根据输入/...

关于松下PLC的端子排列?

PLC外部接线与内部的IO地址是一一对应的。所以,不管是输入还是输出,调换线后,在梯形图上调换下内部地址即可。PLC外部接线与内部的IO地址是一一对应的。所以,...

西门子PLC扩展模块的I/O端口,怎么编程?

不同的PLC有不同的排列方法,西门子200的PLC挂上是自己识别的,以8为单位顺序递加的模拟量模块通道是0-2-4-6-8顺序排列的不同的PLC有不同的排列方法,西门子20...

plc加扩展先后顺序怎么看?

没先后顺序。西门子PLCs7-200扩展模块排列没有先后顺序。一般将相同类型的扩展模块放置在一起,如:DI模块和DI模块放置在一起,DO模块和DO模块放置在一起。没...

PLC的基本数据类型,我们如何在编程中选用?

PLC的基本数据类型,我们常用的有如下几种:1.布尔类型BOOL,也就是我们常说的0和1,也可以理解为True和False,对于PLC来说就是DI或者DO点的输入或输出状态...

PLC冒泡算法怎么让排序的寄存器与输出点建立对应关系?

最简单的方式,建立临时变量,寄存器内的数据比较后先放入到临时变量里,每次循环结束,再使用MOV指令将排序好的数据放入到相应地址里。既然是冒泡排序,肯定不...

PLC的安装方法有几种?

PLC的安装固定常有两种方式,一是直接利用机箱上的安装孔,用螺钉将机箱固定在控制柜的背板或面板上。其二是利用DIN导板安装。1.电源接线及端子排列P...在接...

三菱Q系列PLC的I/O单元是怎么表示的?

三菱Q系列PLC的I/O单元的软元件表示方法与其它PLC有所不同,其它PLC是按8进制排列,而三菱Q系列PLC(包括A系列)都是按16进制排列的。比如输入按X0~X0F、X10~X1F...

 叶郁青个人资料  贺晓明 
王经理: 180-0000-0000(微信同号)
10086@qq.com
北京海淀区西三旗街道国际大厦08A座
©2026  上海羊羽卓进出口贸易有限公司  版权所有.All Rights Reserved.  |  程序由Z-BlogPHP强力驱动
网站首页
电话咨询
微信号

QQ

在线咨询真诚为您提供专业解答服务

热线

188-0000-0000
专属服务热线

微信

二维码扫一扫微信交流
顶部