施耐德 M580 和西门子 S7200 SMART 的MODBUS TCP通讯
M580是施耐德的中大型PLC,功能强大,S7 200 SMART是西门子的小型PLC,应用广泛,在工业现场经常需要2个PLC之间进行通讯。因为M580支持MODBUS TCP和Ethernet/IP两种工业以太网协议,并且S7 200 SMART也可以通过功能块实现MODBUS TCP服务器的功能,所以它们之间可以进行MODBUS TCP的通讯。本例是M580作为客户端去读写S7 200 SMART的实现方法。
BMEP584040 SV 3.1 Control expert 14.0 (unity pro 14.0);
CPU SR20 SV 2.4 STEP 7-MicroWIN SMART V02.04;
安装有软件的笔记本电脑,网线若干;
实验中使用的是BMEP584040的CPU,CPU上有3个网口,第1个网口是服务端口,用于连接S7 200 SMART,第2和第3个网口是设备口,主要是用于连接以太网远程IO的,也可以连接PC用于编程。3个网口在内部是连通的,可以实现类似于交换机的功能,所以按照图中的连接,PC也可以通过编程软件连上S7 200 SMART。
3.1在软件中分配s7 200 smart的IP地址,如下图所示。
3.2STEP7-Micro/WIN SMART 从V2.4 版本开始,软件中直接集成 Modbus TCP 库指令,无需单独安装或者购买。安装软件后,Modbus TCP 指令位于 STEP7-Micro/WIN SMART 项目树中“指令”文件夹的“库”文件夹中。如下图所示。指令分为客户端和服务器两种,目前指令版本为 V1.0。客户端指令会占用开放式用户通信资源主动连接,多8个;服务器指令会占用开放式用户通信资源的被动连接资源,多也是8个。本例中S7 200 SMART作为服务器,所以只调用MBUS_SERVER功能块。
3.3MBUS_SERVER功能块管脚说明如下:
参数及类型 | 数据类型 | 说明 | |
Connect | IN | BOOL | =1:服务器接受来自客户端的请求; =0:服务器可以断开已经建立的连接 |
IP_Port | IN | WORD | 服务器本地端口号 |
MaxIQ | IN | WORD | 对应数字量输入/输出点(对应Modbus 地址参数0xxxx或者1xxxx) 可设置范围:0-256, =0表示禁用对输入和输出的所有读取和写入。 建议将 MaxIQ 值设置为 256。 |
MaxAI | IN | WORD | 对应模拟量输入参数(对应Modbus 地址参数 3xxxx) 可设置范围:0-56。 = 0表示禁用对模拟量输入的读取。 要允许访问所有 CPU 模拟量输入,MaxAI 的建议值如下: 对于 CPU CR40 和 CR60,为 0 对于所有其它 CPU 型号,为 56 |
MaxHold | IN | WORD | 用于 Modbus 地址 4xxxx 或 4yyyyy 的 V 存储器中的字保持寄存器数 |
HoldStart | IN | Dword | 指向 V 存储器中保持寄存器起始位置的指针 |
Done | OUT | BOOL | TRUE:以下任一条件时为真:客户端已与服务器建立连接;客户端已与服务器断开连接;客户端已接收 Modbus 响应;发生错误 FALSE:客户端正忙于建立连接或等待来自服务器的 Modbus 响应。 |
Error | OUT | BOOL | 出现错误,仅一个周期有效 |
3.4设置库存储器分配
鼠标右键选择“程序块”文件夹,在菜单中选择“库存储器”:
在库存储区分配对话框中手动输入存储区的起始地址。此实例为VB7000开始,以使指令库可以正常工作。确保库存储区与程序中其他已使用的地址不冲突。使用建议地址无法确定是否有地址重叠,所以推荐手动输入正确的库存储区首地址。如下图所示:
3.5编写简单的逻辑程序如下:
S7 200 smart作为服务器可以支持8个客户端,但是一个客户端需要一个MBUS_SERVER,本例中,需要连2个客户端,所以调用了2个MBUS_SERVER的功能块,注意IP_Port需要区别开,一个是502,一个是503,不可以2个MBUS_SERVER使用同一个端口。
502端口从VB0开始,即VW0对应MODBUS的40001(VW0对应VB0和VB1;VW2对应MODBUS的40002(VW2对应VB2和VB3)
503端口从VB100开始,即VW100对应MODBUS的40001;VW102对应MODBUS的40002:
C0是计数器,CU管脚是1秒的脉冲,做一个简单的自加1的计数,然后将C0的计数值给到VW2和VW100,在通讯的时候,看客户端读到的值是否在变化,用于判断通讯是否正常。
3.6将程序下载到CPU,将CPU启动起来,电脑使用MODSCAN测试S7 200 SMART的MODBUS TCP服务器的数据。(MODSCAN是一个电脑测试工具,可以模拟MODBUS的主站)
测试502端口的数据,502端口开辟的寄存器数量是20个,测试数据VW2对应40002:
测试503端口的数据,503端口开辟的寄存器数量是40个,测试数据VW100对应40001:
4.1打开Control Expert(unity pro)软件,新建项目,选择BMEP584040的CPU,新建完成后,如下图所示,解锁安全。解锁安全是启用CPU的服务里面的功能,并且禁用访问控制,如果访问控制是启用的,且没有设置正确,可能会导致次下载程序后,软件用以太网就连接不上CPU了。
解锁完成后,需要如下图所示打钩“确认”,在Control Expert修改了硬件和配置,都需要打钩“确认”。
设置M580的IP主地址192.168.10.1,其中IP地址A用于连接远程的以太网IO,本例中没有用。
在“工具”菜单的“项目设置”中,勾选“直接以数组变量表示”和“允许动态数组”,如下图所示,这个是在使用READ_VAR和WRITE_VAR功能块的时候不报“禁用动态数组”错误。
4.2M580使用READ_VAR和WRITE_VAR编程来实现MODBUS TCP通讯
首先在变量表中新建如下的变量:
在Control Expert软件里面,modbus TCP的客户端功能默认都是访问服务器的502端口的,并且也只能访问502端口,其他端口访问不了。
%S5是100毫秒的脉冲,P是上升沿,N是下降沿,因为s7 200 smart的502端口一次只能接受一个请求,所以READ_VAR和WIRTE_VAR需要分开触发。
Addm是寻址功能块,0.0.3指示的是M580的CPU的网口(这个是默认的),192.168.10.200是s7 200 smart的IP地址。
OBJ填写%MW表的是读写4区,NUM是0表示读取的首地址是40001,NB 6表示读6个字。
GEST是通讯管理表,是4个整形的数组,其中第3个字是超时时间,默认时基是100ms,本例中赋值20,表示的是2秒,即通讯中断2秒后,重新开始连接,在以太网通讯里面,这个超时时间是一定要赋值的,时间的长度建议大于该READ_VAR的触发时间。
RECP是读取过来存放的数组,本例中读取6个字,所有recp1是一个6个整形的数组。
WRITE_VAR和READ_VAR的管脚大致相同,其中EMIS是M580准备写给对方的数组,因为要给对方写6个字,所以emis1也是一个6个整形的数组。
WRITE_VAR的NUM是10,即写对方的40011,对应的是S7 200 SMART的VW20开始的地址。
使用CTU做一个1秒的计数,将结果存放在emis1的个元素里面,在通讯的时候,查看这个变化的值是不是写给s7 200 smart了,来判断通讯是否正常。编写程序如下:
程序编好以后,重新生成所有项目,没有错误以后,将程序下载到CPU,次给M580下载程序,建议使用mini usb的编程电缆。如果没有,使用网线也可以。
同时在线监控M580和S7 200 smart的程序,可以看到,M580将smart 的VW2的值读过来存放在recp1[2],同时M580把emis1[1]的值写给smart的VW20。
4.3M580 使用DTM浏览器配置扫描和S7 200 SMART通讯(对于同一个S7 200 SMART,使用READ_VAR就不能配置扫描,同样,配置了扫描,就不能使用READ_VAR通讯)
在“工具”菜单的“DTM浏览器”中,右键BMEP58_ECPU_EXT,选择“添加”,在弹出的对话框中,选择Modbus Device,添加完成后,在分布式总线下面,会多出一个Modbus_Device的设备,如下图所示:
添加Modbus_Device完成后,双击BMEP58_ECPU_EXT,选择“设备列表”下面的Modbus_Device,在“地址设置”里面将IP设置为S7 200 SMART的IP地址 192.168.10.200。因为S7 200 SMART的IP是在它的软件里面配置好了的,这个“地址服务器”的“此设备的DHCP”需要选择为“已禁用”(默认是已禁用)。设置完成后,点击页面右下角的“应用”按钮。
然后选择“请求设置”,点“添加请求”,就会在表格中出现一条请求配置,连接位1,这个是自动分配的。
单元ID 255,对于直接以太网设备,可以是255,如果是Modbus TCP转485的网关,这个单元ID是 485的从站地址,用于寻址到网关下面的每一个485从站。
超时默认1500ms,当超过1500ms通讯还没成功,就会报错。
重复速率60ms,这个是这条扫描的重复的周期,即60ms重复扫描一次,可以根据实际情况修改。
读取地址,0表示读取从站的40001;
读取长度,4表示读取4个字。
上一个值,指示通讯中断的时候,是保留上一次通讯的值,还是设置为0。
写入地址,10表示写从站的40011;
写入长度,4表示写4个字。
配置完请求的参数后,选择“请求001:项目”,在输入里面,按住电脑的Shift建,将下图中的0—7选择为蓝色,然后点击右边的“定义项目”,在弹出的“项目名称定义”中,数据类型选择INT(这个可以根据实际情况自己定义类型),项目名称也可以修改,本例中选择默认,点击确定。
点“确定”以后,可以看到绿色的方框,16表示16个位的数据。
用相同的方法,把输出也“定义项目”,完成后如下图所示:
配置完成后,点击右下角的应用,确定,然后重新生成所有项目,保证程序没有错误以后,双击“基本变量”,在Device DDT里面,可以看到生成的Modbus_Device这个变量,其中Freshness和Freshness_1是通讯状态变量,它们为1就是通讯正常,为0是通讯错误。Inputs是读取的S7 200 SMART的数据,Outputs是M580写给S7 200 SMART的数据。
在程序中添加一行简单的程序,将CTU的计数结果MOVE到Modbus_Device.Outputs.BLOCKA_QI0,这个值是在通讯的时候写给S7 200 SMART的,方便观察通讯状态。
重新生成所有项目,没有错误以后,将程序下载到M580的CPU,将M580运行起来,在线监控动态数据表的数据,可以看到Modbus_Device.Freshness和Modbus_Device.Freshness_1的值都为1,表示通讯正常,Modbus_Device.Inputs.BLOCKA_II1是读取的S7 200 SMART的VW2的值,同时M580将Modbus_Device.Outputs.BLOCKA_QI0的值写给了S7 200 SMART的VW20。
5.1S7 200 SMART作为MODBUS TCP服务器的时候,是可以支持多个客户端来访问的,前提是需要调用多个MBUS_SERVER的功能块,且IP_Port需要不一样。
5.2Control Expert软件平台下面的施耐德PLC的Modbus TCP的客户端,只能读取服务器的502端口的数据,其他端口的数据读取不到。也就是说,如果2个Control Expert平台下面的施耐德PLC,同时去读写同一个S7 200 SMART是不能通讯成功的。
同理,不要同时使用MODSCAN和M580的PLC去访问S7 200 SMART服务器的502端口。本例中可以M580访问502端口,同时MODSCAN访问503端口。
5.3M580的Modbus TCP的客户端通讯常用的有两种方式:
一种是使用编程的READ_VAR和WRITE_VAR,使用编程方式支持的Modbus功能码更多(如果是05、06功能码,需要使用DATA_EXCH),且通讯的时序可以自己控制,但是对编程能力有要求;
另外一种是在DTM里面配置扫描,它的好处是不用编写程序,配置正确即可,但是它支持的功能码有限制,只能读写MODBUS 的保持寄存器(4X的寄存器),且通讯的时序不容易控制。