Используется библиотека jlibmodbus. pom.xml добавлен для того, что бы эта библиотека работала. Подключена библиотека jssc для того, чтобы выводить список портов(нужно добавлять вручную). Сборка на Maven. SDK проекта: openjdk-20. Для проверки использовалась программа Virtual Serial Port Driver. С помощбю нее создаем пару COM-портов Slave'ом служила программа Modbus Slave.
75 lines
2.8 KiB
Java
75 lines
2.8 KiB
Java
package org.example;
|
|
|
|
import com.intelligt.modbus.jlibmodbus.Modbus;
|
|
import com.intelligt.modbus.jlibmodbus.master.ModbusMaster;
|
|
import com.intelligt.modbus.jlibmodbus.master.ModbusMasterFactory;
|
|
import com.intelligt.modbus.jlibmodbus.exception.ModbusIOException;
|
|
import com.intelligt.modbus.jlibmodbus.serial.*;
|
|
import jssc.SerialPortList;
|
|
|
|
public class MasterRTU {
|
|
|
|
static public void main(String[] arg) {
|
|
SerialParameters sp = new SerialParameters();
|
|
Modbus.setLogLevel(Modbus.LogLevel.LEVEL_DEBUG);
|
|
|
|
try {
|
|
//Вывод доступных портов
|
|
String[] dev_list = SerialPortList.getPortNames();
|
|
|
|
System.out.println("Доступные порты:");
|
|
|
|
for (int n = 0; n < dev_list.length; n++) {
|
|
System.out.println(dev_list[n]);
|
|
}
|
|
|
|
if (dev_list.length > 0) {
|
|
//Настройка
|
|
sp.setDevice(dev_list[1]);
|
|
sp.setBaudRate(SerialPort.BaudRate.BAUD_RATE_9600);
|
|
sp.setDataBits(8);
|
|
sp.setParity(SerialPort.Parity.NONE);
|
|
sp.setStopBits(1);
|
|
|
|
//Создание и подключение через jssc
|
|
SerialUtils.setSerialPortFactory(new SerialPortFactoryJSSC());
|
|
ModbusMaster m = ModbusMasterFactory.createModbusMasterRTU(sp);
|
|
m.connect();
|
|
|
|
int slaveId = 1; // id устройства slave
|
|
int offset = 0; // Начальный адресс
|
|
int quantity = 10; //Количество условных портов
|
|
|
|
try {
|
|
int[] registerValues = m.readHoldingRegisters(slaveId, offset, quantity); // Настройка тип регситра(в данном случае установлены регистры хранения)
|
|
|
|
//Вывод
|
|
for (int value : registerValues) {
|
|
System.out.println("Адресс: " + offset + ", Значение: " + value);
|
|
|
|
if (offset == 0 && value == 101) {
|
|
System.out.println("Hello");
|
|
}
|
|
|
|
offset++;
|
|
}
|
|
|
|
} catch (RuntimeException e) {
|
|
throw e;
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
} finally {
|
|
try {
|
|
m.disconnect();
|
|
} catch (ModbusIOException e1) {
|
|
e1.printStackTrace();
|
|
}
|
|
}
|
|
}
|
|
} catch (RuntimeException e) {
|
|
throw e;
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
} |