文档变更历史

  • 2024-01-25: 修改心跳包格式,增加对时功能
  • 2024-04-22: 修改生产排程格式(msgType = 2),增加已完成数量(completedQty)
  • 2024-04-25: 修改设备数据上报的格式
  • 2024-04-26: 生产排程中增加了一个新字段: className
  • 2024-04-29: 设备数据上报中增加一个新字段 : userNo
  • 2024-05-14: 设备状态修改为三种: 待机,运行,停机
  • 2024-05-14: 增加接口对应的流程图
  • 2024-05-14: 设备上报数据接口增加新字段: 目标产量: planQty
  • 2024-07-31: 发布生成排程时增加新字段: moldTypes : 模具类型
  • 2024-08-05: 发布生成排程时增加新字段: remark: 备注
  • 2024-08-20: 增加巡检记录接口
  • 2024-09-27: 增加平均效率接口
  • 2025-04-07:换班接口增加字段: 班次时间: shiftDate
  • 2025-08-05:生产排程新增一个字段: 模具穴数: cavityNumber ,实际的生产数量等于 计数器次数*模具穴数
  • 2025-09-02:生成数据新增 5 个字段: difine1 到 difine5 ,方便日后扩展 ,difine1 : 用来表示设备状态 0 : 手动 , 1: 自动

柏盛设备与 MES 数据接口方案

  • 触摸屏与 MES 端交互采用 MQTT 协议
  • 为了保证数据发送成功,对于发送的 MES 请求需要及时回复成功收到的信息
  • 发送方的每条命令都有唯一的 Id 号,以便回复成功收到信息
  • 接收方收到推送的命令后回复该 Id 号确认收到
  • 未能在规定的时间内收到回复视为命令发送失败,需要重新发送
  • MES 通过心跳包检查双方在线状态,设备也可以通过定时收到的心跳包,判断 MES 的在线状态 ,心跳包同时包含对时功能

测试 MQTT 服务器地址

  http://app.haobitou.cn:8883
  用户名:mqtt_bs
  密码:Opens$#^(%oft888!!!

发布和订阅 Topic 的规则

  • 设备发布数据接口: bs/device/{deviceid}/message
  • MES 下发数据的接口: bs/mes/{deviceid}/message
  • deviceId 代表设备编码,不同的设备对应不同的设备编码
  • 统一通过 message 主题订阅和发布,通过不同消息类型区分数据内容
  • 数据采用 json 格式,首字母小写
  • 数据格式

    {
      "id": 1, //唯一Id,每次发布的id都是唯一的
      "datetime": "2024-01-09 12:23:33", //消息发布的时间 ,格式: yyyy-mm-dd hh:mm:ss
      "msgType": 1, //消息类型,不同的消息类型对应的data的数据结构会有所不同
      "data": {
        //消息包含的数据,不同的消息类型对应的数据接口会有不同,后面会根据消息类型分别定义
        "key1": "value1",
        "key2": "value2"
      }
    }
    
  • 由于接口已经包含了设备编码,发布的数据中可以不包含设备编码

数据交互的规则

sequenceDiagram participant 设备 participant MQTT Broker participant MES 设备->>MQTT Broker: 订阅MES系统发布主题bs/mes/{deviceid}/message MES->>MQTT Broker: 订阅设备发布主题bs/device/{deviceid}/message 设备->>MQTT Broker: 设备发布数据 MQTT Broker-->>MES: 推送给MES系统 MES->>MQTT Broker: 返回接收成功信息 MQTT Broker-->>设备: 推送接收成功信息 MES->>MQTT Broker: MES发布数据 MQTT Broker-->>设备: 推送给设备 设备->>MQTT Broker: 返回接收成功信息 MQTT Broker-->>MES: 推送接收成功信息 MES->>MQTT Broker: 发布心跳包 MQTT Broker-->>设备: 推送心跳包 设备->>MQTT Broker: 返回接收成功信息 MQTT Broker-->>MES: 推送接收成功信息

消息类型

消息代码 消息名称 数据格式 发布方 说明
1 生产数据 对象 设备 设备发布的生产数据,包含产量,设备状态,停机时间和停机原因,数据是数组格式
2 生产排程 数组 MES MES 系统发布的生产排程
3 换班信息 对象 MES MES 系统发布的换班信息,包含班次,换班时间
4 故障原因 数组 MES MES 系统定义的故障原因,设备订阅后显示停机原因
5 弹窗消息 对象 MES 通知设备显示特定的信息
6 关机 对象 MES 通知设备关机,可以定义延迟时间
7 插单 对象 MES 通知设备立刻更换工单,设备接收插单指令后需要停止生产,可以设置倒计时
8 巡检 对象 MES 巡检,发送检验人给设备
9 平均效率 对象 MES 计算平均效率,发送到设备
100 接收成功标志 对象 双方 消息接收成功后,发布确认收到信息,双方接收成功时都需要回复此类型的消息确认收到,此类型消息不需要回复
101 心跳包 对象 MES 由 MES 系统主动发起心跳包,设备收到后回复消息类型为 100 的消息确认收到,通过心跳包确认双方在线, 并增加了对时功能 心跳包由 MES 系统单方面发起

