
干了这么多年工控我最大的感受是西门子S7-1200的梯形图、SCL那些编程逻辑大家学起来都挺快真正容易卡壳的是通讯。Modbus RTU、Modbus TCP、PROFINET、S7协议、自由口再加上各种第三方设备——变频器、机器人、上位机、DCS——光是协议名就能劝退一批人。我整理这篇S7-1200通讯与案例大全就是想把这些年踩过的坑、验证过的配置方案、排查思路一次性讲明白让正在做项目或者准备入手的同行少走弯路。这篇内容不搞虚的全部围绕S7-1200的通讯展开从通讯方式怎么选到Modbus RTU/TCP怎么配再到和ABB变频器、三菱D700、施耐德ATV930、S7-200 SMART、C#上位机这些设备怎么对接最后是故障排查实录。不管你是刚摸PLC的新手还是被通讯问题折磨的调试工程师都能在这里找到可以直接抄作业的方案。1. 通讯选型的底层逻辑动手之前先想清楚用哪种方式1.1 S7-1200的通讯家底自带接口和扩展模块一览S7-1200和S7-200 SMART最大的区别之一就是通讯能力。S7-1200的CPU本体上集成了一个PROFINET以太网口这个网口是它的通讯核心。通过这个口你可以实现S7协议通讯、Modbus TCP、PROFINET IO、开放式TCP/UDP通讯、Web服务器访问等等。如果项目需要走串口那就得靠扩展模块。常用的有CM1241 RS232和CM1241 RS485两种通讯模块。这里有个点很多人容易忽略S7-1200本体不带RS485接口别想着直接在CPU上找个A/B端子来用。CB1241是RS485的通信板可以插在CPU前面但只支持RS485CM1241则是信号模块插在CPU左侧有RS232和RS485两种型号订货号分别是6GK7241-1AH30RS232和6GK7241-1CH30RS485。我列个表把常见通讯组合整理出来方便你们对应自己的项目场景选型通讯需求硬件配置适用协议典型应用以太网通讯CPU本体PROFINET口S7协议、Modbus TCP、PROFINET IO、TCP/UDP自由口上位机、触摸屏、远程IO、第三方以太网设备RS485串口CM1241 RS485或CB1241 RS485通信板Modbus RTU、自由口协议变频器、智能仪表、扫码枪、老式设备RS232串口CM1241 RS232Modbus RTU点对点、自由口协议老款仪表、打印机、部分称重仪表PROFIBUS需加CM1243-5模块PROFIBUS DP老旧PROFIBUS设备接入这里多提一句S7-1200不支持PROFIBUS除非你外挂CM1243-5通讯模块。很多从S7-300转过来的工程师会在这里犯迷糊以为S7-1200和S7-300一样有PROFIBUS口实际上完全不是一回事。项目方案阶段就把这个确认清楚后面能省很多麻烦。1.2 按场景选协议不是越高级越好而是越匹配越好通讯协议不存在“哪个最好”只看“哪个最合适”。我的选型思路一般是这样如果通讯对象是西门子自家的东西——比如S7-1200和S7-1500之间、S7-1200和WinCC之间、S7-1200和KTP触摸屏之间——优先用S7协议。这个协议是西门子原生协议数据读写效率高TIA Portal里配置也最方便不需要额外组态什么功能码。如果对象是第三方设备比如施耐德变频器、ABB变频器、国产仪表、温控器那就看对方支持什么。绝大多数第三方设备都支持Modbus RTU或Modbus TCP。串口场景走Modbus RTU以太网场景走Modbus TCP。如果对实时性要求极高比如运动控制、伺服驱动器、高速IO刷新那就走PROFINET IO。S7-1200可以组态为PROFINET IO控制器带远程IO站或者PROFINET伺服驱动器比如和西门子V90伺服配合就是走这个。还有一类比较特殊那些没有标准协议、只有自定义报文的设备比如某些扫码枪、试验机、老式仪表这种情况只能用自由口通讯。S7-1200的串口支持自由口模式你可以自己拼报文、自己解析响应相当于用代码和对方“对暗号”。1.3 新手最容易踩的三个选型误区第一个误区以为Modbus TCP比Modbus RTU快很多。实际上在小数据量场景下两者差距没有那么夸张。Modbus TCP的优势在于布线简单、不用转接、可以和上位机共用网络而不是单纯的速度。如果现场只有一对双绞线从PLC拉到变频器RS485Modbus RTU完全够用没必要非要换以太网。第二个误区不知道S7-1200的PROFINET口可以复用。有些人以为这个口只能做PROFINET IO其实它同时可以跑S7协议、Modbus TCP、TCP/UDP自由口和PROFINET IO。也就是说你既可以用这个口和上位机通讯又可以和远程IO站通讯只要合理规划连接资源就行。S7-1200的连接资源数根据CPU型号不同一般是16到30个左右别小看这个数字一个设备占用一个连接算的时候要留余量。第三个误区串口协议随便选。Modbus RTU和自由口虽然都走RS485但实现难度完全不是一个量级。Modbus RTU有标准的报文格式和CRC校验程序块直接调用就行自由口要自己处理报文、校验、超时、重发工作量大多了。选型的时候如果能用Modbus RTU让对方兼容就别去碰自由口。2. 核心通讯协议实操从配置到代码一步步来2.1 Modbus RTU实战从硬件接线到指令块调通Modbus RTU是工控现场最常见的通讯协议之一在S7-1200上实现它需要两样东西一个RS485通讯模块以及TIA Portal里的Modbus RTU指令库。先说硬件接线。CM1241 RS485模块的接线端子有A和B-对应RS485的D和D-。这里要特别注意不同品牌的设备对A/B的标注可能不同有的标A正B负有的标D和D-实际连接时要以设备说明书为准。如果接反了现象通常是能收到数据但全是乱码或者压根收不到响应。软件配置方面在TIA Portal里调用Modbus RTU需要先调用Modbus_Comm_Load指令来初始化串口参数。这个指令的参数比较多关键的有几个PORT填硬件标识符比如CM1241 RS485模块的硬件ID必须在PLC变量表里手动添加才能选到。这个坑很多人踩过——不先添加硬件标识符的话下拉列表里是空的。BAUD波特率要和从站设备一致。常见的有9600、19200、38400。如果现场有长距离传输或者干扰大建议别用太高波特率9600最稳。PARITY校验位。常用的有NONE、EVEN、ODD。需要和下位机设置一致不一致会导致数据错误。RESP_TO响应超时时间单位毫秒。如果通讯距离远或从站响应慢需要适当增大默认值100ms在某些场合不够用。初始化完成之后调用Modbus_Master指令读写数据。这里要理解Modbus的地址映射关系非常关键。Modbus地址分成几个区00001到09999是线圈输出10001到19999是离散输入30001到39999是输入寄存器40001到49999是保持寄存器。在Modbus_Master指令里MODE参数决定读还是写DB_ADDR和DATA_ADDR决定数据地址而这些东西和具体的设备寄存器表要对应起来。举个例子ABB ACS580变频器的运行频率设定地址一般是40001保持寄存器状态字是40002实际频率是40003。用Modbus_Master去写40001MODE填1写单个保持寄存器DATA_ADDR填40001数据区填目标频率乘以10或100取决于设备的分辨率。很多新手不知道频率要乘以倍率比如设定50.00Hz寄存器里存的是5000需要程序里做乘除换算。实操中还有两个容易忽略的点。第一Modbus_Master的DONE和ERROR引脚要用边沿触发去捕捉最好在调用的时候配合一个定时脉冲。第二多个从站的时候每个从站轮询间隔要留够不能一个接一个地憋着发现场从站响应速度不一样容易导致超时。2.2 Modbus TCP通讯MB_CLIENT和MB_SERVER的配置套路Modbus TCP和Modbus RTU最大的区别就是传输层RTU跑在串口上TCP跑在以太网上。S7-1200实现Modbus TCP用的是MB_CLIENT和MB_SERVER两个指令。MB_CLIENT作为客户端主动去连接远端的Modbus TCP服务器。CONNECT参数是关键它是一个TCON_IP_v4类型的结构体里面要填远端设备的IP地址、端口号默认502、连接ID。很多人在这里卡住是因为不知道要先在PLC数据类型里创建一个TCON_IP_v4类型的变量然后在CONNECT引脚上填这个变量名。MB_SERVER作为服务器端被动等待客户端连接。CONNECT参数需要指定本地端口号一般也是502。如果你同时开了MB_CLIENT和MB_SERVER要确认本地端口没有冲突连接ID也不能重复。我实测下来S7-1200的Modbus TCP和施耐德ATV930变频器通讯的时候需要注意的是ATV930的寄存器地址偏移。ATV930的Modbus地址表里有些参数直接映射到4xxxx地址有些需要通过设备特定的索引访问。当时我遇到的情况是能建立连接但读到的数据不对排查了半天才发现是地址偏移了一位。解决办法是先读几个已知的固定参数确认地址对齐再批量读取实际需要的数据。和上位机通讯的时候Modbus TCP还有一个优势C#、Python、LabVIEW这些语言都有现成的Modbus库不需要写底层socket。C#里用NModbus库几行代码就能读到PLC的数据。但这个方案有局限——如果上位机需要同时读多个数据块Modbus TCP的报文长度和效率会比S7协议差一些。所以上位机项目的首选方案我一般推荐S7协议而不是Modbus TCP。2.3 S7协议通讯PUT/GET指令的信任机制和注意事项S7协议是西门子的原生以太网协议S7-1200和S7-1500、S7-300、S7-200 SMART之间通讯以及和WinCC、触摸屏通讯都可以用它。PLC侧的实现主要是PUT和GET指令。PUT是把本机数据写到远程PLC的指定地址GET是从远程PLC读取数据。两个指令的配置逻辑差不多都有一个AG_RW参数填地址结构体。这里要单独提醒一个非常关键的设置S7-1200作为服务器被访问时需要在CPU属性里勾选“允许从远程对象进行PUT/GET通讯访问”否则上位机或第三方PLC读不到数据。这个选项在CPU属性的“防护与安全”选项卡里默认是不勾的。指令里有一个AG_RW参数类型是AG_SEND_AND_RECEIVE结构体需要填远程PLC的IP地址、数据区域类型、DB块号、数据起始地址和数据长度。DB块号特别容易搞错因为S7-1200里DB块的编号默认是1、2、3……但你实际下发到远程后远程PLC侧的身份是“DB1”还是“DB2”必须双方约定统一。跨品牌通讯的时候尤其要注意比如S7-1200和S7-200 SMART用S7协议通讯时200 SMART侧要通过向导来配置S7通讯把数据区映射好两者不能直接拿DB号对表而是各用各的映射方式。这里还有一个细节S7协议默认最多可以同时建立多个连接但S7-1200根据型号不同连接数有限。如果上位机同时开了多个客户端线程去连同一个PLC很快就会把连接资源消耗光。我遇到过WinCC和C#程序同时连1200导致通讯间歇性断线的情况后来把C#的连接改成单例模式才解决。2.4 自由口通讯没有协议就自己拼协议自由口通讯听起来高大上本质就是允许你通过串口发送自定义的原始字节流。S7-1200的CM1241模块在自由口模式下你可以用RCV_PTP和SEND_PTP两个指令来接收和发送数据。一个典型的场景是接扫码枪。很多扫码枪支持通过RS232输出ASCII码字符串PLC这边用自由口接收按回车判定一帧结束。RCV_PTP指令可以配置EN_R引脚来检测起始条件常见做法是配置成“当接收到第一个字节时开始记录”。实际调试中有一个坑如果扫码枪没有数据输出RCV_PTP的忙状态一直挂着需要做个超时复位逻辑否则下一次扫码的数据可能接不上。自由口通讯的数据解析比较费劲因为你需要自己处理十六进制和ASCII的转换。比如温控仪返回的报文是“01 03 02 01 2C B9 A6”前两个字节是地址和功能码第三四个是数据长度后面是实际数据和CRC。你需要把数据区剥出来再按设备的精度换算成真实温度值。这一步最考验细心程度我建议在程序里多做几步标准化先把接收数组固定长度收到多少算多少别让残留数据混入下一帧。CRC校验一定要做不要只比对首尾字节就完事。接收完成标志用复位优先逻辑避免同一帧数据被重复处理。3. 实战案例拆解和第三方设备通讯的全过程3.1 变频器通讯案例ABB、三菱、施耐德、西门子全对比变频器是PLC通讯里最常见的设备类别。我分别说说和ABB、三菱D700、施耐德ATV930、西门子G120的通讯配置差异。先讲ABB ACS580和S7-1200的Modbus RTU通讯。ACS580支持Modbus RTU默认站地址是1波特率9600或19200都行。需要修改的参数在变频器控制盘里找到通讯参数组把运行命令源改成通讯频率给定源改成通讯然后设置站地址、波特率、奇偶校验这几个不设对PLC和变频器之间就算连上也控制不了。PLC侧用Modbus_Master写控制字ABB的Modbus控制字有特定的位含义比如位0是准备ON位1是使能运行位2是使能反转。不能直接写一个0到寄存器就希望它转起来要按位组合。三菱D700的Modbus RTU通讯是三菱变频器里比较有代表性的。D700的站号通过Pr.117设置波特率通过Pr.118设置校验通过Pr.119设置。D700的控制命令是写寄存器40001频率设定写40002。它有个和ABB不一样的点D700的控制权切换在Pr.79运行模式里必须设为0或2让变频器听从通讯指令否则你PLC发什么它都不理。三菱的频率给定是十六进制格式50Hz对应十六进制1388十进制5000也就是需要把50.00Hz乘以100再转成十六进制。施耐德ATV930比较新走Modbus TCP很顺。它内置了以太网口默认IP是192.168.0.10Modbus TCP端口是502。ATV930的参数地址比较复杂比如启动命令在Modbus地址为8501的寄存器用写保持寄存器的功能码直接写16进制的0x00F等值。它有个特性是参数地址可能跨页需要先通过设备手册确认是直接寻址还是索引寻址。我之前就栽在地址偏移上后来用一个Modbus调试工具先离线读几个参数确认了地址映射再往PLC里写效率高很多。再补充一下西门子自家的G120变频器。G120和S7-1200通讯标准方案是走PROFINET IO组态时选报文类型。111报文是标准报文之一里面包含控制字、速度设定值、状态字、实际转速等信息。注意111报文里控制字的第10位是“由PLC控制”第0位是“ON/OFF1”如果不把这两个位置1变频器不会响应启动命令。做调试的时候经常遇到“报文通讯正常、但变频器不转”的怪事十有八九就是控制字的位没写对。为了让这些案例更直观我把它们的通讯方式做了个简表变频器通讯协议关键参数设置核心注意点ABB ACS580Modbus RTU站地址、波特率、命令源设为通讯控制字按位组合频率值按设备倍率换算三菱D700Modbus RTUPr.79设为0或2Pr.117/118/119设置频率值5000对应50.00Hz十六进制格式施耐德ATV930Modbus TCPIP默认192.168.0.10端口502寄存器地址可能跨页先用工具验证地址西门子G120PROFINET IO选择111报文分配IO设备控制字第0位和第10位必须置13.2 上位机通讯方式C#、KepServer和OPC的几个思路上位机采集S7-1200数据我常用的有几种方案C#用S7.NET库直连、KepServer做OPC网关、或者直接用Modbus TCP。C#方向最省事的库是S7.NET也叫S7.NetPlus。这个库封装好了S7协议直接实例化一个Plc对象填IP地址、机架号、槽号然后Open连接读DB块就用Read(DB1.DBD0)写数据用Write(DB1.DBX0.0, true)。要注意的是S7.NET对S7-1200的连接默认用的是PG通讯方式需要确保PLC侧的PUT/GET访问权限是开启的。另外S7.NET的变量字符串格式必须写对比如读DB1的第4个字节开始的实数要写成“DB1.DBD4”整数是“DB1.DBW0”位是“DB1.DBX0.0”。这个格式要是写错了读出来全是0或者直接异常。KepServer是很多工厂上位机项目的选择它支持S7-1200的驱动也能连S7-200 SMART。KepServer连S7-200 SMART的时候需要选择Siemens TCP/IP Ethernet驱动通道设置里填IP地址设备模型选S7-200机架号0槽号1。连S7-1200的时候设备模型选S7-1200机架号0槽号1。KepServer的优势是能把不同品牌设备统一成OPC标签给上位机用但缺点是通道多了以后效率会下降如果点位特别多建议分通道采集。OPC UA也是一个方向。S7-1200从固件4.0开始原生支持OPC UA服务器不需要额外授权基础版限制连接数和节点数在TIA Portal里把OPC UA服务器选项启用定义好服务器接口上位机就能用OPC UA客户端访问数据了。这块特别适合和和利时DCS这类DCS系统对接DCS侧做OPC UA客户端PLC侧做服务器不用中间网关。3.3 S7-1200与S7-200 SMART之间的S7通讯“1台S7-1200用S7协议通讯多台S7-200 SMART”这个需求是很多项目里的标配。S7-200 SMART本身自带一个以太网口支持S7协议通讯所以两个系列之间可以直接用S7协议互通。实操步骤是S7-1200做客户端用PUT/GET指令访问S7-200 SMART。但有个关键点S7-200 SMART的S7通讯需要在STEP 7-MicroWIN SMART软件里配置一个“S7协议通讯向导”把需要被远程访问的数据区映射成可访问的地址。比如你希望S7-1200能读200 SMART的VW100那就要在向导里给这个VW100分配一个远程访问编号。如果是200 SMART做客户端S7-1200做服务器那么200 SMART侧用向导配置连接S7-1200的IP地址然后指定读写S7-1200的哪些DB地址。注意S7-200 SMART访问S7-1200的DB块时DB号和数据地址的配合必须准确比如访问S7-1200的DB1.DBW0在200 SMART向导里要填电脑的远程地址为DB1起始字节为0数据长度按需求选。这个方案最麻烦的是两侧数据地址的映射关系容易乱。我的习惯是先在纸上画一张表左边是S7-1200的地址右边是S7-200 SMART的地址两边一一对应然后在两侧程序里都加上地址注释。实际上现场调试的时候90%的通讯问题最后都发现是地址映射对不上而不是通讯本身的问题。3.4 触摸屏和CP-CPU之间的通讯设置西门子KTP1200触摸屏和S7-1200通讯默认走S7协议。触摸屏里添加PLC连接时要选择S7-1200驱动填IP地址然后设置机架号0槽号1即可。这个比较简单但有一个案例值得提出来有同行反映KTP1200触摸屏改完时间之后显示“不信任PLC”导致数据无法正常显示。这个问题的根源是触摸屏和PLC之间的时间同步机制。当你改了触摸屏的系统时间但PLC里的系统时间没有同步更新两个设备的时间偏差过大S7通讯就会报错触摸屏判定PLC数据“不信任”。解决办法有两步一是在触摸屏的设置里开启与PLC的时间同步让触摸屏每次启动时从PLC读取时间二是如果只改了触摸屏时间而没有同步重新下载一次PLC程序或者把PLC和触摸屏都断电重启让两者重新建立信任关系。其实这个本质是通讯安全机制在工作不是什么大毛病但现场第一次碰到确实会被吓一跳。4. 通讯故障排查把踩过的坑一个个填平4.1 常见通讯问题速查表这些年我处理过的现场通讯问题按出现频率排序大概是下面这个表格里列出的情况现象可能原因排查方向通讯建立不了指示灯不闪IP地址冲突、网线序不对、物理连接断开先Ping测试查IP换网线有通讯但不稳定偶尔断线连接资源耗尽、干扰、从站响应慢查连接数、检查接地、增大响应超时数据读出来了但全是乱码波特率或校验不一致、接线A/B反了核对通讯参数用调试工具监听串口数据能写不能读或能读不能写寄存器地址不对、权限限制查功能码是否匹配查从站读写权限程序下载后通讯失效PUT/GET权限没开、防火墙拦截检查CPU属性安全设置检查工作站防火墙通讯正常但数据偶尔错位数据字节序不对、字/位寻址混淆检查高低字节顺序核对数据类型长度这个表只是个起点真正排查的时候需要结合具体现象一步步缩小范围。4.2 典型问题分析TCP连接只有重启后能连上一分钟之前在项目群里看到有人提过一个问题西门子PLC的TCP连接每次重启才能连上一分钟过了就断。这类问题我在现场也遇到过原因往往不是单一的。最常见的几个因素我逐个拆开讲。第一PLC侧的连接资源被占满。S7-1200的连接数是有限的如果上位机或者触摸屏反复断开重连没有正常释放连接PLC侧的资源会慢慢耗尽新连接无法建立。这种情况的表现就是重启后能连上过一段时间又断而且越到后面越难连上。解决办法是检查上位机程序里的连接管理确保每次断开都调用Dispose或者Close不能只关页面不管连接。第二上位机程序里的连接线程挂死。这里的表现更接近你说的“每次重启才能连上一分钟”——程序启动时建立连接通讯正常但某个异常导致线程卡住心跳丢失连接就断开了。需要在程序里加一个看门狗机制定时检测连接状态发现断开就自动重连而不是等着重启。第三防火墙或网络安全策略拦截。如果PLC和上位机之间有防火墙或者交换机配置了端口安全策略可能导致通讯建立后长时间无数据交互时被判定为闲置连接而断开。TCP协议的保活机制在这里很重要C#里可以设置Socket的KeepAlive参数或者在应用层加心跳报文每几秒发一个保持连接的请求。排查这类问题我建议先抓包看看再查连接数再查心跳一步步来。不要一上来就怀疑PLC坏了大概率是自己的连接管理有问题。4.3 硬件接线和接地问题NPN/PNP接法引起的“通讯”误会有时候通讯不上问题并不在网络参数而在信号接线。就有同行问过“输出脉冲接入西门子PLC的NPNPLC公共端接的电源正接法”——这其实不是网络通讯而是PLC和外部传感器/执行器的信号电平匹配问题。S7-1200的数字量输入模块分为源型PNP和漏型NPN两种接法。源型输入公共端接电源正极信号线接0V外部传感器的输出是高电平有效漏型输入公共端接0V信号线接电源正极外部传感器的输出是低电平有效。很多人把这个搞反了导致输入信号一直不亮或者误触发误以为是PLC通讯故障。现场排查时必须搞清楚设备的输出类型。比如有的接近开关是NPN常开输出PLC的数字量输入模块如果是源型那就得用漏型接法公共端接0V。如果接反了灯不亮信号进不去就表现为“PLC收不到数据”这也是通讯故障的一种。但如果你只看程序不看硬件可能排查两个小时都找不到原因。4.4 排查方法论从物理层到应用层逐层过滤通讯故障排查我总结了一套自己的方法论核心就是“从底层往上查先硬件后软件先隔离后联动”。第一步物理层。网线或者RS485线接好了吗指示灯亮不亮RS485的A/B是不是接反了终端电阻有没有接地是不是共地很多“灵异现象”其实都是物理层问题。比如RS485通讯距离超过100米如果不加终端电阻信号反射会导致通讯时好时坏看起来就像“变频器不听话”。第二步数据链路层。串口的波特率、校验位、停止位是否一致以太网的IP、子网掩码、端口号是否正确用Modbus调试工具或者网络抓包工具确认数据有没有双向流通。第三步应用层。协议类型选对了吗功能码是否正确寄存器地址对不对数据解析是否按设备手册换算CRC校验是否通过数据字节序是否匹配这个排查流程看着简单但每到一个层级我都会问自己一个问题“有没有可能是上一层的假象”比如应用层数据不对我会先怀疑是不是物理层有干扰导致有些字节被错误解析。把每一层都单独验证过再组合起来跑整体功能效率最高。5. 案例之外的经验之谈通讯项目的几个习惯建议做通讯项目我还想分享几个平时积累的习惯这些不算深奥的技术但真的能救命。第一个习惯是在TIA Portal里给所有通讯指令的参数都加上中文注释。包括硬件标识符、IP地址、端口、数据地址。不要觉得自己记得住项目做完了过三个月回来看你会感谢当时的注释。我见过太多项目通讯调通就扔一边半年后客户要求加一个点位翻程序找了半小时不知道那个IP填在哪。第二个习惯是每加一个新设备先在纸面上写出通讯地址对照表。比如“从站3读寄存器40001-40005对应功率、电压、电流、频率、温度”这个表格写清楚编程和调试的效率至少提升一倍。以前我调试和多台设备通讯时经常因为地址对不上来回改程序后来强制自己先做地址规划表问题少了很多。第三个习惯是通讯调试时用一个Modbus调试工具软件做辅助。和第三方设备对接的时候先不急着上PLC先用电脑上的Modbus工具直接和设备通讯确认设备参数、寄存器地址都对了再回头写PLC程序。这个顺序能省很多在PLC上反复下载调试的功夫。通讯这件事从入门到熟练没有捷径但肯定有方法。S7-1200的通讯能力很强大覆盖面也广把这套东西吃透后面遇到S7-1500、S7-200 SMART或者其他品牌PLC很多思路都是通用的。每个项目调通的那一刻都值得记住——那些让人抓狂的通讯问题最后都会变成经验的一部分。