Код: Выделить всё
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();
}
}
}
}