使用jamod读取正确的schneider momentum plc寄存器或线圈地址

dnph8jn4  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(498)

为了在工作中节省一些钱,我想我会创建一个java程序来对momentum plc进行正确的/写入值,而不必从schneider购买wonderware许可证,但我似乎无法理解plc端的寻址。通讯模式是modbus/tcp,为了在家里测试,我下载了一个plc模拟器,但我也不能让它工作。我很好地连接到它,只是,再一次,似乎不能投票的正确地址。
我试图读取的线圈输出在工作时plc端有400012地址,我试图复制它。
这是我用maven构建的javafx代码,它连接到plc,我可以读取值,但我似乎永远都找不到正确的值。

  1. import javafx.event.ActionEvent;
  2. import javafx.fxml.FXML;
  3. import javafx.scene.control.Button;
  4. import javafx.scene.control.Label;
  5. import net.wimpi.modbus.io.ModbusTCPTransaction;
  6. import net.wimpi.modbus.msg.ReadCoilsRequest;
  7. import net.wimpi.modbus.msg.ReadCoilsResponse;
  8. import net.wimpi.modbus.net.TCPMasterConnection;
  9. import java.net.InetAddress;
  10. public class PrimaryController {
  11. @FXML
  12. private Label labelValue;
  13. @FXML
  14. private Button primaryButton;
  15. @FXML
  16. void handleGetData(ActionEvent event) {
  17. try {
  18. getData();
  19. } catch (Exception e) {
  20. e.printStackTrace();
  21. }
  22. }
  23. private void getData() throws Exception {
  24. // Connection
  25. TCPMasterConnection con = null;
  26. ModbusTCPTransaction trans = null;
  27. ReadCoilsRequest req = null;
  28. ReadCoilsResponse res = null;
  29. InetAddress ipAddress = null;
  30. try {
  31. ipAddress = InetAddress.getByName("localhost");
  32. con = new TCPMasterConnection(ipAddress);
  33. con.setPort(502);
  34. System.out.println("Connecting...");
  35. con.connect();
  36. req = new ReadCoilsRequest(12, 1);
  37. trans = new ModbusTCPTransaction(con);
  38. trans.setRequest(req);
  39. trans.execute();
  40. res = (ReadCoilsResponse) trans.getResponse();
  41. System.out.println("Response: " + res.getCoils().toString());
  42. con.close();
  43. } catch (Exception e) {
  44. e.printStackTrace();
  45. }
  46. }
  47. }

依赖性:

  1. <dependency>
  2. <groupId>net.wimpi</groupId>
  3. <artifactId>jamod</artifactId>
  4. <version>1.2</version>
  5. </dependency>

这是我正在使用的plc模拟器。
modbus模拟器
我总是得到回复:00000000
是否有人有plc(施耐德动量)和java之间的通信经验?
谢谢!

q3qa4bjr

q3qa4bjr1#

40012或400012类型的地址(使用6位寻址时)对应于“保持寄存器”字段中的16位寄存器,它们不是线圈。
另外,由于第一个线圈在地址00001处,当向读取方法传递偏移量时,您应该传递11而不是12来读取线圈00012
您的代码很可能在“coils”字段中返回coil 00013的值。

相关问题