☰
S7-1200 PUT/GET通信原理与实战避坑指南
2026/10/28 3:51:18 网站建设 项目流程

简介:本资源是一份面向工业自动化工程师与PLC初学者的西门子S7-1200 PUT/GET通信实战教程,聚焦PROFINET环境下两台S7-1200 PLC间高效、稳定的数据交互问题,覆盖单边通信原理、跨项目组态及Step7 V13 SP1全流程配置。文档以详实图文结合方式,完整呈现同一项目内双站点组态、网络视图中S7连接建立、TSAP地址设置、非优化数据块定义(DB1/DB2各10字节)、PUT/GET指令调用参数配置(含ID号、地址指针、状态监控)及在线调试验证全过程;特别补充了不同项目间通信的关键要点,如伙伴设备设为“未知”、手动指定IP与TSAP 03.00等易错环节。资源为1个4.28MB的Word文档(.doc),结构清晰、步骤可复现,含13张关键界面截图与参数对照表,便于边学边练。目前已有11298人学习下载,是掌握S7-1200基础S7通信能力的高实用性入门资料。

1. 西门子S7-1200 PUT&GET通信到底能干啥?别再被“单边通信”四个字绕晕了

你手头有两台S7-1200——一台V4.1,一台V2.0,网线直连,IP配好了,STEP 7 V13也装上了,可一上电下载完程序,监控里DB1的10个字节就是不动?不是PLC坏了,也不是网线松了,而是你卡在了那个最常被忽略的底层逻辑:S7-1200的S7通信根本不需要服务器端写一行代码,它压根不“监听”,只“等数据”。PUT/GET不是TCP那种双向握手协议,它是典型的单边触发式数据搬运工——客户端调用PUT,就把本地DB某段内存“推”过去;调用GET,就从对方DB某段地址“拉”回来。服务器端唯一要做的,是把DB块建好、属性设对、保护关掉。就这么简单,但90%的翻车都发生在第3步:V4.0+固件默认锁死PUT/GET入口,不手动勾选“允许远程PUT/GET访问”,客户端发一万次REQ,服务器连STATUS都不更新。这篇教程不是教你怎么点菜单,而是带你亲手拆开两个真实场景:同一项目内双站组态(调试快、排错明),和跨项目独立部署(产线真实态、TSAP必须手填)。适合刚拿下TIA Portal基础认证、正接手老产线改造的工程师,也适合被客户临时拉去救火、手边只有V13 SP1和两台裸机的现场支持人员。下面所有操作,我都在CPU 1214C DC/DC/DC V2.0与V4.1实测过,连TSAP填错导致STATUS=16#80C1这种玄学错误都录了波形。

2. 同一项目内双站S7通信:从网络视图到非优化DB块的完整闭环

2.1 项目创建与双站硬件组态:IP地址不是随便填的

打开STEP 7 V13 SP1,新建项目“S7_1200_PutGet_SameProject”。点击“添加新设备”,搜索“CPU 1214C DC/DC/DC”,注意版本筛选:

  • 第一台设备命名为“Client_V41”,选择固件V4.1,IP地址设为192.168.0.10;
  • 第二台设备命名为“Server_V20”,选择固件V2.0,IP地址设为192.168.0.12。

提示:IP必须在同一子网(如255.255.255.0),且不能与电脑网卡冲突。我曾因笔记本WiFi自动获取192.168.0.1导致PLC无法在线,拔网线重试三次才反应过来。

完成添加后,进入“设备视图”,确认两台CPU图标已出现在项目树中。此时不要急着编译——先右键“Client_V41” → “属性” → “以太网接口” → “IPv4地址”,勾选“使用固定IP地址”,输入192.168.0.10;同理配置“Server_V20”为192.168.0.12。这一步必须做,否则网络视图里设备会显示“未分配IP”,后续连接无法建立。

2.2 网络视图中建立S7连接:本地ID和主动连接是核心参数

切换到“网络视图”标签页。左侧工具栏点击“连接”图标(两个重叠的方块),在弹出菜单中选择“S7连接”。此时鼠标变成十字光标,先点击“Client_V41”的CPU图标,松开后右键 → “添加新连接”。在“创建新连接”对话框中:

  • “连接对象”下拉选择“Server_V20”;
  • “连接类型”保持默认“S7连接”;
  • 勾选“主动建立连接”(这是客户端行为的关键标志);
  • 点击“确定”。

