ARTICLE DETAIL

资讯详情

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

基于WinCC和西门子PLC的PROFIBUS DP通讯在污水处理系统中的组态实践

基于WinCC和西门子PLC的PROFIBUS DP通讯在污水处理系统中的组态实践 简介基于WinCC与西门子PLC DP通讯开发的污水处理系统组态源码面向工控领域的初学者及有一定开发经验的工程师。资源定位于帮助读者快速掌握WinCC组态设计、DP通讯配置及污水处理流程监控的实现方法包含完整可运行的源代码、界面文件与详细注释适合作为项目参考或学习模板。压缩包共含728个文件大小约956KB涵盖dbf/mdx/dbt数据库文件、pg/pro/s7p组态工程文件、s7h/xdb通讯与硬件配置文件以及txt/log说明与日志文件各部分划分清晰便于按需查阅。目前已有237人学习下载。通过学习这份源码使用者可以获得从PLC底层数据采集到上位机界面展示的完整链路理解DP通讯参数配置、数据库表结构组织、画面布局与脚本逻辑等关键技术点为自主开发类似工业监控系统提供扎实的参考。1. 污水处理项目为什么离不开 WinCC 和西门子 PLC 的 DP 通讯组态污水处理厂中控室常有这样的画面大屏上显示进水流量、溶解氧、泵启停状态操作员在中控室远程启停鼓风机。支撑这些画面的往往不是以太网而是 PROFIBUS DP 总线。标题里的基于 WinCC 和西门子 PLC DP 通讯的污水处理系统组态源码.zip指的是一套完整工程STEP 7 硬件组态、WinCC 变量表、画面脚本以及让两者通过 DP 总线数据打通的通讯配置。这个问题很具体污水处理现场电磁环境差、测点分散DP 通讯比普通仪表电缆可靠。适合刚接手污水厂自控项目的新人、维护老 DP 从站的工程师以及想拿组态结构做二次开发的人。很多人觉得 DP 过时但真正处理过工程包的人都知道DP 的站地址、诊断和变量映射才是组态里最耗时间的部分。2. 先立骨架WinCC 与 S7-300/400 的 PROFIBUS DP 通讯组态原理2.1 PROFIBUS DP 主从机制与 WinCC 变量寻址的对应关系PROFIBUS DP 是主从轮询式总线。主站一般是带 DP 口的 CPU 或 CP 通讯卡从站则是 ET200、变频器、智能仪表或另一个 PLC。主站按固定周期循环读取从站输入区并写入输出区WinCC 并不直接读懂总线报文而是通过 STEP 7 组态时分配给从站的 I/O 地址或 PLC 程序里的 DB 块来读取数据。所以拿到一个组态源码包最先要看的不是画面漂不漂亮而是 STEP 7 硬件组态里给每个 DP 从站分配的输入输出地址段。这里最常见的方式是在 STEP 7 硬件组态里插入从站系统自动分配 I/O 地址比如输入从 IW72 开始输出从 QW80 开始WinCC 中添加 S7 PROTOCOL SUITE 驱动选 PROFIBUS 通道新建连接后变量地址填 IW72、QW80连接就能读到数值。很多新手会把外设字节 PIW 和过程映像 IW 搞混。WinCC 的 S7 驱动默认访问过程映像区也就是不带 P 的 I/Q 地址如果硬件组态中启用了完全访问或某些通讯卡直接用外设寻址就要在变量地址里加 P否则读到的始终是 0。DP 的参数还要注意站地址、波特率和单段距离。站地址范围是 0 到 1260 和 1 通常预留给编程器实际从站一般用 3 到 99。波特率由主站 DP 参数决定从站自动跟随波特率越高单段线长越短。下面是一张在污水厂现场常用的对应表波特率最大单段长度典型使用位置9.6~187.5 kbps1000 m进水提升泵房、厂外泵站500 kbps400 m生化池远程 IO 分站1.5 Mbps200 m鼓风机房到中控室12 Mbps100 m中控室柜内设备互连提示距离不够时优先加 RS-485 中继器不要一味降波特率。污水厂中变频器电缆与 DP 线同沟走线是干扰主要来源屏蔽层必须单端接地并尽量远离动力电缆。2.2 STEP 7 硬件组态里的 DP 从站配置步骤和关键参数在 STEP 7 中配置 DP 从站的常规流程是打开硬件组态 HW Config在 PROFIBUS DP 目录下找到从站 GSD拖到 DP 总线上然后分配站地址和 I/O 起始地址编译检查无冲突后下载。以 ET200M 从站为例I/O 地址输入起始 72、输出起始 80那么 WinCC 后续变量就填 IW72 和 QW80。GSD 文件必须和从站硬件版本匹配很多老改造项目里的从站是 V1.0而新装的 GSD 是 V2.0两者报文长度不一致会导致从站报错。对于有模拟量、看起来很复杂的从站关键在一致性设置。DP 从站的输入输出区可以按字节、字或整个模块定义一致性当 WinCC 要读取一个 32 位浮点数或一个完整的 ABB 变频器 PZD 报文时必须把这个数据区设置为整体一致否则一次轮询可能读到半个字数值会跳变。ABB 变频器与西门子 PLC 通过 DP 通讯时PPO 类型选择会直接决定 PZD 字的排列WinCC 地址必须和 PZD 的偏移严格对应。如果现场是 3 台变频器做三段速控制组态思路也类似每台变频器是一个 DP 从站控制字、速度给定值、状态字分别在 PZD 区固定偏移。PLC 侧把这些字搬运到 DBWinCC 再访问 DB。这样做的目的不是省事而是把总线变量和工艺变量解耦后续如果要换成以太网只需要替换搬运程序画面和变量表几乎不用动。2.3 WinCC 侧 PROFIBUS 通道的驱动选型与连接参数WinCC 访问 S7-300/400 的 DP 通讯常见有三种方式WinCC 工控机装 CP 5611/CP5621 卡用 S7 PROTOCOL SUITE 里的 PROFIBUS 通道直接连通过 PC Station 和 OPC 转发或者用 WinCC 的 TCP/IP 通道经以太网模块间接访问。污水处理系统里老项目用 CP 卡直接连 DP 总线最常见因为延迟低、变量刷新快。源码包里变量管理器的 SIMATIC S7 PROTOCOL SUITE 下的 PROFIBUS 分支里每个连接对应一个 DP 主站地址和插槽号。连接参数里有几个容易错的点站地址填 CPU 的 MPI/DP 地址机架号默认 0插槽号默认 2S7-300 CPU 安装在插槽 2。发送/接收原始数据块不要勾选除非你在 PLC 里用了 AG_SEND/AG_RECV。WinCC 的 PROFIBUS 通道还要求通讯卡驱动和 STEP 7 版本一致CP 卡固件不一致时连接状态会反复显示正在建立。如果不想让 WinCC 直接挂 DP 总线也可以用 WinCC 做 OPC UA 服务器把 DP 数据通过 OPC UA 对外发布。这个做法常用于厂级数据平台但配置时要额外注意 OPC UA 的端口和用户账号且 WinCC Runtime 必须启动后 OPC UA 服务器才可用。需要说明的是标题里的组态源码通常不会把 OPC UA 作为主通讯它更多是作为上位机监控的备选接口。3. 把 DP 报文变成 WinCC 变量污水处理组态源码里的地址映射方式3.1 DB 块直接映射比 I/O 区更稳的变量组织在污水处理项目里我倾向于让 WinCC 访问 DB 块而不是直接访问 I/Q 区。具体做法是PLC 程序中把各 DP 从站的输入区复制到固定的 DB 块WinCC 变量统一指向 DB 块。这样从站地址如果因现场改造变化只需要修改 PLC 程序里的搬运逻辑不用在 WinCC 里逐条改变量地址。DB 块还有利于做量程转换、坏值判断和故障字汇总。WinCC 变量地址的写法是DB块号,DBD偏移例如DB11,DBD4表示 DB11 中偏移 4 字节开始的双字数据类型选浮点数。如果从站上传的是两个 16 位整数组成的长字WinCC 地址同样用 DBD而不是 DBW。位变量则写成DB11,DBX0.0。偏移量的计算是常见错误源DBD 每步长 4 字节DBW 每步长 2 字节连续排布时错一位就会读到错误的压力值。污水厂工艺上进水流量和出水流量往往是累积值最好在 PLC 中用双整数累加后再给 WinCC避免 WinCC 重连时从 0 重新累积。模拟量的量程转换也可以在 WinCC 侧做变量连接原始值然后在画面脚本里用(Raw / 27648) * (HiLimit - LoLimit) LoLimit换算工程值。但我不建议这么做因为在报表和历史归档里WinCC 归档的是原始值后期做统计分析还要再做一次转换直接在 PLC 中把 0~27648 转成 0~1000 m³/hWinCC 读到的就是工程值归档和报表都省事。3.2 用 VBS 脚本批量生成变量表和模拟量处理源码包里真正省时间的是变量自动生成脚本。做水厂项目时点位表可能有两三百个模拟量和数字量如果用手工在 WinCC 变量管理器中逐条建立既慢又容易漏。常见做法是用 Excel 维护点位表列分别是变量名、数据类型、WinCC 地址导出为 CSV 后在 WinCC 全局脚本中运行 VBS 批量创建变量。下面是一个最小编程示例Dim objCtr, fso, f, line, fields Set objCtr HMIRuntime.Tags Set fso CreateObject(Scripting.FileSystemObject) Set f fso.OpenTextFile(D:\tag_list.csv, 1, False, -1) Do While f.AtEndOfStream True line f.ReadLine fields Split(line, ,) Dim newTag Set newTag objCtr.Add(fields(0), fields(1)) If fields(2) Then newTag.SetPropertyValue(Addr, fields(2)) End If newTag.Link(True) Loop f.Close逻辑说明第一列是变量名第二列是 WinCC 数据类型字符串第三列是变量地址。Tags.Add创建变量SetPropertyValue(Addr, ...)设置驱动地址Link(True)把变量连接到驱动连接。运行脚本前需要把 CSV 编码保存为 ANSI否则 WinCC 的 VBS 读出来中文会乱码如果用户权限不够脚本会卡在CreateObject需要给运行用户授予本地文件读取权限。运行后如果变量状态灰色优先检查连接名和变量地址里有没有写错驱动连接。模拟量处理还有一类问题DP 从站上传的模拟量是整数但工艺值需要带两位小数。不要用 WinCC 的输出格式小数位数硬显示因为归档数据还是整数。应该在 PLC 中乘上精度系数或使用 WinCC 内部变量做缩放。这个取舍组态源码里一般能看出来凡是在画面脚本堆积大量转换代码的项目后期维护都很痛苦。3.3 位变量与报警消息泵阀联锁的 DP 信号处理污水处理系统里数字量点比模拟量更麻烦。泵和阀门的反馈、故障、手自动状态通常是由从站以一个 16 位状态字上传的每个 bit 对应一个含义。WinCC 里为了把这些 bit 显示成报警不需要建一堆布尔变量而是建一个字变量作为报警源再在报警记录中使用位消息。WinCC 报警记录中新增位消息时在消息变量处选择状态字变量然后填入位号。当该位从 0 变为 1WinCC 自动触发消息从 1 变为 0 时自动消除。这个机制对污水厂的设备联锁提示很合适因为操作员需要看到的是哪台泵故障而不是故障字的第几位是 1。但前提是 PLC 和 WinCC 对位定义一致最常见的错误是 PLC 中从第 0 位开始用WinCC 报警里也从 Bit0 开始结果变频器说明书倒是从 Bit1 开始的全部错位。更稳妥的做法是在 PLC 中先把所有 DI 信号拆成单独位存到 DB再聚合一个状态字WinCC 直接读单个位变量作为报警源虽然变量多一点但排错很直观。如果需要在 WinCC 中快速调试状态字可以用一段 VBS 脚本循环判位Dim tagF, val, i, msg Set tagF HMIRuntime.Tags(DP_Word1) val tagF.Read For i 0 To 15 If (val And (2 ^ i)) 0 Then msg Bit CStr(i) is set HMIRuntime.Trace msg End If Next说明val And (2 ^ i)是使用按位与运算来逐位检查。这段脚本放在某个画面的按钮事件里可以快速确认从站上传的 16 位状态字每一位的实际变化尤其适合现场信号与画面不匹配时定位问题。注意HMIRuntime.Trace输出到 WinCC 诊断窗口生产环境不建议频繁运行否则会拖慢项目运行。4. 从组态到运行DP 通讯排错和 WinCC 连接检查的硬核参数4.1 站地址、总线终端和波特率的检查顺序即使源码正确DP 通讯也会出现间歇断开。现场第一道坎是物理层。PROFIBUS 总线段两端必须接终端电阻中间设备分支线不能过长屏蔽层在柜内单端接地。WinCC 诊断只能看到从站无响应不能定位是接线、地址还是参数问题。我的检查顺序是总线终端是否拨对、从站 DP 地址是否和硬件组态一致、主站 HSA 是否大于所有从站地址。HSA 即 Highest Station Address在 STEP 7 硬件组态中双击 DP 主站参数标签页里可以设置默认值是 31。如果现场从站地址是 42而 HSA 仍是 31主站轮询根本不会扫描到那个从站WinCC 中该从站变量永远保持初始值。这个问题在污水厂改造项目里经常出现因为老程序里从站少新接入的加药间从站地址设得偏高却忘了同步修改 HSA。修改后重新编译下载硬件组态即可。波特率与线缆长度也需要一起查。如果波特率设成 12 Mbps但某段线缆超过 100 米会出现偶发 CRC 错误现象是 WinCC 画面上的数值每隔几分钟跳变一次。这时不要急着换 PLC先用万用表测量 DP 线 A/B 之间的终端电阻标准是在端头量到约 220 欧姆。偏大说明终端电阻缺失偏小说明有额外并联分支。4.2 用 WinCC 内置诊断确认从站 DP 状态WinCC 中有两个诊断手段图形控件 PN/DP Diagnostics 可以直接连上去看从站状态另一种是在 PLC 中调用 SFC13DPNRM_DIAG把诊断数据写到 DBWinCC 再读取。对于组态源码来说我更推荐后者因为诊断数据可以做成页面变量发生故障时操作员能在画面上直接看到哪个从站离线而不是让维护人员去数据库翻内部变量。DPNRM_DIAG的调用参数里LADDR 填从站在硬件组态中的诊断地址。诊断缓冲区 DIAG_BUF 是一个字节数组第 5 个字节是从站状态其中第 0 位为 1 表示从站正常第 3 位为 1 表示参数化错误。如果看到第 3 位置位要回到 STEP 7 检查 GSD 文件和从站实际固件是否匹配常见的是旧 ET200M 模块已经更换成新一代 IM153-4但组态里还保留旧的 IM153-2。WinCC 侧为了显示诊断状态可以建立一个字符串变量用全局脚本读取诊断 DB。需要注意的是SFC13 的返回状态是瞬时的如果 DB 里只是缓存了最后一次调用结果那么在掉线瞬间看到的数值可能还是正常。正确的做法是让 PLC 用 OB82 或 OB86 在中断里刷新一个从站故障字而不是依赖 WinCC 周期去读。4.3 掉线重连连接状态变量和变量值保持的处理DP 通讯断线后WinCC 变量保留最后读到的值。如果操作员没有注意到通讯状态就可能对这组数值做错误判断。源码包里常见的方案是使用 WinCC 自动生成的连接状态变量例如Connect_1。当连接正常时为 1断开时为 0。在画面总貌页放一个矩形用变量颜色属性关联连接状态红色表示离线。这个做法几分钟就能做完但对现场很有意义。除了显示还可以在全局脚本中用连接状态控制操作按钮避免离线时误操作Sub OnDPDisconnect() Dim conn Set conn HMIRuntime.Tags(Connect_1) If conn.Read 0 Then HMIRuntime.Tags(Pump1_Enable).Write 0 End If End Sub说明脚本检测到连接离线时把泵的手动允许值写成 0。这里要注意直接对 PLC 变量写 0 虽然可以禁用远程操作但真正的安全联锁应放在 PLC 程序中WinCC 的写值断开后会恢复为不可控状态。掉线恢复时WinCC 自动重连不过重连后的首次刷新可能会读到从站的中间状态。更可靠的方式是让 PLC 在从站恢复后先执行一次数据同步把从站输出全部重写一遍再置位数据有效标志WinCC 画面根据有效标志变化颜色。这个逻辑虽然不是组态源码必须包含的部分但在污水厂这类不允许误动的场景下很重要。5. 把组态源码用起来变量归档、SQL 报表与画面脚本的复用配置5.1 WinCC 报表的基础SQL 数据库的建立与连接污水处理的日报表需要记录进水流量、药品消耗、泵累计运行时间。WinCC 的变量归档可以写入 SQL Server 数据库报表编辑器和外部程序都能读取。建立数据库的常见步骤是在 SQL Server 管理工具里新建数据库比如SewageReport然后建表TagHistory。示例 SQLIF OBJECT_ID(dbo.TagHistory) IS NULL CREATE TABLE dbo.TagHistory ( SampleTime datetime, VarName nvarchar(50), VarValue real ); INSERT INTO dbo.TagHistory (SampleTime, VarName, VarValue) VALUES (GETDATE(), N进水流量, 123.4);在实际项目里不会让 WinCC 的每个变量都直接写 SQL 表而是由 PLC 汇总好关键指标再由 WinCC 周期脚本统一写库。real类型对应 WinCC 的浮点数nvarchar以便保存中文变量名。连接 SQL Server 时要使用本机 Windows 集成身份验证避免在脚本里暴露数据库密码。5.2 WinCC 画面中做循环脚本按时间周期写入历史表在 WinCC 中实现周期写入可以在全局脚本里建一个动作触发器设置为周期 300 秒然后写 VBS 连接数据库。常见写法Dim conn, sql Set conn CreateObject(ADODB.Connection) conn.Open ProviderSQLOLEDB;Data Sourcelocalhost;Initial CatalogSewageReport;Integrated SecuritySSPI sql INSERT INTO dbo.TagHistory (SampleTime, VarName, VarValue) VALUES (GETDATE(), N进水流量, CSng(HMIRuntime.Tags(WaterIn).Read) ) conn.Execute sql conn.Close说明CSng将 WinCC 读取到的 Variant 转为单精度浮点避免因类型不匹配写入失败。每 300 秒执行一次会产生少量连接开销一天只有 288 次对工控机压力不大。如果点位数很多建议把多个变量放在同一条 SQL 语句里插入减少连接次数。WinCC 画面中做循环脚本还有另一种需求是让文本框的显示值每秒钟刷新那种循环不要用数据库连接直接用画面动态属性加内部变量即可。5.3 趋势图 VBS 脚本在线趋势与历史曲线共用一份数据WinCC 趋势图脚本是报表和监控的常用结合点。源码包里的常见问题是趋势控件时间轴刷新时 CPU 占用过高。更稳妥的写法是让趋势控件直接绑定变量归档脚本只修改时间范围。例如Dim objTrend Set objTrend ScreenItems(Trend1) objTrend.TimeRange 3600 objTrend.TrendIndex 0 objTrend.ReadData()说明TimeRange单位是秒3600 表示显示最近一小时ReadData是让控件从归档数据库重新取数。这段脚本放在画面打开事件里运行后操作员可以通过控件自带的时间轴缩放查看历史。趋势图的数值源必须和 5.1 节中的 SQL 报表共用同一份归档数据否则画面上看到的趋势和打印出来的日报对不上。要做到这一点WinCC 变量归档周期和 SQL 写库周期要一致至少保证 SQL 表中的SampleTime与 WinCC 归档时间戳对齐。本文还有配套的精品资源点击获取
返回列表