opc 带有session
现在使用java来做工控系统的几种方式:
知识储备:
一、OPC Server端目前常见的有以下几种协议:
参考博客:
https://www.cnblogs.com/ioufev/articles/9697717.html
https://www.cnblogs.com/ioufev/articles/9697890.html
二、DOCM的配置
可以参考https://www.cnblogs.com/ioufev/p/9365919.html
三、OPCServer服务器属性
java 获取OPCServer的方式有两种,
1、jeasyopc:适用于32位操作系统
2、Utgrad :可跨平台

可以根据具体情况具体分析,相比较对于初次接触来说jeasyopc相对简单。
四、试验模拟OPC
1、实验用模拟OPCServer(50M):MatrikonOPC
2、实际OPCServer使用(450M,中文):KEPServer V6
Utgard:
官网:http://openscada.org/projects/utgard/
博客参考
https://www.cnblogs.com/ioufev/articles/9894452.html
https://elfasd.iteye.com/blog/2064410
JeasyOPC:
博客参考:
https://blog.csdn.net/qq_33720460/article/details/78478430
https://blog.csdn.net/wangzhi291/article/details/45029799
https://blog.csdn.net/diyu122222/article/details/77645668
五:本人只采用了UtgradUt开发用例
/**
* OPCServer 客户端连接
*/
public class UtgrandClient {
private final String LOCAL_HOST="10.0.0.17";//OPCServer服务器IP
private final String USER_NAME ="OPCServer";//DOCM配置时OPCServer的用户名
private final String PASS_WORD ="Admin123";//密码
private final String CLS_ID ="7BC0CC8E-482C-47CA-ABDC-0FE7F9C6E729";//cls_id
private final String DOMAIN ="";
private int count;
Server server =null;
public void utGrandReadData(){
System.out.print("*********************************");
System.out.print("************启动加载配置项*********");
System.out.print("*********************************");
final ConnectionInformation ci =new ConnectionInformation();
ci.setHost(LOCAL_HOST);
ci.setUser(USER_NAME);
ci.setPassword(PASS_WORD);
ci.setClsid(CLS_ID);
ci.setDomain(DOMAIN);
if (ci.getClsid() !=null ){
JISession session = JISession.createSession ( ci.getDomain (),ci.getUser (),ci.getPassword () );
session.setGlobalSocketTimeout ((int) System.currentTimeMillis());
session.useSessionSecurity(true);
server =new Server(ci,Executors.newSingleThreadScheduledExecutor());
}else if (ci.getProgId () !=null){
JISession session = JISession.createSession ( ci.getDomain (), ci.getUser (), ci.getPassword () );
session.setGlobalSocketTimeout ((int) System.currentTimeMillis());
session.useSessionSecurity(true);
server =new Server(ci,Executors.newSingleThreadScheduledExecutor());
}
try {
server.connect();
Group group = server.addGroup("VC");
Item item = group.addItem("k.k.k");
// Map items = group.addItems("Random.Real1",
// "Random.Real2", "Random.Real3", "Random.Real4");
dumpItem(item);
// for (Entry temp : items.entrySet()) {
// dumpItem(temp.getValue());
// }
}catch (Exception e) {
e.printStackTrace();
}
}
/**
* 读取监测点
* @param item
* @throws JIException
*/
private void dumpItem(Item item)throws JIException {
System.out.println("[" + (++count) +"],ItemName:[" + item.getId()
+"],value:" + item.read(true).getValue());
}
}
/**
* 使用线程来控制 opc client连接,优化运行机内存。(48小时测试内存无增长)
*/
public class ThreadUtgrad {
private Date date;//对象锁
private boolean flag =false;//控制唤醒或等待线程
public ThreadUtgrad() {
date =new Date();
}
public ThreadUtgrad(Date date){
this.date = date;
}
public void run() {
while(true){
synchronized(date){
if(flag){
try {
Thread.sleep(500);
}catch (InterruptedException e) {
e.printStackTrace();
}
date.notify();
flag =false;
}
}
}
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
class PrintMessageextends Thread{
@Override
public void run() {
UtgrandClient utgrandClient =new UtgrandClient();
while(true){
synchronized(date){
if(!flag){
try {
flag =true;
date.wait();
}catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("0.5秒的消息");
utgrandClient.utGrandReadData();
}
}
}
}
@PostConstruct
public void startUtgrandClient() {
Date date =new Date();
//打印5秒消息的线程
ThreadUtgrad threadUtgrad =new ThreadUtgrad(date);
PrintMessage printMessage = threadUtgrad.new PrintMessage();
printMessage.start();
threadUtgrad.run();
// //不影响打印线程的7秒消息线程
// new Thread(new Runnable(){
//
// @Override
// public void run() {
// while(true){
// try {
// Thread.sleep(7000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// System.out.println("7秒的消息");
// }
//
// }
//
// }).start();
}
作者:MartinX_c56e
链接:https://www.jianshu.com/p/afb45f585731
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
opc 带有session的更多相关文章
- php中session原理及安全性问题
有一点我们必须承认,大多数web应用程序都离不开session的使用.这篇文章将会结合php以及http协议来分析如何建立一个安全的会话管理机制 我们先简单的了解一些http的知识,从而理解该协议 ...
- ASP.NET中的Session怎么正确使用
Session对象用于存储从一个用户开始访问某个特定的aspx的页面起,到用户离开为止,特定的用户会话所需要的信息.用户在应用程序的页面切换时,Session对象的变量不会被清除. 对于一个Web应用 ...
- session 安全相关
有一点我们必须承认,大多数web应用程序都离不开session的使用.这篇文章将会结合php以及http协议来分析如何建立一个安全的会话管理机制.我们先简单的了解一些http的知识,从而理解该协议的无 ...
- php中session机制的详解
[补充]session_start()要放在php最前面,header()函数也要放在session_start()之后. [读了下面的文章转载的文章后自己的理解]: 1,通过phpinfo()函数可 ...
- ASP.NET中的Session怎么正确使用[转]
Session对象用于存储从一个用户开始访问某个特定的aspx的页面起,到用户离开为止,特定的用户会话所需要的信息.用户在应用程序的页面切换时,Session对象的变量不会被清除. 对于一个Web应用 ...
- Session的工作机制详解和安全性问题(PHP实例讲解)
我们先简单的了解一些http的知识,从而理解该协议的无状态特性.然后,学习一些关于cookie的基本操作.最后,我会一步步阐述如何使用一些简单,高效的方法来提高你的php应用程序的安全性以及稳定行. ...
- 集群session的一致性
一. 何为session 用户使用网站的服务,基本上需要浏览器和web服务器进行多次交互,web服务器如何知道哪些请求是来自哪个会话的? 具体方式为:在会话开始时,分配一个唯一的会话标识(sessio ...
- 【译文】漫谈ASP.NET中的Session
最近这两天被一个Web Farm环境下的Session处理问题虐得很痛苦,网上到处找解决方案,在无意中翻看到这篇文章,感觉很不错,顺手查了一下,貌似没有现成的译文,于是一咬牙一跺脚把这篇文章翻译出来了 ...
- 【转】你必须了解的Session的本质
有一点我们必须承认,大多数web应用程序都离不开session的使用.这篇文章将会结合php以及http协议来分析如何建立一个安全的会话管理机制.我们先简单的了解一些http的知识,从而理解该协议的无 ...
随机推荐
- Java : 对象不再使用时,为什么要赋值为 null ?
今天遇到一个比较有意思的问题,对象不再使用时,为什么要赋值为 null ? 在这里我看到一篇文章说的不错,下面是网址,有兴趣的IT友可以看看. https://mp.weixin.qq.com/s/Z ...
- temp数据预处理--以24h为周期的序列
1.按照周期来截取数据 从数据库加载下来的是以5min取一次mean()的列,因此24h应取了24*60/5=288次数据 首先把这8352个数据(最后一个以倒数第二个填充)改成288*30的形式 t ...
- solr query没有反应,地址报错查询的地址error
随便修改了一下angular.js,保存,再修改,就可以查询了 问题应该是对文件没有操作权限.感觉solr在部署时对文件的授权还是很重要的
- python_公共方法
1.计算长度 value = "wangdianchao" # 计算字符个数(长度) number = len(value) print(number) 2.索引取值 value ...
- 用CSS实现定位DIV绝对位于网页底部
网上有一些解决方案,但会出现当改变窗口高度时,底部和正文重叠的BUG.尽管没有多少人会有事没事儿的去改变窗口高度,但设计嘛,追求的就是尽善尽美. 下面是我找到的一个比较完美的方法,来自国外的设计达人, ...
- Codeforces Round #539 (Div. 1) E - Sasha and a Very Easy Test 线段树
如果mod是质数就好做了,但是做除法的时候对于合数mod可能没有逆元.所以就只有存一下mod的每个质因数(最多9个)的幂,和剩下一坨与mod互质的一部分.然后就能做了.有点恶心. CODE #incl ...
- bootstrap-vue 中 model 基础用法
Model 官方文档: https://bootstrap-vue.js.org/docs/components/modal <b-modal v-model="labelModal ...
- sizeof +数组名
链接:https://www.nowcoder.com/questionTerminal/daa5422cb468473c9e6e75cc98b771de 来源:牛客网 sizeof一个数组名称的时候 ...
- 8月清北学堂培训 Day6
今天是杨思祺老师的讲授~ 图论 双连通分量 在无向图中,如果无论删去哪条边都不能使得 u 和 v 不联通, 则称 u 和 v 边双连通: 在无向图中,如果无论删去哪个点(非 u 和 v)都不能使得 u ...
- certbot 配置https屏蔽询问选项
平常直接在终端,刷https时,要sudo certbot --nginx这样执行,但是中间会出现选项,让选择. 写程序用脚本操作时,希望跳过这些选项,就用--agree-tos 参数,一步到位. s ...