Exemplo n.º 1
0
        private bool ParseReadSend(FinsAddrInfo addrInfo, ref List <byte> sendmsg)
        {
            byte[] command = new byte[8];

            // 指令 读
            command[0] = PLCConvert.HighByte(Convert.ToUInt16(addrInfo.Operator));
            command[1] = PLCConvert.LowByte(Convert.ToUInt16(addrInfo.Operator));
            // 地址
            command[2] = addrInfo.Area;                     // 区域
            command[3] = addrInfo.HighByte;                 // 地址-整数位
            command[4] = addrInfo.LowByte;
            command[5] = addrInfo.Decimal;                  // 地址-小数位

            // 长度
            command[6] = PLCConvert.HighByte(Convert.ToUInt16(addrInfo.FinsCount));
            command[7] = PLCConvert.LowByte(Convert.ToUInt16(addrInfo.FinsCount));

            var length = -8 + header.Count + 8;

            sendmsg.AddRange(header);
            sendmsg.RemoveRange(4, 4);                           // 数据段长度设置
            sendmsg.InsertRange(4, PLCConvert.ArrayByte((UInt32)length));
            sendmsg.AddRange(command);                           // 添加command

            return(true);
        }
Exemplo n.º 2
0
        private bool Read <T>(string addr, UInt16 count, ref List <T> rst)
        {
            if (!IsConnect)
            {
                return(false);
            }

            if (count <= 0 || count > 2000)
            {
                return(false);
            }

            FinsAddrInfo addrInfo = new FinsAddrInfo();

            if (!ParseAddrInfo(addr, count, typeof(T).Name, EFinsOperate.Read, ref addrInfo))
            {
                return(false);
            }

            List <byte> sendmsg = new List <byte>();

            if (!ParseReadSend(addrInfo, ref sendmsg))
            {
                return(false);
            }

            var sendlen = socket.Send(sendmsg.ToArray());

            if (sendmsg.Count() != sendlen)
            {
                return(false);
            }

            byte[] recvmsg = new byte[1024];
            var    recvlen = socket.Receive(recvmsg);

            if (recvlen != 30 + addrInfo.FinsCount * 2)
            {
                return(false);
            }

            if (!ParseReadRecv(addrInfo, recvmsg.Skip(30).Take(recvlen - 30).ToArray(), ref rst))
            {
                return(false);
            }

            return(true);
        }
Exemplo n.º 3
0
        private bool Write <T>(string addr, UInt16 count, List <T> values)
        {
            if (!IsConnect)
            {
                return(false);
            }

            if (count <= 0 || count > 2000)
            {
                return(false);
            }

            FinsAddrInfo addrInfo = new FinsAddrInfo();

            if (!ParseAddrInfo(addr, count, typeof(T).Name, EFinsOperate.Read, ref addrInfo))
            {
                return(false);
            }

            List <byte> sendmsg = new List <byte>();

            if (!ParseWriteSend(addrInfo, values, ref sendmsg))
            {
                return(false);
            }

            if (sendmsg.Count() != socket.Send(sendmsg.ToArray()))
            {
                return(false);
            }

            List <byte> recvmsg = new List <byte>();

            if (socket.Receive(recvmsg.ToArray()) <= 30)
            {
                return(false);
            }

            return(ParseWriteRecv(recvmsg));
        }
