openOPC與監控頁面二

来源:https://www.cnblogs.com/haozi0804/archive/2020/03/06/12431493.html
-Advertisement-
Play Games

本文通過結合上一篇博文《openOPC與監控頁面一》展現瞭如何通過通過一步一步實現UI端到OPC服務端數據刷新的技術驗證過程, ...


  本章節,我們繼續完成監控頁面驗證的demo,實現實時從後臺刷新數據到UI端,筆者考慮採用B/S架構來構建這個簡單的監控頁面,下麵將演示這個頁面是如何一步一步來演進,這也是希望告訴讀者,當我們面向一個新的需求時,如何通過技術領域的探索驗證技術路線是否滿足需求。在通過迭代來確保功能滿足需求的同時,如何通過不斷的小步迭代改進技術架構的過程。

目標1:實現一個網頁,通過點擊一個按鈕,然後從後臺抓取某幾個位號的值回傳到UI端更新網頁里div的文本內容。

2.1.安裝集成開發環境

  本小節為了提高開發效率,文中演示過程中才用的集成開發環境(IDE),是Visual Studio Community 2019社區版本,可供學習的教育版本和個人開發者使用,同時也授權5人一下的小團隊進行商業開發,另外VS Community 2019Mac版本,對於鐘愛使用Mac同學來說也是一個非常好的IDE選擇。 

VS Community 2019下載網址: 

https://visualstudio.microsoft.com/zh-hans/free-developer-offers/

 筆者所用的開發環境:Windows 10操作系統筆記本電腦,進入安裝界面如下:

 

   註意如上圖一定要選擇左邊ASP.NET Web 開發 和 Python 開發,同時,我們選擇python 2 32-bit 2.7 來確保滿足openOPCpython2環境的需求。如果環境不對就不能正常的訪問到OPC服務讀取tag位號值。

2.2.創建一個web project項目

 安裝完畢後我們啟動VS Community 2019集成開發環境,來到啟動界面,如下圖:

 選擇Create a new project選項創建一個Python web項目,這裡選擇創建Flask Web Project,如下圖:

筆者選擇預設路徑,可自己選擇項目的存放位置。

 

2.3.添加一個項目運行的虛擬環境

 項目運行的虛擬環境很重要,一定要選擇前面openOPC運行支持的python2環境否則後面就會很坑的,如下圖:

 虛擬環境添加過程中IDE環境會自動安裝目標環境需要的相應的一些基本的python,比如Flask和其依賴的第三方組件,如下圖:

   安裝虛擬環境完畢後我們就可以通過IDE環境運行這個項目了,點擊Debug下的F5運行我們剛剛創建的Flask Web項目,一個輕量級的網站就跑起來了,Flask 在輕量級上確實方便又好用的一個web開發利器。

2.4.新增一個自己的測試頁面

 我們新增一個頁面來模擬點擊按鈕刷新界面div文本效果,首先在項目的templates目錄下增加一個新的testPage.html的文件,如下圖:

 

2.4.1.testPage.html代碼

 

<!DOCTYPE html>

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title></title>
        <script src="https://lib.sinaapp.com/js/jquery/2.0.2/jquery-2.0.2.min.js"></script>
</head>
<body>
    <div>
        tag value:
    </div>
    <div id="divTag">0.0 </div>
    <button onclick="testClick()">test</button>
<script>
    //按鈕綁定事件,首先模擬把0.0值修改為2020
        function testClick() {
            $("#divTag").html('2020');          

        }
    </script>
</body>
</html >

   

2.4.2.修改項目的views.py文件代碼

# coding=utf8  #非常重要文件了加了中文一定要加這個標記,否則運行程式會報錯
"""
Routes and views for the flask application.
"""

from datetime import datetime
from flask import render_template
from FlaskWebProject1 import app

#@app.route('/') 註釋這一行預設顯示我們新增的頁面
@app.route('/home')
def home():
    """Renders the home page."""
    return render_template(
        'index.html',
        title='Home Page',
        year=datetime.now().year,
    )

@app.route('/contact')
def contact():
    """Renders the contact page."""
    return render_template(
        'contact.html',
        title='Contact',
        year=datetime.now().year,
        message='Your contact page.'
    )

@app.route('/about')
def about():
    """Renders the about page."""
    return render_template(
        'about.html',
        title='About',
        year=datetime.now().year,
        message='Your application description page.'
    )

@app.route('/') #把網站預設顯示頁面修改為我們新增的頁面便於調試
@app.route('/testPage')
def testPage():
    """Renders the home page."""
    return render_template(
        'testPage.html',
        title='Test Page',
    )

  2.4.3.按F5運行我們的網站項目

 點擊test”按鈕div 文字變成2020,模擬了點擊更新當前文字內容。

  

  到目前為止,這個頁面簡單的體現了主動刷新數據的一個基本機制,那麼接下來嘗試如何從後臺來獲取到數據,後臺獲取數據這裡我們採用JQuery的非同步請求 ajax() 技術來實現,因此我們發現頁面的head裡加載了jquery-2.0.2.min.js文件,本文采用百度的CDN就不用再自己的項目里增加這個js文件了。

 

