VB環(huán)境下利用并口實(shí)現(xiàn)PLC控制
1 引言
普通的計(jì)算機(jī)一般都配有并行接口(就是通常用的打印機(jī)接口),它是通過(guò)25芯的D型接頭連接打印機(jī)與計(jì)算機(jī)的,計(jì)算機(jī)的并行接口不僅可以向打印機(jī)發(fā)送數(shù)據(jù),還可以從打印機(jī)接收數(shù)據(jù)(打印的工作狀態(tài))。因此,利用計(jì)算機(jī)的并行接口,你可以去控制外部繼電器的吸合,從而控制外部設(shè)備,同樣可以利用它來(lái)檢測(cè)外部設(shè)備的狀態(tài)。不需添加任何硬件。從而使一臺(tái)普通的計(jì)算機(jī)具有“PLC”的開(kāi)關(guān)量的功能。
本文分析的系統(tǒng),把普通并口實(shí)現(xiàn)了一個(gè)4輸入8輸出數(shù)字量的功能,切不需任何投資。們先對(duì)打印機(jī)的并行口做一下細(xì)致的分析。配有一個(gè)并口的計(jì)算機(jī)經(jīng)系統(tǒng)引導(dǎo)后,初始化過(guò)程把并行端口配置成LPT1, 這個(gè)端口又分配了數(shù)據(jù)地址378H, 狀態(tài)地址379H。其中378H端口做輸出端口,379H端口做輸入端口。
2 并口數(shù)據(jù)采集控制原理
(1) 端口378H,378H的管腳見(jiàn)表1。
在計(jì)算機(jī)通電后的自然狀態(tài),378H端口的每個(gè)數(shù)據(jù)位為1,表1中每個(gè)管腳對(duì)地(25腳)為高電平5V。即378H地址的內(nèi)容為FF(十進(jìn)制是255),當(dāng)控制378H的內(nèi)容為1(十進(jìn)制)二進(jìn)制碼是00000001時(shí),即2腳對(duì)地輸出高電平,其它對(duì)地是0電平。如控制378H的內(nèi)容為2(十進(jìn)制)二進(jìn)制碼是00000010,即3腳對(duì)地輸出高電平,其它對(duì)地是0電平。如控制378H的內(nèi)容為3(十進(jìn)制)二進(jìn)制碼是00000011,即2、3腳對(duì)地輸出高電平,其它對(duì)地是0電平。依次類(lèi)推。
當(dāng)某管腳對(duì)地是高電平5V時(shí),由于每條數(shù)據(jù)線(xiàn)的輸出電流高達(dá)20mA,可以接5V的直流繼電器,通過(guò)繼電器的觸點(diǎn)在去控制其它的設(shè)備,如電磁閥、電機(jī)等。圖1是用打印機(jī)并行接口實(shí)現(xiàn)的繼電器控制電路,此電路稍加修改即可用于其它設(shè)備的開(kāi)關(guān)控制。
(2) 端口379H,379H的管腳見(jiàn)表2。
圖2是用打印機(jī)并行接口實(shí)現(xiàn)的開(kāi)關(guān)檢測(cè)控制電路,當(dāng)K斷開(kāi)時(shí),379H為127(十進(jìn)制),當(dāng)K閉合時(shí),379H為111(十進(jìn)制)二進(jìn)制數(shù)是01101111,即13腳所連接的第4數(shù)據(jù)位為0。
3 軟件實(shí)現(xiàn)
VB是一種可視化的編程語(yǔ)言,自面世以來(lái),因簡(jiǎn)單易用倍受廣大編程人員的青睞,作為一種非常方便的Windows95應(yīng)用程序開(kāi)發(fā)平臺(tái),可以實(shí)現(xiàn)Windows的絕大部分功能。
VB中沒(méi)有專(zhuān)門(mén)的對(duì)并口的操作控件,要實(shí)現(xiàn)對(duì)并口的讀寫(xiě),需要對(duì)I/O進(jìn)行操作,但對(duì)硬件進(jìn)行訪(fǎng)問(wèn)以及利用各種控制接口板進(jìn)行數(shù)據(jù)采集,僅靠VB是無(wú)法解決的。解決這樣的問(wèn)題可以間接使用動(dòng)態(tài)鏈接庫(kù)DLL(Dynamic Link Library)來(lái)實(shí)現(xiàn)。程序人員利用DLL可以實(shí)現(xiàn)應(yīng)用程序共享代碼和資源,DLL與用戶(hù)的程序完全分開(kāi)。
動(dòng)態(tài)鏈接庫(kù)(DLL)雖然是一個(gè)可執(zhí)行模塊,但它并不可以直接運(yùn)行,它只是提供一群函數(shù)供Windows應(yīng)用程序或其它動(dòng)態(tài)鏈接庫(kù)調(diào)用,以完成其特殊任務(wù)。由于動(dòng)態(tài)鏈接庫(kù)是在應(yīng)用程序運(yùn)行期間被連接起來(lái)的,故稱(chēng)為動(dòng)態(tài)鏈接庫(kù)。本設(shè)計(jì)用VC++設(shè)計(jì)了一個(gè)讀寫(xiě)IO端口的動(dòng)態(tài)鏈接庫(kù)IO.DLL。
筆者利用VC++5.0開(kāi)發(fā)的DLL的完整的程序清單如下:
∥DLL源文件I0.CPP
#include <windows.h>
#include<conio.h>
int FAR PASCAL outport(unsigned)
short sport);
int FAR PASCAL outport(unsigned short port,int databyte);
∥D11EntryPoint函數(shù)
BOOL WINAPI D11EntryPoint
(HINSTANCE hD11,
DWORDdwReason,
LPVOID Reserved)
{
switch(dwReason)
{
case DLL_PROCESS_ATTACH:
?。?BR> break;
?。?BR>case DLL_PROCESS_DETACH:
?。?BR> break;
?。?BR>}
return TRUE;
}
∥兩個(gè)功能函數(shù)
int FAR PASCAL inport(unsigned short port)
{
reture(_inp(prot);
)
int FAR PASCAL outport(unsigned short port,int databyte)
{
int a;
a=_outp(port,databyte);
return a;
}
∥模塊定義文件I0.DEF
CODE PRELOAD MOVEABLE DISCARDABLE
DATA PRELOAD SINGLE
EXPORTS
inport
outport
動(dòng)態(tài)鏈接庫(kù)只有在別的模塊中調(diào)用了它的某個(gè)函數(shù)以后,該動(dòng)態(tài)鏈接庫(kù)才發(fā)生作用。DLL函數(shù)或過(guò)程必須在全局模塊(*.BAS)中正確說(shuō)明才有效。VB是用Declare語(yǔ)句把一個(gè)DLL函數(shù)引入VB中的,它告訴VB在哪里找到DLL函數(shù),并且讓VB知道DLL需要哪種類(lèi)型的參數(shù),同時(shí)返回哪種類(lèi)型的值。當(dāng)某個(gè)DLL函數(shù)用Declare語(yǔ)句正確聲明以后,就可以像使用其它函數(shù)一樣使用這個(gè)DLL函數(shù)。
在VB應(yīng)用程序的全局模塊中聲明I0.DLL并將其放入Windows\system目錄下,這樣就可以向使用Windows API一樣使用I0中的inport(輸入)和outport(輸出)函數(shù)了。
Declare Function inport Lib"io.d11"
(ByVal prot As Integer)As Long
Declare Function outport Lib"io.d11"
(ByVal port As Integer,ByVal
databyte As Long)As Long
下面的程序?qū)D1和圖2的例子進(jìn)行設(shè)計(jì)。(只列出輸入輸出的讀寫(xiě)操作程序)
Private Sub 輸入_Click
X=inport(&H379)
Print x
End Sub
Private Sub輸出_Click
y=outport(&H378,1)
End Sub
4 結(jié)束語(yǔ)
并口25管腳中,作輸出用的是2~9共8個(gè)管腳,作輸入用的10、12、13、15共4個(gè)管腳,25腳地,利用并口可方便的實(shí)現(xiàn)了4入8出的開(kāi)關(guān)量控制。
在上位機(jī)中采用VB等語(yǔ)言編程,利用計(jì)算機(jī)的并口,巧妙地實(shí)現(xiàn)PLC的開(kāi)關(guān)量功能,而且可利用VB等語(yǔ)言的界面設(shè)計(jì)的功能,使系統(tǒng)做到監(jiān)控一體。且系統(tǒng)不需額外的投資,使用靈活簡(jiǎn)單,可靠性高。
文章版權(quán)歸西部工控xbgk所有,未經(jīng)許可不得轉(zhuǎn)載。
你可能感興趣的文章