通过Modbus协议从储能电站设备(如BMS、PSC等)获取数据

以下是一个示例代码,展示了如何使用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通信协议和物联网平台的数据格式要求一致。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值