6ES7212-1AB23-0XB8详解说明
6ES7212-1AB23-0XB8详解说明
在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,局部变量存储区是在子程序调用时开辟的,子程序调用完成,局部变量占用的存储空间释放。
我们来分析下客户的子程序。
在主程序次调用子程序时,如果I0.0为1,I0.1为0,它们将自身值分别传给输入局部变量#AA和#BB,子程序中程序逻辑执行如下图.04所示。此时局部变量#CC值为1,子程序完成,#CC将值传送到输出参数Q0.0上,使其置1。根据局部变量的特点,子程序次调用完成后,局部变量存储区释放。
图.04
那么当主程序第二次调用该子程序时,开辟临时存储空间,但是此时的存储空间与次调用时开辟的不一定一致。可是,也有可能由于程序简单,仍然使用次调用时占用的存储空间。如果这种情况发生了,那么次调用时已经将#CC的L0.2置了1,而此值依旧存在,那么第二次调用时虽然输入参数I0.2和I0.3为0 ,但是#CC(L0.2)为1,由于客户的子程序逻辑有自保持部分,所以后L0.2的逻辑结果仍然是1。子程序完成后,#CC将值传送到输出参数Q0.1上,使其置1。所以就会出现客户反映的那种问题。
那么该如何避免这种情况呢?
大家是否还记得刚刚介绍局部变量参数类型时除了IN, OUT类型外,还有一种类型叫IN_OUT,这种类型的参数是先读入,然后再写出,这里我们就可以利用它的特点解决上面的问题。
下面对子程序的参数进行修改,将原先的#CC变量类型改为IN_OUT。如下图所示:
图.05
主程序结构不变,如下所示,可以看到由于#CC的类型是IN-OUT,它在子程序块的接口位置也转到了左侧输入侧。
图.06
下面再次将I0.0置1,其他输入都为0,监控程序状态,如图.07所示,可以看到只有Q0.0为1,Q0.1状态为0。而如果将I0.1置1, Q0.0被复位,Q0.1还是0,这样就符合客户的控制要求了。
图.07
同样,如果只给I0.2置1,那么也只有Q0.1会亮,不会再影响Q0.0。
了解了IN_OUT类型变量的特点,就不难分析以上的结果。因为每次调用子程序时,局部变量#CC都会先去读取输入参数Q0.0或Q0.1的状态,所以即使两次调用子程序时,#CC变量使用的同一区域,该区域的值也会在开始被Q点的状态所修改,就不存在两次调用相互影响的情况了。
另外,如果在子程序一开始就添加一条指令,对局部变量#CC进行赋初值(如图.08),也可以避免临时变量区数值不定的问题,您可以尝试测试下。
图.08
所以,在编写200子程序时要特别注意局部变量的特点,一旦出现多次调用不正常的情况,就可以从局部变量的特点出发分析,看看是不是存在隐患。善加利用IN_OUT变量也许可以解决许多问题。
设备简介
在工业自动化控制系统中,为常见的是PLC 和变频器的组合应用,并且产生了多种多样的PLC 控制变频器方式,其中采用RS-485 通讯方式实施控制的方案得到广泛的应用:因为它抗干扰能力强、传输速率高、传输距离远且造价低廉。易能变频器内置的MODBUS(从站)通信协议,可非常方便的实现单台或多台变频器的远程通讯控制与监视功能。
下面以西门子S7-200CPU224XP为例,介绍PLC与易能变频器建立通讯并实现对变频器起停、频率给定、监控等功能的控制。
变频器作为MODBUS协议从站接收来自PLC的通信指令,必须做好以下准备工作:
1、用一根带9针阳性插头的串口通信电缆连接在PLC的自由通信口Prat0端,电缆另一端的第3、8线分别接在变频器RS485的485+、485-端子上,其余线屏蔽不用;
2、预先设置变频器以下参数:
F0.00=3 //串行口给定
F0.02=3 //串行口运行命令控制,键盘STOP命令无效
F2.14=03 //波特率9600,1-8-1,无校验
F2.15=01 //变频器地址
3.变频器的控制命令和状态通信地址如下:
西门子PLC程序说明
1、对于西门子PLC做主站的MODBUS通讯,需要程序库装有有“MBUS_CTRL”和“MBUS_MSG”指令。其下是指令的意义:
2、PLC程序
I0.0 变频器正转启动
I0.1 变频器反转启动
I0.2 变频器停止
VW1004 设定变频器频率
VB2000 读取变频器当前设定频率
VB2002 读取变频器当前运行频率
VB2004 读取电机运行转速
Network 1 // 初始化参数
LD SM0.1
R M2.0, 8
R M4.0, 8
R M0.0, 2
Network 2 // 串口设置
LD SM0.0
= L60.0
LD SM0.0
= L63.7
LD L60.0
CALL SBR1, L63.7, 9600, 0, 1000, M0.0, MB12
Network 3
LD SM0.1
MOVB 7, VB1000
MOVB 8, VB1001
MOVB 6, VB1002
MOVW 2000, VW1004
Network 4
LD M0.0
EU
S M0.1, 1
Network 5 // 读取当前设定频率
LD M0.1
O M2.4
= L60.0
LD M0.1
EU
LD M2.4
EU
OLD
= L63.7
LD L60.0
CALL SBR2, L63.7, 1, 0, 44097, +1, &VB2000, M2.1, MB3
Network 6
LD M2.1
R M2.3, 1
R M0.1, 1
Network 7 // 读取当前运行频率
LD M2.1
= L60.0
LD M2.1
EU
= L63.7
LD L60.0
CALL SBR2, L63.7, 1, 0, 44098, +1, &VB2002, M2.2, MB4
Network 8
LD M2.2
R M2.1, 1
Network 9 // 读取当前电机转速
LD M2.2
= L60.0
LD M2.2
EU
= L63.7
LD L60.0
CALL SBR2, L63.7, 1, 0, 44102, +1, &VB2004, M2.3, MB5
Network 10
LD M2.3
R M2.2, 1
Network 11 // 设定电机频率
LD M2.3
= L60.0
LD M2.3
EU
= L63.7
LD L60.0
CALL SBR2, L63.7, 1, 1, 48194, 1, &VB1004, M2.4, MB16
Network 12
LD M2.4
R M2.3, 1
Network 13 //正转启动电机
LD I0.0
= L60.0
LD I0.0
EU
= L63.7
LD L60.0
CALL SBR2, L63.7, 1, 1, 48193, 1, &VB1000, M10.1, MB13
Network 14 //反转启动电机
LD I0.1
= L60.0
LD I0.1
EU
= L63.7
LD L60.0
CALL SBR2, L63.7, 1, 1, 48193, 1, &VB1001, M10.2, MB14
Network 15 //停止电机
LD I0.2
= L60.0
LD I0.2
EU
= L63.7
LD L60.0
CALL SBR2, L63.7, 1, 1, 48193, 1, &VB1002, M10.3, MB15