西门子 _子程序_
- 格式:pdf
- 大小:155.25 KB
- 文档页数:5
浅谈西门子编程语言《子程序的调用》作者:李强来源:《科技创新导报》2019年第04期摘 ; 要:针对机电专业的学生学习西门子功能编程语言比较困难,功能编程语言经常用到子程序,从子程序的特点,运行方式,举例应用完整技术介绍了子功能编程,写程序时经常用到子程序,它是架构式的编程,学习西门子功能指令的重点和难点。
本文研究分析了西门子编程语言《子程序的调用》,希望为广大读者提供参考。
关键词:程序特点 ;运行方式 ;梯形图中图分类号:TP39 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; 文献标识码:A ; ; ; ; ; ; ; ; ; ; ; ;文章编号:1674-098X(2019)02(a)-0148-021 ;子程序的特点(1)子程序只有在主程序发出调用指令的时候才运行,运行完毕后,自动返回主程序,所以不用每个扫描周期都执行,这样可以减少整个程序的运行时间,对于一些初始化的程序,写在子程里比较合适。
(2)S7-200 CPU可以写64个子程序(0-63) CPU226XM还可以写128个子程序(0-127)。
(3)子程序可以嵌套使用(主程序中调用子程序,子程序再调用子程序),最大嵌套深度为8级,但是中断程序里不能嵌套子程序。
(4)子程序默认的名称是SBR_n。
(n子程序编号)也可以修改。
2 ;子程序的运行方式(1)并列运行,一个程序中有多个子程序,之间没有嵌套的关系,是并列的,只要调用的条件满足,这个子程序就能被运行。
(2)嵌套运行,主程序调用子程序,子程序还可以再调用子程序,这种方式叫做嵌套,最多可以嵌套8层,这种情况下,各个子程序的运行有先后之分。
(3)在子程序中不能使用END(结束指令),每一个每一个子程序在编译时编译器自动在子程序的最后加入无条件返回指令,当用户需要编程实现有条件返回时,可以在子程序使用有条件返回RET指令。
(4)带参数调用子程序。
在调用子程序时可以带参数调用。
西门子S7-200子程序基本操作
这是西门子的定时器指令,
可以在指令数中展开,然后进行调用
调用了定时器后,又调用了子程序
初始便自带了一个子程序SBR_0,和一个中断程序INT_0 你也可以改它们的名字
如果一个SBR_0不够
可以插入子程序
上面的是变量申明表,即计算机语言中的形参
在变量申明表中申明的变量,都是形参
这些形参是在调用时赋值、赋地址的
当然,在子程序中,你也可以用绝对地址,即I0.0、Q0.0,但这样不方便移植,而且建不了库,关于建库,等以后更熟练的掌握了后再详解。
定时器的PT值最多32767,即2#0111 1111 1111 1111的十进制值,与三菱的K值相同当然,这个PT值你也可以设成负值,程序运行时不会报错,有什么妙用我也不知道你要知道的话就告诉我让我知道
一开始在变量申明表中申明的in和out都是形参,在调用SBR_1时,将绝对地址赋给这些形参。
那么网络3所调用的子程序便成了
LD I0.0
= Q0.0
网络4所调用的子程序便成了
LD I0.1
= Q0.1。
REGION DeviceStatusIndication 设备状态指示IF #Device.Recondition = 1 THEN#Device.Status := 0; // DeviceMaintenanceStatus 设备检修状态END_IF;IF #Device.Recondition = 0 THENIF #Device_REM = 0 THEN#Device.Status := 1; // DeviceNoReadyStatus设备未就绪状态END_IF;END_IF;IF #Device.Recondition = 0 THENIF #Device_REM = 1 THENIF #Device.Error = 1 THEN#Device.Status := 2; //DeviceFaultStatus 设备故障状态END_IF;END_IF;END_IF;IF #Device.Recondition = 0 THENIF #Device_REM = 1 THENIF #Device.Error = 0 THENIF #Device.AMConvert = 0 THEN#Device.Status := 3; //DeviceManualControlStatus 设备手动控制状态END_IF;END_IF;END_IF;END_IF;IF #Device.Recondition = 0 THENIF #Device_REM = 1 THENIF #Device.Error = 0 THENIF #Device.AMConvert = 1 THEN#Device.Status := 4; //DeviceAutomaticControlStatus 设备自动控制状态END_IF;END_IF;END_IF;END_IF;END_REGIONREGION DeviceControlProcessing 设备控制过程CASE #Device.Status OF //设备状态信号0: //DeviceMaintenanceStatus 设备检修状态#Device.AutomaticControl_Static := 0;1: //DeviceNoReadyStatus设备未就绪状态#Device.ManualControl_Static := 0;#Device.AutomaticControl_Static := 0;RESET_TIMER(#IEC_Timer_0_Instance);2: //DeviceFaultStatus 设备故障状态#Device.ManualControl_Static := 0;#Device.AutomaticControl_Static := 0;IF #Device.ErrorReset = 1 THEN#Device.Error1 := 0;#Device.Error2 := 0;#Device.Error := 0;#Device.ErrorReset := 0;END_IF;3: //DeviceManualControlStatus 设备手动控制状态#Device.AutomaticControl_Static := 0;IF #Device.Startup = 1 OR #Device.Start_INLOCK = 1 THEN #Device.ManualControl_Static := 1;END_IF;IF #Device.Suspend = 1 OR #Device.Stop_INLOCK = 1 THEN #Device.ManualControl_Static := 0;RESET_TIMER(#IEC_Timer_0_Instance);END_IF;IF #Device.ManualControl_Static = 1 THENIF #Device_RUN = 0 THEN#IEC_Timer_0_Instance(IN := NOT #Device_RUN,PT := t#5s);#Device.Error2 := #IEC_Timer_0_Instance.Q;ELSERESET_TIMER(#IEC_Timer_0_Instance);END_IF;END_IF;IF #Device_FLT = 1 THEN#Device.Error1 := 1;END_IF;IF #Device.Error1 = 1 OR #Device.Error2 = 1 THEN#Device.ManualControl_Static := 0;#Device.Error := 1;RESET_TIMER(#IEC_Timer_0_Instance);END_IF;4: //DeviceAutomaticControlStatus 设备自动控制状态IF #Device.Start_INLOCK = 1 OR #Device.Stop_INLOCK = 1 THENIF #Device.Start_INLOCK = 1 THEN#Device.AutomaticControl_Static := 1;END_IF;IF #Device.Stop_INLOCK = 1 THEN#Device.AutomaticControl_Static := 0;RESET_TIMER(#IEC_Timer_0_Instance);END_IF;ELSEIF #Device.AotoStart_Flag = 1 THEN#Device.AutomaticControl_Static := 1;END_IF;IF #Device.AotoStop_Flag = 1 THEN#Device.AutomaticControl_Static := 0;RESET_TIMER(#IEC_Timer_0_Instance);END_IF;END_IF;IF #Device.AutomaticControl_Static = 1 THENIF #Device_RUN = 0 THEN#IEC_Timer_0_Instance(IN := NOT #Device_RUN,PT := t#5s);#Device.Error2 := #IEC_Timer_0_Instance.Q;ELSERESET_TIMER(#IEC_Timer_0_Instance);END_IF;IF #Device_FLT = 1 THEN#Device.Error1 := 1;END_IF;IF #Device.Error1 = 1 OR #Device.Error2 = 1 THEN#Device.AutomaticControl_Static := 0;#Device.Error := 1;#Device.AMConvert := 0;RESET_TIMER(#IEC_Timer_0_Instance);END_IF;END_IF;END_CASE;END_REGIONREGION DeviceControlOutput 设备控制输出IF #Device.Recondition = 0 THENIF #Device.ManualControl_Static = 1 OR #Device.AutomaticControl_Static = 1 THEN#Device_STAP := 1;ELSE#Device_STAP := 0;END_IF;END_IF;END_REGIONREGION DeviceManualControlReset 设备手动控制复位#Device.Startup := 0;#Device.Suspend := 0;END_REGION。
西门子S7-200子程序,多次调用的“怪”现象(2013-09-09 09:55:26)转载▼标签:分类:S7-200工控老鬼s7-300启程plc培训s7200深圳plc培训西门子S7-200子程序,多次调用的“怪”现象在S7-200编程中,子程序想必大家都用过,使用子程序可以更好地组织程序结构,便于阅读和调试,也可以缩短程序代码。
但是使用子程序也有一些需要注意的地方,除了子程序在同一周期内被多次调用时,不能使用上升沿、下降沿、定时器和计数器之外,还有子程序中局部变量的特点,在编程多次调用带参数子程序时要特别注意。
下面就是前些天热线上遇到的一个Case,非常有代表性,在这里跟大家分享。
E:您好,西门子技术支持。
C:您好,我想问下,200子程序是不是多次调用时会不好使?E:不会啊,您是不是在子程序里使用了沿指令或者定时器?C:没有啊,我就编了一句很简单的开关程序,开关闭合,线圈导通,然后主程序里调用了两次这个子程序,结果第一个I点闭合了,两个Q点都导通了。
E:(心里活动:看来是和子程序的局部变量有关了,估计客户程序逻辑有问题)那请您描述一下您的子程序吧,我帮您看看。
于是客户描述了一下自己的程序,大致了解了之后告知客户我这边测试下,稍后回复。
客户的程序是这样的:子程序:是个常见的自保持逻辑,接口参数如红框所示。
图. 01主程序:调用了两次上面的子程序,实现I0.0和I0.1控制Q0.0的闭合和断开,I0.2和I0.3控制Q0.1的闭合和断开。
图. 02那么在线测试下程序执行情况,发现果然如客户所描述的,I0.0为1后,Q0.0和Q0.1都为1了。
见下图.03所示。
而如果闭合I0.2,则Q0.0和Q0.1都断开。
图. 03为什么会这样呢?首先我们先明确子程序局部变量的特点。
局部变量的变量类型分为四种:IN,IN_OUT,OUT和TEMP,局部变量存储区是在子程序调用时开辟的,子程序调用完成,局部变量占用的存储空间释放。
西门子数控.子程序调用的花样年华
带形参的子程序调用
在调用带参数传递的子程序时常常会出现程序名称未定义的报警等问题,需要怎么解决呢?一般在主程序开始处,必须用EXTERN声明带参数传递的子程序,说明子程序名称,并且按照传递顺序说明变量类型。
注意:只有当子程序在零件工件下或者子程序目录下时才必须要EXTERN说明,用户循环或制造商循环目录下的带形参子程序(需要NC重启生效)则不需要 EXTERN 说明。
具体问题及操作过程举例如下:
1. 首先在子程序目录下建立一个带形参的子程序AAA。
2. 零件程序目录下建立一个主程序WK.SPF
3. 执行主程序,会调用子程序,报警如下:
4. 在主程序开始加入EXTERN指令后,主程序运行正常,报警解除。
转发到朋友圈吧,你的朋友也在找这篇文章呢!。
西门子PLC子程序的作用子程序常用于需要多次反复执行相同任务的地方,只需要写一次子程序,别的程序在需要子程序的时候调用它,而无需重写该程序。
子程序的调用是有条件的,未调用它时不会执行子程序中的指令,因此使用子程序可以减少扫描时间。
使用子程序可以将程序分成容易管理的小块,使程序结构简单清晰,易于查错和维护。
如果子程序中只引用参数和局部变量,可以将子程序移植到其他项目。
为了移植子程序,应避免使用全局符号和变量,如I、Q、M、SM、Al、AQ、V、T、C、S、AC等存储器中的绝对地址。
西门子PLC子程序的创建方法可采用下列方法创建PLC子程序:在“编辑”菜单中选择“插入→子程序”;在程序编辑器视窗中按鼠标右键,从弹出菜单中选择“插入→子程序”。
程序编辑器将从原来的POU显示进入新的子程序,程序编辑器底部将出现标志新的子程序的新标签,在程序编辑器窗口中可以对新的子程序编程。
可以使用该子程序的局部变量表定义参数,各子程序最多可以定义16个IN、OUT参数。
用右键双击指令树中的子程序或中断程序的图标,在弹出的窗口中选择“重新命名”,可修改它们的名称。
艾驰商城是国内最专业的MRO工业品网购平台,正品现货、优势价格、迅捷配送,是一站式采购的工业品商城!具有10 年工业用品电子商务领域研究,以强大的信息通道建设的优势,以及依托线下贸易交易市场在工业用品行业上游供应链的整合能力,为广大的用户提供了传感器、图尔克传感器、变频器、断路器、继电器、PLC、工控机、仪器仪表、气缸、五金工具、伺服电机、劳保用品等一系列自动化的工控产品。
如需进一步了解台达PLC、西门子PLC、施耐德plc、欧姆龙PLC的选型,报价,采购,参数,图片,批发等信息,请关注艾驰商城/。
S7-200 程序结构
西门子S7-200的程序有三种:主程序、子程序、中断程序。
主程序只有一个,名称为OB1。
子程序可以达到64个,名称分别为SBR0-SBR63。
子程序可以由子程序或中断程序调用。
中断程序可以达到128个,名称分别为INT0-INT127。
中断方式有输入中断、定时中断、高速计数中断、通信中断事件引发,当CPU响应中断时,可以执行中断程序。
由这三种程序可以组成线性程序和分块程序两种结构。
一、线性程序结构
线性程序是指一个工程的全部控制任务都按照工程控制的顺序写在一个程序中,比如写在OB1中。
程序执行过程中,CPU不断地扫描OB1,按照事先准备好的顺序去执行工作,线性程序结构简单,一目了然。
但是,当控制工程大到一定程序之后,仅仅采用线性程序就会使整个程序变得庞大而难于编制、难于调试了。
二、分块程序结构
分块程序是指一个工程的全部控制任务被分成多个小的任务块,每个任务块的控制任务根据具体情况分别放到子程序中,或者放到中断程序中。
程序执行过程中,CPU不断地调用这些子程序或者被中断程序中断。
分块程序虽然结构复杂一些,但是可以把一个复杂的过程分解成多个简单的过程。
对于具体的程序块容易编写,容易调试。
从总体上看,分块程序的优势是十分明显的。
子程序调用的常问问题1、为什么指令或者子程序的使能(EN)管脚前没有任何条件时,会有编译错误?当子程序或者指令的使能管脚前面没有编写任何条件时,编译后会出现一个语法错误,如图.无条件调用指令或子程序所示:图.无条件调用指令或子程序上面的编程方式是不被允许的。
如果用户希望无条件调用子程序或者指令,可以使用SM0.0作为使能条件,如图1.SM0.0作为使能条件所示:图1. SM0.0作为使能条件2、为什么子程序已经不激活了,但是子程序的输出没有复位?以下面一个简单子程序SBR_0为例,SBR_0将一个IN类型的布尔变量IN1直接连接到一个OUT布尔变量OUT1。
在主程序中使用M0.0条件调用SBR_0,如图2.子程序输出所示:图2.子程序输出当M0.0为‘1’时,子程序执行,CPU_输入0有信号时,CPU_输出0有信号输出。
此时将M0.0复位,则子程序不再执行,输出OUT1保持子程序最后一次执行的状态,不会被自动复位。
3、在子程序中如果使用了上升沿捕捉时指令,那么此子程序被多次重复调用时,为什么上升沿捕捉逻辑不能正常执行?举一个简单的例子,在子程序SBR_0中声明一个布尔类型输入变量和一个布尔类型的输出变量,输入变量IN1通过一个常开触点连接一个上升沿捕捉指令,之后再连接一个线圈输出到输出变量OUT1。
在主程序中的网络1和网络2中,连续使用SM0.0作为使能条件两次调用子程序SBR_0,子程序的输入输出分别连接M0.0、M0.1、M0.2、和M0.3。
如图3.子程序和主程序内容所示:图3.子程序和主程序内容如果将M0.0复位,M0.2置位,单纯按上升沿捕捉的逻辑,由于没有上升沿跳变,子程序的输出都应该是‘0’。
但是在线监控可以看到M0.1持续为‘0’, M0.3保持为‘1’。
如图4.在线监控所示:图4.在线监控上升沿捕捉指令的工作原理是将本次左侧能流过来的‘1’、‘0’信号与上次指令执行时的状态比较,如果检测到从0到1的变化,则导通。
西门子PLC的子程序 - 西门子plcSTEP7-Micro/Win在程序编辑器窗口里为每个POU供应一个独立的页。
主程序总是第1页,后面是子程序或中断程序。
由于各个程序在编辑器窗口里被分开,编译时在程序结束的地方自动加入无条件结束指令或无条件返回指令,用户程序只能使用条件结束和条件返回指令。
通常将具有特定功能且多次使用的程序段作为子程序。
子程序可以多次被调用,也可以嵌套(最多8层),还可以递归调用(自己调用自己)。
子程序有子程序调用和子程序返回两大类指令,子程序返回又分条件返回和无条件返回。
子程序调用指令用在主程序或其他调用子程序的程序中,子程序的无条件返回指令在子程序的最终网络段。
梯形图指令系统能够自动生成子程序的无条件返回指令,用户无需输入。
子程序的调用是有条件的,未调用它时不会执行子程序中的指令,因此使用子程序可以削减扫描时间,同时可使整个程序功能清楚,易于查错和维护,还能削减存储空间。
为了移植子程序,应避开使用全局符号和变量,例如V存储区中的确定地址。
在编程软件的程序数据窗口的下方有主程序(OBI)、子程序(SUB0)、中断服务程序(INT0) 的标签,点击子程序标签即可进入SUB0子程序显示区。
也可以通过指令树的项目进入子程序SUB0显示区。
添加一个子程序时,可以用编辑菜单的插入项增加一个子程序,子程序编号n从0开头自动向上生成。
用鼠标右键点击指令树中的子程序或中断程序的图标,在弹出的菜单中选择“重新命名”,可以修改它们的名称。
子程序可能有要传递的参数(变量和数据),这时可以在子程序调用指令中包含相应参数,它可以在子程序与调用程序之间传送。
参数(变量和数据)必需有符号名(最多8个字符)、变量和数据类型等内容。
子程序最多可传递16个参数。
传递的参数在子程序局部变量表中定义。
局部变量表中的变量有IN、OUT、IN/OUT和TEMP等四种类型。
●IN类型:将指定位置的参数传入子程序。
参数的寻址方式可以是直接寻址(如VB10)、间接寻址(如*ACl)或马上数(如1234)。