PLC编程—TCP通讯

目录


一、TCP/IP协议是什么?

  • TCP/IP协议包括TCP、IP、UDP、ICMP、RIP、TELNET、FTP、SMTP、ARP、TFTP等许多协议...

应用场景:

  • 当PLC需要建立 TCP 或 ISO-on-TCP 通信连接时应用TSEND_C、TRCV_C指令。连接后,CPU 会自动保持和监视该连接

TCP, TCP/IP, HTTP有什么区别

网络基础知识


二、协议报文规则

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通讯负载

SIMTIC NET


开放式用户通信

四、TCP Socket (TSEND_C、TRCV_C)

S7-1500 CPU之间TCP通讯组态

S7-1200 与调试助手 TCP 通信

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

S7-1200集成PN接口MODBUS TCP通信概述

【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


【通讯连接】

  1. 新建数据块,设定一个 TCON_IP _V4 的变量
  2. 变量的 ADDR RePort 即为设备的IP 端口号
  3. 将变量连接至 MB_Client 的 CONNET 引脚
  4. 打开MODBUS Poll Slave 的 Connetion 设置电脑网卡为 Server IP
  5. 配置读取列表 40001、个数 对应 MB_Client 的通讯地址 40001


数据解析

  1. 读写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;
  1. 只读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]);

符合 TCON_IP_v4 的连接描述结构

  • 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

S7-1200集成PN接口MODBUS TCP通信概述

总结:

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头 + 功能码 + 起始地址 + 数量/数据