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#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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 });
}
}
}