change-灌注

dev
liuwf 1 year ago
parent b6cbd8dde9
commit 9cd01c9574

@ -13,7 +13,7 @@ namespace Admin.Core.Model
[SugarTable("PERFUSION_RECORD", "AUCMA_SCADA")]
public class Perfusion_Alarm
{
/// <summary>
/// <summary>
/// 灌注
/// </summary>
[SugarColumn(ColumnName = "OBJ_ID", IsIdentity = true, IsPrimaryKey = true)]
@ -28,7 +28,7 @@ namespace Admin.Core.Model
/// 报警状态码
/// </summary>
[SugarColumn(ColumnName = "PERFUSION_STATUS")]
public int PerfusionStatus { get; set; }
public short PerfusionStatus { get; set; }
/// <summary>
/// 报警信息
/// </summary>

@ -11,7 +11,7 @@ namespace Admin.Core.Model.Model_New
/// 灌注设备状态表
/// </summary>
[SugarTable("PERFUSION_DEVICESTATUS", "AUCMA_SCADA")]
public class Perfusion_DeviceStatus
public class Perfusion_DeviceStatus
{
/// <summary>
/// 主键

@ -11,7 +11,7 @@ namespace Admin.Core.Model
/// 灌注记录表
/// </summary>
[SugarTable("PERFUSION_RECORD", "AUCMA_SCADA")]
public class Perfusion_Record
public class Perfusion_Record
{
/// <summary>
/// 主键
@ -19,35 +19,11 @@ namespace Admin.Core.Model
[SugarColumn(ColumnName = "OBJ_ID", IsIdentity = true, IsPrimaryKey = true)]
public int ObjId { get; set; }
/// <summary>
/// 箱体吗
/// </summary>
[SugarColumn(ColumnName = "PERFUSION_BOXCODE")]
public string PerfusionBoxCode { get; set; }
/// <summary>
/// 冷媒类型;左侧冷媒型号
/// </summary>
[SugarColumn(ColumnName = "PERFUSION_REFRIGERANTTYPELEFT")]
public string PerfusionRefrigerantTypeLeft { get; set; }
/// <summary>
/// 冷媒类型;右侧侧冷媒型号
/// </summary>
[SugarColumn(ColumnName = "PERFUSION_REFRIGERANTTYPERIGHT")]
public string PerfusionRefrigerantTypeRight { get; set; }
/// <summary>
/// 设置灌注量
/// </summary>
[SugarColumn(ColumnName = "PERFUSION_SETVOLUME")]
public string PerfusionSetVolume { get; set; }
/// <summary>
/// 实际灌注量
/// </summary>
[SugarColumn(ColumnName = "PERFUSION_ACTUALVOLUME")]
public string PerfusionActualVolume { get; set; }
/// <summary>
/// 灌注压力_R
/// </summary>
@ -59,13 +35,36 @@ namespace Admin.Core.Model
/// </summary>
[SugarColumn(ColumnName = "PERFUSION_L")]
public string PerfusionL { get; set; }
/// <summary>
/// 灌注时长
/// </summary>
[SugarColumn(ColumnName = "PERFUSION_DURATION")]
public string PerfusionDuration { get; set; }
/// <summary>
/// 产量
/// </summary>
[SugarColumn(ColumnName = "YIELD")]
public string Yield { get; set; }
/// <summary>
/// 箱体码
/// </summary>
[SugarColumn(ColumnName = "PERFUSION_BOXCODE")]
public string PerfusionBoxCode { get; set; }
/// <summary>
/// 冷媒类型;左侧冷媒型号
/// </summary>
[SugarColumn(ColumnName = "PERFUSION_REFRIGERANTTYPELEFT")]
public string PerfusionRefrigerantTypeLeft { get; set; }
/// <summary>
/// 冷媒类型;右侧侧冷媒型号
/// </summary>
[SugarColumn(ColumnName = "PERFUSION_REFRIGERANTTYPERIGHT")]
public string PerfusionRefrigerantTypeRight { get; set; }
/// <summary>
/// 设置灌注量
/// </summary>
[SugarColumn(ColumnName = "PERFUSION_SETVOLUME")]
public string PerfusionSetVolume { get; set; }
/// <summary>
/// 系统;0,右系统 1左系统
/// </summary>
@ -75,7 +74,13 @@ namespace Admin.Core.Model
/// 灌注结果
/// </summary>
[SugarColumn(ColumnName = "PERFUSION_RESULT")]
public int PerfusionResult { get; set; }
public short PerfusionResult { get; set; }
/// <summary>
/// 灌注完成状态字
/// </summary>
[SugarColumn(ColumnName = "FINISH_STATUS")]
public string PerfusionFinishStatus { get; set; }
/// <summary>
/// 创建人
/// </summary>
@ -99,5 +104,7 @@ namespace Admin.Core.Model
/// </summary>
[SugarColumn(ColumnName = "UPDATED_TIME")]
public DateTime UpdatedTime { get; set; }
}
}

@ -0,0 +1,247 @@
using Admin.Core.Common.Helper;
using Admin.Core.IRepository;
using Admin.Core.IService;
using Admin.Core.Model;
using Admin.Core.Model.Model_New;
using Admin.Core.Repository;
using Admin.Core.Service;
using Aucma.Core.HwPLc;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Aucam.Core.PerfusionService.Business
{
/// <summary>
/// 采集灌注数据
/// </summary>
public class Collection
{
Semaphore semaphore = new Semaphore(1, 1);
protected readonly IPerfusionRecordServices? _perfusionRecordServices ;
protected readonly IPerfusionAlarmServices ?_perfusionAlarmServices;
protected readonly IPerfusionDeviceStatusServices? _perfusionDeviceStatusServices;
private static System.Text.ASCIIEncoding asciiEncoding = new System.Text.ASCIIEncoding();
private Perfusion_Record record = new Perfusion_Record();
private Perfusion_Record temprRecord;
private Perfusion_DeviceStatus perfusion_DeviceStatus = new Perfusion_DeviceStatus();
private Perfusion_Alarm perfusion_Alarm = new Perfusion_Alarm();
public Collection(PerfusionRecordServices perfusionRecordServices, IPerfusionAlarmServices perfusionAlarmServices, IPerfusionDeviceStatusServices perfusionDeviceStatusServices)
{
_perfusionRecordServices = perfusionRecordServices;
_perfusionAlarmServices = perfusionAlarmServices;
_perfusionDeviceStatusServices = perfusionDeviceStatusServices;
startCollect();
}
public void startCollect()
{
Task.Run(() =>
{
while (true)
{
semaphore.WaitOne();
try
{
Thread.Sleep(3000);
var obj = PlcHelper.siemensList.FirstOrDefault(d => d.EquipName.Equals("PerfusionPlc"));
if (obj != null && obj.plc.IsConnected)
{
//采集数据
ReadEquipSystem(obj,record, perfusion_DeviceStatus, perfusion_Alarm);
//更新设备状态
// _perfusionDeviceStatusServices.UpdateAsync;
// 更新报警信息
//充注结束
if (record.PerfusionFinishStatus == "1")
{
//缓存没数据查数据库
if(temprRecord == null)
{
Perfusion_Record lastRecord = _perfusionRecordServices.Query(d => d.PerfusionBoxCode.Equals(record.PerfusionBoxCode)).FirstOrDefault();
// 数据库没有数据
if (lastRecord == null)
{
_= _perfusionRecordServices.AddAsync(record).Result;
return;
}
}
// 箱体码和上次不一样,或者箱体码一样但是充铸结果不一样
else if(temprRecord.PerfusionBoxCode!=record.PerfusionBoxCode || (temprRecord.PerfusionBoxCode == record.PerfusionBoxCode && temprRecord.PerfusionResult!=record.PerfusionResult) )
{
_ = _perfusionRecordServices.AddAsync(record).Result;
}
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
finally
{
temprRecord = record;
semaphore.Release();
}
}
});
}
/// <summary>
/// 采集灌注参数
/// </summary>
/// <returns></returns>
static void ReadEquipSystem(Aucma.Core.HwPLc.PlcModel obj, Perfusion_Record record, Perfusion_DeviceStatus deviceStatus, Perfusion_Alarm alarmInfo)
{
byte[] info = obj.plc.Read("DB55.0", 50);
if (info == null) return;
#region 灌注记录赋值
record.PerfusionActualVolume=byteToDouble(info.Skip(0).Take(8).ToArray()).ToString();
record.PerfusionR = byteToDouble(info.Skip(8).Take(4).ToArray()).ToString().ToString();
record.PerfusionL = byteToFloat(info.Skip(50).Take(4).ToArray()).ToString();
record.PerfusionDuration = int.Parse(StringChange.bytesToHexStr(info.Skip(12).Take(4).ToArray(), 4), System.Globalization.NumberStyles.HexNumber).ToString();
record.Yield = int.Parse(StringChange.bytesToHexStr(info.Skip(16).Take(4).ToArray(), 4), System.Globalization.NumberStyles.HexNumber).ToString();
record.PerfusionBoxCode = asciiEncoding.GetString(info.Skip(20).Take(24).ToArray()).Replace("\0", "").Trim('\n');
record.PerfusionRefrigerantTypeLeft = asciiEncoding.GetString(info.Skip(58).Take(7).ToArray()).Trim('\n');
record.PerfusionRefrigerantTypeRight = asciiEncoding.GetString(info.Skip(68).Take(7).ToArray()).Trim('\n');
record.PerfusionSetVolume = byteToFloat(info.Skip(78).Take(4).ToArray()).ToString();
record.PerfusionSystem =short.Parse(StringChange.bytesToHexStr(info.Skip(82).Take(2).ToArray(), 2), System.Globalization.NumberStyles.HexNumber).ToString();
///灌注完成状态字
record.PerfusionFinishStatus = short.Parse(StringChange.bytesToHexStr(info.Skip(42).Take(2).ToArray(), 2), System.Globalization.NumberStyles.HexNumber).ToString();
record.PerfusionResult = short.Parse(StringChange.bytesToHexStr(info.Skip(44).Take(2).ToArray(), 2), System.Globalization.NumberStyles.HexNumber);
record.CreatedBy = "equip";
record.CreatedTime = DateTime.Now;
record.UpdatedBy = "equip";
record.UpdatedTime = DateTime.Now;
#endregion
#region 设备状态赋值
deviceStatus.PerfusionDevicetype = "灌注";
deviceStatus.PerfusionStatus = short.Parse(StringChange.bytesToHexStr(info.Skip(46).Take(2).ToArray(), 2), System.Globalization.NumberStyles.HexNumber);
deviceStatus.CreatedBy = "equip";
deviceStatus.CreatedTime = DateTime.Now;
deviceStatus.UpdatedBy = "equip";
deviceStatus.UpdatedTime = DateTime.Now;
#endregion
#region 设备报警赋值
alarmInfo.PerfusionBoxcode = record.PerfusionBoxCode;
alarmInfo.PerfusionStatus = short.Parse(StringChange.bytesToHexStr(info.Skip(48).Take(2).ToArray(), 2), System.Globalization.NumberStyles.HexNumber);
alarmInfo.PerfusionAlarm = AlarmTrans(alarmInfo.PerfusionStatus);
alarmInfo.PerfusionCompleted = "1";
alarmInfo.CreatedBy = "equip";
alarmInfo.CreatedTime = DateTime.Now;
alarmInfo.UpdatedBy = "equip";
alarmInfo.UpdatedTime = DateTime.Now;
#endregion
}
static string AlarmTrans(short code)
{
string result = "";
switch (code)
{
case 2: result = "充注枪真空不合格"; break;
case 4: result = "充注故障"; break;
case 8: result = "充注时真空度超限定"; break;
case 16: result = "回升检测不合格"; break;
case 32: result = "工件真空不合格"; break;
case 64: result = "平衡缸接近开关异常"; break;
case 128: result = "增压超时"; break;
case 256: result = "风压不足"; break;
}
return result;
}
#region 字符工具转换方法
/// byte[]转十进制ascii码
/// </summary>
/// <param name="bytes"></param>
static string ByteArrayToString(byte[] bytes)
{
string result = string.Empty;
foreach (byte b in bytes)
{
int decimalValue = Convert.ToInt32(b); // 将字节转换为十进制值
result += decimalValue;
}
return result;
}
/// <summary>
/// byte[]转二进制
/// </summary>
/// <param name="bytes"></param>
static string ByteArrayToBinary(byte[] bytes)
{
StringBuilder binaryString = new StringBuilder();
foreach (byte b in bytes)
{
binaryString.Append(Convert.ToString(b, 2).PadLeft(8, '0'));
}
// Console.WriteLine(binaryString);
string reversedStr = new string(binaryString.ToString().Reverse().ToArray());
// Console.WriteLine(reversedStr);
return reversedStr;
}
/// <summary>
/// 根据二进制字符串确定夹具状态 1正常生产 2暂停生产
/// </summary>
static int judgeStatus(string str1)
{
int item1 = 0;
if (str1.Substring(0, 1) == "1")
{
item1 = 1; //
}
else if (str1.Substring(1, 1) == "1")
{
item1 = 2; //
}
return item1;
}
/// <summary>
/// byte数组转换为float
/// </summary>
static float byteToFloat(byte[] list)
{
float result = 0.00f;
Array.Reverse(list);
result = BitConverter.ToSingle(list, 0);
return result;
}
/// <summary>
/// byte数组转换为float
/// </summary>
static double byteToDouble(byte[] list)
{
double result = 0;
Array.Reverse(list);
result = BitConverter.ToDouble(list, 0);
return result;
}
#endregion
}
}

@ -99,7 +99,7 @@
"ID": 1,
"Name": "PerfusionTask",
"JobGroup": "DEFAULT",
"Cron": "*/30 * * * * ?",
"Cron": "*/5 * * * * ?",
"AssemblyName": "Admin.Core.Tasks",
"ClassName": "Job_Perfusion_Quartz",
"Remark": "执行灌注设备数据采集程序",
@ -109,7 +109,7 @@
"TriggerType": 1,
"IntervalSecond": 1,
"CycleRunTimes": 1,
"IsStart": true,
"IsStart": false,
"JobParams": null,
"DelFlag": false,
"CreateBy": "admin",

@ -210,7 +210,7 @@
"EquipName": "foamLine1Plc",
"PlcType": "Siemens",
"Enabled": true,
"IP": "127.0.0.1",
"IP": "10.10.93.1",
"Port": 102
},
{

Loading…
Cancel
Save