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.

217 lines
8.8 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 Sln.Iot.CFX.CFXBusiness;
using Sln.Iot.Model.Entity;
using Sln.Iot.PLC;
using Sln.Iot.Serilog;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Sln.Iot.Business
{
public class UnitsProcessPLCDataGetBusiness
{
private static readonly Lazy<UnitsProcessPLCDataGetBusiness> lazy = new Lazy<UnitsProcessPLCDataGetBusiness>(() => new UnitsProcessPLCDataGetBusiness());
public static UnitsProcessPLCDataGetBusiness Instance
{
get
{
return lazy.Value;
}
}
private readonly PLCConnect _plc = PLCConnect.Instance;
private readonly SerilogHelper _log = SerilogHelper.Instance;
/// <summary>
/// 真空箱PLC数据获取
/// </summary>
/// <returns></returns>
public UnitsProcess1Entity Vacuum1PlcDataGet()
{
try
{
// 读取PLC数据
var res = _plc.ReadBytes(_plc.DeltaInstance1, "D188", 21);
UnitsProcess1Entity entity = new UnitsProcess1Entity()
{
// Float单精度浮点数占4字节先截取4字节再反转
PumpAPressureActValue1 = BitConverter.ToSingle(SingleReverseBytesForValue(res.Content, (188 - 188) * 2, 4), 0),
PumpBPressureActValue1 = BitConverter.ToSingle(SingleReverseBytesForValue(res.Content, (190 - 188) * 2, 4), 0),
GluePushSpeedSetValue1 = BitConverter.ToSingle(SingleReverseBytesForValue(res.Content, (192 - 188) * 2, 4), 0),
GlueAmountSetValue1 = BitConverter.ToSingle(SingleReverseBytesForValue(res.Content, (194 - 188) * 2, 4), 0),
VacuumDegreeActValue1 = BitConverter.ToSingle(SingleReverseBytesForValue(res.Content, (196 - 188) * 2, 4), 0),
// Int16短整型占2字节先截取2字节再反转
PressureHoldTimeSetValue1 = BitConverter.ToInt16(Int16ReverseBytesForValue(res.Content, (198 - 188) * 2, 2), 0),
BarrelA1TempActValue1 = BitConverter.ToInt16(Int16ReverseBytesForValue(res.Content, (200 - 188) * 2, 2), 0),
BarrelA2TempActValue1 = BitConverter.ToInt16(Int16ReverseBytesForValue(res.Content, (202 - 188) * 2, 2), 0),
BarrelB1TempActValue1 = BitConverter.ToInt16(Int16ReverseBytesForValue(res.Content, (206 - 188) * 2, 2), 0),
BarrelB2TempActValue1 = BitConverter.ToInt16(Int16ReverseBytesForValue(res.Content, (208 - 188) * 2, 2), 0),
};
return entity;
}
catch (Exception ex)
{
_log.Error("PLC读取真空箱1信息失败");
return new UnitsProcess1Entity();
}
}
/// <summary>
/// 真空箱PLC数据获取
/// </summary>
/// <returns></returns>
public UnitsProcess1Entity Vacuum2PlcDataGet()
{
try
{
var res = _plc.ReadBytes(_plc.DeltaInstance2, "D188", 21);
var result = res.Content.Reverse().ToArray();
UnitsProcess1Entity entity = new UnitsProcess1Entity()
{
// Float单精度浮点数占4字节先截取4字节再反转
PumpAPressureActValue2 = BitConverter.ToSingle(SingleReverseBytesForValue(res.Content, (188 - 188) * 2, 4), 0),
PumpBPressureActValue2 = BitConverter.ToSingle(SingleReverseBytesForValue(res.Content, (190 - 188) * 2, 4), 0),
GluePushSpeedSetValue2 = BitConverter.ToSingle(SingleReverseBytesForValue(res.Content, (192 - 188) * 2, 4), 0),
GlueAmountSetValue2 = BitConverter.ToSingle(SingleReverseBytesForValue(res.Content, (194 - 188) * 2, 4), 0),
VacuumDegreeActValue2 = BitConverter.ToSingle(SingleReverseBytesForValue(res.Content, (196 - 188) * 2, 4), 0),
// Int16短整型占2字节先截取2字节再反转
PressureHoldTimeSetValue2 = BitConverter.ToInt16(Int16ReverseBytesForValue(res.Content, (198 - 188) * 2, 2), 0),
BarrelA1TempActValue2 = BitConverter.ToInt16(Int16ReverseBytesForValue(res.Content, (200 - 188) * 2, 2), 0),
BarrelA2TempActValue2 = BitConverter.ToInt16(Int16ReverseBytesForValue(res.Content, (202 - 188) * 2, 2), 0),
BarrelB1TempActValue2 = BitConverter.ToInt16(Int16ReverseBytesForValue(res.Content, (206 - 188) * 2, 2), 0),
BarrelB2TempActValue2 = BitConverter.ToInt16(Int16ReverseBytesForValue(res.Content, (208 - 188) * 2, 2), 0),
};
return entity;
}
catch (Exception ex)
{
_log.Error("PLC读取真空箱2信息失败");
return new UnitsProcess1Entity();
}
}
/// <summary>
/// 定义字节序转换的辅助方法(核心)
/// </summary>
/// <param name="source"></param>
/// <param name="startIndex"></param>
/// <param name="length"></param>
/// <returns></returns>
byte[] Int16ReverseBytesForValue(byte[] source, int startIndex, int length)
{
// 截取对应位置的字节片段(避免修改原数组)
byte[] temp = new byte[length];
Array.Copy(source, startIndex, temp, 0, length);
// 反转字节序(大端转小端)
Array.Reverse(temp);
return temp;
}
// 定义字节序转换的辅助方法(核心)
byte[] SingleReverseBytesForValue(byte[] source, int startIndex, int length)
{
// 截取对应位置的字节片段(避免修改原数组)
byte[] temp = new byte[length];
Array.Copy(source, startIndex, temp, 0, length);
var t = temp[0];
temp[0] = temp[2];
temp[2] = t;
t = temp[1];
temp[1] = temp[3];
temp[3] = t;
// 反转字节序(大端转小端)
Array.Reverse(temp);
return temp;
}
/// <summary>
/// 预热炉数据获取
/// </summary>
/// <returns></returns>
public int PreHeatOvenPlcDataGet()
{
try
{
var res = _plc.ReadInt16(_plc.DeltaInstance0, "D200");
if (res.IsSuccess)
{
return res.Content;
}
return 0;
}
catch (Exception ex)
{
_log.Error("PLC读取预热炉信息失败");
return 0;
}
}
/// <summary>
/// 预固炉数据获取
/// </summary>
/// <returns></returns>
public UnitsProcess3Entity PreCureOvenPlcDataGet()
{
try
{
var res = _plc.ReadBytes(_plc.DeltaInstance0, "D201", 4);
var result = res.Content.Reverse().ToArray();
UnitsProcess3Entity unitsProcess3Entity = new UnitsProcess3Entity()
{
PreCureOven4TempActValue = BitConverter.ToInt16(result, 0),
PreCureOven3TempActValue = BitConverter.ToInt16(result, 2),
PreCureOven2TempActValue = BitConverter.ToInt16(result, 4),
PreCureOven1TempActValue = BitConverter.ToInt16(result, 6),
};
return unitsProcess3Entity;
}
catch (Exception ex)
{
_log.Error("PLC读取预固炉信息失败");
return new UnitsProcess3Entity();
}
}
/// <summary>
/// 固化炉数据获取
/// </summary>
/// <returns></returns>
public UnitsProcess3Entity CureOvenPlcDataGet()
{
try
{
var res = _plc.ReadBytes(_plc.DeltaInstance0, "D205", 4);
var result = res.Content.Reverse().ToArray();
UnitsProcess3Entity unitsProcess3Entity = new UnitsProcess3Entity()
{
CureOven4TempActValue = BitConverter.ToInt16(result, 0),
CureOven3TempActValue = BitConverter.ToInt16(result, 2),
CureOven2TempActValue = BitConverter.ToInt16(result, 4),
CureOven1TempActValue = BitConverter.ToInt16(result, 6),
};
return unitsProcess3Entity;
}
catch (Exception ex)
{
_log.Error("PLC读取固化炉信息失败");
return new UnitsProcess3Entity();
}
}
}
}