<script src="https://lib.sinaapp.com/js/jquery/2.0.2/jquery-2.0.2.min.js">
</script>

 

  2.4.4.ajax非同步調用

    現在我們把testClick()函數代碼修改為如下:

 

        function testClick() {
            //模擬改變值
            //$("#divTag").html('2020');

            //模擬非同步從後臺獲得值
            $.ajax({url:"/getTagCurValue/",success:function(result){
                $("#divTag").html(result);
            }});

        }

  

這次運行網站點擊test按鈕我們會在瀏覽器調試工具頁的控制臺上看到錯誤,伺服器沒有發現url資源,如下圖:

 

於是我們得在web服務里增加這個/getTagCurValue/,通過它從服務端返回我們想讀取的tag位號的當前值。 

2.4.5.views文件里增加getTagCurValue url 函數 

@app.route('/getTagCurValue')
def getTagCurValue():
    """Renders the home page."""
    #先返回一個靜態值測試頁面的刷新效果
    return "2021" 

  

Flask筆者用起來可以說真是很爽,你看這麼一段簡單的代碼我們就增加了一個後臺服務介面,F5 點擊“test”按鈕你會發現div文本刷新為“2021”了。是不是得呵呵了。

 

 2.5.讀取opc服務的tag位號值

  現在我們就差一步了getTagCurValue'真正讀取opc服務某一個tag位號的值。這樣就完成了從UI端到服務端主動獲取opc服務tag位號值,並更新UI界面的技術原型。views文件函數getTagCurValue代碼修改如下:

@app.route('/getTagCurValue')
def getTagCurValue():
    #先返回一個靜態值測試頁面的刷新效果
    #return "2021"  
    import OpenOPC
    opc = OpenOPC.client()
    opc.connect('Matrikon.OPC.Simulation')
    result= opc['Random.Int1']
    opc.close()
    return unicode( result)

  

這次我們F5執行測試,點擊“test”按鈕UI界面數據不會刷新,服務端控制台出現錯誤提示:

import OpenOPC

ImportError: No module named OpenOPC

這是因為我們添加的虛擬環境沒法有安裝這個openOPC組件,這裡我們移除這個虛擬環境使用電腦安裝好的python27環境即可,如下圖:

 

  移除虛擬環境後,我的系統會預設使用python3.6,需要把python2.7設置這個工程的預設執行環境,如下圖:

 

 python環境切換成全局的python2.7後我們在F5運行測試,每次點擊“test”按鈕UI都會刷新從服務端獲取到的tag Random.Int1 的當前值。

 

2.6.小結

  本小節,通過設立一個小目標(1億元)我們完成了頁面UI通過主動刷新(通過按鈕Click事件) 採用ajax非同步請求方式從後臺讀取靜態數據,到讀取OPC tag位號值的演進過程,結合上一篇的代碼我們就實現了UI端展現OPC tag 位號值的原型驗證過程,下一篇,我們會進步優化這個頁面,實現頁面的動態自動刷新。

 

 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 作為一個有目標的人(目標是做一個好用的Bootstrap可視化編輯器,第一個版本已經實現,演示地址:https://vular.cn/rxeditor/,代碼地址:https://github.com/vularsoft/rxeditor),工作比較積極,思維也比較活躍,睡眠相對較少。今早6:30就 ...
  • 1 正則表達式概述 1.1 什麼是正則表達式 正則表達式(Regular Expression)是用於匹配字元串中字元組合的模式。在Javascript中,正則表達式也是對象。正則表通常被用來檢索,替換那些符合某個模式(規則)的文本,例如驗證表單:用戶名錶單隻能輸入英文字母、數字或者下劃線,昵稱輸入 ...
  • 根據VueRouter的執行流程,可以通過這三個步驟來理解它的設計思想: 第一步:我們new VueRouter創建VueRouter實例的時候會通過深度遍歷把傳入的router屬性對應的數組給解析一下,保存到一個Map中,每個Map對應router的一個元素,我們稱之為路由記錄,解析的時候會給每個 ...
  • 1.模式從何而來 ♦模式起源於建築領域 ♦模式之父—Christopher Alexander(克裡斯托弗·亞歷山大) ♦模式定義:模式是在特定環境下人們解決某類重覆出現問題的一套成功或有效的解決方案。【A pattern is a successful or efficient solution ...
  • Abp系列 一. "abp框架運行——前後端分離(基於VUE)" 二. "基於abp框架的資料庫種子數據初始化" 基於abp框架的資料庫種子數據初始化 [toc] 1.背景 最近在用abp開發項目,需要將如下區域數據通過程式的初次運行種入資料庫。 不知道大家是怎麼去管理資料庫跟後臺程式的同步的, " ...
  • 一、泛型初步 1.泛型是編譯階段的語法,在編譯階段統一集合中的類型。 package com.bjpowernode.java_learning; import java.util.*; public class D93_1_GenercityInitial { public static void ...
  • NumPy(Numerical Python) 是 Python 語言的一個擴展程式庫,支持大量的維度數組與矩陣運算,此外也針對數組運算提供大量的數學函數庫。NumPy 是一個運行速度非常快的數學庫,主要用於數組計算,包含:一個強大的N維數組對象 ndarray;廣播功能函數;整合 C/C++/Fo ...
  • 分享一下我自己整理的代碼,改兩個參數就可使用(掃描下方二維碼獲取python學習資料) import requests import time headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebK ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...