就是图元对应的 ITagReader

时间:2021-10-28 09:04:21

一、   引子

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

 

就是图元对应的 ITagReader

这个步步触发,本色上是变量组(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。具体流程为:

网关的DataChange事件挪用SendData要领,将变革的Tag打包为HistoryData数组(包罗变量ID、值、时间戳);

Socket将HistoryData数组转换为字节流推送给客户端;

客户真个ClientDriver 包罗ReciveData要领,将字节流还原为HistoryData数组并触发客户端DataChange事件;

客户真个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