Exemplo n.º 4
0
        private bool ParseWriteSend <T>(FinsAddrInfo addrInfo, List <T> values, ref List <byte> sendmsg)
        {
            List <byte> command = new List <byte>(8);

            // 指令 读
            command[0] = PLCConvert.HighByte(Convert.ToUInt16(addrInfo.Operator));
            command[1] = PLCConvert.LowByte(Convert.ToUInt16(addrInfo.Operator));
            // 地址
            command[2] = addrInfo.Area;                     // 区域
            command[3] = addrInfo.HighByte;                 // 地址-整数位
            command[4] = addrInfo.LowByte;
            command[5] = addrInfo.Decimal;                  // 地址-小数位
            // 长度
            command[6] = PLCConvert.HighByte(Convert.ToUInt16(addrInfo.Count));
            command[7] = PLCConvert.LowByte(Convert.ToUInt16(addrInfo.Count));

            // 数据
            EValueType valueType = EValueType._BOOL;

            if (!PLCConvert.AddrValueType(typeof(T).Name, ref valueType))
            {
                return(false);
            }

            List <byte> data = new List <byte>();

            switch (valueType)
            {
            case EValueType._UNKNOW:
                return(false);

            case EValueType._BOOL:
                foreach (var i in values)
                {
                    data.AddRange(BitConverter.GetBytes((Byte)(Object)i).Reverse());
                }
                break;

            case EValueType._INT16:
                foreach (var i in values)
                {
                    data.AddRange(BitConverter.GetBytes((Int16)(Object)i).Reverse());
                }
                break;

            case EValueType._INT32:
                foreach (var i in values)
                {
                    data.AddRange(BitConverter.GetBytes((Int32)(Object)i).Reverse());
                }
                break;

            case EValueType._INT64:
                foreach (var i in values)
                {
                    data.AddRange(BitConverter.GetBytes((Int64)(Object)i).Reverse());
                }
                break;

            case EValueType._UINT16:
                foreach (var i in values)
                {
                    data.AddRange(BitConverter.GetBytes((UInt16)(Object)i).Reverse());
                }
                break;

            case EValueType._UINT32:
                foreach (var i in values)
                {
                    data.AddRange(BitConverter.GetBytes((UInt32)(Object)i).Reverse());
                }
                break;

            case EValueType._UINT64:
                foreach (var i in values)
                {
                    data.AddRange(BitConverter.GetBytes((UInt64)(Object)i).Reverse());
                }
                break;

            case EValueType._FLOAT:
                foreach (var i in values)
                {
                    data.AddRange(BitConverter.GetBytes((Single)(Object)i).Reverse());
                }
                break;

            case EValueType._DOUBLE:
                foreach (var i in values)
                {
                    data.AddRange(BitConverter.GetBytes((Double)(Object)i).Reverse());
                }
                break;
            }

            command.AddRange(data);

            var length = -8 + header.Count + command.Count + data.Count;

            var length_read = data.Count;

            sendmsg.AddRange(header);
            sendmsg.RemoveRange(4, 4);                           // 数据段长度设置
            sendmsg.InsertRange(4, PLCConvert.ArrayByte((UInt32)length));
            sendmsg.AddRange(command);                           // 添加command
            sendmsg.AddRange(data);                              // 添加data

            return(true);
        }
