2021年9月21日 星期二

LabVIEW CLD 考試心得

 

接觸LabVIEW 很多年,從碩士班開始就碰了,那個時候我們的指導教授還有找畢業多年的學長回來教LabVIEW,他過去幾年也有教LabVIEW,不過他最近也勸大家多學Python啊。我覺得LabVIEW是一個特定面向的程式工具,就是在PC base上去做快速的儀器控制系統開發。當然因為它的GUI控制以及功能控制相對簡單,是優點也是缺點。如果你的使用目的是用電腦做一個自製的測量系統、儀器控制系統。如果你的硬體是簡單的RS-232、Ethernet TCP/IP、或是IVI的VISA介面,這個在Keithley、Tek的示波器、訊號產生器很常見,這些公司也很佛心的給你這些Sample Code 或是VI Tree,這個就是用下下指令可以控制。如果你的硬體要呼叫印體驅動程式的dll、或是dotnet的、ActiveX的程式,那你真的需要在懂很多LabVIEW以外的程式知識。這個我覺得是LabVIEW 用到後來最困難的部分,與外部程式結合。另外一個困難點是程式的架構如何做模組化以及模組間的溝通。

 

不過LabVIEW CLD考試的範圍就是純粹LabVIEW 軟體的熟悉程度,以考試來說,你就是展現你知道LabVIEW 如何寫出一個讓人看得懂的架構,而非義大利麵。因為CLD的考試都是考得也不算是儀器控制,因為你遇到的可能是提款機、販賣機、鍋爐、咖啡機、微波爐。比較多的是架構、資料傳輸(展現一下你會用 FGV, functional global variable)、TypeDef使用、流程控制、Config 形式的ini 資料的讀取以及寫入、複合式Cluster Array的資料觸發、以及計時器,(計時器這個千變萬化,我也不知道哪種最好),還有好的程式的註解。

 

現在考試都是採用線上考試,所以你要準備護照、有一台可以有攝影機的電腦、有乾淨的桌子,桌上要淨空,他會希望你把筆電拿起來看一下桌面。然後考試的時候你的攝影機要打開,會有監考人員一直看你,不過你看不到他,然後你不能摀住嘴巴。我考試的時候如果用手撐住頭,就會擋住嘴巴,他馬上就會傳訊給我要我不能擋住臉。

 

首先你要先去 NI LabVIEW的網站去,看一下LabVIEW的考試說明,報名這些步驟就依照指示刷信用卡。因為要花錢,所以大家多準備一下再去考吧。

https://education.ni.com/badges/resources/1255/certified-labview-developer-cld

記得要下載 CLD Sample Exams

 

Sample Exam 有四個

ATM (100928C-01) 提款機

Boiler (100926F-01) 鍋爐溫度控制

Car Wash (100929B-01) 洗車場

Sprinkler Controller (100927F-01) 灑水器


每個都點進去做看看,題目就是可以在前面版放置GUI、你要把後面的block diagram給弄出來。

 

例如說 ATM的前面版長這樣

例如說 ATM的後面版長這樣



你自己就要把這些線拉出來。

接下來我會把我覺得比較重要的考點給分享出來。


考點一:程式架構 

你可以用State Machine, Queue Message Handler, Consumer Producer 去寫,我個人是用State Machine 因為比較簡單,我覺得應該是對考CLD夠用,當然你也可以用其他的設計模板。你的State 就用Type Definition 去設定,如果要增加就再放上去。Type Definition 一定會有的狀態是 Initialize、Idle、Stop。我的Event Structure 放在



增加的State 可以依照說明的功能依序去增加。我的State Machine 模板可以在這裡下載

 

考點二:資料傳輸

因為官方的說明希望你不要使用local variable 以及global variable,所以如果你有資料一定無法透過data flow 的線去傳輸的話,你可以試著使用functional global variable (FGV),把資料用Set及Get的方式去紀錄。當然這是因為LabVIEW的特性,所以用去把要記錄的資料存起來,它可以是從ini裡面,讀取到的數字,這個數字會隨功能,也許可以提款機的帳戶數字。

 

考點三:TypeDef使用

可以把State Machine的Enum State用TypeDef 設定,Control 因為考試都已經設定好了,所以你不能改。所以就熟悉就好。

   



考點三:流程控制

在State Machine中完成每一個步驟再照指示去下一個步驟,然後這個步驟可能會依不同的情況而改變。


就是這個state 做完之後要去哪一個 state的判斷式    

考點四:ini 資料的讀取以及寫入

可能這個洗衣機、咖啡機的參數會用存在這個ini檔案裡面,再去考之前要搞懂Key、Section那些是指config file的哪個部分。


考點五:計時器

就像是洗車場跟灑水器一樣,可能做某個步驟會要多少時間,如果中途暫停,就要停止計時。最好在考之前就自己有一個timer 模板。

附上我自己的Timer 模板,Timer_main會呼叫Timer

Timer_Main



Timer_Sub



我的Timer模板可以從這裡下載。

 

 

考點六:複合式Cluster Array的資料觸發

 

