- 1、本文档共11页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
子程序和局部变量
什么是子程序及其优点
西门子200PLC子程序使用规则
带参数的子程序
子程序的使用注意事项
子程序概念及优点
什么是子程序?
在一个加工程序中,如果其中有些加工内容完全相同或相似,为了简化程序,可以把这些重复的程序段单独列出,并按一定的格式编写成子程序。主程序在执行过程中如果需要某一子程序,通过调用指令来调用该子程序,子程序执行完后又返回到主程序,继续执行后面的程序段。
子程序的优点:
调用方便、快速编程:很多类似的功能,像这样的就可以使用子程序,而不用多次复制相同的语句,而选择调用相同的子程序:几个类似的项目也只需要对同一个程序作不多的修改就能适用。
子程序可以把整个用户程序按照功能进行结构化的组织:一个“好”的程序总是把全部的控制功能分为几个符合工艺控制规律的子功能块,每个子功能块可以由一个或多个子程序组成。
程序结构也非常有利于分步调试:避免许多功能综合在一起无法准确、快速的判断问题所在。
子程序使用规则
CPU226的项目中最多可以创建128个子程序,其他CUP可以创建64个子程序。
在主程序中,可以嵌套调用子程序(在子程序中调用子程序),最多嵌套8层。在中断服务程序中,不能嵌套调用子程序。
全局存储区:是指同一个存储器可以被任何程序存取(包括主程序、子程序和中断程序)。
局部存储区:是指存储器区和特定的程序相关联。
注:局部变量区的大小为64个字节,其中最后4个字节被系统所占用,实际可供子程序使用的为60个字节(LB0到LB59),超出存储区即会报错。
注:每个子程序调用的输入/输出参数的最大限制是16,如果您尝试下载的程序超过此一限制,IN、OUT和IN_OUT加起来共16个超过16个就会出错。
子程序使用规则
主程序开始
主程序结束
子程序1结束
RET条件
调用1条件
子程序1开始
子程序2结束
子程序2开始
调用2条件
RET条件
子程序调用框图:
带参数的子程序
子程序可以包含要传递的参数。参数在子程序的局部变量表中定义。参数必须有变量名(最多23个字符)、变量类型和数据类型。一个子程序最多可以传递16个参数。
IN
参数传入子程序。如果参数是直接寻址(如: VB10),指定位置的值被传递到子程序。如果参数是间接寻址(如: *AC1),指针指定位置的值被传入子程序;如果参数是常数(如: 16#1234),或者一个地址(如: VB100),常数或地址的值被传入子程序。
IN_OUT
指定参数位置的值被传到子程序,从子程序的结果值被返回到同样地址。常数(如: 16#1234)和地址(如: VB100)不允许作为输入/输出参数。
OUT
常数(如: 16#1234)和地址(如: VB100)不允许作为输出参数。
TEMP
任何不用于传递数据的局部存储器都可以在子程序中作为临时存储器使用。
子程序使用注意事项
子程序中的定时器:停止调用子程序时,线圈在子程序内的位元件的ON/OFF状态保持不变。如果在停止调用时子程序中的定时器正在定时,100ms定时器将停止定时,当前值保持不变,重新调用时继续定时;但是1ms定时器和10ms定时器将继续定时,定时时间到时,它们的定时器位变为1状态,并且可以在子程序之外起作用。
子程序在一个周期扫描周期内多次调用时,不能使用上升沿、下降沿、定时器和计数器之外,子程序中局部变量的特点,在编程多次调用带参数的子程序时也要格外注意。
子程序使用的怪现象
观察一个程序:
这个是子程序中的启保停程序。
子程序使用的怪现象
主程序:调用了两次上面的程序,实现I0.0和I0.1控制Q0.0的闭合和断开;I0.2和I0.3控制Q0.1的闭合和断开。
子程序使用的怪现象
那么在线测试下程序执行情况,发现果然和描述的错误一样, I0.0 为 1 后, Q0.0 和 Q0.1 都为1 了。见下图.03 所示。而如果闭合 I0.2,则 Q0.0 和 Q0.1 都断开。
子程序使用的怪现象
为什么会这样呢?首先我们先明确子程序局部变量的特点。局部变量的变量类型分为四种:IN,IN_OUT, OUT 和 TEMP,局部变量存储区是在子程序调用时开辟的,子程序调用完成,局部变量占用的存储空间释放。
我们来分析下这个错误的子程序: 在主程序第一次调用子程序时,如果 I0.0 为 1, I0.1 为 0,它们将自身值分别传给输入局部变量#AA 和#BB,子程序中程序逻辑执行如下图所示。此时局部变量#CC 值为 1,子程序完成, #CC将值传送到输出参数 Q0.0 上,使其置 1。根据局部变量的特点,子程序第一次调用完成后,局部变量存储区释放。 那么当主程序第二次调用该子程序时,开辟临时存储空间,但是此时的存储空间与第一次调用时开辟的不一定一致。可是,
文档评论(0)