Hidrofor kontrol kartı testi

Başlatan ikivancyurdakul, 27 Şubat 2018, 14:41:33

ikivancyurdakul

Merhaba iyi günler. Forumda yeni olduğum için daha önce bu tür bir başlık varsa şimdiden özür dilerim. Gelelim benim sorunuma. Ben vsde c# ile bir hidrofor pompası test uygulaması yapmak istiyorum. Modbus Rtu ile veri alış verişi yapabiliyorum fakat cihazdan bilgisayarıma gelen veriyi ancak ve ancak modbuss poll,modbuss slave gibi yardımcı bir uygulamadan veri kopyalarak alabiliyorum. Sadece kendi programımı kullanarak uygulama üstünde değerleri float olarak(yani 1.933 A akım geçiyorsa o an 1.933 A akım geçtiğini) görmek için nasıl bir yol izlemeliyim. Cevaplarınız için şimdiden teşekkür ederim.

tunayk

İyi günler , foruma hoşgeldin.

Sorununuz modbus haberleşme mi? Kontrol kartı ihtiyacı mı? PC yazılımını tasarlamak mı? Hidrofor kontrol kartı testinde ne yapacaksınız? Sadece Motor akımları mı okunacak yoksa akım gerilim, basınç vb. tüm ölçülebilir büyüklükleri ölçüp ona göre mi test yapacaksın. Bu ölçümleri yapacak bir kartın var mı yoksa bunu yeni mi yapacaksın ?

Eğer mevcut kart tüm bu ölçümleri yapıyor ve sadece verileri modbus ile PC ye alacaksan, hazır kütüphaneler çok. birtanesini programına gömüp yürüyebilirsin.


makdeniz

Karanlık olmadan aydınlık, Ölüm olmadan yaşam mantıksız.

foseydon

Hocam anladığım kadarı ile konuya uzaksın, C# bilmiyorsun, elinde modbus üstünden veri gönderen bir cihaz var ve cihaz üzerinden bilgileri kendi yazacağın bir programla almak istiyorsun.

1. Cihaz bu verileri hangi arayüz ile gönderiyor? RS232, Ethernet vs. Muhtemelen RS232 arayüzü vardır.
2. @tunayk nin soyledigi gibi C# için yazılmış bir sürü modbus kütüphanesi var, bunlardan birisini kullanabilirsin. NModbus önerebilirim. Ayrıca açık kaynak olarakta bir sürü uygulama var, bunların kaynak kodlarına bakarak fikir sahibi olabilirsin. Ama C# bilmen gerekiyor.
3. float, integer vs. bunlar gösterimdir. veri her halükarda binary olarak taşınır. elindeki cihaz verileri float olarak göndermiyorsa, float olarak göstermek istediğinde karşına veri kaybı gibi hatalar çıkabilir.

hiç alakan olmayacaksa, C# bilen bir arkadaşın varsa ondan yardım iste o yazsın. Bilen birinin birkaç günde yazabileceği bir program çünkü istediğin. yok ben uğraşmak istiyorum diyorsan, bir köşesinden başla, takıldığın noktada burada soru sorarsan yardımcı olacaklar çıkacaktır.

ikivancyurdakul

#4
ilk olarak foruma hoşbulduk. Dün daha hızlı açıklamak için kendimi yeterince açıklayamamışım. Tam olarak açıklıyayım şu anda.
Sorunum modbus haberleşmek.RS 485 ile verileri alıyorum. Şu anda qmodbusmaster programı ile akım,basınç,röle gibi 46 tane değeri start adresslerini girerek alabiliyorum fakat benim istediğim akım gerilim, basınç vb. tüm ölçülebilir büyüklükleri ölçüp ona göre mi test yapmak ve o test sonucuna göre hatalı yada başarılı test sonucu çıkartmak. Fakat şu anda bu konuda 2 problemim var. Birinci aldığım veriler hex formatında ama benim almak istediğim değer hex formatında değil. İkincisi ise okumak istediğim değer "input register" değeri ve bu değeri okumaya çalışmak için internette araştırdığımda karşıma hep modbus poll ve ya modbus slave ile birlikte çalışan örnekler karşıma çıktı. Dışarıdan hiçbir program kullanmadan sadece c# üzerinden bunun yolunu arıyorum. (Bu kadar cevap beklemiyordum şimdiden çok teşekkür ederim)

