Показано с 1 по 3 из 3

Тема: ТРМ-138-ModBus RTU. Не могу считать показания с термопары на втором канале.

  1. #1

    По умолчанию ТРМ-138-ModBus RTU. Не могу считать показания с термопары на втором канале.

    Здравствуйте уважаемые форумчане! Возникла проблема с чтением значения температуры на втором канале прибора ТРМ-138 (тип термопары ТХК(L)). Написал небольшую программку на C#, в которой вместо интерпретируемого ответа от прибора приходит какая то мне не понятная фигня) с Modbus до этого случая дел не имел, да и в программировании не слишком силён, поэтому хотелось бы услышать мнение старших товарищей)

    Код:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.IO;
    using System.IO.Ports;
    
    
    namespace ТРМ_138
    {
       
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                serialPort1.Open(); 
            }
    
         
    
            private void button1_Click(object sender, EventArgs e)
            {
    
                 serialPort1.Write(ReadHoldingRegister(16, 04, 0007, 0001), 0, 8);
                textBox1.Text = serialPort1.ReadByte().ToString();
                
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                //чтение портов доступных в системе
                string[] ports = SerialPort.GetPortNames();
                //Очистка содержимого бокса
                comboBox1.Items.Clear();
                //Добавление найденных портов в бокс
                comboBox1.Items.AddRange(ports);
            }
    
            public static byte[] ReadHoldingRegister(byte id, byte command, byte startAddress, byte length)
            {
                byte[] data = new byte[8];
                byte High, Low;
                data[0] = Convert.ToByte(16);
                data[1] = Convert.ToByte(4);
                byte[] _adr = BitConverter.GetBytes(startAddress);
                data[2] =07;
                data[3] =00;
                byte[] _length = BitConverter.GetBytes(length);
                data[4] = 01;
                data[5] = 00;
               myCRC(data, 6, out High, out Low);
                data[6] = Low;
                data[7] = High;
                //MessageBox.Show(data[6].ToString());
                //MessageBox.Show(data[7].ToString());
                return data;
            }
    
            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);
              // MessageBox.Show(CRCLow.ToString());
              // MessageBox.Show(CRCHigh.ToString());
            }
    
    
            private void textBox1_TextChanged(object sender, EventArgs e)
            {
                
            }
    
            private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
               // TextBox textBox1 = new TextBox();
                //textBox1.Text = serialPort1.ReadExisting().ToString();
            }
        }
    }
    Ответ от прибора выглядит следующим образом: 16 132 3 83 4 при этом не одно из значений не изменяется с изменением температуры. При это в программе ModScan64 всё работает нормально(скрины прилагаются).Безымянный.jpgБезымянный3.jpgБезымянный2.jpg

  2. #2

    По умолчанию

    Вопрос почти решён. Ответ адекватный я стал получать. Теперь вопрос в том как ответ 16 4 2 126 44 101 78 преобразовать в показания температуры?

  3. #3
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,224

    По умолчанию

    заглянуть для начала сюда, уяснить что из себя представляет Общая структура ADU, разобраться о чем говорит таблица PDU запроса и ответа для стандартных функций, далее погуглить как собрать из двух байт одно слово, попутно изучить назначение CRC и проверить по последним двум байтам
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

Похожие темы

  1. Ответов: 3
    Последнее сообщение: 08.09.2015, 06:34
  2. Ответов: 2
    Последнее сообщение: 20.10.2013, 21:05
  3. Modbus RTU считать поток данных
    от Alex_Nev в разделе ПЛК1хх
    Ответов: 9
    Последнее сообщение: 04.08.2013, 21:29
  4. Не могу считать регистр из СП270
    от botanik в разделе Панели оператора (HMI)
    Ответов: 5
    Последнее сообщение: 27.07.2009, 14:58

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •