前言
本系列是关于PLC相关的博文,包括PLC编程、PLC与上位机通讯、PLC与下位驱动、仪器仪表等通讯、PLC指令解析等相关内容。
PLC品牌包括但不限于西门子、三菱等国外品牌,汇川、信捷等国内品牌。
除了PLC为主要内容外,PLC相关元器件如触摸屏(HMI)、交换机等工控产品,如果有值得记录的内容,也会添加进来。
环境配置
系统:windows10
平台:visual studio code
软件:TIA V18(博图)
硬件:S7 1214C DC/DC/DC
固件版本:V4.6
编程语言:javascript、梯形图
概述
本文介绍在西门子1200系列PLC中,如何实现modbusTCP通讯?
1、modbusTCP参数
本文以PLC作为modbusTCP服务器为例,在西门子博图(V18)软件中,我们创建一个新项目,选择PLC型号为1214C,然后新建一个FC块。
西门子编程软件提供了用于modbusTCP通讯的系统块:MB_SERVER
,我们可以在指令导航栏中找到它:
如图,PLC既可以使用MB_CLIENT
作为modbustcp客户端,也可以使用MB_SERVER
作为服务端。
本例是作为服务端,所以我们使用MB_SERVER,这是官方提供的FB块,使用SCL编写,但我们无法看到源代码。
我们来看一下需要设置哪些参数?
1、DISCONNECT:bool
,用于断开已经连接的modbusTCP连接。
2、MB_HOLD_REG:VARIANT
,保持寄存器缓存区,可以用于读写。
在modbus协议中,我们可以使用功能码来实现不同类型数据区的读写,如03可以读取保持寄存器,06写入保持寄存器,01读取线圈,05写入线圈,等等
此处,我们可以创建一个数组,数组元素可以是字节(Byte),也可以是字(Word),不过,通常modbus的寄存器都是按照字来划分的,所以,本例中,我们创建一个长度为30的字数组:
数组的长度依照实际需要来即可。此处数组的最大长度,通常取决于通讯双方控制器的性能和限制。
3、CONNECT:VARIANT
,此处connect参数是一个结构体,用于设置连接相关的参数,其具体类型可设置如下:
本例中,我们使用的是第一种类型TCON_IP_v4
,其内部结构如下:
我们需要特别注意CONNECT的参数:
1、interfaceid:HW_ANY
,即硬件标识符,在西门子PLC中,用于标识已经组态的硬件,此处,我们可以去查找已经组态的PLC模块:
如上图,本例中,硬件标识符的值为64(10进制),也可以写成16进制,即16#40。
2、ID:CONN_OUC
,用于标识已经创建的连接,需要注意,ID的值不能重复。本例设置为2。
3、ConnectionType:Byte
,表示连接的类型,TCP类型的值为11。modbusTCP也属于TCP连接,因此本例中设置为11。
4、ActiveEstablished:bool
,表示连接如何建立,本例中,PLC作为服务器,属于被动连接(即等待客户端主动连接),所以设置为false。
5、RemoteAddress:ARRAY [1..4] of BYTE
,用于设置远程设备的IP地址,如果不需要与特定设备连接,可以设置为“0.0.0.0”,否则,设置为远程设备的特定IP,如本例中设置为:192.168.0.250
。
6、RemotePort:UINT
,远程设备端口号,由于PLC是作为服务端,因此可以不用特别设置,当然如果有固定端口,设置为实际使用即可,如果运行任何端口连接,设置为0。
7、LocalPort:UINT
,本地端口,即PLC作为服务器端的端口号,默认为502,如果要修改,取值范围为:1-49151,但是要注意不要与网络中其他设备的端口号冲突。
再看下状态参数:
1、NDR:bool
,表示是否有新数据写入
2、DR:bool
,表示正在读取数据
3、ERROR:bool
,表示调用指令出错
4、STATUS:WORD
,表示指令的详细状态信息,具体如下:
注意:切记要设置CONNECT参数中的几个关键参数:
interfaceid、ID、RemoteAddress、LocalPort
注意2:如果你忘记了设置interfaceid,也就是硬件标识符,运行后,指令会报错,代码是809B,但是你如果看status,会发现并没有这个错误码。
事实上,这个错误代码,是在TCON这个指令中:
因为modbusTCP的连接属于TCP连接的一种,其内部建立连接的过程与TCON是一致的。