Example #1
0
        private async void ButtonBase_OnClick(object sender, RoutedEventArgs e)
        {
            if (_master == null)
            {
                var port = await GetModBusUwP();

                if (port != null)
                {
                    var modbusFactory = new ModbusFactory();
                    _master = modbusFactory.CreateRtuMaster(port);
                    _master.Transport.ReadTimeout             = 1000;
                    _master.Transport.WriteTimeout            = 1000;
                    _master.Transport.Retries                 = 3;
                    _master.Transport.WaitToRetryMilliseconds = 250;
                }
            }

            if (_master == null)
            {
                InfoTxt.Text = "No ModBus!";
                return;
            }

            var r1 = await _master.ReadInputRegistersAsync(1, 35061, 2);

            try
            {
                var r = await _master.ReadInputRegistersAsync(9, 35061, 2);

                UInt32 value = (UInt32)r[0] << 16 | r[1];
                Debug.WriteLine($"WeatherStation Operating time: {value}s");
            }
            catch (Exception exception)
            {
                ErrorTxt.Text = "Timeout!";
            }

            for (int i = 0; i < 10000; i++)
            {
                var ra = await _master.ReadInputRegistersAsync(1, 35001, 64);

                Debug.WriteLine($"{i+1} Bytes Read: {ra.Length}");
                InfoTxt.Text = $"{i + 1} Bytes Read: {ra.Length}";
            }
        }
Example #2
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);
        }