如何在Java中通过TCP / IP将信号发送到Modbus?

时间:2019-07-03 14:03:43

标签: modbus-tcp

我正在处理一个客户端应用程序,该客户端应用程序应该向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);

2 个答案:

答案 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那里获得的):

enter image description here

要注意的一件事是您的设备上同时具有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);

我仍在尝试弄清楚服务器发送的输出。有谁可以帮助我吗?谢谢!