none
怎麼會出現 "Receive timeout error" 錯誤訊息呢? RRS feed

  • 問題

  • 請問 執行「開始偵錯(Run)」時,第二層 If 判斷式那邊為什麼會出現 "Receive timeout error" 的錯誤訊息?

    其中第二層 If 裡的語法 " SysmacCJ1.ReadMemoryBit(OMRON.Compolet.SYSMAC.SysmacCSBase.MemoryTypes.CIO, 1, 10) "

    是根據外加PLC物件所撰寫的,但在處理第一層 If 判斷式時,若網路沒連線或中途網路斷線因該就不會執行第二層判斷式才對,

    可以請各位大大告訴我是不是我哪邊邏輯弄錯了?

    如果程式碼或問題哪邊沒描述清楚,在下邊留一下言,每天5點下班前我會每半小時來這看並更新。

    謝謝大家。

               

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            Dim isa As Boolean = My.Computer.Network.IsAvailable      '判斷網路有無連線
            Dim IP As String
            IP = System.Net.Dns.GetHostEntry(System.Net.Dns.GetHostName).AddressList(0).ToString  '查詢電腦 IP
            If isa = True Then
                Label1.Text = "目前網路連線正常!!" & vbCrLf & IP
                Label1.BackColor = Color.Plum

                If SysmacCJ1.ReadMemoryBit(OMRON.Compolet.SYSMAC.SysmacCSBase.MemoryTypes.CIO, 1, 10) = True Then
                    Label25.Visible = False
                    Label22.Visible = True
                ElseIf SysmacCJ1.ReadMemoryBit(OMRON.Compolet.SYSMAC.SysmacCSBase.MemoryTypes.CIO, 1, 9) = True Then
                    Label24.Visible = False
                    Label21.Visible = True
                ElseIf SysmacCJ1.ReadMemoryBit(OMRON.Compolet.SYSMAC.SysmacCSBase.MemoryTypes.CIO, 1, 8) = True Then
                    Label23.Visible = False
                    Label20.Visible = True


                ElseIf SysmacCJ1.ReadMemoryBit(OMRON.Compolet.SYSMAC.SysmacCSBase.MemoryTypes.CIO, 1, 10) = False Then
                    Label25.Visible = True
                    Label22.Visible = False
                ElseIf SysmacCJ1.ReadMemoryBit(OMRON.Compolet.SYSMAC.SysmacCSBase.MemoryTypes.CIO, 1, 9) = False Then
                    Label24.Visible = True
                    Label21.Visible = False
                ElseIf SysmacCJ1.ReadMemoryBit(OMRON.Compolet.SYSMAC.SysmacCSBase.MemoryTypes.CIO, 1, 8) = False Then
                    Label23.Visible = True
                    Label20.Visible = False
                End If

            Else
                Timer1.Enabled = False
                Label1.Text = "目前網路無法連線!!"
                Label1.BackColor = Color.White
                MessageBox.Show("PLC與PC連線出現異常,請檢查網路連線是否出現異常!", "通訊異常")
                Timer1.Enabled = True
            End If


        End Sub




    • 已編輯 C.Kevin 2012年2月16日 上午 03:24
    2012年2月16日 上午 03:13

解答

