2017-02-20 2431 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