我正在处理一个客户端应用程序,该客户端应用程序应该向modbus发送信号,该信号将打开和关闭具有ip地址和不可更改端口号502的门。该指令说要创建一个win-socket客户端应用程序并发送命令缓冲。我不明白如何发送命令缓冲区。这是命令的快照。 Modbus Commands
我已经创建了Java套接字客户端类,但是我不知道要发送什么消息以及要使用什么数据类型来发送消息。或者我应该使用Modbus库之一来发送信号。谢谢!
socket = new Socket("192.168.0.8, 502);
OutputStream output = socket.getOutputStream();
OutputStreamWriter writer = new OutputStreamWriter(output);
BufferedWriter bw = new BufferedWriter(writer);
short buffer = ??; // don't know what to send here
//String sendMesage = buffer;
bw.write(buffer);
bw.flush();
System.out.println("Message sent to the server: " + buffer);
InputStream receive = socket.getInputStream();
InputStreamReader reader = new InputStreamReader(receive);
BufferedReader bufferedReader = new BufferedReader(reader);
答案 0 :(得分:0)
根据您在问题中显示的代码片段,您将获得从头开始编写Modbus客户端的印象。
Modbus是一个非常简单的协议,但是要为新客户端编写调试程序将花费很多精力,并且由于该协议是开放的,因此已经编写,调试和测试了许多代码。例如,参见here。
要发送什么命令很难说,如果您不提及要连接的设备,特别是您要连接的设备以及要使用的设备。在常见的情况下,工厂的一台机器或传感器在偏远地区,正在记录来自其传感器的数据并以某种方式对这些数据作出反应。借助Modbus,您可以向机器发送数据请求(读取线圈/位或寄存器/数值)以监视其运行情况,并通过HMI或HMI从远程控制室发送命令以对其进行控制(写入Modbus线圈或寄存器)。任何其他类型的计算机。
编辑:既然您已经决定使用EasyModbus,那么您将更接近所需的内容。但是看来您正在寻找的是从设备中读取数据,因此您无需写入寄存器。您可以尝试使用以下代码段(source):
public static void main(String[] args)
{
ModbusClient modbusClient = new ModbusClient("127.0.0.1", 1536);
try
{
modbusClient.Connect();
//Read Int value from register 0 (Barrier Command)
System.out.println(modbusClient.ReadHoldingRegisters(0, 1));
//Read Float Value from Register 1 and 2 (Barrier Status)
System.out.println(ModbusClient.ConvertRegistersToFloat(modbusClient.ReadHoldingRegisters(1, 2)));
}
catch (Exception e)
{
System.out.println(e.toString());
}
}
如果您从设备上查看Modbus地址映射(我假设是您的设备,则是从manual那里获得的):
要注意的一件事是您的设备上同时具有16位和32位值。由于Modbus寄存器是16位的,因此对于32位数据类型,您需要读取两个寄存器。这仅适用于编号为1的寄存器(根据以上映射的屏障状态)。对于其他所有内容,您都可以读取并显示为整数值。
答案 1 :(得分:0)
我得到了答案。好吧,至少一半。我没有使用Java创建套接字类,而是使用Easymodbus.jar客户端库。我要做的就是使用modbus的ip地址连接到服务器,并使用功能代码(在我的情况下是功能代码6)查找方法EasyModbus Methods,并使用提供的参数调用该方法。手册。我正在发布代码,以防万一有人需要它。这是用于Magnetic autocontrol GMBH的Modbus控制器。
ModbusClient modbusClient = new ModbusClient("192.168.0.135", 502);
modbusClient.Connect();
modbusClient.WriteSingleRegister(00, 0001);
我仍在尝试弄清楚服务器发送的输出。有谁可以帮助我吗?谢谢!