Exemplo n.º 5
0
        private bool ParseReadRecv <T>(FinsAddrInfo addrInfo, byte[] data, ref List <T> result)
        {
            int length = data.Count();

            switch (addrInfo.ValueType)
            {
            case EValueType._UNKNOW:
                return(false);

            case EValueType._BOOL:
            {
                for (int i = 0; i < length / 2; ++i)
                {
                    BitArray bits = new BitArray(data.Skip(i * 2).Take(2).Reverse().ToArray());

                    if (i == 0)
                    {
                        for (int j = addrInfo.Decimal; j < Math.Min(16, addrInfo.Decimal + addrInfo.Count); ++j)
                        {
                            result.Add((T)(Object)bits.Get(j));
                        }
                    }
                    else if (i == length / 2 - 1)
                    {
                        for (int j = 0; j < (addrInfo.Decimal + addrInfo.Count) % 16; ++j)
                        {
                            result.Add((T)(Object)bits.Get(j));
                        }
                    }
                    else
                    {
                        for (int j = 0; j < 16; ++j)
                        {
                            result.Add((T)(Object)bits.Get(j));
                        }
                    }
                }

                if (result.Count != addrInfo.Count)
                {
                    return(false);
                }
            }
            break;

            case EValueType._INT16:
                for (int i = 0; i < length / 2; ++i)
                {
                    result.Add((T)(Object)BitConverter.ToInt16(data.Skip(i * 2).Take(2).Reverse().ToArray(), 0));
                }
                break;

            case EValueType._INT32:
                for (int i = 0; i < length / 4; ++i)
                {
                    result.Add((T)(Object)BitConverter.ToInt32(data.Skip(i * 4).Take(4).Reverse().ToArray(), 0));
                }
                break;

            case EValueType._INT64:
                for (int i = 0; i < length / 8; ++i)
                {
                    result.Add((T)(Object)BitConverter.ToInt64(data.Skip(i * 8).Take(8).Reverse().ToArray(), 0));
                }
                break;

            case EValueType._UINT16:
                for (int i = 0; i < length / 2; ++i)
                {
                    result.Add((T)(Object)BitConverter.ToUInt16(data.Skip(i * 2).Take(2).Reverse().ToArray(), 0));
                }
                break;

            case EValueType._UINT32:
                for (int i = 0; i < length / 4; ++i)
                {
                    result.Add((T)(Object)BitConverter.ToUInt32(data.Skip(i * 4).Take(4).Reverse().ToArray(), 0));
                }
                break;

            case EValueType._UINT64:
                for (int i = 0; i < length / 8; ++i)
                {
                    result.Add((T)(Object)BitConverter.ToUInt64(data.Skip(i * 8).Take(8).Reverse().ToArray(), 0));
                }
                break;

            case EValueType._FLOAT:
                for (int i = 0; i < length / 4; ++i)
                {
                    result.Add((T)(Object)BitConverter.ToString(data.Skip(i * 4).Take(4).Reverse().ToArray(), 0));
                }
                break;

            case EValueType._DOUBLE:
                for (int i = 0; i < length / 8; ++i)
                {
                    result.Add((T)(Object)BitConverter.ToDouble(data.Skip(i * 8).Take(8).Reverse().ToArray(), 0));
                }
                break;

            case EValueType._STRING:
                for (int i = 0; i < length; ++i)
                {
                    result.Add((T)(Object)data[i]);
                }
                break;

            default:
                break;
            }

            return(true);
        }
Exemplo n.º 6
0
        // 这个正则不熟,要测试
        private bool ParseAddrInfo(string addr, UInt16 count, string valueType, EFinsOperate opt, ref FinsAddrInfo addrInfo)
        {
            addrInfo.Address  = addr;
            addrInfo.Operator = opt;
            addrInfo.Count    = count;

            if (!PLCConvert.AddrValueType(valueType, ref addrInfo.ValueType))
            {
                return(false);
            }

            var matchArea = Regex.Matches(addr, @"[A-Za-z]+");

            if (matchArea.Count != 1)
            {
                return(false);
            }
            var sarea = matchArea[0].Value;

            var matchNum = Regex.Matches(addr, @"([1-9]\d*\.?\d*)|(0\.\d*[1-9])");

            if (matchNum.Count != 1)
            {
                return(false);
            }
            var snum = matchNum[0].Value;

            if (!PLCConvert.FinsAddrArea(sarea, ref addrInfo.Area))
            {
                return(false);
            }

            if (!PLCConvert.FinsAddrNum(snum, ref addrInfo.HighByte, ref addrInfo.LowByte, ref addrInfo.Decimal))
            {
                return(false);
            }

            switch (addrInfo.ValueType)
            {
            case EValueType._UNKNOW:
                return(false);

            case EValueType._BOOL:
                addrInfo.FinsCount = (UInt16)((addrInfo.Decimal + addrInfo.Count) / 16 + 1);
                break;

            case EValueType._INT16:
                addrInfo.FinsCount = addrInfo.Count;
                break;

            case EValueType._INT32:
                addrInfo.FinsCount = (UInt16)(addrInfo.Count * 2);
                break;

            case EValueType._INT64:
                addrInfo.FinsCount = (UInt16)(addrInfo.Count * 4);
                break;

            default:
                break;
            }

            var readCount = (addrInfo.Decimal + addrInfo.Count) / 16;

            return(true);
        }