发布生产数据

消息类型: 1
发布方: 设备
  1. 包含派工 ID 和班次信息
  2. 包含当前派工单的生产数量和运行时间
  3. 以派工单为最小生产单位,更换派工单时重置生产数量,累计运行时间
  4. 设备状态说明
状态代码 状态名称 说明
1 运行 设备正常运行时的状态,此时上报的数据应包含派工单 ID 和生产数量,同时累计运行时间
2 待机 设备处于未生产状态,此时未分配派工单
3 停机 设备运行时中途非正常停机,需要配合故障原因和故障停机时间

数据格式

{
  "iD": "1756533662396",
  "dateTime": "2025-08-30 14:01:00",
  "msgType": "1",
  "data": [
    {
      "UpdateTime": "2025-08-30 14:01:00",
      "partNo": "",
      "mID": "1756533661005",
      "proId": "",
      "classId": "",
      "userNo": "5000001010",
      "deviceStatus": "2",
      "proQty": "0",
      "planQty": "0",
      "runtime": "0",
      "downtime": "458927",
      "errReason": "未排单/转班",
        "define1": "",   //新增字段, 设备运行状态 0: 手动 ,  1: 自动 , 为空: 表示未知
      "define2": "",    //备用字段
      "define3": "",    //备用字段
      "define4": "",    //备用字段
      "define5": ""    //备用字段
    }
  ]
}

生产流程

graph TD; A[设备开机] --> C{是否已分配派工单}; C -->|无派工单| E[等待生产,设备状态: 待机]; E --> G[通过触摸屏确认当前排第一位的派工单]; G --> |向设备写入派工单号和计划数量和已完成数量| F[按派工单生产]; C -->|有未完成的派工单| F; F --> D[设备状态: 运行]; D --> |生产过程| I{是否发生故障}; I --> |是,故障停机| L[设备状态:停机,故障码: 88]; I --> |否| O[正常生产]; L --> N[解决故障后选择对应的故障码]; N --> |恢复生产| N1[设备状态: 运行]; N1 --> O[正常生产]; O --> P[发送生产数据]; P --> |完成计划数量后,生产完成| Q[控制设备停机,清空设备派工单和已完成数量]; Q --> R[上发设备状态: 停机]; R --> S[触摸屏确认选择下一个派工单]; S --> F;

发布生产排程

消息类型: 2
发布方: MES
  1. 排程包含设备一天或者多天的排程数据
  2. 设备生产按照排程顺序执行
  3. 当发布新排程时会重新推送所有排程数据(不包含当前正在生产的工单)
  4. 设备接收排程时不需要判断设备生产状态,随时可以接收排程,并替换以前的排程列表,此操作不影响当前正在生产的工单(当前存在问题: 设备生产时无法下发生产排程)
  5. 当需要紧急插单时通过消息类型为插单的接口通知设备换单,MES 接收到设备停机指令后下发新的排程列表(见插单接口说明)

数据格式

{
    "id": 1,
    "datetime": "2024-01-09 15:32:23",
    "msgType": 2,
    "data": [ {
                "no": 1, //顺序号
                "proId":"派工id", //派工id(派工单下表ID号)
                "classId":"1", //班次Id,
                "className":"A班" , //班次名称
                "planDate":"2024-01-09", //开始生产日期
                "workOrder":"工单号",
                "partNo": "产品编码",
                "partName": "产品名称",
                "Unit":"数量单位",
                "planQty": 100, //计划数量
                "completedQty": 50, //已完成数量
                "capacity": 100, //设备产能,单位: 数量/分钟,
                "moldTypes": "模具类型" , //模具类型
        "cavityNumber": "模具穴数", //模具的穴数 ,实际的生产数量等于 计数器的计数次数乘以模具穴数
                "remark": "备注"  //备注,字符串用于展示额外的信息,可能较长,界面需要多行显示
            },
            },{
                ... //另外一个派工单
            }]
    }
}

流程图

graph TD; A[MES下发派工单列表] --> B[设备接收派工单列表]; B --> C[按派工单顺序安排生产]; C --> D[正常生产];

换班接口

消息类型: 3
发布方: MES
  1. 通知设备换班
  2. 设备收到换班信息后切换设备的当前员工 ID 和班次
  3. 设备显示新的班次和员工 ID
  4. 员工操作选单界面时,如果当前的班次 ID(shiftId)和班次时间{shiftDate}与派工单上的班次 ID(classId)和班次时间(planDate)不一致,则不能选择该派工单

数据结构


{
    "id": 1,
    "datetime": "2024-01-09 15:32:23",
    "msgType": 3,
    "data": {
            "shiftId": 2, //班次id
            "shiftName": "白班", //班次名称
            "userNo": "员工id",
            "userName": "员工姓名" ,
      "shiftDate" "2024-04-07" //班次日期,格式: yyyy-mm-dd
        }
}

