Beispiel #1
0
        /// <summary>
        /// 请求获取数据的命令,并且返回请求结果数据的字节数组
        /// </summary>
        /// <param name="device"></param>
        /// <param name="realData"></param>
        /// <param name="error"></param>
        /// <param name="fragment">当前请求的modbus地址分段</param>
        /// <returns></returns>
        public Task <List <byte> > RequestData(RealData read)
        {
            List <byte> allbytes = new List <byte>();

            var task = Task.Run <List <byte> >(() =>
            {
                try
                {
                    if (serialPort != null && serialPort.IsOpen)
                    {
                        //分段读取数据,如果是读取整个寄存器的话,一次只能最多读取123个,
                        //如果是读取线圈的话最大只能读取1999个,因此要分段进行数据的读取
                        //增加了一个写入后返回消息
                        master.Transport.WriteMessage = new Action <byte[]>((s) =>
                        {
                            if (LogOutput != null)
                            {
                                LogOutput(ModbusConvert.ByteToHexStr(s));
                            }
                        });
                        master.Transport.CheckFrame = true;
                        ModbusFragment fragment     = read.Fragment;
                        switch (fragment.Code)
                        {
                        case "01":        // 01和05是一个码 可写可读
                            {
                                //返回的线圈状态,由于线圈是按位操作,转换也是按位转换
                                Task <bool[]> result = master.ReadCoilsAsync(byte.Parse(read.Address), fragment.StartRegister, fragment.RegisterNum);

                                byte[] bytes = ModbusConvert.BoolToByte(result.Result);

                                allbytes.AddRange(bytes);
                            }
                            break;

                        case "02":        //只读属性
                            {
                                //返回的线圈状态
                                Task <bool[]> result = master.ReadInputsAsync(byte.Parse(read.Address), fragment.StartRegister, fragment.RegisterNum);
                                byte[] bytes         = ModbusConvert.BoolToByte(result.Result);

                                allbytes.AddRange(bytes);
                            }
                            break;

                        case "03":        //HR保持寄存器,可写可读
                            {
                                //返回的数据全部是ushort 需要将ushort 转换为byte在进行传递
                                Task <ushort[]> result = master.ReadHoldingRegistersAsync(byte.Parse(read.Address), fragment.StartRegister, fragment.RegisterNum);
                                byte[] bytes           = ModbusConvert.Ushorts2Bytes(result.Result);
                                allbytes.AddRange(bytes);
                            }
                            break;

                        case "04":        //只读属性
                            {
                                //返回的数据全部是ushort 需要将ushort 转换为byte在进行传递
                                Task <ushort[]> result = master.ReadInputRegistersAsync(byte.Parse(read.Address), fragment.StartRegister, fragment.RegisterNum);
                                byte[] bytes           = ModbusConvert.Ushorts2Bytes(result.Result);

                                allbytes.AddRange(bytes);
                            }
                            break;
                        }
                    }
                    return(allbytes);
                }
                catch
                {
                    return(allbytes);
                }
            });

            return(task);
        }