所有回覆

  • (1) 如果你有兩張以上網路卡,  只要其中一張有連到 Hub 或是 無線網路連到Wireless AP, My.Computer.Network.IsAvailable  都會是True,但這不代表從電腦 ---> PLC 是正常的.

    (2) 你用Forms.Timer 要注意 Interval Time 的設定, 如果你在 Interval Time 過了而Tick中的程序沒有執行完, 工作會被 Stack起來

    (3) 除非你是在寫學校的作業, 良心的建議你不要用 Forms.Timer 來做輪詢通訊的工作, 你應該用多緒的方式來做.

    (4) 因為你用的是歐姆龍的 API, 我沒有這種相關經驗, 不過你可以找一些網路封包監控的程式, 觀察一下是否有正確傳送封包回來.

    (5) 遇到這樣的問題,一定要先確認網路連結到 PLC 是沒問題的, 我想歐姆龍應該有附測試用的程式,你可以用它來測測看

    (6) 如果你有兩張以上的網路卡, 也許你在初始的時候給錯 IP 給歐姆龍的 API.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年2月16日 上午 03:29
    版主
  • Bill大大:

    (1)電腦一張網路卡而已,直接連到PLC。

    (2)看了你的說明,分別嘗試 10ms、100ms、500ms、1000ms,偵錯都出現相同情況。

    (3)是工作,公司要我去學VB寫UI,我再嘗試看看Backgroundworker物件看看。

    (4)確定有連線成功,可以正常操控PLC。處理Form顯示時卻出現這種狀況......

    (5)我使用2種介面來操作方便即時監看PLC動作,我的程式透過乙太網路,歐姆龍的程式用SerialPort連接,Form下的指令在歐姆龍程式有即時的更新資料,

    .....不知道我的程式哪邊出問題。


    • 已編輯 C.Kevin 2012年2月16日 上午 05:34
    2012年2月16日 上午 05:34
  • 把程式先單純化, 只寫

    SysmacCJ1.ReadMemoryBit(OMRON.Compolet.SYSMAC.SysmacCSBase.MemoryTypes.CIO, 1, 10) = True

    看看結果如何.

    PS: 如果你是工作, 真的不要用 Forms.Timer


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2012年2月16日 上午 05:37
    版主
  • 我用下面這段程式碼去執行,出現的狀況還是一樣。

    程式碼中 "OMRON.Compolet.SYSMAC.SysmacCSBase.MemoryTypes.CIO" 最後面的CIO是指PLC的IO暫存器,

    CIO, 1,10 是說第1個IO暫存器中第10個字元,這位址對應到PLC某一個端點輸出情況,有輸出時暫存器為True(或1)。

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

            If SysmacCJ1.ReadMemoryBit(OMRON.Compolet.SYSMAC.SysmacCSBase.MemoryTypes.CIO, 1, 10) = True Then
            End If

    End Sub
    • 已編輯 C.Kevin 2012年2月16日 上午 05:51
    2012年2月16日 上午 05:51
  • 連Timer 都拿掉, 先用最單純的方式測試, 你總要先確認這個命令是真的有作用.

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年2月16日 上午 05:53
    版主
  • 我將程式碼放在Form1_Load下用TextBox顯示暫存器值,再操作歐姆龍程式控制暫存器IO  ON/OFF 有顯示正常。

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            TextBox1.Text = SysmacCJ1.ReadMemoryBit(OMRON.Compolet.SYSMAC.SysmacCSBase.MemoryTypes.CIO, 1, 10)
    End Sub

    2012年2月16日 上午 06:04
  • 那就回到原點, 不要用 Timer . 用BackgroundWorker 吧, 然後你的程式邏輯也需要好好調整, 判斷流程要簡化.

    參考:

    多執行緒初探--使用BackgroundWorker(1)

    多執行緒初探--使用BackgroundWorker(2)

    BackgroundWorker 類別

    HOW TO:在背景執行作業


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    • 已標示為解答 C.Kevin 2012年2月16日 上午 06:56
    2012年2月16日 上午 06:10
    版主
  • 嗯,我試試看,謝謝 Bill 大大。

    我程式程度只有以前學校學的基本教學,請問是Timer不好用嗎? 或Timer使用時機因該是?

    2012年2月16日 上午 06:21
  • 個人經驗:

    Forms.Timer 大概只能做做簡單的玩意, 而且 Forms.Timer 在引發Tick 事件後是在UI 執行緒中執行其委派函式. 一般來講, 我習慣將通訊的部份放到另外一個執行緒或是採非同步模式執行, 原因很簡單, 在同步通訊的狀況下, 不論在發送或接收時間內, 這個命令會 Block 住整個執行緒, 來個離譜點的假設, 如果你送出命令要花一秒, 然後讀取的最大限制時間為 20 秒, 如果在設備沒有回應的狀況下, 在這20幾秒的時間整個畫面就會咬住.

    另一個 Forms.Timer的問題就是我提的未完成工作堆疊的問題, 如果你的 Timer的Interval 是 1 秒, 很不幸地在 Tick 事件委派函式中的程序卻需要兩秒才能完成, 那工作永遠不會做完. 因為它才做到一半, 另外一個 Tick 又來了, 它就會先把前面未完成的工作給暫止並堆疊.

    如果你對程式的基礎不是很熟, 建議你先找幾本書把一些基本功練一下, 或是讀MSDN 文件庫.  我這兩天正好整理了一份初學者應該先看的部份, 你可以參考一下

    [對初心者有助益的 MSDN 文件庫索引整理 (一)]


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年2月16日 上午 06:34
    版主
  • 知道了,謝謝~~~~!
    2012年2月16日 上午 06:54