public static int GetTagOffset(string tagName, int baseNum) { if (string.IsNullOrEmpty(tagName)) { return(0); } int off = 0; switch (tagName[0]) { case 'X': case 'x': case 'Y': case 'y': if (baseNum == 8) { off = (int)FxConvert.OctToValue(tagName.Substring(1)); // 8进制 } else { off = (int)FxConvert.HexToDec(tagName.Substring(1)); // 16进制 } break; default: off = (int)FxConvert.DecToValue(tagName.Substring(1)); // 十进制 break; } return(off); }
/// <summary> /// 解析PLC响应数据(到集合中) /// </summary> /// <typeparam name="T">支持数据类型 UInt16DataType,UInt32DataType</typeparam> /// <param name="pureData"></param> /// <param name="startIndex"></param> /// <param name="value">解析后的返回值</param> public static void ParseSmart <T>(byte[] data, int startIndex, out List <int> value) where T : ICellDataType, new() { T t = new T(); value = new List <int>(); if (data.Length < 7) { return; // 长度至少大于7 } if (data[startIndex] != FxControlCode._STX) { return; } // 每次处理一个 4B 或 8B,对应着 ushort,uint if (t.DataItemSize == 1) { for (int i = startIndex + 1; i < (data.Length - startIndex - t.DataItemHexStringSize); i += t.DataItemHexStringSize) { int v = FxConvert.HexToDec(data, i, t.DataItemHexStringSize); value.Add(v); } } else { for (int i = startIndex + 1; i < (data.Length - startIndex - t.DataItemHexStringSize); i += t.DataItemHexStringSize) { int v = FxConvert.HexToDecBig(data, i, t.DataItemHexStringSize); value.Add(v); } } }
/// <summary> /// 将给定数据序列转换为命令串格式 /// 这是针对 ushort 的特殊命令版本,也可使用 ConvertToString<UShortDataType>(...) 函数达到同样目的 /// </summary> /// <param name="pureData"></param> /// <returns></returns> public static string ConvertToString(List <ushort> data) { StringBuilder sb = new StringBuilder(data.Count * sizeof(ushort) * 2); for (int i = 0; i < data.Count; i++) { sb.Append(FxConvert.DecToHex(data[i], sizeof(ushort) * 2)); } return(sb.ToString()); }
/// <summary> /// 将给定数据序列转换为命令串格式 /// 目前支持 16位、32位 两种格式,例如 UInt16DataType,UInt32DataType /// </summary> /// <param name="pureData">数据序列</param> public static string ConvertToString <T>(List <uint> data) where T : ICellDataType, new() { T t = new T(); StringBuilder sb = new StringBuilder(data.Count * t.DataItemHexStringSize); for (int i = 0; i < data.Count; i++) { sb.Append(FxConvert.DecToHex(data[i], t.DataItemHexStringSize)); } return(sb.ToString()); }
public static string Make(FxCommandConst cmd, FxAddress addr, int length, string data) { Debug.Assert(length == data.Length, "length(长度)必须与给定的数据实际一致"); StringBuilder sb = new StringBuilder(64 + data.Length); sb.Append((char)FxControlCode._STX); sb.Append((char)cmd); sb.Append(addr.ToAddressHexString()); sb.Append(FxConvert.DecToHex((uint)(length / 2), 2)); sb.Append(data); sb.Append((char)FxControlCode._ETX); sb.Append(FxConvert.DecToHex(GetCheckSum(sb.ToString(), 1), 2)); return(sb.ToString()); }
/// <summary> /// 构建PLC FX命令 /// 支持各种“读数据”或“查询”类命令,支持多种数据类型,例如 UInt16DataType,UIntDataType /// </summary> /// <param name="response">命令字</param> /// <param name="addr">起始地址</param> /// <param name="length">数据长度,以字节为单位。例如:如果是16bits则为2、32bits则为4</param> /// <returns>返回构造完成的命令串</returns> public static string Make(FxCommandConst cmd, FxAddress addr, int length) { StringBuilder sb = new StringBuilder(64); sb.Append((char)FxControlCode._STX); sb.Append((char)cmd); sb.Append(addr.ToAddressHexString()); if (length > 0) { sb.Append(FxConvert.DecToHex((uint)length, 2)); } sb.Append((char)FxControlCode._ETX); sb.Append(FxConvert.DecToHex(GetCheckSum(sb.ToString(), 1), 2)); return(sb.ToString()); }