張玉虎
摘 要針對LED電子顯示屏的普遍使用,結(jié)合氣象部門的特點(diǎn),通過VB程序?qū)崿F(xiàn)預(yù)報(bào)節(jié)目自動錄入電子屏,完成節(jié)目自動發(fā)送。
【關(guān)鍵詞】LED電子屏 VB 自動
1 引言
為了宣傳單位形象、展示信息,單位大門安裝單色LED電子顯示屏,這類LED顯示屏均無網(wǎng)絡(luò)功能,節(jié)目要通過管理軟件人工錄入,對于像氣象部門這類每天定時錄入天氣預(yù)報(bào)節(jié)目的單位及用戶,節(jié)目的錄入需安排專人完成,本文討論VB程序完成天氣預(yù)報(bào)節(jié)目的自動錄入、發(fā)送的過程。
2 LED電子屏介紹
通訊方式:RS232(直線條),支持5個節(jié)目,每個節(jié)目劃分5個區(qū)域,節(jié)目編輯、發(fā)送工具菜單如圖1。
用戶可通過“新建”菜單編輯節(jié)目,通過“發(fā)送”菜單將節(jié)目發(fā)送到電子屏顯示。
電子屏軟件安裝目錄下有一個名為:節(jié)目.led的文件,該文件包含所有節(jié)目信息,也可以通過編輯該文件實(shí)現(xiàn)對節(jié)目的編輯,本文通過VB程序處理該文件實(shí)現(xiàn)對節(jié)目的編輯,并通過程序操作鼠標(biāo)點(diǎn)擊“發(fā)送”菜單實(shí)現(xiàn)預(yù)報(bào)節(jié)目的自動發(fā)送。
3 預(yù)報(bào)制作情況
預(yù)報(bào)員將每天的天氣預(yù)報(bào)信息以文本文件格式存放在局域網(wǎng)服務(wù)器的共享目錄下,每天固定兩次(上午06時和下午16時),文件名為:yb121-月月日日06.txt和yb121-月月日日16.txt。
4 實(shí)現(xiàn)過程
將LED電子屏管理的機(jī)器接入局域網(wǎng)服務(wù)器,在該機(jī)器硬盤建立一個存放預(yù)報(bào)信息的文件夾(D:\yb),VB程序安裝在該機(jī)器上,程序?qū)㈩A(yù)報(bào)節(jié)目自動拷貝到該目錄,完成處理后,發(fā)送到LED電子屏。程序設(shè)計(jì)監(jiān)測、處理、發(fā)送三個模塊實(shí)現(xiàn),流程圖如圖2。
4.1 監(jiān)測模塊的設(shè)計(jì)
通過VB時鐘控件實(shí)現(xiàn),監(jiān)測模塊一旦監(jiān)測到服務(wù)器共享目錄里有預(yù)報(bào)文件形成并當(dāng)天未被拷貝,即拷貝文件到LED電子屏管理機(jī)器(D:\YB),調(diào)用處理模塊對文件進(jìn)行處理。以下是對06時文件處理的主要代碼,16時略:
Dim jmonth As String `定義變量
Dim jday As String
Dim Filename06 as string `06時預(yù)報(bào)文件名
Timer1.Interval = 100 `時鐘初始化
If Month(Date) > 9 Then `對預(yù)報(bào)文件名“月”的處理
jmonth = Month(Date)
Else
jmonth = "0" & Month(Date)
End If
If Day(Date) > 9 Then `對預(yù)報(bào)文件名“日”的處理
jday = Day(Date)
Else
jday = "0" & Day(Date)
End If
Filename06 = "\\172.23.116.254\data\氣象服務(wù)\電視天氣預(yù)報(bào)\yb12121-" & jmonth & jday & "06.txt" `形成06時預(yù)報(bào)文件名如yb121-120106.txt。
If Dir(filename06) <> "" And Notcopy Thtn `拷貝06時文件
Copy (filename06,“D:\YB”) ` Notcopy為布爾變量,00時賦值為True,完成拷貝操作就賦值為False。
End if
4.2 處理模塊的實(shí)現(xiàn)
該模塊主要完成對預(yù)報(bào)文件內(nèi)容提取并寫入電子屏管理軟件安裝目錄下的節(jié)目.led文件,對預(yù)報(bào)文件內(nèi)容處理用VB字符處理Mid、InStr 、LTrim等函數(shù)完成。
4.3 發(fā)送模塊的實(shí)現(xiàn)
該模塊是整個程序的關(guān)鍵,當(dāng)處理模塊將節(jié)目文件處理完成好,調(diào)用該模塊完成節(jié)目的發(fā)送工作。首先在程序窗體的“通用部分”申明鼠標(biāo)操作的如下API函數(shù):
Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long) ;`按鼠標(biāo)
Private Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long '移動鼠標(biāo)
程序調(diào)用SetCursorPos函數(shù)將鼠標(biāo)移動到電子屏管理軟件“發(fā)送”菜單上:
Call SetCursorPos(379, 54);調(diào)用mouse_event函數(shù)實(shí)現(xiàn)點(diǎn)擊“發(fā)送”菜單,完成節(jié)目自動發(fā)送:
Call mouse_event(&H2;, 379, 54, 0, 0) '鼠標(biāo)在“發(fā)送”菜單上按下。
Call mouse_event(&H4;, 379, 54, 0, 0) '鼠標(biāo)在“發(fā)送”菜單上抬起。
5 幾點(diǎn)說明
5.1 關(guān)閉led編輯軟件
為了讓程序?qū)κ髽?biāo)完成準(zhǔn)確操作,要及時關(guān)閉打開的led編輯軟件,發(fā)送前先關(guān)閉led編輯軟件后再打開該軟件。
打開用Shell "C:\Program Files\HG\HG.exe", 3)函數(shù)完成。
關(guān)閉led管理軟件定義Killled(Ledss As String)過程完成,該過程用到如下5.3所列的幾個API函數(shù),在程序窗體“通用”處申明,本文略。
5.2 Killled(Ledss As String)過程
代碼如下:
Private Sub Killled(Ledss As String)
Dim Ledshot As Long
Dim Lednext As Long
Dim Ledtp As PROCESSENTRY32
Ledshot = CreateToolhelp32Snapshot(&H2;&, 0&)
If Ledshot <> -1 Then
Ledtp.dwSize = Len(Ledtp)
Lednext = Process32First(Ledshot, Ledtp)
Do While Lednext
If LCase$(Ledss) = LCase$(Left(Ledtp.szExeFile, InStr(1, Ledtp.szExeFile, Chr(0)) - 1)) Then
Dim Led1p As Long
Dim Ledcode As Long
Led1p = OpenProcess(1, False, Ledtp.th32ProcessID)
TerminateProcess Led1p, Ledcode
CloseHandle Led1p
End If
Lednext = Process32Next(Ledshot, Ledtp)
Loop
CloseHandle (Ledshot)
End If
End Sub。
5.3 Killled(Ledss As String)過程
用到的API函數(shù):
CreateToolhelp32Snapshot,Process32First,Process32Next,OpenProcess,TerminateProcess,CloseHandle。
參考文獻(xiàn)
[1]劉彬彬,孫秀梅,鞏建.Visual Basic編程寶典[M].人民電子出版社,2012.
作者單位
寧夏固原市氣象局 寧夏回族自治區(qū)固原市 756000