package com.zy.core.thread;
|
|
import HslCommunication.Core.Transfer.DataFormat;
|
import HslCommunication.Core.Types.OperateResult;
|
import HslCommunication.Core.Types.OperateResultExOne;
|
import HslCommunication.ModBus.ModbusTcpNet;
|
import com.alibaba.fastjson.JSON;
|
import com.core.common.DateUtils;
|
import com.core.exception.CoolException;
|
import com.zy.core.News;
|
import com.zy.core.ThreadHandler;
|
import com.zy.core.cache.MessageQueue;
|
import com.zy.core.cache.OutputQueue;
|
import com.zy.core.enums.SlaveType;
|
import com.zy.core.model.LiftSlave;
|
import com.zy.core.model.Task;
|
import com.zy.core.model.command.LiftCommand;
|
import com.zy.core.model.protocol.LiftProtocol;
|
import lombok.Data;
|
import lombok.extern.slf4j.Slf4j;
|
|
import java.text.MessageFormat;
|
import java.util.Date;
|
|
/**
|
* 提升机线程
|
*/
|
@Data
|
@Slf4j
|
public class LiftThread implements Runnable, ThreadHandler {
|
|
private ModbusTcpNet modbusTcpNet;
|
private LiftSlave slave;
|
private LiftProtocol liftProtocol;
|
|
public LiftThread(LiftSlave slave) {
|
this.slave = slave;
|
}
|
|
@Override
|
public void run() {
|
this.connect();
|
while (true) {
|
try {
|
int step = 1;
|
Task task = MessageQueue.poll(SlaveType.Lift, slave.getId());
|
if (task != null) {
|
step = task.getStep();
|
}
|
switch (step) {
|
// 读数据
|
case 1:
|
readStatus();
|
break;
|
// 写入数据
|
case 2:
|
write((LiftCommand) task.getData());
|
break;
|
default:
|
break;
|
}
|
Thread.sleep(500);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
}
|
|
@Override
|
public boolean connect() {
|
boolean result = false;
|
//-------------------------提升机连接方法------------------------//
|
modbusTcpNet = new ModbusTcpNet(slave.getIp(), slave.getPort(), (byte) 0x01);
|
// 当你需要指定格式的数据解析时,就需要设置下面的这个信息
|
modbusTcpNet.setDataFormat(DataFormat.ABCD);
|
OperateResult connect = modbusTcpNet.ConnectServer();
|
if(connect.IsSuccess){
|
result = true;
|
OutputQueue.CRN.offer(MessageFormat.format( "【{0}】提升机plc连接成功 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
|
log.info("提升机plc连接成功 ===>> [id:{}] [ip:{}] [port:{}] ", slave.getId(), slave.getIp(), slave.getPort());
|
} else {
|
OutputQueue.CRN.offer(MessageFormat.format("【{0}】提升机plc连接失败!!! ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
|
log.error("提升机plc连接失败!!! ===>> [id:{}] [ip:{}] [port:{}] ", slave.getId(), slave.getIp(), slave.getPort());
|
}
|
modbusTcpNet.ConnectClose();
|
//-------------------------提升机连接方法------------------------//
|
return result;
|
}
|
|
@Override
|
public void close() {
|
modbusTcpNet.ConnectClose();
|
}
|
|
private void readStatus() {
|
try {
|
OperateResultExOne<byte[]> result = modbusTcpNet.Read("29", (short) 17);
|
if (result.IsSuccess) {
|
if (null == liftProtocol) {
|
liftProtocol = new LiftProtocol();
|
liftProtocol.setLiftNo(slave.getId().shortValue());
|
}
|
|
//----------读取提升机状态-----------
|
//获取数据
|
byte[] content = result.Content;
|
//提升机锁定
|
liftProtocol.setLiftLock(modbusTcpNet.getByteTransform().TransBool(content,0));
|
//位置到达反馈
|
liftProtocol.setPositionArrivalFeedback(modbusTcpNet.getByteTransform().TransInt16(content,2));
|
//准备就绪
|
liftProtocol.setReady(modbusTcpNet.getByteTransform().TransBool(content,3));
|
//运行中
|
liftProtocol.setRunning(modbusTcpNet.getByteTransform().TransBool(content,4));
|
//联机/单机
|
liftProtocol.setMode(modbusTcpNet.getByteTransform().TransBool(content,5));
|
//输送线前端光电有货
|
liftProtocol.setLineFrontHasStock(modbusTcpNet.getByteTransform().TransBool(content,6));
|
//输送线正转反馈
|
liftProtocol.setForwardRotationFeedback(modbusTcpNet.getByteTransform().TransBool(content,7));
|
//输送线反转反馈
|
liftProtocol.setReverseFeedback(modbusTcpNet.getByteTransform().TransBool(content,8));
|
//输送线电机过载
|
liftProtocol.setMotorOverload(modbusTcpNet.getByteTransform().TransBool(content,9));
|
//输送线末端光电有货
|
liftProtocol.setLineEndHasStock(modbusTcpNet.getByteTransform().TransBool(content,10));
|
//进输送线卡托盘报警
|
liftProtocol.setInConveyLineCardTrayAlarm(modbusTcpNet.getByteTransform().TransBool(content,11));
|
//出输送线卡托盘报警
|
liftProtocol.setOutConveyLineCardTrayAlarm(modbusTcpNet.getByteTransform().TransBool(content,12));
|
//平台位置偏差报警
|
liftProtocol.setPlatPositionDeviationAlarm(modbusTcpNet.getByteTransform().TransBool(content,13));
|
//平台扭矩偏差报警
|
liftProtocol.setPlatTorqueDeviationAlarm(modbusTcpNet.getByteTransform().TransBool(content,14));
|
//平台四向车检测
|
liftProtocol.setPlatShuttleCheck(modbusTcpNet.getByteTransform().TransBool(content,15));
|
//未就绪状态
|
liftProtocol.setNotReady(modbusTcpNet.getByteTransform().TransInt16(content,16));
|
//伺服1错误
|
liftProtocol.setServoError1(modbusTcpNet.getByteTransform().TransInt16(content,17));
|
//伺服2错误
|
liftProtocol.setServoError2(modbusTcpNet.getByteTransform().TransInt16(content,18));
|
//伺服3错误
|
liftProtocol.setServoError3(modbusTcpNet.getByteTransform().TransInt16(content,19));
|
//伺服4错误
|
liftProtocol.setServoError4(modbusTcpNet.getByteTransform().TransInt16(content,20));
|
//提升机实际速度反馈
|
liftProtocol.setLiftActualSpeed(modbusTcpNet.getByteTransform().TransInt16(content,21));
|
|
///读取提升机状态-end
|
|
OutputQueue.LIFT.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId()));
|
// log.info(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功",DateUtils.convert(new Date()), slave.getId()));
|
|
// 根据实时信息更新数据库
|
//.....
|
|
}else {
|
OutputQueue.LIFT.offer(MessageFormat.format("【{0}】{1}提升机plc状态信息失败", DateUtils.convert(new Date()), slave.getId()));
|
throw new CoolException(MessageFormat.format( "提升机plc状态信息失败 ===>> [id:{0}] [ip:{1}] [port:{2}]", slave.getId(), slave.getIp(), slave.getPort()));
|
}
|
} catch (Exception e) {
|
OutputQueue.LIFT.offer(MessageFormat.format("【{0}】提升机plc状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
|
initLift();
|
}
|
}
|
|
private boolean write(LiftCommand command){
|
if (null == command) {
|
News.error("提升机写入命令为空");
|
return false;
|
}
|
|
command.setLiftNo(slave.getId());
|
// 开始任务
|
short[] array = new short[30];
|
//开始运行
|
array[0] = command.getRun();
|
//目标位置
|
array[1] = command.getDistPosition();
|
//运行速度
|
array[2] = command.getSpeed();
|
//二层高度设定
|
array[3] = command.getHeight2();
|
//三层高度设定
|
array[4] = command.getHeight3();
|
//四层高度设定
|
array[5] = command.getHeight4();
|
//提升机锁定
|
array[29] = command.getLiftLockShortValue();
|
|
OperateResult result = modbusTcpNet.Write("0", array);;
|
if (result != null && result.IsSuccess) {
|
News.info("提升机命令下发[id:{}] >>>>> {}", slave.getId(), JSON.toJSON(command));
|
OutputQueue.LIFT.offer(MessageFormat.format("【{0}】[id:{1}] >>>>> 命令下发: {2}", DateUtils.convert(new Date()), slave.getId(), JSON.toJSON(command)));
|
return true;
|
} else {
|
OutputQueue.LIFT.offer(MessageFormat.format("【{0}】写入提升机plc数据失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
|
News.error("写入提升机plc数据失败 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
|
return false;
|
}
|
}
|
|
/**
|
* 初始化提升机
|
*/
|
private void initLift() {
|
if (null == liftProtocol) {
|
liftProtocol = new LiftProtocol();
|
}
|
}
|
|
/******************************************************************************************/
|
/**************************************** 测试专用 *****************************************/
|
/*****************************************************************************************/
|
public static void main(String[] args) throws InterruptedException {
|
LiftSlave slave = new LiftSlave();
|
slave.setId(1);
|
slave.setIp("192.168.4.24");
|
slave.setPort(502);
|
LiftThread thread = new LiftThread(slave);
|
thread.connect();
|
thread.readStatus();
|
|
LiftCommand command = new LiftCommand();
|
command.setRun((short) 0);
|
command.setDistPosition((short) 12);
|
command.setSpeed((short) 300);
|
command.setHeight2((short) 100);
|
command.setHeight3((short) 200);
|
command.setHeight4((short) 303);
|
command.setLiftLock(true);
|
thread.write(command);
|
|
}
|
|
}
|