init: 潍柴发动机线 中央控制程序 项目首次入库
This commit is contained in:
170
SCADA/Core/Tools.cs
Normal file
170
SCADA/Core/Tools.cs
Normal file
@@ -0,0 +1,170 @@
|
||||
using MesWork;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
|
||||
|
||||
namespace ConverterBytesAndStruct
|
||||
{
|
||||
/// <summary>
|
||||
/// 数据解析、数据转换
|
||||
/// </summary>
|
||||
public class Tools
|
||||
{
|
||||
#region 内部转换
|
||||
/// <summary>
|
||||
/// 从源数据提取字符数组
|
||||
/// </summary>
|
||||
/// <param name="bytes"></param>
|
||||
/// <param name="start"></param>
|
||||
/// <param name="num"></param>
|
||||
/// <returns></returns>
|
||||
public static char[] convertNumber(byte[] bytes, int start, int num)
|
||||
{
|
||||
// TODO 长度判断
|
||||
char[] res = new char[num];
|
||||
for (int i = 0; i < num; i++)
|
||||
{
|
||||
res[i] = (char)bytes[start + i];
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
/// <summary>
|
||||
/// 从源数据提取字节数组
|
||||
/// </summary>
|
||||
/// <param name="bytes"></param>
|
||||
/// <param name="start"></param>
|
||||
/// <param name="num"></param>
|
||||
/// <returns></returns>
|
||||
public static byte[] slice(byte[] bytes, int start, int num)
|
||||
{
|
||||
// TODO 长度判断
|
||||
byte[] res = new byte[num];
|
||||
for (int i = 0; i < num; i++)
|
||||
{
|
||||
res[i] = bytes[start + i];
|
||||
}
|
||||
return res;
|
||||
}
|
||||
/// <summary>
|
||||
/// 从源数据提取结构体
|
||||
/// </summary>
|
||||
/// <param name="bytes"></param>
|
||||
/// <param name="start"></param>
|
||||
/// <returns></returns>
|
||||
public static TS convetTS(byte[] bytes, int start)
|
||||
{
|
||||
// TODO 长度判断
|
||||
TS ts = null;
|
||||
|
||||
ts = new TS();
|
||||
ts.Max_Len = bytes[start + 0];
|
||||
ts.Act_Len = bytes[start + 1];
|
||||
ts.Month_B1 = (char)bytes[start + 2];
|
||||
ts.Month_B0 = (char)bytes[start + 3];
|
||||
ts.Slash1 = (char)bytes[start + 4];
|
||||
ts.Day_B1 = (char)bytes[start + 5];
|
||||
ts.Day_B0 = (char)bytes[start + 6];
|
||||
ts.Slash2 = (char)bytes[start + 7];
|
||||
ts.Fixed_dgt1 = (char)bytes[start + 8];
|
||||
ts.Fixed_dgt2 = (char)bytes[start + 9];
|
||||
ts.Year_B1 = (char)bytes[start + 10];
|
||||
ts.Year_B0 = (char)bytes[start + 11];
|
||||
ts.Null1 = (char)bytes[start + 12];
|
||||
ts.Hour_B1 = (char)bytes[start + 13];
|
||||
ts.Hour_B0 = (char)bytes[start + 14];
|
||||
ts.Colon1 = (char)bytes[start + 15];
|
||||
ts.Min_B1 = (char)bytes[start + 16];
|
||||
ts.Min_B0 = (char)bytes[start + 17];
|
||||
ts.Colon2 = (char)bytes[start + 18];
|
||||
ts.Sec_B1 = (char)bytes[start + 19];
|
||||
ts.Sec_B0 = (char)bytes[start + 20];
|
||||
ts.Null2 = (char)bytes[start + 21];
|
||||
|
||||
return ts;
|
||||
}
|
||||
/// <summary>
|
||||
/// 结构体转时间
|
||||
/// </summary>
|
||||
/// <param name="ts"></param>
|
||||
/// <returns></returns>
|
||||
public static System.DateTime Convet_ToDateTime(TS ts)
|
||||
{
|
||||
System.DateTime dt = System.DateTime.Parse($"1970-01-01 01:01:01.001");
|
||||
try
|
||||
{
|
||||
var yyyy = $"20{ts.Year_B1}{ts.Year_B0}";
|
||||
var MM = $"{ts.Month_B1}{ts.Month_B0}";
|
||||
var dd = $"{ts.Day_B1}{ts.Day_B0}";
|
||||
|
||||
var HH = $"{ts.Hour_B1}{ts.Hour_B0}";
|
||||
var mm = $"{ts.Min_B1}{ts.Min_B0}";
|
||||
var ss = $"{ts.Sec_B1}{ts.Sec_B0}";
|
||||
|
||||
var dtStr = $"{yyyy}-{MM}-{dd} {HH}:{mm}:{ss}.000";
|
||||
dt = System.DateTime.Parse(dtStr);
|
||||
}
|
||||
catch (Exception err)
|
||||
{
|
||||
}
|
||||
|
||||
return dt;
|
||||
}
|
||||
/// <summary>
|
||||
/// 从源数据提取质量数据
|
||||
/// </summary>
|
||||
/// <param name="bytes"></param>
|
||||
/// <param name="start"></param>
|
||||
/// <returns></returns>
|
||||
public static QC_DATA convertQcdata(byte[] bytes, int start)
|
||||
{
|
||||
QC_DATA data = null;
|
||||
data = new QC_DATA();
|
||||
data.Work_Type = S7.Net.Types.Int.FromByteArray(new byte[] { bytes[start + 0], bytes[start + 1] });
|
||||
data.Progarm_Code = S7.Net.Types.Int.FromByteArray(new byte[] { bytes[start + 2], bytes[start + 3] });
|
||||
data.Counter_Number = S7.Net.Types.Int.FromByteArray(new byte[] { bytes[start + 4], bytes[start + 5] });
|
||||
|
||||
var byte1 = bytes[start + 6];
|
||||
data.Bypass = S7.Net.Types.Bit.FromByte(byte1, 0);
|
||||
data.No_op = S7.Net.Types.Bit.FromByte(byte1, 1);
|
||||
data.Accept = S7.Net.Types.Bit.FromByte(byte1, 2);
|
||||
data.Reject = S7.Net.Types.Bit.FromByte(byte1, 3);
|
||||
//data.Spare14 = S7.Net.Types.Bit.FromByte(byte1, 4);
|
||||
//data.Spare15 = S7.Net.Types.Bit.FromByte(byte1, 5);
|
||||
//data.Repair_Off = S7.Net.Types.Bit.FromByte(byte1, 6);
|
||||
//data.Repair_On = S7.Net.Types.Bit.FromByte(byte1, 7);
|
||||
|
||||
data.SPARE1 = S7.Net.Types.Byte.FromByteArray(new byte[] { bytes[start + 7] });
|
||||
data.SPARE2 = S7.Net.Types.Int.FromByteArray(new byte[] { bytes[start + 8], bytes[start + 9] });
|
||||
|
||||
data.QC_DATA1 = S7.Net.Types.Real.FromByteArray(slice(bytes, start + 10, 4));
|
||||
data.QC_DATA2 = S7.Net.Types.Real.FromByteArray(slice(bytes, start + 14, 4));
|
||||
data.QC_DATA3 = S7.Net.Types.Real.FromByteArray(slice(bytes, start + 18, 4));
|
||||
data.QC_DATA4 = S7.Net.Types.Real.FromByteArray(slice(bytes, start + 22, 4));
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 拷贝 bytes1 内容 到 bytes 从start开始,长度由 bytes1决定
|
||||
/// </summary>
|
||||
/// <param name="bytes"></param>
|
||||
/// <param name="bytes1"></param>
|
||||
/// <param name="start"></param>
|
||||
public static byte[] copy(byte[] bytes, int start, byte[] bytes1)
|
||||
{
|
||||
for (int i = 0; i < bytes1.Length; i++)
|
||||
{
|
||||
bytes[start + i] = bytes1[i];
|
||||
}
|
||||
|
||||
return bytes;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user