V1.201 edit at date 2021-02-12
1.通过识别当前模块是否是锂电池进行读取锂电池数据
| | |
| | | while(true) {
|
| | | try {
|
| | | logger.info(" FBS9600_ServerSocket_Thread 开始监听9611端口");
|
| | | //监听9100端口
|
| | | //监听9611端口
|
| | | server = new ServerSocket(9611);
|
| | | while(true) {
|
| | | Socket tmp_socket = server.accept();
|
| | |
| | | e.printStackTrace();
|
| | | }
|
| | | }
|
| | | master.destory();
|
| | | logger.trace(m_FBS9600_State.dev_id+" at " + Com.getDateTimeFormat(new Date(), Com.DTF_YMDhms));
|
| | | }
|
| | |
|
| | |
| | | if(m_FBS9600_State.putGroupBatchResult(res,index,battData_RT)) {
|
| | | battData_RT.updata_BattRtSate_To_RamDb(); //更新电池组端数据
|
| | | }
|
| | | if(m_FBS9600_State.batt_type[index] == 1) {
|
| | | //读取锂电池数据
|
| | | batch = m_FBS9600_State.createLithiumBatchRead(master,index); |
| | | res = MyModbusUtils.readMutilRegisters(batch, master);
|
| | | if(m_FBS9600_State.putLithiumBatchResult(res,index,battData_RT)) {
|
| | | FBS9600_State_SQL.insertOrUpdate(conn, m_FBS9600_State.lidata[index]); //更新锂电池实时数据
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | private void readMonData(BattData_RT battData_RT,int index) {
|
| | |
| | | package com.dev.fbs9600;
|
| | |
|
| | | import java.util.Arrays;
|
| | |
|
| | | import com.battdata_rt.BattData_RT;
|
| | | import com.dev.modbus4j.MyModbusMaster;
|
| | | import com.dev.modbus4j.MyModbusUtils;
|
| | |
| | | public int[] dev_works = new int[BATT_MAXGOROUP_COUNT];
|
| | | public float[] dev_currs = new float[BATT_MAXGOROUP_COUNT];
|
| | | public float[] dev_groupvols = new float[BATT_MAXGOROUP_COUNT];
|
| | |
|
| | | public int[] batt_type = new int[BATT_MAXGOROUP_COUNT]; //电池类型0铅酸;1锂电池
|
| | | public FBS9600_Lithium_Data[] lidata = new FBS9600_Lithium_Data[BATT_MAXGOROUP_COUNT];
|
| | | |
| | | public FBS9600_State(String ipaddr, int id) {
|
| | | this.ip_addr = ipaddr;
|
| | | this.dev_id = id;
|
| | |
| | | batch.addLocator(3,MyModbusUtils.createBaseLocator(0x0007+offset, DataType.TWO_BYTE_INT_UNSIGNED, master)); //蓄电池状态
|
| | | batch.addLocator(4,MyModbusUtils.createBaseLocator(0x000A+offset, DataType.TWO_BYTE_INT_UNSIGNED, master)); //纹波电流均值
|
| | | batch.addLocator(5,MyModbusUtils.createBaseLocator(0x000B+offset, DataType.TWO_BYTE_INT_UNSIGNED, master)); //纹波电流峰值
|
| | | batch.addLocator(6,MyModbusUtils.createBaseLocator(0x098D+offset, DataType.TWO_BYTE_INT_UNSIGNED, master)); //电池类型 |
| | | |
| | | return batch;
|
| | | }
|
| | |
|
| | |
| | | float curr_avg = ((float)res.getIntValue(4))/10;
|
| | | float curr_top = ((float)res.getIntValue(5))/10;
|
| | | //System.out.println(res);
|
| | | batt_type[index] = res.getIntValue(6); //电池型号
|
| | | return true;
|
| | | }
|
| | | return false;
|
| | |
| | | this.com_err_count = master.getTotalerr();
|
| | |
|
| | | }
|
| | |
|
| | | public BatchRead<Integer> createLithiumBatchRead(MyModbusMaster master, int index) {
|
| | | int offset = index*0x1000;
|
| | | BatchRead<Integer> batch = new BatchRead<Integer>();
|
| | | batch.addLocator(0,MyModbusUtils.createBaseLocator(0x0ABE+offset,DataType.TWO_BYTE_INT_UNSIGNED, master)); //环境温度
|
| | | batch.addLocator(1,MyModbusUtils.createBaseLocator(0x0ABF+offset, DataType.TWO_BYTE_INT_UNSIGNED, master)); //功率温度 |
| | | batch.addLocator(2,MyModbusUtils.createBaseLocator(0x0AC0+offset, DataType.TWO_BYTE_INT_UNSIGNED, master)); //剩余容量 |
| | | batch.addLocator(3,MyModbusUtils.createBaseLocator(0x0AC1+offset, DataType.TWO_BYTE_INT_UNSIGNED, master)); //自定义遥测量数量 |
| | | batch.addLocator(4,MyModbusUtils.createBaseLocator(0x0AC2+offset, DataType.TWO_BYTE_INT_UNSIGNED, master)); //电池总容量 |
| | | batch.addLocator(5,MyModbusUtils.createBaseLocator(0x0AC3+offset, DataType.TWO_BYTE_INT_UNSIGNED, master)); //电池循环次数 |
| | | batch.addLocator(6,MyModbusUtils.createBaseLocator(0x0AC4+offset, DataType.TWO_BYTE_INT_UNSIGNED, master)); //环境温度告警状态 |
| | | batch.addLocator(7,MyModbusUtils.createBaseLocator(0x0AC5+offset, DataType.TWO_BYTE_INT_UNSIGNED, master)); //功率温度告警状态 |
| | | batch.addLocator(8,MyModbusUtils.createBaseLocator(0x0AC6+offset, DataType.TWO_BYTE_INT_UNSIGNED, master)); //充放电电流告警状态 |
| | | batch.addLocator(9,MyModbusUtils.createBaseLocator(0x0AC7+offset, DataType.TWO_BYTE_INT_UNSIGNED, master)); //电池总电压告警状态 |
| | | batch.addLocator(10,MyModbusUtils.createBaseLocator(0x0AC8+offset, DataType.TWO_BYTE_INT_UNSIGNED, master)); //自定义告警量数量 |
| | | batch.addLocator(11,MyModbusUtils.createBaseLocator(0x0AC9+offset, DataType.TWO_BYTE_INT_UNSIGNED, master)); //均衡事件代码 |
| | | batch.addLocator(12,MyModbusUtils.createBaseLocator(0x0ACA+offset, DataType.TWO_BYTE_INT_UNSIGNED, master)); //电压事件代码 |
| | | batch.addLocator(13,MyModbusUtils.createBaseLocator(0x0ACB+offset, DataType.TWO_BYTE_INT_UNSIGNED, master)); //温度事件代码 |
| | | batch.addLocator(14,MyModbusUtils.createBaseLocator(0x0ACC+offset, DataType.TWO_BYTE_INT_UNSIGNED, master)); //电流事件代码 |
| | | batch.addLocator(15,MyModbusUtils.createBaseLocator(0x0ACD+offset, DataType.TWO_BYTE_INT_UNSIGNED, master)); //FET状态代码 |
| | | batch.addLocator(16,MyModbusUtils.createBaseLocator(0x0ACE+offset, DataType.TWO_BYTE_INT_UNSIGNED, master)); //均衡状态代码 |
| | | batch.addLocator(17,MyModbusUtils.createBaseLocator(0x0ACF+offset, DataType.TWO_BYTE_INT_UNSIGNED, master)); //系统状态代码 |
| | | |
| | | return batch;
|
| | | }
|
| | |
|
| | | public boolean putLithiumBatchResult(BatchResults<Integer> res, int index,BattData_RT battData_RT) {
|
| | | if(null != res) {
|
| | | if(null == lidata[index]) {
|
| | | lidata[index] = new FBS9600_Lithium_Data(battData_RT.BattGroupId);
|
| | | }
|
| | | FBS9600_Lithium_Data data = lidata[index];
|
| | | data.envir_tmp = ((float)res.getIntValue(0)-100)/10; //'环境温度',
|
| | | data.power_tmp = ((float)res.getIntValue(1)-100)/10; //'功率温度',
|
| | | data.rest_cap = ((float)res.getIntValue(2))/100; //'剩余容量',
|
| | | data.remote_control_count = res.getIntValue(3); //'自定义遥控数量',
|
| | | data.batt_total_cap = (float)res.getIntValue(4); //'电池总容量',
|
| | | data.batt_cycles = res.getIntValue(5); //'电池循环次数',
|
| | | data.evir_tmp_alm_state = res.getIntValue(6); //'环境温度告警状态',
|
| | | data.power_tmp_alm_state = res.getIntValue(7); //'功率温度告警状态',
|
| | | data.discharge_curr_alm_state = res.getIntValue(8); //'充放电电流告警状态',
|
| | | data.batt_totalvol_alm_state = res.getIntValue(9); //'电池总电压告警状态',
|
| | | data.custom_alm_count = res.getIntValue(10); //'自定义告警量数量',
|
| | | data.junheng_event_code = res.getIntValue(11); //'均衡事件代码',
|
| | | data.vol_event_code = res.getIntValue(12); //'电压事件代码',
|
| | | data.tmp_event_code = res.getIntValue(13); //'温度事件代码',
|
| | | data.curr_event_code = res.getIntValue(14); //'电流事件代码',
|
| | | data.fet_state_code = res.getIntValue(15); //'FET状态代码',
|
| | | data.junheng_state_code = res.getIntValue(16); //'均衡状态代码',
|
| | | data.sys_state_code = res.getIntValue(17); //'系统状态代码',
|
| | | return true;
|
| | | }
|
| | | return false;
|
| | | }
|
| | | } |
| | |
| | |
|
| | | public class FBS9600_State_SQL {
|
| | |
|
| | | /**
|
| | | * 插入或更新锂电池数据
|
| | | * @param pool
|
| | | * @param data
|
| | | */
|
| | | public static void insertOrUpdate(MysqlConnPool pool,FBS9600_Lithium_Data data) {
|
| | | String sql_str = " SELECT BattGroupId,record_time FROM "+Sql_Mysql.Tb_Lithium_Data_Table+" WHERE BattGroupId = " + data.BattGroupId;
|
| | | String sql_ins = " INSERT INTO "+Sql_Mysql.Tb_Lithium_Data_Table+"(BattGroupId,record_time) VALUES("+data.BattGroupId+",'"+Com.getDateTimeFormat(new Date(), Com.DTF_YMDhms)+"'); ";
|
| | | String sql_upd = " UPDATE " + Sql_Mysql.Tb_Lithium_Data_Table +
|
| | | " Set record_time= '" + Com.getDateTimeFormat(new Date(), Com.DTF_YMDhms) +
|
| | | "',envir_tmp= " +data.envir_tmp + |
| | | ",power_tmp= " + data.power_tmp +
|
| | | ",rest_cap= " + data.rest_cap +
|
| | | ",remote_control_count= " + data.remote_control_count +
|
| | | ",batt_total_cap= " + data.batt_total_cap +
|
| | | ",batt_cycles= " + data.batt_cycles +
|
| | | ",evir_tmp_alm_state= " + data.evir_tmp_alm_state +
|
| | | ",power_tmp_alm_state= " + data.power_tmp_alm_state +
|
| | | ",discharge_curr_alm_state= " + data.discharge_curr_alm_state +
|
| | | ",batt_totalvol_alm_state= " + data.batt_totalvol_alm_state +
|
| | | ",custom_alm_count= " + data.custom_alm_count +
|
| | | ",junheng_event_code= " + data.junheng_event_code +
|
| | | ",vol_event_code= " + data.vol_event_code +
|
| | | ",tmp_event_code= " + data.tmp_event_code +
|
| | | ",curr_event_code= " + data.curr_event_code +
|
| | | ",fet_state_code= " + data.fet_state_code +
|
| | | ",junheng_state_code= " + data.junheng_state_code +
|
| | | ",sys_state_code= " + data.sys_state_code +
|
| | | " WHERE BattGroupId = " + data.BattGroupId;
|
| | | ResultSet res = null;
|
| | | Sql_Mysql sql = new Sql_Mysql(pool.getConn());
|
| | | try {
|
| | | res = sql.sqlMysqlQuery(sql_str);
|
| | | if(res.next()) {
|
| | | sql.sqlMysqlExecute(sql_upd);
|
| | | }else {
|
| | | sql.sqlMysqlExecute(sql_ins);
|
| | | } |
| | | } catch (Exception e) {
|
| | | e.printStackTrace();
|
| | | } finally {
|
| | | if(null != res) {
|
| | | try {
|
| | | res.close();
|
| | | } catch (SQLException e) {
|
| | | e.printStackTrace();
|
| | | }
|
| | | }
|
| | | sql.close_con();
|
| | | } |
| | | }
|
| | | |
| | | |
| | | |
| | |
|
| | | /**
|
| | | * 查询当前是否有控制操作
|
| | |
| | | }
|
| | | }
|
| | |
|
| | | |
| | | public static void main(String[] args) {
|
| | | MysqlConnPool pool = new MysqlConnPool("127.0.0.1", 3360, 10);
|
| | | FBS9600_Lithium_Data data = new FBS9600_Lithium_Data(1000003); |
| | | insertOrUpdate(pool, data);
|
| | | |
| | | |
| | | |
| | | }
|
| | | }
|
| | |
| | | package com.dev.modbus4j;
|
| | |
|
| | | import java.io.IOException;
|
| | | import java.net.Socket;
|
| | |
|
| | | import com.serotonin.modbus4j.ModbusMaster;
|
| | |
| | | this.slaveId = slaveId;
|
| | | }
|
| | |
|
| | | public void destory() {
|
| | | master.destroy();
|
| | | if(null != socket) {
|
| | | try {
|
| | | socket.close();
|
| | | } catch (IOException e) {
|
| | | e.printStackTrace();
|
| | | }
|
| | | }
|
| | | }
|
| | | |
| | | @Override
|
| | | public String toString() {
|
| | | return "MyModbusMaster [SLAVEID_DEFAULT=" + SLAVEID_DEFAULT + ", master=" + master + ", errcount=" + errcount
|
| | |
| | | public static final String Tb_Batt_Param_LowTable = "web_site.tb_batt_param_low";
|
| | | public static final String Tb_AnnounceTable = "web_site.tb_announce";
|
| | | public static final String Tb_Process_SurveyTable = "web_site.tb_process_survey";
|
| | | |
| | | |
| | | public static final String Tb_Lithium_Data_Table = DB_RamDB + ".`tb_lithium_data`";
|
| | | |
| | | |
| | | public Connection mysql_con;
|
| | |
|
| | | public Sql_Mysql(Connection conn) {
|
| | |
| | | 9600显示屏通讯程序
|
| | | V1.201 edit at date 2021-02-12
|
| | | 1.通过识别当前模块是否是锂电池进行读取锂电池数据
|
| | | |
| | | V1.102 edit at date 2021-04-29
|
| | | 1.修改使用modbus4j框架和9600显示屏进行通信
|
| | | 2.修复多组电池组bug
|
| | | |
| | | V1.101 edit at date 2021-04-28
|
| | | 修改成被动式通讯方式
|
| | |
|
| | | V1.102 edit at date 2021-04-29
|
| | | 1.修改使用modbus4j框架和9600显示屏进行通信
|
| | | 2.修复多组电池组bug |
| | |
|
| | | |