|
@@ -1,7 +1,6 @@
|
|
package wei.yigulu.modbus.utils;
|
|
package wei.yigulu.modbus.utils;
|
|
|
|
|
|
import com.google.common.primitives.Bytes;
|
|
import com.google.common.primitives.Bytes;
|
|
-import io.netty.buffer.Unpooled;
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import wei.yigulu.modbus.domain.FunctionCode;
|
|
import wei.yigulu.modbus.domain.FunctionCode;
|
|
import wei.yigulu.modbus.domain.command.AbstractModbusCommand;
|
|
import wei.yigulu.modbus.domain.command.AbstractModbusCommand;
|
|
@@ -17,7 +16,6 @@ import wei.yigulu.modbus.netty.ModbusMasterBuilderInterface;
|
|
import wei.yigulu.modbus.netty.ModbusRtuMasterBuilder;
|
|
import wei.yigulu.modbus.netty.ModbusRtuMasterBuilder;
|
|
import wei.yigulu.netty.AbstractMasterBuilder;
|
|
import wei.yigulu.netty.AbstractMasterBuilder;
|
|
import wei.yigulu.netty.AbstractTcpMasterBuilder;
|
|
import wei.yigulu.netty.AbstractTcpMasterBuilder;
|
|
-import wei.yigulu.utils.DataConvertor;
|
|
|
|
|
|
|
|
import java.nio.ByteBuffer;
|
|
import java.nio.ByteBuffer;
|
|
import java.util.ArrayList;
|
|
import java.util.ArrayList;
|
|
@@ -48,38 +46,39 @@ public class ModbusCommandDataUtils {
|
|
AbstractModbusCommand modbusCommand;
|
|
AbstractModbusCommand modbusCommand;
|
|
ByteBuffer buffer;
|
|
ByteBuffer buffer;
|
|
AbstractModbusConfirm confirm;
|
|
AbstractModbusConfirm confirm;
|
|
- try{
|
|
|
|
- if (masterBuilder instanceof ModbusRtuMasterBuilder) {
|
|
|
|
- modbusCommand = new RtuModbusCommand();
|
|
|
|
- modbusCommand.setSlaveId(slaveId).setRegisters(address, values);
|
|
|
|
- modbusCommand.encode(bs);
|
|
|
|
- masterBuilder.sendFrameToOpposite(Bytes.toArray(bs));
|
|
|
|
- buffer = ((ModbusMasterBuilderInterface) masterBuilder).getOrCreateSynchronousWaitingRoom().getData(0);
|
|
|
|
- confirm = new RtuModbusConfirm().decode(buffer);
|
|
|
|
- } else {
|
|
|
|
- modbusCommand= new TcpModbusCommand();
|
|
|
|
- ((TcpModbusCommand)modbusCommand).setTransactionIdentifier(TransactionIdentifier.getInstance((AbstractTcpMasterBuilder) masterBuilder));
|
|
|
|
- modbusCommand.setSlaveId(slaveId).setRegisters(address, values);
|
|
|
|
- modbusCommand.encode(bs);
|
|
|
|
- masterBuilder.sendFrameToOpposite(Bytes.toArray(bs));
|
|
|
|
- buffer = ((ModbusMasterBuilderInterface) masterBuilder).getOrCreateSynchronousWaitingRoom().getData(((TcpModbusCommand)modbusCommand).getTcpExtraCode().getTransactionIdentifier().getSeq());
|
|
|
|
- confirm = new TcpModbusConfirm().decode(buffer);
|
|
|
|
- }}catch (ModbusException e){
|
|
|
|
- log.error("控制命令执行失败:"+e.getMsg());
|
|
|
|
|
|
+ try {
|
|
|
|
+ if (masterBuilder instanceof ModbusRtuMasterBuilder) {
|
|
|
|
+ modbusCommand = new RtuModbusCommand();
|
|
|
|
+ modbusCommand.setSlaveId(slaveId).setRegisters(address, values);
|
|
|
|
+ modbusCommand.encode(bs);
|
|
|
|
+ masterBuilder.sendFrameToOpposite(Bytes.toArray(bs));
|
|
|
|
+ buffer = ((ModbusMasterBuilderInterface) masterBuilder).getOrCreateSynchronousWaitingRoom().getData(0);
|
|
|
|
+ confirm = new RtuModbusConfirm().decode(buffer);
|
|
|
|
+ } else {
|
|
|
|
+ modbusCommand = new TcpModbusCommand();
|
|
|
|
+ ((TcpModbusCommand) modbusCommand).setTransactionIdentifier(TransactionIdentifier.getInstance((AbstractTcpMasterBuilder) masterBuilder));
|
|
|
|
+ modbusCommand.setSlaveId(slaveId).setRegisters(address, values);
|
|
|
|
+ modbusCommand.encode(bs);
|
|
|
|
+ masterBuilder.sendFrameToOpposite(Bytes.toArray(bs));
|
|
|
|
+ buffer = ((ModbusMasterBuilderInterface) masterBuilder).getOrCreateSynchronousWaitingRoom().getData(((TcpModbusCommand) modbusCommand).getTcpExtraCode().getTransactionIdentifier().getSeq());
|
|
|
|
+ confirm = new TcpModbusConfirm().decode(buffer);
|
|
|
|
+ }
|
|
|
|
+ } catch (ModbusException e) {
|
|
|
|
+ log.error("控制命令执行失败:" + e.getMsg());
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
- if(address.equals(confirm.getStartAddress())){
|
|
|
|
- if(confirm.getFunctionCode()==modbusCommand.getFunctionCode()){
|
|
|
|
- if(confirm.getFunctionCode()== FunctionCode.WRITE_COIL ||confirm.getFunctionCode()== FunctionCode.WRITE_REGISTER ){
|
|
|
|
- if(Bytes.indexOf(confirm.getB2(),modbusCommand.getDataBytes())==0){
|
|
|
|
|
|
+ if (address.equals(confirm.getStartAddress())) {
|
|
|
|
+ if (confirm.getFunctionCode() == modbusCommand.getFunctionCode()) {
|
|
|
|
+ if (confirm.getFunctionCode() == FunctionCode.WRITE_COIL || confirm.getFunctionCode() == FunctionCode.WRITE_REGISTER) {
|
|
|
|
+ if (Bytes.indexOf(confirm.getB2(), modbusCommand.getDataBytes()) == 0) {
|
|
return true;
|
|
return true;
|
|
- }else{
|
|
|
|
|
|
+ } else {
|
|
log.warn("返回的确认值和输出值不同");
|
|
log.warn("返回的确认值和输出值不同");
|
|
}
|
|
}
|
|
- }else{
|
|
|
|
- if (confirm.getQuantity().equals(modbusCommand.getQuantity())){
|
|
|
|
|
|
+ } else {
|
|
|
|
+ if (confirm.getQuantity().equals(modbusCommand.getQuantity())) {
|
|
return true;
|
|
return true;
|
|
- }else{
|
|
|
|
|
|
+ } else {
|
|
log.warn("返回的值数量和输出数量不同");
|
|
log.warn("返回的值数量和输出数量不同");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -87,4 +86,18 @@ public class ModbusCommandDataUtils {
|
|
}
|
|
}
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 下达寄存器控制命令
|
|
|
|
+ *
|
|
|
|
+ * @param masterBuilder 主站对象
|
|
|
|
+ * @param address 起始地址
|
|
|
|
+ * @param value 命令值
|
|
|
|
+ */
|
|
|
|
+ public static boolean commandRegister(AbstractMasterBuilder masterBuilder, Integer slaveId, Integer address, RegisterValue value) throws ModbusException {
|
|
|
|
+ List<RegisterValue> list = new ArrayList<>();
|
|
|
|
+ list.add(value);
|
|
|
|
+ return commandRegister(masterBuilder, slaveId, address, list);
|
|
|
|
+ }
|
|
}
|
|
}
|