none
想改成網路監控的問題 RRS feed

  • 問題

  • 小弟最近用VB.NET寫了一個程式,裡面有掛載PLC軟體的COM元件用來監控PLC

    現在小弟想將這個程式透過網路來做監控(不論遠端或近端都可以做操控)

    小弟有在圖書館借了一本ASP.NET,想說來試試看

    可是小弟找不到ASP.NET如何把COM元件掛進去,這是小弟的第一個問題

    第二個問題是想問各位前輩們,因為小弟原本的監控程式已經寫完了,

    想說有沒有快一點的方法直接轉換呢??(例如用ASP.NET直接把我原本的成是掛進去之類的)

    以上兩個問題,如果各位前輩們有更好的方法也請傳授給小弟,小弟必定感激

    P.S 小弟不是專門寫程式語言的,煩請前輩們用簡單一點的方法敘述,謝謝各位前輩們的指教


    2012年4月9日 下午 01:41

解答

  • 對這類的程式, 我的做法是

    ASP.NET  <--> Windows Service <---> Devices


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

    2012年4月9日 下午 02:40
    版主
  • 如果是效能考量,那用 Select Case 是 OK 的,但是這也就表示,Timer 每次啟動,你丟進來的 ScanCase 應該要 0 -> 1 -> 2 -> 0 -> 1 -> 2 ……。

    啊,對不起,我仔細看了你的程式碼,原程式都更新 X 是對的,因為 Web 是 Stateless ,每次 Post Back 都有重新 init page 物件,所以你的 ScanCase 當然都是 0 啊。

    Dim ScanCase As Integer

    改成

    Private Shared ScanCase As Integer 

    應該就可以了。


    獅子

    2012年4月12日 上午 05:26