foseydon

hocam, ben yukarıda yazdım. ama dediğim üzere sen biraz konudan uzak olduğun için olayı anlamadın muhtemelen. daha açık yazayım.

dijital mantıkta 1 ve 0 vardır. o rs485 hattı üzerindeki veri 1 ve 0 olarak taşınır. belirli voltaj seviyesi 0 ve belirli voltaj seviyesi 1 olarak yorumlanır alıcı tarafından. bu durumda diyelim ki giden veri 10luk sistemde 11 olsun. bu veri, data hattında ikilik sistemde 00001101 olarak gönderilir. alıcı da bunu böyle alır. alındıktan sonra, 10luk sistemde veya 16lık sistemde gösterimi tamamen yazılımsal olarak yapılan şeyler. fiziksel olarak veri ikilik sistemde taşınır. umarım anlaşılır olmuştur.

şimdi diyeceksin ki, o zaman kesirli sayılar nasıl aktarılıyor? kesirli olarak gönderilecek sayı da bir şekilde binary olarak gösteriliyor. IEEE'nin bu konuda oluşturduğu bir standart var, ona bakabilirsin. Ayrıca başka aktarım usülleri de mevctur. Misal, kesirli 10.2 olarak göndermek istediğin değeri, 102 olarak gönderirsin. Karşı taraf noktanın yerini biliyorsa, yerleştirir ve değeri ona göre yorumlar.

senin sisteme gelirsek, cihaz RS485 bile olsa senin bilgisayarında RS485 portu yoktur. Bunu ya RS232'ye çevirip alıyorsun, ya başka birşeye. Neye dönüştürüyorsan onun C# kullanımıa bakman gerekiyor. Misal, RS232 bağlantısı için SerilPort sınıf kütühanesi var .NET'te. Veriyi aldıktan sonra nasıl işleyeceğin sana kalmış. Modbus'ın çok detaylı dökümanı var, ona göre yorumlayacaksın vs. veya hazır modbus kütüphaneleri var onları kullanacaksın.

dediğim gibi senin konuya uzak olduğun belli, ben bunu öğrensem bile daha sonra işime yaramaz diyorsan hiç uğraşma bir arkadaşına söyle yukarıda dediğim gibi.


mufitsozen

@foseydon 10luk sistemde 11, ikilik olarak nasil 00001101 oldu o kismini anlayamadim, 00001011 olmasin?
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

tunayk

#7
Modbus Konusunda çok boğulmadan kestirme olarak yürümek için aşağıda daha önce VB.NET te yapmış olduğum ve sorunsuz kullandığım kodları kullanabilirsin. Bunları VB.NET tte derleyip C# 'a dll olarak alırsın veya doğrudan C#  a uyarlarsın olur.
Imports System.IO

Public Class ModbusMaster
    Public Sub New()

    End Sub


    Public SP As System.IO.Ports.SerialPort

    Public Str As System.IO.Stream

    Public TOut_ms As Integer = 100


