以下是一个示例代码,展示了如何使用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;

public class ModbusMqttExample {
    // Modbus设备配置
    private static final String BMS_HOST = "192.168.1.100";  // BMS设备IP地址
    private static final int BMS_PORT = 502;  // BMS设备端口
    private static final int BMS_SLAVE_ID = 1;  // BMS设备ID

    private static final String PSC_HOST = "192.168.1.101";  // PSC设备IP地址
    private static final int PSC_PORT = 502;  // PSC设备端口
    private static final int PSC_SLAVE_ID = 1;  // PSC设备ID

    // 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) {
        // 创建Modbus主站
        ModbusFactory modbusFactory = new ModbusFactory();
        ModbusMaster bmsMaster = new TcpMaster(modbusFactory.createTcpMasterParameters(BMS_HOST, BMS_PORT));
        ModbusMaster pscMaster = new TcpMaster(modbusFactory.createTcpMasterParameters(PSC_HOST, PSC_PORT));

        // 连接Modbus设备
        try {
            bmsMaster.init();
            pscMaster.init();
        } catch (ModbusTransportException e) {
            e.printStackTrace();
            return;
        }

        // 读取BMS数据
        try {
            float voltage = readFloatValue(bmsMaster, BMS_SLAVE_ID, RegisterRange.HOLDING_REGISTER, 0);
            float current = readFloatValue(bmsMaster, BMS_SLAVE_ID, RegisterRange.HOLDING_REGISTER, 1);
            float soc = readFloatValue(bmsMaster, BMS_SLAVE_ID, RegisterRange.HOLDING_REGISTER, 2);

            System.out.println("从BMS读取的数据:");
            System.out.println("电压:" + voltage);
            System.out.println("电流:" + current);
            System.out.println("SOC:" + soc);

            // 将BMS数据发布到MQTT
            publishToMqtt("BMS", voltage, current, soc);
        } catch (ModbusTransportException | MqttException e) {
            e.printStackTrace();
        }

        // 读取PSC数据
        try {
            float power = readFloatValue(pscMaster, PSC_SLAVE_ID, RegisterRange.HOLDING_REGISTER, 0);
            float frequency = readFloatValue(pscMaster, PSC_SLAVE_ID, RegisterRange.HOLDING_REGISTER, 1);

            System.out.println("从PSC读取的数据:");
            System.out.println("功率:" + power);
            System.out.println("频率:" + frequency);

            // 将PSC数据发布到MQTT
            publishToMqtt("PSC", power, frequency);
        } catch (ModbusTransportException | MqttException e) {
            e.printStackTrace();
        }

        // 断开Modbus连接
        bmsMaster.destroy();
        pscMaster.destroy();
    }

    private static float readFloatValue(ModbusMaster master, int slaveId, RegisterRange registerRange, int offset)
            throws ModbusTransportException {
        float[] values = master.readHoldingRegisters(slaveId, offset, 2);
        return values[0];
    }

    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).append("\":").append(values[i]);
        }
        payload.append("}");

        MqttMessage message = new MqttMessage(payload.toString().getBytes());
        mqttClient.publish(MQTT_TOPIC + "/" + device, message);

        mqttClient.disconnect();
    }
}
请注意,您需要使用modbus4j和paho-mqtt等库来实现Modbus和MQTT通信。确保您已经将这些库添加到您的Java项目中。另外,根据实际情况修改设备的IP地址、端口、寄存器地址和MQTT代理服务器的地址、端口以及发布主题。确保与储能电站设备的Modbus通信协议和物联网平台的数据格式要求一致
Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