2017-02-20 2425 views
0

我想使用j2mod(它的版本1.0.6 tho,以便與其他程序兼容)製作一個Modbus從站和主站,並且我確實有一些關於我找到的代碼的一般問題線上。J2Mod基本主從問題

我幾乎找不到有用的文檔,所以我有點無知。

TcpMaster

this.addr = InetAddress.getByName("127.0.0.1"); 

     conn = new TCPMasterConnection(addr); 
     conn.setPort(port); 
     conn.connect(); 

     req = new ReadInputDiscretesRequest(ref, count); 

     trans = new ModbusTCPTransaction(conn); 
     trans.setRequest(req); 

     trans.execute(); 
     res = (ReadInputDiscretesResponse) trans.getResponse(); 

TcpSlave

spi = new SimpleProcessImage(); 
     spi.addDigitalOut(bitOut); 

     ModbusCoupler.getReference().setProcessImage(spi); 
     ModbusCoupler.getReference().setMaster(false); 
     ModbusCoupler.getReference().setUnitID(1); 

     addr = InetAddress.getByName("127.0.0.1"); 

     listener = new ModbusTCPListener(3); 
     listener.setPort(port); 
     listener.setAddress(addr); 
     listener.setUnit(1); 
     listener.setListening(true); 
     listener.run(); 

所以現在我在trans.execute()
得到一個非法數據地址錯誤,我的問題是:

什麼請求中的兩個參數正好是

req = new ReadInputDiscretesRequest(ref, count); 

在哪裏定義的UnitID法師有權訪問(在大師班)

THX提前

回答

1

我希望我不是太晚分享這個我的想法。我也發現J2Mod有時會令人困惑。

關於第一個問題 - 「究竟是什麼在請求中的兩個參數?」: 在標準的Modbus設備的數據存儲在4個表,每個9999個值:

  1. 線圈(離散輸出線圈) - 它們是讀寫並且它們在內部從0000到270E被尋址。它們佔用Modbus設備上的寄存器1-9999。
  2. 離散輸入(離散輸入觸點) - 它們是只讀它們在內部從0000到270E尋址。它們佔用Modbus設備上的寄存器10001-19999。
  3. 輸入寄存器(模擬輸入寄存器) - 它們是只讀並且它們在內部從0000到270E被尋址。它們佔用Modbus設備上的寄存器30001-39999。
  4. 保持寄存器(模擬輸出寄存器) - 它們是讀寫並且它們在內部從0000到270E被尋址。它們佔用Modbus設備上的寄存器40001-49999。

每個線圈(1)或聯繫(2)是1位(1個字節)。

每個寄存器(3,4)是1個字或16位(2個字節)。

再回到你的問題,裁判是接觸(你的情況),你想讀的。例如,如果您想要讀取編號爲10001的第一個聯繫人,那麼您將傳遞0(因爲它們在內部被編址爲0000-270E)。第二個參數,計數,是您要讀取的聯繫人(位)的數量。如果您只想讀取聯繫人10001,則可以傳遞1(僅限一個聯繫人)。

至於你的第二個問題,我不確定,因爲我沒有太多的J2mod經驗。

通常在Modbus TCP/IP上,您擁有7個字節的MBAP標頭。

  • 交易ID - 2個字節
  • 協議ID - 2個字節(0000用於Modbus)
  • 長度 - 2個字節 - 這表明遵循的字節數(包括單元ID)
  • 單元ID - 1個字節

我會看看如何設置ID,並會回覆我的調查結果。

希望你正在取得進展!

+0

首先感謝親愛的,我自己解決了一些問題。而且我現在至少可以讀寫線圈。你對數據如何存儲的解釋肯定對我很有用,儘管如此感謝:) – Jusn