所有回覆

  • 對這類的程式, 我的做法是

    ASP.NET  <--> Windows Service <---> Devices


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

    2012年4月9日 下午 02:40
    版主
  • BILL前輩,我在網路上有找到有人說透過ASP去連VB然後再用VB去連EXCEL,不知前輩是這個意思嗎??

    是的話能否詳細說明??那小弟應該要怎樣入門??

    小弟最不懂的部分在於ASP.NET  <--> Windows Service 要怎麼做??

    2012年4月9日 下午 03:14
  • 我是用 Socket 來通訊, 就 ASP.NET 網頁和 Windows Service 通訊這樣. 我之所以用 Windows Service, 是因為通常要一直輪詢設備, 我不知道你有沒有這樣的需求就是了.

    MSDN 文件庫[Windows 服務應用程式]


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


    2012年4月9日 下午 03:51
    版主
  • 您可以在欲監控PLC的電腦安裝好VB.NET寫的程式, 然後將收集到的監控資料傳送到主機上的Windows服務或Web服務, 由這支服務程式統一記錄並分析監控資料
    2012年4月10日 上午 02:43
  • 回復BILL前輩,我跟著書上的範例操作

    他是先在ASP.NET建立一個"相加"的WEB服務

    然後再建立一個WINDOWS FORM去做相加的動作

    也就是說相加這個動作是在ASP上面執行吧(我是這樣理解的)

    所以我的想法是在ASP上面監控PLC

    然後Client這邊也可以監控(但是動作都是在主機這邊運作)

    我這樣想法可行嗎??

    2012年4月10日 上午 03:51
  • 前輩您好,小弟的想法是架一台主機監控PLC(想法是用ASP.NET),然後其他遠端也可以監控(遠端就只負責命令跟接收,實際還是透過主機去控制PLC),不知前輩是否能懂小弟的敘述(講的不好見諒)

    前輩說的收集資料是指還要另外建類似EXCEL的東西嗎??現在小弟比較卡住的部分在於不知道怎麼透過ASP來做控制

    因為依照上面回覆BILL前輩的那個範例的話,它的相加應該是在ASP上執行

    小弟原先建好的WIN FORM監控程式上面有掛PLC的COM元件

    如果照上面的相加範例的話,我是要掛在那個WIN FORM裡面嗎??(那這樣不是變成是WIN FORM在對FORM下命令而不是ASP對PLC下命令??)

    不知小弟對於小弟的想法是否能給點意見,謝謝前輩指教

    2012年4月10日 上午 04:00
  • 從頭到尾, 我就不是在講 Web Service, 我講的是 Windows Service.

    對於此類監控程式來說, 我所有對設備的任何行為一概由 Windows Service 來執行 (當然你可以把 Windows Service 替換成 Windows Form, 只是 Windows Form 會有某些困擾, 例如開機自動執行和權限之類的問題)

    所以當你把所有對設備的管控都交由一個 Windows Service來做的時候, 那Client 可以是 Windows Form Application, Web Application, 甚至 Mobile Application, 因為不論Client 的形式為何, 它永遠都是透過該 Windows Service 與設備通訊, 而不會直接對設備通訊.


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

    2012年4月10日 上午 04:06
    版主
  • 想問一下前輩,小弟現在在ASP.NET中從"加入參考"選項裡面把COM加入進去

    目前可以透過網頁去監控,可是要怎麼讓他反覆去執行呢??他能像WIN FORM裡面有TIMER可以去重複掃描嗎??

    (正在研究BILL前輩說的WIN SERIVCE,之後可能還要再麻煩前輩了,抱歉)

    2012年4月10日 上午 09:31
  • 想問一下前輩,小弟現在在ASP.NET中從"加入參考"選項裡面把COM加入進去

    目前可以透過網頁去監控,可是要怎麼讓他反覆去執行呢??他能像WIN FORM裡面有TIMER可以去重複掃描嗎??

    (正在研究BILL前輩說的WIN SERIVCE,之後可能還要再麻煩前輩了,抱歉)

    Google  "javascript   定時 Refresh 頁面"  "javascript自動刷新頁面"
    2012年4月10日 上午 09:51
  • Google  "javascript   定時 Refresh 頁面"  "javascript自動刷新頁面"
    那這樣瀏覽器就得一直開著. 不然輪詢就會停掉.

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

    2012年4月10日 上午 10:02
    版主
  • 1.原來程式保留,定時更新資料庫。網頁查詢資料庫。

    2. 原來程式保留,安裝 SerialPort to TCP 的設備,用程式透過 VCOM 來連設備。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年4月10日 下午 12:07
  • Google  "javascript   定時 Refresh 頁面"  "javascript自動刷新頁面"

    那這樣瀏覽器就得一直開著. 不然輪詢就會停掉.

    這本 來 就是 單用 ASP .NET 的 短處.  

    監控 的 部分 本來 就 不能 寫在 ASP .NET 中.  

    監控 的 部分 的 程式 最好 就是 寫 在 AP 或 寫成 Window Service . 

    ASP .NET 僅是 顯示 監控AP 所 收集的 資料. 

    至於 ASP. NET 如何與 監控AP 溝通呢  ? 可以 是 寫檔 ; 存資料庫  ; Socket 通訊 ; AP端提供WCF服務 ..........

    2012年4月10日 下午 02:52
  • 1、在 PLC 主機上,把你寫的監控程式以 Windows Service 執行,但是要加上把監控資料儲存起來的功能(儲存到檔案、DB,隨你)

    2、IIS 上開發一個頁面,讀取步驟 1 所存放的資料。

    3、頁面上放 Time 定時重整。

    其實就是前面幾樓的回覆。


    獅子

    2012年4月10日 下午 05:30
  • 感謝各位前輩的指教,讓小弟受益良多,當初想做這個是因為在書局看到ASP所以想嘗試這樣的做法,小弟並非主修程式語言,問題可能會多了一點,抱歉。

    小弟想問一下上面LEO前輩說的意思是運用Windows Service 把監控資料存在檔案(我想用EXCEL)

    然後再用ASP去撈EXCEL的資料,是這樣吧??

    小弟上網找了一些Windows Service 資料,想請問一下,因為原本是在WIN FORM監控,所以有監控界面看得到,也可以在上面做一些動作,可是如果用WIN SERVICE,小弟昨天研究了一下,不懂要怎麼去"執行"以及"停止"監控(比方說開始監控、停止監控、寫入資料或者是PORT的選擇之類的)

    煩請前輩們再指教一下,謝謝了

    2012年4月11日 上午 12:54
  • 可以利用 ServiceController 物件去操控 Windows Service 的啟動、停止。

    MSDN:表示 Windows 服務,可以讓您連接到執行中或已停止的服務進行管理,或取得關於服務的資訊。

    上述連結中有範例程式可以參考。

    如果 IIS 和 PLC 不同台主機,也不在 AD 中,操控 PLC 的 Windows Service 會有權限的問題要處理。


    獅子

    2012年4月11日 上午 03:58
  • Excel 是獨佔式存取,所以資料庫請不要選擇 Excel 檔案,否則你可能白搭一場。

    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年4月11日 下午 12:27
  • 小弟想說先用上述網頁一直開著的方式先測試一下資料的擷取,之後才打算研究WIN SERVICE

    昨天小弟測試的結果有些怪怪的,小弟想再問問各位前輩們

    動作是這樣的,小弟只有簡單的監控設備的輸入、輸出和內部暫存器(每個各16點,所以是48點)

    用上述LEO前輩的方式用TIMER去做輪詢,小弟參考了http://www.flag.com.tw/book/cento-5105.asp?bokno=FT461&id=470

    把設備的輸入、輸出、內部暫存用TIMER去掃描,程式碼如下

    Partial Class _Default
        Inherits System.Web.UI.Page
       Dim ScanCase As Integer
    .............
    .......
    ....
    Protected Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            Dim val As Long
                    Dim VLenth As Integer
            Dim TmpVal As String
            Dim i As Integer
            Dim MidVal As Boolean
            Select Case ScanCase
                Case 0
                    PLC.ReadDeviceBlock2("X0", 1, val)
                    TmpVal = D_To_B(val)
                    VLenth = CStr(TmpVal).Length
                    Do While VLenth < 16
                        TmpVal = 0 & CStr(TmpVal)
                        VLenth = CStr(TmpVal).Length
                    Loop
                    For i = 0 To 15
                        MidVal = Microsoft.VisualBasic.Mid(TmpVal, 16 - i, 1)
                        Select Case MidVal
                            Case 0
                                XState(i).BackColor = Drawing.Color.Gray
                                XState(i).BorderStyle = BorderStyle.Inset
                            Case 1
                                XState(i).BackColor = Drawing.Color.Pink
                                XState(i).BorderStyle = BorderStyle.Outset
                        End Select
                    Next
                    ScanCase = ScanCase + 1
                Case 1
                    PLC.ReadDeviceBlock2("Y0", 1, val)
                    TmpVal = D_To_B(val)
                    VLenth = CStr(TmpVal).Length
                    Do While VLenth < 16
                        TmpVal = 0 & CStr(TmpVal)
                        VLenth = CStr(TmpVal).Length
                    Loop
                    For i = 0 To 15
                        MidVal = Microsoft.VisualBasic.Mid(TmpVal, 16 - i, 1)
                        Select Case MidVal
                            Case 0
                                YState(i).BackColor = Drawing.Color.Gray
                                YState(i).BorderStyle = BorderStyle.Inset
                            Case 1
                                YState(i).BackColor = Drawing.Color.Pink
                                YState(i).BorderStyle = BorderStyle.Outset
                        End Select
                    Next
                    ScanCase = ScanCase + 1
                Case 2
                    PLC.ReadDeviceBlock2("M0", 1, val)
                    TmpVal = D_To_B(val)
                    VLenth = CStr(TmpVal).Length
                    Do While VLenth < 16
                        TmpVal = 0 & CStr(TmpVal)
                        VLenth = CStr(TmpVal).Length
                    Loop
                    For i = 0 To 15
                        MidVal = Microsoft.VisualBasic.Mid(TmpVal, 16 - i, 1)
                        Select Case MidVal
                            Case 0
                                MState(i).BackColor = Drawing.Color.Gray
                                MState(i).BorderStyle = BorderStyle.Inset
                            Case 1
                                MState(i).BackColor = Drawing.Color.Pink
                                MState(i).BorderStyle = BorderStyle.Outset
                        End Select
                    Next
                    ScanCase = 0
            End Select

    小弟想請問一下位啥結果只會有X的狀態,Y、M卻沒有更新

    後來小弟急著看結果就開始亂湊,把它們分成三個TIMER去做掃描,一個TIMER掃完換叫另外一個

    如果掃描的順序是X->Y->M,結果只會更新X->Y就沒了= =

    然後順序改成X->M->Y,結果居然會正常!?這是為什麼呀??

    勞請前輩們指導一下,感恩

    2012年4月12日 上午 03:31
  • 電腦是循規的運作,依你的程式碼來看,只要 ScanCase 是 0 就會查 X 狀態,所以是不是每次 Timer 啟動時,大多數 ScanCase 都是 0 呢?是不是有可能 X 暫存器使用的頻率較高,所以每次輪詢都是抓到 X 暫存器的資料?

    然後,如果你每次輪詢都應該要更新 X、Y、M 的狀態,那你不該使用 Select Case,而是每次 Timer 啟動,都要把 X、Y、M 的狀態更新才對。


    獅子

    2012年4月12日 上午 04:03
  • 回復LEO前輩,因為小弟還在測試階段,所以如果是使用頻率的問題的話,老實說X暫存器反而是最沒使用到的(因為還在測試),大部分都是在改變Y跟M的狀態說

    小弟會用 Select Case是因為之前看過一本說,它上面提到如果TIMER每次掃描都要更新全部資料運作可能會太慢

    因為既然是監控,肯定會因為跟硬體通訊而等待,所以他建議說如果不需要太快一直更新的化可以把它拆成 Select Case來做,所以小弟仿造他的作法,以前在WIN FORM執行時也都蠻OK的,可是現在在ASP上執行,小弟就不懂為何他一直卡在X= =

    2012年4月12日 上午 04:14
  • 如果是效能考量,那用 Select Case 是 OK 的,但是這也就表示,Timer 每次啟動,你丟進來的 ScanCase 應該要 0 -> 1 -> 2 -> 0 -> 1 -> 2 ……。

    啊,對不起,我仔細看了你的程式碼,原程式都更新 X 是對的,因為 Web 是 Stateless ,每次 Post Back 都有重新 init page 物件,所以你的 ScanCase 當然都是 0 啊。

    Dim ScanCase As Integer

    改成

    Private Shared ScanCase As Integer 

    應該就可以了。


    獅子

    2012年4月12日 上午 05:26
  • 對了,最後建議你重構一下程式,因為三個區段都做相同的事,只是來源名稱不同而已,類似重構成像下面這樣。

    請注意,我沒有細看邏輯,簡單用工具抽而已,所以像要不要帶那麼多參數,以及 XState 是否應該換成 IState 或依不同名稱使用不同物件,這些都沒處理,總之,參考看看吧:

      Private Shared ScanCase As Integer
    
      Protected Sub Timer1_Tick(sender As Object, e As System.EventArgs) Handles Timer1.Tick
        Dim val As Long
        Dim VLenth As Integer
        Dim TmpVal As String
        Dim i As Integer
        Dim MidVal As Boolean
        Select Case ScanCase
          Case 0
            Timer1_TickExtracted("X0", val, VLenth, TmpVal, i, MidVal)
            ScanCase = ScanCase + 1
          Case 1
            Timer1_TickExtracted("Y0", val, VLenth, TmpVal, i, MidVal)
            ScanCase = ScanCase + 1
          Case 2
            Timer1_TickExtracted("M0", val, VLenth, TmpVal, i, MidVal)
            ScanCase = 0
        End Select
      End Sub
    
      Private Sub Timer1_TickExtracted(SrcName As String, ByVal val As Long, ByRef VLenth As Integer, ByRef TmpVal As String, ByRef i As Integer, ByRef MidVal As Boolean)
        PLC.ReadDeviceBlock2(SrcName, 1, val)
        TmpVal = D_To_B(val)
        VLenth = CStr(TmpVal).Length
        Do While VLenth < 16
          TmpVal = 0 & CStr(TmpVal)
          VLenth = CStr(TmpVal).Length
        Loop
        For i = 0 To 15
          MidVal = Microsoft.VisualBasic.Mid(TmpVal, 16 - i, 1)
          Select Case MidVal
            Case 0
              XState(i).BackColor = Drawing.Color.Gray
              XState(i).BorderStyle = BorderStyle.Inset
            Case 1
              XState(i).BackColor = Drawing.Color.Pink
              XState(i).BorderStyle = BorderStyle.Outset
          End Select
        Next
      End Sub


    獅子


    • 已編輯 Leo Shih 2012年4月12日 上午 05:43 修改Wording
    2012年4月12日 上午 05:41
  • 感謝LEO前輩的指教,改成Private Shared ScanCase As Integer 小弟的問題有改善

    也謝謝後面又在指教小弟寫程式的技巧,程式碼看起來真的比較清爽,謝謝。

    小弟之後來研究WIN SERVICE,到時候有問題再請各位前輩指導了。

    感謝各位前輩的指導,謝謝各位

    2012年4月12日 下午 02:58