目录
- 一、TCP/IP协议是什么?
- 二、协议报文规则
- 三、PLC配置基本要求
- [四、TCP Socket (TSEND_C、TRCV_C)](#四、TCP Socket (TSEND_C、TRCV_C))
-
- [1)PLC作为TCP Server与Client用户通讯](#1)PLC作为TCP Server与Client用户通讯)
- [2)PLC作为TCP Client与Server服务通讯](#2)PLC作为TCP Client与Server服务通讯)
- [五、Mobus TCP(MB_Client、MB_Server)](#五、Mobus TCP(MB_Client、MB_Server))
-
- [1)PLC作为MD TCP Server与Client服务通讯](#1)PLC作为MD TCP Server与Client服务通讯)
- [2)PLC作为MD TCP Client与Server服务通讯](#2)PLC作为MD TCP Client与Server服务通讯)
- 六、MODBUS通讯软件
- 七、扩展
一、TCP/IP协议是什么?
- TCP/IP协议包括TCP、IP、UDP、ICMP、RIP、TELNET、FTP、SMTP、ARP、TFTP等许多协议...
应用场景:
- 当PLC需要建立 TCP 或 ISO-on-TCP 通信连接时应用TSEND_C、TRCV_C指令。连接后,CPU 会自动保持和监视该连接
二、协议报文规则
Modbus TCP = Modbus-RTU 去掉 CRC 校验 + 新增 7 字节 MBAP 报文头,核心功能码 / 数据区完全复用
对应同一个读保持寄存器的RTU 报文
RTU:01 03 00 00 00 01 84 0A = 地址 功能码 起始地址 读取个数 CRC校验
对应同一个读保持寄存器的TCP 报文
TCP:00 01 00 00 00 06 01 03 00 00 00 01 = MBAP 报文头 + PDU
- MBAP Header = Transaction ID + Protocol ID + Length + Unit ID
- PDU = Function Code + Data
PDU:03 00 00 00 01(和 RTU 的功能码 + 数据区完全一样)
MBAP报文头释义
三、PLC配置基本要求
PLC的CPU属性设置
- 设备组态------防护与安全------(访问级别<完全访问>、连接机制<勾选允许PG/PC>)
- 项目------属性------保护<块编译时支持仿真>
- 通讯块程序建议写在循环中断块中(OB30...38),缩短PLC循环时间,降低PLC通讯负载

四、TCP Socket (TSEND_C、TRCV_C)
1)PLC作为TCP Server与Client用户通讯
- 做Server时:Server需要设置一个固定的端口号,等待Client的连接请求(主动连接)。用户伙伴Client的IP和端口号(为空:允许任意端口连接)


Server特点:- 一个Server对应一个Client;多个Client请求编写多个Server块(ID、端口口不能重复)
2)PLC作为TCP Client与Server服务通讯
- 做Client时:Client需要设置Server的IP地址和端口号。自身的端口号通常由设备自动分配(PLC主动连接)


注意事项
- 使用仿真必须为高级仿真S7-PLCSIM Advanced,一般仿真S7-PLC-SIM不支持TCP仿真。见-仿真步骤
- 当PLC做Server时,Client不需要填写IP、端口号(为空意为可以任意连接)为主动连接
- 当PLC做Client时为主动连接,指定Server的IP、端口号即可
- 指令TSEND_C的引脚REQ上升沿为发送数据,引脚CONT写1为建立连接(0为不发送数据)
- 指令TRCV引脚ADHOC=1(TCP协议)
虚拟机拟机如何与主机建立TCP连接?
- 设置虚拟网卡模式为------NAT模式
- 设置主机网卡(NAT模式VMnet8)与虚拟机网卡在------同一网段;
- 网卡VMnet8属性安装-安装-服务-VMware Bridge Protocol
- 开启虚拟机TCP Server
- 打开主机TCP Client测试连接
仿真教程、工具等---见-资源
五、Mobus TCP(MB_Client、MB_Server)
TCP与Modbus TCP的区别?
- MODBUS TCP是一种专为工业自动化设计的通信协议,具有特定的报文格式和校验机制。
- TCP 则是一种更加通用的网络服务,可以支持各种应用层协议和数据格式,不局限于特定的报文结构或校验方式,透明传输。
应用场景:
- 标准MODBUS TCP通讯(包括PLC之间的通讯连接)
1)PLC作为MD TCP Server与Client服务通讯
【1】PLC作为Server端,发布内容,测试第三方Client能否收到
- 调用 MB_SERVER(不同版本对应的功能不同V4、V5...)
- CONNECT 引脚的指针类型(TCON_IP_v4 是"系统数据类型",直接在数据类型中键入)
- MB_HOLD_REG 引脚填写传输变量(03保持寄存器)
- 错误码80B7:本地端口号需设置(502)
- 错误码80C8:ID设置重复

