ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

PLC到触摸屏变量映射高效方案:DB块+FC块+批量导入实战

PLC到触摸屏变量映射高效方案:DB块+FC块+批量导入实战 设备一启动触摸屏上那些电机电流、液位高度、阀门开度全只显示一堆原始数值操作工看不懂还得翻着换算表去对。换谁都头疼。我早几年在项目上也踩过这个坑后来把做法固定下来PLC侧用DB块统一管理变量FC块做数据处理触摸屏侧做批量变量导入和动态动画绑定。这套做法跑顺之后新增一个IO变量的显示从组态到下载5分钟确实够用——前提是变量规划做得对。这篇文章就顺着这个思路把从PLC到触摸屏的完整链路拆开来讲。不是纯理论也不是截图式点到为止而是告诉你每一步为什么这么做、不这么做会有什么坑。想直接照着做的建议重点看第2和第3部分尤其是DB块“非优化访问”那个细节很多人第一回都会栽在这上面。1. 方案设计思路为什么用DB块加FC块而不是直接怼M区和I/O点刚接触这个需求的人第一反应往往是画面要显示哪个IO点直接在HMI变量表里建一个变量连接PLC的I/Q/M地址不就行了逻辑上没问题我也见过不少项目就这么干的。但项目一超过50个点你就知道难受了——变量表乱成一锅粥查一个电机电流要翻半天程序中信号地址散落在各个FC里改一处还要担心别的地方被牵连。用DB块就相当于给所有IO变量找了一个统一“收件箱”。每个信号都有明确的名字、类型、注释触摸屏访问的时候不需要知道这个信号在程序哪一行产生只需要知道它在DB几、偏移多少维护起来非常清爽。而且DB块是全局数据块PLC程序里任何FB、FC都能读写触摸屏通过以太网访问它也没有障碍。FC块则是处理逻辑的容器。IO变量到了PLC里通常不是拿来直接用就能显示的模拟量需要从0到27648的原始数值转换成工程量比如0到50安培数字量可能需要组合成状态字比如把“运行、停止、故障”三个BOOL组合成一个Word还可能要做超限报警判断。这些如果都堆在主程序OB1里程序会越写越臃肿。封装到FC里输入输出清晰主程序只负责调用新增加一个信号处理也只需要复制一个FC再改参数半小时能改完十路信号。这套方案还有一个很现实的好处第三方设备对接或者是后期上位机扩容直接走DB块就行。给上位机开放一个DB块地址范围比到处找M地址要安全得多。M区本身就是全局共享的各种库函数、通信指令都在用地址冲突排查起来能让你怀疑人生。DB块有明确的块号和偏移一个信号对应一个地址排查问题的路径是直线的。那为什么不是FB块呢FB有背景数据块适合做需要保持内部状态的场景比如PID调节、步进控制。但纯IO信号处理和显示用途用FC最简单的函数就够了。没有静态变量要保存不需要多实例调用每个调用都用形参传值写起来更直观也不会在DB区里平白多出一堆背景数据块浪费存储空间。2. PLC侧第一步创建DB块时务必勾选“非优化访问”这是整条链路里的第一个大坑。S7-1200和S7-1500的DB块默认是“优化的块访问”好处是编译后系统自动分配偏移地址程序员不需要关心变量在DB块里的物理位置。对纯PLC程序来说这确实方便。但触摸屏要访问这些变量时如果用的是老式HMI或者跨品牌面板它不认符号名只认绝对地址。你编了一个DB块叫“电机数据”里面有变量“电流”地址可能在DB3.DBD20优化访问模式下这个偏移是编译后动态生成的触摸屏那边根本不知道具体在哪。解决办法就是在创建DB块时把属性里的“优化的块访问”勾掉改成非优化访问。这样每个变量都会有固定的偏移地址DB3.DBD20写上就是DB3.DBD20触摸屏里建变量时填这个地址就能稳定通信。如果已经建好了优化访问的DB块也可以在块属性里改设置改完编译一下系统会自动重新分配偏移地址。但这里有个细节要注意改成非优化访问后DB块里所有变量的偏移地址可能会变化。如果触摸屏里已经按旧地址建了一堆变量全都得改。所以我现在的习惯是新建DB块的第一步就是先把优化访问关掉再填变量省得后面返工。2.1 DB块内部布局的几个实操细节变量类型怎么排直接影响PLC的数据读取效率。虽然现在CPU处理这些都有余量但排列不好会看得脑壳疼。我的习惯是四个字节对齐Real和DInt占4个字节的排在一起Int占2字节的排在中间Bool类型排在一起。一个电机的数据尽量集中在一个连续区域例如DB1.DBD0电机电流 Real单位安培DB1.DBD4电机转速 Real单位转每分钟DB1.DBD8电机温度 Real单位摄氏度DB1.DBX12.0运行状态 BoolDB1.DBX12.1故障状态 BoolDB1.DBX12.2本地远程标志 Bool这样布局好在两个地方触摸屏建变量时可以顺着偏移一直往下加不容易漏PLC程序里调用时也整齐模拟量的地址都是4的倍数不会出现错位。曾经见过有人把Bool排在Real前面结果整个DB块的偏移全错开了触摸屏上显示的温度数据时对时不对排查了大半天。DB块要不要设保持性也值得提前想清楚。掉电保持的数据比如累计运行时间、产量计数需要勾上保持性。普通的运行信号、实时测量值不需要保持上电后重新采集就好。保持性设置会影响CPU的保持存储区消耗非必要不勾选这是选型时就要做好的事情。2.2 FC块封装信号转换和报警逻辑放这里DB块建好之后下一步是写FC把原始信号变成触摸屏能直接显示的数值。以模拟量为例S7-1200的模拟量输入模块在0到10V的信号下原始值范围是0到27648。如果传感器量程是0到1.6兆帕那PLC程序里就需要做一次线性映射。这个映射公式很简单[ 工程量 原始值 \div 27648 \times 量程上限 ]我通常把它封装成一个FC输入参数分别是原始值、量程上限、量程下限输出参数是工程量。这样无论后面是接压力变送器、温度传感器还是液位计都复用同一个FC改调用参数就行。FUNCTION FC100 : Void VAR_INPUT bEnable : Bool; // 使能 nRawValue : Int; // 模拟量原始值 0-27648 rRangeHigh : Real; // 量程上限 rRangeLow : Real; // 量程下限 END_VAR VAR_OUTPUT rEngValue : Real; // 工程量输出 bAlarmHigh : Bool; // 上限报警 bAlarmLow : Bool; // 下限报警 END_VAR VAR_TEMP rScale : Real; END_VAR IF bEnable THEN rScale : (rRangeHigh - rRangeLow) / 27648.0; rEngValue : INT_TO_REAL(nRawValue) * rScale rRangeLow; IF rEngValue rRangeHigh THEN bAlarmHigh : TRUE; ELSE bAlarmHigh : FALSE; END_IF; IF rEngValue rRangeLow THEN bAlarmLow : TRUE; ELSE bAlarmLow : FALSE; END_IF; ELSE rEngValue : 0.0; bAlarmHigh : FALSE; bAlarmLow : FALSE; END_IF;写这个FC有几个细节值得注意。使能信号我习惯保留调试的时候可以随手关掉某个信号而不影响整个逻辑。报警阈值直接用量程上下限规则简单粗暴但实际项目里大部分预警值比量程上限要低比如电机温度70度值报警80度跳闸量程是120度。这时候报警判断就不能用量程上限得单独加两个参数。所以后来我的FC会加上rAlarmHigh和rAlarmLow两个输入默认情况下和量程一致需要预警时再单独设置。FC写完先在OB1里调用一下下载到PLC用监控表或者TIA Portal的自监控功能看看输出值是否正常。这一步别跳很多问题在纯逻辑模拟时发现不了一定要接上实际信号看。比如模拟量模块的通道配置错了量程卡位置不对这些都是在PLC侧暴露出来的等做到触摸屏那边再去排查就要两头跑。3. 触摸屏侧配置5分钟快速完成的批量变量导入法到了触摸屏侧核心功夫在变量组态。最慢的方式、也是大多数人第一次做的方式是一条一条手动建变量。一个画面20个点每个点设置一遍连接、地址、数据类型半小时起跳。MTP1000这种基于WinCC Unified的新一代面板画面组态工具里其实支持变量表的CSV批量导入这才是真正能把时间压缩到5分钟的关键操作。具体流程是先在触摸屏变量表里手动建两三个变量导出成CSV模板用Excel打开里面会有列名比如变量名、连接名、数据类型、地址、采集周期这些。把剩余的变量在Excel里按行填好直接复制粘贴保存后再导回TIA Portal。实测这一招在变量超过30个时效率提升非常明显。3.1 Excel批量导入表格的填写规则CSV导出后几个关键列要填对变量名建议和PLC侧的符号名保持一致比如“电机电流”触摸屏上引用的IO域写起来也好对应。连接选已经建好的HMI连接比如“HMI_连接_1”。数据类型按PLC侧的数据类型填Real、Bool、Int都要严格匹配。类型不一致的话触摸屏读回来的数据会变成乱码或者直接不更新。地址这里有个常见的坑。非优化访问的DB块地址栏填的是“DB1.DBD20”这种格式注意千万不要带“%”符号也不要写成“DB1,DBD20”这种不规范的写法。采集周期默认100ms就行大部分IO显示场景够用。要求高的高速计数之类可以单独改到50ms但代价是CPU和HMI的通信负载上升没必要全局快扫。导入之前还有一个动作要确认触摸屏的连接参数里PLC的IP地址要和实际一致。S7-1200默认是192.168.0.1MTP1000默认可能不一样两者必须在同一个网段。很多人变量导入之后还是红叉第一个要查的就是这个。3.2 动态显示的几种常见实现方式变量建好之后画面上的“动态显示”就有基础了。很多人理解的动态显示就是数值实时变化但实际上HMI上还有颜色动画、可见性控制、文本列表切换这几种玩法组合起来效果才完整。以MTP1000为例在WinCC Unified里给一个IO域绑定变量后它还支持“动画”功能可以针对数值范围设置不同的颜色。比如电机温度显示低于50度显示绿色50到70度显示黄色超过70度显示红色。设置方式是给IO域加一个颜色动画规则把变量值按范围分段每段指定前景色和背景色。这样操作工离着三米远就能看到温度状态不需要凑近了读数字。可见性动态控制适合做状态图形。比如给一个“运行”圆形状态灯添加可见性动画关联“电机运行”这个Bool变量当值为1时可见0时隐藏。再叠一个“停止”圆形状态灯关联反向逻辑这样画面上的指示灯就会在运行和停止之间切换显示。很多人一开始做成一个灯用颜色变化表示其实也可以但可见性做出来的画面更直观而且两个灯位置固定布局不会跳。文本列表适合把数字状态转为文字比如“0对应待机、1对应运行、2对应故障、3对应急停”把文本列表关联到状态字上画面显示的就是中文文本而不是干巴巴的数字。这个在报警画面上尤其好用。3.3 MTP1000新增功能与老面板的差别MTP1000是Siemens新推出的MTP系列面板跟传统的精智面板相比它的组态软件换成了基于WinCC Unified的新平台界面和操作逻辑都向PC端WinCC靠拢了。最大体感是画面刷新更流畅脚本功能和Web访问能力强化了很多。但新平台也带来一个适应成本TIA Portal的精智面板项目没法直接迁移到Unified必须新建工程再重新组态画面。手头有老项目要迁移的话得留出重新做画面的时间预算。不过对于调试来说Unified平台有一个好处变量监控和数据记录功能做得更顺手。变量表里能直接看到通信状态还能在线观察变量值是否在更新排查问题不用反复下载画面到触摸屏里看效果。调试效率提升很明显。4. 常见问题与排查技巧变量不刷新、数值不对、跨品牌导DB数据这块我把这些年集中遇到的问题按排查顺序整理一下建议收藏遇到问题顺着查就行。第一个高频问题触摸屏变量表显示红色感叹号或者变灰画面数值始终不动。先查IP通不通用电脑ping一下PLC再ping一下触摸屏。如果电脑能ping通PLC但触摸屏不通大概率是触摸屏的IP和PLC不在同一网段。改完IP后重启触摸屏问题基本解决。如果IP没问题再查连接参数里的机架号和槽号。S7-1200默认是0和1S7-1500也基本是0和1但如果PLC侧组态里改了槽号这里就要对齐。第二个高频问题数值显示乱码或者是NaN。按前面说的优先检查DB块是不是优化访问模式。非优化访问的DB块地址才是固定的优化访问模式下触摸屏读不到绝对地址最容易出现数据错乱。其次检查数据类型是否匹配DB块里定义的是Real触摸屏变量类型选成了Int读出来的值肯定是乱的。第三检查地址偏移特别是Bool变量之后的地址一个Bool虽然只占1位但在非优化访问里它实际占用1个字节的宽度后面的变量地址要手动计算正确。第三个问题比较特殊模拟量数值变化很慢比如温度要等好几秒才更新一次。这是因为模拟量模块默认的滤波设置太强了积分时间拉长了。在PLC侧模拟量模块属性里把滤波调到“无”或者“弱”响应就快了。这个不影响显示效果反而更接近实际值。第四个问题是很多人问过的跨品牌触摸屏读取西门子DB块数据比如用昆仑通态的面板去读取S7-1200的DB数据。这属于开放协议对接的范畴最通用的走法是Modbus TCP。在S7-1200侧用MB_SERVER指令把DB块里的数据映射到Modbus保持寄存器区然后昆仑通态触摸屏通过Modbus TCP客户端去读取。但这里有个限制Modbus保持寄存器是16位为单位一个Real类型32位数据要占两个寄存器而且字节顺序在两边要统一设置否则数值对不上。如果PLC是S7-1500还可以开放OPC UA服务器功能昆仑通态部分新系列的面板支持OPC UA客户端直接读西门子PLC的符号地址不需要做Modbus映射。这也是现在比较推荐的方式因为OPC UA走符号寻址DB块的变量名直接用比Modbus的寄存器偏移直观得多。但OPC UA的连接配置和安全证书设置会比Modbus TCP繁琐一些现场调试时间要留足。还有一个实际项目里容易踩的坑PLC程序在线下载的时候触摸屏的画面会短暂失去通信数值显示灰色。下载完恢复后有些变量要等一个刷新周期才重新显示。这不是故障不必反复下载重启触摸屏。耐心等几秒就好如果长时间不恢复可以手动切换一下画面再切回来强制触发一次变量刷新。5. 调试心得这套方案的适用边界和建议这套“DB块加FC块加批量导入”的模板我后来在好几个项目上复用从16点位的小设备到300多个变量的产线级项目都在用。适用范围其实很宽小项目用它不乱大项目用它更清晰。唯一的区别在于变量命名和DB块划分的颗粒度小项目一个DB块全搞定大项目建议按功能分区比如“电机数据块”“温度数据块”“产量数据块”每个块管理一类信号方便多人协作时各改各的块不容易冲突。有一点我必须说清楚5分钟能完成的是“新增一个既有点位显示”的过程——只要PLC侧的DB地址已经有了数据FC已经算好工程量剩下的组态步骤确实能压缩到5分钟内。但如果你是从零开始规划一套设备的IO监控画面挖地址、画画面、调试通信半天到一天是正常节奏。别被“5分钟”误导成“从零到一5分钟”这不现实。真正的效率在于把这个流程标准化之后重复性工作大幅缩短。新接手这类项目的话我建议先把PLC侧程序框架搭好DB块布局设计合理FC封装完整再动触摸屏。PLC侧稳了HMI侧就是体力活。反过来PLC侧一团乱麻HMI组态做得再花哨调试的时候一样被变量地址折磨到崩溃。按这套流程走下来IO变量动态显示这个需求基本就是流水线作业PLC出数据、FC算数值、DB做桥梁、HMI做展示。每个环节职责单一出了问题顺着链路定位就行。做完第一个项目后面再遇到类似需求光是时间成本就能省下一半。最后再分享一个操作习惯项目管理器里建一个“变量对照表”Excel把PLC符号名、DB地址、HMI变量名、数据类型四列全部对齐维护好。每次新增点位先在Excel里加上一行再照着去PLC和HMI里同步改。这张表平时看着不起眼到了设备交接、售后排障的时候能少加一半的班。
返回列表