171 lines
6.1 KiB
C#
171 lines
6.1 KiB
C#
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
|
||
|
||
}
|
||
}
|