故障原因

消息类型: 4
发布方: MES
  1. 在 MES 中定义的故障原因,设备获取并展示在故障原因选择的按钮中
  2. 故障原因 Id 以数字 1,2,3,4...等排列
  3. 88 不需要定义,依然保持以前的含义: 未选择故障原因

数据格式

{
  "id": 1,
  "datetime": "2024-01-09 15:32:23",
  "msgType": 4,
  "data": [
    {
      "faultId": 1, //故障原因id
      "faultName": "故障名称" //故障名称
    }
  ]
}

弹窗接口

消息类型: 5
发布方: MES
  1. 通知设备展示弹窗信息

数据结构

{
  "id": 1,
  "datetime": "2024-01-09 15:32:23",
  "msgType": 5,
  "data": {
    "messageContent": "消息内容", //消息内容,
    "dealytime": 10 // 延迟时间,单位: 分钟,0表示立即弹窗
  }
}

关机接口

消息类型: 6
发布方: MES
  1. 通知设备关机,可以指定延迟时间
  2. 到时候直接控制机器停机

数据结构

{
  "id": 1,
  "datetime": "2024-01-09 15:32:23",
  "msgType": 6,
  "data": {
    "messageContent": "消息内容", //消息名称,
    "dealytime": 10 // "关机延迟时间",单位: 分钟,0表示立即关机
  }
}

插单接口

消息类型: 7
发布方: MES
  1. 通知设备需要插单
  2. 倒计时结束后关机
  3. 上发设备状态为: 关机
  4. MES 收到设备状态为关机后下发新的生产排程

流程

graph TD; A[正常生产] --> |需要插单| B[MES下发插单倒计时关机命令]; B --> |倒计时结束| C[设备关机,清空派工单和已完成数量]; C --> D[上发MES,设备状态: 关机]; D --> |MES接收到设备关机状态| E[发送新的生产排程]; E --> F[按照新的生产排程从第一个派工单开始顺序生产];

数据结构

{
  "id": 1,
  "datetime": "2024-01-09 15:32:23",
  "msgType": 7,
  "data": {
    "messageContent": "消息内容", //消息名称,
    "dealytime": 10 // "换单延迟时间",单位: 分钟,0表示立即换单
  }
}

巡检记录

消息类型: 8
发布方: MES
  1. 发送巡检记录(多行数据),数据倒叙排列
  2. 设备保留最后一次发送的检验列表,每次接收新数据时,清空原有的列表
  3. 设备收到巡检记录后将第一条记录的检验人, 显示在触摸屏首页的品检字段

数据结构

{
  "id": 1234242,
  "datetime": "2024-08-20 15:32:23",
  "msgType": 8,
  "data": [
    {
      "userNo": "A001", //检验人代码
      "userName": "名称1", //检验人名称
      "testTime": "2024-08-20 17:32:23" //检验时间,最新的检验时间,记录按照倒序排列
    },
    {
      "userNo": "A002", //用户代码
      "userName": "名称2", //用户名称
      "testTime": "2024-08-20 15:12:08" //检验时间,
    },
    {
      "userNo": "A003", //用户代码
      "userName": "名称3", //用户名称
      "testTime": "2024-08-20 13:11:30" //检验时间
    }
  ]
}

平均效率接口

消息类型: 9
  发布方: MES
  1. 发送设备的平均效率
  2. 平均效率计算公式: 派工单已生产数量/派工单累计时长/标准产能(每分钟额定产量)
  3. MES 系统接收到设备发送的生产数据,计算后回发平均效率给设备
  4. 注意: 如果断网,会导致无法正确显示平均效率

数据结构

{
  "id": 1234242,
  "datetime": "2024-08-20 15:32:23",
  "msgType": 9,
  "data": {
    "avgEff": 0.8 //平局效率 : 派工单已生产数量/派工单累计时长/标准产能(每分钟额定产量)
  }
}

接收成功接口

  1. 双方接收到信息后(除了类型为 100 的消息),发送接收成功消息
  2. 此接口为通用接口,用于接收成功后,向对方发送接收成功消息
  3. 收到此接口信息不需要执行回复确认
消息类型: 100
发布方: 双方

数据结构

{
  "id": 1,
  "datetime": "2024-01-09 15:32:23",
  "msgType": 100,
  "data": {
    "sourceId": 1, //消息来源id
    "result": true //接收结果,true表示接收成功,false表示接收失败,一般都是true
  }
}

心跳连接接口

  1. 由 MES 主动发起,检查双方在线状态的接口,定时发起,设备方收到后,返回接收成功信息
  2. 心跳连接数据包包含服务器时间,用于设备对时
  3. 设备方无需发起心跳连接
消息类型: 101
发布方: MES

数据结构

{
  "id": 1,
  "datetime": "2024-01-09 15:32:23",
  "msgType": 101,
  "data": {
    "year": 2024,
    "month": 1,
    "day": 9,
    "hour": 15,
    "minute": 32,
    "second": 23
  }
}

results matching ""

    No results matching ""