自动化立体仓库 - WCS系统
zhangc
2025-03-11 d5449236ef0b3adafb3e4cc872f50479efa0ce7b
src/main/java/com/zy/core/thread/LedThread.java
@@ -1,12 +1,14 @@
package com.zy.core.thread;
import com.alibaba.fastjson.JSON;
import com.core.common.Cools;
import com.zy.common.entity.Parameter;
import com.core.common.SpringUtils;
import com.zy.asrs.entity.CommandInfo;
import com.zy.asrs.service.CommandInfoService;
import com.zy.asrs.service.DeviceErrorService;
import com.zy.common.model.MatDto;
import com.zy.core.Slave;
import com.zy.core.ThreadHandler;
import com.zy.core.cache.MessageQueue;
import com.zy.core.enums.CommandStatusType;
import com.zy.core.enums.SlaveType;
import com.zy.core.model.Task;
import com.zy.core.model.command.LedCommand;
@@ -34,11 +36,11 @@
@Slf4j
public class LedThread implements Runnable, ThreadHandler {
    private Slave slave;
    private Bx5GScreenClient screen;
    ProgramBxFile pf;
    TextCaptionBxArea area;
    DisplayStyleFactory.DisplayStyle[] styles = DisplayStyleFactory.getStyles().toArray(new DisplayStyleFactory.DisplayStyle[0]);
    private Slave slave;
    private Bx5GScreenClient screen;
    private Set<Integer> workNos = new HashSet<>();
    private boolean ledMk = false;
    private boolean resetStatus = false;    // 复位状态
@@ -54,169 +56,18 @@
        }
    }
    @Override
    @SuppressWarnings({"InfiniteLoopStatement", "unchecked"})
    public void run() {
        connect();
        close();
        while (true) {
            try {
                Task task = MessageQueue.poll(SlaveType.Led, slave.getId());
                if (task != null) {
                    switch (task.getStep()) {
                        // 写数据
                        case 1:
                            write((List<LedCommand>)task.getData());
                            break;
                        // 复位
                        case 2:
                            reset();
                            break;
                        default:
                            break;
                    }
                }
                Thread.sleep(400);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    private void write(List<LedCommand> list) throws Bx5GException {
        if (!connect()) {
            return;
        }
        pf = new ProgramBxFile( 0, screen.getProfile());
        pf.setFrameShow(false);
        // 分别输入X,Y,width,height
        area = new TextCaptionBxArea( 0,0,96,48, screen.getProfile());
        // 创建一个数据页
        TextBxPage page = new TextBxPage();
        for (LedCommand command : list) {
            page.newLine(command.getTitle() +"("+command.getWorkNo()+")");
            page.newLine("源库位:"+command.getSourceLocNo());
            page.newLine("目标站:"+command.getStaNo());
            if (!command.isEmptyMk()) {
                for (MatDto matDto : command.getMatDtos()) {
                    //去掉小数点
                    String strQty = matDto.getCount().toString();
                    int idx = strQty.lastIndexOf(".");
                    if(idx >= 0){
                        strQty.substring(0,idx);
                    }
                    page.newLine(matDto.getMaknx() + "[数量" + strQty +"]");
//                    page.newLine(matDto.getMaknx() + "【数量" + matDto.getCount() +"】");
                }
            }
            page.newLine("\n");
        }
        // 设置字体
        page.setFont(new Font("宋体",Font.PLAIN,12));
        // 设置文本颜色
        page.setForeground(Color.red);
        // 设置显示特技为快速打出
        page.setDisplayStyle(styles[6]);
        area.clearPages();
        area.addPage(page);
        pf.addArea(area);
        if (pf.validate() != null) {
            log.info("pf out of range");
        } else {
            // 更新节目
            screen.writeProgram(pf);
//            resetStatus = false;
        }
        close();
    }
    private void reset() throws Bx5GException {
        if (!connect()) {
            return;
        }
//        if (resetStatus) {
//            return;
//        }
        pf = new ProgramBxFile( 0, screen.getProfile());
        pf.setFrameShow(false);
        // 分别输入X,Y,width,height
        area = new TextCaptionBxArea( 0,0,96,48, screen.getProfile());
        // 创建一个数据页
        TextBxPage page = new TextBxPage();
//        List<String> list = null;
//        try {
//            String ledDefaultMsg = Parameter.get().getLedDefaultMsg();
//            list = JSON.parseArray(ledDefaultMsg, String.class);
//        } catch (Exception ignore) {
//        }
//        if (!Cools.isEmpty(list)) {
//            for (String str : list) {
//                page.newLine(str);
//            }
//        } else {
//            page.newLine("自动化立体仓库");
//            page.newLine("西格迈股份有限公司");
//        }
        page.newLine("");
        // 设置字体
        page.setFont(new Font("宋体",Font.PLAIN,13));
        // 设置文本颜色
        page.setForeground(Color.red);
        // 设置显示特技为快速打出
        page.setDisplayStyle(styles[6]);
        area.clearPages();
        area.addPage(page);
        pf.addArea(area);
        // 更新节目
        if (pf.validate() != null) {
            log.info("pf out of range");
        } else {
            // 更新节目
            screen.writeProgram(pf);
//            resetStatus = true;
        }
        close();
    }
    @Override
    public boolean connect() {
        boolean connRes = false;
        try {
            connRes = screen.connect(slave.getIp(),slave.getPort());
            screen.turnOn();
        } catch (Exception ignore) {
        }
        if (connRes) {
            log.info("led连接成功 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
        } else {
            log.error("led连接失败!!! ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
        }
        return connRes;
    }
    @Override
    public void close() {
        screen.disconnect();
    }
    public static void main(String[] args) throws Exception {
        String strQty = "1234";
        int index = strQty.lastIndexOf(".");
        if(index>=0) {
            strQty=strQty.substring(0, index);
        if (index >= 0) {
            strQty = strQty.substring(0, index);
        }
        System.out.println("2==>>"+strQty);
        System.out.println("2==>>" + strQty);
        Bx5GEnv.initial(3000);
        Bx5GScreenClient screen = new Bx5GScreenClient("my");
        DisplayStyleFactory.DisplayStyle[] styles = DisplayStyleFactory.getStyles().toArray(new DisplayStyleFactory.DisplayStyle[0]);
        if (!screen.connect("192.168.10.101",5005)) {
        if (!screen.connect("192.168.10.101", 5005)) {
            System.err.println("连接失败!!!!");
            return;
        }
@@ -226,10 +77,10 @@
        while (true) {
            Thread.sleep(5000L);
            ProgramBxFile pf = new ProgramBxFile( 0, screen.getProfile());
            ProgramBxFile pf = new ProgramBxFile(0, screen.getProfile());
            pf.setFrameShow(false);
            // 分别输入X,Y,width,heigth
            TextCaptionBxArea area = new TextCaptionBxArea(  0,0,192,96,screen.getProfile());
            TextCaptionBxArea area = new TextCaptionBxArea(0, 0, 192, 96, screen.getProfile());
            // 创建一个数据页
            // 第一行数据
@@ -237,14 +88,14 @@
            page.newLine("源库位:0100204");
            page.newLine("目标站:1000");
            // 设置字体
            page.setFont( new Font("宋体",Font.PLAIN,15));
            page.setFont(new Font("宋体", Font.PLAIN, 15));
            // 设置文本颜色
            page.setForeground(Color.red);
            // 设置显示特技为快速打出
            page.setDisplayStyle(styles[6]);
            area.clearPages();
            area.addPage(page);
            pf.addArea( area );
            pf.addArea(area);
            // 更新节目
            // 更新节目
@@ -261,37 +112,6 @@
//        screen.disconnect();
    }
    public static void main1(String[] args) throws Exception {
        Bx5GEnv.initial(3000);
        // 创建screen对象,用于对控制器进行访问,客户端模式
@@ -300,7 +120,7 @@
        //        Bx5GScreenRS screen = new Bx5GScreenRS("MyScreen");
        // 在对控制器交互之前,需要先与控制器建立连接
        boolean conn = screen.connect("192.168.10.61",5005);
        boolean conn = screen.connect("192.168.10.61", 5005);
        System.out.println(conn);
        // 与控制器交互完成后,需断开与控制器之间的连接
//        screen.disconnect();
@@ -322,10 +142,9 @@
//        // 解除锁定屏幕当前画面
//        screen.unlock();
        Bx5GScreen.Result <ReturnControllerStatus> result1 =
        Bx5GScreen.Result<ReturnControllerStatus> result1 =
                screen.checkControllerStatus();
        if (result1.isOK())
        {
        if (result1.isOK()) {
            ReturnControllerStatus status = result1.reply;
            System.out.println(status.getBrightness());
            System.out.println(status.getRtcDay());
@@ -338,7 +157,7 @@
        // 以下是静态区部分 Demo
        // 创建节目文件
        ProgramBxFile pf = new ProgramBxFile( 0,screen.getProfile() );
        ProgramBxFile pf = new ProgramBxFile(0, screen.getProfile());
// 是否显示节目边框
        pf.setFrameShow(true);
// 节目边框的移动速度
@@ -350,21 +169,21 @@
// 创建一个文本区
        // 分别输入X,Y,width,heigth
        // 注意区域坐标和宽度高度,不要越界
        TextCaptionBxArea area = new TextCaptionBxArea( 0,0,160,64,screen.getProfile() );
        TextCaptionBxArea area = new TextCaptionBxArea(0, 0, 160, 64, screen.getProfile());
        // 创建一个数据页
        // 第一行数据
        TextBxPage page = new TextBxPage("入库");
        // 第二行数据
        page.newLine( "物料:" );
        page.newLine("物料:");
        page.newLine("接收器 RX18 XH 6V (数量:2)");
        page.newLine("中控 BM蓝牙 英文 6V (数量:1)");
        page.newLine("线束 S2588-1-XX 无实物(数量:5)");
        page.newLine("目标库位:0100204");
        // 设置字体
        page.setFont( new Font("宋体",Font.PLAIN,12) );
        page.setFont(new Font("宋体", Font.PLAIN, 12));
        // 设置显示特技为快速打出
        page.setDisplayStyle( styles[2] );
        page.setDisplayStyle(styles[2]);
        // 数据页可以是图片
//        ImageFileBxPage iPage = new ImageFileBxPage( "E;a/001.bmp" );
@@ -373,22 +192,14 @@
//        TextFileBxPage tPage  = new TextFileBxPage("E:a/001.txt");
        // 将前面的page添加到area中 area中可以添加多个page 其中page可以是字符串,可以是txt文件,可以是图片,不可以是表格,如果需要Led屏上显示表格,请先将表格绘制成图片
        area.addPage( page );
        area.addPage(page);
//        area.addPage( iPage );
//        area.addPage( tPage );
        // 将area添加到节目中  节目中可以添加多个area
        pf.addArea( area );
        pf.addArea(area);
        // 更新节目
        screen.writeProgram( pf );
        screen.writeProgram(pf);
        //
@@ -448,4 +259,162 @@
    }
    @Override
    @SuppressWarnings({"InfiniteLoopStatement", "unchecked"})
    public void run() {
        connect();
        close();
        while (true) {
            try {
                Task task = MessageQueue.poll(SlaveType.Led, slave.getId());
                if (task != null) {
                    switch (task.getStep()) {
                        // 写数据
                        case 1:
                            write((List<LedCommand>) task.getData());
                            break;
                        // 复位
                        case 2:
                            reset();
                            break;
                        default:
                            break;
                    }
                }
                Thread.sleep(400);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    private void write(List<LedCommand> list) throws Bx5GException {
        if (!connect()) {
            return;
        }
        pf = new ProgramBxFile(0, screen.getProfile());
        pf.setFrameShow(false);
        // 分别输入X,Y,width,height
        area = new TextCaptionBxArea(0, 0, 96, 48, screen.getProfile());
        // 创建一个数据页
        TextBxPage page = new TextBxPage();
        for (LedCommand command : list) {
            page.newLine(command.getTitle() + "(" + command.getWorkNo() + ")");
            page.newLine("库位:" + (command.getIoType() < 100 ? command.getLocNo() : command.getSourceLocNo()));
            page.newLine("目标站:" + command.getStaNo());
            if (!command.isEmptyMk()) {
                for (MatDto matDto : command.getMatDtos()) {
                    //去掉小数点
                    String strQty = matDto.getCount().toString();
                    int idx = strQty.lastIndexOf(".");
                    if (idx >= 0) {
                        strQty.substring(0, idx);
                    }
                    page.newLine(matDto.getMaknx() + "[数量" + strQty + "]");
//                    page.newLine(matDto.getMaknx() + "【数量" + matDto.getCount() +"】");
                }
            }
            page.newLine("\n");
            //更新指令状态
            CommandInfoService commandInfoService = SpringUtils.getBean(CommandInfoService.class);
            CommandInfo commandInfo = command.getCommandInfo();
            commandInfo.setCommandStatus(CommandStatusType.COMPLETE.id);
            commandInfoService.updateById(commandInfo);
        }
        // 设置字体
        page.setFont(new Font("宋体", Font.PLAIN, 12));
        // 设置文本颜色
        page.setForeground(Color.red);
        // 设置显示特技为快速打出
        page.setDisplayStyle(styles[6]);
        area.clearPages();
        area.addPage(page);
        pf.addArea(area);
        if (pf.validate() != null) {
            log.info("pf out of range");
        } else {
            // 更新节目
            screen.writeProgram(pf);
//            resetStatus = false;
        }
        close();
    }
    private void reset() throws Bx5GException {
        if (!connect()) {
            return;
        }
//        if (resetStatus) {
//            return;
//        }
        pf = new ProgramBxFile(0, screen.getProfile());
        pf.setFrameShow(false);
        // 分别输入X,Y,width,height
        area = new TextCaptionBxArea(0, 0, 96, 48, screen.getProfile());
        // 创建一个数据页
        TextBxPage page = new TextBxPage();
//        List<String> list = null;
//        try {
//            String ledDefaultMsg = Parameter.get().getLedDefaultMsg();
//            list = JSON.parseArray(ledDefaultMsg, String.class);
//        } catch (Exception ignore) {
//        }
//        if (!Cools.isEmpty(list)) {
//            for (String str : list) {
//                page.newLine(str);
//            }
//        } else {
//            page.newLine("自动化立体仓库");
//            page.newLine("西格迈股份有限公司");
//        }
        page.newLine("力源智能仓储");
        // 设置字体
        page.setFont(new Font("宋体", Font.PLAIN, 13));
        // 设置文本颜色
        page.setForeground(Color.red);
        // 设置显示特技为快速打出
        page.setDisplayStyle(styles[6]);
        area.clearPages();
        area.addPage(page);
        pf.addArea(area);
        // 更新节目
        if (pf.validate() != null) {
            log.info("pf out of range");
        } else {
            // 更新节目
            screen.writeProgram(pf);
//            resetStatus = true;
        }
        close();
    }
    @Override
    public boolean connect() {
        boolean connRes = false;
        try {
            connRes = screen.connect(slave.getIp(), slave.getPort());
            screen.turnOn();
        } catch (Exception ignore) {
        }
        DeviceErrorService deviceErrorService = SpringUtils.getBean(DeviceErrorService.class);
        if (connRes) {
            log.info("led连接成功 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
            deviceErrorService.deleteDeviceError("led", slave.getId());
        } else {
            log.error("led连接失败!!! ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
            deviceErrorService.addDeviceError("led", slave.getId(), "led连接失败");
        }
        return connRes;
    }
    @Override
    public void close() {
        screen.disconnect();
    }
}