最佳解答者
想改成網路監控的問題
-
小弟最近用VB.NET寫了一個程式,裡面有掛載PLC軟體的COM元件用來監控PLC
現在小弟想將這個程式透過網路來做監控(不論遠端或近端都可以做操控)
小弟有在圖書館借了一本ASP.NET,想說來試試看
可是小弟找不到ASP.NET如何把COM元件掛進去,這是小弟的第一個問題
第二個問題是想問各位前輩們,因為小弟原本的監控程式已經寫完了,
想說有沒有快一點的方法直接轉換呢??(例如用ASP.NET直接把我原本的成是掛進去之類的)
以上兩個問題,如果各位前輩們有更好的方法也請傳授給小弟,小弟必定感激
P.S 小弟不是專門寫程式語言的,煩請前輩們用簡單一點的方法敘述,謝謝各位前輩們的指教
問題
解答
-
如果是效能考量,那用 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
應該就可以了。
獅子
所有回覆
-
我是用 Socket 來通訊, 就 ASP.NET 網頁和 Windows Service 通訊這樣. 我之所以用 Windows Service, 是因為通常要一直輪詢設備, 我不知道你有沒有這樣的需求就是了.
MSDN 文件庫[Windows 服務應用程式]
在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

-
前輩您好,小弟的想法是架一台主機監控PLC(想法是用ASP.NET),然後其他遠端也可以監控(遠端就只負責命令跟接收,實際還是透過主機去控制PLC),不知前輩是否能懂小弟的敘述(講的不好見諒)
前輩說的收集資料是指還要另外建類似EXCEL的東西嗎??現在小弟比較卡住的部分在於不知道怎麼透過ASP來做控制
因為依照上面回覆BILL前輩的那個範例的話,它的相加應該是在ASP上執行
小弟原先建好的WIN FORM監控程式上面有掛PLC的COM元件
如果照上面的相加範例的話,我是要掛在那個WIN FORM裡面嗎??(那這樣不是變成是WIN FORM在對FORM下命令而不是ASP對PLC下命令??)
不知小弟對於小弟的想法是否能給點意見,謝謝前輩指教
-
從頭到尾, 我就不是在講 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 與設備通訊, 而不會直接對設備通訊.
在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。
-
Google "javascript 定時 Refresh 頁面" "javascript自動刷新頁面" 那這樣瀏覽器就得一直開著. 不然輪詢就會停掉.
這本 來 就是 單用 ASP .NET 的 短處.
監控 的 部分 本來 就 不能 寫在 ASP .NET 中.
監控 的 部分 的 程式 最好 就是 寫 在 AP 或 寫成 Window Service .
ASP .NET 僅是 顯示 監控AP 所 收集的 資料.
至於 ASP. NET 如何與 監控AP 溝通呢 ? 可以 是 寫檔 ; 存資料庫 ; Socket 通訊 ; AP端提供WCF服務 ..........
-
感謝各位前輩的指教,讓小弟受益良多,當初想做這個是因為在書局看到ASP所以想嘗試這樣的做法,小弟並非主修程式語言,問題可能會多了一點,抱歉。
小弟想問一下上面LEO前輩說的意思是運用Windows Service 把監控資料存在檔案(我想用EXCEL)
然後再用ASP去撈EXCEL的資料,是這樣吧??
小弟上網找了一些Windows Service 資料,想請問一下,因為原本是在WIN FORM監控,所以有監控界面看得到,也可以在上面做一些動作,可是如果用WIN SERVICE,小弟昨天研究了一下,不懂要怎麼去"執行"以及"停止"監控(比方說開始監控、停止監控、寫入資料或者是PORT的選擇之類的)
煩請前輩們再指教一下,謝謝了
-
可以利用 ServiceController 物件去操控 Windows Service 的啟動、停止。
MSDN:表示 Windows 服務,可以讓您連接到執行中或已停止的服務進行管理,或取得關於服務的資訊。
上述連結中有範例程式可以參考。
如果 IIS 和 PLC 不同台主機,也不在 AD 中,操控 PLC 的 Windows Service 會有權限的問題要處理。
獅子
-
小弟想說先用上述網頁一直開著的方式先測試一下資料的擷取,之後才打算研究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,結果居然會正常!?這是為什麼呀??
勞請前輩們指導一下,感恩
-
如果是效能考量,那用 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
應該就可以了。
獅子
-
對了,最後建議你重構一下程式,因為三個區段都做相同的事,只是來源名稱不同而已,類似重構成像下面這樣。
請注意,我沒有細看邏輯,簡單用工具抽而已,所以像要不要帶那麼多參數,以及 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
獅子

