做电气自动化这些年,我发现自己对模拟量的敬畏心是越来越高。数据线断了顶多通讯报警,模拟量一出问题,仪表显示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。如果因为断线、供电丢失导致电流跌到 0,PLC 立刻能判断"信号异常"。很多项目里我都是用这个特性做传感器断线报警,完全不用额外加硬件。
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 系列用的是 AutoShop,AM 系列用 InoProShop,两者组态思路类似。
在 AutoShop 里新建工程后,先添加 CPU 型号,再把扩展模块按实际顺序插入槽位。插入后双击模拟量模块,进入通道配置界面,能看到每一路输入的类型选择、量程选择、采样时间等参数。
这一环节最容易犯的错是:硬件组态里的模块顺序和实际安装顺序不一致。扩展模块槽位号如果差一位,后面程序里读取的通道地址就对不上,现场表现出来的现象很迷惑——通路数对,但读到的不是那一路传感器。
所以我的习惯是:组态完成后,在程序里先读一遍所有通道的原始值,看看都有没有反应,再对应到传感器上去。先把通道映射关系验证清楚,才往下做换算。
3.2 量程设置和码值映射表
模拟量模块的 A/D 转换结果通常是 16 位整数,但同样的 4-20mA,在不同品牌模块里映射的码值范围不一样。
以前用某进口 PLC 时,4-20mA 对应 0~27648,这是它的标准化体系。汇川模块我实际用过的有映射到 0~32767 的情况,也有某个模块量程范围对应 0~4000 的。具体以你手里模块手册里的分度表为准。
这里给一张通用对照表,方便理解换算原理:
| 信号类型 | 低端信号 | 高端信号 | 原始码值低端 | 原始码值高端 |
|---|---|---|---|---|
| 4-20mA | 4mA | 20mA | 0 | 32767 |
| 0-20mA | 0mA | 20mA | 0 | 32767 |
| 0-10V | 0V | 10V | 0 | 32767 |
组态时把量程选成和现场传感器一致,比如传感器是 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,排查思路完全通用。模拟量本身不神秘,就是一路信号从传感器经过硬件、组态、程序、通讯,最终变成屏幕上那个可信的数字。每个环节都验证到位,项目自然顺利。