ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

KingView组态开发实战:从PLC通讯到上位机监控系统搭建

2026/8/8 17:27:01 拓冰建站 浏览量
KingView组态开发实战:从PLC通讯到上位机监控系统搭建

1. 项目概述:从PLC到上位机的桥梁

如果你在工业自动化领域摸爬滚打过一阵子,肯定对PLC(可编程逻辑控制器)不陌生。它就像是工厂设备的大脑,负责执行逻辑控制、顺序控制、定时、计数与算术操作等指令。但光有大脑还不够,我们还需要一双“眼睛”和一个“控制面板”来观察大脑的运行状态,并给它下达指令。这就是上位机组态软件存在的意义。而KingView(组态王),作为国内工业组态软件的先行者和市场占有率极高的产品,几乎是每一位从PLC编程转向上位机开发的工程师绕不开的一站。

我最初接触KingView,是在一个老旧产线的改造项目上。现场用的是西门子S7-200系列PLC,控制着十几台电机和阀门。客户的需求很简单:在办公室的电脑上,能实时看到各个电机的启停状态、阀门的开度、以及一些关键的温度和压力参数,并且能远程点动控制几个关键的设备。当时项目预算有限,工期紧,在对比了WinCC、力控、iFIX等一众软件后,最终选择了KingView。原因无他:对国内工控环境适配好、驱动丰富(特别是对老型号PLC支持到位)、学习曲线相对平缓,而且性价比高。

这个“【PLC】KingView入门及组态开发”项目,本质上就是搭建一个连接下层PLC硬件与上层管理人员之间的可视化监控桥梁。它不涉及复杂的控制算法编写,核心在于数据通讯的建立、画面组态的绘制、以及数据逻辑的绑定。对于已经熟悉PLC梯形图或ST语言的工程师来说,学习KingView更像是掌握一种新的“表达方式”,将硬件IO点、寄存器地址,转化为屏幕上会动的图形、闪烁的指示灯和可填写的输入框。

2. KingView核心概念与工作流程拆解

在真正打开软件动手之前,理解KingView的几个核心概念和工作流程,能让你少走很多弯路。它的设计哲学是“面向对象”和“基于事件”,虽然听起来有点软件工程的调调,但在组态里非常直观。

2.1 核心四要素:设备、变量、画面、命令语言

任何KingView项目,都离不开这四大基石,它们构成了数据流动的完整闭环。

  1. 设备:这里指的不是物理的PLC,而是在KingView软件中定义的、与物理PLC对应的通讯驱动连接。你需要告诉KingView,你要和谁说话(比如一台西门子S7-1200 PLC),通过什么方式说话(比如以太网、串口),以及说话的规则(协议,如S7协议、Modbus TCP)。这是所有数据来源的根基。如果设备定义错了,后面所有工作都是空中楼阁。

  2. 变量:这是KingView的灵魂。变量是软件内部用来代表PLC中某个具体数据点的抽象。例如,PLC的输入点I0.0(一个按钮信号)在KingView中可以定义一个名为“启动按钮”的I/O离散变量与之关联。变量分为多种类型:

    • I/O变量:与设备(PLC)直接关联的变量,值随PLC数据实时变化。这是监控的核心。
    • 内存变量:完全存在于KingView软件内部的变量,不与硬件关联。常用于中间计算、状态标志或画面内部的逻辑控制。
    • 结构变量:可以理解为自定义的数据类型,比如定义一个“电机”结构,包含“启动”、“停止”、“故障”、“转速”等多个成员变量。这在管理多个同类设备时非常高效。
  3. 画面:用户看到的监控界面。你可以在这里放置泵、管道、罐体、仪表盘、按钮、指示灯等图元。但画面本身是“静态”的,它需要和“变量”绑定,才能“活”起来。比如,一个代表电机的图形,其“填充颜色”属性绑定到一个名为“电机运行状态”的变量上,当变量值为1时显示绿色,为0时显示灰色。

  4. 命令语言:这是KingView的逻辑引擎。虽然它不像PLC编程那样处理高速的实时控制,但用于处理画面交互逻辑、数据运算、定时任务等绰绰有余。它主要出现在几个地方:

    • 应用程序命令语言:项目启动、运行期间、退出时执行的脚本。
    • 数据改变命令语言:当某个变量的值发生变化时触发执行。
    • 事件命令语言:当画面中某个图元被点击、鼠标移入移出等事件发生时触发。
    • 画面命令语言:与特定画面关联,画面打开或关闭时执行。
    • 动画连接:这其实是一种特殊的、可视化的命令语言。通过对话框配置图元属性(如位置、大小、颜色)与变量之间的函数关系,实现动画效果。

