IChannel
Interface
定义了通道(Channel)的基本功能和属性,如名称(Name
)、插件标识(PluginId
)、值(Value
)、是否只读(IsReadOnly
)、状态标志(StatusFlags
)等。
提供了事件,如PropertyChanged
和ValueChanged
,用于通知其他部分通道属性或值的变化。
是一个契约,规定了通道类需要实现的成员。
BaseChannel
Abstract Class
实现了IChannel
接口,提供了通道的基本功能和公共实现。
包含了通道的核心属性和方法,如获取通道名称、类型、值,以及更新值和状态的方法。
提供了抽象方法DoUpdate()
和虚方法DoUpdate(object value)
、DoUpdate(object value, DateTime externalTime, ChannelStatusFlags status)
,供子类根据具体通信协议实现数据更新逻辑。
具备线程安全机制,使用lock
关键字确保在多线程环境下数据的一致性和完整性。
是一个抽象基类,不能直接实例化,需要由子类继承并实现抽象方法。
OPCBaseChannel
Class
继承自BaseChannel
抽象类,是针对OPC(OLE for Process Control)协议通信的具体实现。
包含了与OPC服务器通信相关的属性,如OPC通道名称(OpcChannel
)、OPC服务器名称(OpcServer
)、OPC主机(OpcHost
)、连接组(opcConnection
)和OPC句柄(opcHandle
)。
重写了Value
属性的set
访问器,在设置新值时,会通过OPC连接将值写入OPC服务器,并调用基类的DoUpdate
方法更新本地值。
提供了Connect
和Disconnect
方法,用于与OPC服务器建立和断开连接。
重写了DoUpdate
方法,目前为空,需要根据具体OPC通信逻辑进行实现。
数据流向
数据从OPC服务器流向OPCBaseChannel
:
OPCBaseChannel
通过Connect
方法与OPC服务器建立连接,并获取到OPC句柄opcHandle
。
当需要从OPC服务器读取数据时,OPCBaseChannel
通过其内部的OPC连接(opcConnection
)从OPC服务器读取数据。
读取到的数据会更新到OPCBaseChannel
的Value
属性中。
更新Value
属性会触发基类的FireValueChanged
方法,进而引发PropertyChanged
和ValueChanged
事件,通知其他订阅者数据已更新。
数据从OPCBaseChannel
流向OPC服务器:
当OPCBaseChannel
的Value
属性被设置时,如果通道不是只读的,并且与OPC服务器的连接已建立,它会通过opcConnection.WriteChannel(opcHandle, value)
将新值写入OPC服务器。
同时,它会调用基类的DoUpdate
方法更新本地值和状态。
数据在OPCBaseChannel
内部流动:
通道的状态(StatusFlags
)可以通过StatusFlags
属性设置,这会更新modifyTime
并触发FireValueChanged
方法,进而引发相关事件。
通道的重置操作(Reset
方法)会将值恢复为默认值,并更新状态和时间。
数据从OPCBaseChannel
流向其他部分:
通过PropertyChanged
事件,当通道的Value
、ModifyTime
、Status
或StatusFlags
属性发生变化时,会通知其他订阅者(如用户界面或数据处理模块),使它们能够获取到最新的数据。
通过ValueChanged
事件,当通道的值发生变化时,会通知其他订阅者,使它们能够对值的变化做出响应。
总结
这三个类的关系和数据流向如下:
IChannel
定义了通道的契约,BaseChannel
实现了这个契约并提供了通用功能,OPCBaseChannel
继承自BaseChannel
并实现了针对OPC协议的具体功能。
数据从OPC服务器流向OPCBaseChannel
,更新其值和状态;OPCBaseChannel
内部处理数据的更新和状态变化,并通过事件将数据变化通知给其他部分。
这种设计通过接口和抽象类实现了代码的复用和扩展性,使得可以方便地添加对其他通信协议的支持,只需继承BaseChannel
并实现相应的通信逻辑即可。