
做电气自动化这些年我发现自己对模拟量的敬畏心是越来越高。数据线断了顶多通讯报警模拟量一出问题仪表显示137摄氏度PLC死活读出来45.2现场能折腾一整天。汇川PLC这几年在中小项目里出镜率很高Easy系列便宜皮实AM系列跑Codesys灵活模拟量采集和输出是绕不开的基本功。这篇把汇川PLC模拟量从硬件接线、信号选型到程序换算、现场调试的完整流程整理出来希望帮正准备上手的朋友少走几趟弯路。1. 先想清楚信号制式4-20mA比0-10V强在哪又输在哪模拟量信号看起来就是电压或者电流但选错制式后面接线、抗干扰、模块量程全都要跟着返工。我见过不少新同事上来就问这个模块能不能接4-20mA却说不清现场仪表到底输出什么信号。所以在碰PLC之前先把两个主流信号制式掰扯明白。1.1 为什么4-20mA能成为工业主流电流信号的核心优势是它不随线路电阻衰减。电压信号走线 100 米假设导线电阻 5 欧姆传感器内阻再大一些末端电压和现场仪表显示值之间可能差出几个百分点。电流信号不一样整个回路的电流处处相等只要变送器能把电流推出去哪怕线长了PLC 侧采样电阻上得到的信号依然准确。4-20mA 还有一个天生的故障诊断能力4mA 是零点意味着正常工作时电流绝对不会低于 4mA。如果因为断线、供电丢失导致电流跌到 0PLC 立刻能判断信号异常。很多项目里我都是用这个特性做传感器断线报警完全不用额外加硬件。1.2 0-10V也不是一无是处0-10V 电压信号抗干扰能力比电流弱但它也有自己的主场。柜内短距离传输、变频器启停控制、一些控制器 AO 输出很多默认就是 0-10V。原因很简单电压输出电路简单驱动能力强对接收端采样电阻要求低。柜内走线不超过几米干扰问题不太突出这时候 0-10V 反而是更经济的选择。实际项目里我有一条经验法则变送器到 PLC 距离超过 20 米优先 4-20mA距离短、柜内走线、信号源本身只有电压输出用 0-10V有强干扰源变频器柜、大电机附近能上 4-20mA 就别用 0-10V温度、压力、液位这类过程量绝大多数选 4-20mA。1.3 汇川PLC的信号兼容范围汇川 Easy 系列本体的模拟量输入通道一般可以通过软件把量程配置成 0-10V、0-20mA 或 4-20mA 中的某一种。AM 系列在模块上也预留了相应的量程设置。关键是搞清一件事模拟量模块的输入通道不是所有信号都能随意乱接电压信号和电流信号的采样原理不同接错了可能烧通道。一个常见的坑是某一路前一个项目接了 0-10V换传感器时没改通道组态直接接 4-20mA 变送器结果读数直接爆表或乱跳。所以后面专门用一节讲组态环节的配置这步漏了程序写得再漂亮都没用。2. 硬件侧的硬功夫模块选型、接线制式与屏蔽层处理模拟量不像开关量那样通断就完事它讲究回路、共地、屏蔽、压降。硬件连接不到位后面所有的滤波和补偿都是亡羊补牢。2.1 模块选型本体通道还是扩展模块汇川 PLC 选型时模拟量通道先看 CPU 本体是否自带。我常用的是两条线Easy 系列小机型本体带一部分 AI/AO点数少、项目简单时直接够用。要接脉冲模块或者增加模拟量路数就扩展 GL20 系列。像现场接过 GL20-2HC 这种脉冲模块走的是高速计数方向和模拟量模块的扩展方式类似在 AutoShop 里配置好槽位就行。AM 系列中型机像 AM401、AM403 这类本体也集成模拟量通道路数不够就挂扩展模拟量模块。选型时不要只看路数还要看隔离方式。非隔离模块价格便宜但外部干扰容易串进 PLC 内部隔离模块每个通道独立隔离现场处理地电位差、变频器干扰时省心太多。预算允许模拟量输入输出尽量选隔离型。2.2 变送器接线制式两线制、三线制、四线制这是模拟量接线最容易被绕晕的地方。同样是 4-20mA变送器可能有两线制、三线制、四线制三种接法。制式供电方式信号线公共端典型场景两线制信号回路串联供电2根无绝大多数压力、温度变送器三线制独立供电但共用负极2根信号 1根电源负共用部分液位、流量计四线制独立电源正负2根信号独立质量流量计、分析仪两线制接线时变送器的两根线一端接 PLC 模块的 AI 通道正端另一端串入模块提供的 24V 电源。简单理解就是模块既供电又收信号所以线断了电流归零PLC 能立刻发现。三线制和四线制的区别在于电源和信号是否共用公共端。接错最常见的后果是读数偏大或偏小、上电后模块通道发热、严重时烧毁通道。一个我踩过不少次的经验上手前一定先看变送器铭牌上的接线图而不是想当然按两线制接。有些进口流量计明明是四线制按两线制接了半小时读数纹丝不动查半天才发现少接一根电源负。2.3 屏蔽层接 0V 的正确操作很多资料只说屏蔽层要接地但没说接哪一头导致现场地环路反复炸。完整的原则是屏蔽层单端接地通常在 PLC 侧接到模块的 0V 或屏蔽端子另一端悬空。为什么只能接一头因为如果屏蔽层两端都接地而两端设备的地电位不完全相等屏蔽层里就会流过一个地环流这个电流反而会在信号线上感应出干扰让原本要防的噪声变得更严重。这个现象我用万用表实测过两端的电位差有时接近 1V对 4-20mA 信号来说这是不可接受的误差来源。操作细节也重要屏蔽层剥出的铜网要拧紧压接到端子上不能只是搭在金属外壳上屏蔽线尽量靠近 PLC 模块侧接入 0V中间不要经过端子排转接又断开模块没有屏蔽端子时接到机柜汇流排或电源 0V 的干净接地点。还有一条跟走线相关模拟量信号线要和动力线分开走、尽量避免同槽。实在避不开也要保持至少 20 厘米间距交叉时垂直走。变频器输出侧的动力电缆是模拟量干扰的头号来源这两路缠在一起后面滤波都救不回来。2.4 电源与回路的共地问题模拟量模块读数异常十有八九和地有关。最简单的排查思路是用万用表量一下变送器电源负和 PLC 模块 0V 之间的电压。正常情况下应该是 0V 左右。如果量出几伏甚至更高说明两边的地电位不一致信号到了模块端已经叠加了偏置。解决办法不复杂把变送器供电电源的负极和 PLC 模块的 0V 接到同一个汇流排上。项目里有强烈干扰时可以考虑加信号隔离器把现场传感器和 PLC 模块在电气上隔开两侧各走各的地干扰就从根源上被切断了。3. 组态环节的通道配置量程、采样时间与码值映射表硬件接完接下来是编程软件里的组态。很多人以为把通道使能了就行实际上量程配置、滤波参数、码值映射这些设置哪一个不对程序里读到的数都不会正确。3.1 AutoShop和InoProShop里的硬件组态汇川 Easy 系列用的是 AutoShopAM 系列用 InoProShop两者组态思路类似。在 AutoShop 里新建工程后先添加 CPU 型号再把扩展模块按实际顺序插入槽位。插入后双击模拟量模块进入通道配置界面能看到每一路输入的类型选择、量程选择、采样时间等参数。这一环节最容易犯的错是硬件组态里的模块顺序和实际安装顺序不一致。扩展模块槽位号如果差一位后面程序里读取的通道地址就对不上现场表现出来的现象很迷惑——通路数对但读到的不是那一路传感器。所以我的习惯是组态完成后在程序里先读一遍所有通道的原始值看看都有没有反应再对应到传感器上去。先把通道映射关系验证清楚才往下做换算。3.2 量程设置和码值映射表模拟量模块的 A/D 转换结果通常是 16 位整数但同样的 4-20mA在不同品牌模块里映射的码值范围不一样。以前用某进口 PLC 时4-20mA 对应 0~27648这是它的标准化体系。汇川模块我实际用过的有映射到 0~32767 的情况也有某个模块量程范围对应 0~4000 的。具体以你手里模块手册里的分度表为准。这里给一张通用对照表方便理解换算原理信号类型低端信号高端信号原始码值低端原始码值高端4-20mA4mA20mA0327670-20mA0mA20mA0327670-10V0V10V032767组态时把量程选成和现场传感器一致比如传感器是 0-100℃ 对应 4-20mA那就在量程设置里把工程上下限填成 0 和 100。有些模块支持直接填工程值PLC 内部帮你算不支持的话就得在程序里手动做标定换算下一节详细写。3.3 采样时间和滤波参数的取舍模拟量模块一般有采样时间设置单位是毫秒。这个参数决定了 A/D 转换的周期。采样时间短响应快但高频噪声也容易混进来采样时间长相当于硬件层面做了积分平滑数值稳定但响应变迟钝。通道多、程序扫描周期短的时候还要注意采样时间的累计影响。我的经验是温度、液位这类变化慢的过程量采样时间可以放宽到几十毫秒甚至几百毫秒读数非常稳压力、流量这类需要动态响应的采样时间放短然后在程序里做软件滤波这样既能保证实时性又能抑制毛刺。有些模块还带硬件滤波或平均值功能组态时可以直接开启。但不要完全依赖硬件滤波后面程序里再做一道移动平均效果会更好。4. 从原始码值到工程量的换算程序滤波与标定的完整写法这一节是模拟量程序编写的核心。很多新手把原始值直接拿去做比较、做 PID发现和现场仪表对不上原因就是少了标定换算这一步。4.1 读取模拟量原始值在 AutoShop 里模拟量输入通道对应的地址是类似 AIW0、AIW2 这样的字地址用 MOV 指令直接读到数据寄存器里就行。AM 系列在 InoProShop 里可以直接把硬件输入通道映射到程序变量。读出来的原始值是一个整数范围由模块的分度表决定比如 0~32767。这张数据本身没有任何工程含义必须换算成温度、压力、百分比程序才有意义。我的习惯是先做一个专门的模拟量处理程序段把每个通道的原始值统一换算成标准化浮点数比如 0.0~100.0 的百分比然后再在各功能块里使用。这样后续做 PID、显示、报警全部基于同一套工程值不会出现一个项目里几种算法并存、各算各的乱象。4.2 线性标定公式与ST代码示例绝大多数模拟量传感器输出和被测物理量是线性关系所以换算公式就是一个直线方程工程量 (原始值 - 零点码值) / (满量程码值 - 零点码值) * (工程量上限 - 工程量下限) 工程量下限以 4-20mA 对应 0-100℃ 为例假设模块分度表把 4mA 映射到 0、20mA 映射到 32767那么零点码值 0满量程码值 32767工程量下限 0工程量上限 100换算公式简化为工程量 原始值 / 32767 * 100在 InoProShop 的 ST 语言里写// 变量声明 aiRaw : INT; // 从AI通道读出的原始值 aiScaled : REAL; // 换算后的工程值 spanMin : REAL; // 量程下限 spanMax : REAL; // 量程上限 rawZero : REAL; // 零点对应码值 rawFull : REAL; // 满量程对应码值 // 换算逻辑 aiScaled : (INT_TO_REAL(aiRaw) - rawZero) / (rawFull - rawZero) * (spanMax - spanMin) spanMin;Easy 系列的 AutoShop 也支持 ST 语言或者可以在梯形图里用加减乘除指令搭出同样的算式。区别只是编程习惯公式和思路完全一致。4.3 断线检测与超量程判断换算公式本身不难难的是让程序应对异常。4-20mA 信号低于 4mA 通常意味着断线或变送器故障。这个判断要放在换算之前IF aiRaw rawZero 50 THEN // 码值跌到零点附近以下判定断线/故障 faultFlag : TRUE; aiScaled : 0.0; ELSE aiScaled : (INT_TO_REAL(aiRaw) - rawZero) / (rawFull - rawZero) * (spanMax - spanMin) spanMin; END_IF;同理满量程以上也要做上限钳位防止数值算出超出传感器量程的假值把下游的逻辑或 PID 带偏。4.4 移动平均滤波与中值滤波写法现场模拟量最闹心的就是读数跳变。硬件滤波挡掉一部分高频噪声程序里再加一道软件滤波双保险。移动平均滤波的思路是每次采样都取最近 N 个值的平均值。适合温度、液位这类平稳信号。// 使用数组实现滑动窗口平均 VAR samples : ARRAY[0..9] OF REAL; // 存最近10次采样 index : INT; sum : REAL; result : REAL; i : INT; END_VAR samples[index] : aiScaled; index : (index 1) MOD 10; sum : 0.0; FOR i : 0 TO 9 DO sum : sum samples[i]; END_FOR; result : sum / 10.0; // result就是滤波后的工程值中值滤波则适合有尖峰脉冲干扰的场景比如变频器频繁启停时压力变送器偶尔蹦出的尖刺。做法是把最近 N 个值排序取中间值输出。N 一般取 5 或 7太大会让响应明显变慢。我的实际经验是先中值滤波去掉尖峰再移动平均平滑曲线两者配合效果最好。光靠移动平均尖峰只是被摊薄了并没有真正剔除光靠中值滤波曲线又容易有台阶感。5. 模拟量输出通道的接线与编程把结果真正送出去采集烧脑输出也一样一堆门道。PID 算出来的控制量怎么变成 4-20mA 送到变频器、调节阀这里面接线和换算一步都不能省。5.1 AO通道的负载与接线限制模拟量输出模块的电流输出一般有最大负载电阻限制比如 4-20mA 输出最大负载 500 欧姆或者更大。接变频器模拟量输入端子时变频器侧输入阻抗通常在几十到几百欧姆基本没问题。但接线要分清三件事输出电压信号时如果外部负载的公共端和模块输出负端电位不一致需要检查共地输出电流信号时回路串接的负载不能超过模块标称的最大负载电阻否则电流推不上去输出通道同样存在短路保护问题千万别拿电流输出直接去驱动一个线圈之类的负载。AO 通道的屏蔽层处理方式和 AI 一样屏蔽层单端接 0V不要和动力线走同一根线槽。5.2 输出码值的换算方向模拟量输出是采集的逆过程程序里算出的工程值要先换算成原始码值再送到 AO 通道。还是用 4-20mA 对应 0-100% 举例模块分度表把 4mA 映射到 0、20mA 映射到 32767// 把0-100%的控制量换算成输出码值 ctrlPercent : REAL; // PID输出范围0.0-100.0 aoRaw : INT; // 写入AO通道的码值 aoRaw : REAL_TO_INT(ctrlPercent / 100.0 * 32767.0); aoRaw : LIMIT(0, aoRaw, 32767); // 限幅保护这里注意不要在主程序中直接对 PID 输出做限幅不然 PID 积分饱和问题会在这个环节被放大。正确做法是 PID 内部做抗积分饱和输出端再对外部码值做最终限幅。5.3 PID 配合 AO 输出时容易忽略的环节PID 输出到模拟量输出通道之间很多人忘记加手动/自动切换功能。调试现场经常遇到的情况是自动模式下 PID 输出一直在 70%但我不想让阀门按这个开想手动给 30%怎么切我的做法是在 PID 输出和 AO 码值输出之间加一个手动值寄存器。自动模式时把 PID 输出赋给它手动模式时由屏幕写入最后统一由这个寄存器换算成码值送出。这样切换时不会抖阀门不会猛跳。5.4 输出值来回震荡的处理调节阀或变频器跟着 PID 输出来回震荡是很常见的现象。最先检查的不是 PID 参数而是输出通道的采样时间和阀的动作时间是否匹配。如果 AO 每 10 毫秒更新一次而调节阀执行机构要好几秒才能走到位那 PID 输出敏感度再高阀门也永远在追目标值。后续我会配合几个项目实例讲一般调法包括增大 PID 采样时间让每次输出保持足够长的时间减小比例增益增加积分时间在 AO 输出前加一个输出变化率限制让输出斜率可控阀门动作更柔和。6. 现场调试实录数值跳变、偏差与干扰的排查链路最后这节是纯实战。模拟量项目调试时翻来覆去就那几个问题但每次出现新人总会从头乱查到尾。我按排查顺序整理一套链路照着走能省很多时间。6.1 通道没有读数或读数恒为最小值遇到这种情况不要先怀疑 PLC 和程序按下面的优先级查拔下接线用万用表直接量变送器输出信号确认传感器端到底有没有信号出来有信号但 PLC 还是没读数量模块的 AI 端子两端是否真的收到了这个信号排除中间端子排接触不良检查 24V 电源是否给到位两线制变送器如果电源没串对回路里根本不会有电流组态里看通道量程、使能是否配置正确地址是否映射到了正确的模块槽位。实战中最常见的其实是第 1 步变送器坏了或者供电被保险丝烧断接线上查了半天其实源头就没给信号。先量传感器输出再查 PLC 通道这个顺序一定不能反。6.2 读数跳变、毛刺严重的处理链路读数乱跳先把程序滤波和硬件干扰分开来查。测试方法很简单把变送器信号用一根短线直接插到模块上不经过现场长线用手动信号源给定一个稳定的 4mA/12mA/20mA看程序里读到的码值稳不稳。如果短接时很稳走长线就跳问题出在信号线路上如果短接时也跳问题出在模块通道或供电上。信号线路导致的跳变排查重点是屏蔽层是否单端接地、接的是不是干净 0V信号线是否和动力线扎在一起走两端地电位差是否过大必要时加信号隔离器变送器供电的 24V 电源是否为开关电源带来纹波可以并一个 DC/DC 隔离模块解决。6.3 读数系统性偏差整体偏高或整体偏低如果读数不是乱跳而是整体比现场仪表偏大或偏小百分之几这是典型的标定偏差。先用万用表实测变送器输出的电流值再对照 PLC 读出的原始码值一起换算一下如果 4mA 时 PLC 端偏大、20mA 时还是同一个偏置量说明零点偏置程序中调整零点码值偏移如果偏差比例和信号大小成正比说明增益标定不对对应调整满量程码值。模块分度表里零点码值和满量程码值最好在项目调试时用实际信号源做一次两点标定不要只看手册里的标称值。原因很简单模块本身的精度、采样电阻误差、现场电压影响都会让实际映射关系和手册有细微差异。标定过之后精度能有显著提升。6.4 上位机读取模拟量寄存器地址先确认模拟量换算如果在 PLC 程序里已经完成上位机直接读换算结果最好。汇川 PLC 通过 MODBUS 通讯和上位机对接时程序里把模拟量工程值放到底层保持寄存器再做好 MODBUS 地址映射表。上位机组态软件读这些保持寄存器就行。这里最需要注意的是地址映射的对应关系加 1 减 1 的偏移最容易出错调试时先用 MODBUS 调试工具读一遍确认再进组态软件配置。如果上位机需要读原始码值再自行换算也建议把分度表和标定公式同步给上位机组态的人员两边算法不一致后期维护时会出现PLC 显示正常、上位机显示偏大的奇葩问题。6.5 一条可以复制到项目里的调试清单结尾整理一份我在模拟量项目里会反复对照的检查清单新项目调试时照着走基本能覆盖 90% 的问题检查项说明变送器信号源输出确认先量传感器再查通道供电电源电压是否稳定负极是否与模块0V共地接线制式两线制/三线制/四线制是否接对屏蔽层是否单端接地、接0V是否干净模块组态量程、使能、槽位映射是否匹配原始码值对照分度表确认零点与满量程码值两点标定用信号源校准零点和增益软件滤波中值滤波加移动平均是否合理输出限幅AO码值是否做了上下限保护通讯映射上位机寄存器地址和换算逻辑是否一致这套流程我在好几个汇川项目里都用过无论是 Easy 系列的 AutoShop 还是 AM 系列的 InoProShop排查思路完全通用。模拟量本身不神秘就是一路信号从传感器经过硬件、组态、程序、通讯最终变成屏幕上那个可信的数字。每个环节都验证到位项目自然顺利。