首页 > 解决方案 > 如何在 ProcessImage 中使用 DigitalIn - Modbus

问题描述

我正在研究 Java 中的 modbus UDP 实现 [ J2Mod(2.3.4) ]。我发现几乎没有有用的文档。我有一个像标志这样的布尔数组。

  1. Slave 将通过 SimpleProcessImage->DigitalIn 读取它
  2. 从站将使用该标志并更改它们
  3. 然后每 10 秒将其写入 SimpleProcessImage->DigitalOut。

我在第一步需要帮助。当我使用 master.readCoils(i, 1) 和 master.writeCoils(i, true) 时。它只使用 DigitalOut。它写入 DigitalOut 并从 DigitalOut 读取。

for (int i = 0; i < interSize ; i++) {
            SimpleDigitalOut dout = (SimpleDigitalOut) image.getDigitalOut(i);
            dout.set(i%5==0);
            image.setDigitalOut(i, dout);
}

如果我如上所示在从属端更改 DigitalOut,我可以通过 DigitalOut 获得更改的值。但我需要同时使用它们;数字输出和数字输入。

这是我的奴隶代码。

public class Slave {
    private SimpleProcessImage image;
    private ModbusSlave slave;
    private int interSize = 62000;
    int step;

    public Slave(){

        image = new SimpleProcessImage();
        step=0;

        for (int i = 0; i < interSize; i++) {
            image.addDigitalOut(i, new SimpleDigitalOut(false));
            image.addDigitalIn(i, new SimpleDigitalIn(false));
         }

         (new Timer()).scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                    read();
                    write();
            }
        }, 0, 10000);

        startServer();
    }

private void read() {
        System.out.print("Read In : ");
        for (int i = 0; i < interSize; i++) {
            System.out.print((image.getDigitalIn(i).isSet() ? 1 : 0) + " ");
        }

        System.out.print("Read Out: ");
        for (int i = 0; i < interSize; i++) {
            System.out.print((image.getDigitalOut(i).isSet() ? 1 : 0) + " ");
        }
}

    public void startServer() {
        try {
            slave = ModbusSlaveFactory.createUDPSlave(502);
            slave.addProcessImage(0, image);
            slave.open();
        } catch (ModbusException e) {
            e.printStackTrace();
        }
    }
}

我的客户也在这里

public class Client {
    private ModbusUDPMaster master;
    int interSize = 62000 ;

    Client() {
        master = new ModbusUDPMaster("127.0.0.1", 502);

        try {
            master.connect();
        } catch (Exception e) {
            e.printStackTrace();
        }

        write();
        while(true){
             read();
        }
    }

    public static void main(String... args) {
        new Client();
    }

    private void write() {
        for (int i = 0; i < interSize; i++) {
            try {
                master.writeCoil(i, i%3==0);
            } catch (ModbusException e) {
                e.printStackTrace();
            }
        }
    }

    private void read() {
        try {
            for (int i = 0; i < interSize; i++) {
                System.out.print(master.readCoils(i, 1).toString());
            }
        } catch (ModbusException e) {
            e.printStackTrace();
        }
    }
}

标签: javamodbus

解决方案


如果有人仍在寻找答案,如图所示您可以通过 readInputDiscretes 函数读取 DigitalIn。

读离散

// master.readInputDiscretes(<discrete ref>, <count>);  // Uses a UNIT ID of 1
master.readInputDiscretes(<unit id>, <discrete ref>, <count>);

推荐阅读