在一些大型的生产管理系统中,往往都会应用到人工录入历史数据功能,从而对生产数据进行系统的管理,这部分的数据不能够在仪表中采集到,只能通过人为的填写,这部分数据不但要存储到客户端,还要上传到服务器端进行显示,这样就会引发一个关键问题:如何做到服务器端与客户端的数据同步?下面提供三种解决方案。
第一种:服务器端直接调取客户端数据。
这种方案制作过程比较简单,只需要在服务器端针对于相应的客户端建立一个数据源,选择远程节点,并将IP指向客户端即可。如下图所示。
其中:主机名/地址为客户端的IP地址。当这一切配置好之后,只需在自由报表中调用GetHisDataEx()函数,在运行的情况下就可以调取到客户端的历史数据。GetHisDataEx()函数的声明如下:
GetHisDataEx(string DataSource,string VarName,int StartTime,int MilliSecond)。
其中:DataSource要填写相应客户端的数据源名称,VarName要填写该数据源下的数据库变量名称。这样当系统运行时,在服务器端就可以调取到客户端的数据了。但这中方案存在一个弊端,即当客户端停止运行或着客户端与服务器端通讯终端时,那么在服务器端则看不到客户端的任何数据。
第二种:客户端直接向服务器端插入历史数据。
这种方案与第一种方案基本类似,需要在客户端建立一个数据源,并指向服务器端,客户端在保存历史数据时调用InsertHisDataEx()函数,该函数的声明如下:
InsertHisDataEx(string DataSource,string VarName,real Data,int StartTime,int MilliSec)。
其中,DataSource要填写相应服务器端的数据源名称,VarName要填写该数据源下的数据库变量名称。这样在客户端与服务器端通讯正常的状态下,保存动作执行时,客户端就会直接向服务器端插入历史数据。服务器端在报表中调用GetHisDataEx()函数就可以调取到本地相应的数据。这种方案的弊端则是增大了客户端的负荷,会导致客户端运行速度变慢。优点则是在服务器端和客户端都存有数据,相当于做了一次数据备份。
第三种:客户端触发服务器端自行保存历史数据。
这种方案制作过程相对于前两种要复杂一些,首先要在服务器端建立一个数据源指向客户端,并在服务器端建立相应的点关联到客户端的点上。其次,在服务器端数据库全局脚本中编写一段存储这些点PV值的历史数据的脚本,通过一个标志位触发存储动作。客户端在保存历史数据时要把相应点的PV值也做修改,这样服务器上做了相应关联的点的PV值也会跟着做改变。在通过客户端触发服务器端的保存标志位,服务器端就会自行的将这部分数据存储下来,在运行的状态下通过报表调用GetHisDataEx()把历史数据调取出来即可。还可以在数据源高级选项中把数据故障恢复勾选上,如下图所示。即使因通讯中断,客户端无法触发服务器端的保存标志而导致两端数据不同步,在通讯恢复时,客户端也会自动的把这部分数据长传到服务器中,这样就更加全面的保证了两端数据的同步性。
第三种方案完全的解决了第二种方案中增加了客户端负荷的弊端,也解决了第一种方案中通讯中断时服务器端看不到之前历史数据的弊端,同时还具备了前两种方案中不具备的优势:故障数据恢复,因此在类似这种的案例中,推荐使用第三种方案。