他可能會設計一個Cluster Array 做成前面板的GUI,一般來說這樣可能是一個2D Array,每一個Array Unit裡面有不同的item,使用者可能會按了其中一個,你要能夠知道是按了哪一個項目。


那我去偵測的方式是去比較前後差異產生的Boolean ,或許你還可以用其他方式去偵測,再用迴圈的方式去看是哪一個元素變化了。再把Row、Column、Cluster index給找出來。

我的模板可以從這裡下載。


當然還有本來的範例題目出現的cluster array

 

灑水機的 Zone Setup Array

ATM 考試的(Left Buttons以及Left Buttons



考點七:註釋

可以把有特殊邏輯的部分寫下一些註解


在 file=> VI Properties 裡面把每一個Sub VI的VI Description 都寫清楚。


當然網路上的資料很清楚也很多,大家也記得多做功課吧。



2021年7月15日 星期四

[技術分析] 威廉指標

 在Yahoo股市常見的技術指標有很多,之前介紹過均線以及KD線的由來,今天來介紹一下威廉指標。這個指標是看個股是不是被超買或是超賣,




計算方式如下,

$$\frac {H_n - C_n}{H_n - L_n} \times 100\%$$

  1. :是交易者設定的交易期間(常用為14天,yahoo用的是9天);
  2. :第n日的最新收盤價;
  3. :是過去n日內的最高價(如14天的最高價,yahoo用的是9天);
  4. :是過去n日內的最低價(如14天的最低價,yahoo用的是9天)。

威廉指標越接近0代表股價過高,一般來說是指小於20,代表過度買超,股價有回檔的風險

威廉指標越接近100代表股價過低,一般來說是指超過80,代表過度賣超,股價有反彈的機會

因為0是股價高,100是股價低,所以威廉指標的那個y軸方向是向下,這樣線的走勢才會跟股價一下,

股價上升,威廉指標會往上走,

股價下降,威廉指標會往下走,




我以7/14的長榮為範例,連跌4天,當天收跌停,過去九天的收盤價是

日期                  開盤最高最低收盤漲跌       漲%     成交量成交金額本益比
2021/07/14156.00157.00148.50148.50-16.50-10.00%136,71220,641,82512.7358
2021/07/13187.00187.00165.00165.00-18.00-9.84%81,00413,696,10314.1509
2021/07/12195.00197.50174.50183.00-4.00-2.14%62,03611,478,84015.6947
2021/07/09187.00201.50187.00187.00-20.50-9.88%103,31319,748,64616.0377
2021/07/08202.00213.00182.00207.505.502.72%93,85318,277,08517.7959
2021/07/07215.50220.50202.00202.00-22.00-9.82%79,90316,720,37117.3242
2021/07/06218.50233.00212.00224.007.003.23%528,658118,869,17519.211
2021/07/05217.00218.00197.50217.0010.505.08%479,694100,069,99618.6106
2021/07/02213.00219.00200.00206.50-6.50-3.05%546,721114,473,13117.7101

7/14 收盤價是148,跌停,(過去九天最高-今天股價)/(過去九天最高-過去九天最低)

=(224-148.5)/(224-148.5)*100%=100%,

威廉指標=100%,告訴你股價被過度賣超了,如果你覺得2021Q3的長榮基本面還是不錯,你可在2021/7/14布局。

7/15 開盤還是晃晃的,但是神鬼奇航又出動了,今天就收漲停


以上是簡單介紹一下威廉指標的應用。




2021年5月10日 星期一

有的時候我覺得價值投資不會遇到跌停,結果還是給我遇到-談2021 Q2的 國喬(1312)

 我最近都試著用本益比去找股價偏低的個股,我發現國喬本益比不超過10, 而且今年的營收都是正成長的,所以從Q1開始,國喬就緩步成長,我大約四月底進場, 想說雖然漲了一段,但是本益比還是不算太高,所以我想應該還是有上漲空間.

從2021Q1  塑膠類股都緩步上漲

                明明本益比就不到10,股價應該算是低檔,結果



                【公告】國喬董事會決議109年度特別股股利分派

日 期:2021年05月06日

公司名稱:國喬 (1312)

主 旨:國喬董事會決議109年度普通股股利分派

發言人:陳景福

說 明:

1. 董事會決議日期:110/05/06

2. 股利所屬年(季)度:109年 年度

3. 股利所屬期間:109/01/01 至 109/12/31

4. 股東配發內容:

(1)盈餘分配之現金股利(元/股):0.10000000

(2)法定盈餘公積發放之現金(元/股):0

(3)資本公積發放之現金(元/股):0

(4)股東配發之現金(股利)總金額(元):90,662,033

(5)盈餘轉增資配股(元/股):0

(6)法定盈餘公積轉增資配股(元/股):0

(7)資本公積轉增資配股(元/股):0

(8)股東配股總股數(股):0

5. 其他應敘明事項:

無

6. 普通股每股面額欄位:新台幣10.0000元

===================

然後一直以來都國喬都不發股利,今年比較不錯,20210506 公布發放股利,發了0.1元,結果股一堆咒罵,說明天開盤一定跌停。


結果真的跌停了, 我想再說公司又不是很不賺錢,有必要反映這麼劇烈嗎?


結果是
台塑集團預警石化價格已觸頂,7日嚇趴一堆塑化股,台塑四寶股價大跌,台塑(1301)跌幅更逾7%,影響所及,包括華夏(1305)等16檔原物料股臉綠,所幸鋼鐵人及航海王人氣仍旺,中鴻(2014)、新興(2605)等尾盤拉上漲停板作收。

16檔股價大跌逾3%的原物料概念股,包括國喬、華夏、台塑、冠軍、亞聚、福大、幸福、中石化、中鋼構、台化、台玻、大東、台塑化、新纖、聯成、宏泰等。

連台塑這個好寶寶都可以跌7%, 那我覺得國喬跌停可能也沒什麼, 
唉.這種塑化股的系統性風險真的閃不掉啊


2021年5月4日 星期二

LabVIEW 利用 Python的OpenCV分析角度

 

題目:我使用LabVIEW 控制儀器,我需要判斷拍到的照片裡面方格偏轉的角度,Python 有很多現成的函式庫, 例如OpenCV, 我想要把圖從LabVIEW傳給Python, 再從Python去分析圖片偏轉的角度,再回傳給LabVIEW 去做平台角度的補償。

我拍的照片是8bits 灰階, 所以我把8bits的影像傳到python,再把這個8bits的影像整理成為nparray,再把nparray轉成OpenCV可以用的影像array

我參考了幾個範例,照片以及程式參閱附件



 1.Can a Python Node to Call a Function That Includes Python Packages?

#https://knowledge.ni.com/KnowledgeArticleDetails?id=kA03q000000ww92CAA&l=zh-TW for reference

2. Convert nparray to OpenCV

#https://stackoverflow.com/questions/7587490/converting-numpy-array-to-opencv-array

3.Detect angle and rotate an image in Python

#https://stackoverflow.com/questions/46731947/detect-angle-and-rotate-an-image-in-python/46732132




import numpy as np
from scipy import ndimage
import numpy as np
import cv2
import math

def function(lvarray,lvsize):
    Row_N=lvsize[0]
    Col_N=lvsize[1]
    #convert LabVIEW array into Numpy array
    #https://knowledge.ni.com/KnowledgeArticleDetails?id=kA03q000000ww92CAA&l=zh-TW for reference
    nparray =np.array(lvarray)
   
    new_image = np.ndarray((3,Row_N, Col_N), dtype=int)
    new_image[0,:,:]=nparray.reshape((Row_N, Col_N))
    new_image[1,:,:]=nparray.reshape((Row_N, Col_N))
    new_image[2,:,:]=nparray.reshape((Row_N, Col_N))

#Convert nparray to OpenCV
#https://stackoverflow.com/questions/7587490/converting-numpy-array-to-opencv-array
    
    #Converted the datatype to np.uint8
    new_image = new_image.astype(np.uint8)

    #Separated the channels in my new image
    new_image_red, new_image_green, new_image_blue = new_image

    #Stacked the channels
    new_rgb = np.dstack([new_image_red, new_image_green, new_image_blue])

    img_before=new_rgb
    #Resize Image
    img_before = cv2.resize(img_before,(1040,776),interpolation=cv2.INTER_CUBIC)

#Detect angle and rotate an image in Python
#https://stackoverflow.com/questions/46731947/detect-angle-and-rotate-an-image-in-python/46732132

    cv2.imshow("Before", img_before)    
    key = cv2.waitKey(0)
    
    img_gray = cv2.cvtColor(img_before, cv2.COLOR_BGR2GRAY)
    img_edges = cv2.Canny(img_gray, 100, 100, apertureSize=3)
    lines = cv2.HoughLinesP(img_edges, 1, math.pi / 180.0, 100, minLineLength=70, maxLineGap=5)

    angles = []

    for [[x1, y1, x2, y2]] in lines:
        cv2.line(img_before, (x1, y1), (x2, y2), (255, 0, 0), 3)
        angle = math.degrees(math.atan2(y2 - y1, x2 - x1))
        
        if angle <=-45:
            angle = angle + 90
        else:
            if angle >=45:
                angle=angle-90
        
        angles.append(angle)

    cv2.imshow("Detected lines", img_before)    
    key = cv2.waitKey(0)

    mean_angle = np.mean(angles)

    return mean_angle


2017年11月23日 星期四

Hello World! 對話框

======Excel VBA======

Sub Hello()

MsgBox "Hello World!"

End Sub

======C#======

======VB======

======C++======

2017年4月1日 星期六

C++教學網站


語言技術:C++ Gossip

https://openhome.cc/Gossip/CppGossip/


2017年2月12日 星期日

讓LabVIEW 跳出視窗一直在最上層

1.Show front panel when called 時
把 Windows behavior 的model打勾,按其他的VI 就不會回應了。

參考
http://digital.ni.com/public.nsf/allkb/848EBC8A740D026786256F1000732A54