HDServiceImpl.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. package com.sckj.opc.dataservice;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
  4. import com.baosight.hdsdk.HDConnectionFactory;
  5. import com.baosight.hdsdk.HDDataProvider;
  6. import com.baosight.hdsdk.HDServerFactory;
  7. import com.baosight.hdsdk.HDTagManager;
  8. import com.baosight.hdsdk.domain.data.HDBasicTag;
  9. import com.baosight.hdsdk.domain.data.HDDataConnection;
  10. import com.baosight.hdsdk.domain.data.HDDataServer;
  11. import com.baosight.hdsdk.domain.data.HDRecord;
  12. import com.baosight.hdsdk.exception.HDSdkException;
  13. import com.google.common.eventbus.AsyncEventBus;
  14. import com.sckj.common.exception.OperateException;
  15. import com.sckj.common.manager.ScheduledTaskManager;
  16. import com.sckj.opc.dto.HdTagDTO;
  17. import com.sckj.opc.entity.OPCServer;
  18. import com.sckj.opc.entity.THdTag;
  19. import com.sckj.opc.service.OPCDataServiceImpl;
  20. import com.sckj.opc.service.OPCServerServiceImpl;
  21. import com.sckj.opc.service.THdTagServiceImpl;
  22. import lombok.extern.slf4j.Slf4j;
  23. import org.apache.commons.lang3.ObjectUtils;
  24. import org.springframework.beans.BeanUtils;
  25. import org.springframework.stereotype.Service;
  26. import javax.annotation.PreDestroy;
  27. import javax.annotation.Resource;
  28. import java.util.HashSet;
  29. import java.util.List;
  30. import java.util.Set;
  31. import java.util.concurrent.ConcurrentHashMap;
  32. import java.util.concurrent.TimeUnit;
  33. @Service
  34. @Slf4j
  35. public class HDServiceImpl {
  36. @Resource
  37. OPCServerServiceImpl opcServerService;
  38. @Resource
  39. THdTagServiceImpl hdTagService;
  40. @Resource
  41. OPCDataServiceImpl opcDataService;
  42. @Resource
  43. private AsyncEventBus asyncEventBus;
  44. //定时器
  45. @Resource
  46. private ScheduledTaskManager scheduledTaskManager;
  47. private ConcurrentHashMap<Long, HDDataConnection> mOPCDaClientMap = new ConcurrentHashMap<>();
  48. //存储ihd标记的定时任务
  49. private Set<String> taskNameSet = new HashSet<>();
  50. static {
  51. boolean isWindows = System.getProperty("os.name").toLowerCase().contains("windows");
  52. System.setProperty("java.library.path", isWindows ? "D:\\project\\xiha\\iron\\ihd\\win64_3.9.2_hdSDK3\\hdsdk\\executable_x64" : "/home/taphole/hdsdk/linux");
  53. try {
  54. java.lang.reflect.Field fieldSysPath = ClassLoader.class.getDeclaredField("sys_paths");
  55. fieldSysPath.setAccessible(true);
  56. fieldSysPath.set(null, null);
  57. } catch (Exception e) {
  58. e.printStackTrace();
  59. }
  60. final String soDir = System.getProperty("java.library.path");
  61. System.out.println("hdsdk path >>> java.library.path:" + soDir);
  62. if (isWindows) {
  63. System.loadLibrary("hdOS");
  64. System.loadLibrary("hdNetClient");
  65. System.loadLibrary("hdDNAPI");
  66. System.loadLibrary("hdKingAPI");
  67. System.loadLibrary("hdProcComm");
  68. System.loadLibrary("hdDataSDK");
  69. } else {
  70. final String SO_EXT = ".so.1.0.0";
  71. System.load(soDir + "/" + "libhdOS" + SO_EXT);
  72. System.load(soDir + "/" + "libhdNetClient" + SO_EXT);
  73. System.load(soDir + "/" + "libhdKingAPI" + SO_EXT);
  74. System.load(soDir + "/" + "libhdProcComm" + SO_EXT);
  75. System.load(soDir + "/" + "libhdDNAPI" + SO_EXT);
  76. System.load(soDir + "/" + "libhdDataSDK" + SO_EXT);
  77. }
  78. }
  79. /**
  80. * 测试连接
  81. */
  82. public void testConnection(OPCServer opcServer) throws HDSdkException {
  83. HDDataServer server = HDServerFactory.getHDDataServer(opcServer.getIp(), opcServer.getPort(), "", opcServer.getPort());
  84. HDDataConnection dataConn = null;
  85. try {
  86. dataConn = HDConnectionFactory.getHDDataConnection(server);
  87. dataConn.loginToServer(opcServer.getUsername(), opcServer.getPassword());
  88. System.out.println(dataConn);
  89. } finally {
  90. if (dataConn != null) {
  91. log.info("ihdk connection close");
  92. dataConn.dispose();
  93. }
  94. }
  95. }
  96. /**
  97. * 获得基础的连接信息
  98. */
  99. public HDDataConnection createConnection(OPCServer opcServer) {
  100. return mOPCDaClientMap.computeIfAbsent(opcServer.getId(), id -> {
  101. HDDataServer server = HDServerFactory.getHDDataServer(opcServer.getIp(), opcServer.getPort(), "", opcServer.getPort());
  102. HDDataConnection dataConn = null;
  103. try {
  104. dataConn = HDConnectionFactory.getHDDataConnection(server);
  105. dataConn.loginToServer(opcServer.getUsername(), opcServer.getPassword());
  106. } catch (HDSdkException e) {
  107. e.printStackTrace();
  108. }
  109. return dataConn;
  110. });
  111. }
  112. private void createSubscription(OPCServer opcServer, THdTag hdTag) {
  113. if (ObjectUtils.isEmpty(opcServer) || ObjectUtils.isEmpty(hdTag)) {
  114. throw new OperateException("未获取到服务器信息或未获取到标记信号");
  115. }
  116. scheduledTaskManager.addTask(hdTag.getTagName(), 0, hdTag.getPeriod(), TimeUnit.SECONDS, () -> {
  117. HDDataConnection connection = createConnection(opcServer);
  118. HDDataProvider dp = new HDDataProvider(connection);
  119. try {
  120. HDRecord hdRecord = dp.querySnapshotByTagID(hdTag.getTagId());
  121. log.info("{}:{}", hdTag.getTagName(), hdRecord.toString());
  122. asyncEventBus.post(hdRecord);
  123. } catch (HDSdkException e) {
  124. e.printStackTrace();
  125. log.info("{}订阅异常:{}", hdTag.getTagName(), e.getMessage());
  126. }
  127. });
  128. }
  129. /***
  130. * 订阅指定节点
  131. * @param hdTag
  132. */
  133. public void subscribe(THdTag hdTag) {
  134. HdTagDTO opcPointDTO = hdTagService.selectInfoWithServer(hdTag);
  135. if (ObjectUtils.isEmpty(opcPointDTO)) {
  136. throw new OperateException("未查询到该节点数据");
  137. }
  138. QueryWrapper<HdTagDTO> pointQueryWrapper = new QueryWrapper<>();
  139. pointQueryWrapper.lambda().eq(HdTagDTO::getStatus, "1");
  140. OPCServer opcServer = new OPCServer();
  141. BeanUtils.copyProperties(opcPointDTO, opcServer);
  142. opcServer.setId(opcPointDTO.getOpcServerId());
  143. createSubscription(opcServer, opcPointDTO);
  144. }
  145. /***
  146. * 取消订阅
  147. * @param tHdTag
  148. */
  149. public void unsubscribe(THdTag tHdTag) {
  150. taskNameSet.remove(tHdTag.getTagName());
  151. scheduledTaskManager.cancelTask(tHdTag.getTagName());
  152. }
  153. /***
  154. * 取消可用订阅
  155. */
  156. public void unsubscribeAvailable() {
  157. for (String taskName : taskNameSet) {
  158. scheduledTaskManager.cancelTask(taskName);
  159. }
  160. taskNameSet.clear();
  161. }
  162. /**
  163. * 项目启动时自动创建 PLC连接并订阅节点
  164. */
  165. public void subscribeAvailable() {
  166. QueryWrapper<OPCServer> serverQueryWrapper = new QueryWrapper<>();
  167. serverQueryWrapper.lambda().eq(OPCServer::getStatus, "1");
  168. List<OPCServer> opcServerList = opcServerService.list(serverQueryWrapper);
  169. if (ObjectUtils.isEmpty(opcServerList)) {
  170. throw new OperateException("没有可用的服务器!");
  171. }
  172. for (OPCServer opcServer : opcServerList) {
  173. QueryWrapper<THdTag> pointQueryWrapper = new QueryWrapper<>();
  174. pointQueryWrapper.lambda().eq(THdTag::getOpcServerId, opcServer.getId()).eq(THdTag::getStatus, "1");
  175. List<THdTag> opcPointList = hdTagService.list(pointQueryWrapper);
  176. if (ObjectUtils.isNotEmpty(opcPointList)) {
  177. log.info("start point list:");
  178. for (THdTag opcPoint : opcPointList) {
  179. log.info(opcPoint.getTagName());
  180. createSubscription(opcServer, opcPoint);
  181. }
  182. }
  183. }
  184. }
  185. /**
  186. * 读取节点数据
  187. *
  188. * @param hdTag
  189. * @throws Exception
  190. */
  191. public HDRecord readTagValue(THdTag hdTag) throws Exception {
  192. HdTagDTO opcPointDTO = hdTagService.selectInfoWithServer(hdTag);
  193. if (ObjectUtils.isEmpty(opcPointDTO)) {
  194. return null;
  195. }
  196. OPCServer opcServer = new OPCServer();
  197. BeanUtils.copyProperties(opcPointDTO, opcServer);
  198. opcServer.setId(opcPointDTO.getOpcServerId());
  199. HDDataConnection connection = createConnection(opcServer);
  200. HDDataProvider dp = new HDDataProvider(connection);
  201. HDRecord hdRecord = dp.querySnapshotByTagID(hdTag.getTagId());
  202. return hdRecord;
  203. }
  204. /***
  205. * 根据tagName刷新TagId
  206. */
  207. public void refreshTagIds() throws HDSdkException {
  208. QueryWrapper<OPCServer> serverQueryWrapper = new QueryWrapper<>();
  209. serverQueryWrapper.lambda().eq(OPCServer::getType, "3");
  210. List<OPCServer> opcServerList = opcServerService.list(serverQueryWrapper);
  211. if (ObjectUtils.isEmpty(opcServerList)) {
  212. throw new OperateException("没有可用的服务器!");
  213. }
  214. for (OPCServer opcServer : opcServerList) {
  215. HDDataConnection connection = createConnection(opcServer);
  216. if (null == connection) {
  217. continue;
  218. }
  219. try {
  220. QueryWrapper<THdTag> pointQueryWrapper = new QueryWrapper<>();
  221. List<THdTag> opcPointList = hdTagService.list(pointQueryWrapper);
  222. if (ObjectUtils.isNotEmpty(opcPointList)) {
  223. for (THdTag opcPoint : opcPointList) {
  224. log.info(opcPoint.getTagName());
  225. HDTagManager tagManager = connection.getTagManager();
  226. HDBasicTag basicTag = tagManager.getBasicTagByName(opcPoint.getTagName());
  227. if (ObjectUtils.isEmpty(basicTag)) {
  228. log.info("{}未查询到数据", opcPoint.getTagName());
  229. continue;
  230. }
  231. UpdateWrapper<THdTag> updateWrapper = new UpdateWrapper<>();
  232. updateWrapper.lambda()
  233. .set(THdTag::getTagId, basicTag.getId())
  234. .set(THdTag::getTagType, basicTag.getTagDataType().name())
  235. .eq(THdTag::getId, opcPoint.getId());
  236. }
  237. }
  238. } catch (HDSdkException e) {
  239. throw new RuntimeException(e);
  240. } finally {
  241. connection.dispose();
  242. }
  243. }
  244. }
  245. /***
  246. * 根据Tag名称获取普通类型Tag对象
  247. */
  248. public HDBasicTag getBasicTagByName(THdTag hdTag) throws HDSdkException {
  249. HDBasicTag basicTag = null;
  250. HdTagDTO opcPointDTO = hdTagService.selectInfoWithServer(hdTag);
  251. if (ObjectUtils.isEmpty(opcPointDTO)) {
  252. return basicTag;
  253. }
  254. OPCServer opcServer = new OPCServer();
  255. BeanUtils.copyProperties(opcPointDTO, opcServer);
  256. opcServer.setId(opcPointDTO.getOpcServerId());
  257. HDDataConnection connection = null;
  258. try {
  259. connection = createConnection(opcServer);
  260. HDTagManager tm = connection.getTagManager();
  261. basicTag = tm.getBasicTagByName(opcPointDTO.getTagName());
  262. } finally {
  263. if (connection != null) {
  264. connection.dispose();
  265. }
  266. }
  267. return basicTag;
  268. }
  269. @PreDestroy
  270. public void releaseServer() {
  271. if (ObjectUtils.isNotEmpty(mOPCDaClientMap)) {
  272. for (HDDataConnection server : mOPCDaClientMap.values()) {
  273. try {
  274. server.dispose();
  275. } catch (HDSdkException e) {
  276. e.printStackTrace();
  277. }
  278. }
  279. }
  280. }
  281. }