连接线生成后,在中间“连接”列表中会出现“S7_连接_1”。双击它打开属性窗口,重点核对三处:

  1. 常规 → 连接伙伴:显示“Server_V20”,IP为192.168.0.12;
  2. 本地ID:值为W#16#100(十六进制100,即十进制256),这个值必须与后续PUT/GET指令中的ID参数完全一致;
  3. 特殊连接属性 → 主动建立连接:必须为“是”。

注意:此处无需修改TSAP。S7-1200作为服务器时,TSAP由固件预设为03.00(GET)和03.01(PUT),客户端自动匹配,强行改反而断连。

2.3 数据块创建与非优化访问:为什么DB块必须“去优化”?

在“Client_V41”和“Server_V20”各自的程序块文件夹下,分别新建数据块:

  • Client侧:新建DB1(名称任意,但建议统一),打开后点击“属性” → 取消勾选“优化的块访问”;
  • Server侧:同样新建DB1和DB2,全部取消“优化的块访问”。

在DB1中定义变量:

SendData : ARRAY[0..9] OF BYTE; // 10字节发送区 RecvData : ARRAY[0..9] OF BYTE; // 10字节接收区

DB2同理(用于反向读取)。

提示:“非优化块访问”是硬性要求。S7通信指令通过绝对地址访问DB,而优化访问会打乱变量内存布局,导致ADDR_1参数指向错误位置。我曾因漏掉此步,PUT发送后Server端DB1前5字节全为0,STATUS=16#80C2(地址错误),查了2小时才想起看DB属性。

2.4 OB1中PUT/GET指令调用:参数填错一个,STATUS就报红

在“Client_V41”的OB1中插入指令:

  • 从“指令” → “通信” → “S7通信”拖入“PUT”和“GET”功能块;
  • 为PUT分配背景DB:右键PUT块 → “指定背景数据块” → 新建DB3;
  • 为GET分配背景DB:右键GET块 → “指定背景数据块” → 新建DB4。

PUT参数设置(关键字段加粗):

CALL "PUT", %DB3 REQ := %M0.0 // 上升沿触发,建议用M0.0经TON延时后触发,避免首次扫描误发 ID := W#16#100 // 必须与网络视图中S7连接的本地ID一致 DONE := %M0.5 // 发送完成标志 ERROR := %M0.6 // 故障标志 STATUS := %MW10 // 状态字,监控用 ADDR_1 := P#DB1.DBX0.0 BYTE 10 // **服务器端接收地址**,即Server的DB1起始位置 SD_1 := P#DB1.DBX0.0 BYTE 10 // **客户端本地发送地址**,即Client的DB1起始位置

GET参数设置:

CALL "GET", %DB4 REQ := %M1.0 // 上升沿触发,与PUT错开扫描周期 ID := W#16#100 // 同样必须一致 NDR := %M1.5 // 新数据接收标志 ERROR := %M1.6 // 故障标志 STATUS := %MW12 // 状态字 ADDR_1 := P#DB2.DBX0.0 BYTE 10 // **服务器端发送地址**,即Server的DB2起始位置 RD_1 := P#DB2.DBX0.0 BYTE 10 // **客户端本地接收地址**,即Client的DB2起始位置

逻辑说明:ADDR_1永远指向通信伙伴的DB地址,SD_1/RD_1永远指向本机DB地址。填反是新手最高频错误,现象是STATUS=16#80C1(伙伴地址无效),但PLC不报错,只能靠状态字排查。

2.5 服务器端零编程验证:只需检查DB块和保护设置

“Server_V20”侧无需任何OB1编程。但必须完成两项检查:

  1. DB块存在且非优化:确保DB1(接收区)和DB2(发送区)已创建,属性中“优化的块访问”未勾选;
  2. 通信保护开放:右键“Server_V20” → “属性” → “常规” → “保护” → “连接机制”,勾选“允许从远程伙伴使用PUT/GET通信访问”。

注意:V2.0固件无此选项,V4.0+固件默认关闭。若未勾选,客户端PUT/GET始终返回ERROR=1,STATUS=16#80C3(访问被拒绝)。这是产线调试中最隐蔽的坑——界面一切正常,唯独数据不走。

