Здравствуйте, не так много времени прошло с того момента как я создал первую тему на этом форуме) и снова у меня возникли трудности теперь с обработкой ответа, а именно с тем, что каким то мне пока не понятным образом программа написанная мною на C# некорректно обрабатывает ответ от ПЛК-150. Суть проблемы вот в чём ПЛК отправляет мне значение float в виде 4-х байт, задача стоит в том, чтобы эти 4-е байта преобразовать в значение float которое отправляет мне ПЛК. С этой задачей я вроде справился т.к полученные байты я преобразую во float но тут выяснилось, что эти значения не совпадают+ к этому значения в моей программе постоянно изменяются причем не незначительно а как то рандомно. При этом в Modscan всё отлично работает и запрос отправляемый мной полностью совпадает с запросом отправляемым Modscan. А теперь основной вопрос как так получилось, что при одинаковом запросе я получаю разные ответы?) скрины и код к рассказу прилагаются . Да и ещё один интересный факт данная программа нормально работала с ТРМ-138 по суть основа и была взята из той программы
Код:
namespace ТРМ_138
{
    
    public partial class Form1 : Form
    {
        SerialPort serialPort1 = new SerialPort("COM5", 115200, Parity.None, 8, StopBits.One);
        public Form1()
        {
            InitializeComponent();
           
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            serialPort1.Open();
        }

        //Метод формирования запроса ModBus RTU
        public static byte[] ReadHoldingRegister(byte id, byte command, byte startAddress, byte length)
        {
            byte[] data = new byte[8];
            byte High, Low;
            //Адрес устройства
            data[0] = Convert.ToByte(001);
            //Код функции Modbus
            data[1] = Convert.ToByte(004);
            //Начальный адрес регистра
            byte[] _adr = BitConverter.GetBytes(startAddress);
            data[2] = 00;//[1] младший
            data[3] = 00;//[0] старший
            //Колличество регистров которое необходимо считать
            byte[] _length = BitConverter.GetBytes(length);
            data[4] = 00;//[1] 
            data[5] = 02;//[0]
                         //Контрольная сумма CRC
            myCRC(data, 6, out High, out Low);
            data[6] = Low;//[1]
            data[7] = High;//[0]
            return data;
        }

        //Метод расчёта контрольной суммы CRC-16
        public static void myCRC(byte[] message, int length, out byte CRCHigh, out byte CRCLow)
        {
            ushort CRCFull = 0xFFFF;
            for (int i = 0; i < length; i++)
            {
                CRCFull = (ushort)(CRCFull ^ message[i]);
                for (int j = 0; j < 8; j++)
                {
                    if ((CRCFull & 0x0001) == 0)
                        CRCFull = (ushort)(CRCFull >> 1);
                    else
                    {
                        CRCFull = (ushort)((CRCFull >> 1) ^ 0xA001);
                    }
                }
            }
            CRCHigh = (byte)((CRCFull >> 8) & 0xFFFF);
            CRCLow = (byte)(CRCFull & 0xFFFF);
        }

        private void button1_Click(object sender, EventArgs e)
        {
          
          timer1.Enabled=true;         
        }
        private void timer1_Tick(object sender, EventArgs e)
        {
           
             { //Отправка команды для ПЛК-150
                 serialPort1.Write(ReadHoldingRegister(16, 004, 0000, 0010), 0, 8);

                //Побайтовое считывание ответа от ПЛК-150
                byte[] IntArr = new byte[9];
                 for (int i = 0; 8 >= i; ++i)
                 {  
                     IntArr[i] = Convert.ToByte(serialPort1.ReadByte());        
                 }

                string otv = string.Concat(IntArr[0], "   ", IntArr[1], "   ", IntArr[2], "   ", IntArr[3], "   ", IntArr[4], "   ", IntArr[5], "   ", IntArr[6], "   ", IntArr[7], "   ", IntArr[8]);
                textBox5.Text = otv;
           
                //Конвертирование 4-х байт полученных от ПЛК-150 во float
                float value1 =BitConverter.ToSingle(IntArr,2);
                textBox1.Text = value1.ToString();

             }       
        }
    }
}
3 картинка.jpg

2 картинка.jpg

1 картинка.jpg

4 картинка.jpg

Помогите советом дельным)))