注意:很多新手会混淆“变量”和“画面动画”。记住一个原则:变量是数据载体,动画是数据表现。你应该首先规划好需要哪些变量(数据点),再去画面上思考如何展示它们。

2.2 标准工作流程:从零搭建一个监控画面

理解了核心要素,一个标准的开发流程就清晰了:

  1. 需求分析与变量规划:这是最容易忽视但最关键的一步。拿到工艺流程图或控制要求后,不要急着打开软件。拿出一张纸或Excel表格,列出所有需要监控的数据点。例如:

    • 数字量输入(DI):急停信号、到位传感器、按钮状态。对应PLC的I点。
    • 数字量输出(DO):电机启停、阀门开关、指示灯。对应PLC的Q点。
    • 模拟量输入(AI):温度、压力、流量。对应PLC的IW或ID区域。
    • 模拟量输出(AO):调节阀开度给定、变频器频率给定。对应PLC的QW或QD区域。
    • 内部寄存器:设备运行时间、产量计数、故障代码等。对应PLC的M、DB区。 为每个数据点规划一个清晰的变量名,如“反应釜温度_AIT101”、“输送电机运行状态_M101”。良好的命名习惯是后期维护的福音。
  2. 创建项目与设备配置:在KingView中新建项目,然后进入“设备”配置。选择你的PLC品牌和型号(如西门子->S7-1200->TCP),填写正确的IP地址、机架号、槽号(对于S7-300/400)、连接超时等参数。务必使用PLC编程软件(如TIA Portal)确认这些参数,并确保PC与PLC网络互通

  3. 定义变量数据库:在“数据词典”中,根据之前的规划,逐个创建变量。关键设置包括:变量名、变量类型(I/O实数、I/O离散等)、连接设备(选择上一步创建的设备)、寄存器地址。

    • 地址格式至关重要:这是与PLC通讯的钥匙。不同PLC的地址格式不同。
      • 西门子:M0.0(位),MW2(字),MD4(双字),DB1.DBX0.0(数据块位),DB1.DBD4(数据块双字)。
      • 三菱:X0Y1D100
      • 欧姆龙:CIO0.00DM100填错地址是导致通讯成功但数据不对的最常见原因。
  4. 绘制监控画面:使用KingView的图库和绘图工具构建界面。建议分层绘制:背景层(厂房轮廓、设备布局)、静态设备层、动态元素层。将图元的动画属性(如填充颜色、位置、大小、文本显示)与之前定义的变量绑定。

  5. 编写逻辑与交互:为按钮配置“命令语言”实现点击下发控制命令;利用“数据改变命令语言”实现报警触发、数据记录等;在“应用程序命令语言”中编写初始化脚本。

  6. 调试与运行:在开发系统(TouchView)中运行测试,通过“变量管理”工具强制变量值,模拟PLC信号,检查画面动画和逻辑是否正确。最后切换到运行系统,与真实PLC联调。

3. 核心环节实战:以西门子S7-1200通讯与电机控制为例

让我们通过一个最经典的案例——监控并控制一台三相异步电机的启停,来串联上述所有知识点。假设PLC为西门子S7-1200,电机由PLC的一个输出点Q0.0控制,一个启动按钮信号接入I0.0,一个停止按钮信号接入I0.1,一个故障信号接入I0.2,电机电流值存放在MD100中。

3.1 设备连接配置

在KingView设备库中,找到“PLC” -> “西门子” -> “S7-1200” -> “TCP”。新建一个设备,我们命名为“PLC_MAIN”。

  • 设备地址:这里填写S7-1200的IP地址,例如192.168.0.10
  • 通讯参数:通常保持默认即可(端口102,帧间隔等)。关键点是本地TSAP(传输服务访问点)和远程TSAP。对于S7-1200/1500的TCP通讯,通常设置为:
    • 本地TSAP:10.00(十进制) 或0x1000(十六进制)
    • 远程TSAP:03.00(十进制) 或0x0300(十六进制) 这个设置需要与PLC侧的配置匹配。在TIA Portal中,查看PLC设备属性->“防护与安全”->“连接机制”,需要勾选“允许来自远程对象的PUT/GET通信访问”。

实操心得:如果通讯连不上,首先ping一下PLC的IP,确保网络物理连通。然后检查TSAP设置和PLC侧的连接机制是否允许。KingView的“设备调试”功能非常好用,可以测试单个点的读写,是排查通讯问题的利器。

3.2 变量定义与地址映射

根据控制要求,我们在KingView的“数据词典”中定义以下变量:

