You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

352 lines
15 KiB
C#

1 year ago
using Mesnac.Action.ChemicalWeighing.Barrel;
using Mesnac.Action.ChemicalWeighing.Entity.material;
using Mesnac.Action.ChemicalWeighing.MaterialManage;
using Mesnac.Action.ChemicalWeighing.Product.XlPlan;
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Mesnac.Action.ChemicalWeighing
{
public class ScanControl
{
Dictionary<int,string> dicCom1=new Dictionary<int, string>();
Dictionary<int, string> dicCom3 = new Dictionary<int, string>();//COM3缓存
Dictionary<int, string> dicCom5 = new Dictionary<int, string>();//COM5缓存
public static string scanStr { get; set; }
//public string portName = "COM3";
/// <summary>
/// 实例化串行端口资源_COM3
/// </summary>
public void InstanceSerialPort3(string portName)
{
//实例化串行端口
SerialPort serialPort = new SerialPort();
//端口名 注:因为使用的是USB转RS232 所以去设备管理器中查看一下虚拟com口的名字
serialPort.PortName = portName;
//波特率
serialPort.BaudRate = 9600;
//奇偶校验
serialPort.Parity = Parity.None;
//停止位
serialPort.StopBits = StopBits.One;
//数据位
serialPort.DataBits = 8;
//忽略null字节
serialPort.DiscardNull = true;
//接收事件
serialPort.DataReceived += serialPort_DataReceived3;
//开启串口
serialPort.Open();
}
/// <summary>
/// 实例化串行端口资源_COM5
/// </summary>
public void InstanceSerialPort5(string portName)
{
//实例化串行端口
SerialPort serialPort = new SerialPort();
//端口名 注:因为使用的是USB转RS232 所以去设备管理器中查看一下虚拟com口的名字
serialPort.PortName = portName;
//波特率
serialPort.BaudRate = 9600;
//奇偶校验
serialPort.Parity = Parity.None;
//停止位
serialPort.StopBits = StopBits.One;
//数据位
serialPort.DataBits = 8;
//忽略null字节
serialPort.DiscardNull = true;
//接收事件
serialPort.DataReceived += serialPort_DataReceived5;
//开启串口
serialPort.Open();
}
/// <summary>
/// 接收数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void serialPort_DataReceived3(object sender, SerialDataReceivedEventArgs e)
{
try
{
//防止数据接收不完整 线程sleep(1000)
System.Threading.Thread.Sleep(1000);
SerialPort serialPort = (SerialPort)sender;
//开启接收数据线程
Thread threadReceiveSub = new Thread(new ParameterizedThreadStart(ReceiveData3));
threadReceiveSub.Start(serialPort);
}
catch (Exception ex)
{
throw;
}
}
/// <summary>
/// 接收数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void serialPort_DataReceived5(object sender, SerialDataReceivedEventArgs e)
{
try
{
//防止数据接收不完整 线程sleep(1000)
System.Threading.Thread.Sleep(1000);
SerialPort serialPort = (SerialPort)sender;
//开启接收数据线程
Thread threadReceiveSub = new Thread(new ParameterizedThreadStart(ReceiveData5));
threadReceiveSub.Start(serialPort);
}
catch (Exception ex)
{
throw;
}
}
private void ReceiveData3(object serialPortobj)
{
try
{
SerialPort serialPort = (SerialPort)serialPortobj;
string code = serialPort.ReadExisting();
if (string.IsNullOrEmpty(code))
{
MessageBox.Show("未扫描到条码!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
SetBarCodeState(code);
}
catch (Exception ex)
{
throw;
}
}
/// <summary>
/// 小料 称量结束 绑定料桶
/// </summary>
/// <param name="barcode">桶条码</param>
private static void SetBarCodeState(string barCode)
{
//验证该桶是否绑定了物料,绑定弹框提醒
if (BarrelHelper.IsBindBarrel(barCode))
{
MessageBox.Show("该桶已经绑定物料!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
//检查检量称是否称量完成
if (BasePlcHelper.Instance.plt_Read1Jc.NowValue.ToInt() == 1)
{
var down = PlanHelper.GetExecPlan().FirstOrDefault(d => d.Plan_State == 3);
//绑定桶
int tcheckWeight = BasePlcHelper.Instance.plt_TCheck_Weight.NowValue.ToInt();//检量秤重量
bool bind= BarrelHelper.BindBarrel(barCode, down.MaterialID, down.Material_name, tcheckWeight);
if (bind)
{
MessageBox.Show("物料绑定桶失败!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
int tcheckBatch = BasePlcHelper.Instance.plt_Batch.NowValue.ToInt();//当前执行的批次
int plan_Serial = down.Plan_Num;//计划的批次
double totalError = down.Total_Error;//当前批次设定总误差
int batch = down.Plan_Num - tcheckBatch;//剩余批次
double error = tcheckWeight - down.Total_Weight;//实际误差
double total_Weight = down.Total_Weight + tcheckWeight;//重量累加
double total_Error = down.Total_Error + error;//误差累加
if (-totalError <= error && error <= totalError)//在误差之内
{
total_Weight = total_Weight / 1000;
total_Error = total_Error / 1000;
if (batch == 0) //完成
{
PlanHelper.UpdatePlanCompletedQuantity(down.Plan_Id, tcheckBatch, 8, DateTime.Now, total_Weight, total_Error);
//判断上位机判断当前值与配方总重满足要求时置“2”
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.plt_Read1Jc, new object[] { 2 });
}
else
{
PlanHelper.UpdatePlanCompletedQuantity(down.Plan_Id, tcheckBatch, total_Weight, total_Error);
//判断上位机判断当前值与配方总重满足要求时置“2”
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.plt_Read1Jc, new object[] { 2 });
}
}
else
{
total_Weight = total_Weight / 1000;
total_Error = total_Error / 1000;
if (batch == 0)//完成
{
PlanHelper.UpdatePlanCompletedQuantity(down.Plan_Id, tcheckBatch, 8, DateTime.Now, total_Weight, total_Error);
//PlanHelper.AddPlanReport(down, 0, tcheckBatch, tcheckWeight, error);
}
else
{
PlanHelper.UpdatePlanCompletedQuantity(down.Plan_Id, tcheckBatch, total_Weight, total_Error);
//PlanHelper.AddPlanReport(down, 0, tcheckBatch, tcheckWeight, error);
}
//6检量超差记录
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.plt_Read1Jc, new object[] { 6 });
}
}
#region MyRegion
//MaterialBarCode mater = MaterialHelper.QueryMaterBarCode(barCode);
//switch (mater.Bin_Serial)
//{
// case 1:
// BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.plt_Station1_Barcode1, new object[] { state });
// break;
// case 2:
// BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.plt_Station1_Barcode2, new object[] { state });
// break;
// case 3:
// BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.plt_Station2_Barcode3, new object[] { state });
// break;
// case 4:
// BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.plt_Station2_Barcode4, new object[] { state });
// break;
// case 5:
// BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.plt_Station3_Barcode5, new object[] { state });
// break;
// case 6:
// BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.plt_Station3_Barcode6, new object[] { state });
// break;
// case 7:
// BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.plt_Station4_Barcode7, new object[] { state });
// break;
// case 8:
// BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.plt_Station4_Barcode8, new object[] { state });
// break;
// case 9:
// BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.plt_Station5_Barcode9, new object[] { state });
// break;
// case 10:
// BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.plt_Station5_Barcode10, new object[] { state });
// break;
// case 11:
// BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.plt_Station6_Barcode11, new object[] { state });
// break;
// case 12:
// BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.plt_Station6_Barcode12, new object[] { state });
// break;
// case 13:
// BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.plt_Station7_Barcode13, new object[] { state });
// break;
// case 14:
// BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.plt_Station7_Barcode14, new object[] { state });
// break;
// case 15:
// BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.plt_Station8_Barcode15, new object[] { state });
// break;
// case 16:
// BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.plt_Station8_Barcode16, new object[] { state });
// break;
// case 17:
// BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.plt_Station9_Barcode17, new object[] { state });
// break;
// case 18:
// BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.plt_Station9_Barcode18, new object[] { state });
// break;
// case 19:
// BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.plt_Station10_Barcode19, new object[] { state });
// break;
// case 20:
// BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.plt_Station10_Barcode20, new object[] { state });
// break;
// case 21:
// BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.plt_Station11_Barcode21, new object[] { state });
// break;
// case 22:
// BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.plt_Station11_Barcode22, new object[] { state });
// break;
// case 23:
// BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.plt_Station12_Barcode23, new object[] { state });
// break;
// case 24:
// BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.plt_Station12_Barcode24, new object[] { state });
// break;
// case 25:
// BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.plt_Station13_Barcode25, new object[] { state });
// break;
// case 26:
// BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.plt_Station13_Barcode26, new object[] { state });
// break;
// case 27:
// BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.plt_Station14_Barcode27, new object[] { state });
// break;
// case 28:
// BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.plt_Station14_Barcode28, new object[] { state });
// break;
//}
#endregion
}
/// <summary>
/// 溶剂
/// </summary>
/// <param name="serialPortobj"></param>
private void ReceiveData5(object serialPortobj)
{
try
{
SerialPort serialPort = (SerialPort)serialPortobj;
string str = serialPort.ReadExisting();
if (str == null)
{
SetSolventBarCodeState(0);
return;
}
if (dicCom5.Count == 0)
{
dicCom5.Add(1, str);
}
else
{
string barcode = dicCom5.SingleOrDefault(d => d.Key == 1).Value;
if (str == barcode)
{
SetSolventBarCodeState(1);
}
else
{
SetSolventBarCodeState(2);
}
dicCom5.Clear();
}
}
catch (Exception ex)
{
throw;
}
}
/// <summary>
/// 溶剂扫码
/// </summary>
/// <param name="state"></param>
private static void SetSolventBarCodeState(int state)
{
BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.plt_solvent_BarCode, new object[] { state });
}
}
}