9
西门子S7系列plc逻辑运算指令下所示。
字节逻辑运算指令 ANDB IN1,OUT 将字节IN1和OUT按位作逻辑与运算,OUT输出结果 IN1,IN2,OUT:VB,IB,QB,MB,SB,SMB,LB,AC,*VD,*AC,*LD
IN1和IN2还可以是常数 ORB IN1,OUT 将字节IN1和OUT按位作逻辑或运算,OUT输出结果 XORB IN1,OUT 将字节IN1和OUT按位作逻辑异或运算,OUT输出结果 INVB OUT 将字节OUT按位取反,OUT输出结果 字逻辑运算指令 ANDW IN1,OUT 将字IN1和OUT按位作逻辑与运算,OUT输出结果 IN1,IN2,OUT:VW,IW,QW,MW,SW,SMW,LW,T,C,AC,*VD,*AC,*LD
IN1和IN2还可以是AIW和常数 ORW IN1,OUT 将字IN1和OUT按位作逻辑或运算,OUT输出结果 XORW IN1,OUT 将字IN1和OUT按位作逻辑异或运算,OUT输出结果 INVW OUT 将字OUT按位取反,OUT输出结果双字逻辑运算指令 ANDD IN1,OUT 将双字IN1和OUT按位作逻辑与运算,OUT输出结果 IN1,IN2,OUT:VD,ID,QD,MD,SD,SMD,LD,AC,*VD,*AC,*LD
IN1和IN2还可以是HC和常数ORD IN1,OUT 将双字IN1和OUT按位作逻辑或运算,OUT输出结果XORD IN1,OUT 将双字IN1和OUT按位作逻辑异或运算,OUT输出结果INVD OUT 将双字OUT按位取反,OUT输出结果
S7-1200 设计紧凑、组态灵活,TIA在库函数中嵌套了Modbus-RTU 和Modbus-TCP功能库,在做数据采集的项目中是非常好用的。
做过一个换热站设备运行监测的项目,需采集管网一次侧和二次侧的供水压力、温度以及ABB变频器的工作状态。现场各类变送器已经接到了原有的智能仪表上,因此采用1200plc通过MODBUS-RTU 与现场智能仪表和变频器通信是比较经济的方案,并且可通过MODBUS-TCP与远程上位机通信。
智能仪表及变频器作为从站,只需在设定中选择Modbus-RTU通信协议并且为设备分配不重复的站地址即可。1200 PLC作为主站必须配备RS485通信模块,其通信的基本原理是:首先程序开始运行时,调用一次Modbus库中的功能块MB_COMM_LOAD来组态RS485模块上的端口;其次调用库中的功能块MB_MASTER作为Modbus主站与设备进行通信。
1200PLC作为主站通信是由DATA_ADDR(从站中的起始Modbus地址)和MODE(读、写、诊断模式)参数一起确定实际Modbus消息中使用的功能代码。DATA_PTR(数据指针)指向要写入或读取的数据的CPU DB地址,该DB必须为“非仅符号访问”DB类型。在TIA V12以上平台中,将该DB属性中的“优化的块访问”选项取消。
PLC主站发送带有站地址标识的数据来寻址不同的从站,同时不同的从站通过响应带有站地址标识的数据给主站,以完成整个通信过程。这种轮询通信,可以根据发送和接收完成的标志来完成,也可以以固定的时间间隔进行轮询,实际应用时需要考虑CPU的性能以及轮循Modbus子站时间。程序编好后先用MODBUS调试工具测试一下,正常后再开始接线。
在接线时遇到一个小插曲:PLC及变频器的485接线端子B为正,A为负,很多厂家仪表的485接线端子是A为正,B为负,一开始通信始终不正常,当查看仪表说明书时才发现。
项目中我使用的是Modbus-TCP通过PLC上PN接口与上位机进行通信,Modbus-TCP使用开放式用户通信连接作为Modbus通信路径。在S7-1200 PLC的库函数中嵌套了Modbus-TCP功能块库, 它包含了Server 和Client的库函数, 编程时可以直接调用该库函数可实现与上位机的Modbus-TCP通信。
在该系统应用中S7-1200 PLC作为 Modbus Tcp Server (服务器),调用 “MB_SERVER”指令处理Modbus-TCP客户机的连接请求、接收Modbus功能的请求并发送响应,设置连接ID、IP端口等参数,使用起来比较简单。
S7-1200 PLC作为网络的服务器端,上位机可以按需建立连接访问PLC的数据区,这样在上位机对多个换热站的PLC连接中不会占用太多的资源。前提是PLC必需要有固定的IP才行,如果是动态拨号连接上位机,PLC端就需要作为客户端,通过修改MODE管脚的值改变发送或接收状态,按照主机的请求来按需向主机发送数据或主动接收主机的改写数据就比较麻烦了。
这是我在MODBUS通信协议项目应用中的一点小体会,一些观点或许过于幼稚,望各位**多我指正,仅以此文起到抛砖引玉的作用。
定时器是根据预先设定的定时值,按一定的时间单位进行计时的PLC内部装置,在运行过程中当定时器的输入条件满足时,当前值从0开始按一定的单位增加。当定时器的当前值到达设定值时,定时器发生动作,从而满足各种定时逻辑控制的需要。下面详细介绍定时器的使用。
1、S7—200 PLC定时器种类
S7—200 PLC为用户提供了三种类型的定时器:接通延时定时器(TON)、有记忆接通延时定时器(TONR)和断开延时定时器(TOF)。对于每一种定时器,又根据定时器的分辨率的不同,分为:1 ms、10 ms和100 ms三个精度等级。
定时器定时时间T的计算:T=PT×S。式中:T为实际定时时间,PT为设定值,S为分辨率。例如:TON指令使用T35(为10 ms的定时器),设定值为100,则实际定时时间为:
T=100 X 10=1 000 ms
定时器的设定值PT:数据类型为INT型。操作数可为:VW、IW、QW、MW、SW、SMW、LW、AIW、T、C、AC、*VD、*AC、*LD和常数,其中常数较为常用。
定时器的编号用定时器的名称和它的常数编号(较大为255)来表示,即T×××。如:T40。定时器的编号包含两方面的变量信息:定时器位和定时器当前值。定时器位即定时器触点,与其他
继电器
的输出相似。当定时器的当前值达到设定值PT时,定时器的触点动作。定时器当前值即定时器当前所累计的时间值,它用16位符号整数来表示,较大计数值为32 767。
计数器指令包括增计数器、减计数器、增减计数器和高速计数器
增计数器
增计数指令(CTU)从当前计数值开始,在每一个(CU)输入状态从低到高时递增计数。当CXX的当前值大于等于预置值PV时,计数器位CXX置位。当复位端(R)接通或者执行复位指令后,计数器被复位。当它达到较大值(32,767)后,计数器停止计数。
减计数器
减计数指令(CTD)从当前计数值开始,在每一个(CD)输入状态的低到高时递减计数。当CXX的当前值等于0时,计数器位CXX置位。当装载输入端(LD)接通时,计数器位被复位,并将计数器的当前值设为预置值PV。当计数值到0时,计数器停止计数,计数器位CXX接通。
增/减计数器
增/减计数指令(CTUD),在每一个增计数输入(CU)的低到高时增计数,在每一个减计数输入(CD)的低到高时减计数。计数器的当前值CXX保存当前计数值。在每一次计数器执行时,预置值PV与当前值作比较。当达到较大值(32767)时,在增计数输入处的下一个上升沿导致当前计数值变为较小值(--32768)。当达到较小值(--32768)时,在减计数输入端的下一个上升沿导致当前计数值变为较大值(32767)。当CXX的当前值大于等于预置值PV时,计数器位CXX置位。否则,计数器位关断。当复位端(R)接通或者执行复位指令后,计数器被复位。当达到预置值PV时,CTUD计数器停止计数。
PS:CXX代表的是计数器的名称,是常数范围时从C0到C25,由于每一个计数器只有一个当前值,所以不要多次定义同一个计数器。(具有相同标号的增计数器、增/减计数器、减计数器访问相同的当前值。)当使用复位指令复位计数器时,计数器位复位并且计数器当前值被清零。计数器标号既可以用来表示当前值,又可以用来表示计数器位。
减计数器应用当I0.1断开时,减计数器C1的当前值从3变到0。I0.0的上升沿使C1的当前值递减。I0.1接通时装载预置值3。当计数器C1的当前值=0时,C1接通。
减计数器应用当I0.1断开时,减计数器C1的当前值从3变到0。I0.0的上升沿使C1的当前值递减。I0.1接通时装载预置值3。当计数器C1的当前值=0时,C1接通。
减计数器应用
当I0.1断开时,减计数器C1的当前值从3变到0。I0.0的上升沿使C1的当前值递减。I0.1接通时装载预置值3。当计数器C1的当前值=0时,C1接通。
增减计数器实例应用当 I0.0接通时,使用增计数,计数器数值增加,当 I0.1接通时,使用减计数,计数器数值减少,当I0.2接通时, I0.2将当前值复位为0,当当前值=4时,将增/减计数器C48接通,输出Q0.0.高速计数器一般来说,高速计数器被用作驱动鼓式计时器,该设备有一个安装了增量轴式编码器的轴,以恒定的速度转动。轴式编码器每圈提供一个确定的计数值和一个复位脉冲。来自轴式编码器的时钟和复位脉冲作为高速计数器的输入。高速计数器装入一组预置值中的*一个值,当前计数值小于当前预置值时,希望的输出有效。版权所有。计数器设置成在当前值等于预置值和有复位时产生中断。随着每次当前计数值等于预置值的中断事件的出现,一个新的预置值被装入,并重新设置下一个输出状态。当出现复位中断事件时,设置*一个预置值和*一个输出状态,这个循环又重新开始。由于中断事件产生的速率远低于高速计数器的计数速率,用高速计数器可实现精确控制,而与plc整个扫描周期的关系不大。采用中断的方法允许在简单的状态控制中用独立的中断程序装入一个新的预置值。(同样的,也可以在一个中断服务程序中,处理所有的中断事件。)理解不同的高速计数器对于操作模式相同的计数器,其计数功能是相同的。计数器共有四种基本类型:带有内部方向控制的单相计数器,带有外部方向控制的单相计数器,带有两个时钟输入的双相计数器和A/B相正交计数器。注意,并不是所有计数器都能使用每一种模式。您可以使用以下类型:无复位或启动输入,有复位无启动输入或既有启动又有复位输入。- 当激活复位输入端时,计数器清除当前值并一直保持到复位端失效。- 当激活启动输入端时,它允许计数器计数。当启动端失效时,计数器的当前值保持为常数,并且忽略时钟事件。- 如果在启动输入端无效的同时,复位信号被激活,则忽略复位信号,当前值保持不变。如果在复位信号被激活的同时,启动输入端被激活,当前值被清除。在使用高速计数器之前,应该用HDEF(高速计数器定义)指令为计数器选择一种计数模式。使用初次扫描存储器位SM0.1(该位仅在*一次扫描周期接通,之后断开)来调用一个包含HDEF指令的子程序。对于高速计数器来说,我们可以使用指令向导来配置计数器。向导程序使用下列信息:计数器的类型和模式、计数器的预置值、计数器的初始值和计数的初始方向。要启动HSC指令向导,可以在命令菜单窗口中选择Tools >Instruction Wizard ,然后在向导窗口中选择HSC指令。对高速计数器编程,必须完成下列基本操作:定义计数器和模式、设置控制字节、设置初始值、 设置预置值、*并使能中断服务程序、激活高速计数器。高速计数器有12种工作模式如下图所示
增减计数器实例应用当 I0.0接通时,使用增计数,计数器数值增加,当 I0.1接通时,使用减计数,计数器数值减少,当I0.2接通时, I0.2将当前值复位为0,当当前值=4时,将增/减计数器C48接通,输出Q0.0.高速计数器一般来说,高速计数器被用作驱动鼓式计时器,该设备有一个安装了增量轴式编码器的轴,以恒定的速度转动。轴式编码器每圈提供一个确定的计数值和一个复位脉冲。来自轴式编码器的时钟和复位脉冲作为高速计数器的输入。高速计数器装入一组预置值中的*一个值,当前计数值小于当前预置值时,希望的输出有效。版权所有。计数器设置成在当前值等于预置值和有复位时产生中断。随着每次当前计数值等于预置值的中断事件的出现,一个新的预置值被装入,并重新设置下一个输出状态。当出现复位中断事件时,设置*一个预置值和*一个输出状态,这个循环又重新开始。由于中断事件产生的速率远低于高速计数器的计数速率,用高速计数器可实现精确控制,而与plc整个扫描周期的关系不大。采用中断的方法允许在简单的状态控制中用独立的中断程序装入一个新的预置值。(同样的,也可以在一个中断服务程序中,处理所有的中断事件。)理解不同的高速计数器对于操作模式相同的计数器,其计数功能是相同的。计数器共有四种基本类型:带有内部方向控制的单相计数器,带有外部方向控制的单相计数器,带有两个时钟输入的双相计数器和A/B相正交计数器。注意,并不是所有计数器都能使用每一种模式。您可以使用以下类型:无复位或启动输入,有复位无启动输入或既有启动又有复位输入。- 当激活复位输入端时,计数器清除当前值并一直保持到复位端失效。- 当激活启动输入端时,它允许计数器计数。当启动端失效时,计数器的当前值保持为常数,并且忽略时钟事件。- 如果在启动输入端无效的同时,复位信号被激活,则忽略复位信号,当前值保持不变。如果在复位信号被激活的同时,启动输入端被激活,当前值被清除。在使用高速计数器之前,应该用HDEF(高速计数器定义)指令为计数器选择一种计数模式。使用初次扫描存储器位SM0.1(该位仅在*一次扫描周期接通,之后断开)来调用一个包含HDEF指令的子程序。对于高速计数器来说,我们可以使用指令向导来配置计数器。向导程序使用下列信息:计数器的类型和模式、计数器的预置值、计数器的初始值和计数的初始方向。要启动HSC指令向导,可以在命令菜单窗口中选择Tools >Instruction Wizard ,然后在向导窗口中选择HSC指令。对高速计数器编程,必须完成下列基本操作:定义计数器和模式、设置控制字节、设置初始值、 设置预置值、*并使能中断服务程序、激活高速计数器。高速计数器有12种工作模式如下图所示
增减计数器实例应用
当 I0.0接通时,使用增计数,计数器数值增加,当 I0.1接通时,使用减计数,计数器数值减少,当I0.2接通时, I0.2将当前值复位为0,当当前值=4时,将增/减计数器C48接通,输出Q0.0.
高速计数器
一般来说,高速计数器被用作驱动鼓式计时器,该设备有一个安装了增量轴式编码器的轴,以恒定的速度转动。轴式编码器每圈提供一个确定的计数值和一个复位脉冲。来自轴式编码器的时钟和复位脉冲作为高速计数器的输入。高速计数器装入一组预置值中的*一个值,当前计数值小于当前预置值时,希望的输出有效。版权所有。计数器设置成在当前值等于预置值和有复位时产生中断。随着每次当前计数值等于预置值的中断事件的出现,一个新的预置值被装入,并重新设置下一个输出状态。当出现复位中断事件时,设置*一个预置值和*一个输出状态,这个循环又重新开始。由于中断事件产生的速率远低于高速计数器的计数速率,用高速计数器可实现精确控制,而与
plc
整个扫描周期的关系不大。采用中断的方法允许在简单的状态控制中用独立的中断程序装入一个新的预置值。(同样的,也可以在一个中断服务程序中,处理所有的中断事件。)
理解不同的高速计数器
对于操作模式相同的计数器,其计数功能是相同的。计数器共有四种基本类型:带有内部方向控制的单相计数器,带有外部方向控制的单相计数器,带有两个时钟输入的双相计数器和A/B相正交计数器。注意,并不是所有计数器都能使用每一种模式。您可以使用以下类型:无复位或启动输入,有复位无启动输入或既有启动又有复位输入。
- 当激活复位输入端时,计数器清除当前值并一直保持到复位端失效。
- 当激活启动输入端时,它允许计数器计数。当启动端失效时,计数器的当前值保持为常数,并且忽略时钟事件。
- 如果在启动输入端无效的同时,复位信号被激活,则忽略复位信号,当前值保持不变。如果在复位信号被激活的同时,启动输入端被激活,当前值被清除。
在使用高速计数器之前,应该用HDEF(高速计数器定义)指令为计数器选择一种计数模式。使用初次扫描存储器位SM0.1(该位仅在*一次扫描周期接通,之后断开)来调用一个包含HDEF指令的子程序。
对于高速计数器来说,我们可以使用指令向导来配置计数器。向导程序使用下列信息:计数器的类型和模式、计数器的预置值、计数器的初始值和计数的初始方向。要启动HSC指令向导,可以在命令菜单窗口中选择Tools >Instruction Wizard ,然后在向导窗口中选择HSC指令。对高速计数器编程,必须完成下列基本操作:定义计数器和模式、设置控制字节、设置初始值、 设置预置值、*并使能中断服务程序、激活高速计数器。
高速计数器有12种工作模式如下图所示
工作模式高速计数器的初始化步骤举例以下以HSC1为例,对初始化和操作的步骤进行描述。在初始化描述中,假定S7--200已经置成RUN模式。因此,**扫描标志位为真。如果不是这种情况,请记住在进入RUN模式之后,对每一个高速计数器的HDEF指令只能执行一次。对一个高速计数器*二次执行HDEF指令会引起运行错误,而且不能改变*一次执行HDEF指令时对计数器的设置。PS:虽然下列步骤描述了如何分别改变计数方向、初始值和预置值,但完全可以在同一操作步骤中对全部或者任意参数组合进行设置,只要设置正确的SMB47然后执行HSC指令即可。初始化模式0、1或2HSC1为内部方向控制的单相增/减计数器(模式0、1或2),初始化步骤如下:1. 用初次扫描存储器位(SM0.1=1)调用执行初始化操作的子程序。由于采用了这样的子程序调用,后续扫描不会再调用这个子程序,从而减少了扫描时间,也提供了一个结构优化的程序。2. 初始化子程序中,根据所希望的控制操作对SMB47置数。例如:SMB47=16#F8 产生如下的结果:允许计数写入新的初始值写入新的预置值置计数方向为增置启动和复位输入为高电平有效3. 执行HDEF指令时,HSC输入置1,MODE输入置0(无外部复位或启动)或置1(有外部复位和无启动)或置2(有外部复位和启动)。4. 向SMD48(双字)写入所希望的初始值(若写入0,则清除)。5. 向SMD52(双字)写入所希望的预置值。6. 为了捕获当前值(CV)等于预置值(PV)中断事件,编写中断子程序,并*CV=PV中断事件(事件号13)调用该中断子程序。7. 为了捕获外部复位事件,编写中断子程序,并*外部复位中断事件(事件号15)调用该中断子程序。8. 执行全局中断允许指令(ENI)来允许HSC1中断。9. 执行HSC指令,使S7--200对HSC1编程。10. 退出子程序。
工作模式高速计数器的初始化步骤举例以下以HSC1为例,对初始化和操作的步骤进行描述。在初始化描述中,假定S7--200已经置成RUN模式。因此,**扫描标志位为真。如果不是这种情况,请记住在进入RUN模式之后,对每一个高速计数器的HDEF指令只能执行一次。对一个高速计数器*二次执行HDEF指令会引起运行错误,而且不能改变*一次执行HDEF指令时对计数器的设置。PS:虽然下列步骤描述了如何分别改变计数方向、初始值和预置值,但完全可以在同一操作步骤中对全部或者任意参数组合进行设置,只要设置正确的SMB47然后执行HSC指令即可。初始化模式0、1或2HSC1为内部方向控制的单相增/减计数器(模式0、1或2),初始化步骤如下:1. 用初次扫描存储器位(SM0.1=1)调用执行初始化操作的子程序。由于采用了这样的子程序调用,后续扫描不会再调用这个子程序,从而减少了扫描时间,也提供了一个结构优化的程序。2. 初始化子程序中,根据所希望的控制操作对SMB47置数。例如:SMB47=16#F8 产生如下的结果:允许计数写入新的初始值写入新的预置值置计数方向为增置启动和复位输入为高电平有效3. 执行HDEF指令时,HSC输入置1,MODE输入置0(无外部复位或启动)或置1(有外部复位和无启动)或置2(有外部复位和启动)。4. 向SMD48(双字)写入所希望的初始值(若写入0,则清除)。5. 向SMD52(双字)写入所希望的预置值。6. 为了捕获当前值(CV)等于预置值(PV)中断事件,编写中断子程序,并*CV=PV中断事件(事件号13)调用该中断子程序。7. 为了捕获外部复位事件,编写中断子程序,并*外部复位中断事件(事件号15)调用该中断子程序。8. 执行全局中断允许指令(ENI)来允许HSC1中断。9. 执行HSC指令,使S7--200对HSC1编程。10. 退出子程序。
工作模式
高速计数器的初始化步骤举例
以下以HSC1为例,对初始化和操作的步骤进行描述。在初始化描述中,假定S7--200已经置成RUN模式。因此,**扫描标志位为真。如果不是这种情况,请记住在进入RUN模式之后,对每一个高速计数器的HDEF指令只能执行一次。对一个高速计数器*二次执行HDEF指令会引起运行错误,而且不能改变*一次执行HDEF指令时对计数器的设置。PS:虽然下列步骤描述了如何分别改变计数方向、初始值和预置值,但完全可以在同一操作步骤中对全部或者任意参数组合进行设置,只要设置正确的SMB47然后执行HSC指令即可。
初始化模式0、1或2
HSC1为内部方向控制的单相增/减计数器(模式0、1或2),初始化步骤如下:
1. 用初次扫描存储器位(SM0.1=1)调用执行初始化操作的子程序。由于采用了这样的子程序调用,后续扫描不会再调用这个子程序,从而减少了扫描时间,也提供了一个结构优化的程序。
2. 初始化子程序中,根据所希望的控制操作对SMB47置数。例如:
SMB47=16#F8 产生如下的结果:
允许计数
写入新的初始值
写入新的预置值
置计数方向为增
置启动和复位输入为高电平有效
3. 执行HDEF指令时,HSC输入置1,MODE输入置0(无外部复位或启动)或置1(有外部复位和无启动)或置2(有外部复位和启动)。
4. 向SMD48(双字)写入所希望的初始值(若写入0,则清除)。
5. 向SMD52(双字)写入所希望的预置值。
6. 为了捕获当前值(CV)等于预置值(PV)中断事件,编写中断子程序,并*CV=PV中断事件(事件号13)调用该中断子程序。
7. 为了捕获外部复位事件,编写中断子程序,并*外部复位中断事件(事件号15)调用该中断子程序。
8. 执行全局中断允许指令(ENI)来允许HSC1中断。
9. 执行HSC指令,使S7--200对HSC1编程。
10. 退出子程序。
应用实例
应用实例
实例应用2在**扫描时,调用SBR0,在**扫描,配置HSC1:SMB48=16#F8意思就是使能计数器、写初始值、写预置值、设初始方向为增计数、选择启动和复位输入高电平有效、选择4倍速模式、配置HSC1为带启动和复位输入的正交模式、SMD48=0表示清除HSC1的初始值。置HSC1的预置值为50。 当HSC1的当前值=预置值时,执行INT_0。 全局中断允许。执行HSC1,执行HSC1,清除HSC1的初始值、选择写入新的初始值和HSC1使能。
实例应用2在**扫描时,调用SBR0,在**扫描,配置HSC1:SMB48=16#F8意思就是使能计数器、写初始值、写预置值、设初始方向为增计数、选择启动和复位输入高电平有效、选择4倍速模式、配置HSC1为带启动和复位输入的正交模式、SMD48=0表示清除HSC1的初始值。置HSC1的预置值为50。 当HSC1的当前值=预置值时,执行INT_0。 全局中断允许。执行HSC1,执行HSC1,清除HSC1的初始值、选择写入新的初始值和HSC1使能。
实例应用2
在**扫描时,调用SBR0,在**扫描,配置HSC1:SMB48=16#F8意思就是使能计数器、写初始值、写预置值、设初始方向为增计数、选择启动和复位输入高电平有效、选择4倍速模式、配置HSC1为带启动和复位输入的正交模式、SMD48=0表示清除HSC1的初始值。置HSC1的预置值为50。 当HSC1的当前值=预置值时,执行INT_0。 全局中断允许。执行HSC1,执行HSC1,清除HSC1的初始值、选择写入新的初始值和HSC1使能。