| 参数 | 说明 |
|---|---|
| DISCONNET | 0(默认):被动建立与客户端的通信连接;1:终止连接。 |
| MB_HOLD_REG | 指向 Modbus 保持寄存器的数据区。03功能码 |
| CONNECT | 指向连接描述结构的指针。使用 TCON_IP_v4 数据类型。 |
| PLC地址区 | 定义 | MODBUS映射 |
|---|---|---|
| 输出位 | Q0.0 开始 | • 1:过程映像输出(与功能代码 1、5 和 15 一起使用)0x00001... |
| 输入位 | I0.0 开始 | • 2:过程映像输入(与功能代码 2 一起使用)1x10001... |
| 输入寄存器 | IW0 开始 | • 4:输入寄存器(与功能代码 4 一起使用) 3x30001... |
| 保持寄存器 | 由 MB_HOLD_REG 定义 | • 3:保持寄存器(与功能代码 3、6 和 16 一起使用) 4x40001... |
S7-1200 Modbus TCP 通信服务器指令块 MB_SERVER
【2】多个客户端连接,需要编写多个Server块;要求ID、本地端口号不能重复

2)PLC作为MD TCP Client与Server服务通讯
S7-1500 集成 PN 口的 MODBUS TCP 通信
PLC作为Client端,连接第三方Server
- ReQ:true(建立连接)
- MB_Mode:0-读取、1-写入(对应MODBUS 功能码,见下图)
S7-1200 Modbus TCP 通信客户端指令块 MB_CLIENT
【通讯连接】
- 新建数据块,设定一个 TCON_IP _V4 的变量
- 变量的 ADDR RePort 即为设备的IP 端口号
- 将变量连接至 MB_Client 的 CONNET 引脚
- 打开MODBUS Poll Slave 的 Connetion 设置电脑网卡为 Server IP
- 配置读取列表 40001、个数 对应 MB_Client 的通讯地址 40001





【数据解析】
- 读写14个数据进行参数接口封装,映射至 WR_MB_DATA_PTR
bash
#RawWrite[0] := UINT_TO_WORD(REAL_TO_UINT(#TempReal * 10.0));
#RawWrite[1] := UINT_TO_WORD(REAL_TO_UINT(#TempReal * 10.0));
#RawWrite[2] := UINT_TO_WORD(#HV_mA);
#RawWrite[3] := UINT_TO_WORD(REAL_TO_UINT(#TempReal * 10.0));
#RawWrite[4] := UINT_TO_WORD(REAL_TO_UINT(#TempReal * 10.0));
#RawWrite[5] := W#16#0000;
#RawWrite[6] := W#16#0000;
#RawWrite[7] := W#16#0000;
#RawWrite[8] := W#16#0000;
#RawWrite[9] := W#16#0000;
#RawWrite[10] := W#16#0000;
IF #Start THEN
#RawWrite[11] := W#16#0001;
ELSE
#RawWrite[11] := W#16#0000;
END_IF;
IF #ExtTrigger THEN
#RawWrite[12] := W#16#0001;
ELSE
#RawWrite[12] := W#16#0000;
END_IF;
//只检查复位的上升沿,并在延时500ms后自动复位
//检测复位上升沿并锁存
//对PLC扫描周期的理解
IF #FaultReset AND NOT #LastFaultReset THEN
#ResetLatch := TRUE;
END_IF;
#LastFaultReset := #FaultReset;
#ResetTimer(IN := #ResetLatch,
PT := T#500MS);
IF #ResetTimer.Q THEN
#FaultReset := #ResetLatch := FALSE;
END_IF;
IF #ResetLatch THEN
#RawWrite[13] := W#16#0001;
ELSE
#RawWrite[13] := W#16#0000;
END_IF;
//故障正在复位中
#FauReset_Ing := #ResetLatch;
- 只读9个数据 RD_MB_DATA_PTR 映射至参数接口,对只读数据进行参数接口封装
bash
#Filament_V := UINT_TO_REAL(WORD_TO_UINT(#RawRead[0])) / 10.0;
#Filament_A := UINT_TO_REAL(WORD_TO_UINT(#RawRead[1])) / 10.0;
#HV_kV := UINT_TO_REAL(WORD_TO_UINT(#RawRead[2])) / 10.0;
#HV_mA := WORD_TO_UINT(#RawRead[3]);
#HVInvTemp_C := WORD_TO_UINT(#RawRead[4]);
#FaultWord := #RawRead[6];
#Power_W := WORD_TO_UINT(#RawRead[7]);
#WorkState := WORD_TO_UINT(#RawRead[8]);


