Форум программистов, компьютерный форум, киберфорум
КИП, датчики
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/34: Рейтинг темы: голосов - 34, средняя оценка - 4.53
5 / 5 / 1
Регистрация: 28.04.2017
Сообщений: 59
1

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

28.04.2017, 13:33. Показов 6217. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте уважаемые форумчане! Возникла проблема с чтением значения температуры на втором канале прибора ТРМ-138 (тип термопары ТХК(L)). Написал небольшую программку на C#, в которой вместо интерпретируемого ответа от прибора приходит какая то мне не понятная фигня) с Modbus до этого случая дел не имел, да и в программировании не слишком силён, поэтому хотелось бы услышать мнение старших товарищей)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
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 всё работает нормально(скрины прилагаются). Может кто подскажет где ошибка?)
ТРМ-138-ModBus RTU. Не могу считать показания с термопары на втором канале
[ATTACH]
ТРМ-138-ModBus RTU. Не могу считать показания с термопары на втором канале
[/ATTACH]
Миниатюры
ТРМ-138-ModBus RTU. Не могу считать показания с термопары на втором канале  
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.04.2017, 13:33
Ответы с готовыми решениями:

Эмулятор ТРМ-138
Разрабатывал программу, которая должна опрашивать состояние терморегуляторов ТРМ-138. Отлаживать её...

Нет связи между модулем ввода (modbus rtu slave) и программой modbus poll на ноутбуке
Добрый день форумчанам. Сконфигурирован модуль modbus rtu slave в Ovation system. Опыт работы с...

Преобразование modbus rtu в modbus tcp
Суть проблемы: есть устройство, оно работает по протоколу modbus rtu, но нужно подключиться к нему...

Modbus RTU. Запись в modbus регистр
Доброго всем времени суток. qt5.15 Из приложения должен формироваться запрос — &quot;01 06 00 00 00...

Modbus RTU
Здравствуйте, пытаюсь решить задачу. Нужно послать значение какой-либо переменной с...

5
Модератор
Эксперт по электронике
8515 / 4369 / 1648
Регистрация: 01.02.2015
Сообщений: 13,569
Записей в блоге: 9
28.04.2017, 23:31 2
Чтение регистра 03 функция.
Float32 занимает два регистра.

В функции ReadHoldingRegister вы что-то странное делаете - заполняете data какими-то константами вместо параметров.
Ну и для трм212 я обменивал местами байты каждого принятого Float32 с little-endian на big-endian (или наоборот).

Кроме того. Этой зимой на объекте выяснил, что трм138 бывают нескольких модификаций. Основное различие проходит по августу 2009 - когда добавилась поддержка ModBus RTU, которой ранее не было. Может быть у вас ещё более ранний прибор.

Добавлено через 6 минут
Для работы со своими приборами фирма Овен предлагает DLL с готовыми процедурами и примерами http://www.owen.ru/catalog/bib... l/opisanie
Хоть я ими не пользовался, но они существуют

Добавлено через 16 минут
Ваш запрос должен быть (hex)
10 03 00 08 00 02 LL HH
Запрос
00 - адрес устройства
01 - функция
02 - адрес первого из группы считываемых регистров hi
03 - то же, lo
04 - количество считываемых регистров hi
05 - то же, lo
06 - crc16 lo
07 - то же hi
Судя по РЭ значение температуры 2-го канала измерения начинается с адреса 0x0008.
0
5 / 5 / 1
Регистрация: 28.04.2017
Сообщений: 59
29.04.2017, 09:40  [ТС] 3
Спасибо за ответ. С получение ответа разобрался) библиотеки кстати не работают на Win7x64 и тех.поддержка ОВНА не смогла дать адекватный ответ как с этим быть) теперь у меня встал вопрос с обработкой ответа) я получаю сообщения
16 4 2 132 97 231 219 последние 4-и значения изменяются в зависимости от изменения температуры. Как я понимаю мне надо работать со значениями 132 97 т.к два последних это CRC а 3-и первых не меняются (адрес, код команды и ещё что-то)) ). Может поможете в этом вопросе? в каком направлении капать как мне полученные байты преобразовать в показания температуры? ) у ModScan это получается сделать, а у меня пока нет))
0
magirus
29.04.2017, 12:49
  #4

Не по теме:

Цитата Сообщение от kolyasoul Посмотреть сообщение
тех.поддержка ОВНА не смогла дать адекватный ответ как с этим быть
они много на что ответить не могут. на их форуме тоже ответов не дают?

0
Модератор
Эксперт по электронике
8515 / 4369 / 1648
Регистрация: 01.02.2015
Сообщений: 13,569
Записей в блоге: 9
30.04.2017, 10:40 5
Лучший ответ Сообщение было отмечено magirus как решение

Решение

kolyasoul, я уже ответил вам. В ответ на запрос приходит ответ. Если отбросить служебные данные, то возвращается в данном случае 4 байта. Это 4 байта и есть температура в формате Float32 (эквивалент Single в Delphi). Но, для использования придётся эти 4 байта расположить в обратном порядке, т.е. 4-й, 3-й, 2-й, 1-й. И теперь это будет нормальный Single, который понимает компьютер на базе i80x86.
Т.е. нужно преобразовать формат числа из big-endian в little-endian (или наоборот, я их путаю, но в данном случае это несущественно, т.к. изменение порядка байт в двойном слове нужно выполнять одинаково в обоих случаях).

Добавлено через 2 минуты
По поводу работы библиотек на Win7x64 вечером попробую проверить на трм212.
Но по воспоминаниям, они работают, только нужно правильно разместить DLL в каталогах Windows - т.к. для x64 что-то изменилось по сравнению с x32.
0
5 / 5 / 1
Регистрация: 28.04.2017
Сообщений: 59
02.06.2017, 12:19  [ТС] 6
Всем, спасибо вопрос решен, тема закрыта.
0
02.06.2017, 12:19
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.06.2017, 12:19
Помогаю со студенческими работами здесь

modbus rtu
Добрый день Не могу разобраться с работой modbus rtu что значит запрос 024600e260? 02 - номер...

ModBus RTU и Arduino
Здравствуйте ! Я из Ардуино МЕГА 2560 передаю данные в панель СП270 по МодВас РТУ функцией: ...

Modbus rtu wincc
Добрый день. Есть wincc advanced v13. Необходимо проверить наличие/отсутствие связи по канала...

ModBus rtu на stm32f030
Доброго вечер всем! При портировании freemodbus v1.5 на stm32f0 возникли небольшие проблемы. Код...

Modbus RTU на STM32F10x
Доброго времени суток. Столкнулся с задачей реализации Modbus на STM32f100C4T6B. До этого момента...

Запрос MODBUS RTU
Добрый день! Никак не получается получить ответ от МВА8. По протоколу ascii проблем не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru