Как получить доступ к данным OPC DA сервера через Utgard в виде пакетов (100 сигналов одновременно)? - PullRequest
0 голосов
/ 24 октября 2018

Я нашел код в документации 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 сигналов в одной функции обратного вызова?

Пожалуйста, выскажите свои взгляды / мнения и просветите меня.Спасибо!

1 Ответ

0 голосов
/ 23 июля 2019
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 重新连接...." );
        }
    }

}
...