-
Connect连接参数
- InterfaceID :硬件标识默认常用=64 < 网口属性-见下图 >
- 如果指定端口 1/端口 2,会看到 65/66,一般用接口本体 64
- ID :连接ID默认常用=1 <不要两个 MB_CLIENT 共用同一个 ID>
- 同一个 CPU 里,每一条 TCP 连接用不同 ID,比如第 1 台设备用 1,第 2 台设备用 2。
- ConnectionType: 通讯类型0B<TCP类型>
- ActiveEstablished:客户端为主动连接=1
- RemoteAddress 、Port:填写设备的IP、端口号
- 标准 Modbus TCP 是 502;具体以通讯手册为准
- LocalPort
- 一般填 0,让 PLC 自动分配。只有特殊防火墙/固定端口需求时才手动设。
InterfaceId = 从 PLC 哪个网口出去
ID = PLC 内部这条连接的编号
RemoteAddress = 连谁
RemotePort = 连对方哪个服务端口
LocalPort = PLC 自己用哪个本地端口,通常自动
单台设备最常见配置:
InterfaceId := 64
ID := 1
ConnectionType := 11
ActiveEstablished:= TRUE
RemoteAddress := 设备IP
RemotePort := 502 或厂家指定端口
LocalPort := 0
- InterfaceID :硬件标识默认常用=64 < 网口属性-见下图 >

总结:
Client特点
- Client按照03读取(可读取多个);04写入(一次只能写一个);可用123(又读又写)
- 对于多个Client读取同一个IP不同端口的Server,同一变量只能一个Client有效控制
- 对于单一客户端读取或写入连接方便,涉及多个客户端变量的读写费劲!
六、MODBUS通讯软件
(虚拟串口、MODBUS Slave/Poll绝活哥)使用说明
1)虚拟串口
------Virtual Serial Port Driver 7.2**

2)调试软件
------MODBUS Slave/Poll
- connection:设置连接协议(COM3-COM4)
- Setup:设置连接参数(从站地址、功能码、地址)
- Display:查看传输报文(TX---发送、RX---接收)


七、扩展
网关转换逻辑理解:
-
如果用 RTU 转 TCP 网关,网关会自动做两件事(串口转网口的逻辑):
- 收到 TCP 报文:去掉 7 字节 MBAP 头,加上 2 字节 CRC,转发给串口从站
- 收到 RTU 报文:去掉 2 字节 CRC,加上 7 字节 MBAP 头,转发给 TCP 主站
-
MOXA串口服务服务器可以说它是网关吗?
- 如果是TCP Socket 应用,那它只是透明传输,只负责数据的转发、发啥传啥,不做转换,所以需要写对应的RTU报文
- 如果是RTU转TCP等应用,那它就是负责协议转换,可以说是网关。
TCP 支持多个主站同时连接同一个从站,而 RTU 只能单主,这是 TCP 最大的优势之一。区别在于外层通讯封装:
RS485 / Modbus-RTU
- 从站地址 + 功能码 + 起始地址 + 数量/数据 + CRC16校验
LAN / Modbus-TCP
- MBAP头 + 功能码 + 起始地址 + 数量/数据


