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.
Shihong-Delta.Injection.Iot/Sln.Iot.Business/UnitsProcessPLCDataGetBusin...

158 lines
7.3 KiB
C#

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 UnitsProcessVacuumEntity VacuumPlcDataGet()
{
try
{
var entity = new UnitsProcessVacuumEntity();
// 一次性读取 D12600-D1263738个字包含配方数据、配方参数、总胶量
var recipeRes = _plc.ReadBytes(_plc.PLC21, "D12600", 38);
if (recipeRes.IsSuccess)
{
// 配方数据 D1260010个字字符串
entity.FormulaData = Encoding.ASCII.GetString(recipeRes.Content, 0, 20).TrimEnd('\0');
// Float单精度浮点数占4字节
entity.GluePushSpeedSetValue = BitConverter.ToSingle(SingleReverseBytesForValue(recipeRes.Content, (12610 - 12600) * 2, 4), 0);
entity.GlueAmountSetValue1 = BitConverter.ToSingle(SingleReverseBytesForValue(recipeRes.Content, (12612 - 12600) * 2, 4), 0);
entity.GlueAmountSetValue2 = BitConverter.ToSingle(SingleReverseBytesForValue(recipeRes.Content, (12614 - 12600) * 2, 4), 0);
entity.GlueAmountSetValue3 = BitConverter.ToSingle(SingleReverseBytesForValue(recipeRes.Content, (12616 - 12600) * 2, 4), 0);
entity.GlueAmountSetValue4 = BitConverter.ToSingle(SingleReverseBytesForValue(recipeRes.Content, (12618 - 12600) * 2, 4), 0);
entity.GlueAmountSetValue5 = BitConverter.ToSingle(SingleReverseBytesForValue(recipeRes.Content, (12620 - 12600) * 2, 4), 0);
entity.GlueAmountSetValue6 = BitConverter.ToSingle(SingleReverseBytesForValue(recipeRes.Content, (12622 - 12600) * 2, 4), 0);
entity.GlueAmountSetValue7 = BitConverter.ToSingle(SingleReverseBytesForValue(recipeRes.Content, (12624 - 12600) * 2, 4), 0);
entity.GlueAmountSetValue8 = BitConverter.ToSingle(SingleReverseBytesForValue(recipeRes.Content, (12626 - 12600) * 2, 4), 0);
entity.GlueAmountSetValue9 = BitConverter.ToSingle(SingleReverseBytesForValue(recipeRes.Content, (12628 - 12600) * 2, 4), 0);
entity.GlueAmountSetValue10 = BitConverter.ToSingle(SingleReverseBytesForValue(recipeRes.Content, (12630 - 12600) * 2, 4), 0);
entity.VacuumDegreeSetValue = BitConverter.ToSingle(SingleReverseBytesForValue(recipeRes.Content, (12632 - 12600) * 2, 4), 0);
entity.TotalGlueAmountSetValue = BitConverter.ToSingle(SingleReverseBytesForValue(recipeRes.Content, (12636 - 12600) * 2, 4), 0);
// Int16短整型占2字节
entity.PressureHoldTimeSetValue = BitConverter.ToInt16(Int16ReverseBytesForValue(recipeRes.Content, (12634 - 12600) * 2, 2), 0);
entity.VacuumIsUseSetValue = BitConverter.ToInt16(Int16ReverseBytesForValue(recipeRes.Content, (12635 - 12600) * 2, 2), 0);
}
// 读取实际值 D850-D8556个字
var actRes = _plc.ReadBytes(_plc.PLC21, "D850", 6);
if (actRes.IsSuccess)
{
entity.PumpAPressureActValue = BitConverter.ToSingle(SingleReverseBytesForValue(actRes.Content, (850 - 850) * 2, 4), 0);
entity.PumpBPressureActValue = BitConverter.ToSingle(SingleReverseBytesForValue(actRes.Content, (852 - 850) * 2, 4), 0);
entity.VacuumDegreeActValue = BitConverter.ToSingle(SingleReverseBytesForValue(actRes.Content, (854 - 850) * 2, 4), 0);
}
return entity;
}
catch (Exception ex)
{
_log.Error("PLC读取真空灌胶机信息失败");
return new UnitsProcessVacuumEntity();
}
}
/// <summary>
/// 固化炉隧道炉PLC数据获取
/// </summary>
/// <returns></returns>
public UnitsProcessOvenEntity OvenPlcDataGet()
{
try
{
var entity = new UnitsProcessOvenEntity();
// 读取固化温度实际值 D200-D2012个字
var actRes = _plc.ReadBytes(_plc.PLC20, "D200", 2);
if (actRes.IsSuccess)
{
entity.CureOven1ActValue = BitConverter.ToInt16(Int16ReverseBytesForValue(actRes.Content, (200 - 200) * 2, 2), 0);
entity.CureOven2ActValue = BitConverter.ToInt16(Int16ReverseBytesForValue(actRes.Content, (201 - 200) * 2, 2), 0);
}
// 读取固化温度设定值 D20000-D200012个字
var setRes = _plc.ReadBytes(_plc.PLC20, "D20010", 2);
if (setRes.IsSuccess)
{
entity.CureOven1SetValue = BitConverter.ToInt16(Int16ReverseBytesForValue(setRes.Content, (20010 - 20010) * 2, 2), 0);
entity.CureOven2SetValue = BitConverter.ToInt16(Int16ReverseBytesForValue(setRes.Content, (20011 - 20010) * 2, 2), 0);
}
return entity;
}
catch (Exception ex)
{
_log.Error("PLC读取固化炉隧道炉信息失败");
return new UnitsProcessOvenEntity();
}
}
/// <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;
}
}
}