变量名变量类型连接设备寄存器地址说明
StartBtnI/O离散PLC_MAINI0.0启动按钮(常开)
StopBtnI/O离散PLC_MAINI0.1停止按钮(常闭)
FaultSigI/O离散PLC_MAINI0.2故障信号(常开,1表示故障)
MotorRunI/O离散PLC_MAINQ0.0电机运行命令
MotorCurrentI/O实数PLC_MAINMD100电机电流值(假设已由PLC转换为浮点数,单位A)
MotorState内存离散内部用于画面显示的电机运行状态(1运行,0停止)
Alarm_OverCurrent内存离散内部过流报警标志

这里有一个关键技巧MotorRun是直接控制PLC输出的变量,而MotorState是一个内存变量,用于在画面上更稳定地显示状态。为什么?因为PLC的输出点Q0.0可能因为程序中的互锁、急停等逻辑瞬间变化,直接绑定可能导致画面指示灯频繁闪烁。我们可以用“数据改变命令语言”或画面逻辑,当MotorRun为1时,将MotorState置1并保持,直到收到停止信号或故障信号才清零,这样画面显示更稳定。

3.3 画面组态与动画连接

  1. 绘制静态元素:画出电机符号、按钮、电流表盘背景等。
  2. 制作动态指示灯:画一个圆形作为电机状态灯。右键点击它,选择“动画连接” -> “填充属性”。在弹出的对话框中,表达式关联变量MotorState。设置分段点:0对应红色(停止),1对应绿色(运行)。
  3. 制作电流显示:画一个“文本”图元,同样打开“动画连接” -> “数值输出”,表达式关联变量MotorCurrent,可以设置输出格式,如##0.0 A
  4. 制作控制按钮
    • 绘制一个“启动”按钮。右键 -> “动画连接” -> “触敏动作” -> “弹起时”。在弹出的命令语言窗口中输入:
      // 置位电机运行命令,同时更新状态显示 MotorRun = 1; MotorState = 1;
    • 绘制一个“停止”按钮。同样方法,在命令语言中输入:
      // 复位电机运行命令和状态 MotorRun = 0; MotorState = 0;
    • 绘制一个“复位”按钮(用于故障复位)。命令语言中可以对PLC的故障复位地址进行操作。

3.4 高级功能实现:报警与数据记录

单纯的监控还不够,异常报警和历史数据追溯是工业系统的刚需。

报警配置: 在KingView的“报警组”中定义报警,例如“电机过流报警”。然后,在“报警定义”中,新增一条报警。

  • 报警变量:选择MotorCurrent
  • 报警条件:选择“高高报警”或“高报警”,设定阈值,如> 50.0
  • 报警文本:填写“电机电流超过50A,请检查负载!”
  • 报警组:选择“电机报警组”。 这样,当电流超过50A时,KingView运行系统会自动在报警窗口显示这条信息,并可以触发声音、闪烁等提示。

数据记录: 如果想记录电机电流的历史曲线,需要配置“历史记录”。

  1. 在“变量”中,将MotorCurrent变量的“记录”属性打勾。
  2. 进入“历史记录”配置,设置记录周期(如每1秒记录一次)、保存天数、存储路径(通常为本地文件或数据库)。
  3. 在画面上插入一个“历史趋势曲线”控件,将其关联到变量MotorCurrent,并设置时间范围(如最近1小时)。这样,操作员就能直观地看到电流随时间的变化趋势。

4. 深度避坑指南与性能优化技巧

在实际项目中,仅仅实现功能是远远不够的。系统的稳定性、可维护性和性能同样重要。下面分享一些从坑里爬出来的经验。

4.1 通讯稳定性与故障排查

