【问题标题】:Read OPC Values Utgard阅读 OPC 价值观 Utgard
【发布时间】:2015-09-12 15:49:59
【问题描述】:

我有这段代码用于从 kepware OPC 服务器读取值

package opcread;
import java.util.concurrent.Executors;
import org.jinterop.dcom.common.JIException;
import org.openscada.opc.lib.common.ConnectionInformation;
import org.openscada.opc.lib.da.AccessBase;
import org.openscada.opc.lib.da.DataCallback;
import org.openscada.opc.lib.da.Item;
import org.openscada.opc.lib.da.ItemState;
import org.openscada.opc.lib.da.Server;
import org.openscada.opc.lib.da.SyncAccess;

public class OPCRead {


    public static void main(String[] args) throws Exception {
        // TODO code application logic here
        final ConnectionInformation ci = new ConnectionInformation();
        ci.setHost("localhost");
        ci.setDomain("MYDOMAIN");
        ci.setUser("MY_COMPUTER_USERNAME");
        ci.setPassword("MY_COMPUTER_PASSWORD");
        ci.setProgId("Kepware.KEPServerEX.V5\\MP.ANC1._System._Mode");
        ci.setClsid("B3AF0BF6-4C0C-4804-A122-6F3B160F4397");
        final String itemId = "_System._Time_Second";

        final Server server = new Server(ci, Executors.newSingleThreadScheduledExecutor());

        try
        {
            server.connect();

            final AccessBase access = new SyncAccess(server, 500);
            access.addItem(itemId, new DataCallback(){
                @Override
                public void changed(Item item, ItemState state){
                    System.out.println("Data change " + item + " : " + state);
                }

            });

            access.bind();

            Thread.sleep(10*1000);

            access.unbind();
        }
        catch( final JIException e)
        {
            System.out.println("Errorrrrrrrr : " + String.format("%08X: %s", e.getErrorCode(),server.getErrorMessage(e.getErrorCode())));
        }
        catch(Exception ex)
        {
            System.out.println("Errorrrrrrrr : " + ex.getMessage());
        }
    }

}

我想读取 _Mode 标签上的值。我还在Kepware.KEPServerEX.V5\\MP.ANC1._System._Mode 上方给出了完整路径。但结果,它没有显示标签上存在的值,即userRate,而是给出以下消息

Sep 12, 2015 9:10:57 PM rpc.DefaultConnection processOutgoing
INFO: 
 Sending REQUEST
Sep 12, 2015 9:10:57 PM rpc.DefaultConnection processIncoming
INFO: 
 Recieved RESPONSE
Data change org.openscada.opc.lib.da.Item@11d7dda : Value: [[org.jinterop.dcom.core.JIUnsignedInteger@11d4b2e]], Timestamp: Sat Sep 12 21:10:57 IST 2015, Quality: 192, ErrorCode: 00000000

代替org.jinterop.dcom.core.JIUnsignedInteger@11d4b2e,它应该打印值,但会收到此消息。我在这里做错了什么?

【问题讨论】:

    标签: java opc


    【解决方案1】:

    您需要明确地从变体中获取值,如下所示:

    access.addItem(itemId, new DataCallback() {
        @Override
        public void changed(Item item, ItemState state) {
            System.out.println("Data change " + state.getObjectAsUnsigned().getValue() + " : " + state);
        }
    });
    

    【讨论】:

    • 我在使用 state.getObjectAsUnsigned().getValue() 时出错,但在使用 state.getValue().getObjectAsUnsigned() 时没有出错。现在也得到回复Data change org.openscada.opc.lib.da.Item@11d7dda : Value: org.jinterop.dcom.core.JIUnsignedInteger@11d4b2e
    • 更改为state.getValue().getObjectAsUnsigned().getValue().toString() 后,我没有得到org.jinterop.dcom.core.JIUnsignedInteger@11d4b2e,而是得到像23、24、25 这样的数字。但Kepware.KEPServerEX.V5\\MP.ANC1._System._Mode 包含字符串值。我期待着。为什么我收到数字?
    • 您获得数字是因为您使用了 addItem 和项目 ID _System._Time_Second。所以你得到了秒。
    猜你喜欢
    • 2020-03-08
    • 2023-03-25
    • 2011-08-10
    • 1970-01-01
    • 2018-02-10
    • 2018-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多