PLC模拟量编程核心:从4-20mA信号到工程量标定与线性换算 简介这份资料围绕PLC模拟量编程展开以S7-200系列EM235模拟量输入输出模块为核心面向刚接触模拟量处理、需要理清转换公式与硬件接线的PLC初学者。内容从温度变送器的不同输出信号入手对比4-20mA电流信号与0-5V电压信号在模块中对应的数字量关系逐步推导线性转换公式并给出整数运算与实数运算两种梯形图编程思路。同时针对4-20mA传感器的24V供电与250Ω取样电阻接线方式指出常见错误接法帮助规避硬件连接上的易错点。资源为1个doc格式文档大小698KB包含公式推导、接线示意与程序示例结构紧凑、可直接按步骤学习。目前已有94人学习适合电工、自动化专业学生或入门工程师作为模拟量编程的参考资料阅读后能独立完成常见模拟量采样的计算与模块接线。1. 模拟量编程的难点不在梯形图而在量程标定做 PLC 项目最容易卡住的往往不是开关量逻辑而是模拟量处理。接好一只 4-20mA 温度变送器AIW 读到一个数字量触摸屏上显示的温度却是乱的这时候去改梯形图通常没用真正要解决的是三件事数字量与工程量的换算公式、传感器与模块端子的接线方式、以及模块的量程配置。这套实例以 S7-200 的 EM235 模拟量输入输出模块为主线把三种输出信号不同、量程各异的传感器逐一推导公式再落到整数运算与实数运算的梯形图实现最后用蒸汽加热电动阀的分级控制收尾。适合刚接触模拟量模块、想把“数字量 → 工程量”标定逻辑彻底搞清楚的 PLC 编程初学者也适合需要现场快速排查模拟量显示异常的自动化调试人员。2. 三种传感器与 EM235 的线性标定公式不是背出来的2.1 模拟量转换的本质是直线方程无论传感器输出 4-20mA 还是 0-5V进了 EM235 之后都要先变成数字量再把数字量换算成我们看得懂的工程量。这一步本质上就是一个一次函数工程量 数字量 × 斜率 偏置所以别去死记公式只要把量程两端对应的数字量写清楚方程自己就出来了。EM235 的 A/D 转换器是 12 位精度但 CPU 按左对齐格式读到的满量程是 32000不是 4096。也就是说 20mA 对应数字量 320004mA 对应数字量 64000-5V 电压输入则对应 0 到 32000 的完整区间。这套约定是后面所有推导的基准也是初学者最容易忽略的部分。为什么电流信号不从 0 开始映射因为 4mA 是仪表活零点电流低于 3.6mA 时可以判断为断线。如果把 0mA 作为工程量零点断线时数值会变成负数或者直接跳零现场就很难区分“真实零值”和“信号丢失”。这个偏置是故意留出来的安全余量编程时不要去把它“修正”掉。2.2 三种传感器的映射表与公式推导文档里给出的三只温度传感器正好覆盖了两种信号形式和三种量程组合。先把映射关系列成一张表公式就是从这个表里解出来的。变送器测温范围输出信号数字量下限数字量上限换算公式10 ~ 200℃4 ~ 20mA640032000T (AIW - 6400) / 12820 ~ 200℃0 ~ 5V032000T AIW / 1603-100 ~ 500℃4 ~ 20mA640032000T (AIW - 6400) × 600 / 25600 - 10025600 32000 - 6400这是 4-20mA 信号在整个模拟量输入区间内对应的数字量跨度。变送器 1 的量程跨度是 200℃那么每一码数字量对应 200 / 25600 0.0078125℃写成整数友好的形式就是除以 128。变送器 2 的量程跨度同样是 200℃但电压信号从 0V 开始数字量没有偏置斜率是 200 / 32000 1 / 160。变送器 3 的量程跨度是 600℃公式里先按比例算出相对量程起点的偏移再减去 100℃ 的零点。2.3 公式里的陷阱整数除法的精度问题如果直接用梯形图做除法200 / 25600 在整数运算里结果是 0整个公式直接失效。所以整数运算必须先把公式化简成除法友好的形式比如变送器 1 化简成 (AIW - 6400) / 128。这样做的代价是量化误差被放大到 1℃ 左右显示分辨率是整数度。要求高的时候必须走实数运算CPU 直接算 200.0 / 25600.0结果保留小数触摸屏上就能显示 120.5℃ 这样的值。S7-200 的 CPU 本身支持实数运算只是比整数运算多占几个扫描周期。模拟量通道数量少的时候这个开销完全可以忽略所以我的习惯是除了一路转速显示这种粗读数其余压力、温度全部用实数运算。2.4 用脚本复算标定系数转换公式写进 PLC 之前先用 Python 把映射关系验算一遍能省掉不少现场改程序的麻烦。下面的函数只有一行核心算式代入任意 AIW 原始值就能得到工程量。def line_map(aiw, raw_lo, raw_hi, eng_lo, eng_hi): # aiw: 模块读到的数字量 # raw_lo / raw_hi: 量程两端对应的数字量 # 电流输入时 4mA 对应 6400, 20mA 对应 32000 # eng_lo / eng_hi: 工程量下限和上限 return (aiw - raw_lo) * (eng_hi - eng_lo) / (raw_hi - raw_lo) eng_lo # 变送器 1: 0~200℃, 4~20mA print(line_map(21760, 6400, 32000, 0, 200)) # 120.0 ℃ # 变送器 2: 0~200℃, 0~5V print(line_map(16000, 0, 32000, 0, 200)) # 100.0 ℃ # 变送器 3: -100~500℃, 4~20mA print(line_map(21760, 6400, 32000, -100, 500)) # 260.0 ℃这个函数把线性标定的四个要素全部列成了参数数字量下限、数字量上限、工程量下限、工程量上限。改传感器量程的时候只需要换 eng_lo 和 eng_hi公式主体不用动。21760 这个值刚好是 120℃ 在 4-20mA 信号下对应的数字量拿来当自检数据非常合适。3. 硬件接线与模块配置RA 端子的角色决定成败3.1 两线制 4-20mA 变送器的标准接法模拟量显示不对一半以上的原因出在接线而不是程序。EM235 的第一路模拟输入有 RA、A、A- 三个端子其中 RA 和 A- 之间并接了一只 250Ω 标准电阻。A/D 转换器本身只接受 0-5V 电压信号4-20mA 电流必须流过这只电阻、在电阻上建立 1-5V 电压才有可能被正确采样。两线制 4-20mA 变送器只有正负两根线需要外接 24V 电源才能工作。正确的连法是变送器正极接 24V 电源正极变送器负极接 RA 端子RA 与 A 并接24V 电源负极接 A- 端子。这样变送器输出的 4-20mA 电流从 RA 流入 250Ω 电阻在 A 与 A- 之间形成 1-5V 电压模块才能读到正确的数字量。常见错误有两种。一种是把变送器负极直接接到 A电流没有经过 RA 和 250Ω 电阻A/D 输入悬空读数要么是 0 要么随机跳变。另一种是从 24V 电源正极处断开去接模块的信号输入端这样整个回路没有电流模块根本不会工作甚至可能损坏输入通道。记住一个原则24V 正极只给变送器供电信号负端必须走 RA。3.2 0-5V 电压型变送器的接法电压输出的变送器不需要 250Ω 电阻参与采样接线要简单得多。变送器输出正极接 A输出负极接 A-RA 端子悬空不接。同时把模块输入模式拨到 0-5V 电压档让 A/D 转换器直接读取变送器给出的电压信号。这里有一个容易弄混的点4-20mA 模式下 RA 和 A- 之间并着 250Ω 电阻电压模式下这只电阻被旁路不用所以 RA 必须空着。如果把电压信号也接到 RA 上相当于给信号源并联了一个电阻电压会被拉低显示值整体偏低。现场换传感器类型时最容易在这个端子上踩坑。3.3 上电后先看原始值验证程序与常见故障表接线完成、程序还没写换算逻辑之前最好先做一次原始值验证。把 AIW 的值原样搬到 VW 区在编程软件的状态表里监控这个 VW就知道传感器和模块这一级有没有通。// 原始值监控程序不改换算先确认通道是否正常 Network 1 // 把 4 路 AIW 原始值搬到 VW 区域 LD SM0.0 MOVW AIW0, VW600 // 第一路原始值 - VW600 MOVW AIW2, VW602 // 第二路原始值 - VW602 MOVW AIW4, VW604 // 第三路原始值 - VW604 MOVW AIW6, VW606 // 第四路原始值 - VW606程序并不复杂只是把每个扫描周期读到的 A/D 结果放到监控区方便在状态表里观察。正常情况下把变送器输出调到量程 0% 时 VW600 应该在 6400 附近调到 100% 时应该在 32000 附近。如果差值明显偏小比如 20mA 时只能读到 25000先怀疑模块量程档或传感器供电而不是程序。屏蔽层处理是模拟量现场最容易被忽略的细节。屏蔽层应单端接地接到 PLC 的 0V 或者保护地不能两端都接否则屏蔽层会形成地环路反而把干扰引进信号回路。下面这张表列了三种最常见的接线异常现象和排查方向比对着查比盲试快得多。现象可能原因排查方向原始值固定在 0 或随机跳变电流信号未经过 RA检查 RA/A 并接与电源共地量程两端读数整体偏低电压信号误接 RA 端RA 悬空信号改接 A读数随电机启停波动屏蔽层未接或两端接地屏蔽层单端接 0V/PE20mA 对应读数不足 32000模块拨码量程档不对按 EM235 侧面印刷表重设3.4 拨码开关与量程档位EM235 侧面的 DIP 拨码开关决定输入信号类型和量程。把模块拨到 0-20mA 电流模式4-20mA 信号在这个档位下自然落在 6400 到 32000 区间。如果是 0-5V 电压传感器要单独拨到对应的电压档。这里没有统一的开关位序因为不同批次模块的丝印定义不一样我每次接线前都会先打开模块侧面的印刷表对着确认一遍拨完码再给模块断电重启一次确保新量程生效。4. 功能块复用整数与实数标定子程序的实现4.1 什么时候用整数什么时候用实数文档里的设备一共有四路模拟量输入真空压力 0-0.1MPa、蒸汽压力 0-1.0MPa、温度 0-200℃、电机转速 0-50 转/秒输出一路 4-20mA 去控制电动阀。四路输入里的压力值和温度值需要送到触摸屏显示并参与温度控制实数运算是更合适的选择。转速只做显示不参与闭环调节整数运算就够用了。4.2 实数运算功能块的 STL 实现把 4-20mA 信号换算成工程量的公式可以统一成同一个运算骨架先减 6400 去掉活零点乘以工程跨度再除以 25600 电流区间最后加上工程量下限。把这个骨架做成子程序不同物理量只是参数不同。// SBR_0 实数标定功能块AIW 原始值 - 工程量实数 // 入口: AIW0 为当前通道原始值, VD0 存放计算结果 // 说明: 量程上下限通过 L 区参数传入, 此处以 0~200℃ 为例 Network 1 // 原始数字量转实数并去零点偏置 LD SM0.0 ITD AIW0, AC0 // 16 位整数 - 32 位双整数 DTR AC0, AC0 // 双整数 - 实数 -R 6400.0, AC0 // 减去 4mA 对应数字量 Network 2 // 线性比例换算 *R 200.0, AC0 // 乘以工程量跨度 200℃ /R 25600.0, AC0 // 除以电流区间 32000-6400 R 0.0, AC0 // 加上工程量下限 MOVR AC0, VD0 // 结果写入显示变量ITD 和 DTR 两步是 S7-200 整数转实数的固定套路缺一不可。AIW 读进来是 16 位有符号整数必须先变成 32 位双整数再转成实数不能直接做减法。减 6400 是为了把活零点移到坐标原点。乘以工程跨度、除以电流区间这一步就是直线方程里的斜率。最后加上工程量下限像 -100℃ 这种负起点量程就在这里处理。4.3 整数运算功能块的写法以温度传感器为例公式被化简成 (AIW - 6400) / 128把除法除数变成 128 之后整数运算就不会因为整除而丢失全部精度。对应 STL 程序是这样的。// SBR_1 整数标定功能块AIW 原始值 - 温度整数 // 适用: 0~200℃ 温度变送器, 4~20mA Network 1 // 判断有效范围: AIW 小于 6400 时按 0 处理 LDW AIW0, 6400 MOVW AIW0, AC0 // 原始值送入 AC0 -I 6400, AC0 // 减去 4mA 偏置 /I 128, AC0 // 除以温度系数, 12825600/200 MOVW AC0, VW8 // 温度结果送显示变量这段程序的特点是不做溢出保护会有点风险但我实际用下来发现配合 AIW 本身的范围限制问题不大。减法之前先做一次 6400 的下限判断避免断线时 AIW 掉到 0、减出负数导致显示异常。-I 和 /I 操作的是 16 位整数所以 VW8 里存的就是 0 到 200 之间的整数温度值触摸屏直接读取显示即可。4.4 四路通道的轮询调用设计四路模拟量不可能每个扫描周期都做一次完整的实数转换文档里给出的思路是用 MB0 做轮询计数器每个扫描周期加一在 0 到 3 之间循环每次只处理当前对应的那一路。这种做法的好处是程序结构紧凑四路共用一个功能块维护时只需要改参数表。通道显示变量数据类型工程量范围功能块1 真空压力VD0实数0 ~ 0.1 MPaSBR_02 蒸汽压力VD4实数0 ~ 1.0 MPaSBR_03 蒸汽温度VW8整数0 ~ 200℃SBR_14 电机转速VW10整数0 ~ 50 转/秒SBR_1— 温度设定VW12整数0 ~ 200℃触摸屏写入用这种方式组织程序之后新增一路传感器只需要在轮询表里加一个分支功能块本身完全不用动。注意 VW8 存整数温度、VD0 存实数压力两种类型在触摸屏上访问时占用地址长度不同变量表里不能混淆。如果项目用的是 200 SMART 平台还可以直接用系统自带的 Scale_Int_to_Real 库指令替代手写功能块做法是把 AIW、上下限、工程量上下限填进库管脚输出端子直接给 VD 地址省去自己搭 STL 的步骤。5. 渐近比较法蒸汽加热电动阀的分级开度控制5.1 六档阀位表与数字量换算温度控制没有采用 PID而是用渐近比较法把阀门开度按温差分成了六档。温差大时全开快速升温接近设定温度时逐级关小防止过冲。AQW0 是模拟量输出字模块按 0-20mA 输出对应数字量 0-32000阀门按 4-20mA 线性动作所以输出数字量和阀门开度之间的关系是 AQW0 6400 25600 × α。温差阀门开度AQW0 数字量输出电流≥ 10℃100% 全开3200020mA7 ~ 10℃75% 开2560016mA4 ~ 7℃50% 开1920012mA2 ~ 4℃25% 开128008mA1 ~ 2℃12.5% 开96006mA≤ 0℃关闭64004mA设定温度同样要换算成数字量再参与比较。120℃ 对应的数字量是 6400 120 × 128 21760这个值可以直接作为比较器的基准点也可以在做减法之前先把 VW12 设定值乘 128。前者更直观后者更省运算。5.2 STL 分档程序实现用整数比较来做温差分档程序清晰而且不占浮点资源。先算出温差存入 VW20再逐级比较输出不同的 AQW0 数字量。// 温差计算: VW12 设定温度 - VW8 当前温度 VW20 Network 1 LD SM0.0 MOVW VW12, VW20 -I VW8, VW20 // 温差 10℃, 阀门全开 Network 2 LDW VW20, 10 MOVW 32000, AQW0 // 温差 7 并且 10, 阀门开 3/4 Network 3 LDW VW20, 7 AW VW20, 10 MOVW 25600, AQW0 // 温差 4 并且 7, 阀门开 1/2 Network 4 LDW VW20, 4 AW VW20, 7 MOVW 19200, AQW0 // 温差 2 并且 4, 阀门开 1/4 Network 5 LDW VW20, 2 AW VW20, 4 MOVW 12800, AQW0 // 温差 1 并且 2, 阀门开 1/8 Network 6 LDW VW20, 1 AW VW20, 2 MOVW 9600, AQW0 // 温差 0, 阀门关闭 Network 7 LDW VW20, 0 MOVW 6400, AQW0渐近比较的每一句都对应一张分档表里的区间判断。AW 是“与上个区间下限做逻辑与”的意思把比较范围限定在 [7, 10) 之间上一档已经处理掉了 ≥10 的情况两个条件叠加就不重不漏。如果现场温度波动频繁可以把最后一档 12.5% 开度的投入条件从 1℃ 改成 2℃关阀死区放到 0.5℃ 左右这样能显著减少电动阀在小温差区间来回动作的次数。本文还有配套的精品资源点击获取