jar包版本
modbus4j-3.0.6.jar
示例代码
// 入库
@SneakyThrows
private List<ElecDataVal> work(){
List<ElecDataVal> elecDataVals = new ArrayList<>();
Map<String, List<MPoint>> pMap = pointList.stream().collect(Collectors.groupingBy(MPoint::getSys));
for (Map.Entry<String, List<MPoint>> entry : pMap.entrySet()) {
String ip = ipMap.get(entry.getKey());
initDevice(ip, port);
master.init();
elecDataVals.addAll(readValues(entry.getValue()));
}
Date nowTime = new Date();
for (ElecDataVal elecDataVal : elecDataVals) {
elecDataVal.setTime(nowTime);
}
return elecDataVals;
}
// 初始化本地设备
public void initDevice(String ip, int port){
ipParameters = new IpParameters();
ipParameters.setHost(ip);
ipParameters.setPort(port);
ipParameters.setEncapsulated(false);
modbusFactory = new ModbusFactory();
master = modbusFactory.createTcpMaster(ipParameters, false);
master.setTimeout(TIMEOUT);
master.setRetries(RETRY);
log.info("Modbus Factory init:host:{},port:{}",ip,port);
}
// 批量读取数据库中存储的设备信息,并使用modbusMaster 进行本地读取
public List<ElecDataVal> readValues(List<MPoint> pointList) throws ErrorResponseException, ModbusTransportException {
List<ElecDataVal> elecDataVals = new ArrayList<>(pointList.size());
BatchRead<String> batchRead = new BatchRead<String>();
for(MPoint point : pointList) {
int id = point.getRegAddress();
int mode = point.getPointType();
batchRead.addLocator(point.getId(), BaseLocator.holdingRegister(deviceId, id, mode));
}
// 批量读取数据
BatchResults<String> res = master.send(batchRead);
log.debug("Modbus batch:{}",elecDataVals);
if(res!=null) {
for(MPoint point:pointList) {
String key = point.getId();
String value = String.valueOf(res.getValue(key));
double v = Double.valueOf(value);
if(point.getSelfGain()!=0){
v = v/point.getSelfGain();
}
ElecDataVal elecDataVal = new ElecDataVal();
elecDataVal.setId(String.valueOf(snowflakeGenerator.next()));
elecDataVal.setName(point.getName());
elecDataVal.setVal(v);
elecDataVals.add(elecDataVal);
}
}
return elecDataVals;
}