Example #1
0
        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);
        }
Example #2
0
        /// <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);
                }
            }
        }
Example #3
0
        /// <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());
        }
Example #4
0
        /// <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());
        }
Example #5
0
        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());
        }
Example #6
0
        /// <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());
        }