西门子PLCST20
6ES7288-1ST20-0AA0SIMATIC S7-200 SMART,CPU ST20, 标准 CPU,DC/DC/DC, 机载 I/O: 12 个 24V DC 数字输入;8 DO 24V DC; 电源:直流 20.4-28.8V DC, 程序存储器/数据存储器 20 KB
1.1 描述
PROFINET的CPU支持I device功能,即智能IO设备功能,也就是该PN设备可以同时作为IO控制器和IO设备。一个PN智能设备功能不但可以作为一个智能处理单元处理生产工艺的某一过程,而且可以和IO控制器之间交换过程数据,因此,智能设备作为一个IO设备连接一个上层IO控制器,智能设备的CPU通过自身的程序处理某段工艺过程,相应的过程值发送至上层的IO控制器再做相关的处理。参考图 1 智能设备功能。
图 1 智能设备功能
这样智能设备可以用于:
? 分布式处理
一个复杂的自动化任务可以划分为多个子任务,由于子任务的简化使得过程处理更加容易。
? 分割子过程
复杂和分布广泛的过程可以细分为几个子过程。这些子过程可以存储在各自的Step7项目中,且可以合并为一个完整的项目。
? 知识保护
智能设备的接口描述使用GSD文件而不是Step7项目,这样用户的知识-用户程序得以保护。
智能设备具有如下优点:
? 实现简单的IO控制器的连接,无需额外的软件工具
? 除了实时通信,还支持等时实时通信
? 由于几个智能设备具有计算能力,这样对IO控制器的计算能力要求也就减少了
? 由于处理本地过程数据,从而减少了通信负荷
? 在不同的Step7项目中管理+子任务
? 可以作为共享设备
使用智能设备功能,需要使用Step7 V5.5和支持智能设备功能的硬件设备。对于支持智能设备功能的硬件,请参考如下链接:44383954
2 PROFINET智能设备功能组态
使用一个例子来描述PROFINET智能设备功能,参考图 2 PROFINET系统网络。
图 2 PROFINET系统网络
IO控制器 CPU319-3PN/DP v3.2连接SCALANCE X204IRT v4.4交换机和一个ET200S IM151-3PN (6ES7 151-3BA23-0AB0) v7.0以及IO设备 CPU319F-3PN/DP v3.2构成一个PROFINET IO系统1。IO设备CPU319F-3PN/DP v3.2同时作为PROFINET IO系统2的IO控制器连接一台IO设备ET200s IM151-3PN-1。CPU319F-3PN/DP就是这个系统中的智能设备。
2.1 PROFINET IO系统2组态
首先在Step7中对PROFINET IO系统2的智能设备进行硬件组态,参考图 3 PROFINET IO系统2组态。IO控制器和ET200s的设备名分别为PN-IO-1,IM151-3PN-1,其IP地址分别为192.168.0.11和192.168.0.12。设备名和IP地址一定要与PN IO系统1的设置不同。
图 3 PROFINET IO系统2组态
使用鼠标双击该站CPU319F-3PN/DP的硬件组态中的X3槽PN-IO-1,弹出其属性对话框,选择“I-Device”标签页,激活“I-device mode”选项,在这里取消“Parameter assignment for the PN interface and its ports on the higher-level IO-controller”和“Operate as higher-level shared device”两个选项。其中这两个参数前者表示PN接口和端口的属性参数由上层IO控制器分配;后者表示该智能设备可以作为共享设备。参考图 4 PN-IO-1属性对话框。
图 4 PN-IO-1属性对话框
对于传输区域(Transfer area),点击“New”按钮,创建IO控制器和智能设备之间数据通信的传输区域。传输区域有2种类型,一种是应用(Application)传输区域,即控制器访问智能设备的用户程序接口。另一种是I/O传输区域,即控制器可以直接访问智能设备的IO,而智能设备不能处理该IO。由于CPU319F-3PN/DP不支持I/O传输区域,这里使用应用传输区域,分别创建输入地址区和输出地址区为2个字节。参考图 5 创建应用传输区域。
图 5 创建应用传输区域
保存和编译该站,然后在HW Config界面中选择菜单“Options” ? “Create GSD file for I-device”,为PROFINET IO系统2的IO控制器2创建智能设备的GSD文件。参考图 6 创建GSD文件。
西门子PLCST20图 6 创建GSD文件
这样弹出创建智能设备GSD文件对话框,参考图 7 创建智能设备GSD对话框。
图 7 创建智能设备GSD对话框
点击“Create”按钮,系统自动创建一个GSD文件并显示在“GSD file:”后,参考图 8 创建GSD文件。
图 8 创建GSD文件
然后点击“Install”按钮,安装刚生成的GSD文件到Step7硬件组态列表中。参考图 9 安装GSD文件。
图 9 安装GSD文件
打开OB1,编写对应地址的STL程序,这里CPU319F-3PNDP的过程映像区为1024。如下图 10 编程举例:
图 10 编程举例
保存编译项目并给IO设备分配设备名并组态到IO控制器中实现PROFINET IO通讯。
2.2 PROFINET IO系统1组态
接着在Step7中对PROFINET IO系统1进行硬件组态,参考图 11 PROFINET IO系统1组态。对于智能设备CPU319F-3PN/DP与标准IO一样从硬件列表中拖入。前面设置的2个字节的输入和输出则在该系统中分别对应输出和输入。
图 11 PROFINET IO系统1组态
在图 5 创建应用传输区域的2个字节的输入和输出则在该PN IO系统1中分别对应输出和输入。其对应关系如下图 12 地址对应关系:
图 12 地址对应关系
打开OB1,编写对应地址的STL程序,这里CPU319-3PNDP的过程映像区为256。如下图 13 编程举例:
图 13 编程举例
1 SFC 51简介西门子PLCST20
1.1 程序功能介绍
通过系统功能SFC 51 "RDSYSST" (读取系统状态),可以读取系统状态列表或部分系统状态列表,例如指示灯状态,序列号,从站状态等等。
调用SFC 51时,通过将值“1”赋给输入参数REQ来启动读取。如果可以立即读取系统状态,则SFC将在BUSY输出参数中返回值0。如果BUSY包含值1,则尚未完成读取功能。
表1 SFC51参数说明
参数 | 描述 | |
REQ | 输入参数 | REQ = 1:启动处理 |
SSL_ID | 输入参数 | 将要读取的系统状态列表或部分列表的ID号 |
INDEX | 输入参数 | 部分列表中对象的类型或编号。 |
RET_VAL | 输出参数 | 如果执行SFC时出错,则RET_VAL参数 |
将包含错误代码。 | ||
BUSY | 输出参数 | TRUE:尚未完成读取。 |
SSL_HEADER | 输出参数 | LENTHDR是SSL列表或SSL部分列表的数据记录的长度。 |
? 如果仅读取了SSL列表的标题信息,则N_DR包含属于它的数据记录数。 | ||
? 否则,N_DR包含传送到目标区域的数据记录数。 | ||
DR | 输出参数 | SSL列表读取或SSL部分列表读取的目标区 |
域: | ||
? 如果仅读取了SSL列表的标题信息, | ||
则不能评估DR的值, | ||
而只能评估SSL_HEADER的值。 | ||
? 否则,LENTHDR和N_DR的乘积将指 | ||
示已在DR中输入了多少字节。 |
2 读取CPU指示灯
可以通过SFC 51读取CPU的指示灯状态,使用的SSL_ID参数为16#74(16#19)读取全部指示灯状态 或者16#174(16#119)读取单个指示灯状态
2.1 编程
首先需要创建一个数据块,用来存放读取出来的指示灯状态结果
图1 创建DB1,存放读取结果
打开OB1,在OB1的临时变量区创建一个变量length,类型设置为Struct(结构)
图2 创建名为length的结构变量
双击length变量,进入结构变量成员定义,创建两个word类型的变量,本例中分别为size和number:
图3 创建length的结构变量的两个word成员
编写SFC51程序:西门子PLCST20
CALL "RDSYSST"
REQ :=TRUE
SZL_ID :=W#16#74 //读取全部指示灯状态
INDEX :=W#16#0
RET_VAL :=MW0
BUSY :=M2.0
SZL_HEADER:=#length
DR :=P#DB1.DBX0.0 BYTE 500 //结果输出到DB1数据块中
DB1存放的结果即为模块的指示灯状态,每个指示灯有4个字节的长度来描述。
前两个字节表示灯的类型(见表二),表示是SF灯还是BF灯等等。
第三个字节表示灯是亮还是灭,如果为1则灯亮,如果为0则灯的状态是灭。
第四个字节表示灯是否闪烁,0表示不闪,1表示正常闪烁(2hz),2,表示慢闪(0.5hz)
灯的类型列表如下(不同的CPU会有不同数目的指示灯):
表2 前两个字节的含义
16#1 | SF |
16#2 | INTF |
16#3 | EXTF |
16#4 | RUN |
16#5 | STOP |
16#6 | FORCE |
16#7 | CRST |
16#8 | BAF |
16#9 | USR |
16#A | USR1 |
16#B | BUS1F |
16#C | BUS2F |
16#D | REDF |
16#E | MSTR |
注意事项:
关于系统功能SFC51的更多详情请参阅STEP 7的在线帮助,或者通过Start > SIMATIC > DOCUMENTATION选择手册“System Software for S7-300/400 System and Standard Functions”
3 读取Profibus DP从站 状态
3.1 编程
首先需要创建一个数据块,用来存放读取出来的状态结果
图4 创建DB1,存放读取结果
打开OB1,首先在OB1的临时变量区创建一个变量length,类型设置为Struct(结构)
图5 创建名为length的结构变量
双击length变量,进入结构变量成员定义,创建两个word类型的变量,本例中分别为size和number:
图6 创建length的结构变量的两个word成员
编写SFC51程序:
CALL "RDSYSST"
REQ :=TRUE
SZL_ID :=W#16#294 //读取从站是否存在
INDEX :=W#16#1
RET_VAL :=MW0
BUSY :=M2.0
SZL_HEADER:=#length
DR :=P#DB1.DBX0.0 BYTE 500 //结果输出到DB1数据块中
在本例中,P#DB1.DBX0.0 BYTE 500中为每个DP从站(16 x 8 = 128)保留一位,地址为Address 1的DP从站的状态保存在第三个字节的Bit 1位中, 地址为Address 3的DP从站的状态保存在第三个字节的Bit 3位中,依次类推。如果从站对应的位未被置位,则表明那个DP从站没有通信上或不存在。
举例:从DB1.DBW2开始,每个位对应一个bit,例如3号站对应的位是DB1.DBX2.3 ,站点存在的位为1,不存在的为0。
注意事项:
关于系统功能SFC51的更多详情请参阅STEP 7的在线帮助,或者通过Start > SIMATIC > DOCUMENTATION选择手册“System Software for S7-300/400 System and Standard Functions”
4读取CPU的序列号
4.1 编程
说明:
通过 SFC 51“RDSYSST”可以从系统状态列表(SSL)中读取下列标识数据:
下面的表格指明了可以从不同型号和固件版本的 CPU 读取其它哪些标识数据。为此使用 SFC 51 和 SSL ID W#16#011C。
表3 INDEX说明
索引 | 名称 | S7-300/C7 | S7-400 |
W#16#0001 | 自动化系统的名称 | 从固件版本 V2.2 起 | 支持 |
W#16#0002 | CPU 的名称 | 从固件版本 V2.2 起 | 支持 |
W#16#0003 | CPU 的设备 ID | 从固件版本 V2.2 起 | 支持 |
W#16#0004 | 版权条目 | 从固件版本 V2.2 起 | 支持 |
W#16#0005 | CPU 的序列号 | 从固件版本 V2.2 起 | 从 MLFB |
6ES741x-xxx04-0AB0 起 | |||
W#16#0006 | 为操作系统保留 | - | - |
W#16#0007 | CPU 型号名称 | - | 支持 |
W#16#0008 | MMC 或 MC 的序列号 (参见条目号:19215608) | 从固件版本 V2.0 起 | - |
(CPU317:从 V2.1 开始) |
需要注意,老CPU升级到上表版本也无法实现此功能。
首先需要创建一个数据块,用来存放读取出来的状态结果
图7 创建DB1,存放读取结果
打开OB1,首先在OB1的临时变量区创建一个变量length,类型设置为Struct(结构)
图8 创建名为length的结构变量
双击length变量,进入结构变量成员定义,创建两个word类型的变量,本例中分别为size和number:
图9 创建length的结构变量的两个word成员
编写SFC51程序:
CALL "RDSYSST"
REQ :=TRUE
SZL_ID :=W#16#11C //读取CPU 的序列号
INDEX :=W#16#5
RET_VAL :=MW0
BUSY :=M2.0
SZL_HEADER:=#length
DR :=P#DB1.DBX0.0 BYTE 500 //结果输出到DB1数据块中
结果如下图:
图10 CPU序列号
注意事项:
关于系统功能SFC51的更多详情请参阅STEP 7的在线帮助,或者通过Start > SIMATIC > DOCUMENTATION选择手册“System Software for S7-300/400 System and Standard Functions”
5 读取存储卡的序列号
5.1 编程
描述:
为了获得 MMC 卡的序列号,必须使用 SFC 51 "RDSYSST" 读出系统状态列表 (SSL) :
? SSL ID W#16#011C "元件的标识"
? Index W#16#0008 "存储卡的序列号"
对于所有的带有 MMC 卡的 S7-300 CPU 和 C7 从固件版本 V2.0 起都可以读出存储卡的序列号,(CPU 317: 从 V2.1 起)。
从S7-400的V5版本起,存储卡上保存的序列号。
首先需要创建一个数据块,用来存放读取出来的状态结果
图11 创建DB1,存放读取结果
打开OB1,首先在OB1的临时变量区创建一个变量length,类型设置为Struct(结构)
图12 创建名为length的结构变量
双击length变量,进入结构变量成员定义,创建两个word类型的变量,本例中分别为size和number:
图13 创建length的结构变量的两个word成员
编写SFC51程序:
CALL "RDSYSST"
REQ :=TRUE
SZL_ID :=W#16#11C //读取MMC 的序列号
INDEX :=W#16#8
RET_VAL :=MW0
BUSY :=M2.0
SZL_HEADER:=#length
DR :=P#DB1.DBX0.0 BYTE 500 //结果输出到DB1数据块中
结果如下:
图14 MMC序列号
西门子PLCST20