Java ModbusRTU 写寄存器

问题描述 投票:0回答:1

我需要使用串口、协议ModbusRTU写入从设备的2个寄存器。我可以使用 libs net.wimpi.modbus 读取所有寄存器。我需要将当前时间值写入保持寄存器,该寄存器位于设备中的地址 55 处。我正在使用以下方法读取值

public static void MGo() {
        SerialConnection con = null;
        ModbusSerialTransaction trans = null;
        ReadInputRegistersRequest req = null; //the request
        ReadInputRegistersResponse res = null; //the response
        
        ReadMultipleRegistersRequest Mreq = null;
        ReadMultipleRegistersResponse Mres = null;

        int unitid = 1; //идентификатор юнита, с которым мы будем разговаривать
        int ref = 0; //ссылка, с чего начать читать
        int count = 57; //количество IR для чтения
        int repeat = 1; //цикл для повторения транзакции

        //ModbusCoupler.createModbusCoupler(null);
        ModbusCoupler.getReference().setUnitID(1);

        SerialParameters params = new SerialParameters();
        params.setPortName(SelectCOM.ComPortBox.getSelectedItem().toString());
        params.setBaudRate(SelectCOM.BaudRateBox.getSelectedItem().toString());
        params.setDatabits(SelectCOM.DataBitBox.getSelectedItem().toString());
        params.setParity(SelectCOM.ParityBox.getSelectedItem().toString());
        params.setStopbits(SelectCOM.StopBitBox.getSelectedItem().toString());
        params.setEncoding("rtu");
        params.setEcho(false);

        // Открываем соединение
        con = new SerialConnection(params);
        try {
            con.open();
//          System.out.println(con.getSerialPort());
        } catch (Exception e) {
            e.printStackTrace();
        }
     // подготавливаем запрос
        Mreq = new ReadMultipleRegistersRequest(ref, count);
        Mreq.setUnitID(unitid);
        Mreq.setHeadless();

        trans = new ModbusSerialTransaction(con);
        trans.setRequest(Mreq);

        //7. Execute the transaction repeat times
        int k = 0;
        do {
            try {
                trans.execute();
            } catch (ModbusException e) {
                e.printStackTrace();
            }
/*          res = (ReadInputRegistersResponse) trans.getResponse();*/
            Mres = (ReadMultipleRegistersResponse) trans.getResponse();
            for (int n = 0; n < Mres.getWordCount(); n++) {
                HoldingRegs[n] = Mres.getRegisterValue(n);
            }
            k++;
        } while (k < repeat);
    

        con.close();
    
    }

我尝试为 WriteMultipleRegistersRequest 编写类似的方法

public static void WriteRTU(int RegAdr) throws IOException {
        SerialConnection con = null;
        ModbusSerialTransaction trans = null;
        WriteMultipleRegistersRequest Wreq = null; //the request
   

        int unitid = 1; //идентификатор юнита, с которым мы будем разговаривать
        int ref = RegAdr; //ссылка, с чего начать читать
        int count = 57; //количество IR для чтения
        int repeat = 1; //цикл для повторения транзакции

        ModbusCoupler.getReference().setUnitID(1);

        SerialParameters params = new SerialParameters();
        params.setPortName(SelectCOM.ComPortBox.getSelectedItem().toString());
        params.setBaudRate(SelectCOM.BaudRateBox.getSelectedItem().toString());
        params.setDatabits(SelectCOM.DataBitBox.getSelectedItem().toString());
        params.setParity(SelectCOM.ParityBox.getSelectedItem().toString());
        params.setStopbits(SelectCOM.StopBitBox.getSelectedItem().toString());
        params.setEncoding("rtu");
        params.setEcho(false);

        // Открываем соединение
        con = new SerialConnection(params);
        try {
            con.open();
//          System.out.println(con.getSerialPort());
        } catch (Exception e) {
            e.printStackTrace();
        }
     // подготавливаем запрос
        Wreq = new  WriteMultipleRegistersRequest();
        Wreq.setUnitID(unitid);
        Wreq.setHeadless();
        ModbusRequest.createModbusRequest(0x05);

        trans = new ModbusSerialTransaction(con);
        trans.setRequest(Wreq);

        //7. Execute the transaction repeat times
        int k = 0;
        do {
            try {
                trans.execute();
            } catch (ModbusException e) {
                e.printStackTrace();
            }

            k++;
        } while (k < repeat);
        con.close();
    
    }

不起作用

java serial-port modbus
1个回答
0
投票

请尝试以下操作。由于缺少 Modbus 串行设置,我无法重现它。如果它不起作用,请在投反对票之前给我写个便条;)

根据 API,WriteMultipleRegistersRequest 可以用寄存器数组构造: https://jamod.sourceforge.net/api/net/wimpi/modbus/msg/WriteMultipleRegistersRequest.html#WriteMultipleRegistersRequest(int,%20net.wimpi .modbus.procimg.Register[])

因此创建一个 SimpleRegisteres 数组并调用构造函数 https://jamod.sourceforge.net/api/net/wimpi/modbus/procimg/SimpleRegister.html

...类似:

...
final Register[] registers = {new SimpleRegister(42)};
Wreq = new  WriteMultipleRegistersRequest(ref, registers);
...

如前所述,如果它不起作用,请告诉我,我会调整(或删除)它。

问候, 托马斯

© www.soinside.com 2019 - 2024. All rights reserved.