做PLC项目最绕不开的一件事就是模拟量。不管是温度、压力、液位还是流量现场传感器变送回来的信号十有八九都是4-20mA或者0-10V而PLC要干的活就是把这一串连续变化的物理量读进来、算清楚再输出成控制信号给变频器、阀门定位器这类执行机构。这次我用汇川PLC把模拟量采集与输出的全流程完整走了一遍从硬件选型、端子接线到程序编写、联调校验踩了不少坑也整理出不少经验。这篇文章适合两类人看一是刚接触汇川PLC、准备做第一个模拟量项目的新手二是做了几年项目但一直被信号跳变、采集值不准这类问题折磨的工程师。我尽量从一头雾水讲到能直接照着干。1. 开工前先想明白模拟量系统到底在干什么1.1 模拟量的本质连续物理量与PLC数字量之间的一次翻译先打个比方。现场的温度变送器就像一个温度计但它不是给你看刻度而是把当前温度换算成一个连续变化的电流或电压信号。4mA表示量程起点20mA表示量程终点温度每升高一点电流就跟着变大一点。PLC的模拟量输入模块负责接收这个电流内部通过A/D转换器把它变成一串数字程序再根据这串数字反推出实际温度是多少。这一进一出的过程就是模拟量采集与输出的核心逻辑物理量变成了电信号电信号变成了数字量程序把数字量还原成物理量再计算出一个控制目标数字量输出模块把数字量还原成电信号执行机构再把电信号变成物理动作。很多人在这里卡住是因为只关注了程序指令忽略了整个信号链路的每个环节都会影响最终结果。比如某一个电阻精度差一点或者线缆长了压降大一点最后反映到PLC里的数字就会偏。所以做模拟量项目第一步绝对不是写代码而是把整个链路想明白。1.2 模块选型为什么有人会把高速计数模块当成模拟量模块汇川PLC的产品线里小型机像Easy系列一般本身带一部分模拟量通道不够用的时候通过扩展模块增加GL系列就是常见的扩展模块家族。中型机如AM系列则通过背板扩展AM600系列的模拟量输入输出模块。我见过一个最容易踩的坑是选型时把高速计数模块和模拟量模块搞混比如GL20-2HC是高速计数模块用来接编码器、脉冲传感器的它采集的是脉冲个数和频率而不是4-20mA信号。有朋友接了个4-20mA的压力变送器到2HC模块上折腾了半天读不到数最后才发现根本选错了模块。选型之前第一件事先确认模块型号的功能定位到底是不是模拟量输入AI或模拟量输出AO。再看通道数量。常见的模拟量模块有4通道输入、8通道输入、2通道输出、4通道输出等规格。选型时必须考虑后续扩展空间建议输入输出各多留20%左右的裕量毕竟现场加测点比换模块容易多了。另外要注意模块的隔离方式汇川的模拟量模块大多做了通道间隔离这对抑制通道间串扰很有帮助便宜的非隔离模块在强干扰场景下很容易出现互相影响的问题。1.3 信号制式选择4-20mA、0-10V和温度电阻谁更合适现场传感器和变送器的输出信号五花八门但最常见的就是4-20mA电流环和0-10V电压信号热电偶、热电阻这类传感器有些模块也支持直接接入。我的建议是能用4-20mA就别用0-10V。原因很简单电流信号是回路式的线缆长了也不怕压降一根线断了还能通过信号掉到4mA以下判断出故障而电压信号抗干扰能力相对弱长距离传输时线缆电阻带来的压降会导致采集值偏低。现在不少变送器都支持两线制电源线和信号线共用两根线接线简单现场维护也方便。温度传感器接热电阻Pt100之类时模块输出的是激励电流检测的是电阻变化接线方式有三线制、四线制配平这块和变送器的4-20mA又不一样。如果项目里有热电偶、热电阻直接接入选型时就要选择带对应输入类型的模块并且注意冷端补偿的问题。2. 硬件连接细节接线端子、传感器类型与抗干扰布局2.1 看懂模块端子和信号制式的对应关系拿到一台汇川模拟量扩展模块不要急着接先把手册对应页翻出来。模块盖板上一般会印着端子的功能图比如GL20-4AD模块的每个通道都有一对正负端子标注了I和I-有些模块还会标注两线制和四线制的接法差异。电压信号和电流信号的接线端子往往是复用的要通过模块上的拨码开关或者软件组态来选择输入类型。这里特别提醒一点模拟量模块的供电和PLC本体供电尽量共用一个开关电源很多模块要求外部提供24V电源给传感器回路接线时要注意24V的正负极性。接反了轻则采集值异常重则烧毁模块的电源保护元件。我习惯在每次接线完成后、上电之前用万用表的通断档逐一确认每个端子没有短路再检查电源极性这套习惯帮我避免了至少两次返工。2.2 两线制、三线制、四线制传感器的正确接法两线制传感器只有两根线既是电源线也是信号线。传感器的正极接模块或电源的24V传感器的负极输出端接到模块的I通道I-通道再接到电源的0V这样形成一个完整的电流回路。接线的时候要注意传感器的负载能力有时候传感器要求回路供电电压不能超过某一范围超过会损坏传感器。三线制传感器是三根线电源正、公共地、信号输出。一般把公共地和信号负极在模块端短接信号线接I公共地接I-和电源负。四线制传感器则是电源和信号完全分离电源两组线信号两组线信号正接I信号负接I-。四线制的抗干扰能力通常最好因为信号回路和电源回路不共用导线不容易产生地环路电流。实际操作中同一模块的多个传感器最好统一接线制式不要混搭不然排查问题的时候会非常痛苦。我见过现场把两线制和三线制传感器接到同一块4通道模块上由于某个通道的公共参考点不一致导致其中一个通道数值严重偏差最后一个个换线排查才找到原因。2.3 屏蔽、接地和走线抗干扰的隐藏门槛模拟量信号最怕两样东西变频器的高频谐波和电机启停产生的浪涌。很多现场出现数值跳变原因不在PLC本身而是信号线从变频器旁边走过去了。信号线一定要用双绞屏蔽电缆屏蔽层单端接地一般是在PLC侧接地或者接到柜体接地排。屏蔽层如果两端都接地反而会因为地电位差形成环路电流产生新的干扰。动力线走单独的线槽和信号线槽保持至少20厘米以上的距离如果现场空间有限必须交叉交叉角度尽量保持90度垂直减少耦合面积。还有一个容易被忽略的细节是柜内接地。模拟量模块的I-端子和24V电源的0V很多手册要求做等电位连接否则传感器回路会通过大地回流产生毫伏级的电压偏差反映到数字量上就是几个甚至几十个字的波动。我在一个项目里安装时没把传感器公共端和模块公共端连好一个4-20mA的压力信号在电脑上看到的是0.5MPa到0.55MPa之间来回抖最后用一根跳线把模块I-和电源0V短接后立刻稳定了。2.4 实操中容易踩的硬件坑把常见的硬件连接问题列一个清单大家在调试时可以直接对照排查。模块没有上电或者供电线松动是最常见的问题表现为所有通道的读数都不对或者干脆报超量程故障。用万用表量模块供电端子确认24V稳定后再查其他环节。传感器线缆的线径太细长距离传输时压降明显导致采集到的电流低于实际值。4-20mA回路一般建议线径不低于0.75平方毫米超过100米就要重新核算。信号线接头氧化或者端子没压紧会让信号时通时断在振动比较大的现场尤其明显建议用带弹簧端子的PLC模块冷压端子压接后再插进去避免螺丝压线。模块拨码开关的设置和软件组态不一致。有些模块的通道输入类型是通过拨码开关在硬件上设置的如果硬件选的是0-10V档软件里配的是4-20mA读出来的数值基本没法用往往表现为读数偏大或溢出。3. 程序编写全流程组态、标定与核心逻辑实现3.1 软件环境AutoShop与InoProShop怎么选汇川PLC的编程软件根据产品系列有区别。Easy系列等小型PLC用的是AutoShop图形化界面支持梯形图、结构化文本、顺序功能图等语言AM系列等中型PLC用的是InoProShop这个软件是Codesys平台的二次开发版本里面能看到很多Codesys的影子。如果你之前玩过Codesys上手InoProShop会非常快变量声明、POU组织、设备组态的逻辑都高度相似。对于第一次接触汇川PLC的朋友我的建议是先确定你手里的PLC是哪个系列然后去官网下载对应软件安装的时候注意选择对应固件版本避免组态时出现不兼容问题。不管是AutoShop还是InoProShop程序的整体思路是一样的组态硬件、定义变量、编写逻辑、下载运行、在线监控。3.2 模拟量通道参数配置的要点以InoProShop为例添加模拟量输入模块后需要双击设备进入通道配置页面。每个通道要设置信号类型为电流还是电压然后选择量程比如4-20mA对应哪个原始值范围。这里得特别强调不同模块的原始值范围不一样有的模块0-20mA对应0-27648那4-20mA实际对应的是5530到27648还有的模块原始值是带符号的-32768到32767标定时计算方式完全不同。滤波系数这个参数很多人不太注意。滤波值设得越小信号响应越快但噪声也越明显设得越大信号越平滑但滞后越严重。对温度、液位这类变化缓慢的物理量滤波值可以设大一点比如几十毫秒到上百毫秒对压力、流量这类需要快速响应的信号就要权衡响应速度和稳定性一般从10到30毫秒开始试。此外很多模块有断线检测功能当电流信号低于1mA左右会触发断线报警这在现场维护时非常有用建议开启。3.3 工程量换算公式推导与ST代码实现程序编写最核心的一步就是把原始值换算成工程量。公式是工程值 (原始值 - 原始值零点) × (工程量满量程 - 工程量零点) / (原始值满量程 - 原始值零点) 工程量零点以4-20mA温度变送器为例量程0-150℃假设模块原始值在4mA时是553020mA时是27648那么对应关系就是5530对应0℃27648对应150℃。写程序的时候如果直接用ST语言可以写成下面这样// 温度采集功能块示例 // rRawValue从模拟量输入通道读取的原始值 // rTemp换算后的实际温度单位℃ rTemp : (rRawValue - 5530.0) * (150.0 - 0.0) / (27648.0 - 5530.0) 0.0;我一般会把换算逻辑封装成一个功能块方便多个通道复用。功能块的输入是原始值、零点原始值、满量程原始值、零点工程量、满量程工程量输出就是工程值。以后换传感器类型或者换量程只需要改参数不用改代码FUNCTION_BLOCK FB_AnalogScale VAR_INPUT rRaw: REAL; // 模块原始值 rRawMin: REAL; // 4mA对应原始值 rRawMax: REAL; // 20mA对应原始值 rEngMin: REAL; // 量程下限如0.0 rEngMax: REAL; // 量程上限如150.0 END_VAR VAR_OUTPUT rEng: REAL; // 换算后的工程值 END_VAR rEng : (rRaw - rRawMin) * (rEngMax - rEngMin) / (rRawMax - rRawMin) rEngMin;输出方向也类似比如把0-100%的转速设定值转换成0-10V对应的原始值满量程20mA对应27648公式倒过来用。3.4 报警、断线检测与输出联动逻辑模拟量采集不只是把数值读出来更重要的是在异常时能及时报警、安全停机。程序里要做三件事。量程上下限报警。温度超过某个安全阈值要置位报警位通知上位机或者触摸屏弹窗。为了防止临界状态报警频繁跳动一般要做滞回处理比如80℃报警78℃才复位中间这2℃就是死区。断线检测。模块支持断线检测的时候就利用模块状态位不支持的话就通过数值判断4-20mA信号如果读到低于3.6mA基本可以判断回路断线或者传感器故障这时候应该输出故障而不应该用这个值去参与控制。输出联动保护。模拟量输出作为控制信号时必须考虑输入信号异常时输出要怎么处理。比如采集到的温度信号断了变频器不能继续按照一个错误的高温值去调速而是应该进入预定义的安全转速或者停机并把故障状态通知上位机。4. 完整实操案例温度采集加变频调速一体化项目4.1 需求梳理与IO点表设计用一个我实际做过的案例来完整串一遍。项目需求是控制一台循环风机通过温度变送器采集管道内气体温度根据温度自动调节风机转速实现温度高则风量大、温度低则风量小的恒定控制。IO点表梳理如下。温度变送器量程0到150℃输出4-20mA两线制接模拟量输入模块通道1。变频器速度给定需要0-10V模拟量信号接模拟量输出模块通道1对应频率0-50Hz。变频器运行和停止通过PLC的数字量输出控制。风机运行状态变频器反馈到PLC数字量输入用于安全互锁。这个点表一列出来硬件选型就清晰了。输入扩展模块用4通道模拟量输入输出用2通道模拟量输出通道余量刚好够未来扩展。Easy320本体上一般已经集成了一定数量的通道和数字量点位根据实际情况决定是否需要扩展。4.2 实际接线与组态过程记录接线时温度变送器的两线分别接变送器电源正24V和模拟量输入模块通道1的II-返回电源0V。变频器速度给定端子接模拟量输出通道1输出0-10V信号公共端接变频器信号地这里要注意变频器的信号地和PLC的0V不要随意等下连很多变频器手册要求信号负端和PE之间有特定连接方式接错会出现零漂。模块组态时在InoProShop里面添加模块把通道1输入类型设为4-20mA电流原始值范围选0-27648开启断线检测。输出通道设为0-10V电压信号。生成IO映射后在程序里可以看到模块通道对应的变量名后续直接用这些变量读写数据。4.3 主程序代码与控制逻辑实现主程序的大致逻辑如下。温度采集标定把原始值换算成实际温度。控制运算根据温度偏差输出转速设定值0-100%。设定值换算成模拟量输出原始值写入输出通道。异常处理温度断线或者超上限就停变频器并报警。为了方便阅读我用结构和注释把代码拆开。// 主程序主循环 // 1. 模拟量采集与工程量标定 rTempRaw : INT_TO_REAL(AI_TempChannel); // 读模块原始值如达到断线阈值则报警 rTemp : (rTempRaw - 5530.0) * 150.0 / (27648.0 - 5530.0); // 2. 断线判断 IF AI_TempChannel 4000 THEN bTempSensorFault : TRUE; ELSE bTempSensorFault : FALSE; END_IF // 3. 温度-转速控制逻辑 // 温度低于30℃输出最小转速10%90℃以上输出100%转速 IF NOT bTempSensorFault THEN IF rTemp 30.0 THEN rSpeedPercent : 10.0; ELSIF rTemp 90.0 THEN rSpeedPercent : 100.0; ELSE rSpeedPercent : 10.0 (rTemp - 30.0) * 90.0 / 60.0; END_IF ELSE rSpeedPercent : 0.0; // 传感器故障时默认不启动 END_IF // 4. 输出工程量到模拟量输出通道0-100%对应0-10V rOutRaw : rSpeedPercent / 100.0 * 27648.0; AO_SpeedChannel : REAL_TO_INT(rOutRaw);如果对控制精度要求更高可以把第三段的比例分段运算换成PID控制块用温度作为过程值转速设定值作为输出。汇川的编程软件里都有现成的PID功能块注意把PID的采样周期设为和程序周期一致或者整数倍比例、积分、微分参数可以先从经验值开始再根据现场响应曲线调整。4.4 现场联调与参数验证下载程序后在线监控所有关键变量。先用手持信号发生器给模拟量输入通道注入4mA、12mA、20mA三个标准电流点检查采集计算出来的温度是否分别是0℃、75℃、150℃。如果偏差明显先确认模块原始值范围和接线再考虑硬件校准。温度回路验证通过后把模拟量输出通道接到万用表电压档程序强制输出50%确认输出端电压约5V。然后接上变频器监控变频器显示频率是否和设定值吻合。最后做整体联动测试用热风枪靠近温度变送器模拟温度升高观察风机转速是否跟着上升温度稳定后转速是否有震荡。我这次在测试时发现温度升到85℃左右转速出现周期性波动排查下来是输出量程设定和变频器量程设定不一致PLC输出100%对应10V变频器设定的是0-20mA输入且内部还叠加了偏置重新设置变频器模拟量输入量程后恢复正常。5. 常见问题排查与现场经验5.1 数值跳变、漂移的排查顺序遇到模拟量数值乱跳第一反应不要先怀疑PLC坏了。按照顺序排查能省下大量时间。先确认信号源本身是否稳定。用万用表或者信号发生器在模块端子处测量输入电流或电压如果端子处分量信号稳定而模块显示乱跳说明问题在模块或者程序侧如果端子处信号就不稳那问题在传感器或线缆。再检查接线和屏蔽。信号线是否与动力线捆在一起、屏蔽层是否单端接地、公共端是否接对这些都是高频干扰的常见原因。然后检查软件配置是否一致模块原始值范围、滤波系数、断线阈值等参数是否设置合理。最后检查模块是否损坏或者通道间串扰可以通过把信号从一个通道换到另一个通道来验证比如把传感器接到临时的空通道上看数值是否恢复正常。有一点值得单独强调电源质量也是跳变的隐形杀手。PLC供电开关电源如果同时给电磁阀、指示灯这类感性负载供电母线电压波动会直接影响模拟量模块的转换精度建议模拟量模块单独一路24V供电或者使用隔离电源模块。5.2 采集值整体偏移的处理与校准如果采集值整体比实际物理量偏高或偏低但比较稳定那大概率不是干扰问题而是标定或者量程设置问题。先把变送器的量程和模块的量程对照清楚4-20mA的变送器如果模块配成了0-20mA采集值一定会偏低或偏高这是最常见的偏差来源。变送器本身存在精度误差需要两点校准。比如实际温度用标准温度计读数是100℃PLC里显示98℃满量程是150℃那就在模块正常读数之上做一个软件修正可以在工程量换算公式里加一个修正系数或者偏移量。注意做修正时要分别在低端和高端各校准一次只修正单点容易出现低端准了高端又不准的情况。还有一个值得留意的点很多变送器或者模块默认的4mA不是严格等于原始值的最小值模块内部会有微小的零漂。如果对精度要求比较高可以在系统稳定零输入时记录零漂值在程序里扣除这个底数。我见过一个现场所有温度通道读数普遍偏高1.2℃排查后发现是模块零点漂移叠加变送器误差共同造成的软件里统一做了修正后全部合格。5.3 模拟量输出的常见异常输出模块没有电压输出或者输出值一直为零先查模块输出使能很多模块有输出使能位或者需要在线程中给通道使能软件里输出使能位被复位会导致输出被切断。再查模块供电和接线电压信号输出时公共端是否接好很关键如果信号公共端悬空万用表量出来的电压会是乱的。输出值跳变则要区分是程序设定值跳变还是输出信号本身跳变在线监控程序里的输出原始值如果原始值稳定而输出信号跳变检查输出模块的供电和外部负载是否产生反电动势。输出带感性负载时在输出端并联RC吸收回路或者用续流二极管非常重要否则模块输出驱动电路容易损坏。PID控制不稳导致输出震荡的情况也要留意表现是输出原始值在某个范围内高频变化。这时候先降低PID的比例系数或者增大微分时间确认系统不震荡后再逐步加强控制效果。另外模拟量输出通道无论有没有负载都要注意模块允许的最大输出电流0-10V输出端子如果直接接到了高阻抗负载上最好确认负载输入阻抗的大小太低会导致输出电流超限模块发热甚至损坏。5.4 备忘模拟量调试的核心工具与排查速查表做模拟量调试我桌面上永远放着几样东西一只钳形万用表用来测变送器回路电流一个小型手持信号发生器用来模拟4-20mA或0-10V的标准信号一支温度计用来做现场实际物理量基准如果条件允许示波器在排查脉冲干扰时能直接看到信号波形上的毛刺但现场不一定每次都方便带。把高频典型问题整理成一张速查表贴在操作台旁边能省很多事。现象常见原因优先检查项数值跳变屏蔽/接地不良、变频器干扰信号线走线、屏蔽层单端接地数值整体偏差量程设置错、变送器精度模块配置量程、用信号发生器校准所有通道溢出模块未上电、公共端断供电端子、电源极性个别通道为0通道损坏、接线松动换通道测试输出无信号输出使能未开、公共端悬空软件使能位、输出回路连接输出值震荡PID参数不合适降低P增益、增加微分断线无报警断线检测未开启、阈值不当通道配置断线检测最后再啰嗦两句掏心窝的体会做模拟量项目这几年我最大的感受是模拟量本身并不难难的是整个信号链路的每一个细节都不出错。一个冷压端子没压紧、一根信号线和动力线平行走了半米、一个滤波参数没设置都可能在现场让你排查一整天。所以建议大家养成一个习惯接线完成后用万用表逐点校线组态完成后用信号发生器逐通道验证量程这样到联调阶段会顺很多别把问题攒到最后一起爆发。最后再分享一个我常用的调试技巧在程序里暂时把工程量换算得出的值除以一个基准量再乘回或者用监控表实时查看某个中间变量这样可以快速定位是哪一步计算出了问题。比如温度显示异常先看原始值对不对再看标定后的工程值对不对最后看控制输出对不对这样一步步缩小范围比盯着一个变量瞎猜高效得多。希望这篇文章能帮你少走一些弯路。