Пример #1
0
        private dynamic Send(byte[] data)
        {
            dynamic answer = new ExpandoObject();

            answer.success   = false;
            answer.error     = string.Empty;
            answer.errorcode = DeviceError.NO_ERROR;

            byte[] buffer = null;

            //var attempts_total = (packagesSent > 0) ? SEND_ATTEMPTS_COUNT : 1; // непонятный оператор 04.03.2019
            var attempts_total = SEND_ATTEMPTS_COUNT;

            for (var attempts = 0; (attempts < attempts_total) && (answer.success == false); attempts++)
            {
                var timeout = TIMEOUT_TIME_MIN * (attempts + 1);
                buffer = SendSimple(data, timeout);

                if (buffer.Length == 0)
                {
                    answer.error     = "Нет ответа";
                    answer.errorcode = DeviceError.NO_ANSWER;
                }
                else
                {
                    if (buffer.Length < 5)
                    {
                        answer.errorcode = DeviceError.TOO_SHORT_ANSWER;
                        answer.error     = "в кадре ответа не может содержаться менее 5 байт";
                    }
                    else if (!Crc.CheckReverse(buffer, new Crc16Modbus()))
                    {
                        answer.errorcode = DeviceError.CRC_ERROR;
                        answer.error     = "контрольная сумма кадра не сошлась";
                        answer           = xOAxOD(buffer);
                        if (answer.success)
                        {
                            buffer = answer.buffer;
                        }
                    }
                    else
                    {
                        answer.success   = true;
                        answer.error     = string.Empty;
                        answer.errorcode = DeviceError.NO_ERROR;
                    }
                }
            }

            if (answer.success)
            {
                var offset = 0;
                answer.NetworkAddress = buffer[0];
                if (answer.NetworkAddress == 251)
                {
                    offset = 12;
                }
                answer.Function = buffer.Skip(offset + 1).FirstOrDefault();
                answer.Body     = buffer.Skip(offset + 2).Take(buffer.Length - (offset + 2 + 2)).ToArray();
                //modbus error
                if (answer.Function > 0x80)//0xc1)
                {
                    answer.errorcode     = DeviceError.DEVICE_EXCEPTION;
                    answer.success       = false;
                    answer.exceptionCode = buffer.Skip(offset + 2).FirstOrDefault();
                    string exceptionMessage = deviceExceptionMessage.ContainsKey(answer.exceptionCode) ? deviceExceptionMessage[answer.exceptionCode] : "";
                    answer.error = $"устройство вернуло ошибку: {answer.exceptionCode} {exceptionMessage}";
                }
            }

            mid++;

            return(answer);
        }