From 61b40ca50044c8b20b6ea21028398e068ca103a0 Mon Sep 17 00:00:00 2001 From: jiazx0107@163.com <jiazx0107@163.com> Date: 星期六, 12 八月 2023 16:16:14 +0800 Subject: [PATCH] 调整DEVICE的字段和缓存,增加支持根据ID直接获取设备信息,优化MODBUS-TCP协议 实现 --- igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteControlServiceImpl.java | 78 ++++++++ igds-core/src/main/java/com/ld/igds/common/CoreDeviceService.java | 10 + igds-core/src/main/java/com/ld/igds/view/Device.view.xml | 12 + igds-core/src/main/java/com/ld/igds/io/constant/ProtocolEnum.java | 3 igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/data/ModbusTcp.java | 35 +++ igds-core/src/main/java/com/ld/igds/constant/RedisConst.java | 6 igds-core/src/main/java/com/ld/igds/models/Device.java | 4 igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusUtil.java | 186 ++++++++++++++++++++ igds-core/src/main/java/com/ld/igds/common/impl/CoreDeviceServiceImpl.java | 85 ++++++--- igds-core/src/main/java/com/ld/igds/view/service/HDicAreaService.java | 3 igds-core/src/main/resources/mapper/DeviceMapper.xml | 1 igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusConfig.java | 69 +++++++ igds-core/src/main/java/models/igds.model.xml | 22 ++ 13 files changed, 480 insertions(+), 34 deletions(-) diff --git a/igds-core/src/main/java/com/ld/igds/common/CoreDeviceService.java b/igds-core/src/main/java/com/ld/igds/common/CoreDeviceService.java index 199f4c7..216fd35 100644 --- a/igds-core/src/main/java/com/ld/igds/common/CoreDeviceService.java +++ b/igds-core/src/main/java/com/ld/igds/common/CoreDeviceService.java @@ -39,6 +39,16 @@ */ List<Device> getCacheDeviceBySerId(String companyId, String serId); + + /** + * 鏍规嵁鍒嗘満淇℃伅鑾峰彇璁惧 + * + * @param companyId + * @param id + * @return + */ + Device getCacheDeviceById(String companyId, String id); + /** * 鍒锋柊缂撳瓨 * diff --git a/igds-core/src/main/java/com/ld/igds/common/impl/CoreDeviceServiceImpl.java b/igds-core/src/main/java/com/ld/igds/common/impl/CoreDeviceServiceImpl.java index f96082f..ac4ab1b 100644 --- a/igds-core/src/main/java/com/ld/igds/common/impl/CoreDeviceServiceImpl.java +++ b/igds-core/src/main/java/com/ld/igds/common/impl/CoreDeviceServiceImpl.java @@ -1,15 +1,14 @@ package com.ld.igds.common.impl; import java.util.*; -import java.util.stream.Collectors; import com.ld.igds.common.CoreDeviceService; import com.ld.igds.common.dto.DepotSerData; import com.ld.igds.common.mapper.DeviceMapper; import com.ld.igds.constant.Constant; import com.ld.igds.constant.DeviceStatus; - import com.ld.igds.constant.DeviceType; + import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -32,37 +31,63 @@ private DeviceMapper deviceMapper; - @Override + @SuppressWarnings({ "unchecked", "rawtypes" }) + @Override public void setCacheAllDevice(List<Device> listAll, String companyId) { - // 棣栧厛鎸夌収鍒嗘満鍒嗙粍锛岀劧鍚庡瓨鏇存柊缂撳瓨銆� - Map<String, List<Device>> map = listAll.stream().collect(Collectors.groupingBy(Device::getSerId)); - if (null == map || map.isEmpty()) { - log.error("瀛楀吀淇℃伅锛氭墍鏈夎澶囨寜鐓у垎鏈哄垎缁勪繚瀛樼紦瀛樺け璐ワ紝娌℃湁鍒嗙粍鎴愬姛=={}", companyId); - return; - } + if (null == listAll || listAll.isEmpty()) return; - for (String serId : map.keySet()) { - updateCacheDeviceBySerId(map.get(serId), companyId, serId); - } + //鎸夌収鍒嗘満鍒嗙被 + Map<String, List<Device>> mapSer = new HashMap<>(); - this.setCacheDepotDeviceSer(listAll, companyId); - } + //浠撳簱-璁惧-鍒嗘満瀵硅薄鍒嗙被 + Map<String, DepotSerData> mapDepot = new HashMap<>(); - @SuppressWarnings({"unchecked", "rawtypes"}) - private void setCacheDepotDeviceSer(List<Device> listAll, String companyId) { - // 澶勭悊浠撳簱涓庡垎鏈虹殑鍏崇郴缂撳瓨 - Map<String, DepotSerData> tempMap = new HashMap<>(); - String key; - for (Device item : listAll) { - key = companyId + "-" + item.getDepotId() + "-" + item.getSerId(); - if (tempMap.get(key) == null) { - tempMap.put(key, new DepotSerData(companyId, item.getDepotId(), item.getSerId())); + + //鎶婅澶囨寜鐓у垎鏈鸿繘琛屽垎缁勶紝鍚屼簨鍚ц澶囨坊鍔犲埌缂撳瓨鍒楄〃涓� + String deviceKey, depotDataKey; + for (Device device : listAll) { + + //灏佽浠撳簱-璁惧-鍒嗘満瀵硅薄鍏崇郴 + depotDataKey = companyId + "-" + device.getDepotId() + "-" + device.getSerId(); + if (mapDepot.get(depotDataKey) == null) { + mapDepot.put(depotDataKey, new DepotSerData(companyId, device.getDepotId(), device.getSerId())); } + + + //鍗曚釜璁惧杩涜缂撳瓨 + deviceKey = RedisConst.buildKey(companyId, RedisConst.KEY_DEVICE, device.getId()); + redisUtil.set(deviceKey, device); + + //鎸夌収鍒嗘満鍒嗙被 + if (null == mapSer.get(device.getSerId())) mapSer.put(device.getSerId(), new ArrayList<Device>()); + mapSer.get(device.getSerId()).add(device); + } - redisUtil.set(RedisConst.buildKey(companyId, RedisConst.KEY_DEPOT_SER_LIST), new ArrayList(tempMap.values())); + //浠ュ垎鏈轰负鍗曚綅缂撳瓨璁惧 + for (String serId : mapSer.keySet()) { + updateCacheDeviceBySerId(mapSer.get(serId), companyId, serId); + } + + + redisUtil.set(RedisConst.buildKey(companyId, RedisConst.KEY_DEPOT_SER_LIST), new ArrayList(mapDepot.values())); } + + +// private void setCacheDepotDeviceSer(List<Device> listAll, String companyId) { +// // 澶勭悊浠撳簱涓庡垎鏈虹殑鍏崇郴缂撳瓨 +// Map<String, DepotSerData> tempMap = new HashMap<>(); +// String key; +// for (Device item : listAll) { +// key = companyId + "-" + item.getDepotId() + "-" + item.getSerId(); +// if (tempMap.get(key) == null) { +// tempMap.put(key, new DepotSerData(companyId, item.getDepotId(), item.getSerId())); +// } +// } +// +// redisUtil.set(RedisConst.buildKey(companyId, RedisConst.KEY_DEPOT_SER_LIST), new ArrayList(tempMap.values())); +// } @Override public void updateCacheDeviceBySerId(List<Device> listBySer, String companyId, String serId) { @@ -85,6 +110,12 @@ return null; } return list; + } + + @Override + public Device getCacheDeviceById(String companyId, String id) { + String key = RedisConst.buildDeviceKey(companyId, RedisConst.KEY_DEVICE, id); + return (Device) redisUtil.get(key); } @Override @@ -173,7 +204,7 @@ } log.debug("瑙f瀽璁惧鐘舵��--涓婚�氶亾={}---鍏宠仈閫氶亾={}--瑙f瀽鍚庣姸鎬�={}", curDevice.getPassCode(), curDevice.getLink(), curDevice.getStatus()); } - + // 鏇存柊缂撳瓨 this.updateCacheDeviceBySerId(listCache, companyId, serId); } @@ -279,7 +310,7 @@ } @Override - public List<Device> getDeviceByTimId(String companyId,String timId){ - return deviceMapper.queryByTimId(companyId,timId); + public List<Device> getDeviceByTimId(String companyId, String timId) { + return deviceMapper.queryByTimId(companyId, timId); } } diff --git a/igds-core/src/main/java/com/ld/igds/constant/RedisConst.java b/igds-core/src/main/java/com/ld/igds/constant/RedisConst.java index d8431e3..60760c8 100644 --- a/igds-core/src/main/java/com/ld/igds/constant/RedisConst.java +++ b/igds-core/src/main/java/com/ld/igds/constant/RedisConst.java @@ -88,6 +88,12 @@ * 璁惧鍒楄〃 */ public static final String KEY_DEVICE_LIST = "DEVICE_LIST"; + + /** + * 鍗曚釜鑹插彿鍚� + */ + public static final String KEY_DEVICE = "DEVICE"; + /** * 璁惧鍒楄〃 */ diff --git a/igds-core/src/main/java/com/ld/igds/io/constant/ProtocolEnum.java b/igds-core/src/main/java/com/ld/igds/io/constant/ProtocolEnum.java index 92b8ef0..d951865 100644 --- a/igds-core/src/main/java/com/ld/igds/io/constant/ProtocolEnum.java +++ b/igds-core/src/main/java/com/ld/igds/io/constant/ProtocolEnum.java @@ -32,7 +32,8 @@ TCP_BHZH_VERB_V2("TCP_BHZH_VERB_V2", "閭︽捣鎺у埗鏌滄櫤鑳芥湁绾跨増V2"), TCP_BHZH_INOUT_V1("TCP_BHZH_INOUT_V1", "閭︽捣鏅鸿兘鍑哄叆搴撴帶鍒跺櫒鍗忚"), TCP_BEIBO_GRAIN_V1("TCP_BEIBO_GRAIN_V1", "璐濆崥绮儏鍒嗘満鏈嶅姟绔崗璁�"), - FZZY_OPENAPI_HTTP("FZZY_OPENAPI_HTTP", "椋庢鑷磋繙API-HTTP鍗忚"); + FZZY_OPENAPI_HTTP("FZZY_OPENAPI_HTTP", "椋庢鑷磋繙API-HTTP鍗忚"), + MODBUS_TCP("MODBUS_TCP", "Modbus-TCP鍗忚"); private String code; diff --git a/igds-core/src/main/java/com/ld/igds/models/Device.java b/igds-core/src/main/java/com/ld/igds/models/Device.java index c4c265e..f8ae9b6 100644 --- a/igds-core/src/main/java/com/ld/igds/models/Device.java +++ b/igds-core/src/main/java/com/ld/igds/models/Device.java @@ -66,6 +66,10 @@ @PropertyDef(label = "璁惧鍔熺巼", description = "璁惧鍔熺巼锛屾病鏈夊彲涓嶅~鍐�:KW/H") private Double power; + @Column(name = "MODBUS_",length = 100) + @PropertyDef(label = "Modbus閰嶇疆") + private String modbus; + @Column(name = "REMARK_", length = 250) @PropertyDef(label = "澶囨敞", description = "澶囨敞淇℃伅") private String remark; diff --git a/igds-core/src/main/java/com/ld/igds/view/Device.view.xml b/igds-core/src/main/java/com/ld/igds/view/Device.view.xml index 069c935..85ea20e 100644 --- a/igds-core/src/main/java/com/ld/igds/view/Device.view.xml +++ b/igds-core/src/main/java/com/ld/igds/view/Device.view.xml @@ -228,6 +228,18 @@ <Editor/> </AutoFormElement> <AutoFormElement layoutConstraint="colSpan:2"> + <Property name="name">modbus</Property> + <Property name="property">modbus</Property> + <Editor/> + </AutoFormElement> + <Label layoutConstraint="colSpan:2"> + <Property name="text">modbus瑙勫垯锛氬紑鍦板潃-鍏冲湴鍧�-鍋滃湴鍧�-寮�鍒颁綅-鍏冲埌浣�-寮�鏁呴殰-鍏虫晠闅滐紝鏃犲湴鍧�鐢∟浠f浛</Property> + <Property name="style"> + <Property name="padding-left">100px</Property> + <Property name="color">blue</Property> + </Property> + </Label> + <AutoFormElement layoutConstraint="colSpan:2"> <Property name="name">remark</Property> <Property name="property">remark</Property> <Property name="editorType">TextArea</Property> diff --git a/igds-core/src/main/java/com/ld/igds/view/service/HDicAreaService.java b/igds-core/src/main/java/com/ld/igds/view/service/HDicAreaService.java index dbfdeec..c289ec8 100644 --- a/igds-core/src/main/java/com/ld/igds/view/service/HDicAreaService.java +++ b/igds-core/src/main/java/com/ld/igds/view/service/HDicAreaService.java @@ -84,11 +84,8 @@ } public void pageList(Page<DicArea> page, String key) throws Exception { - String hql = " from " + DicArea.class.getName(); - Map<String, Object> args = new HashMap<>(); - List<DicArea> list; String countHql; if (StringUtils.isNotEmpty(key)) { hql += " where (name like :key1 or simple like:key2)"; diff --git a/igds-core/src/main/java/models/igds.model.xml b/igds-core/src/main/java/models/igds.model.xml index 28b1f92..3ac10d3 100644 --- a/igds-core/src/main/java/models/igds.model.xml +++ b/igds-core/src/main/java/models/igds.model.xml @@ -155,7 +155,7 @@ </Property> </PropertyDef> <PropertyDef name="ggm"> - <Property/> + <Property></Property> <Property name="label">鍥借鐮�</Property> </PropertyDef> </DataType> @@ -567,6 +567,26 @@ <Property></Property> <Property name="label">浣嶇疆</Property> </PropertyDef> + <PropertyDef name="modbus"> + <Property/> + <Property name="label">Modbus閰嶇疆</Property> + </PropertyDef> + <PropertyDef name="ext1"> + <Property/> + <Property name="label">鎵╁睍瀛楁1</Property> + </PropertyDef> + <PropertyDef name="ext2"> + <Property/> + <Property name="label">鎵╁睍瀛楁2</Property> + </PropertyDef> + <PropertyDef name="ext3"> + <Property/> + <Property name="label">鎵╁睍瀛楁3</Property> + </PropertyDef> + <PropertyDef name="statusName"> + <Property/> + <Property name="label">褰撳墠鐘舵��</Property> + </PropertyDef> </DataType> <DataType name="dtDeviceSer"> <Property name="creationType">com.ld.igds.models.DeviceSer</Property> diff --git a/igds-core/src/main/resources/mapper/DeviceMapper.xml b/igds-core/src/main/resources/mapper/DeviceMapper.xml index 8b1a57a..056e15d 100644 --- a/igds-core/src/main/resources/mapper/DeviceMapper.xml +++ b/igds-core/src/main/resources/mapper/DeviceMapper.xml @@ -17,6 +17,7 @@ g.LOCATION_ AS location, g.STATUS_ AS status, g.POWER_ AS power, + g.MODBUS_ AS modbus, g.LINK_ AS link, g.EXT1_ AS ext1, g.EXT2_ AS ext2, diff --git a/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusConfig.java b/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusConfig.java new file mode 100644 index 0000000..9d57d94 --- /dev/null +++ b/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusConfig.java @@ -0,0 +1,69 @@ +package com.ld.igds.protocol.modbus; + +import com.serotonin.modbus4j.ModbusFactory; +import com.serotonin.modbus4j.ModbusMaster; +import com.serotonin.modbus4j.exception.ModbusInitException; +import com.serotonin.modbus4j.ip.IpParameters; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +import java.util.HashMap; + +@Configuration +@Import(com.serotonin.modbus4j.ModbusFactory.class) +public class ModbusConfig { + + + @Bean + public HashMap<String, ModbusMaster> contextModbusMap() { + return new HashMap<>(); + } + + @Autowired + private ModbusFactory modbusFactory; + + @Autowired + @Qualifier("contextModbusMap") + private HashMap<String, ModbusMaster> masterMap; + + /** + * @Description: 閫氳繃ip鑾峰彇瀵瑰簲鐨刴odbus杩炴帴鍣� + */ + public ModbusMaster getMaster(String ip, int port) { + ModbusMaster modbusMaster = masterMap.get(ip); + if (modbusMaster == null || !modbusMaster.isConnected()) { + setMaster(ip, port); + modbusMaster = masterMap.get(ip); + } + return modbusMaster; + + + } + + /** + * @Description: 璁剧疆ip瀵瑰簲鐨刴odbus杩炴帴鍣� + */ + private void setMaster(String ip, Integer port) { + ModbusMaster master; + IpParameters params = new IpParameters(); + params.setHost(ip); + params.setPort(port); + //璁剧疆涓簍rue锛屼細瀵艰嚧TimeoutException: request=com.serotonin.modbus4j.ip.encap.EncapMessageRequest@774dfba5", + //params.setEncapsulated(true); + master = modbusFactory.createTcpMaster(params, true);// TCP 鍗忚 + try { + //璁剧疆瓒呮椂鏃堕棿 + master.setTimeout(3 * 1000); + //璁剧疆閲嶈繛娆℃暟 + master.setRetries(3); + //鍒濆鍖� + master.init(); + } catch (ModbusInitException e) { + e.printStackTrace(); + } + masterMap.put(ip, master); + } +} \ No newline at end of file diff --git a/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusUtil.java b/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusUtil.java new file mode 100644 index 0000000..ae245da --- /dev/null +++ b/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/ModbusUtil.java @@ -0,0 +1,186 @@ +package com.ld.igds.protocol.modbus; + +import com.serotonin.modbus4j.ModbusMaster; +import com.serotonin.modbus4j.exception.ModbusInitException; +import com.serotonin.modbus4j.exception.ModbusTransportException; +import com.serotonin.modbus4j.msg.ReadCoilsRequest; +import com.serotonin.modbus4j.msg.ReadCoilsResponse; +import com.serotonin.modbus4j.msg.ReadDiscreteInputsRequest; +import com.serotonin.modbus4j.msg.ReadDiscreteInputsResponse; +import com.serotonin.modbus4j.msg.ReadHoldingRegistersRequest; +import com.serotonin.modbus4j.msg.ReadHoldingRegistersResponse; +import com.serotonin.modbus4j.msg.ReadInputRegistersRequest; +import com.serotonin.modbus4j.msg.ReadInputRegistersResponse; +import com.serotonin.modbus4j.msg.WriteCoilRequest; +import com.serotonin.modbus4j.msg.WriteCoilResponse; +import com.serotonin.modbus4j.msg.WriteCoilsRequest; +import com.serotonin.modbus4j.msg.WriteCoilsResponse; +import com.serotonin.modbus4j.msg.WriteRegisterRequest; +import com.serotonin.modbus4j.msg.WriteRegisterResponse; +import com.serotonin.modbus4j.msg.WriteRegistersRequest; +import com.serotonin.modbus4j.msg.WriteRegistersResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * @Desc: 宸ュ叿绫� + * @author: Andy + * @update-time: 2023/8/11 + */ +@Component +public class ModbusUtil { + + //浠庢満榛樿鍊� + private Integer slaveId = 1; + + @Autowired + private ModbusConfig modbusConfig; + + + public boolean[] readCoilStatus(String ip, int port, int offset, int numberOfRegister) throws ModbusTransportException { + + ModbusMaster master = modbusConfig.getMaster(ip, port); + ReadCoilsRequest request = new ReadCoilsRequest(slaveId, offset, numberOfRegister); + ReadCoilsResponse response = (ReadCoilsResponse) master.send(request); + boolean[] booleans = response.getBooleanData(); + + return valueRegroup(numberOfRegister, booleans); + } + + /** + * @Description: 璇诲彇澶栧洿璁惧杈撳叆鐨勫紑鍏抽噺锛岀浉褰撲簬鍔熻兘鐮侊細02H-璇荤鏁h緭鍏ョ姸鎬� + * @Param: [ip, offset, numberOfRegister] + * @return: boolean[] + * @throws: + * @Author: Ricardo.Liu + * @Date: 2020/5/8 + */ + public boolean[] readInputStatus(String ip, int port, int offset, int numberOfRegister) throws ModbusTransportException { + + ModbusMaster master = modbusConfig.getMaster(ip, port); + ReadDiscreteInputsRequest request = new ReadDiscreteInputsRequest(slaveId, offset, numberOfRegister); + ReadDiscreteInputsResponse response = (ReadDiscreteInputsResponse) master.send(request); + boolean[] booleans = response.getBooleanData(); + + return valueRegroup(numberOfRegister, booleans); + } + + /** + * @Description: 璇诲彇淇濇寔瀵勫瓨鍣ㄦ暟鎹紝鐩稿綋浜庡姛鑳界爜锛�03H-璇讳繚鎸佸瘎瀛樺櫒 + * @Param: [ip, offset, numberOfRegister] + * @return: short[] + * @throws: + * @Author: Ricardo.Liu + * @Date: 2020/5/8 + */ + public short[] readHoldingRegister(String ip, int port, int offset, int numberOfRegister) throws ModbusTransportException { + + ModbusMaster master = modbusConfig.getMaster(ip, port); + ReadHoldingRegistersRequest request = new ReadHoldingRegistersRequest(slaveId, offset, numberOfRegister); + ReadHoldingRegistersResponse response = (ReadHoldingRegistersResponse) master.send(request); + return response.getShortData(); + } + + /** + * @Description: 璇诲彇澶栧洿璁惧杈撳叆鐨勬暟鎹紝鐩稿綋浜庡姛鑳界爜锛�04H-璇昏緭鍏ュ瘎瀛樺櫒 + * @Param: [ip, offset, numberOfRegister] + * @return: short[] + * @throws: + * @Author: Ricardo.Liu + * @Date: 2020/5/8 + */ + public short[] readInputRegisters(String ip, int port, int offset, int numberOfRegister) throws ModbusTransportException { + + ModbusMaster master = modbusConfig.getMaster(ip, port); + ReadInputRegistersRequest request = new ReadInputRegistersRequest(slaveId, offset, numberOfRegister); + ReadInputRegistersResponse response = (ReadInputRegistersResponse) master.send(request); + return response.getShortData(); + } + + /** + * @Description: 鍐欏崟涓紙绾垮湀锛夊紑鍏抽噺鏁版嵁锛岀浉褰撲簬鍔熻兘鐮侊細05H-鍐欏崟涓嚎鍦� + * @Param: [ip, writeOffset, writeValue] + * @return: boolean + * @throws: + * @Author: Ricardo.Liu + * @Date: 2020/5/8 + */ + public boolean writeCoil(String ip, int port, int writeOffset, boolean writeValue) throws ModbusTransportException { + + ModbusMaster tcpMaster = modbusConfig.getMaster(ip, port); + WriteCoilRequest request = new WriteCoilRequest(slaveId, writeOffset, writeValue); + WriteCoilResponse response = (WriteCoilResponse) tcpMaster.send(request); + return !response.isException(); + } + + /** + * @Description: 鍐欏涓紑鍏抽噺鏁版嵁锛堢嚎鍦堬級锛岀浉褰撲簬鍔熻兘鐮侊細0FH-鍐欏涓嚎鍦� + * @Param: [ip, startOffset, data] + * @return: boolean + * @throws: + * @Author: Ricardo.Liu + * @Date: 2020/5/8 + */ + public boolean writeCoils(String ip, int port, int startOffset, boolean[] data) throws ModbusTransportException { + + ModbusMaster tcpMaster = modbusConfig.getMaster(ip, port); + WriteCoilsRequest request = new WriteCoilsRequest(slaveId, startOffset, data); + WriteCoilsResponse response = (WriteCoilsResponse) tcpMaster.send(request); + return !response.isException(); + + } + + /** + * @Description: 鍐欏崟涓繚鎸佸瘎瀛樺櫒锛岀浉褰撲簬鍔熻兘鐮侊細06H-鍐欏崟涓繚鎸佸瘎瀛樺櫒 + * @Param: [ip, writeOffset, writeValue] + * @return: boolean + * @throws: + * @Author: Ricardo.Liu + * @Date: 2020/5/8 + */ + public boolean writeHoldingRegister(String ip, int port,int writeOffset, short writeValue) throws ModbusTransportException, ModbusInitException { + + ModbusMaster tcpMaster = modbusConfig.getMaster(ip, port); + WriteRegisterRequest request = new WriteRegisterRequest(slaveId, writeOffset, writeValue); + WriteRegisterResponse response = (WriteRegisterResponse) tcpMaster.send(request); + return !response.isException(); + + } + + /** + * @Description: 鍐欏涓繚鎸佸瘎瀛樺櫒锛岀浉褰撲簬鍔熻兘鐮侊細10H-鍐欏涓繚鎸佸瘎瀛樺櫒 + * @Param: [ip, startOffset, data] + * @return: boolean + * @throws: + * @Author: Ricardo.Liu + * @Date: 2020/5/8 + */ + public boolean writeHoldingRegisters(String ip,int port, int startOffset, short[] data) throws ModbusTransportException, ModbusInitException { + + ModbusMaster tcpMaster = modbusConfig.getMaster(ip, port); + WriteRegistersRequest request = new WriteRegistersRequest(slaveId, startOffset, data); + WriteRegistersResponse response = (WriteRegistersResponse) tcpMaster.send(request); + return !response.isException(); + } + + /** + * @Description: 杞崲宸ュ叿锛屽皢Boolean杞崲鎴�0锛�1 + * @Param: [numberOfBits, values] + * @return: boolean[] + * @throws: + * @Author: Ricardo.Liu + * @Date: 2020/5/8 + */ + private boolean[] valueRegroup(int numberOfBits, boolean[] values) { + boolean[] bs = new boolean[numberOfBits]; + int temp = 1; + for (boolean b : values) { + bs[temp - 1] = b; + temp++; + if (temp > numberOfBits) { + break; + } + } + return bs; + } +} \ No newline at end of file diff --git a/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteControlServiceImpl.java b/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteControlServiceImpl.java index c00c5cc..601e72a 100644 --- a/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteControlServiceImpl.java +++ b/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/command/RemoteControlServiceImpl.java @@ -1,12 +1,23 @@ package com.ld.igds.protocol.modbus.command; +import com.ld.igds.common.CoreDeviceService; +import com.ld.igds.constant.Constant; import com.ld.igds.io.RemoteControlService; +import com.ld.igds.io.constant.OrderRespEnum; +import com.ld.igds.io.constant.ProtocolEnum; import com.ld.igds.io.request.DeviceAutoControlRequest; import com.ld.igds.io.request.DeviceControlRequest; +import com.ld.igds.io.request.ExeDevice; import com.ld.igds.io.request.TempControlRequest; import com.ld.igds.io.response.DeviceControlResponse; +import com.ld.igds.models.Device; +import com.ld.igds.protocol.modbus.ModbusUtil; +import com.ld.igds.protocol.modbus.data.ModbusTcp; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.List; /** * 褰撳墠鍗忚閽堝鏍囧噯Modbus-TCP鍗忚 @@ -21,15 +32,75 @@ public static final String BEAN_ID = "modbus.remoteControlService"; + @Resource + private CoreDeviceService deviceService; + @Resource + private ModbusUtil modbusUtil; + @Override public String getProtocol() { - return null; + return ProtocolEnum.MODBUS_TCP.getCode(); } @Override public DeviceControlResponse deviceControl(DeviceControlRequest request) { - return null; + List<ExeDevice> deviceList = request.getDeviceList(); + + if (null == deviceList || deviceList.isEmpty()) { + return new DeviceControlResponse(OrderRespEnum.ORDER_ERROR.getCode(), "娌℃湁闇�瑕佹墽琛岀殑璁惧"); + } + + + try { + + + Device device; + ModbusTcp modbusTcp; + String[] addr; + String temp; + for (ExeDevice exeDevice : deviceList) { + device = deviceService.getCacheDeviceById(exeDevice.getCompanyId(), exeDevice.getId()); + + if (null == device) continue; + + if (null == device.getModbus()) continue; + + modbusTcp = new ModbusTcp(); + modbusTcp.setIp(request.getIp()); + modbusTcp.setPort(request.getPort()); + modbusTcp.setDeviceId(device.getId()); + modbusTcp.setSerId(request.getSerId()); + + //modbus瑙勫垯锛氬紑鍦板潃-鍏冲湴鍧�-鍋滃湴鍧�-寮�鍒颁綅-鍏冲埌浣�-寮�鏁呴殰-鍏虫晠闅滐紝鏃犲湴鍧�鐢∟浠f浛 + addr = device.getModbus().split("-"); + temp = addr[0]; + if (!Constant.YN_N.equals(temp)) modbusTcp.setAddrOpen(Integer.valueOf(temp)); + temp = addr[1]; + if (!Constant.YN_N.equals(temp)) modbusTcp.setAddrClose(Integer.valueOf(temp)); + temp = addr[2]; + if (!Constant.YN_N.equals(temp)) modbusTcp.setAddrStop(Integer.valueOf(temp)); + temp = addr[3]; + if (!Constant.YN_N.equals(temp)) modbusTcp.setAddrOpenEnd(Integer.valueOf(temp)); + temp = addr[4]; + if (!Constant.YN_N.equals(temp)) modbusTcp.setAddrCloseEnd(Integer.valueOf(temp)); + temp = addr[5]; + if (!Constant.YN_N.equals(temp)) modbusTcp.setAddrOpenError(Integer.valueOf(temp)); + temp = addr[6]; + if (!Constant.YN_N.equals(temp)) modbusTcp.setAddrCloseError(Integer.valueOf(temp)); + + + //鏍规嵁璁惧鐩爣鐘舵�侊紝璋冪敤MODBUS鎵ц + modbusUtil.writeCoil(modbusTcp.getIp(), modbusTcp.getPort(), modbusTcp.getAddrOpen(), true); + + + } + } catch (Exception e) { + + } + + return new DeviceControlResponse(OrderRespEnum.ORDER_SUCCESS); } + @Override public DeviceControlResponse closeAll(DeviceControlRequest request) { @@ -48,11 +119,14 @@ @Override public DeviceControlResponse airAutoControl(DeviceAutoControlRequest request) { + + return null; } @Override public DeviceControlResponse n2AutoControl(DeviceAutoControlRequest request) { + return null; } } diff --git a/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/data/ModbusTcp.java b/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/data/ModbusTcp.java new file mode 100644 index 0000000..6b1ddb0 --- /dev/null +++ b/igds-protocol-modbus/src/main/java/com/ld/igds/protocol/modbus/data/ModbusTcp.java @@ -0,0 +1,35 @@ +package com.ld.igds.protocol.modbus.data; + +import lombok.Data; + +/** + * @Desc: 鐢ㄤ簬灏佽ModBUsTCP鐨勪俊鎭� + * @author: andy.jia + * @update-time: 2023/8/12 15:29 + */ +@Data +public class ModbusTcp { + + private String deviceId; + + private String serId; + + private String ip; + + private int port; + + private int addrOpen; + + private int addrClose; + + private int addrStop; + + private int addrOpenEnd; + + private int addrCloseEnd; + + private int addrOpenError; + + private int addrCloseError; + +} -- Gitblit v1.9.3