initial version
This commit is contained in:
141
Form1.cs
Normal file
141
Form1.cs
Normal file
@@ -0,0 +1,141 @@
|
||||
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.Ports;
|
||||
using System.Drawing.Drawing2D;
|
||||
using System.Threading;
|
||||
using System.Runtime;
|
||||
using System.Web;
|
||||
|
||||
namespace Gidrolock_Modbus_Scanner
|
||||
{
|
||||
public partial class App : Form
|
||||
{
|
||||
public bool isAwaitingResponse = false;
|
||||
public short[] res = new short[12];
|
||||
public SerialPort port = new SerialPort();
|
||||
|
||||
public App()
|
||||
{
|
||||
InitializeComponent();
|
||||
this.port.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(PortDataReceived);
|
||||
this.UpDown_ModbusID.Value = 30;
|
||||
}
|
||||
void App_FormClosed(object sender, FormClosedEventArgs e)
|
||||
{
|
||||
port.Close();
|
||||
if (!port.IsOpen)
|
||||
Application.Exit();
|
||||
}
|
||||
|
||||
void Form1_Load(object sender, EventArgs e)
|
||||
{
|
||||
CBox_Ports.Items.AddRange(SerialPort.GetPortNames());
|
||||
if (CBox_Ports.Items.Count > 0)
|
||||
CBox_Ports.SelectedIndex = 0;
|
||||
Init();
|
||||
}
|
||||
|
||||
void Init()
|
||||
{
|
||||
if (UpDown_ModbusID.Value == 0)
|
||||
ButtonConnect.Text = "Найти адрес";
|
||||
else ButtonConnect.Text = "Подключиться";
|
||||
}
|
||||
|
||||
private async void ButtonConnect_Click(object sender, EventArgs e)
|
||||
{
|
||||
if (CBox_Ports.Text == "")
|
||||
MessageBox.Show("Необходимо выбрать COM порт.", "Ошибка", MessageBoxButtons.OK);
|
||||
if (UpDown_ModbusID.Value == 0)
|
||||
MessageBox.Show("Глобальное вещание пока не поддерживается");
|
||||
try
|
||||
{
|
||||
if (port.IsOpen)
|
||||
port.Close();
|
||||
|
||||
port.Handshake = Handshake.None;
|
||||
port.PortName = CBox_Ports.Text;
|
||||
port.BaudRate = 9600;
|
||||
port.Parity = Parity.None;
|
||||
port.DataBits = 8;
|
||||
port.StopBits = StopBits.One;
|
||||
|
||||
port.ReadTimeout = 10;
|
||||
port.WriteTimeout = 10;
|
||||
|
||||
|
||||
|
||||
port.Open();
|
||||
var send = await Modbus.ReadRegAsync(port, (byte)FunctionCode.HoldingRegister, (byte)UpDown_ModbusID.Value, 128, 1);
|
||||
isAwaitingResponse = true;
|
||||
Task timer = Task.Delay(2000);
|
||||
await timer.ContinueWith( _ =>
|
||||
{
|
||||
if (isAwaitingResponse)
|
||||
MessageBox.Show("Истекло время ожидания ответа.", "Ошибка");
|
||||
});
|
||||
|
||||
}
|
||||
catch (Exception err)
|
||||
{
|
||||
port.Close();
|
||||
MessageBox.Show(err.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
}
|
||||
}
|
||||
|
||||
void CBox_Ports_Click(object sender, EventArgs e)
|
||||
{
|
||||
CBox_Ports.Items.Clear();
|
||||
CBox_Ports.Items.AddRange(SerialPort.GetPortNames());
|
||||
}
|
||||
|
||||
void PortDataReceived(object sender, EventArgs e)
|
||||
{
|
||||
Console.WriteLine("Data receieved on Serial Port");
|
||||
isAwaitingResponse = false;
|
||||
int len;
|
||||
byte rdxLen = 0;
|
||||
|
||||
try
|
||||
{
|
||||
len = port.BytesToRead;
|
||||
byte[] data = new byte[len];
|
||||
port.Read(data, rdxLen, len);
|
||||
rdxLen += (byte)len;
|
||||
int lastByte = len - 1;
|
||||
for (int i = len - 1; i >= 0; i--)
|
||||
{
|
||||
if (data[i] != 0)
|
||||
{
|
||||
lastByte = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
string dataString = BitConverter.ToString(data);
|
||||
string dataCleaned = "";
|
||||
for (int i = 0; i < dataString.Length; i++)
|
||||
{
|
||||
if (dataString[i] == '-')
|
||||
dataCleaned += " ";
|
||||
else dataCleaned += dataString[i];
|
||||
}
|
||||
MessageBox.Show("Получен ответ от устройства: " + dataCleaned, "Успех", MessageBoxButtons.OK);
|
||||
}
|
||||
catch (Exception err)
|
||||
{
|
||||
MessageBox.Show(err.Message);
|
||||
}
|
||||
|
||||
port.Close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public enum FunctionCode { Coil, DiscreteInput, HoldingRegister, InputRegister}
|
||||
Reference in New Issue
Block a user