通讯是组态软件的命脉,也是最容易出问题的地方。

  • 问题一:通讯时断时续,画面数据刷新卡顿。

    • 排查思路
      1. 网络负载:检查网络是否拥堵。KingView与PLC之间如果数据量很大(尤其是大量浮点数、字符串),会占用较多带宽。使用Wireshark等工具抓包分析。
      2. 扫描周期:在KingView的设备定义中,有一个“数据采集优化”选项。对于S7-1200/1500,建议使用“异步采集”模式,并合理设置分组和扫描周期。不要将所有变量都放在一个快速扫描组里。将关键的、变化快的点(如急停、运行状态)放在一个组,周期设为100-200ms;将变化慢的点(如温度、累计值)放在另一个组,周期设为500-1000ms。
      3. PLC侧负载:PLC的循环周期是否过长?通讯处理(如PUT/GET服务器)是否占用了过多CPU资源?在TIA Portal中查看PLC的在线诊断。
    • 解决技巧:采用变量分组采集策略。在KingView中,可以为同一个PLC设备创建多个“逻辑设备”,每个逻辑设备指向同一个物理PLC,但设置不同的采集周期和变量组。这比在一个设备下管理所有变量更灵活。
  • 问题二:部分变量读写正常,部分变量始终为0或读写失败。

    • 排查思路:这几乎100%是地址错误数据类型不匹配
      1. 地址核对:逐字核对KingView中的变量地址与PLC程序中的绝对地址。注意字节序问题!西门子PLC的存储字节序与Intel PC一致(小端),但有些协议或特殊数据类型需要注意。对于双字(DWord)或浮点数(Float),确保地址是4字节对齐的(如MD100, MD104,而不是MD101)。
      2. 数据类型匹配:PLC中一个Real(浮点数)占4个字节。在KingView中定义变量时,类型必须是“I/O实数”,地址对应MDxx。如果PLC里是Int(整数),KingView中应选“I/O整数”,地址对应MWxx。
      3. DB块优化访问:对于西门子S7-1200/1500,频繁访问分散的M区或DB中单个变量效率较低。最佳实践是在PLC中创建一个专用的“通讯DB块”,将所有需要上传给上位机的数据(状态、模拟量)打包放在这个DB的连续区域中;同样,创建一个“下发DB块”接收上位机命令。在KingView中,只需要定义少数几个大的“I/O实数”或“I/O整数”数组变量,指向这些DB块的起始地址(如DB10.DBD0),然后通过KingView的脚本或间接访问方式解析这个数据包。这能极大提升通讯效率和稳定性。

4.2 画面设计与运行时性能

复杂的画面会消耗大量客户端(运行系统)的CPU和内存资源。

  • 禁忌一:在一个画面上放置成百上千个动态图元。

    • 后果:画面打开慢,切换卡顿,CPU占用率高。
    • 优化方案
      • 分页设计:按工艺流程或功能区划分多个子画面。使用“菜单”或“按钮”配合“ShowPicture()`函数进行导航。
      • 惰性加载:对于非当前焦点区域的设备,可以将其动画连接暂时禁用,或使用“图形模板”和“替换单元”技术,只在需要时实例化。
      • 简化图形:尽量使用KingView自带的、优化过的图库精灵,避免使用过于复杂或高分辨率的位图。
  • 禁忌二:在动画连接或命令语言中执行复杂的循环或频繁的变量操作。

    • 后果:脚本执行阻塞,导致画面响应迟钝,甚至软件假死。
    • 优化方案
      • 事件驱动:多用“数据改变命令语言”代替在“应用程序命令语言”中用While循环不断查询。
      • 延时执行:对于非实时性的操作,如定时生成报表,使用KingView的SetTimer()KillTimer()函数,避免阻塞主线程。
      • 变量访问优化:减少对同一变量的重复读取。如果需要多次使用一个变量值,先将其赋给一个局部内存变量。

4.3 项目维护与版本管理

工业项目生命周期长,后期维护和升级是常态。

  • 技巧一:规范的变量命名与注释。

    • 做法:采用“设备位号_参数类型”的命名方式,如P101_Run(泵101运行状态),TIC203_SP(温度控制器203设定值)。在变量定义的“描述”栏,详细写明该变量对应的物理意义、PLC地址、单位、量程等。画面上的每一个重要图元,也务必在“属性”中填写注释。三个月后,你自己都可能忘了那个红色的长方形是代表什么阀门。
  • 技巧二:使用“结构变量”和“图形模板”。

    • 场景:生产线有20台相同的电机,每台都需要监控运行、停止、故障、电流、频率。
    • 传统做法:定义100个独立变量,画20遍相似的图形,绑定100次动画连接。繁琐且易错。
    • 高级做法
      1. 定义一个“电机”结构变量,成员包括:Run (离散), Stop (离散), Fault (离散), Current (实数), Freq (实数)。
      2. 创建一个“电机监控面板”图形模板,里面的指示灯、按钮、数据显示框的动画连接都绑定到这个结构变量的成员上。
      3. 在画面上,从图库中插入20个“电机监控面板”实例,每个实例关联一个具体的“电机”结构变量(如Motor[1],Motor[2])。 这样,你只需要维护一个图形模板和一个结构定义,所有实例自动继承。修改模板,所有实例同步更新。
  • 技巧三:项目备份与版本注释。

    • 血泪教训:永远不要在唯一的工程文件上直接修改。KingView工程文件(.MPJ)是二进制格式,一旦损坏很难修复。
    • 规范操作:使用SVN、Git或简单的文件夹备份。每次重大修改前,复制整个工程文件夹,并重命名为“项目名_日期_修改内容简述”。在KingView工程内部,利用“工程注释”功能,记录每次版本更新的主要变更点。