java - 如何在 ProcessImage 中使用 DigitalIn - Modbus
问题描述
我正在研究 Java 中的 modbus UDP 实现 [ J2Mod(2.3.4) ]。我发现几乎没有有用的文档。我有一个像标志这样的布尔数组。
- Slave 将通过 SimpleProcessImage->DigitalIn 读取它
- 从站将使用该标志并更改它们
- 然后每 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();
}
}
}
解决方案
如果有人仍在寻找答案,如图所示,您可以通过 readInputDiscretes 函数读取 DigitalIn。
读离散
// master.readInputDiscretes(<discrete ref>, <count>); // Uses a UNIT ID of 1
master.readInputDiscretes(<unit id>, <discrete ref>, <count>);
推荐阅读
- iis-express - 为什么 IIS Express 锁定文件停止在 ASP.Net Core 中构建、重建和清理?
- azure-iot-hub - 在 Windows IoT Core 上将 exe 作为服务启动
- php - SELECT WHERE = sybol 不返回数据
- vue.js - 为什么某些 Vuetify 属性不能在同一个组件中工作?
- javascript - JSON 解析到对象奇怪的结果?
- django - 如何使用 django 信号获取模板通知?
- python-3.x - 使用 PySpark 将列表值对映射到键值对
- android - 使用谷歌云视觉OCR后如何解析名片中的姓名,电话号码电子邮件?安卓
- c++ - 无法使用 MSVC/Clang 在 Windows 上将 SDL2 与 CMake 链接
- arrays - C - 写入和读取动态数组