2013-10-30 118 views
0

我正在使用Java中的modbus TCP實現。到目前爲止,我已經嘗試了3個不同的庫,modbus4j,jamod和j2mod。我可以成功地訪問我的從設備與Linux modpoll工具:http://www.modbusdriver.com/modpoll.htmlJava/Android中的Modbus TCP

[email protected]:~/Documents/modbus-test-tool/linux$ ./modpoll -a255 -r1 -1  192.168.1.101 
modpoll 3.4 - FieldTalk(tm) Modbus(R) Master Simulator 
Copyright (c) 2002-2013 proconX Pty Ltd 
Visit http://www.modbusdriver.com for Modbus libraries and tools. 

Protocol configuration: MODBUS/TCP 
Slave configuration...: address = 255, start reference = 1, count = 1 
Communication.........: 192.168.1.101, port 502, t/o 1.00 s, poll rate 1000 ms 
Data type.............: 16-bit register, output (holding) register table 

-- Polling slave... 
[1]: 256 

這使我的設備上的障礙上去這是偉大的。但是,在Java實現中工作我無法重現這一點。我嘗試了很多不同的步驟,但都失敗了。在J2mod/jamod中,當使用'255'(這是我在上面的命令中使用的單元ID)時,我不斷得到無效的slaveId錯誤。如果我使用其他任何東西,我會得到一個CRC失敗的錯誤。在mod4j中,我得到各種錯誤,包括錯誤代碼= 4.這是我最新的J2mod代碼,它返回CRC錯誤(如果不是255)或無效的slaveId。我知道slaveId主要用於串行通信,但是當使用其他應用程序時,我的設備僅響應單元ID 255。

Integer value = Integer.decode(val).intValue(); 
    Integer unitID = Integer.decode(uid).intValue(); 
    Integer length = Integer.decode(len).intValue(); 
    Integer ref = Integer.decode(reference).intValue(); 
    SimpleRegister MyReg = new SimpleRegister(value); 
    try { 
     InetAddress address; 
     address = InetAddress.getByName(addr); 
     //2. Open the connection 
     TCPMasterConnection con = new TCPMasterConnection(address); 
     con.setPort(port); 
     con.connect(); 
     //3. Prepare the requestWrite 
     WriteSingleRegisterRequest WriteReq = new WriteSingleRegisterRequest(ref,MyReg); 
     WriteReq.setDataLength(length); 
     WriteReq.setUnitID(unitID); 
     //4. Prepare the transaction 
     ModbusTCPTransaction trans = new ModbusTCPTransaction(con); 
     trans.setRequest(WriteReq); 
     trans.setRetries(0); 
     trans.execute(); 
     Log.d(TAG, "Complete: " +trans.toString()); 
     return trans.getResponse().getHexMessage(); 
    } catch (UnknownHostException e) { 
     Log.d(TAG, "UnknownHostException: " + e.getMessage()); 
     return e.getMessage(); 
    } catch (Exception e) { 
     Log.d(TAG,"Exception: " + e.toString()); 
     return e.getMessage(); 
    } 

我對Modbus接口手冊,請訪問: https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CCsQFjAA&url=http%3A%2F%2Fwww.ac-magnetic.com%2Fgermany%2Fsites%2Fdefault%2Ffiles%2F58150001EN_00_Technical%2520Maunal%2520EM01.pdf&ei=Z1dxUv7qF4a9yAGpooHYBQ&usg=AFQjCNGGZnBx_A0fFjuW3qqgWjhS_ek-0w&bvm=bv.55617003,d.aWc

+0

是不是ID 255通常是一個廣播ID?你可以嘗試把奴隸換成別的東西,比如1嗎?實際上,我從來沒有看到任何人使用255作爲Modbus從站地址。不知道這是否會有所幫助,但是您的圖書館中可能有些東西不會喜歡'255'。 – Nanomurf

+0

否,除Modbus/TCP PLCs外,單元0是廣播地址,通常所有通信都使用單元0。唯一的(通常...)例外是當PLC通過網橋連接並且網橋將TCP/IP連接端和其他傳輸端之間的PDU編組時。 –

回答

0

我不爲什麼,就是這樣,這種情況正在發生說話。我可以告訴你,jamod和j2mod(j2mod是jamod的一個bug修正叉)只需將你設置的任何單位編號複製到TCP數據包的第7個字節即可。然後由發送的PLC響應數據包。

對於j2mod,從JVM命令行設置系統屬性com.ghgande.modbus.debug等於「true」將啓用調試消息。這將允許您查看應該告訴您發生了什麼的數據包轉儲。

你做了一個非常有趣的評論,那就是你看到CRC錯誤。你知道Modbus/TCP根本不使用CRC?