Beispiel #1
0
        private static void FetchValue(Socket socket, byte node, ModbusFunc func, int addr, DataType ntype, string nswap, string desc, string eu = null, double divider = 1.0)
        {
            Console.CursorTop  = row++;
            Console.CursorLeft = 0;
            try
            {
                socket.Send(PrepareFetchParam(node, func, addr, ntype));

                //Thread.Sleep(200);
                var buff     = new byte[1024];
                var numBytes = socket.Receive(buff);
                if (numBytes > 0)
                {
                    var answer = CleanAnswer(buff);
                    if (CheckAnswer(answer, node, func, ntype))
                    {
                        var result = EncodeFetchAnswer(answer, node, func, addr, ntype, nswap);
                        result.Desc      = desc;
                        result.Unit      = eu;
                        result.TypeValue = ntype;
                        if (divider != 1.0)
                        {
                            result.Value = Math.Round(Convert.ToDouble(result.Value) / divider, 8);
                        }
                        Console.Write(result);
                    }
                }
            }
            catch
            {
            }
        }
Beispiel #2
0
        private static byte[] PrepareFetchParam(byte node, ModbusFunc func, int addr, DataType typeValue)
        {
            var datacount = DataLength(typeValue);

            return(EncodeData(0, 0, 0, 0, 0, 6, (byte)node, (byte)func,
                              (byte)(addr >> 8), (byte)(addr & 0xff),
                              (byte)(datacount >> 8), (byte)(datacount & 0xff)));
        }
Beispiel #3
0
        private static bool CheckAnswer(byte[] answer, byte node, ModbusFunc func, DataType typeValue)
        {
            var datacount = DataLength(typeValue);

            if (datacount * 2 + 3 == answer.Length)
            {
                if (answer[0] == node && answer[1] == (byte)func && datacount * 2 == answer[2])
                {
                    return(true);
                }
            }
            return(false);
        }
Beispiel #4
0
        private static AnswerData EncodeFetchAnswer(byte[] answer, byte node, ModbusFunc func, int regAddr, DataType typeValue, string typeSwap, string unitValue = null)
        {
            var    dataset = new List <byte>(); // содержит данные ответа
            object value   = string.Empty;

            switch (typeValue)
            {
            case DataType.Integer:
                if (answer.Length == 5)
                {
                    var data = BitConverter.ToUInt16(Swap(answer, 3, typeSwap), 0);
                    if (unitValue == "bits")
                    {
                        var sb = new StringBuilder();
                        for (var i = 0; i < 16; i++)
                        {
                            var bc = data & 0x01;
                            if (bc > 0)
                            {
                                sb.Insert(0, "1");
                            }
                            else
                            {
                                sb.Insert(0, "0");
                            }
                            data = (UInt16)(data >> 1);
                            if (i % 4 == 3)
                            {
                                sb.Insert(0, " ");
                            }
                        }
                        value = sb.ToString().Trim();
                    }
                    else
                    {
                        value = data;
                    }
                }
                break;

            case DataType.Long:
                if (answer.Length == 7)
                {
                    var data = BitConverter.ToUInt32(Swap(answer, 3, typeSwap), 0);
                    if (unitValue == "UTC")
                    {
                        var dateTime = ConvertFromUnixTimestamp(data).ToLocalTime();
                        value = dateTime;     //dateTime.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.GetCultureInfo("en-US"));
                    }
                    else
                    {
                        value = data;
                    }
                }
                break;

            case DataType.Single:
                if (answer.Length == 7)
                {
                    var data = BitConverter.ToSingle(Swap(answer, 3, typeSwap), 0);
                    value = data;
                }
                break;

            case DataType.Double:
                if (answer.Length == 11)
                {
                    var data = BitConverter.ToDouble(Swap(answer, 3, typeSwap), 0);
                    value = data;
                }
                break;
            }
            return(new AnswerData()
            {
                Node = node,
                Func = func,
                Addr = regAddr,
                Value = value
            });
        }
 public SetDataPointConfigCmdParams(byte dpIdx, byte probeID, ModbusSource sourceType, ModbusFunc funcCode, ushort sourceRegisterAddr,
                                    ushort requestIntervallMs, byte dataType, ushort scaleFactor,
                                    float limitErrorMin, float limitErrorMax,
                                    float limitWarningMin, float limitWarningMax, float limitHysteresis,
                                    byte customUnitIndex, byte unit) :
     base(0x0)
 {
     //... set bytes
 }