我正在尝试使用 Modbus 从站和主站j2mod
(它的版本是 1.0.6,所以与另一个程序兼容)。
对于我在网上找到的代码,我确实有一些一般性问题。
我几乎没有找到任何有用的文档,所以我有点无能为力。
TCP主控器
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() 处收到非法数据地址错误
我的问题是:
Request中的两个参数到底是什么
req = new ReadInputDiscretesRequest(ref, count);
我在哪里定义UnitId
大师必须访问(在大师班中)。
我希望我分享我对此的想法还不算太晚。我有时也发现 J2Mod 令人困惑。
对于您的第一个问题 - “请求中的两个参数到底是什么?”:
在标准 Modbus 设备上,数据存储在 4 个表中,每个表包含 9999 个值:
- 线圈(离散输出线圈) - 它们是读写内部寻址范围为 0000 至 270E。它们占用 Modbus 设备上的寄存器 1-9999。
- 离散输入(离散输入触点) - 它们是只读内部寻址范围为 0000 至 270E。它们占用 Modbus 设备上的寄存器 10001-19999。
- 输入寄存器(模拟输入寄存器) - 它们是只读内部寻址范围为 0000 至 270E。它们占用 Modbus 设备上的寄存器 30001-39999。
- 保持寄存器(模拟输出寄存器) - 它们是读写内部寻址范围为 0000 至 270E。它们占用 Modbus 设备上的寄存器 40001-49999。
Each Coil(1) or Contact(2) 为 1 位(1 字节)。
Each Register(3,4) 是 1 个字或 16 位(2 个字节)。
回到你的问题,ref是您想要阅读的联系人(在您的情况下)。例如,如果您想读取号码 10001 下的第一个联系人,则可以传递 0(因为它们的内部地址为 0000-270E)。第二个参数,count,是您要读取的触点数(位)。如果您只想读取联系人 10001,则可以传递 1(仅一个联系人)。
至于你的第二个问题,我不确定,因为我对J2mod没有太多经验。
通常在 Modbus TCP/IP 上,您有 7 个字节的 MBAP 标头。
- 交易 ID - 2 字节
- 协议 ID - 2 个字节(Modbus 为 0000)
- 长度 - 2 个字节 - 显示后面的字节数(包括单元 ID)
- 单元 ID - 1 字节
我将了解如何设置 ID,然后将我的发现回复给您。
希望你不断进步!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)