先說下我的看法:上位機(jī)是不可能完全替代PLC的。上位機(jī)并不是為了替代PLC而誕生的,PLC作為一種典型的下位機(jī),與上位機(jī)之間應(yīng)該是互相協(xié)作的關(guān)系。
但是如果邏輯不是很復(fù)雜,又確實(shí)不想使用PLC,也可以使用上位機(jī)來實(shí)現(xiàn)一定的邏輯控制,現(xiàn)在很多運(yùn)動(dòng)控制視覺項(xiàng)目就是這么來實(shí)現(xiàn)的。
PLC全稱可編程邏輯控制器,主要由輸入輸出(IO)+ 邏輯控制(程序)+ 外部接口(通信)三部分組成。
如果不采用PLC,僅僅通過上位機(jī),我們通過一個(gè)IO采集卡,然后將PLC的邏輯控制改成上位機(jī)代碼來實(shí)現(xiàn),是不是可以實(shí)現(xiàn)一些簡(jiǎn)單的邏輯控制?
既然可行,給大家做一個(gè)簡(jiǎn)單的測(cè)試,基于IO采集卡實(shí)現(xiàn)起保?刂啤
實(shí)現(xiàn)原理
PLC的實(shí)現(xiàn)原理,就是通過不斷地從上而下,從左而右來掃描PLC程序,然后對(duì)接一些IO輸入輸出,通過上位機(jī)來實(shí)現(xiàn)的話,實(shí)現(xiàn)原理可以類似,我們可以通過單獨(dú)的一個(gè)線程來實(shí)現(xiàn)掃描,而PLC里的每個(gè)指令,我們上位機(jī)都可以通過構(gòu)造對(duì)應(yīng)的類來實(shí)現(xiàn)。從某種意義上來說,為什么PLC實(shí)現(xiàn)邏輯控制比較簡(jiǎn)單,其實(shí)是因?yàn)閺S家已經(jīng)幫我們封裝好了很多開箱即用的指令,我們直接調(diào)用即可。
如果想使用上位機(jī)來替代PLC,PLC的IO可以采用IO采集卡,PLC指令可以自己封裝類,PLC中斷,可以通過事件來實(shí)現(xiàn),通信部分上位機(jī)自然可以實(shí)現(xiàn)。
IO采集卡
我這里采用的是正運(yùn)動(dòng)的一個(gè)IO采集卡,型號(hào)是ECI0032,相關(guān)參數(shù)如下所示:
ECI0032 板上自帶 16 個(gè)通用輸入口,16 個(gè)通用輸出口(帶過流保護(hù))。
ECI0032 帶 1 個(gè) RS232 串口,1 個(gè)以太網(wǎng)接口。
ECI0032 帶一個(gè) CAN 總線接口,支持通過 ZCAN 協(xié)議來連接擴(kuò)展模塊和控制器。
實(shí)現(xiàn)過程
基本的接線和配置,我這里就不詳細(xì)闡述了,這里我將板卡的IP地址改為192.168.2.33。
這里接了兩個(gè)按鈕和一個(gè)指示燈,分別表示啟動(dòng)、停止和狀態(tài)顯示。
界面設(shè)計(jì)如下所示:
當(dāng)連接上IO卡之后,可以通過按鈕進(jìn)行本地控制,也可以通過上位機(jī)進(jìn)行遠(yuǎn)程控制。
核心代碼:
private void ProcessControl()
{
while (!cts.IsCancellationRequested)
{
//檢測(cè)到開始按鈕
if (startEdge.CheckEdgeSingal(motion.GetInput(1)))
{
motion.SetOutput(0, true);
}
//檢測(cè)到停止按鈕
if (stopEdge.CheckEdgeSingal(motion.GetInput(0)))
{
motion.SetOutput(0, false);
}
}
}
這個(gè)寫法有點(diǎn)類似于SCL的邏輯。