文档变更历史
- 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 发布方: 设备
- 包含派工ID和班次信息
- 包含当前派工单的生产数量和运行时间
- 以派工单为最小生产单位,更换派工单时重置生产数量,累计运行时间
- 设备状态说明
状态代码 | 状态名称 | 说明 |
---|---|---|
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
- 排程包含设备一天或者多天的排程数据
- 设备生产按照排程顺序执行
- 当发布新排程时会重新推送所有排程数据(不包含当前正在生产的工单)
- 设备接收排程时不需要判断设备生产状态,随时可以接收排程,并替换以前的排程列表,此操作不影响当前正在生产的工单(当前存在问题: 设备生产时无法下发生产排程)
- 当需要紧急插单时通过消息类型为插单的接口通知设备换单,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
- 通知设备换班
- 设备收到换班信息后切换设备的当前员工ID和班次
- 设备显示新的班次和员工ID
- 换班暂时不做强制处理,后续根据客户需求改进
数据结构
{
"id": 1,
"datetime": "2024-01-09 15:32:23",
"msgType": 3,
"data": {
"shiftId": 2, //班次id
"shiftName": "白班", //班次名称
"userNo": "员工id",
"userName": "员工姓名"
}
}
故障原因
消息类型: 4 发布方: MES
- 在MES中定义的故障原因,设备获取并展示在故障原因选择的按钮中
- 故障原因Id以数字1,2,3,4...等排列
- 88不需要定义,依然保持以前的含义: 未选择故障原因
数据格式
{
"id": 1,
"datetime": "2024-01-09 15:32:23",
"msgType": 4,
"data": [
{
"faultId": 1, //故障原因id
"faultName": "故障名称" //故障名称
}
]
}
弹窗接口
消息类型: 5 发布方: MES
- 通知设备展示弹窗信息
数据结构
{
"id": 1,
"datetime": "2024-01-09 15:32:23",
"msgType": 5,
"data":
{
"messageContent": "消息内容" , //消息内容,
"dealytime": 10 // 延迟时间,单位: 分钟,0表示立即弹窗
}
}
关机接口
消息类型: 6 发布方: MES
- 通知设备关机,可以指定延迟时间
- 到时候直接控制机器停机
数据结构
{
"id": 1,
"datetime": "2024-01-09 15:32:23",
"msgType": 6,
"data":
{
"messageContent": "消息内容" , //消息名称,
"dealytime": 10 // "关机延迟时间",单位: 分钟,0表示立即关机
}
}
插单接口
消息类型: 7 发布方: MES
- 通知设备需要插单
- 倒计时结束后关机
- 上发设备状态为: 关机
- 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
- 发送巡检记录(多行数据),数据倒叙排列
- 设备保留最后一次发送的检验列表,每次接收新数据时,清空原有的列表
- 设备收到巡检记录后将第一条记录的检验人, 显示在触摸屏首页的品检字段
数据结构
{
"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
- 发送设备的平均效率
- 平均效率计算公式: 派工单已生产数量/派工单累计时长/标准产能(每分钟额定产量)
- MES系统接收到设备发送的生产数据,计算后回发平均效率给设备
- 注意: 如果断网,会导致无法正确显示平均效率
数据结构
{
"id": 1234242,
"datetime": "2024-08-20 15:32:23",
"msgType": 9,
"data":
{
"avgEff": 0.8 //平局效率 : 派工单已生产数量/派工单累计时长/标准产能(每分钟额定产量)
}
}
接收成功接口
- 双方接收到信息后(除了类型为100的消息),发送接收成功消息
- 此接口为通用接口,用于接收成功后,向对方发送接收成功消息
- 收到此接口信息不需要执行回复确认
消息类型: 100 发布方: 双方
数据结构
{
"id": 1,
"datetime": "2024-01-09 15:32:23",
"msgType": 100,
"data":
{
"sourceId": 1, //消息来源id
"result": true //接收结果,true表示接收成功,false表示接收失败,一般都是true
}
}
心跳连接接口
- 由MES主动发起,检查双方在线状态的接口,定时发起,设备方收到后,返回接收成功信息
- 心跳连接数据包包含服务器时间,用于设备对时
- 设备方无需发起心跳连接
消息类型: 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
}
}