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#

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