#Region "Communication"

    'Modbus TCP Definition
    'The equivalent request to this Modbus RTU example
    '11 03 006B 0003 7687
    'in Modbus TCP is:
    '00 01 00 00 00 06 11 03 006B 0003
    '0001: Transaction Identifier
    '0000: Protocol Identifier
    '0006: Message Length (6 bytes to follow)
    '11: The Unit Identifier  (17 = 11 hex)
    '03: The Function Code (read Analog Output Holding Registers)
    '006B: The Data Address of the first register requested. (40108-40001 = 107 =6B hex)
    '0003: The total number of registers requested. (read 3 registers 40108 to 40110)

    ''' <summary>
    ''' Seri porta uygun datayı yazar ve okunanı geri döndürür
    ''' </summary>
    ''' <param name="SlaveID"></param>
    ''' <param name="index"></param>
    ''' <param name="Count"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function ReadInputRegisters(ByVal SlaveID As Byte, ByVal index As UInt16, ByVal Count As Byte) As UInt16()
        Dim ret(Count - 1) As UInt16
        Dim sw As New Stopwatch
        Try

            If SP.IsOpen Then

                Dim data As Byte() = ReadInputCommand(SlaveID, index, Count)
                Dim say As Integer = 0
                SP.Write(data, 0, data.Length)
                sw.Start()
                Do While sw.ElapsedMilliseconds < TOut_ms And SP.BytesToRead < (Count * 2) + 5
                    Threading.Thread.Sleep(5)

                Loop


                ReDim data(SP.BytesToRead - 1)
                say = SP.Read(data, 0, SP.BytesToRead)

                If say >= (Count * 2) + 5 Then
                    If IsCevapOk(data, SlaveID) Then

                        For k As Integer = 0 To Count - 1
                            ret(k) = (data(3 + (k * 2)) * 256) + data(4 + (k * 2))
                        Next
                        Return ret
                    Else
                        '    Throw New System.TimeoutException
                    End If
                Else
                    'Throw New System.TimeoutException
                End If
            Else
                '  Throw New IOException
            End If
        Catch ex As Exception
            '   Throw New Exception
        End Try
        sw.Stop()
        Return Nothing
    End Function

    ''' <summary>
    ''' Seri porta uygun datayı yazar ve okunanı geri döndürür
    ''' </summary>
    ''' <param name="SlaveID"></param>
    ''' <param name="index"></param>
    ''' <param name="Count"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function ReadHoldingRegisters(ByVal SlaveID As Byte, ByVal index As UInt16, ByVal Count As Byte) As UInt16()
        Dim ret(Count - 1) As UInt16
        Dim sw As New Stopwatch
        Try

            If SP.IsOpen Then
                Dim data As Byte() = ReadHoldingCommand(SlaveID, index, Count)
                Dim say As Integer = 0
                SP.Write(data, 0, data.Length)
                sw.Start()
                Do While sw.ElapsedMilliseconds < TOut_ms And SP.BytesToRead < (Count * 2) + 5
                    Threading.Thread.Sleep(5)

                Loop

                ReDim data(SP.BytesToRead - 1)
                say = SP.Read(data, 0, SP.BytesToRead)

                If say >= (Count * 2) + 5 Then
                    If IsCevapOk(data, SlaveID) Then

                        For k As Integer = 0 To Count - 1
                            ret(k) = (data(3 + (k * 2)) * 256) + data(4 + (k * 2))
                        Next
                        Return ret
                    Else
                        '   Throw New System.TimeoutException
                    End If
                Else
                    'Throw New System.TimeoutException
                End If
            Else
                ' Throw New IOException
            End If
        Catch ex As Exception
            '   Throw New Exception
        End Try
        Return Nothing
    End Function

    ''' <summary>
    ''' Yazma komutunu icra eder ve başarılıysa true döner
    ''' </summary>
    ''' <param name="SlaveID"></param>
    ''' <param name="index"></param>
    ''' <param name="Datas"></param>
    ''' <remarks></remarks>
    Public Function WriteMultipleRegisters(ByVal SlaveID As Byte, ByVal index As UInt16, ByVal Datas As UInt16()) As Boolean
        Dim ret As Boolean = False
        Dim sw As New Stopwatch
        Try

            If SP.IsOpen Then
                Dim data As Byte() = WriteCommand(SlaveID, index, Datas)

                Dim say As Integer = 0
                SP.Write(data, 0, data.Length)
                sw.Start()
                Do While sw.ElapsedMilliseconds < TOut_ms And SP.BytesToRead < 5
                    Threading.Thread.Sleep(5)

                Loop

                ReDim data(SP.BytesToRead - 1)
                say = SP.Read(data, 0, SP.BytesToRead)

                If say >= 5 Then
                    If IsCevapOk(data, SlaveID) Then
                        ret = True
                    End If
                End If
            End If
        Catch ex As Exception
        End Try
        Return ret
    End Function

    ''' <summary>
    ''' Verilenlere göre Input(4)TCP formatında okuma komutu oluşturur
    ''' </summary>
    ''' <param name="SlaveID"></param>
    ''' <param name="Index"></param>
    ''' <param name="Okunacak"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function ReadInputCommandTCP(ByVal SlaveID As Byte, ByVal Index As UInt16, ByVal Okunacak As Byte) As Byte()
        Dim b(11) As Byte


        Dim crc() As Byte

        b(0) = 0
        b(1) = 1

        b(2) = 0
        b(3) = 0

        b(4) = 0
        b(5) = 6

        b(6) = SlaveID
        b(7) = 4
        'index
        crc = BitConverter.GetBytes(Index)
        b(8) = crc(1)
        b(9) = crc(0)
        'count
        'crc = BitConverter.GetBytes(Data.Length)
        b(10) = 0 'crc(1)
        b(11) = Okunacak 'crc(0)

        Return b
    End Function

    ''' <summary>
    ''' Verilenlere göre Input(4) okuma komutu oluşturur
    ''' </summary>
    ''' <param name="SlaveID"></param>
    ''' <param name="Index"></param>
    ''' <param name="Okunacak"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function ReadInputCommand(ByVal SlaveID As Byte, ByVal Index As UInt16, ByVal Okunacak As Byte) As Byte()
        Dim b(5) As Byte
        Dim crc() As Byte
        b(0) = SlaveID
        b(1) = 4
        'index
        crc = BitConverter.GetBytes(Index)
        b(2) = crc(1)
        b(3) = crc(0)
        'count
        'crc = BitConverter.GetBytes(Data.Length)
        b(4) = 0 'crc(1)
        b(5) = Okunacak 'crc(0)

        crc = CalculateCrc(b)
        ReDim Preserve b(7)
        b(6) = crc(0)
        b(7) = crc(1)
        Return b
    End Function


    ''' <summary>
    ''' Verilenlere göre Holding(3) TCP formatında okuma komutu oluşturur
    ''' </summary>
    ''' <param name="SlaveID"></param>
    ''' <param name="Index"></param>
    ''' <param name="Okunacak"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function ReadHoldingCommandTCP(ByVal SlaveID As Byte, ByVal Index As UInt16, ByVal Okunacak As Byte) As Byte()
        Dim b(11) As Byte
        Dim crc() As Byte

        b(0) = 0
        b(1) = 1

        b(2) = 0
        b(3) = 0

        b(4) = 0
        b(5) = 6

        b(6) = SlaveID
        b(7) = 3
        'index
        crc = BitConverter.GetBytes(Index)
        b(8) = crc(1)
        b(9) = crc(0)
        'count
        'crc = BitConverter.GetBytes(Data.Length)
        b(10) = 0 'crc(1)
        b(11) = Okunacak 'crc(0)

        Return b
    End Function

    ''' <summary>
    ''' Verilenlere göre Holding(3) okuma komutu oluşturur
    ''' </summary>
    ''' <param name="SlaveID"></param>
    ''' <param name="Index"></param>
    ''' <param name="Okunacak"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function ReadHoldingCommand(ByVal SlaveID As Byte, ByVal Index As UInt16, ByVal Okunacak As Byte) As Byte()
        Dim b(5) As Byte
        Dim crc() As Byte
        b(0) = SlaveID
        b(1) = 3
        'index
        crc = BitConverter.GetBytes(Index)
        b(2) = crc(1)
        b(3) = crc(0)
        'count
        'crc = BitConverter.GetBytes(Data.Length)
        b(4) = 0 'crc(1)
        b(5) = Okunacak 'crc(0)

        crc = CalculateCrc(b)
        ReDim Preserve b(7)
        b(6) = crc(0)
        b(7) = crc(1)
        Return b
    End Function

    ''' <summary>
    ''' Verilenlere göre yazma(16) komutu oluşturur
    ''' </summary>
    ''' <param name="SlaveID"></param>
    ''' <param name="Index"></param>
    ''' <param name="Data"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function WriteCommand(ByVal SlaveID As Byte, ByVal Index As UInt16, ByVal Data() As UInt16) As Byte()

        If Data Is Nothing Then Throw New ArgumentNullException
        If Data.Length > 124 Then Throw New ArgumentException
        If SlaveID >= 0 Or SlaveID <= 254 Then
        Else
            Throw New ArgumentException
        End If

        Dim b(6 + (Data.Length * 2)) As Byte
        Dim crc() As Byte

        b(0) = SlaveID
        b(1) = 16
        'index
        crc = BitConverter.GetBytes(Index)
        b(2) = crc(1)
        b(3) = crc(0)
        'count
        crc = BitConverter.GetBytes(Data.Length)
        b(4) = crc(1)
        b(5) = crc(0)
        'byte sayısı
        b(6) = Data.Length * 2

        For i As Integer = 0 To Data.Length - 1
            crc = BitConverter.GetBytes(Data(i))
            b(7 + (i * 2)) = crc(1)
            b(8 + (i * 2)) = crc(0)
        Next

        crc = CalculateCrc(b)
        ReDim Preserve b(b.Length + 1)

        b(b.Length - 2) = crc(0)
        b(b.Length - 1) = crc(1)
        Return b

    End Function

    ''' <summary>
    ''' Verilenlere göre TCP yazma(16) komutu oluşturur
    ''' </summary>
    ''' <param name="SlaveID"></param>
    ''' <param name="Index"></param>
    ''' <param name="Data"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function WriteCommandTCP(ByVal SlaveID As Byte, ByVal Index As UInt16, ByVal Data() As UInt16) As Byte()

        If Data Is Nothing Then Throw New ArgumentNullException
        If Data.Length > 124 Then Throw New ArgumentException
        If SlaveID >= 0 Or SlaveID <= 254 Then
        Else
            Throw New ArgumentException
        End If

        Dim b(12 + (Data.Length * 2)) As Byte
        Dim crc() As Byte

        b(0) = 0
        b(1) = 1

        b(2) = 0
        b(3) = 0

        b(4) = 0
        b(5) = 7 + (Data.Length * 2)


        b(6) = SlaveID
        b(7) = 16
        'index
        crc = BitConverter.GetBytes(Index)
        b(8) = crc(1)
        b(9) = crc(0)
        'count
        crc = BitConverter.GetBytes(Data.Length)
        b(10) = crc(1)
        b(11) = crc(0)
        'byte sayısı
        b(12) = Data.Length * 2

        For i As Integer = 0 To Data.Length - 1
            crc = BitConverter.GetBytes(Data(i))
            b(13 + (i * 2)) = crc(1)
            b(14 + (i * 2)) = crc(0)
        Next


        Return b

    End Function

    ''' <summary>
    ''' Gelen frame crc ve adres olarak doğrulanır
    ''' </summary>
    ''' <param name="b">Gelen data</param>
    ''' <param name="adr">adres </param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function IsCevapOk(ByVal b As Byte(), ByVal adr As Byte) As Boolean
        If b Is Nothing Then Return False
        If b.Length < 3 Then Return False
        Dim alinan(b.Length - 3) As Byte
        b.Copy(b, 0, alinan, 0, b.Length - 2)

        Dim crc() As Byte = CalculateCrc(alinan)
        If (b(b.Length - 2) = crc(0)) And (b(b.Length - 1) = crc(1)) And adr = alinan(0) Then
            Return True
        Else
            Return False
        End If
    End Function

    ''' <summary>
    ''' Gelenler frame ve adres olarak doğrulanır
    ''' </summary>
    ''' <param name="b">Gelen data</param>
    ''' <param name="adr">adres </param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function IsCevapOkTCP(ByRef b As Byte(), ByVal adr As Byte) As Boolean
        Return True
    End Function


    ''' <summary>
    ''' CRC Hesabı, dönen byte sırası olduğu gibi kullanılır
    ''' </summary>
    ''' <param name="dat"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Shared Function CalculateCrc(ByVal dat As Byte()) As Byte()
        If dat Is Nothing Then Throw New ArgumentNullException("data")

        Dim crc As UShort = UShort.MaxValue
        Dim tableIndex As Byte
        Dim b As Byte
        For Each b In dat

            tableIndex = BitConverter.GetBytes((crc Xor b))(0)
            crc >>= 8
            crc = crc Xor crcTable(tableIndex)
        Next
        Return BitConverter.GetBytes(crc)
    End Function

    Shared crcTable As UShort() = { _
    &H0, &HC0C1, &HC181, &H140, &HC301, &H3C0, &H280, &HC241, _
            &HC601, &H6C0, &H780, &HC741, &H500, &HC5C1, &HC481, &H440, _
            &HCC01, &HCC0, &HD80, &HCD41, &HF00, &HCFC1, &HCE81, &HE40, _
            &HA00, &HCAC1, &HCB81, &HB40, &HC901, &H9C0, &H880, &HC841, _
            &HD801, &H18C0, &H1980, &HD941, &H1B00, &HDBC1, &HDA81, &H1A40, _
            &H1E00, &HDEC1, &HDF81, &H1F40, &HDD01, &H1DC0, &H1C80, &HDC41, _
            &H1400, &HD4C1, &HD581, &H1540, &HD701, &H17C0, &H1680, &HD641, _
            &HD201, &H12C0, &H1380, &HD341, &H1100, &HD1C1, &HD081, &H1040, _
            &HF001, &H30C0, &H3180, &HF141, &H3300, &HF3C1, &HF281, &H3240, _
           &H3600, &HF6C1, &HF781, &H3740, &HF501, &H35C0, &H3480, &HF441, _
           &H3C00, &HFCC1, &HFD81, &H3D40, &HFF01, &H3FC0, &H3E80, &HFE41, _
           &HFA01, &H3AC0, &H3B80, &HFB41, &H3900, &HF9C1, &HF881, &H3840, _
           &H2800, &HE8C1, &HE981, &H2940, &HEB01, &H2BC0, &H2A80, &HEA41, _
           &HEE01, &H2EC0, &H2F80, &HEF41, &H2D00, &HEDC1, &HEC81, &H2C40, _
           &HE401, &H24C0, &H2580, &HE541, &H2700, &HE7C1, &HE681, &H2640, _
           &H2200, &HE2C1, &HE381, &H2340, &HE101, &H21C0, &H2080, &HE041, _
           &HA001, &H60C0, &H6180, &HA141, &H6300, &HA3C1, &HA281, &H6240, _
           &H6600, &HA6C1, &HA781, &H6740, &HA501, &H65C0, &H6480, &HA441, _
           &H6C00, &HACC1, &HAD81, &H6D40, &HAF01, &H6FC0, &H6E80, &HAE41, _
           &HAA01, &H6AC0, &H6B80, &HAB41, &H6900, &HA9C1, &HA881, &H6840, _
           &H7800, &HB8C1, &HB981, &H7940, &HBB01, &H7BC0, &H7A80, &HBA41, _
           &HBE01, &H7EC0, &H7F80, &HBF41, &H7D00, &HBDC1, &HBC81, &H7C40, _
           &HB401, &H74C0, &H7580, &HB541, &H7700, &HB7C1, &HB681, &H7640, _
           &H7200, &HB2C1, &HB381, &H7340, &HB101, &H71C0, &H7080, &HB041, _
           &H5000, &H90C1, &H9181, &H5140, &H9301, &H53C0, &H5280, &H9241, _
           &H9601, &H56C0, &H5780, &H9741, &H5500, &H95C1, &H9481, &H5440, _
           &H9C01, &H5CC0, &H5D80, &H9D41, &H5F00, &H9FC1, &H9E81, &H5E40, _
           &H5A00, &H9AC1, &H9B81, &H5B40, &H9901, &H59C0, &H5880, &H9841, _
           &H8801, &H48C0, &H4980, &H8941, &H4B00, &H8BC1, &H8A81, &H4A40, _
           &H4E00, &H8EC1, &H8F81, &H4F40, &H8D01, &H4DC0, &H4C80, &H8C41, _
           &H4400, &H84C1, &H8581, &H4540, &H8701, &H47C0, &H4680, &H8641, _
           &H8201, &H42C0, &H4380, &H8341, &H4100, &H81C1, &H8081, &H4040}


#End Region

End Class


Hem Modbus TCP hem de Modbus RTU için Register temelli okuma - yazma  fonksiyonları mevcut.

Adında "Command" geçen fonksiyonlar gönderilecek byte dizisini üretir.

Doğrudan okuma ve yazma fornksiyonları en üstte göreceğin Seri Port ve IO Stream'e yazar ve okur. Bunları önceden kendi sistemine uygun olarak tanımlamalısın.

ikivancyurdakul

@tunayk çok inanılmaz yardımcı oldun çok çok teşekkür ederim. 

temha

ALLAH adıyla başlarım.
merhabalar arkadaşlar.
bu sene modbus u yeni öğrenmeye başladım. rs 485 rs232 dönüştürücü kullanarak siemens rwf55,5 adlı pıd sıcaklık cihazından sıcaklık bilgisini modbustester adlı programla okumayı başardım. bigileri fload olarak okuyor. hex olarak da gönderilen ve alınan bilgileri görebiliyorum. ama aldığım bilgi çok uzun ve virgülden sonra 5,6 basamak var. aldığım hex bilgiyi nasıl analiz edebilrim.
ilk iki dijit in cihaz adresi ikinci iki dijitin fonksiyon kodu olduğunu öğrendim 03 gönderiyor bunun için program.
öğrenmem gereken şeylerden bir ıeee bununla alakalı türkçe kaynak varmı
çözebilirsem aldığım sıcaklık bilgisini mikrodenetleyici ile displayde yazdırmak istiyorum. şimdiden teşekkürler
ALLAH ilmimizi arttırsın.

temha

https://www.simplymodbus.ca/FAQ.htm bu adreste excel dosyası var burdan bilen arkadaşlar amlatabilir sanırım.

tunayk

Bilen arkadaşlar baştan sona Modbus'ı anlatamazlar.  Linkini verdiğin adam zaten anlatmış. Yok ingilizce anlamıyorum dersen, O sayfayı doc olarak kaydedip, Google çeviriye döküman olarak ver, sana Türkçe olarak versin.

Az yukarıda, hem TCP hem de RTU için doğrudan gidecek ve gelecek data yapılarını da gösteren açık kodlar var.  Bundan sonrası artık biraz kafa yorup kendi platformuna uyarlamak.


Bahsetmiş olduğun virgülden sonra 5-6 basamak görülmesi, kullandığın programın gösterim formatı ile ilgili.  Sen istersen yuvarlayıp tek basamak göster istersen 10 basamak. Gelen sıcaklık bilgisi bahsettiğin cihaz tarafından float olarak gönderiliyor muhtemelen. Bu durumda modbus üzerinde peşpeşe iki adet 16bit değer olarak okunur.  Veriyi aldıktan sonra kullandığın işlemci veya PC diline göre bu wordlerin yerlerini değiştirerek bir float sayı elde edersin.  Sıcaklığı okuduğun cihazın üreticisi, kullandığı sayı formatını söylemiştir  datasheet'te.