前言:项目背景情况介绍
公司有意开发一套适合拌合楼的内部管理系统给到客户使用,接触过一家拌合楼行业内号称标杆的企业,去过参观学习的都觉得他们软件好用,但是从软件开发角度看,就是crud+钉钉机器人+无人值守。虽然公司没有正式立项要我们部门牵头开发这套软件,但自己立个flag打算开始动手写写,至少解决一些技术上的难点。如果有做过这块的朋友,希望能够给于指导了。
需要做的技术上的一些储备工作:
一、前端和后端开发技术
前端打开采用vue3,后端用.net 8,数据库用msyql了
二、地磅数据的获取
通过串口获取地磅的数据,不同的地磅获取数据的规范不一样,需要积累一个库。目前了解到市面上主流的地磅有两种数据获取方式:模式一是连续发送,换句话说就是一直向外发数据,接收到数据后按照协议规则剥离出你要的数据就可以。模式二种是应答式,就是按照协议格式发送一组字符串或是16进制字符串,称提给你回应,按照规则你剥离出你要的数据就可以了。
1. C#遍历计算机所有的串口设备
using System.IO.Ports;///
/// 获取本机所有端口
///
///
public static List loadComPorts()
{
List portsList = new List();
string[] ports = SerialPort.GetPortNames();
if (ports != null)
portsList = ports.ToList();
return portsList;
}
2. 使用串口,通过定时器定时轮询串口是否接收到数据
//PORT 设置的参数名称为空
if (string.IsNullOrEmpty(PortName))
{
logger.error(DateTime.Now.ToString(“mm:ss”) + “地磅端口名称错误” + PortName );
return;
}//检查参数,如果没有设置则设置为默认值
if (String.IsNullOrEmpty(Vars.baud)) Vars.baud = “9600”;
if (String.IsNullOrEmpty(Vars.dsite)) Vars.baud = “8”;
if (String.IsNullOrEmpty(Vars.ssite)) Vars.baud = “1”;
if (String.IsNullOrEmpty(Vars.parity)) Vars.baud = “无”;if (!serialPort1.IsOpen)
{
try
{
serialPort1.PortName = GlobalVars.Port;
serialPort1.BaudRate = Convert.ToInt32(Vars.baud);
serialPort1.DataBits = Convert.ToInt32(lVars.dsite);
//停止位字符串转换为控件接受的格式
string tzw = Vars.tzw;
if (tzw.Equals(“1”))
serialPort1.StopBits = StopBits.One;
else if (tzw.Equals(“1.5”))
serialPort1.StopBits = StopBits.OnePointFive;
else if (tzw.Equals(“2”))
serialPort1.StopBits = StopBits.Two;
//校验位字符串转换为控件接受的格式
string jyw = GlobalVars.parity;
if (jyw == “无”)
serialPort1.Parity = Parity.None;
else if (jyw == “奇校验”)
serialPort1.Parity = Parity.Odd;
else if (jyw == “偶校验”)
serialPort1.Parity = Parity.Even;
serialPort1.Open();
}catch (Exception exp)
{
LogHelper.Err("打开端口失败: " + exp.Message);
}
}
else
{
SetPontStatus("已打开端口 " + serialPort1.PortName, Color.Green);
}
3. SerialPort 控件接收数据
private string _recv_string = “”;
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
int idx_last = _recv_string.LastIndexOf("");
if (idx_last == -1) return;
string leftstr = _recv_string.Substring(0, idx_last + 1);
_recv_string = _recv_string.Substring(idx_last + 1);
if (!leftstr.EndsWith("")) return;
int _idx = leftstr.LastIndexOf("+");
if (_idx == -1) return;
string lastitem = leftstr.Substring(_idx + 1, leftstr.Length - _idx - 5);
leftstr = "";decimal weight_value = StringUtil.parseDecimal(lastitem);
}
4. 接收到的数据格式如下:
5. 数据处理:
准备一个字符串,地磅每次传输的数据要追加到字符串后面,然后尝试去除最后一个完整的数据单元,并且计算出来实际公斤数。如果地磅设置了按吨位传输,则计算出来的数据是吨位数。
三、无人值守监控过磅的过程
1. 所需要的硬件设备:
上图是上海耀华地磅我找到的解决方案图。
2. 无人值守需要用到的技术
a. 地磅自动读取数据,前面单独列出来了。
b. 车牌识别
c. 调用视频监控自动拍照并保存到电脑
d. ID 读卡,这个应该是用来识别车辆信息,整个过帮过程既然识别了车牌,那么应该可以用车牌号作为唯一的索引来后驱所有的数据。
e. LED大屏幕数据显示。
f. 红绿灯信号以及道闸抬起的控制。这个应该是用来控制车辆位置的,可以通过其他一些技巧性的解决车辆定位,比如提前找好最佳位置,树立一个牌子,需要司机去按按钮,完成拍照,车牌识别。这样地感线圈等设备也都不需要了,节约成本。
3. 无人值守获取数据:
车牌信息、车辆皮重、毛重,计算出装货净重,每台车应该是进来的时候称一次重,装或者卸货后称一次重, 两者差位净重。两次装重,前、后、左、右以及车牌识别保存下来的图片。操作时间。
4. 单据打印
根据业务时间来决定是否需要打印了,也可以生成一个二维码,司机扫描和保存这个二维码就可以调出原本需要打印的单据。
总结: 闭门造车
上面所写的,都是自己根据实际工作和外部查到自己想出来,还没有实际到拌合楼进行过调研,也只是通过同事支言片语判断无人值守是拌合楼管理迫切比较需要的。