PDA

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



kolyagl
28.04.2017, 13:25
Здравствуйте уважаемые форумчане! Возникла проблема с чтением значения температуры на втором канале прибора ТРМ-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 всё работает нормально(скрины прилагаются).308383083930840

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

capzap
29.04.2017, 09:48
заглянуть для начала сюда (https://ru.wikipedia.org/wiki/Modbus), уяснить что из себя представляет Общая структура ADU, разобраться о чем говорит таблица PDU запроса и ответа для стандартных функций, далее погуглить как собрать из двух байт одно слово, попутно изучить назначение CRC и проверить по последним двум байтам