CAPL與Python交互的實(shí)現(xiàn)
前言
Python是很強(qiáng)大的膠水語言,學(xué)會了怎么用CAPL與Python交互,那CAPL就能做超級多的功能。
不要因?yàn)闆]用過Python放棄這么好的工具,因?yàn)镻ython用戶太多了,你直接百度搜索想要Python實(shí)現(xiàn)什么功能,很多時候AI都幫你把Python代碼寫好了,拿來調(diào)試下就能用,關(guān)鍵是用過一次之后,可能就會發(fā)現(xiàn)打開了新世界的大門。
1、CAPL怎么調(diào)Python?
1.1CAPL調(diào)Python的命令
命令:sysExecCmd
//long sysExecCmd(char cmd[], char params[], char directory[]); // 幫助手冊里可以搜到用法 sysExecCmd("python Find_Com_Index.py", "", "./");
這個命令就是調(diào)windows的CMD窗口去做操作,
第一個參數(shù):char cmd[]
要執(zhí)行的命令,也就是要通過CMD調(diào)的應(yīng)用程序,可以是bat腳本,可以是某個exe程序,當(dāng)然也可以是python了,如果是python,就可以后面接python要接的腳本Find_Com_Index.py
第二個參數(shù):char params[]
這個是最有用的,就是調(diào)python腳本或者調(diào)別的exe,bat等入口參數(shù)
第三個參數(shù)
是這個命令的絕對路徑,或者相對于工作目錄的相對路徑。如果是python的話,因?yàn)榘凑誴ython的時候,已經(jīng)給python配置好環(huán)境變量了,就是你在CMD窗口里輸入python之后,CMD就會根據(jù)環(huán)境變量里配置的路徑去找到python.exe執(zhí)行文件調(diào)用,那這個時候路徑這個參數(shù)就要填你要調(diào)用的腳本(.py)的路徑。
python腳本的路徑可以直接寫全,絕對路徑:“C:\Work\Demo”
但是每個人的工程存放路徑不一致,建議還是用相對工程路徑:“./“代表py腳本和canoe工程文件.cfg文件在同一個目錄
如果你想在canoe工程文件.cfg文件目錄下再建一個文件夾專門放py腳本就可以用”./Python_Script”
1.2CAPL調(diào)用Python實(shí)例
很多測試用例里都有Power ON/OFF或者調(diào)節(jié)電壓的需求,比較便宜的程序控制電源都支持串口通信控制電源開關(guān)和電壓。
CAPL可以調(diào)用內(nèi)置函數(shù)RS232Send命令通過COM口發(fā)送命令,但是前提是需要通過RS232Open命令打開對應(yīng)的COM口.針對自己的電腦,你的232串口插上之后可以通過設(shè)備管理器找到對應(yīng)的COM口,然后在CAPL里配置,但是別人用你的腳本測試的時候可能COM口序列號就不一樣了,每次都要重新修改,如果能用python找到COM號,那誰都能用你的腳本了。
用python尋找你電腦上插的232串口線的COM號就比較簡單了,百度一搜一大堆,退一步講,你從網(wǎng)上抄的python腳本一運(yùn)行就報(bào)錯,別怕,python用戶多,你遇到的這點(diǎn)小問題,前人歷經(jīng)了N多遍,搜一下就能解決python報(bào)錯了。
Python腳本如下:網(wǎng)上搜到的,先把電腦識別到的所有COM打印出來,看看長什么樣子,再找自己想要的
import serial import serial.tools.list_ports def Get_Power_COM_Index(): ports_list = list(serial.tools.list_ports.comports())#找到所有的port口 if len(ports_list) <= 0:#一個也沒找到就報(bào)錯 print("there is no Serial Device") else: for comport in ports_list: print(list(comport)[0], list(comport)[1])#有COM口就把所有的COM口信息打印出來 if __name__ == "__main__": Get_Power_COM_Index()
CAPL代碼:
on key 'a' { sysExecCmd("python Find_Com_Index.py", "", "./");//先不用輸入?yún)?shù),只是試驗(yàn)下調(diào)Python的效果 }
效果如下,假設(shè)電源的那根RS232線是COM7,其實(shí)我們運(yùn)行這個腳本的最終目的就是要拿到這個‘7’,用這個7讓CAPL打開7這個COM口:
那怎么拿到這個7, 我們可以用如果‘USB-to-Serial’這個字符串存在COM口信息里,就能獲取到第4行的信息, 再把第4行按照空格分隔字符串,就能得到COM7,再把COM7里的COM刪除調(diào),就能拿到‘7’
Python:
import serial import serial.tools.list_ports def Get_Power_COM_Index(): ports_list = list(serial.tools.list_ports.comports())#找到所有的port口 if len(ports_list) <= 0:#一個也沒找到就報(bào)錯 print("there is no Serial Device") else: for comport in ports_list: #print(list(comport)[0], list(comport)[1])#調(diào)試的時候打印,正式用的時候可打可不打了 if 'USB-to-Serial' in list(comport)[1]:#判斷‘USB-to-Serial'這個字符串存在COM口信息里 COM_Channel = list(comport)[0]#在的話就把‘COM7'取出來 COM_Channel = COM_Channel.strip('COM')#把‘COM'字符串拿掉 Return_Value = int(COM_Channel)#把字符串7,轉(zhuǎn)換成數(shù)字7 print("The useful USB Serial Port is :",Return_Value ) if __name__ == "__main__": Get_Power_COM_Index()
這樣我們就能拿到‘7'了
2、怎么把python運(yùn)行的結(jié)果返回給CAPL
2.1通過環(huán)境變量
CAPL調(diào)python的命令:sysExecCmd的返回結(jié)果只是代表有沒有成功執(zhí)行這個命令,并不返回python運(yùn)行后的結(jié)果。
目前沒有找到更好的方法,用了繞一圈的方法:用Python調(diào)用Canoe把結(jié)果賦值給Canoe的環(huán)境變量,CAPL再取環(huán)境變量拿結(jié)果。
如果大家有更好的方法,歡迎留言。
Python怎么調(diào)用Canoe,在安裝Canoe的時候,有范例,感興趣可以研究下,我只抄了用到的一部分,路徑如下(版本可能不一致):
先在Canoe里新建環(huán)境變量,不知道怎么建的可以搜一下
然后python里,
1.用python連接上canoe
2.獲取到想要的COM的序列號
3.通過設(shè)置環(huán)境變量,把COM序列號賦值給Canoe環(huán)境變量:
import serial import serial.tools.list_ports import time, os, msvcrt from win32com.client import * from win32com.client.connect import * class CanoeSync(object): def __init__(self): self.app = Dispatch('CANoe.Application')#打開Canoe def set_System_var(self, Namespace, system_var, Value_Set): if (self.app != None): self.app.System.Namespaces(Namespace).Variables(system_var).Value = Value_Set def Get_Power_COM_Index(): canoe = CanoeSync()#連接上Canoe,獲取句柄,有了句柄之后就可以用canoe操作CanoeSync里定義的函數(shù) ports_list = list(serial.tools.list_ports.comports())#找到所有的port口 if len(ports_list) <= 0:#一個也沒找到就報(bào)錯 print("there is no Serial Device") else: for comport in ports_list: #print(list(comport)[0], list(comport)[1])#有COM口就把所有的COM口信息打印出來 if 'USB-to-Serial' in list(comport)[1]:#判斷‘USB-to-Serial'這個字符串存在COM口信息里 COM_Channel = list(comport)[0]#在的話就把‘COM7'取出來 COM_Channel = COM_Channel.strip('COM')#把‘COM'字符串拿掉 Return_Value = int(COM_Channel)#把字符串7,轉(zhuǎn)換成數(shù)字7 canoe.set_System_var("Python_Result","Result_Value",Return_Value)#把轉(zhuǎn)換后的COM號,通過環(huán)境變量給到Canoe if __name__ == "__main__": Get_Power_COM_Index()
在CAPL里
1.按鍵’a’調(diào)用Python腳本去讀COM序列號
2.去環(huán)境變量里拿COM序列號
3.。。。
on key 'a' { sysExecCmd("python Find_Com_Index.py", "", "C:\\Work\\Demo"); } on sysvar_update Python_Result::Result_Value { write("Find Com Channel is: %d",@Python_Result::Result_Value); }
CAPL的打印結(jié)果:
3、CAPL調(diào)Python的輸入?yún)?shù)
如果調(diào)python的時候沒有帶輸入?yún)?shù),回有很大的不方便:
1.調(diào)一個python腳本實(shí)現(xiàn)一個功能,那一個CAPL腳本里,可能幾十上百個調(diào)python的用的地方,總不能寫幾百個python腳本吧,就比如說這次是想用python找USB轉(zhuǎn)串口的COM號,用的關(guān)鍵字是’USB-to-Serial’,那下一個case想找的是’Technology’的怎么辦?
把想搜索的作為輸入?yún)?shù)傳進(jìn)去:
CAPL:
on key 'b' { sysExecCmd("python Find_Com_Index.py", "Technology", "./"); }
python:把輸入?yún)?shù)作為搜索條件
import serial import serial.tools.list_ports import time, os, msvcrt from win32com.client import * from win32com.client.connect import * class CanoeSync(object): def __init__(self): self.app = Dispatch('CANoe.Application')#打開Canoe def set_System_var(self, Namespace, system_var, Value_Set): if (self.app != None): self.app.System.Namespaces(Namespace).Variables(system_var).Value = Value_Set def Get_Power_COM_Index(str): canoe = CanoeSync()#連接上Canoe,獲取句柄,有了句柄之后就可以用canoe操作CanoeSync里定義的函數(shù) ports_list = list(serial.tools.list_ports.comports())#找到所有的port口 if len(ports_list) <= 0:#一個也沒找到就報(bào)錯 print("there is no Serial Device") else: for comport in ports_list: #print(list(comport)[0], list(comport)[1])#有COM口就把所有的COM口信息打印出來 if str in list(comport)[1]:#判斷str這個字符串存在COM口信息里 COM_Channel = list(comport)[0]#在的話就把‘COMx'取出來 COM_Channel = COM_Channel.strip('COM')#把‘COM'字符串拿掉 Return_Value = int(COM_Channel)#把字符串轉(zhuǎn)換成數(shù)字 canoe.set_System_var("Python_Result","Result_Value",Return_Value)#把轉(zhuǎn)換后的COM號,通過環(huán)境變量給到Canoe if __name__ == "__main__": CMD1 = sys.argv[1] Get_Power_COM_Index(CMD1)
2,你想用python打開某個文件,寫入某個值,操作的文件名,寫入的數(shù)最好都是可以通過輸入?yún)?shù)傳進(jìn)去的,而不是要寫n多個python。多個參數(shù)的傳入時,參數(shù)與參數(shù)之間,用空格代替。
CAPL:
on key 'c' { sysExecCmd("python test.py", "a.txt 12345", "./"); }
import sys def write_txt(filename,value): with open(filename,'a') as f: f.write(value) if __name__ == "__main__": CMD1 = sys.argv[1] CMD2 = sys.argv[2] write_txt(CMD1,CMD2)
到此這篇關(guān)于CAPL與Python交互的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)CAPL與Python交互內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于PyCharm安裝后修改路徑名稱使其可重新打開的問題
這篇文章主要介紹了關(guān)于PyCharm安裝后修改路徑名稱使其可重新打開的問題,本文通過圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10python類的方法屬性與方法屬性的動態(tài)綁定代碼詳解
這篇文章主要介紹了python類的方法屬性與方法屬性的動態(tài)綁定代碼詳解,具有一定借鑒價(jià)值,需要的朋友可以參考下2017-12-12