自动化立体仓库 - WCS系统
#
luxiaotao1123
2022-09-20 dedefacddd03987922f4744e080beea7acc9bd60
#
1个文件已修改
398 ■■■■ 已修改文件
src/main/java/com/zy/core/thread/LedThread.java 398 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/LedThread.java
@@ -1,8 +1,5 @@
package com.zy.core.thread;
import com.alibaba.fastjson.JSON;
import com.core.common.Cools;
import com.zy.common.entity.Parameter;
import com.zy.common.model.MatDto;
import com.zy.core.Slave;
import com.zy.core.ThreadHandler;
@@ -12,17 +9,7 @@
import com.zy.core.model.command.LedCommand;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import onbon.bx05.Bx5GEnv;
import onbon.bx05.Bx5GException;
import onbon.bx05.Bx5GScreen;
import onbon.bx05.Bx5GScreenClient;
import onbon.bx05.area.TextCaptionBxArea;
import onbon.bx05.area.page.TextBxPage;
import onbon.bx05.file.ProgramBxFile;
import onbon.bx05.message.led.ReturnControllerStatus;
import onbon.bx05.utils.DisplayStyleFactory;
import java.awt.*;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@@ -35,30 +22,22 @@
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 Set<Integer> workNos = new HashSet<>();
    private boolean ledMk = true;
    private boolean resetStatus = false;    // 复位状态
    // 显示器
    private StringBuffer stringBuffer = new StringBuffer();
    private List<LedCommand> commandList;
    private StringBuffer errorMsg = new StringBuffer();
    public LedThread(Slave slave) {
        this.slave = slave;
        try {
            Bx5GEnv.initial(3000);
            screen = new Bx5GScreenClient("my");
        } catch (Exception e) {
            e.printStackTrace();
            log.info("led连接构造器错误 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
        }
    }
    @Override
    @SuppressWarnings({"InfiniteLoopStatement", "unchecked"})
    public void run() {
        connect();
        close();
//        connect();
        while (true) {
            try {
                Task task = MessageQueue.poll(SlaveType.Led, slave.getId());
@@ -72,365 +51,68 @@
                        case 2:
                            reset();
                            break;
                        case 3:
                            error((String) task.getData());
                            break;
                        case 4:
                            errorReset();
                            break;
                        default:
                            break;
                    }
                }
                Thread.sleep(400);
                Thread.sleep(1000);
            } 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();
    private void write(List<LedCommand> list) {
        commandList = list;
        StringBuilder sb = new StringBuilder();
        for (LedCommand command : list) {
            page.newLine(command.getTitle() +"("+command.getWorkNo()+")");
            page.newLine("源库位:"+command.getSourceLocNo());
            page.newLine("目标站:"+command.getStaNo());
            sb.append(command.getTitle()).append("(").append(command.getWorkNo()).append(")").append("\n");
            sb.append("源库位:").append(command.getSourceLocNo()).append("\n");
            sb.append("目标站:").append(command.getStaNo()).append("\n");
            if (!command.isEmptyMk()) {
                for (MatDto matDto : command.getMatDtos()) {
                    page.newLine(matDto.getMaknx() + "【数量" + matDto.getCount() +"】");
                    sb.append(matDto.getMatnr()).append("-").append(matDto.getBatch()).append("\n");
                }
            }
            page.newLine("\n");
            sb.append("\n");
        }
        stringBuffer.delete(0, stringBuffer.length());
        stringBuffer.append(sb.toString());
        // 设置字体
        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();
        errorReset();
    }
    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("西格迈股份有限公司");
        }
    private void reset() {
        commandList = null;
        // 设置字体
        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();
        stringBuffer.delete(0, stringBuffer.length());
    }
    private void error(String msg) {
        errorMsg.delete(0, errorMsg.length());
        errorMsg.append(msg);
    }
    public void errorReset() {
        this.errorMsg.delete(0, errorMsg.length());
    }
    @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;
        return true;
    }
    @Override
    public void close() {
        screen.disconnect();
    }
    public static void main(String[] args) throws Exception {
        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)) {
            System.err.println("连接失败!!!!");
            return;
        }
        screen.turnOn();
        while (true) {
            Thread.sleep(5000L);
            ProgramBxFile pf = new ProgramBxFile( 0, screen.getProfile());
            pf.setFrameShow(false);
            // 分别输入X,Y,width,heigth
            TextCaptionBxArea area = new TextCaptionBxArea(  0,0,192,96,screen.getProfile());
            // 创建一个数据页
            // 第一行数据
            TextBxPage page = new TextBxPage("出库任务(303)");
            page.newLine("源库位:0100204");
            page.newLine("目标站:1000");
            // 设置字体
            page.setFont( new Font("宋体",Font.PLAIN,15));
            // 设置文本颜色
            page.setForeground(Color.red);
            // 设置显示特技为快速打出
            page.setDisplayStyle(styles[6]);
            area.clearPages();
            area.addPage(page);
            pf.addArea( area );
            // 更新节目
            // 更新节目
            if (pf.validate() != null) {
                System.out.println("pf out of range");
                log.info("pf out of range");
            } else {
                // 更新节目
                screen.writeProgram(pf);
            }
        }
        // 继开与控制器之间的链接
