以下是一个示例代码,展示了如何使用Java通过Modbus协议从储能电站设备(如BMS、PSC等)获取数据,并通过MQTT协议将数据上传到物联网平台。代码支持通过配置文件读取多个设备:
import com.serotonin.modbus4j.BatchRead;
import com.serotonin.modbus4j.BatchResults;
import com.serotonin.modbus4j.ModbusFactory;
import com.serotonin.modbus4j.ModbusMaster;
import com.serotonin.modbus4j.code.DataType;
import com.serotonin.modbus4j.code.RegisterRange;
import com.serotonin.modbus4j.exception.ModbusTransportException;
import com.serotonin.modbus4j.ip.tcp.TcpMaster;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
public class ModbusMqttExample {
// MQTT配置
private static final String MQTT_BROKER = "tcp://mqtt.example.com:1883"; // MQTT代理服务器地址
private static final String MQTT_TOPIC = "energy_data"; // MQTT发布主题
public static void main(String[] args) {
// 从配置文件中读取设备配置
List<ModbusDeviceConfig> deviceConfigs = readDeviceConfigs("device-config.properties");
// 创建Modbus主站
ModbusFactory modbusFactory = new ModbusFactory();
List<ModbusMaster> modbusMasters = new ArrayList<>();
// 连接Modbus设备
try {
for (ModbusDeviceConfig config : deviceConfigs) {
ModbusMaster modbusMaster = new TcpMaster(modbusFactory.createTcpMasterParameters(config.getHost(), config.getPort()));
modbusMaster.init();
modbusMasters.add(modbusMaster);
}
} catch (ModbusTransportException e) {
e.printStackTrace();
return;
}
// 读取设备数据
for (int i = 0; i < deviceConfigs.size(); i++) {
ModbusDeviceConfig config = deviceConfigs.get(i);
ModbusMaster modbusMaster = modbusMasters.get(i);
try {
float[] values = readFloatValues(modbusMaster, config.getSlaveId(), RegisterRange.HOLDING_REGISTER, 0, 3);
System.out.println("从" + config.getName() + "读取的数据:");
System.out.println("值1:" + values[0]);
System.out.println("值2:" + values[1]);
System.out.println("值3:" + values[2]);
// 将设备数据发布到MQTT
publishToMqtt(config.getName(), values);
} catch (ModbusTransportException | MqttException e) {
e.printStackTrace();
}
}
// 断开Modbus连接
for (ModbusMaster modbusMaster : modbusMasters) {
modbusMaster.destroy();
}
}
private static float[] readFloatValues(ModbusMaster master, int slaveId, RegisterRange registerRange, int offset, int count)
throws ModbusTransportException {
float[] values = master.readHoldingRegisters(slaveId, offset, count * 2, DataType.FOUR_BYTE_FLOAT);
return values;
}
private static void publishToMqtt(String device, float... values) throws MqttException {
MqttClient mqttClient = new MqttClient(MQTT_BROKER, MqttClient.generateClientId());
mqttClient.connect();
StringBuilder payload = new StringBuilder();
payload.append("{");
for (int i = 0; i < values.length; i++) {
if (i > 0) {
payload.append(",");
}
payload.append("\"value").append(i + 1).append("\":").append(values[i]);
}
payload.append("}");
MqttMessage message = new MqttMessage(payload.toString().getBytes());
mqttClient.publish(MQTT_TOPIC + "/" + device, message);
mqttClient.disconnect();
}
private static List<ModbusDeviceConfig> readDeviceConfigs(String configFile) {
List<ModbusDeviceConfig> deviceConfigs = new ArrayList<>();
Properties properties = new Properties();
try (FileInputStream fileInputStream = new FileInputStream(configFile)) {
properties.load(fileInputStream);
for (String key : properties.stringPropertyNames()) {
String[] parts = key.split("\\.");
if (parts.length == 5 && parts[0].equals("device")) {
String name = parts[1];
String host = properties.getProperty("device." + name + ".host");
int port = Integer.parseInt(properties.getProperty("device." + name + ".port"));
int slaveId = Integer.parseInt(properties.getProperty("device." + name + ".slaveId"));
deviceConfigs.add(new ModbusDeviceConfig(name, host, port, slaveId));
}
}
} catch (IOException e) {
e.printStackTrace();
}
return deviceConfigs;
}
private static class ModbusDeviceConfig {
private final String name;
private final String host;
private final int port;
private final int slaveId;
public ModbusDeviceConfig(String name, String host, int port, int slaveId) {
this.name = name;
this.host = host;
this.port = port;
this.slaveId = slaveId;
}
public String getName() {
return name;
}
public String getHost() {
return host;
}
public int getPort() {
return port;
}
public int getSlaveId() {
return slaveId;
}
}
}
请注意,在此示例代码中,我们使用了Java的Properties类来读取设备配置文件(device-config.properties)。您需要创建一个名为device-config.properties的配置文件,并按照以下格式添加设备配置:
device.BMS.host=192.168.1.100
device.BMS.port=502
device.BMS.slaveId=1
device.PSC.host=192.168.1.101
device.PSC.port=502
device.PSC.slaveId=1
确保配置文件中包含您要连接的所有设备,并根据实际情况修改IP地址、端口和设备ID。确保与储能电站设备的Modbus通信协议和物联网平台的数据格式要求一致。