2015-09-12 3 views
0

У меня есть этот код, который должен считывать значения из Kepware OPC сервераRead OPC Значение Utgard

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 [email protected] : Value: [[[email protected]]], Timestamp: Sat Sep 12 21:10:57 IST 2015, Quality: 192, ErrorCode: 00000000 

На месте [email protected], он должен напечатать значение, но получить это сообщение. Что я тут делаю?

ответ

1

Вы должны получить значение из варианта в явном виде, как это:.

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

я получаю сообщение об ошибке при использовании 'state.getObjectAsUnsigned() ПолучитьЗначение()', но не получаю сообщение об ошибке при использовании 'state.getValue () .getObjectAsUnsigned() '. Теперь также получим ответ как «Изменение данных [email protected]: Значение: org.jinterop.dcom.core.JIUnsignedInteger @ 11d4b2e' –

+0

После изменения на' state.getValue(). GetObjectAsUnsigned() .getValue(). toString() 'Я не получаю' org.jinterop.dcom.core.JIUnsignedInteger @ 11d4b2e', но вместо этого получаю цифры, такие как 23,24,25. Но 'Kepware.KEPServerEX.V5 \\ MP.ANC1._System._Mode' содержит строковое значение. Я ожидал этого. Почему я получаю номера? –

+0

Вы получаете номера, потому что используете 'addItem' с идентификатором элемента' _System._Time_Second'. Таким образом, вы получаете секунды. –