上个月我帮人改造一套恒温设备原来的做法是用模拟量把温控器的实际温度送进PLC一条温度线一条信号地现场电机一启动温控器那边的显示值和PLC读到的值就能差出好几度零点还时不时漂一下。后来我把温控器换成欧姆龙E5CZPLC继续用台达DVP系列干脆走RS-485通讯把温度、设定值、报警状态全部用两根线拉回PLC。这台台达DVP系列PLC与欧姆龙E5CZ温控器485通讯算是从头到尾踩了一遍接线、协议参数、Modbus报文、CRC校验、写SV不生效的坑都遇到了。这篇东西专门写给正在做温控设备集成、需要把温度设定值和实测温度读回PLC的同行前面是方案和接线后面是具体报文和排错链路可以直接照着操作。1. 为什么要选RS-485和Modbus而不是继续加模拟量通道1.1 先把现场需求捋清楚这套设备本身不复杂一个恒温箱一台E5CZ温控器一路热电偶一台风机加热管。控制闭环本来温控器自己就能完成PLC要做的事情也不多就是知道当前温度、能把目标温度改一改、在温度异常时做个报警。难点不在控制算法而在“通信”。旧系统用模拟量是为了省事可实际用下来问题很明显0~10V信号经过长距离线缆之后衰减严重变频器启动时干扰直接叠加在信号上温度显示跳来跳去。换个思路把温度值变成数字报文走RS-485总线两根线就能把测量值、设定值、报警状态全部传回去。台达DVP系列PLC和欧姆龙E5CZ温控器都原生支持RS-485口成本上没有额外增加这才决定改成485通讯。1.2 RS-485和模拟量到底差在哪模拟量方案不是不能用设备距离短、现场干扰小、PLC模拟量通道有空余的时候加一路4~20mA很省事。但是温度这东西是慢变量你用一根模拟量线只表达一个温度太浪费了。RS-485是差分信号两条线互为参考外部共模干扰到两条线上的幅度基本一致所以抗干扰能力天生比单端模拟量强。配合Modbus RTU协议一个485网络上可以挂32台从站设备每台设备还能暴露几十个寄存器相当于用一对线把所有参数都拿到手。对比项模拟量传输RS-485 Modbus接线根数每个点至少2根多路温度就要多路线两根线理论挂32个站抗干扰能力弱长距离衰减明显强差分传输数据内容只有一个物理量可读温度、SV、报警状态、PID参数校准需要零点满度校准不用校准维护排查万用表量电压需要串口调试工具看报文1.3 这套方案用的核心硬件清单台达DVP系列PLC例如DVP-14SS2或者DVP-ES2系列带RS-485通讯口或者扩展485模块欧姆龙E5CZ温控器带RS-485通信功能型号末位通常带485标识USB转RS-485转换器调试阶段必带屏蔽双绞线最好用带屏蔽层的两芯双绞线120Ω终端电阻通讯不稳定时用来匹配隔离型DC24V电源温控器供电和PLC供电有条件就分开这个清单里最容易忽略的是USB转RS-485转换器。没有它PLC和温控器之间就像两个人眼睛一闭直接对话出了问题谁也没法判断是PLC没发、发了没收到、还是回了没读上。调试期把它串在总线上能看到真实的Modbus报文一根线就能判断故障方向。2. 接线和端口定义通讯失败至少有一半原因在这里2.1 先搞清楚台达DVP的RS-485到底在哪几个端子上台达DVP各型号的通讯口定义不完全一样。DVP-SS2、DVP-ES2这两大类我接触得比较多主机上通常会带一个内置通讯口部分型号的COM口是RS-232需要扩展口才能接RS-485有些型号的COM2本身就是RS-485。做项目前第一件事就是把该型号的《操作手册》端子接线图翻出来找到标着DATA、DATA-或者S、S-的端口而不是凭印象直接接COM1。如果手上这台PLC没有内置RS-485可以加一块台达的485扩展通讯板。扩展板安装后程序里指定通讯口即可电气接线和数据帧格式是完全一样的。扩展板这个事在现场很容易漏很多人拿过PLC一看有COM口就当RS-485去接接完发现通讯口定义完全不对这个方向要先卡好。2.2 欧姆龙E5CZ的通信端子与A/B极性E5CZ温控器后面的接线端子数量不少电源、输入、控制输出、事件输入、通信各占几位。RS-485通信端子一般标注为A和B有的版本标注为S和S-。这里有一件事容易搞混各家产品对RS-485的“正负叫法”并没有完全统一。485总线在物理层分A和B两端A通常对应负端B通常对应正端但不少国产仪表会把端子标成反的。实际接线时不要硬记“S必须对S”而是把两台设备接上后看报文。如果用了USB转485工具调试助手能发出指令但收不到温控器的任何响应第一件事就是交换一下A、B两根线再试。很多现场所谓“通讯不上”真相只是两根线反了交换后立刻恢复。2.3 屏蔽层、公共地和终端电阻短距离实验台上随便两根导线也能跑通485但到了工业现场就不能这么将就。我在这套设备里的做法是用屏蔽双绞线屏蔽层单端接地接地选在PLC侧或电源侧其中一个点不要在两端同时接地形成地环路。地环路会导致总线两端电位差过大严重时直接烧通讯口。终端电阻要分情况。如果现场只有一台E5CZ温控器和一台DVP PLC距离也就十几米一般不需要额外加120Ω电阻加上去反而会让信号幅值偏低。如果总线距离超过几十米或者线上挂了好几台仪表那就要在总线最远端的两个节点上各并一个120Ω电阻。这个原则很多人弄反看到通讯不稳定就盲目加电阻结果越加越差。2.4 在总线上留一个调试口我会习惯在正式接线图上预留三根线引到一个接线端子排上A、B、屏蔽地。这样USB转485调试器随时可以并上去不影响PLC和温控器之间工作。调试口的作用不只是调试也是故障定位的分界点。3. 欧姆龙E5CZ侧配置绝大多数“通讯失败”是温控器参数没改对3.1 在E5CZ面板里把通信协议切到ModbusE5CZ默认不一定工作在Modbus RTU模式。温控器面板上有操作菜单和初始设置菜单两层按模式键可以切换。要改通讯先长按模式键进入初始设置等级找到通信协议、通信单元号、通信波特率这几个参数。通信协议设置为Modbus而不是CompoWay/F通信单元号也就是从站地址设置为1范围通常在1~247通信波特率设为9600或与PLC侧完全一致通信数据格式8位数据、无校验、1位停止位或按现场约定选择偶校验这里有个细节改完通信协议后有些参数需要重新上电才生效。我头一次调E5CZ时面板上改完直接发报文温控器没有任何反应后来重新断电上电才通讯成功。调试时如果怎么发都没回应别忘了让它重启一次。另外E5CZ还有一个“通讯写入”功能也就是是否允许上位机通过通讯写设定值。默认可能是禁止的只读没问题想通过PLC修改温度设定值就必须把它改成“允许”。这个参数不改后面写SV永远失败。3.2 常用寄存器地址读PV、读SV、写SVModbus RTU通讯的关键是把“属性”对应到“寄存器地址”。E5CZ的寄存器地址表接到参考手册的通信附录去查不同固件批次有偏移可能但常规映射是下面这套我实际项目里按这个做过可靠。数据类型含义寄存器地址十六进制读写属性PV当前测量温度0x1000只读SV当前设定温度0x2000可读写报警1值报警1相关限值0x2101起可读写报警2值报警2相关限值0x2102起可读写读取PV用功能码0x03请求起始地址就是0x1000写SV用功能码0x06或0x10寄存器地址0x2000数据内容就是设定温度对应的数值。需要提醒一句E5CZ的报警值根据报警模式不同上限报警、下限报警、区间报警对应的高/低限寄存器不一样编程前先把报警模式确定下来别只拿一个地址写死。3.3 小数点位、量程倍率第一个大坑E5CZ显示温度时经常带一位小数比如30.0℃。但Modbus寄存器里存的通常不是“30.0”这个浮点数也不是整数“30”而是“300”也就是把显示值乘以10作为整数来存放。如果用PLC直接往SV寄存器里写一个30E5CZ收到后会认为是3.0℃读PV读回来一个300PLC如果直接除以100显示就会变成3.00℃其实真实温度是30.0℃。这件事非常坑因为看起来“通讯是通的数据也读回来了就是数值不对”。处理方式很简单在PLC程序里约定统一用整数乘以10读PV时先把读回来的值除以10再做显示和运算写SV时先把目标温度乘以10再发送。制冷场景下还要注意负数温度低于0℃时PV寄存器存的是二进制补码PLC侧需要用有符号数处理否则零下温度会读成65535这类大数值。3.4 SV写不进去先查写入权限和运行状态SV写不进去大概有三类原因。第一类就是前面说的“通讯写入”被设为禁止这是最常见的。第二类是温控器的保护等级把设定值锁定键锁住了面板上虽然能改但通讯写入同样受限。第三类是设备处于某种特殊的运行模式或者正在执行程序段当前SV不是主设定值而是程序段设定值。我在现场遇到过一个问题PLC写SV返回正常码但是重新读SV时发现数值根本没变。逐一排查后发现温控器面板上有一个启动/停止状态没有切到运行写进去的设定值被当作预置值而不是生效值。改完设备状态后SV写入立即生效。所以写SV之后不要只看发送成功一定把SV寄存器重新读回来验证一下闭环是否成立。4. 台达DVP侧做主站报文结构、发送缓冲和轮询节奏4.1 先把PLC的通讯口配置成Modbus RTU台达DVP在软件里可以设置串口参数。打开ISPSoft或WPLSoft在PLC主机参数里找到COM口设置把协议选为Modbus RTU波特率、数据位、停止位、校验方式要和温控器一致。不要在一台设备上用9600、另一台用19200波特率不匹配时通讯表现为“完全无响应”而且报文根本发不出有效帧。有些老项目会在程序里通过特殊寄存器动态改通讯格式例如MOV一条十六进制数据到通讯格式寄存器再触发协议生效。这样做的好处是程序下载后通讯参数也能跟着一起恢复不用每次去软件界面里改。不过具体数值因不同DVP系列会有差异还是以该系列编程手册的特殊寄存器说明为准我这套设备是直接用软件界面配置的稳定运行没问题。4.2 一个完整的Modbus RTU请求帧Modbus RTU报文由地址码、功能码、数据区、CRC校验组成。以读取E5CZ的PV为例完整请求帧是01 03 10 00 00 01 CRC01从站地址也就是温控器的单元号03功能码读保持寄存器10 00寄存器地址0x1000的高字节和低字节00 01读取数量1个寄存器CRC循环冗余校验由主站算好后附在帧尾读取SV的请求是01 03 20 00 00 01 CRC把SV写入300对应30.0℃用功能码0x06的话是01 06 20 00 01 2C CRC如果想把设定值写成30.0℃寄存器值就是0x012C也就是300。用功能码0x10写多个寄存器时格式会多出字节计数和数据区校验方式都一样。4.3 用RS指令把报文发出去注意DVP的字节序台达DVP里面用RS指令发送自定义报文很方便。RS指令的作用就是把一段连续D寄存器当作发送缓冲区发出去再把接收到的数据存到另一段D寄存器。发送缓冲区里怎么摆放字节是个细节DVP的通讯口默认先发低字节再发高字节。以发送“01 03 10 00 00 01”这个读PV帧为例缓冲区可以这样安排D0里放0x0301低字节是01从站号高字节是03功能码D1里放0x0010低字节是10就是寄存器地址的高字节高字节是00D2里放0x0100低字节是00高字节是01表示读取数量发送长度就是3个字RS指令大致是这样用RS D0 K3 D100 K8D0到D2是发送区K3是发送3个字。D100开始是接收区K8是预留8个字。DVP在Modbus RTU模式下会自动计算并追加CRC校验码所以程序里不需要自己拼CRC两位字节。这也是我倾向于用RS指令而不是自己拼全部字节的原因省去了一大段CRC算法。4.4 轮询节奏、触发沿和接收判断PLC和温控器的通讯不是你发一帧它就一直回答。E5CZ是从站不会主动上报数据必须由PLC不断去问。但是不要让RS指令每个扫描周期都触发。我在这套程序里用一个100毫秒周期信号作为发送触发每次触发读取PV一次如果面板上的设定值有变化需要下发就单独用一条手动按钮信号触发写SV。写SV时还有一个容易犯的错还没来得及发送就把缓冲区覆盖了。RS指令发送是需要时间的发送标志没有复位前不要往发送缓冲区里写新数据。DVP有通讯相关的特殊寄存器可以判断发送动作是否完成程序里应该等上一个发送周期结束再准备下一次报文。实测下来整个循环控制在200毫秒左右就能很平滑地读取温度也不会给温控器带来负担。5. 现场联机排查我按这个顺序一步步收拢问题5.1 完全没反应时的排查链路如果PLC发送区已经执行但温控器完全没有任何反馈我不会先去翻PLC程序而是按下面这个顺序排查用USB转485调试器直接并到E5CZ端子上在电脑上发送“01 03 10 00 00 01”加上CRC。如果调试器都收不到回应问题在E5CZ侧和PLC无关。检查温控器面板的通讯协议是否改成了Modbus波特率是否为9600。重新断电再上电看通讯参数是否真正生效。把A、B两根线互换再测试。检查温控器通讯端口有没有被其他工具占用或者通讯口是否烧坏。调试器能收到回应说明温控器侧没问题问题在PLC侧PLC通讯口协议配置对不对、站号对不对、发送缓冲区字节高低顺序对不对波特率是否匹配线路是不是接到了别的通讯口上。5.2 收到数据但读数是0或乱码能回报文但数据不对属于“能说话但说的内容不对”。最常见原因是地址错位读取的寄存器不是PV而是别的参数。E5CZ回给主站的数据体通常是两字节正常温度值如果在常温25℃附近体现为0x00FA即250。如果读回来是0xFFFF这样的数据基本就是负数或寄存器内容无效先把符号处理做好。还有一种情况是数位顺序反了。Modbus RTU在寄存器内是按高字节在前传输的但DVP的接收缓冲区默认低字节先存放同一个温度值放到D寄存器里会变成高字节和低字节互换。我在程序里处理这类数据时习惯用一条交换指令或者通过软件里的字交换功能把高、低字节对调再判断数据合理性。网上能下载到现成的“字节交换”功能块用来做温度转换很省事。5.3 寄存器对不上时用调试工具做一次单指令测试最怕遇到“寄存器地址手册上写的是A实际设备不回应”这种卡壳。为了快速判断我会在调试工具里逐条发送不同的功能码和地址组合一条一条试。比如先读0x1000看看返回的数据是否接近现场温度如果返回的是异常码再试0x2000、0x2101这些地址通过响应内容反推E5CZ实际使用的地址表。Modbus协议有个特点地址不存在时从站会返回异常帧格式是“从站地址功能码高位加0x80异常码CRC”。看到这种异常帧反而好办说明从站活着只是地址或功能码不对。调试工具里如果只显示“无响应”那才是物理层、参数层的问题。5.4 项目保护上的一点建议这套系统虽然控制闭环在温控器内部不用担心PLC掉线导致加热失控但我在程序里还是做了通讯看门狗。连续三次读不到PV时把通讯故障标志置位在触摸屏上弹报警同时禁止PLC再写SV避免在人机界面上误操作写一个离谱的温度进去。另外给温控器供电的24V电源我建议不要和加热回路共用一个开关电源。加热丝一启动电源波动偶尔会把485通讯打得断断续续隔离供电后这个问题消失。继电器、接触器、变频器这些感性负载动作瞬间的反向电动势如果离通讯线太近干扰更容易串入总线。布线时把485线尽量贴着机壳走和大电流线保持20厘米以上距离这个老生常谈的经验在现场永远有效。在我接触过的温控通讯项目里真正被协议文本难住的并不多更多是卡在接线上A/B极性反了、协议没切换、波特率不一致、字节序没处理。E5CZ的寄存器数据结构很规整只要用串口调试助手亲眼看过一条正确的请求和对应的响应后面所有程序逻辑都会变得非常顺。如果你也在做类似项目建议把上面的地址表、报文内容和排查链路贴在调试台上一步步来通讯这件事说破了大天也就是“把对的字写到对的地方去”。