Esempio n. 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);
        }
Esempio n. 2
0
        public async void Display(byte slaveId, ushort startAddress, ushort numRegisters, IModbusSerialMaster master)
        {
            try
            {
                exception = null;
                master.Transport.ReadTimeout = 500;
                var registers = await master.ReadHoldingRegistersAsync(slaveId, startAddress, numRegisters);

                BeginInvoke((Action)(() =>
                {
                    if (!Fahrenheits)
                    {
                        lblUnitTemp.Text = "°C";
                    }
                    else
                    {
                        lblUnitTemp.Text = "°F";
                    }
                    lblUnitHum.Text = " %";
                    var humRaw = BitConverter.GetBytes(registers[0]);
                    var humidity = (float)(BitConverter.ToInt16(humRaw, 0)) / 10;

                    lblHum.Text = humidity.ToString("0.0");

                    var tempRaw = BitConverter.GetBytes(registers[1]);
                    var temperature = (float)(BitConverter.ToInt16(tempRaw, 0)) / 10;
                    lblTemp.Text = GetTemperature(temperature).ToString("0.0");

                    if (HumidityMin.date < new DateTime(2018))
                    {
                        HumidityMin.value = humidity;
                        HumidityMin.date = DateTime.Now;
                        TemperatureMin.value = temperature;
                        TemperatureMin.date = DateTime.Now;
                        HumidityMax.value = humidity;
                        HumidityMax.date = DateTime.Now;
                        TemperatureMax.value = temperature;
                        TemperatureMax.date = DateTime.Now;
                    }
                    if (humidity > HumidityMax.value)
                    {
                        HumidityMax.value = humidity;
                        HumidityMax.date = DateTime.Now;
                    }
                    if (temperature > TemperatureMax.value)
                    {
                        TemperatureMax.value = temperature;
                        TemperatureMax.date = DateTime.Now;
                    }
                    if (humidity < HumidityMin.value)
                    {
                        HumidityMin.value = humidity;
                        HumidityMin.date = DateTime.Now;
                    }
                    if (temperature < TemperatureMin.value)
                    {
                        TemperatureMin.value = temperature;
                        TemperatureMin.date = DateTime.Now;
                    }
                }));
            }
            catch (Exception ex)
            {
                BeginInvoke((Action)(() =>
                {
                    lblHum.Text = "Err";
                    lblTemp.Text = Convert.ToString("Err");
                    exception = ex;
                }));
            }
        }