西门子6ES7222-1HF22-0XA8产品信息
常常遇到客户咨询自由口编程中字符中断的相关问题,比如“字符中断是什么?”,“字符中断怎么用?”,“用SMB接收多个字符,如何编程?”,“字符中断和RCV指令之间有什么关系?”。为了帮助您深入了解以上问题,我们就一起就这几个问题进行讨论,以达到抛砖引玉的效果!
常问问题一:字符中断是什么?
通过阅读系统手册,我们知道使用字符中断方式接收数据,接收每个字符时都会产生中断。在执行与接收字符事件相连的中断程序前,接收的字符存入SMB2寄存器中,校验状态存入SM3.0。 SMB2、SM3.0都是只读的。Port0/Port1共用SMB2/SMB3。Port0对应于中断事件8。Port1对应于中断事件25。
常问问题二:字符中断怎么用?
以端口0接收字符为例:
当CPU通过端口0接收到一个字符后,会将该字符存入接收字符缓冲区SMB2,进入相连接的中断程序中。
注意,对于这段程序,如果在中断程序中不作任何编程,那么当CPU接收n个字符时,中断程序将被执行n次,SMB2寄存器存储接收到的后一个字符。如上位机通过串口调试软件给CPU发送3个字符16#AA、16#BB和16#CC,
那么与接收字符事件相连的中断程序将被执行3次,SMB2中只能保存后一个接收到的字符16#CC。
常问问题三:用SMB接收多个字符,如何编程?
由于SMB2只能存储一个字符(一个字节),如果要想接受多个字符,则应当在CPU接收下一个字符之前,在中断程序中通过指针编程将SMB2中存储的字符移出来,以便下一次接收字符。以一个例程说明:
VD0作为地址指针指向VB100,当端口0接收到个字符,将个字符存入SMB2,进入接收中断,将SMB2中的字符复制到指针VD0指向的地址字节VB100中,指针地址加1,VD0指向下一个字节VB101。当接收第二个字符,将字符存入SMB2,进入接收中断,将SMB2中的第二个字符复制到指针VD0指向的地址字节VB101中,指针地址加1,VD0指向下一个字节VB102。当接收第三个字符时以此类推。
如果需要接收n个字符就结束接收,或者需要接收n个字符后循环接收,可以在中断程序中设置一个标志位,下面我们试举例说明:
例程1,接收到5个字符就结束接收的程序:
例程2,接收到5个字符后循环接收的程序:
后要提醒您注意的是,程序中的的指针不要选择累加器AC,因为累加器不能在主程序和中断程序中传递参数。
常问问题四:字符中断和RCV指令之间有什么关系?
简单地说,当RCV指令使能时,接收字符不进入SMB缓冲区。
我们可以设计个实验分析一下:
在主程序中我们既定义PLC执行RCV接收指令的起始结束条件(起始条件为起始字符16#AA,结束条件为结束字符16#BB),又建立字符中断事件8,上升沿条件触发RCV指令。
上位机通过串口调试软件给CPU发送字符。
程序如下图:
状态表监控结果:
结论:
当RCV指令不触发的话,接收字符只进入SMB2缓冲区,不进入RCV指令的接收缓冲区。
当RCV指令触发后,满足CPU接收的起始和结束条件的字符存入RCV指令对应的TBL缓冲区。起始条件之前的字符既不存入RCV缓冲区,也不存入SMB2缓冲区。结束条件之后接收到的字符,存入SMB2缓冲区。
通过以上几个问题的分析,我们对于字符中断和SMB2的基本用法和特点做了介绍,相信在实际项目中会有更多灵活的应用等待我们去发掘。
如图所示。我打算使用DO16接一个24VDC继电器,当组态的DO16逻辑为1的时候DO16输出24VDC,请问我该怎么接线?
是直接24VDC接24V1,0V接M和继电器线圈,DO+接继电器线圈吗?
答:X131:7和X131:8分别接外部供电的24vdc和0v(M), X131:5接继电器线圈24VDC端,X131:6接继电器线圈0VDC(M)端,
具体接线请看上传的图片。
因为各种原因,使得系统参数发生了变化,监控系统必须具备实时性要求,也就是说,只要设备状态一改变,监控系统就将信息采集并传送到计算机,以便监控人员及时了解现场,对现场情况作出判断、进行相应的操作。实时性包括计算机与plc实时通信以及plc实时监控所联设备状态两方面内容。
计算机实时数据处理
该部分由vb的timer控件完成。通过引发timer事件(timer事件是vb模拟实时计时器的事件),timer控件可以定时执行规定的操作,使得plc所连接的设备状态信息及时传送到计算机。
plc实时数据处理
由于s7-200系列plc在自由口模式下,通信协议完全由梯形图程序控制。s7-200cpu连续扫描用户程序、执行用户任务。plc在程序执行过程中,基于稳定、快速、灵活等方面考虑,cpu每个扫描周期都通过输入输出映像寄存器来执行实际输入输出操作,即读实际输入点值到映像寄存器、写映像寄存器值到实际输出点。由于在中断中不能顺利进行数据读写操作,可通过编程,利用plc循环扫描执行程序的特点,使得在程序扫描期间实现数据存储区与输入输出映像寄存器区交换数据,也就是说,计算机只要通过与数据存储区实时完成通信就可达到实时监控实际输入输出点的效果。
该部分的程序段如下:
主程序部分:
ld sm0.1 file://扫描闭合
call subr_0 file://调用子程序0
movb 1,vb0 file://vb0.0置1
ld vb0.0 file://设置数据存储区与映像区交换数据条件
call subr_1 file://调用子程序1
┇
end file://主程序结束
子程序1部分程序如下:
ld sm0.0 file://始终闭合
movd vd101,id0 file://数据存储区写数据到数字量输入
file://映像区
movd id0,vd101 file://读数字量输入映像区数据到数据
file://存储区
movd vd201,qd0 file://数据存储区写数据到数字量输
file://出映像区
movd qd0,vd201 file://读数字量输出映像区数据到数
file://据存储区
movw aiw0,vw301 file://读模拟量输入映像区到数据存
file://储区
movw vw401,aqw0 file://数据存储区写数据到模拟量输
file://出映像区
┇
cret file://子程序返回
发送、接收部分:
rcv vb500,0 file://从端口0接收数据存于vb500单元
file://起始的连续单元
xmt vb55,0 file://将vb55单元后的指定数据从端口0
file://连续发出