1、组网概述
本文以西门子smart200PLC和综科智控品牌的IO扩展模块(型号:ZKA-4488-ETH)为例介绍西门子smart200通过modbusTcp连接外部扩展IO模块的步骤设置。ZKA-4488-ETH是一款8路数字量输入(DI),8路数字量输出(DO),4路模拟量输入(AI,0/4-20mA),4路模拟量输出设备(AO,0/4-20mA),以太网通信。
以ZKA-4488-ETH为例,出厂默认通讯参数如下:
ZK模块IP为:192.168.0.105
TCP端口为:10001
(注意:我们模块出厂时默认端口为10001,客户也可以通过ZK模块的配置文件把ZK通讯端口改成modbus-tcp的默认端口502)
工作模式为:服务器模式
2、S7-200ModbusTCP通信
1S7-200ModbusTCP通信简介
ModbusTCP是通过工业以太网TCP/IP网络传输的Modbus通信。S7-200SMART采用客户端-服务器方法,Modbus客户端设备通过该方法发起与Modbus服务器设备的TCP/IP连接。
建立连接后,客户端向服务器发出请求,服务器将响应客户端的请求。客户端可请求从服务器设备读取部分存储器,或将一定数量的数据写入服务器设备的存储器。如果请求有效,则服务器将响应该请求;如果请求无效,则会回复错误消息。
S7-200SMART支持做ModbusTCP的客户端或者服务器,可以实现PLC之间通信,也可以实现与支持此通信协议的第三方设备通信。通信伙伴数量比较多的时候,可以使用交换机,扩展以太网接口。
2ModbusTCP指令库
STEP7-Micro/WINSMART从版本开始,软件中直接集成ModbusTCP库指令。
安装软件后,ModbusTCP指令位于STEP7-Micro/WINSMART项目树中"指令"文件夹的"库"文件夹中。如图2.ModbusTCP库指令所示。
指令分为客户端和服务器两种,目前指令版本为。客户端指令会占用开放式用户通信资源主动连接,最多8个;服务器指令会占用开放式用户通信资源的被动连接资源,最多也是8个。
图2.ModbusTCP库指令
ModbusTCP客户端:
Modbus客户端指令MBUS_CLIENT使用CPU的以下资源:
占用主动连接资源。最多有8个主动连接资源
连接多个服务器伙伴时,自动生成连接ID。
ModbusTCP客户端使用以下程序实体:
1个子程序
2849个字节的程序空间
V存储器的638字节模块,用于指令符号
ModbusTCP服务器:
Modbus服务器指令MBUS_SERVER使用CPU的以下资源
占用被动连接资源。最多有8个被动连接资源
连接多个客户端伙伴时,自动生成连接ID。
ModbusTCP服务器使用下列程序实体:
1个子程序
2969个字节的程序空间
V存储器的445字节模块,用于指令符号
指令库编程后,必须从STEP7-Micro/WINSMART的为使用的指令分配库存储区地址。
3ModbusTCP功能编程
下面以一台S7-200SMART和一台ZKA-4488-ETH之间进行ModbusTCP通信为例,详细阐述客户端与服务器侧如何编程及通信的过程。具体的实验环境见表1.;通信任务见表2:
表1.实验环境
操作系统
WIN7SP1专业版64位
编程软件
STEP7-Micro/版本
硬件
CPUSR60:6ES7288-1SR60-0AA0固件:版本
ZKA-4488-ETH:综科智控4AI+4AO+8DI+8DO以太网modbus-tcp通信
交换机:CSM1276GK7277-1AA10-0AA0
表2.通信任务
硬件
通信角色
IP地址
端口号
读/写
数据区域
CPUSR60
客户端
192.168.0.60
0
读
VB20-VB31
ZKA-4488-ETH
服务器
192.168.0.105
10001
响应
AI1~AI3模拟量采集值
客户端侧指令编程
1、系统块中设置客户端的IP地址,以确保IP地址设置无误。此步骤为可选,如果确定IP地址设置无误,可忽略此步骤。设置方法如图2.所示。
图2.系统块设置IP地址
图3.添加客户端指令
3、填写客户端指令参数,如图4.所示。
图4.填写客户端参数
程序块具体参数详细解释介绍见表3.
参数及类型
数据类型
说明
Req
IN
BOOL
=1:表示向服务器发送Modbus请求
Connect
IN
BOOL
=1:尝试与分配的IP地址及端口号建立连接;
=0:尝试断开已经建立的连接,忽略Req的任何请求
IPAddr1-4
IN
BYTE
填写ModbusTCP服务器的IP地址IPAddr1-4为高到低字节
IP_Port
IN
BYTE
填写ModbusTCP服务器的端口号
RW
IN
BYTE
指定操作模式=0:读;=1写
Addr
IN
DWORD
要进行读写的参数的Modbus起始地址,本例中也即ZKA-4488-ETH寄存器地址
Count
IN
INT
要进行读写的参数数据长度;
数字量输入/输出Count=1表示1bit,最大1920位
对于模拟量输入和保持寄存器,最大Count值为120字。
本例中读取AI1~AI3模拟输入的读数,因为每个AI输入通道占用2个WORD寄存器地址,所以读取3个通道AI1~AI3就需要读取6个WORD寄存器
DataPtr
IN_OUT
DWORD
数据寄存器地址指针,指向本地用于读/写操作的数据地址区域的首地址
Done
OUT
BOOL
TRUE:以下任一条件时为真:客户端已与服务器建立连接;客户端已与服务器断开连接;客户端已接收Modbus响应;发生错误
FALSE:客户端正忙于建立连接或等待来自服务器的Modbus响应。
Error
OUT
BOOL
出现错误,仅一个周期有效
4、鼠标选中程序块文件夹,单击右键,下拉菜单中选择库存储器,如图5.所示。
5、在库存储区分配对话框中手动输入存储区的起始地址。此实例为VB5000开始,以使指令库可以正常工作。确保库存储区与程序中其他已使用的地址不冲突。使用建议地址无法确定是否有地址重叠,所以推荐手动输入正确的库存储区首地址。如图6.所示。
图6.库存储区地址分配
6、编译项目,下载程序。
将置位为1,然后在状态图表中创建变量,VW20-VW30共6个字,监视值如图7.所示。
图7.读取ZKA-4488-ETH的数据
4关于ModbusTCP协议及地址
S7-200SMART做ModbusTCP通信,可以支持的功能码及功能描述及所占用的地址区,如表4.所示。客户端会主动地发送请求,服务器响应。在通信指令填写参数中没有直接填写功能码,而是通过多个参数填写共同确定功能码的。
表4.功能码概况说明
功能码(十进制)
功能描述
RW
Addr
Count
CPU地址
01
读数字量输出位
0
00001-09999
1-1920位
02
读数字量输入位
0
10001-19999
1-1920位
03
读寄存器字
0
40001-49999
400001-465535
1-120字
V区
04
读模拟量输入字
0
30001-39999
1-120字
AIW0-AIW110
05
写数字量输出单个位
1
00001-09999
1位
06
写寄存器单个字
1
40001-49999
400001-465535
1个字
V区
15
写数字量输出多个位
1
00001-09999
1-1920位
16
写寄存器多个字
1
40001-49999
400001-465535
1-120字
V区
举例:
和ModbusTCP服务器交换数据参数支持功能码:03,在客户端指令中设置两个参数确定03功能码:
RW=0:确定读取数据,(筛选出可能会使用的功能码:01,02,03,04),
Addr:40001-49999/400001-465535,表示交换数据为寄存器类型的数据。
5ModbusTCP常问问题
1、如何判断ModbusTCP连接是否建立?
答:进行ModbusTCP通信,需要建立连接,
S7-200SMARTCPU作为ModbusTCP客户端时:通过ModbusTCPClient指令MBUS_CLIENT的符号表中的mConnected参数来判断,如图1.所示
mConnected=1表示已经建立连接,mConnected=0表示尚未建立连接
图1.mConnected判断连接状态
注意:当PLC内存在多个客户端或者多个服务器时,不建议参考该状态点。
2、如何查看错误代码?
答:出现错误时,MBUS_CLIENT指令输出参数Done会为1,但是,Done在连接建立完成,连接断开,响应完成时都会出现置位为1的情况。
出现错误时,还有Error字节会显现出错误代码,仅保留一个周期时间。
综上所述,查看错误代码,可以按照图3.所示的方法进行。
图3.查看错误代码
3、进行ModbusTCP通信寄存器类型数据,数据量大超过120个字如何处理?
答:如果数据量超过120个字,可以进行如下两种方法操作:
A、建立多个连接,不同连接之间,可以并行操作,因为占用的通信资源不同;
B、建立一个连接,进行多个操作,不同操作之间需要进行轮询,同一时刻只有一个操作在进行。
4、ModbusTCP通信时,如何访问地址范围大于49999的保持寄存器?
Modbus保持寄存器地址在40001到49999这一范围内。该范围足以满足大多数应用的要求,但有些Modbus从站设备将数据映射到地址范围更大的保持寄存器中。MBUS_CLIENT指令允许参数Addr的附加范围,以支持400001至465536的保持寄存器地址的扩
展范围。例如,要访问保持寄存器16768,请将MBUS_CLIENT的Addr参数设置为416768。扩展寻址允许访问Modbus协议支持的全部65536个可能地址。此扩展寻址仅适用于保持寄存器。
5、S7-200SMART作为ModbusTCP客户端,服务器为网关模块,连接多个ModbusRTU设备时如何区分ModbusRTU从站地址能?
答:S7-200SMARTCPU作为ModbusTCP客户端与ModbusTCP服务器通信,当尝试访问比ModbusTCP服务器更低端的串行子网中的设备,会有报错"无法建立连接"。如果ModbusTCP服务器用于ModbusRTU协议的网关,则MB_UNIT_ID可用于识别串行网
络上连接的从站设备。MB_UNIT_ID用于将请求转发到正确的ModbusRTU从站地址。一些ModbusTCP设备可能要求MB_UNIT_ID参数在限制范围内。该参数所在位置,如图4.所示
mModbusUnitID默认值为255(16#FF),如果从站设备有多个,可以S7-200SMART和网关模块建立一个连接,在这个连接上通过修改UnitID的值进行UnitID的轮询。
图4.mModbusUnitID
6、对于一些服务器不支持写单个数字量输出位(功能码5)/单个保持寄存器(功能码6),S7-200SMART如何实现写单个位/字。
答:一些Modbus服务器设备不支持Modbus功能写入单个离散输出位(Modbus功能5)或写入单个保持寄存器(Modbus功能6)。相反,这些设备只支持多位写入(Modbus功能15)或多寄存器写入(Modbus功能16)。如果服务器设备不支持单个位/字Modbus
功能,则MBUS_CLIENT指令将返回错误代码1。Modbus客户端协议允许强制MBUS_CLIENT指令使用多个位/字Modbus功能,而非使用单个位/字Modbus功能。可通过在Modbus客户端符号表中查找符号mModbusForceMulti,并在程序执行MBUS_CLIENT之前
更改此值,来强制多个位/字指令。将mModbusForceMulti设置为TRUE,可在写入单个位或寄存器时强制使用多个位/字功能。如图5.所示。
图5.mModbusForceMulti





