none
PC讀取plc問題 vb.net2008 RRS feed

  • 問題

  • 各位前輩好:

    我目前正在改寫從vb6 mscomm的元件轉成 vb.net的serial port 使用rs232

    我現在遇到一個問題  目前寫進去plc裡面的動作是沒有問題的(有確定有寫進去 因為plc的燈有亮)

    但在讀取PLC的時候一直抓不到值,我的程式碼如下

    public class form

      dim withevents com1 as new io.ports.serialport

      private sub form_load(......) handles mybase.load
        com1.portname="COM3"
        com1.baudrate=9600
        com1.databits=7
        com1.parity=parity.even
        com1.stopbits=stopbits.one
        com1.open()
      end sub
      private sub button1_click(....) handles button1.click
        '這是我送出給plc的訊息  plc有偵測到並且亮燈
          com1.write(" 11000020100 18")
      end sub
     
      private sub button2_click(.....) handles button2.click
        '我想要在這事件中去讀取plc裡面的值
         '可是我用了兩種方式都讀不到值
         '方法1  結果show出空值
        messagebox.show(com1.readexisting)
        '方法2  看data前3個陣列有值是21 但把他們顯示出來變成都是空白
        com1.write(" 0100002 56")
        system.threading.thread.sleep(1000)
       
         dim data(1024) as byte
         com1.read(data,0,data.lengh
         for each i in data
          debug.writeline(i)
         end for
      end sub
    end class


    麻煩請各位前輩老師幫幫忙  指導一下我  感謝!

     

    2010年7月28日 上午 07:28

解答

所有回覆

  • 2010年7月28日 上午 07:40
  •    for each i in data
          debug.writeline(i)
         end for

    先改成

       For each i as Byte in data
          debug.writeline(i.ToString())
       Next

    看會不會有改變


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2010年7月28日 上午 07:42
    版主
  • bill前輩你好:

     我有試出來了但裡面的數字 不對 它分別出現6 21 21 21  (在我的認知裡面它應該只會出現一個數字)

      我目前想法是   當我從pc的軟體送命令(例如在'D0'的暫存區寫'1')給plc之後 plc有偵測到會亮

      接著我如果要讀取'D0'裡面的值'1'  要該怎麼做?

      我之前也有看去小歐前輩po的那邊文章 我從那篇文章理解成SerialPort.DataReceived 事件它是一寫之後立刻被觸發 就馬上去讀取serialport的暫存區?  而不是讀取plc的暫存區

      不知道我的觀念有沒有錯  

    • 已編輯 vic kuo 2010年7月28日 上午 08:43 漏字
    2010年7月28日 上午 07:59
  • 電腦發命令給 plc ,plc 接受命令傳回指定位置。

    對電腦來說,發跟送都是針對電腦的緩衝區 (SerialPort 有分送跟收) ,電腦不會直接讀到 plc 的緩衝區。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年7月28日 下午 12:52
  • bill前輩你好:

     我有試出來了但裡面的數字 不對 它分別出現6 21 21 21  (在我的認知裡面它應該只會出現一個數字)

      我目前想法是   當我從pc的軟體送命令(例如在'D0'的暫存區寫'1')給plc之後 plc有偵測到會亮

     

    這要看你的PLC的Protocol, 因為每種PLC應該都多少在協定上有點不同. 你有先讀該PLC關於回應訊息格式的部份嗎 ?

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2010年7月28日 下午 01:11
    版主
  • 回Bill前輩的話:

    我這邊沒有相關的文件  目前再用的PLC 是士林  AX2n系列的樣子(我明天去實驗室確定一下)   和我一起弄這個plc的同伴說  PLC協定是跟三菱的一樣 

    那些個協定跑出來的字串(" 11000020100 18")

    我是從VB6 那邊弄出來的  不過我現在還是搞不懂他出現 那些回應訊息格式該怎麼處理  ?

    (手邊目前沒有 VB6的環境可以開來看  明天我再把他那些code拿出來 在煩請各位前輩們指導我一下)

    請問一下哪裡可以找得到這些文件和資料?  (我有用GOOGLE找過了 但還是沒有找到我要的)  

     

     

     

    2010年7月28日 下午 02:05
  • 建議你用 通訊埠 監聽軟體 看一下收發的內容。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2010年7月28日 下午 02:13
  • 回心冷熱情熄前輩的話:

    有沒有推薦的監聽軟體阿?  很抱歉 剛接觸這段東西不知道有哪些工具可以用

    2010年7月28日 下午 02:32
  • http://wenku.baidu.com/view/af471886bceb19e8b8f6ba94.html

    這是FX2N, 確認一下看有沒有看你的AX2N一樣. 看起來它返回來會有一大串是沒錯的.

    寫這一類的程式前最好先把相關協定弄清楚, 否則你很難確認讀回來的資料是不是正確.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2010年7月28日 下午 02:50
    版主
  • 回Bill前輩的話:

    我看完文件之後確定是一樣的做法   那個送訊息給PLC那段一模一樣(這段我是有研究很久 有確定)

    所以照這樣看起來我上面的測試回傳值是有問題的嗎?  因為我不太懂他回傳值的意思

    2010年7月28日 下午 03:23
  • bill前輩你好: 我想請教一下那份文件裡面32h h=16進位? 32h意思是 32要轉成16進位的數字來看?還是它已經是轉好16進位的32?
    2010年7月29日 上午 03:03
  • Dim bytBuffer() As Byte = {&H32} 
    

    vb.net 與 plc qj71c24n 資料傳送

    http://www.blueshop.com.tw/board/show.asp?subcde=BRD20091201174652UCR&fumcde=FUM20050124191756KKC

    SerialPort.Write 方法 (Byte[], Int32, Int32)

    http://msdn.microsoft.com/zh-tw/library/ms143551(VS.80).aspx

    32h是十六進位值,十進位是50,參考以上,用Write Byte方法...

    2010年7月29日 上午 03:29
  • 你的Protocol好像不太一樣 ? 因為你發送的方式用字串, 第一個字元是空格, 應該是20h, 不過文件中的STX是02h ?
    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
    2010年7月29日 上午 04:41
    版主
  • 各位前輩好:

    我終於把它弄出來了 我的程式碼如下

    Private Sub write(ByVal str As String)
     Dim buffer() As Byte
     buffer = System.Text.Encoding.ASCII.GetBytes(str)
     SerialPort1.Write(buffer, 0, buffer.Length)
    End Sub
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     SerialPort1.PortName = "COM3"
     SerialPort1.BaudRate = 9600
     SerialPort1.DataBits = 7
     SerialPort1.Parity = IO.Ports.Parity.Even
     SerialPort1.StopBits = IO.Ports.StopBits.One
     SerialPort1.Open()
    End Sub
    
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     Dim tempstr As String = Chr(2) & "11000020200" & Chr(3) & "19"
     'Dim tempstr As String = "1100002020019"
      Call write(tempstr)
      SerialPort1.DiscardInBuffer()
    End Sub
    
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
      Dim tempstr As String = Chr(2) & "0100002" & Chr(3) & "56"
        Call write(tempstr)
        SerialPort1.DiscardInBuffer()
    End Sub
    Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
      Dim bytes As Integer = SerialPort1.BytesToRead
      Dim comBuffer As Byte() = New Byte(bytes) {}
       SerialPort1.Read(comBuffer, 0, bytes)
      'Debug.WriteLine(SerialPort1.ReadExisting)
      'Debug.WriteLine("~~~~~~~~~~~~~")
      For Each i In comBuffer
       Debug.WriteLine(i & "~" & Hex(i))  
       Debug.WriteLine(SerialPort1.ReadExisting)
      Next 
    End Sub
    

    到最後輸出的字串為

    ~~~~~~~~~~~~~

    2~2

    0200 C5 

    0~0

    不過我還是有疑問想要請教   在DataReceived事件裡我看msdn的解釋是說  '處理 SerialPort 物件的資料接收事件'  為什麼我不跑迴圈的話

    用SerialPort1.ReadExisting都是空值咧? (我是理解成它應該是要直接有值的)

    還有個問題有時候我讀取時  會出現不是整行的字串 換變成這樣

    ~~~~~~~~~

    2~2

    020

    0~0

    0 C5

    請問一下這是什麼原因造成的 , 煩請各位前輩解答!

     

     

     

     

    2010年7月29日 上午 05:43
  • 各位前輩好:

    我終於把它弄出來了 我的程式碼如下

    Private Sub write(ByVal str As String)
     Dim buffer() As Byte
     buffer = System.Text.Encoding.ASCII.GetBytes(str)
     SerialPort1.Write(buffer, 0, buffer.Length)
    End Sub
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     SerialPort1.PortName = "COM3"
     SerialPort1.BaudRate = 9600
     SerialPort1.DataBits = 7
     SerialPort1.Parity = IO.Ports.Parity.Even
     SerialPort1.StopBits = IO.Ports.StopBits.One
     SerialPort1.Open()
    End Sub
    
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     Dim tempstr As String = Chr(2) & "11000020200" & Chr(3) & "19"
     'Dim tempstr As String = "1100002020019"
      Call write(tempstr)
      SerialPort1.DiscardInBuffer()
    End Sub
    
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
      Dim tempstr As String = Chr(2) & "0100002" & Chr(3) & "56"
        Call write(tempstr)
        SerialPort1.DiscardInBuffer()
    End Sub
    Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
      Dim bytes As Integer = SerialPort1.BytesToRead
      Dim comBuffer As Byte() = New Byte(bytes) {}
       SerialPort1.Read(comBuffer, 0, bytes)
      'Debug.WriteLine(SerialPort1.ReadExisting)
      'Debug.WriteLine("~~~~~~~~~~~~~")
      For Each i In comBuffer
       Debug.WriteLine(i & "~" & Hex(i))  
       Debug.WriteLine(SerialPort1.ReadExisting)
      Next 
    End Sub
    

    到最後輸出的字串為

    ~~~~~~~~~~~~~

    2~2

    0200 C5 

    0~0

    不過我還是有疑問想要請教   在DataReceived事件裡我看msdn的解釋是說  '處理 SerialPort 物件的資料接收事件'  為什麼我不跑迴圈的話

    用SerialPort1.ReadExisting都是空值咧? (我是理解成它應該是要直接有值的)

    還有個問題有時候我讀取時  會出現不是整行的字串 換變成這樣

    ~~~~~~~~~

    2~2

    020

    0~0

    0 C5

    請問一下這是什麼原因造成的 , 煩請各位前輩解答!

     

     

     

     

    2010年7月29日 上午 05:43
  • 各位前輩好:

    我終於把它弄出來了 我的程式碼如下

    Private Sub write(ByVal str As String)
     Dim buffer() As Byte
     buffer = System.Text.Encoding.ASCII.GetBytes(str)
     SerialPort1.Write(buffer, 0, buffer.Length)
    End Sub
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     SerialPort1.PortName = "COM3"
     SerialPort1.BaudRate = 9600
     SerialPort1.DataBits = 7
     SerialPort1.Parity = IO.Ports.Parity.Even
     SerialPort1.StopBits = IO.Ports.StopBits.One
     SerialPort1.Open()
    End Sub
    
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     Dim tempstr As String = Chr(2) & "11000020200" & Chr(3) & "19"
     'Dim tempstr As String = "1100002020019"
      Call write(tempstr)
      SerialPort1.DiscardInBuffer()
    End Sub
    
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
      Dim tempstr As String = Chr(2) & "0100002" & Chr(3) & "56"
        Call write(tempstr)
        SerialPort1.DiscardInBuffer()
    End Sub
    Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
      Dim bytes As Integer = SerialPort1.BytesToRead
      Dim comBuffer As Byte() = New Byte(bytes) {}
       SerialPort1.Read(comBuffer, 0, bytes)
      'Debug.WriteLine(SerialPort1.ReadExisting)
      'Debug.WriteLine("~~~~~~~~~~~~~")
      For Each i In comBuffer
       Debug.WriteLine(i & "~" & Hex(i))  
       Debug.WriteLine(SerialPort1.ReadExisting)
      Next 
    End Sub
    

    到最後輸出的字串為

    ~~~~~~~~~~~~~

    2~2

    0200 C5 

    0~0

    不過我還是有疑問想要請教   在DataReceived事件裡我看msdn的解釋是說  '處理 SerialPort 物件的資料接收事件'  為什麼我不跑迴圈的話

    用SerialPort1.ReadExisting都是空值咧? (我是理解成它應該是要直接有值的)

    還有個問題有時候我讀取時  會出現不是整行的字串 換變成這樣

    ~~~~~~~~~

    2~2

    020

    0~0

    0 C5

    請問一下這是什麼原因造成的 , 煩請各位前輩解答!

     

     

     

    2010年7月29日 上午 05:43
  • 各位前輩好:

    我終於把它弄出來了 我的程式碼如下

    Private Sub write(ByVal str As String)
     Dim buffer() As Byte
     buffer = System.Text.Encoding.ASCII.GetBytes(str)
     SerialPort1.Write(buffer, 0, buffer.Length)
    End Sub
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     SerialPort1.PortName = "COM3"
     SerialPort1.BaudRate = 9600
     SerialPort1.DataBits = 7
     SerialPort1.Parity = IO.Ports.Parity.Even
     SerialPort1.StopBits = IO.Ports.StopBits.One
     SerialPort1.Open()
    End Sub
    
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     Dim tempstr As String = Chr(2) & "11000020200" & Chr(3) & "19"
     'Dim tempstr As String = "1100002020019"
      Call write(tempstr)
      SerialPort1.DiscardInBuffer()
    End Sub
    
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
      Dim tempstr As String = Chr(2) & "0100002" & Chr(3) & "56"
        Call write(tempstr)
        SerialPort1.DiscardInBuffer()
    End Sub
    Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
      Dim bytes As Integer = SerialPort1.BytesToRead
      Dim comBuffer As Byte() = New Byte(bytes) {}
       SerialPort1.Read(comBuffer, 0, bytes)
      'Debug.WriteLine(SerialPort1.ReadExisting)
      'Debug.WriteLine("~~~~~~~~~~~~~")
      For Each i In comBuffer
       Debug.WriteLine(i & "~" & Hex(i))  
       Debug.WriteLine(SerialPort1.ReadExisting)
      Next 
    End Sub
    

    到最後輸出的字串為

    ~~~~~~~~~~~~~

    2~2

    0200 C5 

    0~0

    不過我還是有疑問想要請教   在DataReceived事件裡我看msdn的解釋是說  '處理 SerialPort 物件的資料接收事件'  為什麼我不跑迴圈的話

    用SerialPort1.ReadExisting都是空值咧? (我是理解成它應該是要直接有值的)

    還有個問題有時候我讀取時  會出現不是整行的字串 換變成這樣

    ~~~~~~~~~

    2~2

    020

    0~0

    0 C5

    請問一下這是什麼原因造成的 , 煩請各位前輩解答!

     

     

    2010年7月29日 上午 05:44