作者 钟来

plc004支持定时功能

package com.zhonglai.luhui.lsy.plc.service;
import com.zhonglai.luhui.lsy.plc.service.comm.service.DeviceService;
import com.zhonglai.luhui.lsy.plc.service.dto.DeviceProductProtocol;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.annotation.ComponentScan;
import javax.annotation.PostConstruct;
@ComponentScan(basePackages = {
"com.zhonglai.luhui.device.analysis.comm.agreement",
"com.zhonglai.luhui.device.analysis.comm.config",
... ... @@ -17,13 +21,20 @@ import org.springframework.context.annotation.ComponentScan;
public class Main {
private static Logger log = LoggerFactory.getLogger(Main.class);
@Autowired
private DeviceService deviceService;
public static void main(String[] args) {
log.info("启动服务");
// System.setProperty("dbPath",Main.class.getClassLoader().getResource("").getPath());
DeviceProductProtocol.init();
SpringApplicationBuilder builder = new SpringApplicationBuilder(Main.class);
builder.run( args);
}
@PostConstruct
public void init() {
DeviceProductProtocol.init(deviceService);
}
}
\ No newline at end of file
... ...
... ... @@ -44,7 +44,7 @@ public class DeviceService {
*/
public List<DeviceInfo> getDeviceInfoList(String imei)
{
return baseDao.findBysql("SELECT `id`,alarm_code,data_value,device_service_ip FROM `device_info` WHERE `id` LIKE '%"+imei+"%'", DeviceInfo.class);
return baseDao.findBysql("SELECT `id`,alarm_code,data_value,device_service_ip,device_type,base_id,user_id,user_login_name,base_name,device_name FROM `device_info` WHERE `id` LIKE '%"+imei+"%'", DeviceInfo.class);
}
... ... @@ -65,4 +65,14 @@ public class DeviceService {
{
baseDao.insertList(logDeviceOperationList, tableName);
}
public Long getTol(Object object)
{
return baseDao.getTotle(object);
}
public BaseDao getBaseDao()
{
return baseDao;
}
}
... ...
... ... @@ -23,10 +23,8 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.math.BigDecimal;
import java.util.*;
@Api(tags = "设备操作")
@RestController
... ... @@ -42,9 +40,6 @@ public class DeviceController {
@ApiOperation("设备控制")
@ApiImplicitParams({
@ApiImplicitParam(value = "设备号",name = "deviceId"),
@ApiImplicitParam(value = "数据",name = "dataObject"),
@ApiImplicitParam(value = "地址位",name = "addressBits"),
@ApiImplicitParam(value = "设备表id",name = "deviceInfoId")
})
@RequestMapping(value = "write/{deviceInfoId}",method = RequestMethod.POST)
... ... @@ -61,6 +56,109 @@ public class DeviceController {
{
data.put("type","3");
}
if ( data.containsKey("type") && data.get("type").toString().equals("getTimer"))
{
return new Message(MessageCode.DEFAULT_SUCCESS_CODE,DateUtils.getNowTimeMilly());
}
if ( data.containsKey("type") && data.get("type").toString().equals("times"))
{
Integer time = (Integer) data.get("value");
OrderDtu orderDtu = deviceService.getOrderDtu(deviceControlMessage.getDeviceId());
MqttMessage mqttMessage = new MqttMessage();
Map<String,Object> map = new HashMap<>();
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date(time*1000l));
map.put("SYS_Y_SET",calendar.get(Calendar.YEAR));
map.put("SYS_M_SET",calendar.get(Calendar.MONTH)+1);
map.put("SYS_D_SET",calendar.get(Calendar.DATE));
map.put("SYS_h_SET",calendar.get(Calendar.HOUR_OF_DAY));
map.put("SYS_m_SET",calendar.get(Calendar.MINUTE));
Topic topic = new Topic("2",orderDtu.getDeviceType(),deviceControlMessage.getDeviceId(),"PUT",null);
mqttMessage.setPayload(JSON.toJSONString(map).trim().getBytes());
try {
Message message = clienNoticeService.sendMessage(topic,mqttMessage);
return message;
} catch (MqttException e) {
throw new RuntimeException(e);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
if ( data.containsKey("type") && data.get("type").toString().equals("shijianfuzhu"))
{
Integer time = DateUtils.getNowTimeMilly();
OrderDtu orderDtu = deviceService.getOrderDtu(deviceControlMessage.getDeviceId());
MqttMessage mqttMessage = new MqttMessage();
Map<String,Object> map = new HashMap<>();
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date(time*1000l));
map.put("SYS_Y_SET",calendar.get(Calendar.YEAR));
map.put("SYS_M_SET",calendar.get(Calendar.MONTH)+1);
map.put("SYS_D_SET",calendar.get(Calendar.DATE));
map.put("SYS_h_SET",calendar.get(Calendar.HOUR_OF_DAY));
map.put("SYS_m_SET",calendar.get(Calendar.MINUTE));
Topic topic = new Topic("2",orderDtu.getDeviceType(),deviceControlMessage.getDeviceId(),"PUT",null);
mqttMessage.setPayload(JSON.toJSONString(map).trim().getBytes());
try {
Message message = clienNoticeService.sendMessage(topic,mqttMessage);
if(message.getCode()==1)
{
map = new HashMap<>();
map.put("T_JZ",1);
mqttMessage.setPayload(JSON.toJSONString(map).trim().getBytes());
clienNoticeService.sendMessage(topic,mqttMessage);
map = new HashMap<>();
map.put("T_JZ",0);
mqttMessage.setPayload(JSON.toJSONString(map).trim().getBytes());
clienNoticeService.sendMessage(topic,mqttMessage);
}
return message;
} catch (MqttException e) {
throw new RuntimeException(e);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
if ( data.containsKey("type") && data.get("type").toString().equals("timer"))
{
// {"shi":"14","feng":"53","miao":"00","shi1":"16","feng1":"53","miao1":"00","number":2,"type":"timer"}
Integer number = (Integer) data.get("number");
Map<String, DeviceDataConfig> deviceDataConfigWriteMap = DeviceProductProtocol.deviceDataConfigWriteMap;
String pw ="PW1";
int j=number;
for (String key : deviceDataConfigWriteMap.keySet())
{
DeviceDataConfig deviceDataConfig = deviceDataConfigWriteMap.get(key);
if(deviceDataConfig.getSensor_numer().equals(deviceControlMessage.getAddressBits()) && deviceDataConfig.getAttribute_describe().equals("开始时间"))
{
pw = deviceDataConfig.getAttribute_name().split("_")[0];
}
}
String skey = pw+"_TS"+j;
String ekey = pw+"_TE"+j;
if(!"".equals(skey) && !"".equals(ekey))
{
MqttMessage mqttMessage = new MqttMessage();
Map<String,Object> map = new HashMap<>();
map.put(skey,Integer.parseInt(data.get("shi")+""+data.get("feng")));
map.put(ekey,Integer.parseInt(data.get("shi1")+""+data.get("feng1")));
OrderDtu orderDtu = deviceService.getOrderDtu(deviceControlMessage.getDeviceId());
Topic topic = new Topic("2",orderDtu.getDeviceType(),deviceControlMessage.getDeviceId(),"PUT",null);
mqttMessage.setPayload(JSON.toJSONString(map).trim().getBytes());
try {
Message message = clienNoticeService.sendMessage(topic,mqttMessage);
return message;
} catch (MqttException e) {
throw new RuntimeException(e);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
return new Message(MessageCode.DEFAULT_FAIL_CODE,"设备不支持该操作!");
}
DeviceInfo deviceInfo = deviceService.getDeviceInfo(deviceInfoId);
String[] ss = deviceInfoId.split("_");
... ... @@ -76,18 +174,22 @@ public class DeviceController {
}
}
}
Topic topic = new Topic("2",deviceInfo.getDevice_type(),deviceControlMessage.getDeviceId(),"PUT",null);
Topic topic = new Topic("2",deviceInfo.getDeviceType(),deviceControlMessage.getDeviceId(),"PUT",null);
List<DeviceDataConfig> list = DeviceProductProtocol.deviceDataWriteConfigList;
if(null == list)
Map<String, DeviceDataConfig> deviceDataConfigWriteMap = DeviceProductProtocol.deviceDataConfigWriteMap;
if(deviceControlMessage.getDeviceId().equals("004112100018632")) //临时的
{
deviceDataConfigWriteMap = DeviceProductProtocol.get004112100019727Map();
}
if(null == deviceDataConfigWriteMap)
{
return new Message(MessageCode.DEFAULT_FAIL_CODE,"该设备未配置请联系管理员");
}
Map<String,Object> map = new HashMap<>();
//记录日志
for (DeviceDataConfig deviceDataConfig:list)
for (String key:deviceDataConfigWriteMap.keySet())
{
if(deviceDataConfig.getSensor_numer().equals(deviceControlMessage.getAddressBits()) && deviceDataConfig.getPlc_data_type().sensorDataType.equals(data.get("type")) )
DeviceDataConfig deviceDataConfig = deviceDataConfigWriteMap.get(key);
if(deviceDataConfig.getSensor_numer().equals(deviceControlMessage.getAddressBits()) && PLCDataType.valueOf(deviceDataConfig.getPlc_data_type()).sensorDataType.equals(data.get("type")) )
{
//记录日志
map.put(deviceDataConfig.getAttribute_name(), data.get("value").toString().equals(deviceDataConfig.getAlarmValue())?1:0);
... ... @@ -117,10 +219,10 @@ public class DeviceController {
object = GsonConstructor.get().fromJson(deviceInfo.getDataValue(),JsonObject.class);
}
List<DeviceDataConfig> deviceDataConfigList = DeviceProductProtocol.deviceDataConfigList;
for (DeviceDataConfig deviceDataConfig:deviceDataConfigList)
if(deviceDataConfigWriteMap.containsKey(deviceControlMessage.getAddressBits()))
{
if(deviceDataConfig.getSensor_numer().equals(deviceControlMessage.getAddressBits()) && deviceDataConfig.getPlc_data_type().sensorDataType.equals(data.get("type")) )
DeviceDataConfig deviceDataConfig = deviceDataConfigWriteMap.get(deviceControlMessage.getAddressBits());
if(PLCDataType.valueOf(deviceDataConfig.getPlc_data_type()).sensorDataType.equals(data.get("type")))
{
object.addProperty(data.get("type")+"",data.get("value").toString());
}
... ... @@ -147,9 +249,9 @@ public class DeviceController {
}
public static void main(String[] args) {
DeviceService deviceService = new DeviceService();
DeviceInfo deviceInfo = deviceService.getDeviceInfo("deviceInfoId");
System.out.println();
BigDecimal bd = new BigDecimal(DateUtils.getNowTimeMilly());
String time = DateUtils.parseDateToStr("HH:mm:ss",new Date(Integer.parseInt(bd.toPlainString())*1000l));
System.out.println(time);
}
/**
... ...
package com.zhonglai.luhui.lsy.plc.service.dto;
import com.google.gson.JsonObject;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.util.Map;
... ... @@ -8,12 +11,17 @@ import java.util.Map;
* plc控制请求消息体
* Created by zhonglai on 2016/12/30.
*/
@ApiModel
public class DeviceControlMessage {
@ApiModelProperty("设备号")
private String deviceId; //设备号
@ApiModelProperty("地址位")
private String addressBits; //地址位
@ApiModelProperty("命令字")
private String commandWord; //命令字
@ApiModelProperty("数据")
private Map<String,Object> dataObject; //数据
@ApiModelProperty("指令类型")
private String commandTye ; //指令类型
public String getDeviceId() {
... ...
... ... @@ -4,12 +4,11 @@ import lombok.Data;
@Data
public class DeviceDataConfig {
private Integer number;
private String attribute_name;
private PLCType device_type;
private String device_type;
private String sensor_numer;
private String attribute_describe;
private PLCDataType plc_data_type;
private String plc_data_type;
private String alarmCode;
private String alarmValue;
... ... @@ -18,20 +17,30 @@ public class DeviceDataConfig {
}
public DeviceDataConfig(Integer number, String attribute_name, PLCType device_type, PLCDataType plc_data_type,String sensor_numer,String attribute_describe) {
this.number = number;
public DeviceDataConfig(String attribute_name, PLCType device_type, PLCDataType plc_data_type,String sensor_numer,String attribute_describe) {
this.attribute_name = attribute_name;
this.device_type = device_type;
this.plc_data_type = plc_data_type;
if(null != device_type)
{
this.device_type = device_type.name();
}
if(null != plc_data_type)
{
this.plc_data_type = plc_data_type.name();
}
this.sensor_numer = sensor_numer;
this.attribute_describe = attribute_describe;
}
public DeviceDataConfig(Integer number, String attribute_name,PLCType device_type, PLCDataType plc_data_type,String sensor_numer,String attribute_describe,String alarmCode,String alarmValue) {
this.number = number;
this.attribute_name = attribute_name;
this.device_type = device_type;
this.plc_data_type = plc_data_type;
if(null != device_type)
{
this.device_type = device_type.name();
}
if(null != plc_data_type)
{
this.plc_data_type = plc_data_type.name();
}
this.sensor_numer = sensor_numer;
this.attribute_describe = attribute_describe;
this.alarmCode = alarmCode;
... ...
... ... @@ -17,5 +17,11 @@ public class DeviceInfo {
private String online; //设备在线状态(00-不在线,01-在线)
private Integer dataUpdateTime; //更新时间
private String deviceServiceIp; //设备服务器IP
private String device_type; //设备类型
private String deviceType; //设备类型
private Integer baseId;
private Integer userId;
private String userLoginName;
private String baseName;
private String deviceName;
}
... ...
package com.zhonglai.luhui.lsy.plc.service.dto;
import lombok.Data;
import com.zhonglai.luhui.lsy.plc.service.comm.service.DeviceService;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 产品协议
*/
public class DeviceProductProtocol {
public static String payloadtype = "Json";
public static List<DeviceDataConfig> deviceDataConfigList = new ArrayList<>();
public static Map<String, DeviceDataConfig> deviceDataConfigReadMap = new HashMap<>();
public static List<DeviceDataConfig> deviceDataWriteConfigList = new ArrayList<>();
public static Map<String, DeviceDataConfig> deviceDataConfigWriteMap = new HashMap<>();
public static void init()
public static void init(DeviceService deviceService)
{
deviceDataConfigList.add(new DeviceDataConfig(1,"C001A_RUN",PLCType.推水机,PLCDataType.控制器状态码,"01","运行信号"));
deviceDataConfigList.add(new DeviceDataConfig(2,"C001A_ALARM",PLCType.推水机,PLCDataType.故障代码,"01","故障信号","11","01"));
deviceDataConfigList.add(new DeviceDataConfig(3,"C001B_RUN",PLCType.推水机,PLCDataType.控制器状态码,"02","运行信号"));
deviceDataConfigList.add(new DeviceDataConfig(4,"C001B_ALARM",PLCType.推水机,PLCDataType.故障代码,"02","故障信号","11","01"));
deviceDataConfigList.add(new DeviceDataConfig(5,"C001C_RUN",PLCType.推水机,PLCDataType.控制器状态码,"03","运行信号"));
deviceDataConfigList.add(new DeviceDataConfig(6,"C001C_ALARM",PLCType.推水机,PLCDataType.故障代码,"03","故障信号","11","01"));
deviceDataConfigList.add(new DeviceDataConfig(48,"C001D_RUN",PLCType.推水机,PLCDataType.控制器状态码,"04","运行信号"));
deviceDataConfigList.add(new DeviceDataConfig(49,"C001D_ALARM",PLCType.推水机,PLCDataType.故障代码,"04","故障信号","11","01"));
deviceDataConfigList.add(new DeviceDataConfig(50,"C001E_RUN",PLCType.推水机,PLCDataType.控制器状态码,"05","运行信号"));
deviceDataConfigList.add(new DeviceDataConfig(51,"C001E_ALARM",PLCType.推水机,PLCDataType.故障代码,"05","故障信号","11","01"));
deviceDataConfigList.add(new DeviceDataConfig(52,"C001F_RUN",PLCType.推水机,PLCDataType.控制器状态码,"06","运行信号"));
deviceDataConfigList.add(new DeviceDataConfig(53,"C001F_ALARM",PLCType.推水机,PLCDataType.故障代码,"06","故障信号","11","01"));
deviceDataConfigList.add(new DeviceDataConfig(7,"C002_RUN",PLCType.增氧机,PLCDataType.控制器状态码,"34","运行信号"));
deviceDataConfigList.add(new DeviceDataConfig(8,"C002_ALARM",PLCType.增氧机,PLCDataType.故障代码,"34","故障信号","11","01"));
deviceDataConfigList.add(new DeviceDataConfig(9,"P001A_RUN",PLCType.排污,PLCDataType.控制器状态码,"21","运行信号"));
deviceDataConfigList.add(new DeviceDataConfig(10,"P001A_ALARM",PLCType.排污,PLCDataType.故障代码,"21","故障信号","11","01"));
deviceDataConfigList.add(new DeviceDataConfig(11,"P001B_RUN",PLCType.排污,PLCDataType.控制器状态码,"22","运行信号"));
deviceDataConfigList.add(new DeviceDataConfig(12,"P001B_ALARM",PLCType.排污,PLCDataType.故障代码,"22","故障信号","11","01"));
deviceDataConfigList.add(new DeviceDataConfig(13,"P001C_RUN",PLCType.排污,PLCDataType.控制器状态码,"23","运行信号"));
deviceDataConfigList.add(new DeviceDataConfig(14,"P001C_ALARM",PLCType.排污,PLCDataType.故障代码,"23","故障信号","11","01"));
deviceDataConfigList.add(new DeviceDataConfig(54,"P001D_RUN",PLCType.排污,PLCDataType.控制器状态码,"24","运行信号"));
deviceDataConfigList.add(new DeviceDataConfig(55,"P001D_ALARM",PLCType.排污,PLCDataType.故障代码,"24","故障信号","11","01"));
deviceDataConfigList.add(new DeviceDataConfig(56,"P001E_RUN",PLCType.排污,PLCDataType.控制器状态码,"25","运行信号"));
deviceDataConfigList.add(new DeviceDataConfig(57,"P001E_ALARM",PLCType.排污,PLCDataType.故障代码,"25","故障信号","11","01"));
deviceDataConfigList.add(new DeviceDataConfig(58,"P001F_RUN",PLCType.排污,PLCDataType.控制器状态码,"26","运行信号"));
deviceDataConfigList.add(new DeviceDataConfig(59,"P001F_ALARM",PLCType.排污,PLCDataType.故障代码,"26","故障信号","11","01"));
deviceDataConfigList.add(new DeviceDataConfig(60,"P002_RUN",PLCType.排污,PLCDataType.控制器状态码,"40","运行信号"));
deviceDataConfigList.add(new DeviceDataConfig(61,"P002_ALARM",PLCType.排污,PLCDataType.故障代码,"40","故障信号","11","01"));
deviceDataConfigList.add(new DeviceDataConfig(62,"ZZC_L_YW",PLCType.排污,PLCDataType.液位高低,"41","低液位信号",null,"00"));
deviceDataConfigList.add(new DeviceDataConfig(63,"ZZC_H_YW",PLCType.排污,PLCDataType.液位高低,"41","高液位信号",null,"01"));
deviceDataConfigList.add(new DeviceDataConfig(15,"SD_RUN",null,PLCDataType.故障代码,"00","市电供电信号","12","00"));
deviceDataConfigList.add(new DeviceDataConfig(16,"FD_RUN",null,PLCDataType.故障代码,"00","发电供电信号","13","01"));
deviceDataConfigList.add(new DeviceDataConfig(17,"DY_ALARM",null,PLCDataType.故障代码,"00","电源故障信号","51","01"));
deviceDataConfigList.add(new DeviceDataConfig(18,"SYS_AUTO",null,PLCDataType.控制柜状态,"00","系统自动允许"));
deviceDataConfigList.add(new DeviceDataConfig(26,"TX_RUN",null,PLCDataType.故障代码,"00","远程通讯正常","01","00"));
deviceDataConfigList.add(new DeviceDataConfig(41,"SYS_ALARM",null,PLCDataType.故障代码,"00","设备故障报警","01","01"));
deviceDataConfigList.add(new DeviceDataConfig(73,"YC_AUTO_P002",PLCType.排污,PLCDataType.控制器状态码,"41","远程自动按钮",null,"01"));
deviceDataConfigList.add(new DeviceDataConfig(1,"C001_RUN",PLCType.曝气,PLCDataType.控制器状态码,"42","运行信号"));
deviceDataConfigList.add(new DeviceDataConfig(2,"C001_ALARM",PLCType.曝气,PLCDataType.故障代码,"42","故障信号","11","01"));
deviceDataConfigList.add(new DeviceDataConfig(1,"P003_RUN",PLCType.微滤机,PLCDataType.控制器状态码,"43","微滤反洗水泵运行信号"));
deviceDataConfigList.add(new DeviceDataConfig(2,"P003_ALARM",PLCType.微滤机,PLCDataType.故障代码,"43","微滤反洗水泵故障信号","11","01"));
deviceDataConfigList.add(new DeviceDataConfig(1,"M001_RUN",PLCType.微滤机,PLCDataType.控制器状态码,"44","微滤驱动电机运行信号"));
deviceDataConfigList.add(new DeviceDataConfig(2,"M001_ALARM",PLCType.微滤机,PLCDataType.故障代码,"44","微滤驱动电机故障信号","11","01"));
deviceDataConfigList.add(new DeviceDataConfig(1,"DV01_RUN",PLCType.蛋分,PLCDataType.控制器状态码,"45","蛋分电磁阀运行信号"));
deviceDataConfigList.add(new DeviceDataConfig(1,"DF_YW",PLCType.蛋分,PLCDataType.液位高低,"45","蛋分低液位"));
deviceDataConfigList.add(new DeviceDataConfig(1,"ZWX_RUN",PLCType.杀菌,PLCDataType.控制器状态码,"46","紫外线运行信号"));
deviceDataConfigList.add(new DeviceDataConfig(1,"JCY_RUN",PLCType.鱼儿乐,PLCDataType.控制器状态码,"47","水质监测仪运行信号"));
deviceDataConfigList.add(new DeviceDataConfig(1,"ZM_RUN",null,PLCDataType.控制器状态码,"00","照明运行信号"));
deviceDataConfigList.add(new DeviceDataConfig(1,"XHSC_YW_L",PLCType.循环水池,PLCDataType.低液位,"48","循环水池低液位"));
deviceDataConfigList.add(new DeviceDataConfig(1,"XHSC_YW_H",PLCType.循环水池,PLCDataType.高液位,"49","循环水池高液位"));
deviceDataConfigList.add(new DeviceDataConfig(1,"SWLT_YW_1",PLCType.生物滤筒,PLCDataType.液位高低,"50","生物滤筒液位1"));
deviceDataConfigList.add(new DeviceDataConfig(1,"SWLT_YW_2",PLCType.生物滤筒,PLCDataType.液位高低,"51","生物滤筒液位2"));
deviceDataConfigList.add(new DeviceDataConfig(1,"ZWX_YW",PLCType.杀菌,PLCDataType.液位高低,"52","紫外线液位"));
deviceDataConfigList.add(new DeviceDataConfig(1,"WL_YW",PLCType.微滤机,PLCDataType.高液位,"53","微滤机池高液位"));
deviceDataWriteConfigList.add(new DeviceDataConfig(27,"YC_ST_C001A",PLCType.推水机,PLCDataType.控制器状态码,"01","远程启动按钮",null,"01"));
deviceDataWriteConfigList.add(new DeviceDataConfig(28,"YC_STP_C001A",PLCType.推水机,PLCDataType.控制器状态码,"01","远程停止按钮",null,"00"));
deviceDataWriteConfigList.add(new DeviceDataConfig(29,"YC_ST_C001B",PLCType.推水机,PLCDataType.控制器状态码,"02","远程启动按钮",null,"01"));
deviceDataWriteConfigList.add(new DeviceDataConfig(30,"YC_STP_C001B",PLCType.推水机,PLCDataType.控制器状态码,"02","远程停止按钮",null,"00"));
deviceDataWriteConfigList.add(new DeviceDataConfig(31,"YC_ST_C001C",PLCType.推水机,PLCDataType.控制器状态码,"03","远程启动按钮",null,"01"));
deviceDataWriteConfigList.add(new DeviceDataConfig(32,"YC_STP_C001C",PLCType.推水机,PLCDataType.控制器状态码,"03","远程停止按钮",null,"00"));
deviceDataWriteConfigList.add(new DeviceDataConfig(42,"YC_ST_C001D",PLCType.推水机,PLCDataType.控制器状态码,"04","远程启动按钮",null,"01"));
deviceDataWriteConfigList.add(new DeviceDataConfig(43,"YC_STP_C001D",PLCType.推水机,PLCDataType.控制器状态码,"04","远程停止按钮",null,"00"));
deviceDataWriteConfigList.add(new DeviceDataConfig(44,"YC_ST_C001E",PLCType.推水机,PLCDataType.控制器状态码,"05","远程启动按钮",null,"01"));
deviceDataWriteConfigList.add(new DeviceDataConfig(45,"YC_STP_C001E",PLCType.推水机,PLCDataType.控制器状态码,"05","远程停止按钮",null,"00"));
deviceDataWriteConfigList.add(new DeviceDataConfig(46,"YC_ST_C001F",PLCType.推水机,PLCDataType.控制器状态码,"06","远程启动按钮",null,"01"));
deviceDataWriteConfigList.add(new DeviceDataConfig(47,"YC_STP_C001F",PLCType.推水机,PLCDataType.控制器状态码,"06","远程停止按钮",null,"00"));
deviceDataWriteConfigList.add(new DeviceDataConfig(33,"YC_ST_C002",PLCType.增氧机,PLCDataType.控制器状态码,"34","远程启动按钮",null,"01"));
deviceDataWriteConfigList.add(new DeviceDataConfig(34,"YC_STP_C002",PLCType.增氧机,PLCDataType.控制器状态码,"34","远程停止按钮",null,"00"));
deviceDataWriteConfigList.add(new DeviceDataConfig(35,"YC_ST_P001A",PLCType.排污,PLCDataType.控制器状态码,"21","远程启动按钮",null,"01"));
deviceDataWriteConfigList.add(new DeviceDataConfig(36,"YC_STP_P001A",PLCType.排污,PLCDataType.控制器状态码,"21","远程停止按钮",null,"00"));
deviceDataWriteConfigList.add(new DeviceDataConfig(37,"YC_ST_P001B",PLCType.排污,PLCDataType.控制器状态码,"22","远程启动按钮",null,"01"));
deviceDataWriteConfigList.add(new DeviceDataConfig(38,"YC_STP_P001B",PLCType.排污,PLCDataType.控制器状态码,"22","远程停止按钮",null,"00"));
deviceDataWriteConfigList.add(new DeviceDataConfig(39,"YC_ST_P001C",PLCType.排污,PLCDataType.控制器状态码,"23","远程启动按钮",null,"01"));
deviceDataWriteConfigList.add(new DeviceDataConfig(40,"YC_STP_P001C",PLCType.排污,PLCDataType.控制器状态码,"23","远程停止按钮",null,"00"));
deviceDataWriteConfigList.add(new DeviceDataConfig(64,"YC_ST_P001D",PLCType.排污,PLCDataType.控制器状态码,"24","远程启动按钮",null,"01"));
deviceDataWriteConfigList.add(new DeviceDataConfig(65,"YC_STP_P001D",PLCType.排污,PLCDataType.控制器状态码,"24","远程停止按钮",null,"00"));
deviceDataWriteConfigList.add(new DeviceDataConfig(66,"YC_ST_P001E",PLCType.排污,PLCDataType.控制器状态码,"25","远程启动按钮",null,"01"));
deviceDataWriteConfigList.add(new DeviceDataConfig(67,"YC_STP_P001E",PLCType.排污,PLCDataType.控制器状态码,"25","远程停止按钮",null,"00"));
deviceDataWriteConfigList.add(new DeviceDataConfig(68,"YC_ST_P001F",PLCType.排污,PLCDataType.控制器状态码,"26","远程启动按钮",null,"01"));
deviceDataWriteConfigList.add(new DeviceDataConfig(69,"YC_STP_P001F",PLCType.排污,PLCDataType.控制器状态码,"26","远程停止按钮",null,"00"));
deviceDataWriteConfigList.add(new DeviceDataConfig(70,"YC_ST_P002",PLCType.排污,PLCDataType.控制器状态码,"40","远程启动按钮",null,"01"));
deviceDataWriteConfigList.add(new DeviceDataConfig(71,"YC_STP_P002",PLCType.排污,PLCDataType.控制器状态码,"40","远程停止按钮",null,"00"));
deviceDataWriteConfigList.add(new DeviceDataConfig(72,"YC_AUTO_P002",PLCType.排污,PLCDataType.控制器状态码,"41","远程自动按钮",null,"01"));
deviceDataWriteConfigList.add(new DeviceDataConfig(74,"SYS_REST",PLCType.推水机,PLCDataType.复位,"01","设备故障复位",null,"1"));
List<DeviceDataConfig> deviceDataConfigList = deviceService.getBaseDao().findBysql("SELECT * FROM `device_data_config` WHERE read_write_type=1 OR read_write_type=3",DeviceDataConfig.class);
if(null != deviceDataConfigList && deviceDataConfigList.size() > 0)
{
for (DeviceDataConfig deviceDataConfig : deviceDataConfigList)
{
deviceDataConfigReadMap.put(deviceDataConfig.getAttribute_name(),deviceDataConfig);
}
}
List<DeviceDataConfig> deviceDataConfigs = deviceService.getBaseDao().findBysql("SELECT * FROM `device_data_config` WHERE read_write_type=2 OR read_write_type=3",DeviceDataConfig.class);
if(null != deviceDataConfigs && deviceDataConfigs.size() > 0)
{
for (DeviceDataConfig deviceDataConfig : deviceDataConfigs)
{
deviceDataConfigWriteMap.put(deviceDataConfig.getAttribute_name(),deviceDataConfig);
}
}
}
public static Map<String, DeviceDataConfig> get004112100019727Map()
{
// String attribute_name, PLCType device_type, PLCDataType plc_data_type,String sensor_numer,String attribute_describe
Map<String, DeviceDataConfig> deviceDataConfigReadMap = new HashMap<>();
deviceDataConfigReadMap.put("YC_QT_C001A",new DeviceDataConfig("YC_QT_C001A",PLCType.推水机,PLCDataType.控制器状态码,"01","远程启停按钮"));
deviceDataConfigReadMap.put("YC_QT_C001B",new DeviceDataConfig("YC_QT_C001B",PLCType.推水机,PLCDataType.控制器状态码,"02","远程启停按钮"));
deviceDataConfigReadMap.put("YC_QT_C001C",new DeviceDataConfig("YC_QT_C001C",PLCType.推水机,PLCDataType.控制器状态码,"03","远程启停按钮"));
deviceDataConfigReadMap.put("YC_QT_C001D",new DeviceDataConfig("YC_QT_C001D",PLCType.推水机,PLCDataType.控制器状态码,"04","远程启停按钮"));
deviceDataConfigReadMap.put("YC_QT_C002",new DeviceDataConfig("YC_QT_C002",PLCType.增氧机,PLCDataType.控制器状态码,"34","远程启停按钮"));
deviceDataConfigReadMap.put("YC_QT_P001A",new DeviceDataConfig("YC_QT_P001A",PLCType.排污,PLCDataType.控制器状态码,"21","远程启停按钮"));
deviceDataConfigReadMap.put("YC_QT_P001B",new DeviceDataConfig("YC_QT_P001B",PLCType.排污,PLCDataType.控制器状态码,"22","远程启停按钮"));
deviceDataConfigReadMap.put("YC_QT_P001C",new DeviceDataConfig("YC_QT_P001C",PLCType.排污,PLCDataType.控制器状态码,"23","远程启停按钮"));
deviceDataConfigReadMap.put("YC_QT_P001D",new DeviceDataConfig("YC_QT_P001D",PLCType.排污,PLCDataType.控制器状态码,"24","远程启停按钮"));
return deviceDataConfigReadMap;
}
}
... ...
package com.zhonglai.luhui.lsy.plc.service.dto;
/**
* PLC 开关定时器
* Created by Administrator on 2017/2/6.
*/
public class DeviceTimer {
private Integer id; //主键id
private String imei; //IMEI号
private String number; //编号(多个用|分开)
private String deviceName; //设备名称(多个用|分开)
private Integer serialNumber; //控制序号
private Integer baseId; //基地id
private String baseName; //基地名称
private Integer userId; //用户id
private String userLogin; //用户登录名
private Integer startTime; //开始时间
private Integer endTime; //结束时间
private Integer createTime; //创建时间
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getImei() {
return imei;
}
public void setImei(String imei) {
this.imei = imei;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getDeviceName() {
return deviceName;
}
public void setDeviceName(String deviceName) {
this.deviceName = deviceName;
}
public Integer getStartTime() {
return startTime;
}
public void setStartTime(Integer startTime) {
this.startTime = startTime;
}
public Integer getEndTime() {
return endTime;
}
public void setEndTime(Integer endTime) {
this.endTime = endTime;
}
public Integer getCreateTime() {
return createTime;
}
public void setCreateTime(Integer createTime) {
this.createTime = createTime;
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUserLogin() {
return userLogin;
}
public void setUserLogin(String userLogin) {
this.userLogin = userLogin;
}
public Integer getBaseId() {
return baseId;
}
public void setBaseId(Integer baseId) {
this.baseId = baseId;
}
public String getBaseName() {
return baseName;
}
public void setBaseName(String baseName) {
this.baseName = baseName;
}
public Integer getSerialNumber() {
return serialNumber;
}
public void setSerialNumber(Integer serialNumber) {
this.serialNumber = serialNumber;
}
}
\ No newline at end of file
... ...
... ... @@ -17,6 +17,8 @@ public enum PLCDataType {
复位("101"),
低液位("102"),
高液位("103"),
定时("105"),
校准时间("106"),
控制柜状态("104");
public String sensorDataType;
... ...
... ... @@ -16,6 +16,7 @@ public enum PLCType {
循环水池(13),
杀菌(14),
生物滤筒(15),
主机(16),
备用(8);
private Integer device_terminal_type_key;
... ...
package com.zhonglai.luhui.lsy.plc.service.service.topic;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.JsonObject;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.GsonConstructor;
import com.ruoyi.common.utils.StringUtils;
import com.zhonglai.luhui.device.analysis.comm.config.SysParameter;
import com.zhonglai.luhui.device.analysis.comm.dao.BaseDao;
import com.zhonglai.luhui.device.analysis.comm.dto.DeviceOperationTypeEnum;
import com.zhonglai.luhui.device.analysis.comm.dto.DeviceSensorData;
import com.zhonglai.luhui.device.analysis.comm.dto.ServerDto;
... ... @@ -19,15 +21,20 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.text.ParseException;
import java.util.*;
/**
* 全量上报数据,不需要返回
*/
@Service("ALL_POST")
public class AllPostTopic implements BusinessAgreement<AllPostDto> {
private static final Logger log = LoggerFactory.getLogger(AllPostTopic.class);
private static Map<String, JSONObject> deviceTime = new HashMap<>();
@Autowired
private DeviceService deviceService;
@Override
... ... @@ -55,72 +62,190 @@ public class AllPostTopic implements BusinessAgreement<AllPostDto> {
JSONObject object = data.getData();
if(null != object && object.size() !=0)
{
List<DeviceDataConfig> deviceDataConfigList = DeviceProductProtocol.deviceDataConfigList; //获取点位表配置
if(null != deviceDataConfigList && deviceDataConfigList.size() !=0)
Map<String, DeviceDataConfig> deviceDataConfigMap = DeviceProductProtocol.deviceDataConfigReadMap; //获取点位表配置
if(null != deviceDataConfigMap && deviceDataConfigMap.size() !=0)
{
for (DeviceInfo deviceInfo:deviceInfoList)
analysisTime(object,deviceDataConfigMap,topic,deviceInfoList);
for (String key : object.keySet())
{
String newAlrmCode = "00";
for (DeviceDataConfig deviceDataConfig:deviceDataConfigList)
if(deviceDataConfigMap.containsKey(key))
{
String dttribute_name = deviceDataConfig.getAttribute_name();
if(object.containsKey(dttribute_name) && null != object.get(dttribute_name)) //点位值存在
{
String dttribute_value = object.get(dttribute_name).toString();
String newDataValue= ByteUtil.changerTwoStr(dttribute_value);
String dttribute_value = object.get(key).toString();
String newDataValue= ByteUtil.changerTwoStr(dttribute_value);
String deviceInfoId = deviceDataConfig.getDeviceInfoId(topic.getClientid()); //根据点位协议解析到设备id
if(deviceInfoId.equals(deviceInfo.getId()) || deviceInfoId.equals(topic.getClientid())) //点位匹配
DeviceDataConfig deviceDataConfig = deviceDataConfigMap.get(key);
String newAlrmCode = "00";
String deviceInfoId = deviceDataConfig.getDeviceInfoId(topic.getClientid()); //根据点位协议解析到设备id
DeviceInfo deviceInfo = getDeviceInfo(deviceInfoList,deviceInfoId);
if(null != deviceInfo)
{
switch (PLCDataType.valueOf(deviceDataConfig.getPlc_data_type()))
{
switch (deviceDataConfig.getPlc_data_type())
{
case 故障代码:
if(newDataValue.equals(deviceDataConfig.getAlarmValue()))
{
newAlrmCode = deviceDataConfig.getAlarmCode();
}
break;
default:
String dataValue = deviceInfo.getDataValue();
JSONObject jsonObject = new JSONObject();
if(StringUtils.isNotEmpty(dataValue))
{
jsonObject = GsonConstructor.get().fromJson(dataValue,JSONObject.class);
}
String odlDataValue = (String) jsonObject.get(deviceDataConfig.getPlc_data_type().sensorDataType);
if(!newDataValue.equals(odlDataValue))
{
jsonObject.put(deviceDataConfig.getPlc_data_type().sensorDataType,newDataValue); //更新数据
if(deviceDataConfig.getPlc_data_type().sensorDataType.equals("104"))
{
jsonObject.put("9",newDataValue); //更新数据
}
deviceInfo.setDataValue(jsonObject.toJSONString());
String describe = deviceDataConfig.getAttribute_describe()+newDataValue;
//记录日志
if(null != deviceDataConfig.getDevice_type())
{
describe = deviceDataConfig.getSensor_numer()+deviceDataConfig.getDevice_type().name()+describe;
}
data.getLogDeviceOperationList().add(addLogDeviceOperation(topic.getClientid(),deviceDataConfig.getSensor_numer(),null,describe,newDataValue,odlDataValue,1));
}
break;
}
case 故障代码:
if(newDataValue.equals(deviceDataConfig.getAlarmValue()))
{
newAlrmCode = deviceDataConfig.getAlarmCode();
}
break;
case 控制柜状态:
analysisData(data,deviceInfo,deviceDataConfig,newDataValue,topic);
break;
case 校准时间:
analysisData(data,deviceInfo,deviceDataConfig,newDataValue,topic);
break;
default:
analysisData(data,deviceInfo,deviceDataConfig,newDataValue,topic);
break;
}
deviceInfo.setAlarmCode(newAlrmCode);
deviceInfo.setDataUpdateTime(DateUtils.getNowTimeMilly());
deviceInfo.setDeviceServiceIp(SysParameter.service_ip);
deviceInfo.setOnline("01");
}
}
deviceInfo.setAlarmCode(newAlrmCode);
deviceInfo.setDataUpdateTime(DateUtils.getNowTimeMilly());
deviceInfo.setDeviceServiceIp(SysParameter.service_ip);
deviceInfo.setOnline("01");
}
}
}
return data;
}
private void analysisTime( JSONObject jsonObject,Map<String, DeviceDataConfig> deviceDataConfigMap,Topic topic,List<DeviceInfo> deviceInfoList)
{
if(null != jsonObject && jsonObject.size() != 0)
{
JSONObject oldTime = deviceTime.get(topic.getClientid());
String imei = topic.getClientid();
for (int i=1;i<=4;i++) //支持定时器的排污数
{
for (int j=1;j<=3;j++) //每个排污支持的定时器数据
{
String start_time_attribute_name = "PW"+i+"_TS"+j;
String end_time_attribute_name = "PW"+i+"_TE"+j;
if(jsonObject.containsKey(start_time_attribute_name) && jsonObject.get(start_time_attribute_name) != null && jsonObject.containsKey(end_time_attribute_name) && jsonObject.get(end_time_attribute_name) != null
&&(null == oldTime || !jsonObject.getString(start_time_attribute_name).equals(oldTime.getString(start_time_attribute_name)) || !jsonObject.getString(end_time_attribute_name).equals(oldTime.getString(end_time_attribute_name)))) //值存在并且有数据更新
{
//开始时间段
DeviceDataConfig deviceDataConfig = deviceDataConfigMap.get(start_time_attribute_name);
DeviceInfo deviceInfo = getDeviceInfo(deviceInfoList,imei+"_"+deviceDataConfig.getSensor_numer());
if(null != deviceInfo)
{
Integer statTime = jsonObject.getInteger(start_time_attribute_name);
Integer endTime = jsonObject.getInteger(end_time_attribute_name);
try {
upDeviceTimer(topic.getClientid(),j,deviceDataConfig,deviceInfo,statTime,endTime );
} catch (ParseException e) {
log.error("定时器解析错误",e);
}
// if(null != statTime && 0!= statTime && null != endTime && 0!= endTime)
// {
//
// }
}
}
jsonObject.remove(start_time_attribute_name);
jsonObject.remove(end_time_attribute_name);
}
}
}
}
public static String formatToTime(String timeStr) {
if (timeStr.length() > 4) {
log.error("时间格式错误"+timeStr);
return null;
}
if (timeStr.length() < 4) {
// 补零到4位,例如 "612" → "0612"
timeStr = String.format("%04d", Integer.parseInt(timeStr));
}
String hour = timeStr.substring(0, 2);
String minute = timeStr.substring(2, 4);
return hour + ":" + minute;
}
private DeviceInfo getDeviceInfo(List<DeviceInfo> list,String id)
{
if(null != list && StringUtils.isNotEmpty(id))
{
for (DeviceInfo deviceInfo:list)
{
if (id.equals(deviceInfo.getId()))
{
return deviceInfo;
}
}
}
return null;
}
private void upDeviceTimer(String deviceId,Integer serialNumber,DeviceDataConfig deviceDataConfig,DeviceInfo deviceInfo,Integer statTime,Integer endTime) throws ParseException {
String sShi = formatToTime(statTime+"");
String eShi = formatToTime(endTime+"");
DeviceTimer deviceTimer = new DeviceTimer();
deviceTimer.setImei(deviceId);
deviceTimer.setNumber(deviceDataConfig.getSensor_numer());
deviceTimer.setSerialNumber(serialNumber);
long totle = deviceService.getTol(deviceTimer);
deviceTimer.setBaseId(deviceInfo.getBaseId());
deviceTimer.setCreateTime(DateUtils.getNowTimeMilly());
deviceTimer.setUserId(deviceInfo.getUserId());
deviceTimer.setUserLogin(deviceInfo.getUserLoginName());
deviceTimer.setBaseName(deviceInfo.getBaseName());
deviceTimer.setDeviceName(deviceInfo.getDeviceName());
deviceTimer.setStartTime((int) ((DateUtils.parseDate(DateUtils.dateTimeNow("yyyy-MM-dd")+" "+sShi+":00", DateUtils.YYYY_MM_DD_HH_MM_SS).getTime())/1000));
deviceTimer.setEndTime((int) ((DateUtils.parseDate(DateUtils.dateTimeNow("yyyy-MM-dd")+" "+eShi+":00", DateUtils.YYYY_MM_DD_HH_MM_SS).getTime())/1000));
if(totle>0)
{
deviceService.getBaseDao().updateBySql("update `runing_fish`.`device_timer` set base_id="+deviceTimer.getBaseId()+
",user_id="+deviceTimer.getUserId()+",user_login='"+deviceTimer.getUserLogin()+
"',base_name='"+deviceTimer.getBaseName()+"',device_name='"+deviceTimer.getDeviceName()+
"' where imei='"+deviceTimer.getImei()+"' and number='"+deviceTimer.getNumber()+"' and serial_number="+deviceTimer.getSerialNumber()
);
}else{
deviceService.getBaseDao().insert(deviceTimer);
}
}
private void analysisData(AllPostDto data,DeviceInfo deviceInfo,DeviceDataConfig deviceDataConfig,String newDataValue,Topic topic)
{
String dataValue = deviceInfo.getDataValue();
JSONObject jsonObject = new JSONObject();
if(StringUtils.isNotEmpty(dataValue))
{
jsonObject = GsonConstructor.get().fromJson(dataValue,JSONObject.class);
}
String odlDataValue = (String) jsonObject.get(PLCDataType.valueOf(deviceDataConfig.getPlc_data_type()).sensorDataType);
if(!newDataValue.equals(odlDataValue))
{
jsonObject.put(PLCDataType.valueOf(deviceDataConfig.getPlc_data_type()).sensorDataType,newDataValue); //更新数据
if(PLCDataType.valueOf(deviceDataConfig.getPlc_data_type()).sensorDataType.equals("104"))
{
jsonObject.put("9",newDataValue); //更新数据
}
deviceInfo.setDataValue(jsonObject.toJSONString());
String describe = deviceDataConfig.getAttribute_describe()+newDataValue;
//记录日志
if(null != deviceDataConfig.getDevice_type())
{
describe = deviceDataConfig.getSensor_numer()+deviceDataConfig.getDevice_type()+describe;
}
data.getLogDeviceOperationList().add(addLogDeviceOperation(topic.getClientid(),deviceDataConfig.getSensor_numer(),null,describe,newDataValue,odlDataValue,1));
}
}
@Override
public AllPostDto toData(BusinessDto data) {
AllPostDto serverDto = new AllPostDto();
... ... @@ -141,6 +266,7 @@ public class AllPostTopic implements BusinessAgreement<AllPostDto> {
}
/**
* 添加设备操作日志记录
* @param deviceId 设备imei
... ...