3. 跨项目S7通信:当两台PLC分属不同工程时的TSAP与IP硬编码

3.1 独立项目创建与网络配置差异:为什么“未知站点”是必选项

场景还原:Client在A项目中开发完成,Server在B项目中单独调试,现场需直接对接。此时无法在同一个网络视图中看到对方设备。

在Client项目(A项目)中:

  • 组态“Client_V41”并配置IP192.168.0.10;
  • 进入“网络视图”,添加S7连接时,“连接对象”下拉菜单中没有Server设备,必须选择“未知”。

创建连接后,在“S7_连接_1”属性中:

  • 常规 → 站点:显示“未知”;
  • 地址:手动输入Server的IP192.168.0.12;
  • 本地ID:仍为W#16#100;
  • 地址详细信息 → TSAP:此处必须手动填写!

关键参数:S7-1200服务器预设TSAP为03.00(GET)和03.01(PUT)。若Client用GET读取Server数据,TSAP必须填03.00;若用PUT发送,TSAP必须填03.01。填错直接导致STATUS=16#80C1。

3.2 TSAP填错的三种典型现象与定位方法

现象STATUS值原因解决方案
GET指令NDR始终为0,RD_1无数据16#80C1TSAP填成03.01(应为03.00)进入连接属性→地址详细信息→修改TSAP为03.00
PUT指令DONE为0,ERROR为116#80C1TSAP填成03.00(应为03.01)修改TSAP为03.01
连接状态显示“未建立”,但IP能ping通16#80C3Server端未勾选PUT/GET访问权限(V4.0+固件)进入Server设备属性→保护→勾选对应选项

血泪经验:TSAP不是“端口号”,它是S7协议中标识服务类型的标识符。03.00专指S7通信的GET服务,03.01专指PUT服务,不可互换。我曾用Wireshark抓包验证,填错TSAP时PLC根本不发S7通信帧,只发ARP请求。

3.3 跨项目数据块同步:为什么Server端DB变量名必须与Client ADDR_1地址严格对应

Client侧PUT指令中:

ADDR_1 := P#DB1.DBX0.0 BYTE 10 // 指向Server的DB1.DBX0.0

这意味着Server端必须存在名为“DB1”的数据块,且其起始地址DBX0.0必须是10字节连续空间。但变量名可以不同——例如Server DB1中定义:

IncomingBuffer : ARRAY[0..9] OF BYTE;

只要该变量占据DBX0.0~DBX0.9,PUT就能正确写入。

验证技巧:在Server项目中,打开DB1的“监视表”,添加地址DB1.DBX0.0,长度10字节。运行Client PUT后,此处应实时更新。若不变,优先检查TSAP和保护设置,而非变量名。

3.4 跨项目下载与在线诊断:如何确认连接已激活

Client项目下载后:

  • 在“网络视图”中,S7连接旁应显示绿色“√”(在线);
  • 若显示黄色“!”,右键连接 → “显示连接状态”,查看“连接状态”是否为“已建立”;
  • 若为“未建立”,点击“诊断”按钮,查看错误代码。

排查口诀:“先Ping,再看连接状态,最后查STATUS”。Ping通证明物理层OK;连接状态OK证明S7连接配置OK;STATUS非零则聚焦PUT/GET参数。

4. S7通信避坑指南:五个让老手也拍桌的致命细节

4.1 现象:PUT发送后Server端DB1数据全为0,但STATUS=16#0000(成功)

原因:Client侧SD_1地址指向了空DB或未初始化区域。例如SD_1填了P#DB5.DBX0.0 BYTE 10,但DB5未创建或未下载。
解决:在Client项目中打开DB5监视表,确认DBX0.0起始10字节有有效数据。若为空,改用已初始化的DB1。

4.2 现象:GET指令NDR为1,但RD_1数据与Server端DB2不一致

原因:Client侧RD_1地址与Server端ADDR_1地址长度不匹配。例如Server ADDR_1为P#DB2.DBX0.0 BYTE 5,Client RD_1却为P#DB2.DBX0.0 BYTE 10。
解决:严格保证GET指令中ADDR_1与RD_1的BYTE长度一致。长度不一致时,STATUS可能为0但数据错位。

