开源纯C#工控网关+组态软件(五)从网关到人机界面

一、   引子

之前都在讲网关,不少网友关注如何实现界面。想了解下位机变量变化,是怎样一步步触发人机界面动画的。

这个步步触发,实质上是变量组(Group)的批量数据变化(DataChange)事件,引发了变量(Tag)的值更新(ValueChange)事件,最终触发了图元的动画脚本(Action)。这是一个连锁反应。

简言之,界面是一批叫Tag乘客,从网关坐TLV协议的列车,到了上位机车站下车,在ClientService这个舞台上,用各自的乐器(ITagReader)演奏了一出交响乐。

二、   承上启下的核心对象:Tag

Tag(标签或者叫变量)是整个项目的核心对象。所谓核心对象,就是它无所不在,是动态的,流动的,就像血液融汇贯通。

实质上,Tag对下位机,就是一个个传感器的数据、一个个开关信号;对上位机,就是一个个按钮、仪表盘、电机。

Tag在变量管理器(TagConfig)产生,在系统初始化时分配,存在于人机界面程序和网关服务的各个角落,它们的值和时间戳在不断的变化。

对上位机设计者,用到的是Tag的名字、Tag的数据类型;对下位机设计者,看到的是Tag的地址、Tag的长度。对变量报警和数据归档,需要知道Tag的时间戳。

所有的Tag继承于ITag接口。Tag的类型就是数据的类型,有FloatTag(浮点型)、BoolTag(逻辑型)、还有整型、字符型。不同类型对应IReaderWriter接口的ReadXXX方法。

Tag可以主动去读(Read)写(Write),也可以被动的刷新(Update),强制刷新(Refresh)。

Tag的Read方法是调用所属Group、最终是调用所属IDriver的ReadXXX方法从下位机读入数据。但Tag的主要应用场景是被动刷新触发ValueChanged事件,以驱动人机界面。

三、   上下位机连接的纽带:TLV协议

前文已经阐述了网关如何通过轮询下位机、推送批量数据给上位机。上位机需要将推送来的数据流解析为一堆变化的Tag,以驱动整个人机界面和控制逻辑。

网关和上位机之间通讯,我这里使用了一个自定义的简单的TLV协议(Tag-Length-Value),承载于Socket。

这个协议包括两部分:

  • 数据推送:将网关一端变化的Tag打包封装,传输给客户端;客户端拆包,还原为一堆Tag。具体流程为:
  1. 网关的DataChange事件调用SendData方法,将变化的Tag打包为HistoryData数组(包含变量ID、值、时间戳);
  2. Socket将HistoryData数组转换为字节流推送给客户端;
  3. 客户端的ClientDriver 包含ReciveData方法,将字节流还原为HistoryData数组并触发客户端DataChange事件;
  4. 客户端的DataChange事件将HistoryData数组转换为Tag数组,并调用Tag的Update,触发ValueChanging和ValueChanged事件。
  • 指令:客户端主动向网关发送指令,一般用来读、写特定变量或一批变量,还可以查询历史归档、查询报警等。指令格式如下:

指令码FCTCOMMAND:包含各种命令;参数:如读入时间段内所有归档数据,则需要起始时间、结束时间;读入变量,则需要变量ID。返回值:网关接收指令并返回数据,也是字节流。

    public class FCTCOMMAND
    {
        public const byte fctHead = 0xAB;//报头可加密,如报头不符,则不进行任何操作;客户端Socket发送报警请求,封装于Server
        public const byte fctHdaIdRequest = 30;//按变量ID读入历史数据
        public const byte fctHdaRequest = 31;//读时间段内所有历史数据
        public const byte fctAlarmRequest = 32;//读报警数据
        public const byte fctOrderChange = 33;//读订单
        public const byte fctReset = 34;//重置指令,一般用来释放网关套接字
        public const byte fctXMLHead = 0xEE;//xml协议
        public const byte fctReadSingle = 1;//读单一变量
        public const byte fctReadMultiple = 2;//读多个变量
        public const byte fctWriteSingle = 5;//写单一变量
        public const byte fctWriteMultiple = 15;//写多个变量
    }

四、   人机界面的驱动引擎:ClientService

客户端的 ClientService与网关的DAService如出一辙:都具有相类似的结构,继承了IDataServer, IAlarmServer,都从同一个数据库加载驱动、组、变量、报警:

