DB 接口模块设计 1 DbComm 设计 1.1 DbComm 通讯机制 1.1.1 通讯架构 DbComm 为Db 通讯组件的核心模块,其他模块实现如DbApi 和DbOcx,DbSdk都是在此核心模块基础上的二次封装,DbComm 采用静态库的方式提供。 DbComm 和Db 进行通讯,分为两种模式: 本地模式:采用窗口消息机制(COPYDATA)与本地 DB 进行通讯 远程模式:采用TCP 方式与远程 NetServer 进行通讯 同一时刻只能运行于一种模式,本地或者远程 DbComm本地模式远程模式DBNetServ er(DB) 不论本地还是远程模式,处理模块内部都将开辟两个线程: 数据处理线程:负责连接DB,初始化 DB,数据包的解析等工作 回调函数线程:负责按照需求进行回调(连接状态变化回调,数据变化回调) DbComm数据处理线程回调函数线程 所有调用函数都采用同步机制实现,发送给 DB 相应的请求以后将等待一个超时时间,如果 DB 返回数据,调用函数成功,如果超时,调用函数失败。为了防止交换数据过大,网络速率引起的时间延误,DBCOMM 在收到正确的数据包后将刷新超时时间,超时时间按照接收到最后一个正确的数据包计算,但最大时间不超过超时时间的10 倍。 1.1.2 数据流程 与DB 通讯流程(本地模式和远程模式的差别只是在于通讯链路的区别,通讯机制是相同的) DB 初始化:只有DB 初始化完成以后,向DB 发送各种命令才有意义 连接DB本地:FindWindow s远程:Tcp::Connect连接成功失败发送初始化DB命令命令成功失败DB初始化完成 当客户端注册数据通知以后,注册的数据点在获取数据时,默认从DbComm的内部缓存中读取数据(也可以强制从DB 读取数据),以加快数据的获取速度 对于注册点,内部采用计数机制,每一个数据点内部都有一个计数器,代表这个数据点的注册次数,注销的时候只有在计数为0 时,才真正注销计数。典型的应用为,有A、B 两任务,A 任务使用Tag1-10,10 个点的数据,B 任务使用Tag5-15,10 个点的数据,两任务有5 个点的交叉,这样一个任务不用去分辨那些点和其他任务交叉,主需要注册10 个点即可,在DbComm 内部会保存,Tag5-10的注册计数为2,只有调用两次注销函数,才会真正将点从缓存中去掉,这样会简化各个任务的处理机制。 DbComm数据缓存DB客户端 客户端注册数据时,可以动态增加或者删除注册点,以保证 DbComm 的灵活性,客户端注册数据成功后,可以调用函数读取所有注册点的数据 客户端注册数据后,变化通知或者读...