ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

S7-1200模拟量测温全解析:从4-20mA信号到温度工程值的完整换算

S7-1200模拟量测温全解析:从4-20mA信号到温度工程值的完整换算 前阵子一个做设备维护的朋友找我说他们烘箱的温度显示老是不对换了传感器还是跳来跳去。我过去一看程序里直接把模拟量原始值除以10拿来当温度用了4-20mA的变送器下限5530的偏移量根本没处理。这其实是很多刚接触西门子S7-1200模拟量测温的人最容易卡住的地方——开关量程序看I点Q点很直观但模拟量信号进了PLC是一串数字怎么把这串数字变成有意义的温度值背后是一套完整的编程思路。这篇就用一个Pt100配4-20mA变送器的实例把从传感器选型、模块组态到程序换算的完整链路拆开讲清楚。适合刚学S7-1200不久、准备做模拟量采集但还没理清思路的工程师也适合那些已经把程序跑通但总觉得自己是抄来的、想彻底搞懂原理的人。文章里所有经验都来自实际调试不是理论推演照着做基本能一次跑通。1. 案例场景与信号链路先搞清楚温度怎么走进PLC很多人在写程序之前就急着打开博途拖指令这是最要命的。模拟量测温它不是写一段转换程序那么简单而是一条完整的信号链路传感器感知温度变送器把温度变成电流信号模块把电流信号变成数字程序再把数字换算回温度。这个链路上任何一环出了问题程序写得再漂亮都没用。1.1 传感器选型Pt100变送器方案不是唯一的解法做温度采集传感器选型是第一关。S7-1200项目里最常见的方案有三种各有各的适用场景方案传感器信号形式接线复杂度成本典型场景APt100 温度变送器4-20mA电流中中远距离传输、工业现场干扰大BPt100直接接RTD模块电阻信号低中近距离、柜内或设备本体测温C热电偶 变送器4-20mA电流中高高温测量超过Pt100适用范围本案例选的是方案APt100铂电阻配合一体化温度变送器输出4-20mA。为什么这么选两个原因。第一4-20mA电流信号在工业现场的传输距离优势非常明显。电流环不像电压信号传输线电阻不会引起信号衰减百米级别的距离完全没问题。你要是用板载AI读0-10V电压信号线稍微长一点压降就会让读数偏低现场排查起来非常头疼。第二温度变送器通常是和Pt100做成一体的直接装在测温探头接线盒里现场接线非常简洁就两根线出来抗干扰能力比直接引电阻信号好得多。有人会问直接用SM1231 RTD模块接Pt100不更省事吗确实程序里连变送器换算都不用管模块直接输出温度值。但RTD模块的成本比普通AI模块高不少而且如果现场探头距离控制柜几十米从探头到模块这段线上感应的干扰会让小信号失真。工业现场电磁环境复杂的时候4-20mA方案依然是更稳妥的选择。1.2 从变送器到模拟量模块两线制和四线制必须分清确定了4-20mA方案之后接线环节就开始出现第一个容易踩的坑温度变送器是两线制还是四线制。两线制的意思是这两根线既充当信号线又承担给变送器供电的功能。它需要从PLC模拟量模块这里获得回路供电所以模块组态的时候通道测量类型要选2线制变送器。四线制则是电源和信号完全分开两根线单独接24V电源给变送器供电另外两根线只传输4-20mA信号这时候模块组态要选4线制变送器。我一直跟身边的同事强调接线之前先看变送器铭牌或者看说明书上的接线图。两线制还是四线制选错了轻则信号完全不对重则电流回路异常导致读数始终偏大或偏小排查起来特别费时间。尤其是一些国产变送器端子标识不够清晰最可靠的办法就是用万用表测一下端子之间的电压如果两根线之间有24V左右的电压基本就是两线制模块在给回路供电如果信号端子之间量不到电压那大概率是四线制电源是外部单独供的。另外接线的线径和屏蔽也值得注意。模拟量信号线建议用屏蔽双绞线线径不要小于0.5平方太细了长距离传输时回路阻抗偏大会影响信号精度。屏蔽层怎么接我放在后面的调试避坑章节专门讲这里先提示一句屏蔽层不是随便一接就完事的接错了干扰更大。1.3 模块组态把通道设置成电流型4-20mAS7-1200的CPU比如1214C板载的模拟量输入通常是0-10V电压型的它读不了4-20mA电流信号。所以做电流型测温基本都要挂一块模拟量输入模块常见的是SM1231系列比如6ES7231-4HD32-0XB0这种4通道或8通道的AI模块。模块装好之后在博途的设备视图里双击AI模块打开属性面板逐通道设置测量类型。这里有三个地方要仔细第一测量类型选电流测量范围选4-20mA。模块默认测量类型可能是电压不改成电流的话模块读出来的原始值完全是乱的这个步骤漏掉的概率极高。第二根据变送器线制选择2线制变送器还是4线制变送器。大多数一体化温度变送器是两线制的但也有一体化带现场显示的表头是四线制一定要按照实际接线来选。第三留意模块的输入起始地址。这个地址是组态时自动分配的比如IW64、IW66这样每个通道占一个字。在设备视图里选中模块能看到每个通道对应的输入地址。这个地址后面写程序要用务必记下来。举个例子我用过一块4通道的SM1231组态后起始地址是IW64那么四路信号就对应IW64、IW66、IW68、IW70依次间隔两个字节。这种地址规律很规整但前提是前面没有其他模块占用了地址空间所以每次组态完都去模块信息里确认一下实际分配的地址不要凭经验猜。模块组态完毕、硬件接线无误这时候把程序下载进去在线监控IW64应该能看到一个0~27648之间的数字。这个数字就是后面所有程序处理的原点。2. 原始值的数字秘密为什么4mA对应5530而不是0组态完成之后你会发现一个很奇怪的现象变送器输出4mA对应温度下限0℃的时候PLC里读到的原始值不是0而是5530左右。很多初学者在这里就懵了为什么不是从0开始这其实是西门子模拟量模块一个非常统一的设计规则搞懂它编程思路就通了一大半。2.1 S7-1200模拟量模块的标准转换规则与27648的由来西门子S7-1200和S7-300/400的模拟量模块在处理模拟量信号时遵循同一个规范把满量程对应的模拟量信号映射到0到27648这个范围内的整数。27648这个数字不是随便定的它的十六进制是0x6C00。模拟量模块内部把信号转换成16位有符号整数理论上能表示-32768到32767但西门子只用其中0到27648这个区间来表示正常测量范围剩下的余量用来做什么呢做超量程的诊断和预警。比如信号高于满量程的117.59%、低于下限的-17.59%这些边界情况模块能区分出是正常测量还是已经超限这对系统级的故障诊断特别重要。具体到不同信号类型对应关系是这样的信号类型测量范围原始值范围0-10V0 ~ 10V0 ~ 276480-20mA0 ~ 20mA0 ~ 276484-20mA4 ~ 20mA5530 ~ 27648为什么4-20mA的起点是5530因为4mA是20mA的五分之一27648除以5等于5529.6取整就是5530。从这里也能看得出一个重要的换算逻辑4-20mA信号的原始值下限不是0而是5530。程序处理时如果把这个偏移量忽略掉温度显示就会从错误的起点开始算结果自然不对。2.2 手算工程量线性映射是模拟量编程的核心公式搞清楚了原始值的含义接下来就是这个案例里最核心的数学关系怎么把原始值转换成温度值。4-20mA变送器的输出电流和被测温度是线性关系而模块转换出来的原始值和电流也是线性关系所以原始值和温度之间同样是一个线性映射。通用的换算公式是当前温度 温度下限 (原始值 - 原始值下限) ÷ (原始值上限 - 原始值下限) × (温度上限 - 温度下限)拿本案例来说假设变送器量程是0到150℃那么温度下限0温度上限150原始值下限5530原始值上限27648。公式变成当前温度 0 (原始值 - 5530) ÷ (27648 - 5530) × 150这个公式你可以手算几组数据感受一下电流(mA)原始值计算温度(℃)45530081105937.51216589751622118112.52027648150我建议在读程序之前先拿笔把这张表算一遍算完你就会发现12mA正好对应75℃8mA对应37.5℃整个映射关系在脑子里就立体起来了。后面调试的时候用万用表量出电流再对照这张表去验证程序输出问题出在哪一环立刻就能定位。这个手算的习惯是我自己调试模拟量最常用的方法比盲目改程序参数高效得多。2.3 为什么选4-20mA而不选0-20mA活零点让断线检测成为可能在工业现场4-20mA信号制式之所以成为绝对主流有一个0-20mA做不到的优势它有活零点。4mA这个起点意味着只要信号回路是正常的电流至少是4mA以上。如果回路断了、变送器掉电了、或者传感器损坏了电流会直接跌到0mA。这个特征让系统的故障诊断变得非常方便——程序里只要判断原始值是否明显低于5530比如小于2500就可以认定信号链路异常从而触发断线报警。相比之下0-20mA信号在测量接近下限的时候电流本来就接近0mA一旦出现断线故障你根本分不清是正常测温到下限还是线路断了。这也是为什么温度变送器几乎全部采用4-20mA输出的原因。这个活零点特性在本案例的程序设计里会被直接利用后面讲断线检测的时候会用到。现在先记住一个结论看到4-20mA程序里的原始值下限定5530同时要预留断线判断逻辑。3. 编程思路拆解NORM_X和SCALE_X的组合应用前两节把硬件和信号关系搞清楚了现在终于可以打开博途写程序。先说一个总的原则程序不是一上来就拖指令块而是先想清楚这个通道需要哪些变量、需要做哪几件事再动手。模拟量程序虽然短但该有的结构一步都不能少。3.1 先规划变量再写代码温度信息用结构体管理很多初学者喜欢直接在OB1里用M区变量写到哪算哪。通道少的时候确实能跑但一旦设备有七八个温度测点程序就会变成一团乱麻排查故障的时候痛不欲生。我建议的做法是建一个独立的数据块专门存放所有温度通道的信息。以本案例为例数据块命名为DB_Temperature里面至少包含这几类变量变量名数据类型用途RawValueInt模拟量模块读取到的原始值TempValueReal换算后的实际温度单位℃WireBreakBool断线/信号异常报警标志TempAlarmBool温度超限报警标志如果通道多可以把这些变量定义成结构体数组比如Channel[0]到Channel[7]每个元素里包含上面这些字段。这样HMI画面上做温控曲线、报警列表的时候标签直接关联到数据块的对应元素变量管理极其清晰。我在实际项目中见过一种特别好的习惯数据块里的温度值统一用Real浮点数不要用Int。因为Int只能存整数温度小数点后面的波动会全部丢失HMI上显示出来就是台阶状的跳变非常难看。而Real类型在博途里做运算也方便不用反复转换。3.2 标准转换链路原始值先归一化再映射到工程量博途里做模拟量换算最标准、最不容易出错的写法是用两条指令NORM_X和SCALE_X。它们的名字很直白一个做归一化一个做缩放。NORM_X的作用是把一个数值在指定的MIN到MAX范围内做归一化输出0.0到1.0之间的一个实数。在本案例中MIN填5530.0MAX填27648.0输入原始值输出就是这段区间内的比例关系。你可以把它理解成这个原始值在满量程里占了百分之多少。SCALE_X的作用正好反过来把一个0.0到1.0的比例值映射到目标量程范围内。在这里MIN填0.0MAX填150.0输入NORM_X输出的比例值输出就是实际的温度值。两条指令串联起来原始值到温度值就完成了。逻辑链条是这样的原始值0~27648的整数→ INT转REAL → NORM_X归一化5530~27648 → 0.0~1.0→ SCALE_X缩放0.0~1.0 → 0~150℃3.3 程序里不能少的三道保险限幅、断线检测、滤波完整的温度采集程序不只是做一次换算就结束了。一个健壮的测温逻辑至少要有三道保险。第一道保险是原始值限幅。模拟量模块在刚上电或者现场有电磁干扰的瞬间原始值可能短暂超出正常范围比如瞬间跳到27648以上或者跌到5530以下。如果不对原始值做限幅处理换算出来的温度就会出现很高的尖峰或者很低的尖峰触感报警系统就乱叫。程序里要做的是当原始值超出有效范围时温度输出保持上一次的合理值等原始值回到正常区间后再继续跟随。第二道保险是断线检测。前面提到4-20mA有活零点的特性程序里要利用这一点当原始值低于5530的一半也就是大约2500以下基本可以判定传感器回路断了或者变送器掉电了。这时候不仅要停止温度换算还要置位断线报警标志让HMI上能弹出提示。我见过不少设备温度传感器线被老鼠咬断了操作工看触摸屏温度半天不变以为设备恒温正常实际上程序里压根没做断线判断这是一个极大的安全隐患。第三道保险是滤波处理。模拟量信号在工业现场或多或少会有波动如果原始值毛刺比较多换算出来的温度值也会跟着抖。滤波算法不复杂一阶惯性滤波就够了滤波后的温度 上一次滤波后的温度 滤波系数 × (当前计算温度 - 上一次滤波后的温度)滤波系数取0到1之间越接近1越灵敏越接近0越平滑。具体取多少要看现场信号的波动情况我在实测环节会给出参考值。4. 程序实现细节与实测验证从博途到现场一步步跑通思路梳理完现在落实到博途里实际操作。我会先给出一个标准FC封装的做法再讲怎么在监控表里手算验证最后聊滤波参数到底怎么调。4.1 用FC封装单通道测温逻辑多通道直接复制调用对于S7-1200这种小型PLC用FC封装模拟量转换是特别实用的做法。我以一个新建FC为例新建FC名字叫FC_AI_Temperature然后在接口区定义输入输出参数参数名方向数据类型含义iwRawValue输入Int模拟量模块通道原始值rTempMin输入Real变送器量程下限rTempMax输入Real变送器量程上限rTempValue输出Real换算后的温度值xWireBreak输出Bool断线报警标志FC内部的SCL代码可以写成这样IF #iwRawValue 2765 THEN // 原始值低于5530的一半判断为断线或信号异常 #xWireBreak : TRUE; #rTempValue : 0.0; ELSIF #iwRawValue 27648 THEN // 超上限做限幅保持为上限温度 #xWireBreak : FALSE; #rTempValue : #rTempMax; ELSE #xWireBreak : FALSE; // 标准归一化与缩放到工程量 #rTempValue : SCALE_X(MIN : #rTempMin, VALUE : NORM_X(MIN : 5530.0, VALUE : INT_TO_REAL(#iwRawValue), MAX : 27648.0), MAX : #rTempMax); END_IF;这段代码把限幅、断线检测和换算全部包含进去了调用的时候在OB1里填参数就行FC_AI_Temperature( iwRawValue : HMI_AI_Raw.Ch0, // 对应IW64 rTempMin : 0.0, rTempMax : 150.0, rTempValue HMI_AI_Temp.Ch0, xWireBreak HMI_ALARM.WireBreakCh0 );有多个通道的时候把iwRawValue换成对应的IW地址rTempMin和rTempMax按传感器实际量程填FC块复制多份调用就可以程序非常清爽后期维护只在FC内部改逻辑所有通道同步更新。这里插一句如果用了SCL语言FC内部也可以直接用NORM_X和SCALE_X函数这是IEC标准库自带的在基本指令→转换操作里能找到不需要额外安装任何库文件。很多教程会教人用FC105这样的旧指令那是S7-300时代的库函数S7-1200用不了也不好用NORM_X和SCALE_X才是正解。4.2 实测验证万用表量电流监控表对数值三步定位问题写好了程序下载到PLC接下来是验证环节。很多人写转换程序容易犯一个错误下载完看了一眼触摸屏温度数值差不多就觉得完事了。实际上这个差不多很可能掩盖了系统误差。正确的验证方法是分段排查。我总结了一个三步验证法第一步用万用表串联在变送器信号回路上测量实际电流。假设量出来是12mA。第二步根据公式手算预期温度。对0到150℃量程的变送器12mA对应75℃。第三步打开博途的监控表添加DB_Temperature.RawValue和DB_Temperature.TempValue两个变量在线监控。你会看到原始值应该在16589左右温度值应该在75左右。如果两者都符合预期说明从模块到程序的链路是通的程序换算正确。如果原始值不对呢比如量出来12mA但原始值显示的不是16589而是别的数字这时候问题在硬件链路要么模块测量范围没设成4-20mA要么线制选错了要么信号线中间有接触不良。这时候程序写得再好也没用得回到硬件去排查。如果原始值对但程序输出温度不对比如原始值16589算出来是150℃那问题就在程序的映射关系上大概率是NORM_X的MIN值写成了0而没有写5530或者SCALE_X的MAX值填错了。用这个分段排查法一条链路从头到尾哪里断了哪里堵了一眼就能看出来比拿着万用表乱戳高效得多。4.3 滤波时间常数怎么选实测中的响应权衡关于滤波我在第3节里提了一嘴这里展开讲一个我在项目里反复踩过的坑滤波不是越大越稳过度滤波会让系统失去响应能力。温度传感器本身就有热惯性你把一个热电阻放进热水里它要过几秒才能稳定到真实水温。这是物理层面的滞后。如果在这个基础上程序里又加了一个时间常数很大的滤波器系统的整体响应就会变得非常迟钝。我曾经在一个恒温控制项目里把滤波系数调到了0.05结果加热器都已经满功率运行两分钟了温度反馈才刚达到目标值的80%控制器以为还没到温度继续猛加热最后水温过冲了十几度。那次教训之后我给自己定了个原则温度信号除非现场干扰极其严重否则滤波系数不低于0.2。滤波系数的具体取值逻辑是这样的系数为1表示完全不做滤波每周期直接用最新值系数为0表示滤波输出永远不变。0.2到0.5是一个比较合理的区间既能把毛刺压下去又不至于让信号变得太钝。如果现场出现了明显的周期性波动比如随电机启停而波动的信号我建议先去查屏蔽和接地而不是无脑加大滤波系数。因为滤波只是把症状掩盖了真正的干扰源还留在系统里迟早会引发其他问题。如果确实需要比较强的滤波效果也可以借助模块自身的硬件滤波。SM1231模块属性里有一个干扰频率抑制参数可以设置积分时间比如50Hz工频干扰就选50Hz抑制。这个参数和程序滤波是两回事硬件滤波针对的是特定频率的干扰程序滤波针对的是随机毛刺。两者可以同时用但要注意别叠加过头我一般建议用其中一个就够了用两个的话温度响应会明显变慢。5. 现场调试最容易踩的坑给初学者的避坑清单最后这部分我把自己这几年在现场调试模拟量测温系统时踩过的坑、帮别人收拾过的烂摊子集中梳理一下。每一件都是真实发生过的而且都是初学者很容易忽略的细节。5.1 屏蔽层接地与地环路干扰拧成一团不是接地模拟量信号线用屏蔽双绞线这大家都知道但屏蔽层怎么接很多人都是随手一拧或者干脆不接。屏蔽层的作用是把外界电磁干扰通过电容耦合导走如果悬空不接屏蔽层等于一根悬浮的天线反而会把干扰信号引入到信号线上。如果接得不对比如两端都接问题更严重。屏蔽层正确的接法是单端接地。一般是在PLC控制柜这一端把屏蔽层接到柜内的接地排或者接到模拟量模块的接地端子。传感器那一端的屏蔽层要悬空或者通过电容接地不要在两端同时接大地。为什么因为现场不同位置的地电位往往有差异如果屏蔽层两端都接地就会形成地环路地电位差会在屏蔽层上产生环流这个环流会通过容性耦合进入信号回路表现为温度读数出现低频往复的波动——有点像一个周期性呼吸的干扰信号很难排查。5.2 模块量程设置与通道地址错位细节决定成败这一节讲的三个问题每一个都有对应的真实翻车案例第一个是模块量程没改。SM1231模块出厂默认的测量类型不一定是4-20mA有的版本默认是电压测量。如果通道属性里忘记设置程序里就算换算逻辑完全正确读出来的原始值也会完全不对。我曾经看到有同行在程序里把原始值除以100当温度用结果设备在车间转了一圈温度显示忽高忽低最后发现模块属性里还是默认的0-10V电压测量4-20mA信号根本没有被正确读取。这个检查应该放在接线和程序之前。第二个是通道地址错位。AI模块有多个通道接线的时候接到通道0但程序里读取的IW地址却对应通道1这种错位让人非常困惑因为信号不是完全没有而是数值不对。排查方法我在前面说过断开通道信号看监控表里哪个通道的值迅速跌到0附近那个通道就是实际接线的通道再和程序里用到的IW地址对一下错没错一目了然。第三个是两线制四线制配置错误。模块属性里如果选了2线制变送器但实际现场接的是四线制变送器模块会向信号线输出一个电压这个电压和四线制的外部供电叠加会让电流读数整体偏高。反之如果选了四线制但实际接的是两线制信号回路供电不足读数会偏低甚至为零。这个坑非常隐蔽因为接线看起来挺正常信号也好像有但数值就是对不上。牢记组态一定要跟说明书和实际接线对应起来。5.3 数据类型不匹配的编译问题博途的严格是保护不是刁难S7-1200的数据类型检查非常严格很多从S7-200或者三菱转过来的同行第一次用博途写模拟量程序会被编译报错整得怀疑人生。最常见的报错就是NORM_X和SCALE_X的参数类型不匹配。NORM_X的MIN、MAX、VALUE三个参数全部要求是Real浮点数。很多初学者直接填INT类型的原始值变量或者填5530这种整数常量编译就直接报红色错误。解决办法是先做一次INT_TO_REAL转换把原始值变成浮点数再传给NORM_X。SCALE_X的输出也是Real如果后面接了HMI标签HMI那边的数据类型也要对应选择浮点数32位不然触摸屏上显示不了小数。还有一种不太容易察觉的类型问题用Real变量做比较的时候不要用完全相等的判断。浮点数在计算机里有很多二进制无法精确表达的值比如0.1在二进制里就是一个无限循环小数两个Real变量做相等判断很容易出问题。做温度阈值判断的时候用大于和小于就好不要用等于。还有一个更隐蔽的坑有些老工程师习惯用MOVE指令把原始值复制到中间变量再慢慢处理。MOVE在博途里有个特点它会做隐式类型转换但又不像三菱那么宽松用不好就会出现数据截断。比如把一个INT类型的原始值MOVE到一个REAL变量里好像没问题但如果MOVE的目标是一个BYTE变量数值高位就会被截断温度直接错乱。这类问题排查起来非常耗时间最好的办法是程序里从一开始就明确每个变量的数据类型别依赖隐式转换。写到最后再分享一个我个人的调试习惯。每次做完一个模拟量测温项目我会在调试记录本上留一张信号链路验证表把电流值、原始值、理论温度、实际显示温度四列对应填好。量程内的几个关键点比如4mA、8mA、12mA、16mA、20mA每个点都验证一遍确认线性关系没有问题之后才交付。这套流程看着繁琐但它能让我对每一套系统的状态都心里有底。你如果也被模拟量测温的问题折腾过照着这个思路从头捋一遍很多看似玄学的毛病其实都能落到一个具体的硬件设置或者程序参数上。
返回列表