客户端的:

public sealed class DAServer : IDataServer, IAlarmServer, IHDAServer

网关的:

public class DAService : IDataExchangeService, IDataServer, IAlarmServer

只是多了一个IHDAServer,具有查询历史数据的功能,而历史数据归档是网关的功能。

因此,ClientService也带有自己的驱动ClientDriver,ClientDriver也带有自己的组ClientGroup。

注意的是,ClientDriver是上位机唯一的Driver,ClientGroup也是ClientDriver唯一的Group。这是因为上位机无需和各类型下位机打交道,与它打交道的唯一对象就是网关本身。

因此,人机界面的各类操作指令,如按按钮、读归档数据、查询报警等,最终都反映成TLV协议指令发送给网关,并得到反馈。

而人机界面图元的动画,都是来自网关推送的Tag,触发ValueChanged事件;事件的订阅者,就是图元对应的ITagReader,图元动画的幕后指挥。

五、   图元动画的幕后指挥:ITagReader

ITagReader接口为所有图元组件继承,它的功能就是将Tag与动画绑定。先看下结构:

    public interface ITagReader : ITagLink
    {
        string TagReadText { get; set; }
        string[] GetActions();
        Action SetTagReader(string key, Delegate tagChanged);
        IList<ITagLink> Children { get; }
    }

TagReadText属性,就是与图元动画关联的变量表达式:形如Tag1*2+Tag2*5>10。我实现了一个自定义表达式编译器Eval,可以解析表达式语法,分离出Tag1和Tag2。这段代码在Example-WindowHelper-BindingControl。

接着,图元组件订阅Tag1和Tag2的ValueChanged事件。

如果值发生变化,这个事件内部会执行SetTagReader,计算表达式的结果,并向界面发送指令。

如果Tag1*2+Tag2*5>10,此时Tag1=1,Tag2=2,满足条件,最终会产生一个动画脚本:Action。这个Action可以是让电机报警,颜色变为闪烁的红色;也可以是点亮一盏灯,或打开一座阀门。下文会详细阐述。

从网关到人机界面流程:

六、   下面的计划

写一系列帖子,把架构、原理讲清楚。大致如下:

  • 网关层接口概述
  • 上下位机通讯原理
  • 如何实现一个设备驱动
  • 从网关到人机界面
  • 如何设计图元
  • VS插件模块及原理
  • 归档模块及文件格式
  • 如何进行功能扩展
  • 组态变量表达式实现

github地址:https://github.com/GavinYellow/SharpSCADA。QQ群:102486275

时间: 2024-10-10 08:46:05

开源纯C#工控网关+组态软件(五)从网关到人机界面的相关文章

工控领域组态软件开发感触

从2001年进入工控领域以来,前后7年多的时间开发了诸如二型计量监控系统.焦炉四大机车自动化系统.烧结配水监控系统.隧道广告影像系统.通用组态软件.嵌入式系统组态软件(基于WINCE系统).LED视频影像系统和ICU病室输液管理等系统.其中焦炉四大机车自动化系统获得了国家专利,而隧道广告影像系统目前发展势头良好,在北京地铁(2号线.4号线),深圳地铁(罗宝线)都已实施安装,未来上海和国外也将安装该系统. 开发这些系统最大的感触就是,初次开发相对比较容易,但是后续系统扩展,维护相对较难,在系统架构

!!!易控INSPEC组态软件开发小结——-一次工程文件损坏和处理经过

从加入红橡开始熟悉和使用易控(INSPEC)组态软件,值得赞扬的是INSPEC的开放性和对C#语言的支持,除此之外,便也没有感觉它与其他组态软件有太多优势,有人说INSPEC软件授权比国内其他同类的组态软件便宜,姑且认为这也是其中一强项吧. 海淘的东西好不好,得到货了拿到手里用过才知道,组态软件也是一个道理,作为一种开发工具,上手比较容易,具备一些开发经验的可以很快熟练,甚至“精通”.但是它作为一种组态开发工具软件,更多的还需要在实际项目开发过程中摸索,碰到石头伤着了会感到痛,因为害怕疼痛,所以

101电力通信协议规约光伏电站并网发电云组态软件SCADA智能网关

