diff --git a/src/com/szpg/plc/message/AppMessageConstants.java b/src/com/szpg/plc/message/AppMessageConstants.java index 4fdb21c..79b9217 100644 --- a/src/com/szpg/plc/message/AppMessageConstants.java +++ b/src/com/szpg/plc/message/AppMessageConstants.java @@ -33,8 +33,11 @@ public final static String CMD_TYPE_SETZMOFF = "51"; // 设置照明停止位命令 public final static String CMD_TYPE_SETFJON = "52"; // 设置风机启动位命令 public final static String CMD_TYPE_SETFJOFF = "53"; // 设置风机停止位命令 - public final static String CMD_TYPE_SETJGUNLOCK = "54"; // 设置井盖锁定位 + public final static String CMD_TYPE_SETJGUNLOCK = "54"; // 设置井盖锁定位 锁定 public final static String CMD_TYPE_SETDSRESET = "55"; // 清除对射报警 + public final static String CMD_TYPE_SETJGON = "56"; // 设置井盖开启 + public final static String CMD_TYPE_SETJGOFF = "57"; // 设置井盖关闭 + public final static String CMD_TYPE_SETJGLOCK = "58"; // 设置井盖锁定位 解锁 public final static String CMD_TYPE_SETCH4THRESHOLD = "60"; // 设置甲烷浓度报警阈值 public final static String CMD_TYPE_SETHSTHRESHOLD = "61"; // 设置硫化氢浓度报警阈值 diff --git a/src/com/szpg/plc/message/AppMessageConstants.java b/src/com/szpg/plc/message/AppMessageConstants.java index 4fdb21c..79b9217 100644 --- a/src/com/szpg/plc/message/AppMessageConstants.java +++ b/src/com/szpg/plc/message/AppMessageConstants.java @@ -33,8 +33,11 @@ public final static String CMD_TYPE_SETZMOFF = "51"; // 设置照明停止位命令 public final static String CMD_TYPE_SETFJON = "52"; // 设置风机启动位命令 public final static String CMD_TYPE_SETFJOFF = "53"; // 设置风机停止位命令 - public final static String CMD_TYPE_SETJGUNLOCK = "54"; // 设置井盖锁定位 + public final static String CMD_TYPE_SETJGUNLOCK = "54"; // 设置井盖锁定位 锁定 public final static String CMD_TYPE_SETDSRESET = "55"; // 清除对射报警 + public final static String CMD_TYPE_SETJGON = "56"; // 设置井盖开启 + public final static String CMD_TYPE_SETJGOFF = "57"; // 设置井盖关闭 + public final static String CMD_TYPE_SETJGLOCK = "58"; // 设置井盖锁定位 解锁 public final static String CMD_TYPE_SETCH4THRESHOLD = "60"; // 设置甲烷浓度报警阈值 public final static String CMD_TYPE_SETHSTHRESHOLD = "61"; // 设置硫化氢浓度报警阈值 diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index 04c888b..0ccd5bf 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -10,9 +10,11 @@ import com.szpg.plc.message.command.LinkCommand; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.command.write.SetJgUnlockBitCommand; import com.szpg.plc.message.response.LinkCommandResponse; import com.szpg.plc.message.response.WriteMemoryCommandResponse; import com.szpg.plc.message.response.read.*; +import com.szpg.plc.message.response.write.*; import com.szpg.plc.protocol.DTProtocolInterface; import com.szpg.plc.protocol.fins.frame.FINSByteFrame; import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; @@ -76,7 +78,7 @@ /** * 将字节数组解析为收到的消息对象 * - * @param byte[] byteMessage + * @param byteMessage * @return RecievedMessage */ public AppMessage bytesToMessage(byte[] byteMessage) { @@ -182,27 +184,34 @@ break; } } else if (commandCode.equalsIgnoreCase("0102")) { - WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); - - // 写内存命令响应 - byte[] body = finsFrame.TEXT_DATA_BODY; - wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - - if (body.length == 4) { - if (body[2] == 0x00 && body[3] == 0x00) { - // 写入成功 - wmcr.setSuccess(true); - } else { - wmcr.setSuccess(false); - } - wmcr.setValid(true); - } else { - wmcr.setValid(false); + switch (commandType) { + case AppMessageConstants.CMD_TYPE_SETJGON: + received = bytesToOpenJGCommandResponse(finsFrame); + break; + case AppMessageConstants.CMD_TYPE_SETJGOFF: + received = bytesToCloseJGCommandResponse(finsFrame); + break; + case AppMessageConstants.CMD_TYPE_SETJGUNLOCK: + received = bytesToUnlockJGCommandResponse(finsFrame); + break; + case AppMessageConstants.CMD_TYPE_SETJGLOCK: + received = bytesToLockJGCommandResponse(finsFrame); + break; + + case AppMessageConstants.CMD_TYPE_SETZMON: + received = bytesToTurnOnZmCommandResponse(finsFrame); + break; + case AppMessageConstants.CMD_TYPE_SETZMOFF: + received = bytesToTurnOffZmCommandResponse(finsFrame); + break; + + default: + received = bytesToDefaultWriteMemoryCommandResponse(finsFrame); + ((WriteMemoryCommandResponse) received).setCommandType(commandType); + break; } - - wmcr.setCommandType(commandType); - - received = wmcr; + + } } else { received = new UnKnownMessage(byteMessage); @@ -217,7 +226,7 @@ /** * 将握手响应字节数组转换为消息对象 * - * @param byteMessage + * @param finsFrame * @return */ private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { @@ -232,7 +241,7 @@ /** * 将查询甲烷参数响应消息字节数组转换为消息对象 * - * @param byteMessage + * @param finsFrame * @return */ private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame) { @@ -256,7 +265,7 @@ /** * 将查询甲烷报警状态响应消息字节数组转换为消息对象 * - * @param byteMessage + * @param finsFrame * @return */ private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame) { @@ -317,7 +326,7 @@ /** * 将查询一氧化碳参数响应消息字节数组转换为消息对象 * - * @param byteMessage + * @param finsFrame * @return */ private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame) { @@ -339,7 +348,7 @@ /** * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 * - * @param byteMessage + * @param finsFrame * @return */ private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame) { @@ -361,7 +370,7 @@ /** * 将查询氧气参数响应消息字节数组转换为消息对象 * - * @param byteMessage + * @param finsFrame * @return */ private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame) { @@ -383,7 +392,7 @@ /** * 将查询氧气报警状态响应消息字节数组转换为消息对象 * - * @param byteMessage + * @param finsFrame * @return */ private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame) { @@ -405,7 +414,7 @@ /** * 将查询硫化氢参数响应消息字节数组转换为消息对象 * - * @param byteMessage + * @param finsFrame * @return */ private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame) { @@ -427,7 +436,7 @@ /** * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 * - * @param byteMessage + * @param finsFrame * @return */ private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame) { @@ -448,7 +457,7 @@ /** * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 * - * @param byteMessage + * @param finsFrame * @return */ private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame) { @@ -469,7 +478,7 @@ /** * 将查询对射报警状态响应消息字节数组转换为消息对象 * - * @param byteMessage + * @param finsFrame * @return */ private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame) { @@ -491,7 +500,7 @@ /** * 将查询风机运行状态响应消息字节数组转换为消息对象 * - * @param byteMessage + * @param finsFrame * @return */ private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame) { @@ -535,7 +544,7 @@ /** * 将查询水泵运行状态响应消息字节数组转换为消息对象 * - * @param byteMessage + * @param finsFrame * @return */ private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame) { @@ -579,7 +588,7 @@ /** * 将查询照明运行状态响应消息字节数组转换为消息对象 * - * @param byteMessage + * @param finsFrame * @return */ private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame) { @@ -623,7 +632,7 @@ /** * 将查询井盖状态响应消息字节数组转换为消息对象 * - * @param byteMessage + * @param finsFrame * @return */ private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame) { @@ -683,12 +692,217 @@ return rwvcr; } + + /** + * 将默认写内存指令响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToDefaultWriteMemoryCommandResponse(FINSByteFrame finsFrame) { + WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); + + // 写内存命令响应 + byte[] body = finsFrame.TEXT_DATA_BODY; + wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + + if (body.length == 4) { + if (body[2] == 0x00 && body[3] == 0x00) { + // 写入成功 + wmcr.setSuccess(true); + } else { + wmcr.setSuccess(false); + } + wmcr.setValid(true); + } else { + wmcr.setValid(false); + } + + return wmcr; + } + + /** + * 将打开井盖指令响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToOpenJGCommandResponse(FINSByteFrame finsFrame) { + SetJgOnBitCommandResponse sjcr = new SetJgOnBitCommandResponse(); + sjcr.setCommandType(AppMessageConstants.CMD_TYPE_SETJGON); + + // 写内存命令响应 + byte[] body = finsFrame.TEXT_DATA_BODY; + sjcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + + if (body.length == 4) { + if (body[2] == 0x00 && body[3] == 0x00) { + // 写入成功 + sjcr.setSuccess(true); + } else { + sjcr.setSuccess(false); + } + sjcr.setValid(true); + } else { + sjcr.setValid(false); + } + + return sjcr; + } + + + /** + * 将关闭井盖指令响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToCloseJGCommandResponse(FINSByteFrame finsFrame) { + SetJgOffBitCommandResponse sjcr = new SetJgOffBitCommandResponse(); + sjcr.setCommandType(AppMessageConstants.CMD_TYPE_SETJGOFF); + + // 写内存命令响应 + byte[] body = finsFrame.TEXT_DATA_BODY; + sjcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + + if (body.length == 4) { + if (body[2] == 0x00 && body[3] == 0x00) { + // 写入成功 + sjcr.setSuccess(true); + } else { + sjcr.setSuccess(false); + } + sjcr.setValid(true); + } else { + sjcr.setValid(false); + } + + return sjcr; + } + + /** + * 将解锁井盖指令响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToUnlockJGCommandResponse(FINSByteFrame finsFrame) { + SetJgUnlockBitCommandResponse sjcr = new SetJgUnlockBitCommandResponse(); + sjcr.setCommandType(AppMessageConstants.CMD_TYPE_SETJGUNLOCK); + + // 写内存命令响应 + byte[] body = finsFrame.TEXT_DATA_BODY; + sjcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + + if (body.length == 4) { + if (body[2] == 0x00 && body[3] == 0x00) { + // 写入成功 + sjcr.setSuccess(true); + } else { + sjcr.setSuccess(false); + } + sjcr.setValid(true); + } else { + sjcr.setValid(false); + } + + return sjcr; + } + + + /** + * 将锁定井盖指令响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToLockJGCommandResponse(FINSByteFrame finsFrame) { + SetJgLockBitCommandResponse sjcr = new SetJgLockBitCommandResponse(); + sjcr.setCommandType(AppMessageConstants.CMD_TYPE_SETJGLOCK); + + // 写内存命令响应 + byte[] body = finsFrame.TEXT_DATA_BODY; + sjcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + + if (body.length == 4) { + if (body[2] == 0x00 && body[3] == 0x00) { + // 写入成功 + sjcr.setSuccess(true); + } else { + sjcr.setSuccess(false); + } + sjcr.setValid(true); + } else { + sjcr.setValid(false); + } + + return sjcr; + } + + /** + * 将打开照明指令响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToTurnOnZmCommandResponse(FINSByteFrame finsFrame) { + SetZmOnBitCommandResponse sjcr = new SetZmOnBitCommandResponse(); + sjcr.setCommandType(AppMessageConstants.CMD_TYPE_SETZMON); + + // 写内存命令响应 + byte[] body = finsFrame.TEXT_DATA_BODY; + sjcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + + if (body.length == 4) { + if (body[2] == 0x00 && body[3] == 0x00) { + // 写入成功 + sjcr.setSuccess(true); + } else { + sjcr.setSuccess(false); + } + sjcr.setValid(true); + } else { + sjcr.setValid(false); + } + + return sjcr; + } + + + /** + * 将关闭照明指令响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToTurnOffZmCommandResponse(FINSByteFrame finsFrame) { + SetZmOffBitCommandResponse sjcr = new SetZmOffBitCommandResponse(); + sjcr.setCommandType(AppMessageConstants.CMD_TYPE_SETZMOFF); + + // 写内存命令响应 + byte[] body = finsFrame.TEXT_DATA_BODY; + sjcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + + if (body.length == 4) { + if (body[2] == 0x00 && body[3] == 0x00) { + // 写入成功 + sjcr.setSuccess(true); + } else { + sjcr.setSuccess(false); + } + sjcr.setValid(true); + } else { + sjcr.setValid(false); + } + + return sjcr; + } /** * 将消息对象解析为字节数组 * - * @param SentMessage message + * @param message * @return byte[] */ public byte[] messageToBytes(AppMessage message) { @@ -717,8 +931,8 @@ /** * 将握手命令转换为字节数组 * - * @param hmr - * @return + * @param link + * @return byte[] */ private byte[] LinkCommandToBytes(LinkCommand link) { FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); diff --git a/src/com/szpg/plc/message/AppMessageConstants.java b/src/com/szpg/plc/message/AppMessageConstants.java index 4fdb21c..79b9217 100644 --- a/src/com/szpg/plc/message/AppMessageConstants.java +++ b/src/com/szpg/plc/message/AppMessageConstants.java @@ -33,8 +33,11 @@ public final static String CMD_TYPE_SETZMOFF = "51"; // 设置照明停止位命令 public final static String CMD_TYPE_SETFJON = "52"; // 设置风机启动位命令 public final static String CMD_TYPE_SETFJOFF = "53"; // 设置风机停止位命令 - public final static String CMD_TYPE_SETJGUNLOCK = "54"; // 设置井盖锁定位 + public final static String CMD_TYPE_SETJGUNLOCK = "54"; // 设置井盖锁定位 锁定 public final static String CMD_TYPE_SETDSRESET = "55"; // 清除对射报警 + public final static String CMD_TYPE_SETJGON = "56"; // 设置井盖开启 + public final static String CMD_TYPE_SETJGOFF = "57"; // 设置井盖关闭 + public final static String CMD_TYPE_SETJGLOCK = "58"; // 设置井盖锁定位 解锁 public final static String CMD_TYPE_SETCH4THRESHOLD = "60"; // 设置甲烷浓度报警阈值 public final static String CMD_TYPE_SETHSTHRESHOLD = "61"; // 设置硫化氢浓度报警阈值 diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index 04c888b..0ccd5bf 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -10,9 +10,11 @@ import com.szpg.plc.message.command.LinkCommand; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.message.command.WriteMemoryCommand; +import com.szpg.plc.message.command.write.SetJgUnlockBitCommand; import com.szpg.plc.message.response.LinkCommandResponse; import com.szpg.plc.message.response.WriteMemoryCommandResponse; import com.szpg.plc.message.response.read.*; +import com.szpg.plc.message.response.write.*; import com.szpg.plc.protocol.DTProtocolInterface; import com.szpg.plc.protocol.fins.frame.FINSByteFrame; import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; @@ -76,7 +78,7 @@ /** * 将字节数组解析为收到的消息对象 * - * @param byte[] byteMessage + * @param byteMessage * @return RecievedMessage */ public AppMessage bytesToMessage(byte[] byteMessage) { @@ -182,27 +184,34 @@ break; } } else if (commandCode.equalsIgnoreCase("0102")) { - WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); - - // 写内存命令响应 - byte[] body = finsFrame.TEXT_DATA_BODY; - wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); - - if (body.length == 4) { - if (body[2] == 0x00 && body[3] == 0x00) { - // 写入成功 - wmcr.setSuccess(true); - } else { - wmcr.setSuccess(false); - } - wmcr.setValid(true); - } else { - wmcr.setValid(false); + switch (commandType) { + case AppMessageConstants.CMD_TYPE_SETJGON: + received = bytesToOpenJGCommandResponse(finsFrame); + break; + case AppMessageConstants.CMD_TYPE_SETJGOFF: + received = bytesToCloseJGCommandResponse(finsFrame); + break; + case AppMessageConstants.CMD_TYPE_SETJGUNLOCK: + received = bytesToUnlockJGCommandResponse(finsFrame); + break; + case AppMessageConstants.CMD_TYPE_SETJGLOCK: + received = bytesToLockJGCommandResponse(finsFrame); + break; + + case AppMessageConstants.CMD_TYPE_SETZMON: + received = bytesToTurnOnZmCommandResponse(finsFrame); + break; + case AppMessageConstants.CMD_TYPE_SETZMOFF: + received = bytesToTurnOffZmCommandResponse(finsFrame); + break; + + default: + received = bytesToDefaultWriteMemoryCommandResponse(finsFrame); + ((WriteMemoryCommandResponse) received).setCommandType(commandType); + break; } - - wmcr.setCommandType(commandType); - - received = wmcr; + + } } else { received = new UnKnownMessage(byteMessage); @@ -217,7 +226,7 @@ /** * 将握手响应字节数组转换为消息对象 * - * @param byteMessage + * @param finsFrame * @return */ private AppMessage bytesToLinkCommandResponse(FINSByteFrame finsFrame) { @@ -232,7 +241,7 @@ /** * 将查询甲烷参数响应消息字节数组转换为消息对象 * - * @param byteMessage + * @param finsFrame * @return */ private AppMessage bytesToReadCH4ValueCommandResponse(FINSByteFrame finsFrame) { @@ -256,7 +265,7 @@ /** * 将查询甲烷报警状态响应消息字节数组转换为消息对象 * - * @param byteMessage + * @param finsFrame * @return */ private AppMessage bytesToReadCH4StatusCommandResponse(FINSByteFrame finsFrame) { @@ -317,7 +326,7 @@ /** * 将查询一氧化碳参数响应消息字节数组转换为消息对象 * - * @param byteMessage + * @param finsFrame * @return */ private AppMessage bytesToReadCOValueCommandResponse(FINSByteFrame finsFrame) { @@ -339,7 +348,7 @@ /** * 将查询一氧化碳报警状态响应消息字节数组转换为消息对象 * - * @param byteMessage + * @param finsFrame * @return */ private AppMessage bytesToReadCOStatusCommandResponse(FINSByteFrame finsFrame) { @@ -361,7 +370,7 @@ /** * 将查询氧气参数响应消息字节数组转换为消息对象 * - * @param byteMessage + * @param finsFrame * @return */ private AppMessage bytesToReadO2ValueCommandResponse(FINSByteFrame finsFrame) { @@ -383,7 +392,7 @@ /** * 将查询氧气报警状态响应消息字节数组转换为消息对象 * - * @param byteMessage + * @param finsFrame * @return */ private AppMessage bytesToReadO2StatusCommandResponse(FINSByteFrame finsFrame) { @@ -405,7 +414,7 @@ /** * 将查询硫化氢参数响应消息字节数组转换为消息对象 * - * @param byteMessage + * @param finsFrame * @return */ private AppMessage bytesToReadHSValueCommandResponse(FINSByteFrame finsFrame) { @@ -427,7 +436,7 @@ /** * 将查询硫化氢报警状态响应消息字节数组转换为消息对象 * - * @param byteMessage + * @param finsFrame * @return */ private AppMessage bytesToReadHSStatusCommandResponse(FINSByteFrame finsFrame) { @@ -448,7 +457,7 @@ /** * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 * - * @param byteMessage + * @param finsFrame * @return */ private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame) { @@ -469,7 +478,7 @@ /** * 将查询对射报警状态响应消息字节数组转换为消息对象 * - * @param byteMessage + * @param finsFrame * @return */ private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame) { @@ -491,7 +500,7 @@ /** * 将查询风机运行状态响应消息字节数组转换为消息对象 * - * @param byteMessage + * @param finsFrame * @return */ private AppMessage bytesToReadFjStatCommandResponse(FINSByteFrame finsFrame) { @@ -535,7 +544,7 @@ /** * 将查询水泵运行状态响应消息字节数组转换为消息对象 * - * @param byteMessage + * @param finsFrame * @return */ private AppMessage bytesToReadSbStatCommandResponse(FINSByteFrame finsFrame) { @@ -579,7 +588,7 @@ /** * 将查询照明运行状态响应消息字节数组转换为消息对象 * - * @param byteMessage + * @param finsFrame * @return */ private AppMessage bytesToReadZmStatCommandResponse(FINSByteFrame finsFrame) { @@ -623,7 +632,7 @@ /** * 将查询井盖状态响应消息字节数组转换为消息对象 * - * @param byteMessage + * @param finsFrame * @return */ private AppMessage bytesToReadJgStatusCommandResponse(FINSByteFrame finsFrame) { @@ -683,12 +692,217 @@ return rwvcr; } + + /** + * 将默认写内存指令响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToDefaultWriteMemoryCommandResponse(FINSByteFrame finsFrame) { + WriteMemoryCommandResponse wmcr = new WriteMemoryCommandResponse(); + + // 写内存命令响应 + byte[] body = finsFrame.TEXT_DATA_BODY; + wmcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + + if (body.length == 4) { + if (body[2] == 0x00 && body[3] == 0x00) { + // 写入成功 + wmcr.setSuccess(true); + } else { + wmcr.setSuccess(false); + } + wmcr.setValid(true); + } else { + wmcr.setValid(false); + } + + return wmcr; + } + + /** + * 将打开井盖指令响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToOpenJGCommandResponse(FINSByteFrame finsFrame) { + SetJgOnBitCommandResponse sjcr = new SetJgOnBitCommandResponse(); + sjcr.setCommandType(AppMessageConstants.CMD_TYPE_SETJGON); + + // 写内存命令响应 + byte[] body = finsFrame.TEXT_DATA_BODY; + sjcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + + if (body.length == 4) { + if (body[2] == 0x00 && body[3] == 0x00) { + // 写入成功 + sjcr.setSuccess(true); + } else { + sjcr.setSuccess(false); + } + sjcr.setValid(true); + } else { + sjcr.setValid(false); + } + + return sjcr; + } + + + /** + * 将关闭井盖指令响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToCloseJGCommandResponse(FINSByteFrame finsFrame) { + SetJgOffBitCommandResponse sjcr = new SetJgOffBitCommandResponse(); + sjcr.setCommandType(AppMessageConstants.CMD_TYPE_SETJGOFF); + + // 写内存命令响应 + byte[] body = finsFrame.TEXT_DATA_BODY; + sjcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + + if (body.length == 4) { + if (body[2] == 0x00 && body[3] == 0x00) { + // 写入成功 + sjcr.setSuccess(true); + } else { + sjcr.setSuccess(false); + } + sjcr.setValid(true); + } else { + sjcr.setValid(false); + } + + return sjcr; + } + + /** + * 将解锁井盖指令响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToUnlockJGCommandResponse(FINSByteFrame finsFrame) { + SetJgUnlockBitCommandResponse sjcr = new SetJgUnlockBitCommandResponse(); + sjcr.setCommandType(AppMessageConstants.CMD_TYPE_SETJGUNLOCK); + + // 写内存命令响应 + byte[] body = finsFrame.TEXT_DATA_BODY; + sjcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + + if (body.length == 4) { + if (body[2] == 0x00 && body[3] == 0x00) { + // 写入成功 + sjcr.setSuccess(true); + } else { + sjcr.setSuccess(false); + } + sjcr.setValid(true); + } else { + sjcr.setValid(false); + } + + return sjcr; + } + + + /** + * 将锁定井盖指令响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToLockJGCommandResponse(FINSByteFrame finsFrame) { + SetJgLockBitCommandResponse sjcr = new SetJgLockBitCommandResponse(); + sjcr.setCommandType(AppMessageConstants.CMD_TYPE_SETJGLOCK); + + // 写内存命令响应 + byte[] body = finsFrame.TEXT_DATA_BODY; + sjcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + + if (body.length == 4) { + if (body[2] == 0x00 && body[3] == 0x00) { + // 写入成功 + sjcr.setSuccess(true); + } else { + sjcr.setSuccess(false); + } + sjcr.setValid(true); + } else { + sjcr.setValid(false); + } + + return sjcr; + } + + /** + * 将打开照明指令响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToTurnOnZmCommandResponse(FINSByteFrame finsFrame) { + SetZmOnBitCommandResponse sjcr = new SetZmOnBitCommandResponse(); + sjcr.setCommandType(AppMessageConstants.CMD_TYPE_SETZMON); + + // 写内存命令响应 + byte[] body = finsFrame.TEXT_DATA_BODY; + sjcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + + if (body.length == 4) { + if (body[2] == 0x00 && body[3] == 0x00) { + // 写入成功 + sjcr.setSuccess(true); + } else { + sjcr.setSuccess(false); + } + sjcr.setValid(true); + } else { + sjcr.setValid(false); + } + + return sjcr; + } + + + /** + * 将关闭照明指令响应字节数组转换为消息对象 + * + * @param finsFrame + * @return + */ + private AppMessage bytesToTurnOffZmCommandResponse(FINSByteFrame finsFrame) { + SetZmOffBitCommandResponse sjcr = new SetZmOffBitCommandResponse(); + sjcr.setCommandType(AppMessageConstants.CMD_TYPE_SETZMOFF); + + // 写内存命令响应 + byte[] body = finsFrame.TEXT_DATA_BODY; + sjcr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + + if (body.length == 4) { + if (body[2] == 0x00 && body[3] == 0x00) { + // 写入成功 + sjcr.setSuccess(true); + } else { + sjcr.setSuccess(false); + } + sjcr.setValid(true); + } else { + sjcr.setValid(false); + } + + return sjcr; + } /** * 将消息对象解析为字节数组 * - * @param SentMessage message + * @param message * @return byte[] */ public byte[] messageToBytes(AppMessage message) { @@ -717,8 +931,8 @@ /** * 将握手命令转换为字节数组 * - * @param hmr - * @return + * @param link + * @return byte[] */ private byte[] LinkCommandToBytes(LinkCommand link) { FINSByteFrame finsFrame = new FINSByteFrame(link.getMessageProducerId()); diff --git a/src/com/szpg/rmi/RemoteJGCommandAction.java b/src/com/szpg/rmi/RemoteJGCommandAction.java index b39059b..f3f71b6 100644 --- a/src/com/szpg/rmi/RemoteJGCommandAction.java +++ b/src/com/szpg/rmi/RemoteJGCommandAction.java @@ -1,5 +1,10 @@ package com.szpg.rmi; +import com.szpg.plc.message.command.write.SetJgLockBitCommand; +import com.szpg.plc.message.command.write.SetJgOffBitCommand; +import com.szpg.plc.message.command.write.SetJgOnBitCommand; +import com.szpg.service.RemoteDeviceControlService; +import com.szpg.service.command.ElectronicWellCommandService; import org.apache.log4j.Logger; import org.apache.struts2.ServletActionContext; @@ -157,7 +162,6 @@ // 查找ACU的信息 PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); PgAcu acu = acuDao.findACUByCode(acucode); @@ -180,43 +184,15 @@ // 目标地址 String dest = client.getNet() + client.getNode() + client.getUnit(); - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - // 发送设置解锁位的命令 - SetJgUnlockBitCommand setUnlockCmd = new SetJgUnlockBitCommand(); - setUnlockCmd.setUnlock(SetJgUnlockBitCommand.JG_UNLOCK); - PgHjsbbl unlockBlObj = blDao.findBlByBh(zcbh + ".Lock"); - if (null != unlockBlObj) { - setUnlockCmd.setMessageProducerId(sour); + SetJgUnlockBitCommand setUnlockCmd = ElectronicWellCommandService.buildUnlockCommand(sour, dest, zcbh); + if (null != setUnlockCmd) { setUnlockCmd.setMessageProducerHost(client.getHost()); - setUnlockCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setUnlockCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = unlockBlObj.getKszdz(); - int end = unlockBlObj.getJszdz(); - int bit = unlockBlObj.getSzw(); - - // 开始字地址 - setUnlockCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setUnlockCmd.setBit(bit); - - // 位数 - setUnlockCmd.setCount(end - start + 1); - - // 位内容 - setUnlockCmd.setValue(new byte[] {(byte) SetJgUnlockBitCommand.JG_UNLOCK} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setUnlockCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); + + RemoteDeviceControlService service = new RemoteDeviceControlService(); + service.executeService(client, setUnlockCmd, zcbh); + + Logger.getLogger(this.getClass().getName()).info(setUnlockCmd); } else { jResult.put("success", false); jResult.put("code", "4"); @@ -226,11 +202,11 @@ return null; } - // 5秒后查询一次照明的状态 - Thread.sleep(5 * 1000); - // 调用远程接口查询照明状态 - String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); - HttpRequest.sendGet(baseURL + "remote/readJgStatus.action", "zcbh=" + zcbh); + // 5秒后查询一次井盖的状态 +// Thread.sleep(5 * 1000); + // 调用远程接口查询井盖状态 +// String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); +// HttpRequest.sendGet(baseURL + "remote/readJgStatus.action", "zcbh=" + zcbh); // 成功返回 jResult.put("success", true); @@ -268,7 +244,6 @@ // 查找ACU的信息 PgAcuDao acuDao = new PgAcuDaoImpl(); - PgHjsbblDao blDao = new PgHjsbblDaoImpl(); String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); PgAcu acu = acuDao.findACUByCode(acucode); @@ -291,42 +266,14 @@ // 目标地址 String dest = client.getNet() + client.getNode() + client.getUnit(); - DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); - - SetJgUnlockBitCommand setLockCmd = new SetJgUnlockBitCommand(); - setLockCmd.setUnlock(SetJgUnlockBitCommand.JG_LOCK); - PgHjsbbl lockBlObj = blDao.findBlByBh(zcbh + ".Lock"); - if (null != lockBlObj) { - setLockCmd.setMessageProducerId(sour); + SetJgLockBitCommand setLockCmd = ElectronicWellCommandService.buildLockCommand(sour, dest, zcbh); + if (null != setLockCmd) { setLockCmd.setMessageProducerHost(client.getHost()); - setLockCmd.setDestinationId(dest); - - // SID在new对象的时候已经生成 - - // 内存区域——按位写 - setLockCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); - - int start = lockBlObj.getKszdz(); - int end = lockBlObj.getJszdz(); - int bit = lockBlObj.getSzw(); - - // 开始字地址 - setLockCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); - - // 位地址 - setLockCmd.setBit(bit); - - // 位数 - setLockCmd.setCount(end - start + 1); - - // 位内容 - setLockCmd.setValue(new byte[] {(byte) SetJgUnlockBitCommand.JG_LOCK} ); - - // 解析命令对象为字节数组 - byte[] content = finspi.messageToBytes(setLockCmd); - - // 通过socket接口发送出去 - ACUClientUtil.getInstance().sendACUCommand(client, content); + + RemoteDeviceControlService service = new RemoteDeviceControlService(); + service.executeService(client, setLockCmd, zcbh); + + Logger.getLogger(this.getClass().getName()).info(setLockCmd); } else { jResult.put("success", false); jResult.put("code", "4"); @@ -336,11 +283,11 @@ return null; } - // 5秒后查询一次照明的状态 - Thread.sleep(5 * 1000); - // 调用远程接口查询照明状态 - String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); - HttpRequest.sendGet(baseURL + "remote/readJgStatus.action", "zcbh=" + zcbh); + // 5秒后查询一次井盖的状态 +// Thread.sleep(5 * 1000); + // 调用远程接口查询井盖状态 +// String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); +// HttpRequest.sendGet(baseURL + "remote/readJgStatus.action", "zcbh=" + zcbh); // 成功返回 jResult.put("success", true); @@ -357,6 +304,161 @@ return null; } } + + + /** + * 远程打开井盖 + * @return + * @throws Exception + */ + public String openJg() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + // 2 发送设置启动位的命令 + // 构建打开井盖指令 + SetJgOnBitCommand setOnCmd = ElectronicWellCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + setOnCmd.setMessageProducerHost(client.getHost()); + + RemoteDeviceControlService service = new RemoteDeviceControlService(); + service.executeService(client, setOnCmd, zcbh); + + Logger.getLogger(this.getClass().getName()).info(setOnCmd); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的打开井盖变量")); + + returnToFront(jResult); + return null; + } + + // 返回成功给界面 + jResult.put("success", true); + jResult.put("code", "0"); + returnToFront(jResult); + + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } + + + /** + * 远程关闭井盖 + * @return + * @throws Exception + */ + public String closeJg() throws Exception { + // 返回结果 + JSONObject jResult = new JSONObject(); + + if (null == zcbh || zcbh.equals("") == true) { + jResult.put("success", false); + jResult.put("code", "1"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); + + returnToFront(jResult); + return null; + } + + // 查找ACU的信息 + PgAcuDao acuDao = new PgAcuDaoImpl(); + + String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); + PgAcu acu = acuDao.findACUByCode(acucode); + if (null == acu) { + jResult.put("success", false); + jResult.put("code", "2"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); + + returnToFront(jResult); + return null; + } + + ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); + if (null != client) { + // 源地址 + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + + // 目标地址 + String dest = client.getNet() + client.getNode() + client.getUnit(); + + // 2 发送设置停止位的命令 + SetJgOffBitCommand setOffCmd = ElectronicWellCommandService.buildTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + setOffCmd.setMessageProducerHost(client.getHost()); + + RemoteDeviceControlService service = new RemoteDeviceControlService(); + service.executeService(client, setOffCmd, zcbh); + + Logger.getLogger(this.getClass().getName()).info(setOffCmd); + } else { + jResult.put("success", false); + jResult.put("code", "4"); + jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的关闭井盖变量")); + + returnToFront(jResult); + return null; + } + + // 返回成功给界面 + jResult.put("success", true); + jResult.put("code", "0"); + returnToFront(jResult); + + return null; + } else { + jResult.put("success", false); + jResult.put("code", "3"); + jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); + + returnToFront(jResult); + return null; + } + } /**