下面章节将介绍如何使用软件选项包” ModbusTCP CP V4.3 "的功能块库配置S7-300/400单站系统通过CP343-1/CP443-1与第三方模拟软件进行Modbus/TCP进行通讯的详细步骤
1) 该功能块库可以用于S7-300单站通过CP343-1或S7-400单站通过CP443-1进行ModbusTCP通讯。
2) 由于需要在SIMATIC站与其他通讯伙伴之间建立TCP连接用于Modbus通讯,因此需要调用SIMATIC S7标准功能块,对于S7-300/400的CP来说,需要调用FC5(AG_SEND),FC6(AG_RECV)功能块。
3) 对于主要功能块FB106、107和108来说,包含了V1.x和V2.x,它们管脚参数并没有更改,只是在V2.x中增加了FC10”AG_CNTRL”功能块用于管理TCP连接,是否支持功能块与CP的型号和固件版本有关,如下图1所示:
图1 功能块V1.x和V2.x版本区别
当将软件选项包安装完集成到Step7时,可以在Step7安装文件的相应目录中找到块库、例程、英文手册,另外还可找到用CFC语言编程的功能快库,供读者选用,如下图2~4所示,在实际的项目调试过程中由于例子程序的各项功能比较完善,因此可以直接使用例子程序根据项目的实际情况修改相应的参数即可,可以节省大量的参数设置时间,以下主要描述了使用软件选项包” ModbusTCP CP V4.3 "配置S7-300/400站的详细配置和编程步骤。
图2 块库、例程、英文手册和软件注册的文件夹位置
图3 例程(注:当找不到例程时可以通过”Browse..”按钮来进行查找)
图4 功能块库(注:当找不到块库时可以通过”Browse..”按钮来进行查找)
以S7-400单站系统及Modscan32软件为例,详细介绍如何将S7-400单站系统通过CP443-1配置为Server,Modscan32为Client进行Modbus TCP通讯,在本例中将使用带FC10”AG_CNTRL”版本的功能块,下图5为服务器功能块库的程序结构及各功能块完成的功能:
图5 服务器功能块库程序结构
注意:Modscan32软件可以从网上免费下载得到,本例中使用的版本为V7.0版,由于各版本的功能不尽相同,因此需要注意版本问题。
本例中所用的硬件设备如下表:
表1 服务器硬件清单
所用软件如下表:
表2 服务器软件清单
打开Step7软件,新建一个工程项目文件,命名为“M_TCP_CP_V43(Server)”, 在项目下插入一个S7-400站,如下图6所示:
图6 新建S7-400 Station
双击插入的SIMATIC 400 Station的“Hardware”,打开硬件组态,在硬件组态界面下分别插入机架,电源PS407、CPU414-3PN/DP、CP443-1,本例中将CP的IP地址设为192.168.70.2,如下图7所示:
图7 硬件组态并设置CP443-1的IP地址
打开Netpro网络组态,选中CPU414-3PN/DP,插入一个新连接,连接伙伴为Unspecified,连接类型为TCP Connection,如下图8所示:
图8 网络组态-新建TCP connection
打开连接属性对话框中的“General Information”,由于CP443-1做Server被动连接,因此不勾选“Active connection estabishment”选项,ID保持缺省即可,在“Address”栏中同样由于CP443-1做Server,因此填入连接的Port号设置为502,组态完成后,编译保存,将例程站点“SIMATIC 400(Server)”中的程序(System data不需要拷贝)拷贝到该项目中并下载(注意:OB100中调用的FB108的id和laddr需根据组态确认)。对于通讯伙伴Remote的IP地址可以不填,即允许任意IP地址的客户端发起连接,如下图9所示:
图9 S7-400为服务器的TCP connection参数设置
对于服务器和客户端的端口号(下述中以Port代替)的选择需要注意以下几点:
1)一般情况下服务器端的Port号modbus TCP规范缺省为502,客户端的Port号设置为客户端允许的号即可,另外各厂商产品也有一些限制,对于SIMATIC产品一般从2000之后开始。
2)对于一个系统来说,当创建多个TCP连接时,要保证IP地址和Port号不重合,即同一个IP地址下创建多个TCP连接时Port号必须不同,而不同的系统因IP地址不同可以使用相同的Port号,例如本例中如果需要创建多个TCP连接作为Server时因只有一个IP,因此Port号必须不同。
由于“ ModbusTCP CP V4.3”选项包支持功能码FC1,2,3,4,5,6,15,16,不同的功能码测试过程中类似,因此下面以FC03(读写保持寄存器)为例来说明通讯测试的整个过程,对于其他功能码的测试将不再重复描述,对于Modbus的数据类型可参考下表3:
表3 Modbus数据类型
由于服务器主功能块FB108“MODBUSCP”的参数需要初始化,因此分别在OB100及OB1中调用FB108,在OB100中调用FB108完成相关参数的初始化,FB108的管脚分分布如下图10所示:
注意:在图10中已经填写的参数不需要初始化,在OB1调用赋值;而未填写的参数需要初始化,在OB100中调用完成。
打开Modscan32软件,在“Connection--->connect”中打开连接属性对话框,连接接口选择“Remote TCP/IP Server”,IP Address分别填入CPU的IP地址
192.168.70.2,Service为远程服务器的端口502,在协议的选择对话框中可以定义传输模式、通讯超时响应时间,报文发送间隔及允许写多个保
持寄存器等,这里分别保持缺省设置即可,如下图11所示:
图18:对应TCP通讯的Modscan32连接窗口
下载网络组态及程序到CPU中,使能参数ENQ_ENR=1,在 Modscan32的“Set up->Data Definition”中设置数据扫描周期、寄存器连接类型、起始地址、长度等,如下图11所示:
图11 Modscan32中Modbus数据参数定义
之后在ModScan32中就可以建立和远程CP443-1 Server的连接了,在Netpro中可以看到连接已经建立起来,如下图12所示:
图12 Modscan32激活与S7-400的连接
由于Modbus的内部地址编排时基于数据链路层和应用层有一定的映射关系,因此Modbus的地址与SIMATIC中的DB块的地址时按照一定的地址映射关系来相对应,这样造成了DB块中有一定的地址偏移量,在本例中假设数据区的定义如下图21所示,其DB偏移量、Modbus物理编址、应用层编址如下图13所示:
图13本例中的数据区定义
图14 DB偏移量、Modbus物理编址、应用层编址对应关系
在Step7的项目程序中新建一个变量监控表,插入需要监控的参数和数据区变量,可以看到ModScan32软件与CP443-1的数据通讯已经建立起来了,双方可以进行正常的保持寄存器数据读写操作,如下图15所示:
图15 通讯连接建立
下面以S7-400单站系统及ModSim32软件为例,详细介绍如何将S7-400单站系统配置为Client,ModSim32为Server进行Modbus TCP通讯,在本例中同样使用FC10“AG_CNTRL”版本的功能块,由于客户端和服务器模式均使用相同的功能块,因此客户端功能块库的程序结构及各功能块完成的功能可以参考图5。
本例中所用的硬件设备如下表:
表4 客户端硬件清单
所用到软件如下表:
表5 客户端软件清单
打开Step7软件,新建一个工程项目文件,命名为“M_TCP_CP_V43(Client)”, 在项目下插入一个S7-400站,如下图16所示:
图16 新建S7-400 Station
双击插入的SIMATIC 400 Station的“Hardware”,打开硬件组态,在硬件组态界面下分别插入机架,电源PS407、CPU414-3PN/DP、CP443-1,本例中将CP的IP地址设为192.168.70.2,如下图17所示:
图17 硬件组态并设置CP443-1的IP地址
打开Netpro网络组态,选中CPU414-3PN/DP,插入一个新连接,连接伙伴为Unspecified,连接类型为TCP Connection,如下图18所示:
图18 网络组态-新建TCP connection
打开连接属性对话框中的“General Information”,由于CP443-1做Client主动发起连接,因此需要勾选“Active connection estabishment”选项,ID保持缺省即可,在“Address”栏中同样由于CP443-1做Client,对于本地的端口号设置为2000(一般从2000以外开始以避免与别的协议资源冲突),对于通讯伙伴Remote的IP地址设置为测试PC机的IP 地址,本例中 PC机的IP设置为192.168.70.245,而Port号设置为502,如下图19所示:
图19 S7-400为客户端的TCP connection参数设置
组态完成后,编译保存,将例程站点“SIMATIC 400(Client)”中的程序(System data不需要拷贝)拷贝到该项目中并下载(注意:OB100中调用的FB108的id和laddr需根据组态确认)。
关于服务器和端口号的设置请参考本文中2.2章节说明。
由于“ModbusTCP CP V4.3”选项包支持功能码FC1,2,3,4,5,6,15,16,不同的功能码测试过程中类似,因此下面同样以FC03(读写保持寄存器)为例来说明通讯测试的整个过程,对于其他功能码的测试将不再重复描述。
需要说明的是由于客户端功能块需要定义具体的功能码,而主功能块FB108 “MODBUSCP”并没有直接的管脚来定义功能码,而是由其中的两个参数“DATA_TYPE”和“single-write”共同决定(参见后面的管脚参数说明),详细情况如下图20所示:
图20 S7-400单站系统做客户端时不同的功能码的参数定义
由于客户端和服务器均使用相同的功能块FB108“MODBUSCP ”的参数需要初始化,因此分别在OB100及OB1中调用FB108,在OB100中调用FB108完成相关参数的初始化,FB108的管脚分布参见3.3章节中的图10说明。
打开ModSim32软件,在“Connection--->connect”中打开连接属性对话框,连接接口选择“Modbus/TCP svr”,TCP/IP Server Port为本地服务器的端口502,如下图21所示:
图21 ModSim32中设置端口号
下载硬件组态及程序到CPU中,给参数ENQ_ENR发送脉冲信号;在打开的ModSim32软件窗口设置寄存器连接类型、起始地址、长度等,如下图22所示:
图22 ModSim32中Modbus数据参数定义
关于SIMATIC中DB偏移量、Modbus物理编址、应用层编址对应关系请参考本文中2.3章节图14的说明
之后在CP443-1 Client就可以建立和远程ModSim32 Server的连接了,在Netpro中可以看到连接已经建立起来,如下图23所示:
图23 Modscan32激活与S7-400的连接
在Step7的项目程序中新建一个变量监控表,插入需要监控的参数和数据区变量,可以看到ModSim32软件与S7-400的数据通讯已经建立起来了,双方可以进行正常的保持寄存器数据读写操作,如下图24所示:
图24 S7-400单站系统作为客户端与ModSim32软件通讯
由于是通过PC测试软件模拟第三方设备与SIMATIC CPU的集成PN口进行Modbus TCP通讯,因此在实际的第三方设备与CPU的集成PN口进行通讯时需要注意以下几点:
1) 由于订货号2XV9450-1MB02程序中会占用CPU 较大的装载和工作存储区,因此对于性能比较低特别是S7-300的低端CPU进行通讯时必须考虑一定的富余量。
2) 对于SIMATIC S7,参数DB_x的数据区建议使用不同的DB 块,使用同一个DB的不同地址区会造成地址编排混乱,另外参数Start_x与END_x 参数不能出现地址叠加情况。
3) 第三方设备的数据区与SIMATIC S7的数据DB块的地址对应关系可以先按照第三方的数据区域Modbus地址的偏移关系之后计算相应的偏移量。
4)建议使用项目中的样例程序,只须修改连接ID,定义通讯双方的IP地址、端口号及相应的数据存储区等,能减少编程量,只须把样例程序放到一个单独的FC块中即可,样例程序中定义了足够的数据区,连接成功及错误次数指示等。
5) Modbus TCP每一包的数据最多只能发送125个寄存器或2000个比特位,超过该范围必须进行分包处理。
6) S7-300/400作为Client能与多少个Server建立通讯或者作为Server时能与多少个Client通讯取决于产品所支持的TCP连接数,Modbus/TCP协议并没有对此进行约束和限制。
未经授权的Modbus TCP软件可用于测试和学习,不允许用于商业行为;未经授权的软件测试时CPU 的INTF指示灯红色闪烁,并在CPU故障缓冲区生成错误信息;同时,Modbus TCP功能块报错,如图25、26所示:
图25 CPU诊断缓冲区报错
图26 Modbus TCP功能块报错A090
每个CPU都需要对功能块MODBUSCP进行授权。授权有两个步骤:读取IDENT_CODE和申请注册码REG_KEY。且在CPU中必须调用OB121。
1、下载程序并将CPU切换到RUN模式;
2、打开MODBUSCP(FB108)的背景块DB108,确认IDENT_CODE的偏移地址为108;如图27所示:
图27 确认IDENT_CODE的偏移地址
3、打开变量监视表,输入DB108.DBB108开始的20个字节,偏移地址110开始的18个字符即为IDENT_CODE,监控如图28所示:
图28 确认IDENT_CODE
4、按上图方式,获取IDENT_CODE和软件包装上的License-No,并按照章节5.2和5.3所描述步骤申请注册码。
授权中心联系方式:010-64757575
通过西门子授权服务中心申请注册码时,需要您提供所购买的软件订货号、IDENT_CODE和软件包装上的License-No ,如图28所示。
1、通过西门子技术支持网站申请,打开如下网址,点击“技术问题提交”:
http://support.automation.siemens.com/CN/llisapi.dll?func=cslib.csinfo2&aktprim=99&lang=zh
图29 技术支持网站
2、请按如下示例的步骤进行操作(注意:由于步骤3搜索出来的参考信息无法解决授权问题,请直接点击“继续”进入步骤4),如图30~34所示。
图30 步骤1
图31 步骤2
图32 步骤4
图33 步骤5
图34 步骤6
1、西门子授权中心收到技术支持申请后,将会尽快给您回复邮件;
2、当获取到注册码后,在项目中打开LICENSE_DB(DB3);
3、通过菜单“View--->Data View”将DB块切换到数据视图模式,将获取的17位注册码填写到“Actual value”中,如图35所示。
图35 输入注册码
4、将LICENSE_DB(DB3)下载到CPU中,CPU的INTF指示灯熄灭;并可通过查看MODBUSPN(FB102)的输出引脚LICENSED为true且不再报A090错误代码,确认注册码激活成功,如图36所示。
图36 注册码激活成功
STATUS(Hex) |
故障原因 |
处理措施 |
FB MODBUS故障 |
||
A002 |
Modbus起始地址Start_x错误 |
由通讯伙伴确认起始地址 |
A003 |
Modbus地址映射的DB块的数据区长度太短,最低长度: -寄存器: (START_ADDRESS – start_x + LENGTH) * 2 -位 (START_ADDRESS – start_x + LENGTH) / 8 其他可能的原因: ·参数初始化错误(CP为Client时) ·客户端请求报文时错误的地址区域(CP为Server) |
扩展DB区域 当CP为Client时,修改参数START-ADDRESS或者LENGTH 当CP为Server时,修改客户端的请求 |
A004 |
仅在CP为Client时才有此故障: 参数DATA_TYPE及WRITE_READ设置不匹配,不可能对输入寄存器或离散输入进行写操作 |
修改此两个参数 |
A005 |
CP为Client时: 参数LENGTH设置无效 CP为Server时: Client请求的寄存器号无效,合法的数据类型范围如下: 读线圈/离散输入: 1 to 2000 写线圈: 1 to 1968 读寄存器: 1 to 125 写保持寄存器: 1 to 123 |
CP为Client时: 修改参数LENGTH CP为Server时: 修改Client请求的数据类型范围 |
A006 |
CP为客户端时: 数据区1-8中对应的Modbus地址范围(DATA_TYPE, START_ADDRESS和 LENGTH )不存在 CP为服务器时: 客户端请求的报文不正确 |
CP为Client时: 修改参数DATA_TYPE,START_ADDRESS和 LENGTH CP为Server时: 修改Client 请求或修改数据类型data_type_x.
|
A007 |
CP为Client时: 参数MONITOR监控时间设置无效,值必须>20ms |
修改参数MONITOR |
A008 |
接收监控超时,可能的原因: 对于MODBUSCP V2.x: 所有通过502端口的连接激将中断并重新建立 对于MODBUSCP V1.x: 同步错误,报文丢失 |
检查通讯伙伴的参数设置,如单元标识符等 |
A009 |
当CP为Client时,接收标识符TI与发送不一致, 连接将终止和重新建立 对于MODBUSCP V2.x: 所有通过502端口的连接激将中断并重新建立 |
通过抓包工具来分析和修正通讯伙伴的报文
|
A00A |
CP为Client时,接收参数UNIT 与发送的不一致,连接将终止和重新建立 对于MODBUSCP V2.x: 所有通过502端口的连接激将中断并重新建立 |
|
A00B |
CP为Client时: 接收与发送功能码不一致 CP为Server时: 无效的功能码被接收 对于MODBUSCP V2.x: 所有通过502端口的连接激将中断并重新建立 对于MODBUSCP V1.x: 同步错误,报文丢失 |
CP为Client时: 通过抓包工具来分析和修正通讯伙伴的数据报文格式 CP为Server时: 注意FB MODBUS仅支持功能码FC1、2、3、4、5、6、15、16 |
A00C |
接收到的字节长度与寄存器/位不匹配 CP为服务器时,CP将发一个响应异常给客户端 对于MODBUSCP V2.x: 所有通过502端口的连接激将中断并重新建立 |
通过抓包工具来分析和修正通讯伙伴的报文
|
A00D |
仅在CP 为Client 时发生: 响应的MODBUS寄存器/位地址或长度与客户端请求的不一致 |
|
A00E |
MODBUS报文报头的长度与寄存器/位 不匹配,FB将忽略 对于MODBUSCP V2.x: 所有通过502端口的连接激将中断并重新建立 对于MODBUSCP V1.x: 同步错误,报文丢失 |
|
A00F |
非0的协议标识符报文被接收 对于MODBUSCP V2.x: 所有通过502端口的连接激将中断并重新建立 对于MODBUSCP V1.x: 同步错误,报文丢失 |
|
A010 |
数据区1-8 DB块号重复使用 |
确保每个Db块号只使用一次 |
A011 |
DATA_TYPE参数设置(范围为1-4) |
修改DATA_TYPE参数 |
A012 |
数据区参数data_type_1和data_type_2设置重叠
|
数据区不能有重叠的modbus地址区域 |
A013 |
数据区参数data_type_1和data_type_3设置重叠 |
修改此参数 |
A014 |
数据区参数data_type_1和data_type_4设置重叠 |
|
A015 |
数据区参数data_type_1和data_type_5设置重叠 |
|
A016 |
数据区参数data_type_1和data_type_6设置重叠 |
|
A017 |
数据区参数data_type_1和data_type_7设置重叠 |
|
A018 |
数据区参数data_type_1和data_type_8设置重叠 |
|
A019 |
当参数data_type_x设置不为0时,db_x被赋值0 |
db_x不能为0 |
A01A |
报头中长度错误: 范围3-253字节 对于MODBUSCP V2.x: 所有通过502端口的连接激将中断并重新建立 |
通过抓包工具来分析和修正通讯伙伴的报文
|
A01B |
CP为Server及使用功能码FC05时: 接收的线圈值无效 CP将发送异常报文 |
|
A01E |
CP接收到无法识别的数据, 对于MODBUSCP V2.x: 所有通过502端口的连接激将中断并重新建立 对于MODBUSCP V1.x: 同步错误,报文丢失 |
分析错误信息,通过抓包工具来分析和修正通讯伙伴的报文 |
A01F |
功能块FB MBBUSCP返回一个无效的状态 |
联系产品供货商 |
A020 |
参数Check_conn_cycle设置<1s时,对于功能块AG_CNTRL过短 |
当为Client模式时,参数Check_conn_cycle=TRUE下Check_conn_cycle设置需要>1s; 当为Server模式时,Check_conn_cycle设置需要>1s; |
A023 |
数据区参数data_type_2和data_type_3设置重叠
|
数据区不能有重叠的modbus地址区域 |
A024 |
数据区参数data_type_2和data_type_4设置重叠 |
|
A025 |
数据区参数data_type_2和data_type_5设置重叠 |
|
A026 |
数据区参数data_type_2和data_type_6设置重叠 |
|
A027 |
数据区参数data_type_2和data_type_7设置重叠 |
|
A028 |
数据区参数data_type_2和data_type_8设置重叠 |
|
A034 |
数据区参数data_type_3和data_type_4设置重叠 |
|
A035 |
数据区参数data_type_3和data_type_5设置重叠 |
|
A036 |
数据区参数data_type_3和data_type_6设置重叠 |
|
A037 |
数据区参数data_type_3和data_type_7设置重叠 |
|
A038 |
数据区参数data_type_3和data_type_8设置重叠 |
|
A045 |
数据区参数data_type_4和data_type_5设置重叠 |
|
A046 |
数据区参数data_type_4和data_type_6设置重叠 |
|
A047 |
数据区参数data_type_4和data_type_7设置重叠 |
|
A048 |
数据区参数data_type_4和data_type_8设置重叠 |
|
A056 |
数据区参数data_type_5和data_type_6设置重叠 |
|
A057 |
数据区参数data_type_5和data_type_7设置重叠 |
|
A058 |
数据区参数data_type_5和data_type_8设置重叠 |
|
A067 |
数据区参数data_type_6和data_type_7设置重叠 |
|
A068 |
数据区参数data_type_6和data_type_8设置重叠 |
|
A068 |
数据区参数data_type_7和data_type_8设置重叠 |
|
A07A |
参数id设置无效:范围1-64 |
修改参数id |
A07C |
参数data_type_1设置无效:范围0-4 |
修改参数data_type_x |
A07D |
参数data_type_1未定义,data_type_1为缺省的使用数据区,需要定义 |
修改参数data_type_1 |
A07E |
参数db_x值与背景DB中的值不一致 |
修改参数db_x |
A080 |
在OB1和OB100调用FB MODBUS功能块时使用了不同的背景DB |
需要使用相同的背景DB |
A081 |
CP为Client且使用FC05功能码时: 接收的线圈状态与发送不一致 |
通过抓包工具来分析和修正通讯伙伴的报文 |
A082 |
CP为Client且使用FC06功能码时: 接收的寄存器值与发送不一致 |
通过抓包工具来分析和修正通讯伙伴的报文 |
A083 |
仅在CP为Client时:在上一个请求还没有处理完成时又发送新的请求 |
等待DONE =TRUE 或 ERROR = TRUE后再发送新请求 |
A085 |
在授权期间由于无效的写权限导致发生错误 |
对于授权DB,确认参数REG_KEY的结构是否正确 |
A090 |
功能块未授权,此为一状态信息,参数ERROR并不会置1,功能块在未授权情况仍然可以运行而不影响通讯 |
针对CPU读出预授权解码,之后按照授权操作向IT4industry.部门索取授权码 |
A091 |
收到异常响应码1(仅在Client模式),连接将终止和重新建立 |
通讯伙伴不支持请求的报文 |
A092 |
收到异常响应码2(仅在Client模式),无效的或不存在的地址请求 |
确认参数LENGTH 或START_ADDRESS 是否正确 |
A093 |
收到异常响应码3(仅在Client模式) |
通讯伙伴无法执行报文接收(例如请求长度不支持等) |
A094 |
收到异常响应码4(仅在Client模式) |
通讯伙伴无法执行报文接收 |
A095 |
收到未知的异常响应码(仅在Client模式) |
通过抓包工具来分析和修正通讯伙伴的报文 |
FC/SFC故障 |
||
7xxx |
请参考SIMATIC的在线帮助 |
通过在线帮助SIMATIC manager -> mark block -> key F1 –> Ethernet -> see also -> code evaluation可以查到相关帮助信息 |
8xxx |
请参考SIMATIC的在线帮助 |
通过在线帮助SIMATIC manager -> mark block -> key F1 –> Ethernet -> see also -> code evaluation可以查到相关帮助信息 |
SFC24故障 |
||
80A1 |
DB=0或超出了CPU允许的范围 |
选择有效的DB |
80B2 |
DB块在CPU中不存在 |
DB_x参数中的DB块必须创建并下载到CPU中 |
80B3 |
DB块被创建为“Unlinked”类型 |
DB块不能创建为“Unlinked”类型 |