
刚入行那会儿我第一次用S7-1200接压力变送器被一个很简单的问题卡了一整个下午变送器明明输出4mA程序里却读到五千多而换成20mA又只有两万多跟手册上写的0到27648完全对不上。后来才明白问题出在量程类型和模块组态的对应关系上——这类事情S7-1200模拟量处理看似是个基础功能但真正在现场做起来从硬件选型、接线、模块测量类型设置到程序里的量程换算任何一个环节没搞定数据就是不对。这篇东西我就围绕S7-1200模拟量这个话题把从硬件到程序的完整链路拆开来讲适合刚开始接触S7-1200模拟量采集的调试工程师也在某些偏门的坑上帮老手回忆一下。1. S7-1200模拟量链路拆解一件看似简单却容易翻车的“小事”1.1 从传感器到PLC程序模拟量信号走了一条怎样的路很多人以为模拟量处理就是把变送器两根线接到模块上然后在程序里读个地址就行。实际上一路信号从现场到PLC程序里变成能用的工程值要经过传感器变送、信号传输、模块采集、A/D转换、量程换算这几个环节每一个环节都有它的脾气。现场的温度、压力、液位这些物理量先由传感器变成微弱的电信号再由变送器放大成标准的电压或电流信号。S7-1200本身的CPU不认识温度是多少度也不认识压力是多少兆帕它只能通过模拟量输入模块把标准的4-20mA电流或0-10V电压转换成整型数字量这个过程叫A/D转换。转换出来的原始值在程序里还要经过标准化和缩放才能变成我们熟悉的工程单位数值。理解这条链路很有用。比如排查数据跳变时你要能判断问题出在变送器、线缆屏蔽、模块通道还是程序处理上而不是一上来就改程序滤波参数。我在现场处理类似问题时习惯先拿万用表量变送器输出电流再在模块监控表里看原始值最后才看程序里的工程量这样能把故障范围一步缩小。1.2 S7-1200模块化组成架构与模拟量采集任务的选型关系S7-1200的模块化组成架构大家都熟悉CPU本体加信号板、信号模块、通信模块一层层叠起来。做模拟量采集时你先得想清楚用CPU自带的集成AI还是加一块SM1231模拟量输入模块或者用模拟量信号板SB1231。这个选择很讲究。小型CPU比如CPU 1211C、1212C自带少量集成AI适合点数少、精度要求一般的场景能省一个模块的钱和柜内空间。但如果点数超过CPU集成的模拟量通道数比如要采集4路以上模拟量就需要在CPU左侧扩展SM1231模块。SM1231有4通道、8通道版本输入类型根据型号不同支持电压、电流、RTD热电阻、热电偶。另外还有个思路是信号板SB1231它插在CPU正面那个扩展槽里不占左侧模块位置。我之前做一个紧凑型设备柜子空间特别小CPU本体加一块SB 1231两路模拟量输入刚好满足两个温度采集点省了不少事。选型时还要考虑分辨率集成AI一般13位SM1231根据型号有12位到16位不等精度要求高的场合要尽量选高分辨率版本。2. 硬件选型与测量类型先把底子打对2.1 模拟量输入模块怎么选通道数、精度、隔离模拟量模块选型我一般按三个维度看通道数、精度、隔离方式。通道数很好理解你现场有4个压力变送器要采集那至少选4通道最好预留一两路备用通道。SM1231系列常见的有AI 4x13bit、AI 8x13bit还有AI 4x16bit这类高精度版本。通道数不是越多越好因为模块精度和通道数限制有关系而且多出的通道也是要花钱的。精度要结合测量对象来说。普通的液位、压力控制13位分辨率完全够用但如果是高精度称重、精密温度控制就要上16位分辨率的模块。选型时如果实在拿不准记住一个原则被测信号的满量程值越小、控制要求越苛刻精度等级就要越高。隔离方式容易被忽视。SM1231输入和系统电源之间做了隔离处理能给信号链路易受干扰的场合多一道保护。电气环境复杂的现场比如有大功率变频器、电机频繁启停的柜子我建议优先选带隔离或者有良好共模抑制能力的模块否则后期处理干扰问题很头疼。2.2 模拟量输入模块的测量类型电压、电流、RTD、热电偶模拟量输入模块的测量类型这个点是新手特别容易踩坑的地方。S7-1200的SM1231模块分为几类电压/电流输入型、RTD热电阻输入型、热电偶输入型每种模块支持的测量范围完全不同。电压/电流型SM1231支持0-10V、0-20mA、4-20mA等常见量程并且每个通道可以单独设置测量范围不是8个通道绑定死一个量程。这点很方便比如通道0接4-20mA压力变送器通道1接0-10V液位计只要模块支持混合类型就可以各设各的。RTD模块专门接热电阻常见的是PT100、PT1000支持两线制、三线制、四线制接法。三线制和四线制能消除导线电阻引入的误差所以长距离测温我强烈建议不要为省一根线用两线制尤其导线比较细的情况下测出来的温度能差好几度。热电偶模块接K型、J型等热电偶自带冷端补偿功能接线时注意补偿导线类型要和热电偶匹配。2.3 接线与供电屏蔽层怎么接、共地还是隔离接线这块是模拟量信号质量的生命线。先说供电现场两线制变送器用得多它的供电和信号共用两根线电源正极接变送器正端变送器负端输出4-20mA接到模块的AI通道模块侧还有个公共端子负责回路回流。市面上有两线制、三线制、四线制变送器接法略有区别但核心就是把信号电流正确地串进模块测量回路。屏蔽是另一个让人纠结的事。模拟量信号线一定要用屏蔽双绞线屏蔽层单端接地一般接到柜内的接地排或者模块的接地端子。如果屏蔽层两端都接地大地上电位差会在屏蔽层形成环流反而干扰信号。我在现场多次遇到过信号波动问题最后都是屏蔽层两端接地导致的地环路改一端接地立刻就好。还有一个是浮地与共地问题。如果PLC和变送器供电来自不同开关电源两者之间可能存在电位差极端情况下模拟量模块会有共模电压超限告警。这时候要么把电源M端连起来共地要么用带隔离的模块。实际组柜时我习惯把24V电源的0V统一接到接地排上避免各个设备之间地电位漂移。3. 从原始值到工程量NORM_X与SCALE_X的底层逻辑3.1 为什么4-20mA是工控模拟量的“通用语言”你可能好奇为什么工业现场普遍用4-20mA而不是0-20mA或者直接用电压信号。4-20mA最大的优势是自带故障诊断能力4mA对应量程零点20mA对应量程满点如果信号低于4mA甚至变成0mA说明线路断了或者变送器故障了系统能立即识别。而0-20mA的话0mA和断线没法区分。从传输角度讲电流信号比电压信号抗干扰能力强得多。电压信号在长线传输时会因为导线电阻产生压降接收端电压变低电流信号则不管导线电阻如何只要回路不中断电流值就不变。这也是为什么压力变送器、温度变送器这类需要远距离传输的仪表几乎清一色是两线制4-20mA输出。再说供电。两线制4-20mA变送器利用4mA的底电流给自身电路供电20mA上限也限制了功耗这种供电方式让变送器在危险场合也能实现本安设计。理解了这些你就明白为什么做模拟量采集时模块默认测量类型常是4-20mA而不是其他量程。3.2 S7-1200的A/D转换与原始值范围S7-1200模拟量输入模块把4-20mA或0-10V信号转换成整型数这个整型数值有固定范围。以13位分辨率的模块为例4-20mA对应的原始值范围是0到276480-10V对应的原始值范围也是0到27648。27648这个数字看着奇怪实际上它是十六进制0x6C00也就是十进制27648是西门子系列模拟量转换的标准满量程值。这个原始值范围要记牢尤其是做程序换算时。有人会把20mA对应的原始值当成32000或者65535那是别的品牌PLC的习惯放在S7-1200上数值会整体偏大工程值自然不对。我在第一章开头提到的那个案例就是因为我默认把模拟量量程当成了0到32000模块实际输出0到27648换算出来压力值比实际低了不少。还有一个细节4-20mA对应0到27648但0-20mA对应的是0到27648就稍有不同4-20mA时低于4mA的电流会被线性映射到负值范围因为模块在量程下限之下仍会给出低于0的数值用于诊断断线或超下限。所以你在监控表里看到负值不一定是模块坏可能是实际电流真的低于4mA。3.3 标准化指令实操用压力变送器案例把换算讲透TIA Portal里做模拟量换算标准做法是用NORM_X标准化指令加SCALE_X缩放指令。NORM_X把整型原始值映射到0.0到1.0之间的浮点数SCALE_X再把这个0.0到1.0的值映射到工程量程范围内。以量程0到1.6MPa的压力变送器、输出4-20mA、接入S7-1200模拟量通道IW64为例。程序里这样处理先用NORM_X指令输入值是IW64的原始整型MIN设为0MAX设为27648得到的输出是一个0.0到1.0之间的REAL。再用SCALE_X指令输入接NORM_X的输出MIN设为0.0MAX设为1.6输出就是压力工程值单位MPa。这两个指令用起来非常直接比我以前在S7-200 SMART里自己写浮点运算方便太多。说到这儿顺便提一下200smart模拟量库早期做200 SMART项目时大家都会用官方库或者自己封装FC来换算模拟量现在TIA Portal里有了NORM_X和SCALE_X换算逻辑可视化了这对调试和后期维护来说都是个巨大的提升。实际编程时要注意SCALE_X输出建议用REAL浮点数不要用整型否则1.6MPa量程下每0.1MPa的精度都会在取整时丢失。如果你的触摸屏或上位机坚持要INT也是先算成REAL再取整不要用SCALE_X输出的整型档。3.4 整数、浮点数与精度损失数据类型的坑模拟量数据在模块里是INT整型但程序处理最好尽早转成REAL浮点数。一个13位分辨率的模块满量程27648如果压力量程是0到1.6MPa每个原始值对应的压力变化大约是0.000058MPa精度已经很高了。但如果你全程用INT运算除法会取整最后显示值只能到0.01MPa中间还会出现数值跳变。另外注意NORM_X和SCALE_X的MIN、MAX参数类型要和输入输出数据类型匹配。NORM_X的输入是INT但MIN和MAX在TIA Portal里可以写成REAL常数SCALE_X的MIN和MAX则建议写REAL比如0.0和1.6不要写0和1否则某些PLC固件版本会隐式转换出问题。在1200里写数据块时我习惯把模拟量工程值统一存成REALHMI读取时直接显示REAL值需要报警比较时也用REAL做比较这样全链路精度有保障。数据快里还可以存一个标定量程上限和下限的变量方便现场改量程时不用改程序直接改数据块里的参数就行。4. 完整落地实操一个压力变送器从组态到出数4.1 硬件组态与通道参数设置假设我们手上有一个S7-1200项目CPU是1214C DC/DC/DC左侧挂了一块SM1231 AI 4x13bit模块现场接一个量程0到1.6MPa、输出4-20mA的压力变送器要做的就是把压力值实时读上来并在HMI上显示。打开TIA Portal新建项目添加CPU 1214C然后在左侧硬件目录里找到AI模块拖到CPU左侧插槽0分配好模块型号。双击模块进入属性窗口把通道0的测量类型选择为“电流”测量范围选择“4-20mA”。每个通道的测量类型和范围要逐个确认这一步漏了后面肯定出问题。模块组态里还有一个“平滑化”参数选项对应软件滤波等级无、低、中、高。默认是“无”。如果现场信号本身比较干净建议保持默认“无”让信号响应最快如果现场有轻微干扰、数值有微小波动可以选择“低”或“中”。不要一上来就选“高”滤波等级越高信号越平滑但响应越慢PID调节这类实时性要求高的场合会吃亏。4.2 接线二线制变送器与SM1231的接线确认好模块组态后现场接线。二线制压力变送器有三根端子或者两根线本质上是两根线完成供电和信号传输一根接24V电源正一根作为信号输出接到SM1231的AI通道输入端。SM1231的通道端子一般有三个AI信号正、AI信号负、还有模块内部的公共端或MANA端子。具体接法24V开关电源正极接到变送器的电源正端变送器的信号负端接到模块AI通道的端子模块AI通道的-端子与模块的MANA电位参考端短接MANA再和开关电源的0V连通。这样电流信号就能从模块的端子流入、-端子流出形成完整回路模块在回路中采样电流大小。接线要点是供电和信号不要接反。有些变送器明确标注了“”和“-”有的还带接地端子。接好线后先用万用表直流电流档串在信号回路里量一下电流看看在无压力或者现场压力正常情况下输出是否在4到20mA之间确定变送器工作正常再上电进组态监控。4.3 程序编写与模拟量处理指令调用打开程序块OB1从右侧指令树里找到“基本指令”里的NORM_X指令拖到程序段中。NORM_X的输入数据类型选择INT将AI通道的地址IW64填到输入引脚。MIN填0MAX填27648这样原始值0对应0.0原始值27648对应1.0。接着拖入SCALE_X指令类型选择REAL。输入引脚接NORM_X的输出MIN填0.0MAX填1.6输出引脚给到一个数据块里的压力变量比如DB1.Pressure_MPa。这样程序里的压力值就是浮点型的兆帕数值了。如果你还想在HMI上显示压力历史趋势或者做上下限报警直接用DB1.Pressure_MPa和报警设定值比较即可。还应该加一个断线诊断当IW64的原始值小于某个阈值比如小于200时认为信号低于4mA太多寄存器里放一个断线故障标志位HMI上弹出报警。这些逻辑可以在OB1里继续写或者建FC单独处理模拟量换算和诊断保持代码整洁。4.4 仿真、下载与标定验证程序写好后先把项目编译一下确保无语法错误。TIA Portal支持PLCSIM软件仿真但模拟量通道在仿真器里不能真实采集硬件信号一般只能手动给IW64赋值来验证程序换算逻辑。比如给IW64赋27648看DB1.Pressure_MPa是不是1.6赋0看是不是0赋13824理论上约等于0.8MPa。真实调试时把程序下载到PLC确认模块在线打开“监控与强制表”或设备组态里的“在线诊断”查看AI通道原始值。然后在变送器根部用手操器或信号发生器输入指定电流值比如给4mA、12mA、20mA观察程序里DB1.Pressure_MPa是否对应显示0、0.8、1.6MPa。这个过程就是标定验证的核心一般做三点校验比较稳妥。没有信号发生器的话也可以用高精度电阻箱串在回路里配合稳压电源模拟或用变送器实际加压来验证。现场标定要注意变送器量程4-20mA对应的工程值在铭牌上都有标注标定时不要让压力超过量程上限避免损伤变送器。5. 常见问题与排查技巧实录我踩过的那些坑5.1 数值跳变、波动大的排查套路模拟量数值跳变大第一反应不要急着加滤波器。先用万用表在通道输入端量电流如果电流本身稳定而程序里数值抖动说明问题在模块采集侧或者干扰耦合如果电流本身就波动那问题在变送器或现场工艺压力本身波动。排查顺序我一般是这样先看供电电源是否稳定开关电源功率不足或者电压纹波大会让变送器输出不稳再看信号线是否和动力线并行布线现场变频器出线、电机电缆离模拟量信号线太近会产生严重干扰最好分开走线槽或改用屏蔽线接着看屏蔽层接地是否规范单端接地还是两端接地最后再考虑在组态里加软件滤波或外部硬件滤波器。另外S7-1200的模拟量输入通道如果出现较大共模干扰可以把AI通道的-端和MANA的接线检查一遍确认没有虚接。曾经有个项目数值总是周期性跳变查了三天最后发现是信号线经过端子排时端子松动导致接触电阻变化拧紧后立刻恢复正常。5.2 读数固定在0或满量程的几种情况读数永远为0可能原因有好几种。第一是模块通道没有组态通道默认未启用或者地址没有分配程序里引用的是错误地址第二是信号根本没进PLC万用表量变送器输出如果电流为0多半是变送器没工作检查供电第三是信号线断路或者接反电流信号接反了模块读到的值会很怪甚至为负。读数满量程或接近27648但不变化通常是通道测量范围设置错误。比如实际接的是0-10V信号但通道组态成了4-20mA或者在4-20mA量程下信号只给了12mA却读到接近满量程很可能是通道被设置成了0-20mA。还有一种是变送器输出短路电流异常偏大也会让数值顶到上限。遇到这种现象我建议直接在模块属性里把通道测量类型和范围重新选定对照变送器铭牌或信号类型逐一确认。别相信“以前也是这么接的”很多现场问题就是在反复改接线、改组态的过程中搞出来的。5.3 数值整体偏大或偏小量程与标定问题如果4mA对应020mA对应满量程但中间值比如12mA时换算出来的工程值偏大或偏小这是典型的变送器标定或者模块增益误差问题。先做两点式验证给4mA看是否显示量程下限给20mA看是否显示量程上限如果两头准中间偏那是变送器非线性需要带回仪表标定。如果两头都有一个固定偏差比如4mA显示0.02MPa而不是020mA显示1.62MPa而不是1.6就要看程序SCALE_X的MIN和MAX是否跟变送器量程一致。MIN应该是对应4mA的工程值而不是简单写0。如果变送器量程是-0.1到1.5MPaMIN就应该是-0.1写0就偏了。另外模块内部有偏移校准功能吗S7-1200大部分模块不支持用户在线修改增益和零漂但有条件的话可以通过“模拟量输入校准”功能在模块属性里微调或者直接在程序里对转换结果做二次修正——工程上常用“量程两端标定后加一个修正系数”的方式用两点实际值和理论值比算出gain和offset嵌入程序。5.4 模拟量故障排查速查表我把平时排查模拟量问题用到的方法整理成了下面的表格很实用基本按这个顺序走一遍绝大多数问题都能定位。现象可能原因排查方向数值为0通道未组态/地址错检查模块属性、程序变量地址数值为0变送器无输出万用表量回路电流、检查供电数值为0信号线断路/接反检查接线端子、信号极性数值接近满量程测量类型设置错误核对4-20mA、0-20mA或电压量程数值波动大供电不稳检查电源模块电压和纹波数值波动大干扰耦合检查屏蔽层、走线槽距离数值波动大连接端子松动逐一拧紧端子排和模块端子数值整体偏差量程MIN/MAX设置错误对照变送器铭牌核对程序参数数值整体偏差变送器零漂/增益异常两点标定、返厂校准数值缓慢漂移环境温度影响检查变送器温度指标与现场工况数值偶尔跳0供电瞬断查24V电源和断路器、端子接触5.5 关联场景顺起逆停与Modbus TCP轮询中的模拟量最后聊两个和模拟量相关的高频应用场景一个是顺起逆停一个是Modbus TCP轮询。顺起逆停常见于多台设备的顺序控制比如多台水泵根据液位自动启停。这种控制如果只看开关量逻辑很简单但实际工程中往往要结合模拟量液位值来决定顺序启动和顺序停止的条件。比如液位低于2米时启动第一台泵低于1米时启动第二台泵液位高于8米时停第二台高于9米时停第一台。这时模拟量处理的准确性直接影响设备启停时机液位值波动大就会造成泵频繁启停。我在做这类项目时通常会给模拟量做一定的阈值滞回或滤波比如液位低于2.0米启动高于2.3米才停止避免临界点抖动。S7-1200与4台Modbus TCP轮询则是一个更偏通信的场景。有些现场有多个带模拟量采集的仪表或从站设备S7-1200作为Modbus TCP客户端用MB_CLIENT指令轮询读取这些设备的模拟量寄存器值再把读回来的原始数据存到数据块里做统一换算和显示。轮询的关键是每个从站请求完成后要等MB_CLIENT的BUSY位变FALSE再发起下一个请求四个站按顺序轮流读。读回来的模拟量寄存器值可能是原始整型也可能是设备直接输出的工程值根据设备协议决定是否还需要做量程换算。这类场景里模拟量的“采集”和“通信”两条链路会同时存在排查问题时要注意区分是PLC模拟量模块的问题还是Modbus通信读取的问题。做S7-1200模拟量这块我个人的经验就是硬件底子打扎实接线屏蔽规范组态测量类型和实际信号一致程序里用NORM_X、SCALE_X做标准换算最后再用信号发生器做三点标定验证。按这个顺序来基本不会出大问题。真遇到古怪现象照着故障排查表逐项排查也能很快定位到根因。