Chodzi mi o to, aby stworzyć program, który będzie odporny na wypięcie kabla, utratę połączenia itp.
Generalnie teraz jest tak:
- Jeśli uruchomię program i nacisnę połącz bez wpiętego kabla to okno główne wisi przez kilkanaście sekund i wyświetla:
An unhandled exception of type 'System.Net.Sockets.SocketException' occurred in System.dll
Additional information: Próba połączenia nie powiodła się, ponieważ połączona strona nie odpowiedziała poprawnie po ustalonym okresie czasu lub utworzone połączenie nie powiodło się, ponieważ połączony host nie odpowiedział
- Jeśli uruchomię program, nacisnę połącz z wpiętym kablem - program działa i sczytuje dane. Gdy w momencie połączenia wypnę kabel, znów okno główne wisi. Po kilku sekundach na moment się odświeży, a po jeszcze kilku kolejnych sekundach znów wyświetla komunikat, który wkleiłem powyżej.
Poza tym ramka tekstowa "Tekst0" w żadnym wypadku nie pokazuje stanu "Nie połączono!".
Wklejam kod jeszcze raz po ostatnich poprawkach:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Collections;
using System.Windows.Threading;
using System.Threading;
namespace Modbus_WPF
{
/// <summary>
/// Logika interakcji dla klasy MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
SolidColorBrush Kolor_czerwony = new SolidColorBrush();
SolidColorBrush Kolor_zielony = new SolidColorBrush();
TcpClient klient;
NetworkStream serverStream;
DispatcherTimer timer = new DispatcherTimer();
//Timer timerek = new Timer(timer_Tick, null, 100, Timeout.Infinite);
public MainWindow()
{
InitializeComponent();
Kolor_czerwony.Color = Colors.Red;
Kolor_zielony.Color = Colors.Green;
timer.Interval = new TimeSpan(0, 0, 0, 0, 100);
}
public void wyslij_zapytanie(byte[] tablica)
{
serverStream = klient.GetStream();
serverStream.Write(tablica, 0, tablica.Length);
serverStream.Flush();
}
public void odbierz(byte[] tablica)
{
serverStream.Read(tablica, 0, (int)klient.ReceiveBufferSize);
}
// metoda do odczytu wyjsc bitowych - funkcja 01h
private int odczyt_wyjsc(byte adres1, byte adres2)
{
byte[] do_wyslania = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, adres1, adres2, 0x00, 0x08 };
byte[] odebrane = new byte[10025];
wyslij_zapytanie(do_wyslania);
odbierz(odebrane);
int wynik = odebrane[9];
return wynik;
}
// metoda do odczytu n rejestrow - funkcja 03h
private int odczyt_rejestrow (byte adres1, byte adres2)
{
byte[] do_wyslania = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x03, adres1, adres2, 0x00, 0x01 };
byte[] odebrane = new byte[10025];
wyslij_zapytanie(do_wyslania);
odbierz(odebrane);
int wynik = (odebrane[9] << 8) + (odebrane[10]);
return wynik;
}
// metoda do zapisu 1 bitu - funkcja 05h
private int zapis_wyjscia (byte adres1, byte adres2)
{
byte[] do_wyslania = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x05, adres1, adres2, 0xFF, 0x00 };
byte[] odebrane = new byte[10025];
wyslij_zapytanie(do_wyslania);
odbierz(odebrane);
int wynik = odebrane[9];
return wynik;
}
//metoda do zapisu 1 rejestru - funkcja 06h
private int zapis_rejestru (byte adres1, byte adres2)
{
byte[] do_wyslania = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, adres1, adres2, 0x00, 0x03 };
byte[] odebrane = new byte[10025];
wyslij_zapytanie(do_wyslania);
odbierz(odebrane);
int wynik = odebrane[9];
return wynik;
}
public void timer_Tick(object sender, EventArgs e)
{
if (klient == null || !klient.Connected)
{
klient = new TcpClient();
klient.Connect("10.3.0.95", 502);
}
try
{
if (klient != null && klient.Connected)
{
Tekst0.Text = ("Połączono!");
int seba1;
seba1 = odczyt_wyjsc(0x05, 0x00);
Tekst2.Text = Convert.ToString(seba1);
BitArray b = new BitArray(new int[] { seba1 });
Kontrolka8.Fill = b[0] ? Kolor_zielony : Kolor_czerwony;
Kontrolka7.Fill = b[1] ? Kolor_zielony : Kolor_czerwony;
Kontrolka6.Fill = b[2] ? Kolor_zielony : Kolor_czerwony;
Kontrolka5.Fill = b[3] ? Kolor_zielony : Kolor_czerwony;
Kontrolka4.Fill = b[4] ? Kolor_zielony : Kolor_czerwony;
Kontrolka3.Fill = b[5] ? Kolor_zielony : Kolor_czerwony;
Kontrolka2.Fill = b[6] ? Kolor_zielony : Kolor_czerwony;
Kontrolka1.Fill = b[7] ? Kolor_zielony : Kolor_czerwony;
int seba2;
seba2 = odczyt_rejestrow(0x10, 0x00);
Tekst4.Text = Convert.ToString(seba2);
}
else
{
Tekst0.Text = "Nie połączono!";
}
}
catch (Exception ex)
{
Tekst1.Text = ("Error..... \n" + ex.StackTrace);
}
}
private void Przycisk1_Click(object sender, RoutedEventArgs e)
{
//Thread thread = new Thread(new ThreadStart(Watek1));
//thread.Start();
Thread thread1 = new Thread(new ThreadStart(Watek2));
thread1.Start();
}
//public void Watek1()
//{
// klient = new TcpClient();
// klient.Connect("10.3.0.119", 502);
//}
public void Watek2()
{
timer.Start();
timer.Tick += timer_Tick;
}
private void Przycisk2_Click(object sender, RoutedEventArgs e)
{
Tekst3.Text = "Test 1";
}
private void Przycisk3_Click(object sender, RoutedEventArgs e)
{
Tekst3.Text = "Test 2";
}
private void Przycisk4_Click(object sender, RoutedEventArgs e)
{
klient.Close();
}
}
}