gpt4 book ai didi

java - 如何通过Utgard批量访问OPC DA服务器数据(一次100个信号)?

转载 作者:太空宇宙 更新时间:2023-11-04 10:05:35 25 4
gpt4 key购买 nike

我在 Utgard 文档中找到了通过定义回调函数来单独访问信号的代码。

server.connect();

// add sync access, poll every 500 ms
final AccessBase access = new SyncAccess(server, 500);
access.addItem(itemId, new DataCallback() {

@Override
public void changed(Item item, ItemState state) {
System.out.println(state);
}

});

// start reading
access.bind();

// Sleeping thread infinitely to listen continuously
while(true){
Thread.sleep(10 * 1000);
}
// never comes here
access.unbind();

但是,在我的应用程序中,我需要获取 1000 个数量级的信号。因此,定义 1000 个回调函数并不是处理如此大量信号的好方法。

有什么方法可以在单个回调函数中获取所有 1000 个信号的值吗?

请提出您的观点/意见并启发我。谢谢!

最佳答案

package com.freud.dcom.utgard.cases;

import com.freud.opc.utgard.BaseConfiguration;
import org.jinterop.dcom.common.JIException;
import org.openscada.opc.lib.da.Group;
import org.openscada.opc.lib.da.Item;
import org.openscada.opc.lib.da.ItemState;
import org.openscada.opc.lib.da.Server;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.Executors;


/**
* 同步读取某个点位的值
*
* @author cc1500
*
*/
public class OpcValuesByItemIDs {
private static HashMap<String, Float> map3= new HashMap<>();
private static OpcValuesByItemIDs test =new OpcValuesByItemIDs();;
private static int wai=1000;
private static ItemState itemall;
private static Server server;
private static Group group ;
private static int Quality ,count,countarr;


public static void main(String[] args) throws Exception {

OpcCc( );
}
public static Server CreOpcCc( ) throws InterruptedException {

try {
server = new Server(
BaseConfiguration.getCLSIDConnectionInfomation(),
Executors.newSingleThreadScheduledExecutor());
server.connect();
group = server.addGroup();
}
catch ( Exception ee ) {
System.out.println ( "1 重新连接....1" );
synchronized(test) {
test.wait(10000);
}

CreOpcCc( );
}
return server;
}
public static void OpcCc( ) throws Exception {

CreOpcCc( );

try {

GetMapByFloa ssa= new GetMapByFloa();
///**
* Flat形式获取Item的信息 //GetMapByFloa
*/
map3= ssa.GetMapByFloa();
String[] vedioPics = new String[map3.size()];
int icon=0;

for (String key : map3.keySet()) {
vedioPics[icon] = key;
icon++;
}
Map<String, Item> items = group.addItems(vedioPics);
while (true) {
synchronized(test) {
test.wait(wai);
}
long startTime = System.currentTimeMillis();
countarr=1;
loop: for (Entry<String, Item> temp : items.entrySet()) {
dumpItem(temp.getValue());
countarr++;
if( wai==10000) {
break loop;
}
}
long endTime = System.currentTimeMillis();
System.out.println("===============================================");
System.out.println("轮询时间:(" + (endTime - startTime) + " + "+wai+")ms");
System.out.println("===============================================");
}
}
catch ( final JIException e ) {
wai=10000;
System.out.println("2 重新连接 2");
System.out.println ( String.format ( "%08X: %s", e.getErrorCode (), server.getErrorMessage ( e.getErrorCode () ) ) );
}
}
private static void dumpItem(Item sa ) {
try {
itemall= sa.read(false);
Quality =itemall.getQuality();
float val=0;
wai=1000;
if(Quality>0){
val= itemall.getValue().getObjectAsFloat();
}
else{
val=0;
}
System.out.println("[" + (++count) +"]["+countarr+ "]ItemID:[" + sa.getId()
+ "] ,value: " + Quality
+ "]\nvalue: " +val);

} catch ( final JIException e ) {
// wai=10000;
try {

OpcCc( );
}
catch ( Exception ee ) {
System.out.println ( "2 数据采集异常" );
}
System.out.println ( "1 重新连接...." );
}
}

}

关于java - 如何通过Utgard批量访问OPC DA服务器数据(一次100个信号)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52972325/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com