从入门到上手:用KingSCADA 3.7 SP1和组态王做一个简单的液位监控项目(附分步视频)
工业自动化实战:基于KingSCADA 3.7 SP1的液位监控系统开发指南
在工业自动化领域,SCADA系统作为监控和数据采集的核心平台,已经成为现代工厂不可或缺的神经中枢。亚控科技旗下的KingSCADA和组态王(KingView)系列产品,凭借其稳定可靠的性能和友好的开发界面,在国内工业自动化市场占据了重要地位。本文将带领读者从零开始,通过一个典型的水罐液位监控项目,掌握KingSCADA 3.7 SP1与组态王的协同开发流程。
这个实战项目特别适合以下人群:
- 自动化相关专业的在校学生
- 刚接触工业控制系统的工程师
- 需要快速上手亚控产品的技术人员
- 希望将理论知识转化为实践能力的爱好者
我们将从软件安装配置开始,逐步完成画面组态、变量连接、脚本编写和报警设置等核心功能开发,最终构建一个完整的监控系统。与单纯的理论学习不同,这种项目驱动的方式能让你在解决实际问题的过程中快速掌握关键技能。
1. 环境准备与软件安装
1.1 系统要求与安装前准备
在开始项目前,确保您的计算机满足以下最低配置要求:
| 组件 | 最低要求 | 推荐配置 |
|---|---|---|
| 操作系统 | Windows 7 SP1 | Windows 10 64位 |
| CPU | 双核2.0GHz | 四核3.0GHz及以上 |
| 内存 | 4GB | 8GB及以上 |
| 硬盘空间 | 20GB可用空间 | SSD硬盘 |
| 显示器 | 1366×768分辨率 | 1920×1080分辨率 |
需要准备的软件包包括:
- KingSCADA 3.7 SP1通用版
- 组态王7.5 SP5
- MySQL数据库(可选,用于历史数据存储)
提示:建议关闭杀毒软件和防火墙临时防护功能,避免安装过程中出现权限问题。
1.2 安装KingSCADA 3.7 SP1
安装过程分为以下几个关键步骤:
- 以管理员身份运行安装程序
- 选择"完整安装"模式
- 指定安装路径(避免使用中文路径)
- 配置数据库连接参数
- 完成授权文件导入
安装完成后,建议执行以下验证操作:
# 检查服务是否正常启动 sc query | findstr "KingSCADA" # 验证许可证状态 cd C:\KingSCADA\bin LicenseManager.exe -status常见安装问题及解决方案:
- 问题1:安装过程中提示".NET Framework版本不符"
- 解决方案:安装.NET Framework 4.7.2或更高版本
- 问题2:服务启动失败
- 解决方案:检查端口冲突,默认使用2008和2009端口
1.3 组态王7.5 SP5安装与配置
组态王作为KingSCADA的前端开发工具,其安装相对简单:
- 运行setup.exe,接受许可协议
- 选择典型安装组件
- 配置与KingSCADA的通信参数
- 安装驱动程序(如需要连接PLC)
安装完成后,建议创建以下目录结构管理项目文件:
项目名称/ ├── Config/ # 配置文件 ├── Graphics/ # 画面文件 ├── Scripts/ # 脚本文件 ├── Data/ # 数据文件 └── Backup/ # 备份文件2. 项目规划与系统设计
2.1 液位监控系统需求分析
我们的水罐液位监控系统需要实现以下核心功能:
- 实时监控:显示水罐当前液位高度
- 控制功能:手动/自动控制进水阀和排水阀
- 报警管理:液位超限报警记录与提示
- 数据记录:存储历史数据供查询分析
- 用户权限:不同操作级别的权限控制
系统I/O点清单示例:
| 变量名称 | 类型 | 地址 | 描述 |
|---|---|---|---|
| LT101 | AI | PLC1.D100 | 液位变送器信号 |
| FV101 | DO | PLC1.Y0 | 进水阀控制 |
| FV102 | DO | PLC1.Y1 | 排水阀控制 |
| HS101 | DI | PLC1.X0 | 手动/自动切换 |
2.2 数据库结构设计
KingSCADA使用内置的实时数据库管理系统,我们需要设计以下关键点表:
模拟量点(AI):存储液位测量值
- 点名:Level_Actual
- 工程单位:mm
- 量程:0-2000mm
- 报警限值:H=1800mm, HH=1900mm, L=200mm, LL=100mm
数字量点(DI/DO):阀门状态和控制
- 点名:Valve_In, Valve_Out
- 状态描述:0=关闭, 1=开启
计算点:用于中间运算
- 点名:Level_Setpoint
- 类型:浮点型
- 初始值:1000mm
创建数据库点的SQL示例(适用于高级配置):
INSERT INTO TAG (NAME, TYPE, DESCR) VALUES ('Level_Actual', 'AI', 'Actual water level measurement'); INSERT INTO ALARM (TAGNAME, HIHI, HI, LO, LOLO) VALUES ('Level_Actual', 1900, 1800, 200, 100);2.3 通信配置
KingSCADA支持多种工业通信协议,本项目以Modbus TCP为例:
- 在KingIOServer中新建设备
- 选择Modbus TCP驱动
- 配置设备参数:
- IP地址:192.168.1.100
- 端口号:502
- 站号:1
- 定义数据交换周期:1000ms
通信测试命令示例:
import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('192.168.1.100', 502)) s.send(b'\x00\x01\x00\x00\x00\x06\x01\x03\x00\x64\x00\x01') response = s.recv(1024) s.close() print(response.hex())3. 画面组态与界面设计
3.1 创建主监控画面
使用组态王图形编辑器创建主监控画面:
- 新建画面,尺寸设置为1280×720像素
- 添加基本元素:
- 水罐示意图(使用矢量图形绘制)
- 动态液位填充(使用百分比填充动画)
- 阀门状态指示灯
- 控制按钮组
关键属性设置:
// 液位填充动画脚本 function LevelAnimation() { var level = GetTagValue("Level_Actual"); var maxHeight = 500; // 像素高度 var currentHeight = (level / 2000) * maxHeight; document.getElementById("levelFill").style.height = currentHeight + "px"; // 颜色变化 if(level > 1800) { SetFillColor("levelFill", "red"); } else if(level < 200) { SetFillColor("levelFill", "orange"); } else { SetFillColor("levelFill", "blue"); } }3.2 动态数据连接
实现画面元素与实时数据的动态关联:
液位显示:
- 连接变量:Level_Actual
- 显示格式:###0.00 mm
- 刷新周期:1000ms
阀门状态:
- 使用位图切换显示
- 0状态:灰色阀门图标
- 1状态:绿色阀门图标
趋势曲线:
- 创建历史趋势窗口
- 添加Level_Actual和Level_Setpoint曲线
- 时间范围:30分钟
动态属性配置表示例:
| 对象 | 属性 | 表达式 | 触发条件 |
|---|---|---|---|
| 进水阀图标 | 可见性 | {Valve_In}==1 | 值变化 |
| 液位报警灯 | 闪烁频率 | {Level_Actual}>1800?1:0 | 值变化 |
| 液位数值 | 前景色 | {Level_Actual}>1800?红色:黑色 | 值变化 |
3.3 操作面板设计
创建直观的操作控制面板:
手动控制区:
- 启/停按钮
- 阀开/阀关按钮
- 急停按钮
参数设置区:
- 液位设定值输入框
- PID参数调整滑块
- 报警限值设置
状态显示区:
- 系统运行时间
- 当前报警列表
- 通信状态指示灯
按钮事件处理脚本示例:
Sub btnValveIn_Click() If GetPermissionLevel() >= 2 Then ' 检查操作权限 If GetTagValue("Valve_In") = 0 Then SetTagValue "Valve_In", 1 WriteLog "操作记录", "手动开启进水阀" Else SetTagValue "Valve_In", 0 WriteLog "操作记录", "手动关闭进水阀" End If Else ShowMessage "权限不足,无法操作!" End If End Sub4. 逻辑控制与脚本编程
4.1 自动控制逻辑实现
液位自动控制采用简单的PID算法:
- 创建周期执行脚本(1000ms)
- 实现基本PID控制逻辑
- 添加手动/自动无扰切换功能
PID控制脚本示例:
# 周期执行脚本 Kp = 0.5 # 比例系数 Ki = 0.1 # 积分系数 Kd = 0.2 # 微分系数 last_error = 0 integral = 0 def PID_Control(): global last_error, integral setpoint = GetTagValue("Level_Setpoint") actual = GetTagValue("Level_Actual") error = setpoint - actual # PID计算 proportional = Kp * error integral += Ki * error derivative = Kd * (error - last_error) output = proportional + integral + derivative # 输出限幅 output = max(0, min(100, output)) # 更新阀门开度 if GetTagValue("Mode") == 1: # 自动模式 if output > 50: SetTagValue("Valve_In", 1) SetTagValue("Valve_Out", 0) else: SetTagValue("Valve_In", 0) SetTagValue("Valve_Out", 1) last_error = error4.2 报警管理配置
实现完善的报警管理系统:
报警定义:
- 高高报警(HH):1900mm
- 高报警(H):1800mm
- 低报警(L):200mm
- 低低报警(LL):100mm
报警优先级:
- 紧急报警:HH, LL(优先级1)
- 重要报警:H, L(优先级2)
报警动作:
- 画面闪烁提示
- 声音报警
- 事件记录
- 短信通知(可选)
报警配置表示例:
| 报警类型 | 条件 | 优先级 | 确认要求 | 恢复通知 |
|---|---|---|---|---|
| HH | Level_Actual>1900 | 1 | 是 | 是 |
| H | Level_Actual>1800 | 2 | 是 | 是 |
| L | Level_Actual<200 | 2 | 是 | 是 |
| LL | Level_Actual<100 | 1 | 是 | 是 |
报警处理脚本:
function HandleAlarm(tagName, alarmType) { var alarmMsg = ""; switch(alarmType) { case "HH": alarmMsg = "液位超高紧急报警!"; SetTagValue("Valve_In", 0); // 自动关闭进水阀 break; case "LL": alarmMsg = "液位超低紧急报警!"; SetTagValue("Valve_Out", 0); // 自动关闭排水阀 break; // 其他报警类型处理... } // 触发报警动作 PlaySound("alarm.wav"); AddAlarmList(tagName, alarmType, alarmMsg); SendSMS("13800138000", alarmMsg); // 可选短信通知 }4.3 数据记录与报表
配置历史数据存储和报表功能:
历史存储设置:
- 存储周期:10秒
- 存储方式:变化存储(变化超过1%时存储)
- 存储时长:30天
报表模板设计:
- 日报表:整点数据
- 报警统计报表
- 操作日志报表
数据导出功能:
- Excel格式导出
- CSV格式导出
- PDF打印
历史数据查询SQL示例:
SELECT DateTime, Value FROM HistoryData WHERE TagName = 'Level_Actual' AND DateTime BETWEEN '2023-05-01 00:00:00' AND '2023-05-02 00:00:00' ORDER BY DateTime报表生成脚本:
Sub GenerateDailyReport() Dim reportName As String reportName = "日报表_" & Format(Now(), "yyyyMMdd") & ".xlsx" ' 设置报表参数 SetReportParam "startTime", DateAdd("d", -1, Date()) SetReportParam "endTime", Date() SetReportParam "interval", 3600 ' 1小时间隔 ' 生成报表 If GenerateReport("DailyReportTemplate", reportName) Then WriteLog "报表生成", "日报表生成成功:" & reportName Else WriteLog "报表错误", "日报表生成失败" End If End Sub5. 系统调试与优化
5.1 模拟测试方法
在没有实际PLC设备的情况下,可以使用KingSCADA的仿真功能:
设备仿真:
- 创建仿真PLC设备
- 配置寄存器映射
- 设置自动变化模式
信号发生器配置:
- 正弦波发生器:模拟液位波动
- 阶跃信号:测试系统响应
- 随机噪声:测试系统稳定性
仿真脚本示例:
# 液位仿真脚本 import math import random amplitude = 500 # 波动幅度 base_level = 1000 # 基准液位 frequency = 0.001 # 频率 def SimulateLevel(): # 正弦波+随机噪声 level = base_level + amplitude * math.sin(2 * math.pi * frequency * GetSystemTime()) level += random.uniform(-20, 20) # 限制范围 level = max(0, min(2000, level)) SetTagValue("Level_Actual", level) # 自动控制阀门状态 if level < 800: SetTagValue("Valve_In", 1) SetTagValue("Valve_Out", 0) elif level > 1200: SetTagValue("Valve_In", 0) SetTagValue("Valve_Out", 1)5.2 性能优化技巧
提升系统运行效率的关键方法:
通信优化:
- 合理设置扫描周期
- 使用块读取代替单点读取
- 优化设备轮询顺序
画面优化:
- 减少复杂矢量图形
- 使用位图缓存静态元素
- 分页加载大型画面
脚本优化:
- 避免在周期脚本中使用复杂计算
- 使用局部变量代替频繁访问实时库
- 优化条件判断顺序
性能监测命令:
# 监控KingSCADA进程资源占用 tasklist /fi "imagename eq SCADAServer.exe" /fo csv # 查看网络连接状态 netstat -ano | findstr "2008"5.3 常见问题排查
典型问题及解决方法:
通信中断:
- 检查物理连接
- 验证IP地址和端口
- 测试Ping和Telnet连通性
数据显示异常:
- 检查变量量程设置
- 验证数据类型匹配
- 查看原始寄存器值
报警不触发:
- 确认报警使能状态
- 检查报警限值设置
- 查看报警死区配置
故障排查流程图:
开始 ↓ 检查通信状态 → 异常 → 检查物理连接和配置 ↓正常 检查数据质量 → 异常 → 检查变量定义和转换 ↓正常 检查画面连接 → 异常 → 验证对象绑定关系 ↓正常 检查脚本逻辑 → 异常 → 调试脚本执行 ↓正常 问题解决6. 项目部署与维护
6.1 系统打包与发布
完成开发后,将项目部署到生产环境:
创建运行包:
- 包含所有必要组件
- 自动依赖项检查
- 生成安装向导
环境配置:
- 设置数据库连接
- 配置网络参数
- 调整性能参数
权限设置:
- 定义用户角色
- 分配操作权限
- 设置密码策略
部署检查清单:
- [ ] 验证所有画面功能
- [ ] 测试报警通知
- [ ] 确认历史数据存储
- [ ] 检查备份机制
- [ ] 验证用户权限控制
6.2 日常维护建议
确保系统长期稳定运行:
定期检查:
- 日志文件分析
- 磁盘空间监控
- 数据库维护
备份策略:
- 项目文件每日增量备份
- 历史数据每周全量备份
- 系统配置变更时立即备份
升级管理:
- 测试环境验证后再生产部署
- 保留回滚方案
- 记录变更日志
维护脚本示例:
# 自动备份脚本 $backupDir = "D:\Backup\SCADA\" $projectDir = "C:\KingSCADA\Projects\WaterTank\" $dateStr = Get-Date -Format "yyyyMMdd" # 创建备份目录 New-Item -Path ($backupDir + $dateStr) -ItemType Directory -Force # 复制项目文件 Copy-Item -Path ($projectDir + "*") -Destination ($backupDir + $dateStr) -Recurse # 压缩备份文件 Compress-Archive -Path ($backupDir + $dateStr) -DestinationPath ($backupDir + "WaterTank_" + $dateStr + ".zip") # 删除临时目录 Remove-Item -Path ($backupDir + $dateStr) -Recurse -Force # 保留最近30天备份 Get-ChildItem -Path $backupDir -Filter "*.zip" | Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-30) } | Remove-Item -Force6.3 扩展功能建议
进一步提升系统能力的可能性:
移动监控:
- 开发手机APP
- 微信小程序集成
- 短信通知增强
数据分析:
- 能效分析
- 预测性维护
- 异常检测算法
系统集成:
- 与MES系统对接
- ERP数据交互
- 云平台上传
Web API集成示例:
// 将实时数据推送到云平台 function PostToCloud() { var apiUrl = "https://api.iotplatform.com/v1/data"; var payload = { deviceId: "WT001", timestamp: new Date().toISOString(), level: GetTagValue("Level_Actual"), valveIn: GetTagValue("Valve_In"), valveOut: GetTagValue("Valve_Out") }; fetch(apiUrl, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + GetConfig("CloudAPIKey") }, body: JSON.stringify(payload) }) .then(response => { if(!response.ok) { WriteLog("CloudAPI", "数据上传失败: " + response.status); } }) .catch(error => { WriteLog("CloudAPI", "网络错误: " + error.message); }); }