-----
18.11.2017 форум перенесён на другой хостинг. О замеченых глюках просьба сообщать администраторам.
-----
На форуме обязательно:
  1. Заполнить свой профиль на Русском языке. См. Правила, п.2.d.
  2. Не писать свой вопрос в первую попавшуюся тему, а вместо этого создать свою. См. Правила, п.3.a.
Рекламу на своём форуме мы не размещаем ни на каких условиях.

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


Автор темы
kolyagl
здесь недавно
здесь недавно
Сообщения: 13
Зарегистрирован: 28 апр 2017, 13:57
Имя: Николай
Благодарил (а): 2 раза

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

Сообщение kolyagl » 28 апр 2017, 14:00

Здравствуйте уважаемые форумчане! Возникла проблема с чтением значения температуры на втором канале прибора ТРМ-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 всё работает нормально(скрины прилагаются). Может кто подскажет где ошибка?)
Безымянный3.jpg
Безымянный2.jpg
Безымянный.jpg
У вас нет необходимых прав для просмотра вложений в этом сообщении.

Аватара пользователя

aranea
знаток Eplan
знаток Eplan
Сообщения: 678
Зарегистрирован: 21 сен 2012, 21:45
Имя: Воробьев Александр
Благодарил (а): 2 раза
Поблагодарили: 43 раза
Контактная информация:

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

Сообщение aranea » 28 апр 2017, 14:16

01 READ COIL STATUS Получение текущего состояния (ON/OFF) группы логических ячеек.
02 READ INPUT STATUS Получение текущего состояния (ON/OFF) группы дискретных входов.
03 READ HOLDING REGISTERS Получение текущего значения одного или нескольких регистров хранения.
04 READ INPUT REGISTERS Получение текущего значения одного или нескольких входных регистров.
05 FORCE SINGLE COIL Изменение логической ячейки в состояние ON или OFF.
06 FORCE SINGLE REGISTER Запись нового значения в регистр хранения.
15 FORCE MULTIPLE COILS Изменить состояние (ON/OFF) нескольких последовательных логических ячеек.
16 FORCE MULTIPLE REGISTERS Установить новые значения нескольких последовательных регистров.

читайте документацию по Modbus RTU
переводите 132 в hex и анализируйте исключения

запускаете ModScan, нажимаете ShowTraffic и смотрите, что он шлет и принимает
то же самое отправляете вашей программой (получаете и разбираете)
если есть ModSim можно сесть на шину и слушать сеть (запрос от вашей программы - ответ от ТРМ)
Изображение


ASUTP_PLC
завсегдатай
завсегдатай
Сообщения: 570
Зарегистрирован: 11 ноя 2012, 17:21
Имя: Нурисламов Руслан М.
Благодарил (а): 9 раз
Поблагодарили: 11 раз

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

Сообщение ASUTP_PLC » 28 апр 2017, 15:22

Все достаточно прозаично. У вас полностью рабочий пример на С, но при этом вы сами не знаете, какой правильно сформировать запрос, чтоб что-то получить. В вашем примере вы пишете в устройство, и устройство вам говорит, что по такому адресу произведена успешно запись.
Чтоб читать данные меняете адрес регистра в запросе, меняете функцию и получаете результат.
Если более детально, можете в личку дать конф. модскана, по ней могу подсказать что написать в запрос.
Ошибки никакой нет, просто в вашем примере нет опроса температур.

Аватара пользователя

aranea
знаток Eplan
знаток Eplan
Сообщения: 678
Зарегистрирован: 21 сен 2012, 21:45
Имя: Воробьев Александр
Благодарил (а): 2 раза
Поблагодарили: 43 раза
Контактная информация:

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

Сообщение aranea » 28 апр 2017, 15:30

1. Устройство говорит
16 - я устройство №16
132 = 0x84 = 0x80 | 0x04 - это сообщение об ошибке в ответ на запрос функции 04 (READ INPUT REGISTERS)
03 - код исключительной ситуации ILLEGAL DATA VALUE Значения в поле данных недопустимы для данного SL.
83 04 - CRC

2. на картинке в ModScan и коде разный адрес регистра (7 и 4)
3. ReadHoldingRegister(..., 04, ....) - сами знаете
4. попутаны старший и младший байты в номере регистра и кол-ве регистров
Изображение


Автор темы
kolyagl
здесь недавно
здесь недавно
Сообщения: 13
Зарегистрирован: 28 апр 2017, 13:57
Имя: Николай
Благодарил (а): 2 раза

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

Сообщение kolyagl » 28 апр 2017, 16:39

aranea писал(а):Источник цитаты 1. Устройство говорит
16 - я устройство №16
132 = 0x84 = 0x80 | 0x04 - это сообщение об ошибке в ответ на запрос функции 04 (READ INPUT REGISTERS)
03 - код исключительной ситуации ILLEGAL DATA VALUE Значения в поле данных недопустимы для данного SL.
83 04 - CRC

2. на картинке в ModScan и коде разный адрес регистра (7 и 4)
3. ReadHoldingRegister(..., 04, ....) - сами знаете
4. попутаны старший и младший байты в номере регистра и кол-ве регистров

Огромное Вам спасибо за столь быстрый и полезный ответ) теперь при побайтовом чтении com порта значения изменяются) постоянными остаются только первые 3-и байта. Изменил код метода на

Код: Выделить всё

 public static byte[] ReadHoldingRegister(byte id, byte command, byte startAddress, byte length)
        {
            byte[] data = new byte[8];
            byte High, Low;
            data[0] = Convert.ToByte(016);
            data[1] = Convert.ToByte(004);
            byte[] _adr = BitConverter.GetBytes(startAddress);
            data[2] =00;
            data[3] =06;
            byte[] _length = BitConverter.GetBytes(length);
            data[4] = 00;
            data[5] = 01;
           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;
        }

