c# serial port okuma sorunu (yazma yapabiliyorum (Modbus haberleşme))

d.harun

Üye
Katılım
24 Nis 2016
Mesajlar
12
Puanları
1
Yaş
30
Merhaba.
Seri port kullanarak data gönderip alıyorum.
Modbus ASCII Haberleşmesi yapmaya çalışıyorum büyük bir kısmını bitirdim.
Modbus test programından yazdığım uygulamaya sorunsuz data alıyorum .
Aynı şekilde ben test programına data gönderiyorum.
PLC ye data gönderince sorunsuz gidiyor istediğimi yapıyor.
Fakat gelen cevap doğru geliyor ama düzgün okuyamıyorum.
fotoğraflardaki gibi görünüyor.
PLC de veya kabloda sorun olduğunu düşünmüyorum başka cihazla düzgün sorunsuz haberleşiyor.

uyugulama kaynak kodları:
https://www.kontrolkalemi.com/forum/attachments/c-deneme-20170427t150320z-001-zip.38348/


Nl4mng.png

yazdığım uygulama bu



YqlmQk.png

test programında düzgün çalışıyor


adDml2.png


sorun burada gönderdiğim datanın aynısı gelmesi gerekiyor fakat soru işarerinin sebebi nedir yardımcı olur musunuz?
Teşekkür ederim.
 

Ekli dosyalar

  • c# deneme-20170427T150320Z-001.zip
    236.9 KB · Görüntüleme: 203
Merhabalar ,
Dostum kaynak kodlarını paylaşmışsın fakat kodlarını açamadım .
C# tarafında serial portun hangi eventini kullanarak haberleşme yapıyosunuz yada Timer mi kullanıyorsunuz ? Timer kullanarak yapıyorsanız kodlayışınızla ilgili veri kayıpları yaşayabilirsiniz. datareceived eventini kullanmanızı tavsiye ederim bu şekilde teamwiever bağlantısı verin yardımcı olayım size.
Kolay gelsin iyi çalışmalar.
 
cevabınız için çok teşekkür ederim .
Timer kullanmıyorum.
 
Dostum öncelikle kolay gelsin geç dönüş yaptığım için kusura bakma ;

Kodlarını revize edip alta yazıyorum çok büyük bir ihtimal çalışacaktır fakat gözden kaçan yerler olabilir öyle bir durum oluşursa teamviewer bağlantısı verirsin özelden bağlanıp bakarım.

Kolay gelsin.

DataReceived tarafında revize yaptım biraz. Timerleri iptal et sadece orayı kullan port bağlantını gerçekleştirdikten sonra. Eğer çapraz iş parçacığı hatası alırsan formun load kısmını şunu yaz ;

Control.CheckForIllegalCrossThreadCalls = false;


Revize edilen kodlar;

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;

namespace ModbusCom
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
AcikPortlariTara();
}
string sonuc;
public void AcikPortlariTara()
{
string[] AcikComPort = SerialPort.GetPortNames();
ComPort.Items.AddRange(AcikComPort);
}

private void PortAcma_Click(object sender, EventArgs e)
{
try
{
serialPort1.PortName = ComPort.Text;
serialPort1.BaudRate = Convert.ToInt32(Baud.Text);
serialPort1.DataBits = Convert.ToInt16(ComboDataBits.Text);
serialPort1.StopBits = StopBits.One;
serialPort1.Parity = Parity.None;
serialPort1.Handshake = Handshake.None;
TextboxComStatus.BackColor = Color.LightGreen;
TextboxComStatus.ForeColor = Color.Black;
TextboxComStatus.Text = ComPort.Text;
PortAcma.Enabled = false;
ButtonPortKapa.Enabled = true;
GroupBox_Gelen.Enabled = true;
GroupBox_Gonderilecek.Enabled = true;
Text_Gelen.Enabled = true;
Text_Gonder.Enabled = true;
Button_Gonder.Enabled = true;
serialPort1.Open();

}
catch
{
MessageBox.Show("Port Mesgul veya com bilgilerinde eksiklik");
}

}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (serialPort1.IsOpen==false)
{
serialPort1.Close();
}
}

private void ButtonPortKapa_Click(object sender, EventArgs e)
{
TextboxComStatus.BackColor = Color.Red;
TextboxComStatus.ForeColor = Color.Black;
TextboxComStatus.Text = ComPort.Text;
PortAcma.Enabled = true;
ButtonPortKapa.Enabled = false;
GroupBox_Gelen.Enabled = false;
GroupBox_Gonderilecek.Enabled = false;
Text_Gelen.Enabled = false;
Text_Gonder.Enabled = false;
Button_Gonder.Enabled = false;
serialPort1.Close();
}

private void Button_Gonder_Click(object sender, EventArgs e)
{
serialPort1.Write(":"+Text_Gonder.Text+"\r\n");
}

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{

byte[] buffer;
buffer = new byte[1];
serialPort1.Read(buffer, 0, 0);
sonuc = serialPort1.ReadExisting();

}
catch (Exception)
{

AnaEkranSeriPort.Write("veri yolu hatasi");
}

}
}


}
 
Merhabalar,

Bende C# MODBUS-PLC haberleşmesi yapıyorum. Verileri okuma ve yazma işlemi yapıyorum. Verileri Plc den okuduğumda veriler gidip geliyor. Timer'ı 600ms yapınca verilerde gitme olmuyor ama 600 ms altında veriler gidip-gelme yapıyor. Nedeni ne olabilir.
 

Forum istatistikleri

Konular
128,161
Mesajlar
915,574
Kullanıcılar
449,920
Son üye
Bafrali1655

Yeni konular

Geri
Üst