记录一下今天刚写完并且运行成功的代码和思路,关于工业协议OPC的数据读写,还有与数据库的交互相关问题,重点是批量,如何批量进行导出导入和更新。
OPC不用讲了,工业协议,做物联网的都知道。。。。= =其实就是个DLL包,没啥东西好说的,用人家的东西就行了。从设备上把数据读出来。
其实上个星期写过一个关于门禁系统的数据交互,大概功能是从某大厦把所有门禁的数据读出来,然后更新到数据库,保留数据,供查询使用,但是上次的思路是:
从OPCExplorer或者OPC Client中连接到OPC服务,然后显示所有的点之后,把所有点位用导出导成一个ini文件
如上图的导出,然后见到是ini文件是这样的:
在完成导出之后,根据ini文件里面的字段,自己手动建立一个mysql数据表,经过相关的整理(行转列),然后形成一张包含了OPC所有item点位信息的数据库表,然后在添加OPCitem的时候,用reader.read()(这个read()的是select from table的时候mysql的read方法,不是OPC的方法,后面提到的read()才是OPC的)来从数据库里添加,然后在用OPC的read去读,这种方法就是不直接从OPC服务端里面拿点位,是先把点位导出之后整理成数据库文件,从数据库文件里把点位添加上去,然后再读点位数据,这样如果点位不匹配的话,read()的时候OPC就会报错,因为人家服务端没有你这个点位,搜不到,也就加不上去,只有你数据库表里的所有点位跟OPC里的实际点位完全重叠,才能用这个方法,如果厂商添加了OPCitem,那就报错。
今天写的新OPC工具,目的就是为了解决OPC点位的问题,因为之前的方法不仅麻烦(从ini中手动把点位放到数据表中有大量重复工作),而且一旦点位变就会报错,还需要重新改数据库。这个OPC工具的思路就是:
全部工作在代码中完成,不需要手动去添加item数据,直接写一个代码把所有item从OPC中读出来,然后放到表中,然后读value再更新到表中,这样每次开启程序,就是先添加一遍所有点位,然后就按照设定的速率一直update数据库,这样就解决了老方法的多个问题。下面开始代码(C#):
OPCServer opcServer = new OPCServer();
OPCBrowser opcBrowser;
opcServer.Connect("ICONICS.SimulatorOPCDA.2");
Console.WriteLine("连接OPC成功!");
opcBrows