теперь осталось интерпретировать получаемые значения и перевести их в температуру) если можете помочь и в этом то радости моей не будет предела)))

Аватара пользователя

aranea
знаток Eplan
знаток Eplan
Сообщения: 678
Зарегистрирован: 21 сен 2012, 21:45
Имя: Воробьев Александр
Благодарил (а): 2 раза
Поблагодарили: 43 раза
Контактная информация:

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

Сообщение aranea » 28 апр 2017, 17:16

так и в чем вопрос?
Изображение


Автор темы
kolyagl
здесь недавно
здесь недавно
Сообщения: 13
Зарегистрирован: 28 апр 2017, 13:57
Имя: Николай
Благодарил (а): 2 раза

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

Сообщение kolyagl » 28 апр 2017, 17:36

aranea писал(а):Источник цитаты так и в чем вопрос?

вопрос в том как обработать полученное сообщение 16 4 2 126 44 101 78 и получить значение температуры) т.е как я понимаю обрабатывать надо 126 44?

Аватара пользователя

aranea
знаток Eplan
знаток Eplan
Сообщения: 678
Зарегистрирован: 21 сен 2012, 21:45
Имя: Воробьев Александр
Благодарил (а): 2 раза
Поблагодарили: 43 раза
Контактная информация:

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

Сообщение aranea » 28 апр 2017, 20:17

Почитайте что-нибудь на эту тему: овен трм-138, тхк (L), modus rtu, c#
Надо что-то делать с вашим "не очень силен"
Изображение


Автор темы
kolyagl
здесь недавно
здесь недавно
Сообщения: 13
Зарегистрирован: 28 апр 2017, 13:57
Имя: Николай
Благодарил (а): 2 раза

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

Сообщение kolyagl » 29 апр 2017, 08:24

aranea писал(а):Источник цитаты Почитайте что-нибудь на эту тему: овен трм-138, тхк (L), modus rtu, c#
Надо что-то делать с вашим "не очень силен"

Ну этим я параллельно и занимаюсь) для меня сейчас важнее решить эту проблему как можно быстрее и если вы КОНКРЕТНЫМИ ОТВЕТАМИ ускорите этот процесс, то мне это очень сильно поможет. Ваше замечание по поводу моего "не очень силен" я полностью поддерживаю и работаю над этим.

Аватара пользователя

aranea
знаток Eplan
знаток Eplan
Сообщения: 678
Зарегистрирован: 21 сен 2012, 21:45
Имя: Воробьев Александр
Благодарил (а): 2 раза
Поблагодарили: 43 раза
Контактная информация:

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

Сообщение aranea » 29 апр 2017, 11:32

вы получили ответ, из них выбрали два числа - какие дальнейшие мысли?
почему вы не удалите две лишние строчки в этом?

Код: Выделить всё

            data[0] = Convert.ToByte(016);
            data[1] = Convert.ToByte(004);
            byte[] _adr = BitConverter.GetBytes(startAddress);
            data[2] =00;
            data[3] =06;
            byte[] _length = BitConverter.GetBytes(length);
            data[4] = 00;
            data[5] = 01;

почему у вас функция ReadHoldingRegister выполняет запрос с кодом функции 04 (READ INPUT REGISTERS)?
почему вы ей передаете 4 параметра, но ни один не используете?
почему вы читаете именно регистр №06? что в нем содержится? откуда оно там берется?

хочется увидеть ход ваших мыслей
просто так давать готовый разжеванный ответ, а тем более разбираться в оборудовании за вас - не очень интересно
Изображение


Автор темы
kolyagl
здесь недавно
здесь недавно
Сообщения: 13
Зарегистрирован: 28 апр 2017, 13:57
Имя: Николай
Благодарил (а): 2 раза

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

Сообщение kolyagl » 29 апр 2017, 18:20

почему у вас функция ReadHoldingRegister выполняет запрос с кодом функции 04 (READ INPUT REGISTERS)?
Потому что мне необходимо считать параметры с аналогового входа и так написано в инструкции к прибору "Код функции 04" я понял, что это оно и есть.
почему вы ей передаете 4 параметра, но ни один не используете?
В смысле не использую? Потом это всё собирается в байтовый масив и и отправляется в порт serialPort1.Write(ReadHoldingRegister(16, 04, 0007, 0001), 0, 8); (на значения в скобках внимание не обращайте к реально передоваемой строке они отношения не имеют)
почему вы читаете именно регистр №06? что в нем содержится? откуда оно там берется?
Дословно из инструкции "Канал измерителя 2"-к нему как раз и подключена термопара, "значение температуры команда Modbus 0x0006"- как я понимаю это номер регистра из которого берется температура.

Ответ от прибора 16 4 2 114 184 97 225 (показания в ModScan 294... тип данных int). Прибор мне передают byte т.е первые три байта это номер прибора, номер команды ModBus и номер канала, дальше идут два байта с данными 114 184, я думал что если представлю эти значения как отношение в виде 255/114 и 255/184 а потом полученное значение умножу на 65535 я получу значение температуры, но всё оказалось не так просто. CRC в процессе расчёта температуры используется? Хотелось бы получить формулу или алгоритм как из полученных числе, рассчитать температуру (как это делает ModScan))


Автор темы
kolyagl
здесь недавно
здесь недавно
Сообщения: 13
Зарегистрирован: 28 апр 2017, 13:57
Имя: Николай
Благодарил (а): 2 раза

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

Сообщение kolyagl » 29 апр 2017, 19:45

тема закрыта) всем огромное спасибо!!!