//        screen.disconnect();
    }
    public static void main1(String[] args) throws Exception {
        Bx5GEnv.initial(3000);
        // 创建screen对象,用于对控制器进行访问,客户端模式
        Bx5GScreenClient screen = new Bx5GScreenClient("my");
        // 创建screen对象,用于对控制器进行访问,串口模式
        //        Bx5GScreenRS screen = new Bx5GScreenRS("MyScreen");
        // 在对控制器交互之前,需要先与控制器建立连接
        boolean conn = screen.connect("192.168.10.61",5005);
        System.out.println(conn);
        // 与控制器交互完成后,需断开与控制器之间的连接
//        screen.disconnect();
        // 以下为一些简单控制命令的使用方法
        // 开关机命令
//        screen.turnOff();// 关机
        screen.turnOn();// 开机
//        screen.syncTime();// 校时
//        screen.ping();// ping命令
//        // 查询控制器状态
//        screen.checkControllerStatus();
//        // 查询控制器当前固件版本
//        screen.checkFirmware();
//        // 查询控制器内存
//        screen.checkMemVolumes();
//        // 锁定屏幕当前画面
//        screen.lock();
//        // 解除锁定屏幕当前画面
//        screen.unlock();
        Bx5GScreen.Result <ReturnControllerStatus> result1 =
                screen.checkControllerStatus();
        if (result1.isOK())
        {
            ReturnControllerStatus status = result1.reply;
            System.out.println(status.getBrightness());
            System.out.println(status.getRtcDay());
            System.out.println(status.getScreenOnOff());
            //
            // status 还有很对其他接口,可以根据实际需求再次调用以获取相应状态
        }
//
        // 以下是静态区部分 Demo
        // 创建节目文件
        ProgramBxFile pf = new ProgramBxFile( 0,screen.getProfile() );
// 是否显示节目边框
        pf.setFrameShow(true);
// 节目边框的移动速度
        pf.setFrameSpeed(20);
// 使用第几个内置边框
        pf.loadFrameImage(13);
        DisplayStyleFactory.DisplayStyle[] styles = DisplayStyleFactory.getStyles().toArray(new DisplayStyleFactory.DisplayStyle[0]);
// 创建一个文本区
        // 分别输入X,Y,width,heigth
        // 注意区域坐标和宽度高度,不要越界
        TextCaptionBxArea area = new TextCaptionBxArea( 0,0,160,64,screen.getProfile() );
        // 创建一个数据页
        // 第一行数据
        TextBxPage page = new TextBxPage("入库");
        // 第二行数据
        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.setDisplayStyle( styles[2] );
        // 数据页可以是图片
//        ImageFileBxPage iPage = new ImageFileBxPage( "E;a/001.bmp" );
//
//        // 数据页可以是txt文件
//        TextFileBxPage tPage  = new TextFileBxPage("E:a/001.txt");
        // 将前面的page添加到area中 area中可以添加多个page 其中page可以是字符串,可以是txt文件,可以是图片,不可以是表格,如果需要Led屏上显示表格,请先将表格绘制成图片
        area.addPage( page );
//        area.addPage( iPage );
//        area.addPage( tPage );
        // 将area添加到节目中  节目中可以添加多个area
        pf.addArea( area );
        // 更新节目
        screen.writeProgram( pf );
        //
        // 以下是动态区部分 Demo
        // 动态区的特点
        // DynamicBxAreaRule(id, runMode, immediatePlay, timeout)
        // runMode 运行模式:
        //   0:循环显示。
        //   1:显示完成后静止显示最后一页数据。
        //   2:循环显示,超过设定时间后数据仍未更新时不再显示。
        //   3:循环显示,超过设定时间后数据仍未更新时显示 Logo 信息。
        //   4:循环显示,显示完最后一页后就不再显示。
        // immediatePlay 是否立即播放:
        //   0:与异步节目一起播放。
        //   1:异步节目停止播放,仅播放动态区域。
        //   2:当播放完节目编号最高的异步节目后播放该动态区域。
        //
        // 定义一个动态区
        // 可以通过ID来更新不同的动态区内容, 此处 ID 为 0
//        DynamicBxAreaRule dynRule = new DynamicBxAreaRule(0, (byte) 0, (byte) 1, 0);
        //dArea.addProgram("P000");
        //dArea.addProgram("P001");
//        int posX = 440;
//        int posY = 4;
//        TextCaptionBxArea dAreaContent = new TextCaptionBxArea(posX, posY, 64, 16, screen.getProfile());
//        TextBxPage page = new TextBxPage("动态第一次尝试");
//        page.setDisplayStyle(DisplayStyleFactory.getStyle(4));
//        dAreaContent.addPage(page);
//
//        // 发送动态区之前,如果需要删除之前的动态区,可以调用以下接口
//        // 通常如果动态区的位置或大小没有发生改变,不用删除
//        screen.deleteAllDynamic();
//
//        // 更新动态区
//        screen.writeDynamic(dynRule, dAreaContent);
//        Thread.sleep(15000);
//
//        //
//        // 下面模拟再次更新动态区
//        page = new TextBxPage("再次尝试");
//        TextBxPage page2 = new TextBxPage("成功");
//
//        dAreaContent.clearPages();
//        dAreaContent.addPage(page);
//        dAreaContent.addPage(page2);
//
//        // 更新动态区
//        screen.writeDynamic(dynRule, dAreaContent);
        //
        // 继开与控制器之间的链接
        screen.disconnect();
    }
}