使用 JAMOD 读取正确的 Schneider Momentum PLC 寄存器或线圈地址

Reading the right Schneider Momentum PLC register or coil address using JAMOD

为了在工作中节省一些钱,我想我会创建一个 java 程序来 right/write 值到 Momentum PLC 而不是必须从 Schneider 购买 WonderWare 许可证,但我可以'似乎无法弄清楚 PLC 端的寻址。通信模式是Modbus/TCP,为了在家测试,我下载了一个PLC模拟器,但我也无法让它工作。我连接正常,只是,又一次,似乎无法轮询正确的地址。

我试图读取的线圈输出在 plc 端有 400012 地址,我正在尝试复制它。

这是我的 javafx 代码,它是用 Maven 构建的,连接到 PLC,我可以读取值,但我似乎从来没有得到正确的值。

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import net.wimpi.modbus.io.ModbusTCPTransaction;
import net.wimpi.modbus.msg.ReadCoilsRequest;
import net.wimpi.modbus.msg.ReadCoilsResponse;
import net.wimpi.modbus.net.TCPMasterConnection;

import java.net.InetAddress;

public class PrimaryController {


@FXML
private Label labelValue;

@FXML
private Button primaryButton;

@FXML
void handleGetData(ActionEvent event) {
    try {
        getData();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

private void getData() throws Exception {

    // Connection
    TCPMasterConnection con = null;
    ModbusTCPTransaction trans = null;
    ReadCoilsRequest req = null;
    ReadCoilsResponse res = null;

    InetAddress ipAddress = null;

    try {
        ipAddress = InetAddress.getByName("localhost");
        con = new TCPMasterConnection(ipAddress);
        con.setPort(502);
        System.out.println("Connecting...");

        con.connect();

        req = new ReadCoilsRequest(12, 1);
        trans = new ModbusTCPTransaction(con);
        trans.setRequest(req);
        trans.execute();
        res = (ReadCoilsResponse) trans.getResponse();
        System.out.println("Response: " + res.getCoils().toString());
        con.close();


    } catch (Exception e) {
        e.printStackTrace();
    }


  }

}

依赖性:

    <dependency>
        <groupId>net.wimpi</groupId>
        <artifactId>jamod</artifactId>
        <version>1.2</version>
    </dependency>

这里是我用的PLC模拟器

ModBus Simulator

我总是得到响应:00000000

有人对 PLC (Schneider Momentum) 和 Java 之间的通信有经验吗?

谢谢!

40012或400012类型的地址(使用6位寻址时)对应“保持寄存器”字段中的16位寄存器,它们不是线圈。

此外,由于第一个线圈在地址 00001 时将偏移量传递给读取方法,因此您应该传递 11 而不是 12 以读取线圈 00012

您的代码很可能在“线圈”字段中返回线圈 00013 的值。