方案需求 光伏电站并网发电由太阳能光伏电池板.逆变器以及输变电设备组成.光伏发电监控管理系统,通过数据采集监测分析,调动终端硬件设备,优化配置并共同发生作用,有效整合发电资产设备,需要对大量参数进行测量.保存.分析和控制. 将光伏电站的逆变器.汇流箱.辐照仪.气象仪.电表等设备通过RS232/RS485连接数传终端,通过2G/3G/4G等方式上传到网络服务器或管理中心本地电脑,运维人员在电脑上查看相关数据和管理.从小规模的建筑光伏.金太阳工程等到大型荒漠电站以及各种形式的光伏电站,都存在数据显示

几种组态软件的比較

随着工业自己主动化水平的迅速提高,计算机在工业领域的广泛应用,人们对工业自己主动化的要求越来越高,种类繁多的控制设备和过程监控装置在工业领域的应用,使得传统的工业控制软件已无法满足用户的各种需求.在开发传统的工业控制软件时,当工业被控对象一旦有变动,就必须改动其控制系统的源程序,导致其开发周期长:已开发成功的工控软件又由于每一个控制项目的不同而使其反复使用率非常低,导致它的价格非常昂贵:在改动工控软件的源程序时,倘若原来的编程人员因工作变动而离去时,则必须同其它人员或新手进行源程序的改动,因而更

分享一款免费的工控组态软件(PCHMI)

PCHMI严格的讲它并不是一款组态软件,也不是一款SCADA软件,而是一个基于.NET构架的DLL文件,开发者可以使用微软的Visual Studio将PCHMI.DLL加载到工具箱里面进行二次开发.开发者不用去学习那些没有用的脚本语言,借助Visual Studio对多语言的支持.比如:C#.VB.C++.F#.JS.J#.Python等.你只需要使用你最熟悉的那门语言,就可以对PCHMI进行复杂的二次开发.当然这不是PCHMI的初衷,作者已经将工业组态中最常用的功能进行了模块化封装.开发者只

工控组态软件有那些

常用的工业组态软件有: PCHMI InTouch iFix WinCC 组态王 Citech 力控 Cimplicity RSView Wizcon MCGS DIAView LabView BLUE Open Studio   原文地址:https://www.cnblogs.com/xcwzj123/p/12374767.html

三维力控组态软件7.0 开发+运行 无限点 USB加密狗批发

三维力控组态软件7.0 开发+运行 无限点   USB加密狗 长期批发,量大价优,加税点可开正规机打发票 支持主流操作系统 ForceControl V7.0 是一个完全集成的工业控制软件产品,完全兼容微软的32/64位Windows 7及Windows Server 2008操作系统,通过提供可靠.灵活.高性能的监控系统平台,以及简单易用的配置工具和强大的功能使您能够针对各种规模的应用进行快速开发并部署. 丰富的图形处理能力 通过ForceControl V7.0提供的组态开发环境,系统集成工

最新工控\建模仿真\组态\监控集成开发平台源码解决方案2018

最新工控\建模仿真\组态\监控集成开发平台源码解决方案2018 -- ---所有VC++源码100%提供! 使用E-Form++可视化企业版本,构建属于自己的专业工控.建模仿真. 监控组态.培训仿真平台! -- 100%源码 (全部采用Visual C++/MFC编写)彻底开放组态平台!  下载E-Form++全功能免费评估版本 -- 下载地址 (2018年全新!)  下载此组态解决方案-- 下载地址1 下载地址2 (2018年全新!) HMI硬件采集数据接口代码及说明: 下载硬件数据接口dll

组态王 力控 MCGS 瑞尔 杰控等国内组态软件一点看法

从结构上说,组态王和MCGS一样,前台动画和后台集成在一起,在运行模式下一起运行.而力控.瑞尔却分为后台驱动.实时数据库.前台三部分组成,更为有意思的是,瑞尔的每一个驱动就是一个EXE,其驱动DLL的接口和力控的一致,不知他们是同出一源,还是互为"切磋"! 一般组态程序都是用MFC实现,驱动更是用VC实现,但MCGS却反其道而行之,用VB开发驱动,其效率和稳定性可见一斑.在具体的驱动应用上,组态王要做的好的多,比如PPI协议,一旦设备通信失败,组态王会用短命令(登录命令)测试,直到通信