文档变更历史

  • 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: 增加平均效率接口

柏盛设备与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": "1730444104539",
  "msgType": "2",
  "dateTime": "2024-11-01 14:55:04",
  "data": [
    {
      "no": "0",
      "proId": "151",
      "classId": "1",
      "className": "12H白班",
      "planDate": "2024-11-01 00:00:00",
      "workOrder": "TG30089KA98-X4",
      "partNo": "30089KA98-X4",
      "partName": "30089KA98-X4铁钩 材质: Q195",
      "unit": "个",
      "planQty": "36000.00000000",
      "completedQty": "0",
      "capacity": "75.00000000",
      "moldTypes": null,
      "remark": ""
    },
    {
      "no": "1",
      "proId": "154",
      "classId": "1",
      "className": "12H白班",
      "planDate": "2024-11-01 00:00:00",
      "workOrder": "AEO000710",
      "partNo": "530PRO3685E",
      "partName": "铁钩M01 材质: 12mm铁丝",
      "unit": "个",
      "planQty": "10000.00000000",
      "completedQty": "0",
      "capacity": "75.00000000",
      "moldTypes": null,
      "remark": ""
    },
    {
      "no": "2",
      "proId": "155",
      "classId": "1",
      "className": "12H白班",
      "planDate": "2024-11-01 00:00:00",
      "workOrder": "sad2321",
      "partNo": "530PRO3685E",
      "partName": "铁钩M01 材质: 12mm铁丝",
      "unit": "个",
      "planQty": "10000.00000000",
      "completedQty": "0",
      "capacity": "75.00000000",
      "moldTypes": null,
      "remark": ""
    },
    {
      "no": "3",
      "proId": "156",
      "classId": "1",
      "className": "12H白班",
      "planDate": "2024-11-01 00:00:00",
      "workOrder": "TTWZ003",
      "partNo": "27089KA35",
      "partName": "27089铁钩 材质: 12mm",
      "unit": "个",
      "planQty": "10000.00000000",
      "completedQty": "0",
      "capacity": "75.00000000",
      "moldTypes": null,
      "remark": ""
    },
    {
      "no": "4",
      "proId": "157",
      "classId": "1",
      "className": "12H白班",
      "planDate": "2024-11-01 00:00:00",
      "workOrder": "TG3100",
      "partNo": "32105KA98",
      "partName": "32105KA98铁钩 材质: Q195",
      "unit": "个",
      "planQty": "10000.00000000",
      "completedQty": "0",
      "capacity": "0",
      "moldTypes": null,
      "remark": ""
    },
    {
      "no": "5",
      "proId": "158",
      "classId": "1",
      "className": "12H白班",
      "planDate": "2024-11-01 00:00:00",
      "workOrder": "28095KA35TG",
      "partNo": "28095KA35",
      "partName": "28095KA35铁钩 材质: Q195",
      "unit": "个",
      "planQty": "10000.00000000",
      "completedQty": "0",
      "capacity": "75.00000000",
      "moldTypes": null,
      "remark": ""
    }
  ]
}

生产流程

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": "模具类型" , //模具类型 
                "remark": "备注"  //备注,字符串用于展示额外的信息,可能较长,界面需要多行显示
            },
            },{
                ... //另外一个派工单
            }
        ]
    }
}

流程图

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

换班接口

消息类型: 3  
发布方: MES  
  1. 通知设备换班
  2. 设备收到换班信息后切换设备的当前员工ID和班次
  3. 设备显示新的班次和员工ID
  4. 换班暂时不做强制处理,后续根据客户需求改进

数据结构


{
    "id": 1,
    "datetime": "2024-01-09 15:32:23",
    "msgType": 3,
    "data": {            
            "shiftId": 2, //班次id
            "shiftName": "白班", //班次名称
            "userNo": "员工id",  
            "userName": "员工姓名" 
        }
}

故障原因

消息类型: 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 ""