4.3 现象:同一项目内通信正常,跨项目后STATUS=16#80C3(访问拒绝)

原因:Server端固件为V4.0+,但“允许远程PUT/GET访问”未勾选。注意:此选项在Server项目中配置,Client项目下载不影响Server设置。
解决:登录Server PLC所在项目 → 设备组态 → 右键Server CPU → 属性 → 保护 → 勾选对应选项 →重新下载Server项目。

4.4 现象:Client侧M0.0触发REQ后,DONE始终为0,ERROR为0,STATUS=16#0000

原因:REQ信号未满足“上升沿”要求。PUT/GET指令需检测REQ从0→1的跳变,若M0.0持续为1(如直接接常开触点),指令不执行。
解决:用TON定时器或SR触发器生成单次脉冲。例如:

TON_Timer(IN:=M0.0, PT:=T#100ms); REQ_Pulse := TON_Timer.Q; // 仅在M0.0接通100ms后输出一个扫描周期脉冲

4.5 现象:两台PLC IP能Ping通,网络视图连接状态为“已建立”,但PUT/GET无响应

原因:Client与Server的子网掩码不一致。例如Client设255.255.255.0,Server设255.255.0.0,虽能Ping通,但S7协议帧被丢弃。
解决:统一子网掩码。在两台PLC的“以太网接口”属性中,将IPv4子网掩码均设为255.255.255.0。

5. PUT/GET状态字深度解析:用STATUS码快速定位90%的通信故障

5.1 STATUS核心码表与实战解读

S7通信的状态字(STATUS)是16位WORD,高字节为错误类,低字节为子状态。以下是最常遇到的6个码:

STATUS(HEX)十进制含义典型场景排查动作
16#00000无错误正常运行—
16#80C132961地址错误(伙伴地址无效)TSAP填错、ADDR_1指向不存在DB检查TSAP、Server DB是否存在、ADDR_1地址格式
16#80C232962地址错误(本地地址无效)SD_1/RD_1指向未创建DB或越界检查Client DB是否存在、SD_1/RD_1地址范围
16#80C332963访问被拒绝Server端未开放PUT/GET权限(V4.0+)进入Server设备属性→保护→勾选
16#80C432964连接未建立网络视图连接状态为“未建立”检查IP、子网掩码、物理连接、防火墙
16#80C532965连接已关闭Server重启或断电重启Client程序或等待自动重连

提示:STATUS=16#0000不代表数据一定正确,只是协议层无错误。务必结合NDR/DONE和实际数据比对。

5.2 实时监控STATUS的两种高效方法

方法一:在监控表中直接添加STATUS变量

  • 打开Client项目的“监控表”;
  • 添加变量DB3.STATUS(PUT)和DB4.STATUS(GET);
  • 设置格式为“十六进制”,长度“字”;
  • 下载后在线监控,故障时立即显示错误码。

方法二:用MOVE指令转为整数便于HMI显示

MOVE IN:=DB3.STATUS, OUT:=MW100; // MW100显示十进制状态值

在HMI画面中绑定MW100,运维人员一眼可见错误类型(如32963=访问拒绝)。

5.3 STATUS=16#80C1的逐级排查流程图(文字版)

  1. 第一层:确认TSAP

    • Client连接属性→地址详细信息→TSAP是否为03.00(GET)或03.01(PUT)?
    • 是 → 进入第二层;否 → 修改后重新下载。
  2. 第二层:确认Server DB存在性

    • 登录Server项目→检查DB1/DB2是否创建?是否下载?
    • 是 → 进入第三层;否 → 创建并下载。
  3. 第三层:确认Server DB地址有效性

    • Server项目中打开DB1→查看DBX0.0是否为有效变量起点?
    • 是 → 进入第四层;否 → 调整ADDR_1指向有效地址(如DBX2.0)。
  4. 第四层:确认Server固件版本与权限

    • Server设备属性→常规→固件版本≥V4.0?是→检查“保护”中PUT/GET权限是否开启。

从那以后我每次配置跨项目S7通信,都强制走一遍这个四步排查:TSAP→DB存在→DB地址→权限开关。少走一次,现场多耗两小时。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询