1

我在 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 个信号的值吗?

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

4

1 回答 1

0
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 重新连接...." );
        }
    }

}
于 2019-07-23T06:26:02.093 回答