當前位置:首頁 > 工業(yè)控制 > 工業(yè)控制
[導讀] 1 引言計算機串行通信是計算機與控制設備(plc)進行數(shù)據(jù)傳送的基本通信方式,也是實現(xiàn)工業(yè)自動控制經(jīng)常用到的通信模式。每一種通信方式都嚴格約定了與其對應的通信協(xié)議,要確保計算機與plc之間能正常通信,就必須遵照

 1 引言

計算機串行通信是計算機與控制設備(plc)進行數(shù)據(jù)傳送的基本通信方式,也是實現(xiàn)工業(yè)自動控制經(jīng)常用到的通信模式。每一種通信方式都嚴格約定了與其對應的通信協(xié)議,要確保計算機與plc之間能正常通信,就必須遵照其通信協(xié)議編寫通信程序。

2 串行通信

串行通信在工業(yè)系統(tǒng)控制的范疇中一直占據(jù)著極其重要的地位,串行端口(rs-232)是計算機上的標準配置,常用于連接調(diào)制解調(diào)器來傳輸數(shù)據(jù),在計算機的硬件設備管理器中可以看到,定義為com1、com2等。常用的串行通信方式有兩種,分別是rs-232和rs-485,本文以rs-232方式為例進行介紹。

3 上位機編程

3.1 c++builder編程

c++builder是由borland公司推出的產(chǎn)品。它采用c++語言作為開發(fā)語言,是面向對象語言,具有可視化編程界面且功能強大。

3.2 c++builder串行通信相關api函數(shù)

c++builder本身并不提供單獨的串行通信組件,而是使用一些windows api的函數(shù)來達到此目的。這些函數(shù)是由操作系統(tǒng)所提供,可以為程序設計人員提供相當多的執(zhí)行功能。api中與串行通信相關的函數(shù)約有20個,本文將對經(jīng)常使用的函數(shù)作討論。

(1) 打開串行端口

hcomm=createfile(comno,generic_read|generic_write,0,null,open_existing,0,0)

函數(shù)參數(shù)定義如下:

hcomm:createfile()函數(shù)的返回值,程序使用此返回值進行相關的串行端口操作。

comno:定義串行端口號,為com1、com2等。

generic_read|generic_write:對串行端口的讀/寫操作。

0:是否共享串行端口,通常不會將串行端口與其它程序共享,因此設為0,否則為1。

null:函數(shù)的返回值hcomm是否可被子程序繼承,此處設為不可繼承。

open_existing:打開端口的方式,串行端口是一種設備,必須指定為open_existing方式。

0:使用同步或異步方式傳輸數(shù)據(jù),同步方式編程簡單,速率快,因此設為0,否則為1。

0:由于使用串行端口編程,設為0。

(2) 得到串行端口狀態(tài):

getcommstate(hcomm,&dcb)

函數(shù)參數(shù)定義如下:

hcomm:createfile()函數(shù)的返回值。

dcb:串行端口控制塊地址,負責對串行端口參數(shù)進行設置,具體參數(shù)如下:

dcb.baudrate:設置串行端口的波特率,有19200kb/s、9600kb/s、4800kb/s幾種,一般為:9600kb/s。

dcb.bytesize:設置串行端口的數(shù)據(jù)位數(shù),有5、6、7、8幾種,歐姆龍plc數(shù)據(jù)位數(shù)為7。

dcb.parity:設置串行端口的校驗位檢查,有none、even、odd幾種,設為none。

dcb.stopbits:設置串行端口的停止位數(shù),有1、1.5、2幾種, 歐姆龍plc的停止位數(shù)為1。

(3) 設置串行端口狀態(tài):

setcommstate (hcomm,&dcb)

函數(shù)參數(shù)定義與getcommstate()函數(shù)相同。

(4) 向串行端口寫數(shù)據(jù):

writefile(hcomm,senddata,bs,&lrc,null)

函數(shù)參數(shù)定義如下:

hcomm:createfile()函數(shù)的返回值。

senddata:寫數(shù)據(jù)的地址。

bs:寫入數(shù)據(jù)的字節(jié)數(shù)。

lrc:被寫入的數(shù)據(jù)地址。

null:寫入數(shù)據(jù)的同步檢查,串行端口采用同步通信時可以設為null。

(5) 清除串行端口的錯誤或將串行端口當前的數(shù)據(jù)狀態(tài)送至輸入緩沖區(qū):

clearcommerror(hcomm,&dwerror,&cs)

函數(shù)參數(shù)定義如下:

hcomm:createfile()函數(shù)的返回值。

dwerror:返回錯誤信息代碼。

cs:指向串行端口狀態(tài)的結構變量。

(6) 從串行端口的輸入緩沖區(qū)讀出數(shù)據(jù):

readfile(hcomm,inbuff,cs.cbinque,&nbytesread,null);函數(shù)參數(shù)定義如下:

hcomm:createfile()函數(shù)的返回值。

inbuff:指向用來存儲數(shù)據(jù)的地址。

cs.cbinque:讀取數(shù)據(jù)的字節(jié)數(shù)。

nbytesread:總的讀取字節(jié)數(shù)。

null:如果不進行后臺工作,串行端口設為null。

(7) 關閉串行端口:

closehandle(hcomm)

函數(shù)參數(shù)定義如下:

hcomm:createfile()函數(shù)的返回值。

4 plc通信數(shù)據(jù)幀介紹

計算機與歐姆龍plc通信時,按應答方式進行。由計算機發(fā)給plc一組ascii碼字符數(shù)據(jù),這一組數(shù)據(jù)成為命令塊。plc收到命令塊后經(jīng)分析認為命令正常,則按照命令進行操作,將操作結果返回給計算機。plc返回給計算機的這一組數(shù)據(jù)稱為響應塊。若plc收到命令后經(jīng)分析確認命令不正常,則返回給計算機錯誤命令塊。計算機和plc通信時,歐姆龍plc是被動的,必須先由計算機給plc發(fā)出命令塊,plc再給計算機發(fā)出響應塊。命令塊和響應塊以幀(frame)為單位進行傳送,一幀最多由131個字符組成。下面將歐姆龍plc命令幀與響應幀的組成結構介紹如下:

4.1 命令幀

命令幀組成結構如圖1所示。

幀結構解析:

@:在起始處必須放置

節(jié)點號:有效值為00—31, 表示pc機最多可同32臺plc通信

頭代碼:plc的命令代碼

發(fā)送文本:pc機發(fā)送的命令參數(shù)

fcs(frame check sequence) :幀檢查順序代碼(幀校驗碼)

幀校驗碼是2位(bit) 十六進制數(shù)。它是由幀數(shù)據(jù)包含的所有字符的ascii碼進行位異或運算的結果。

終止符:“*”號和回車符“cr”

舉例如下:

讀h區(qū)命令幀結構如圖2所示。

4.2 響應幀

響應幀結構如圖3所示。

幀結構解析:

@ :返回命令頭

節(jié)點號 :有效值為00—31,返回數(shù)據(jù)的plc節(jié)點號

頭代碼 :plc的命令代碼

尾代碼 : 返回命令完成狀態(tài)碼

接收文本: 在有數(shù)據(jù)時返回的數(shù)據(jù)

fcs :幀檢查順序代碼

終止符:“*”號和回車符“cr”

舉例如下:

讀h區(qū)響應幀結構圖4所示。

4.3 fcs(幀數(shù)據(jù)冗余校驗碼)的計算

為了降低串行通信的誤碼率,在接收和發(fā)送端都必須對數(shù)據(jù)進行校驗,常用的方法是進行fcs校驗。對幀數(shù)據(jù)進行冗余校驗計算時,應對幀數(shù)據(jù)中各個字符的ascii碼進行位異或運算,然后將結果轉為2位十六進制字符。

5 c++builder api函數(shù)應用

5.1 通信主程序的設計架構

通信主程序的主要功能:實現(xiàn)計算機對plc的運行控制和狀態(tài)監(jiān)視,即構成一個閉環(huán)監(jiān)控系統(tǒng),程序設計架構如圖5所示。

5.2 打開串信端口

(1) 打開通信端口,對端口進行初始化設置,工作流程如圖6示。

(2) 打開通信端口程序源代碼:

void__fastcall tform1::button1click(tobject *sender)

{

char *comno;

dcb dcb;

string temp;

temp=“com”+inttostr(rdcom-》itemindex+1);

comno=temp.c_str() ;

hcomm=createfile(comno,generic_read|generic_write,

0,null,open_existing,1,0);

if(hcomm==invalid_handle_value)

{

messagebox(0,“打開通信端口錯誤,請檢查端口是否被占用!!” ,“comm error”,mb_ok);

return;

}

getcommstate(hcomm,&dcb);

dcb.baudrate=cbr_9600;

dcb.bytesize =7;

dcb.parity =evenparity;

dcb.stopbits =onestopbit;

setcommstate(hcomm,&dcb);

if(!setcommstate(hcomm,&dcb))

{

messagebox(0,“通信端口設置錯誤!!!”,“set error”,mb_ok);

closehandle(hcomm);

return;

}

}

5.3 寫plc內(nèi)存數(shù)據(jù)

(1) 將計算機發(fā)出的命令寫入plc,實現(xiàn)計算機對plc的控制功能。工作流程如圖7示。

(2) 寫plc內(nèi)存函數(shù)程序源代碼:

string tform1::write(string address,string value)

{

unsigned long lrc,bs;

string temp;

char *senddata;

char inbuff[1024];

int ln,i=0;

string word,check;

dword nbytesread,dwevent,dwerror;

comstat cs;

word=“@00wd”+address+value;

if(hcomm==0)

{

messagebox(0,“串口未打開!!!”,“錯誤信息”,mb_ok);

return(0);

}

temp=outchecksum(word);

senddata=temp.c_str() ;

bs=strlen(senddata);

loop:

if(++i《=3)

{

writefile(hcomm,senddata,bs,&lrc,null);

sleep(100);

if(hcomm==invalid_handle_value) return(0);

clearcommerror(hcomm,&dwerror,&cs);

if(cs.cbinque》sizeof(inbuff))

{

purgecomm(hcomm,purge_rxclear);

return(0);

}

readfile(hcomm,inbuff,15,&nbytesread,null);

check=inbuff;

if(check.substring(6,2)!=“00”)

{

goto loop;

}

}

else

{

messagebox(0,“數(shù)據(jù)寫錯誤”,“通信錯誤”,mb_ok);

}

}

5.4 讀plc內(nèi)存數(shù)據(jù)

(1)從plc中讀取數(shù)據(jù),監(jiān)視plc的運行數(shù)據(jù),工作流程如圖8示。

(2) 讀plc內(nèi)存函數(shù)程序源代碼:

string tform1::read(string address,string value)

{

string readdata,readdata1,readdata2;

string temp;

unsigned long lrc,bs;

char *senddata;

int ln,i=0,len;

dword nbytesread,dwevent,dwerror;

comstat cs;

char inbuff[1024];

string word;

word=“@00rd”+address+value;

if(hcomm==0) return(0);

temp=outchecksum(word);

senddata=temp.c_str();

bs=temp.length();

loop:

if(++i《=3)

{

writefile(hcomm,senddata,bs,&lrc,null);

sleep(100);

if(hcomm==invalid_handle_value) return(0);

clearcommerror(hcomm,&dwerror,&cs);

if(cs.cbinque》sizeof(inbuff))

{

purgecomm(hcomm,purge_rxclear);

return(0);

}

cs.cbinque=4*strtoint(value)+11;

readfile(hcomm,inbuff,cs.cbinque,&nbytesread,null);

inbuff[cs.cbinque]=`\0`;

readdata =inbuff;

len=readdata.length();

if(len==0)

{

goto loop;

}

if(readdata.substring(6,2)!=“00”)

{

goto loop;

}

if(inchecksum(readdata)!=1)

{

goto loop;

}

}

else

{

messagebox(0,“讀數(shù)據(jù)錯誤”,“通信錯誤”,mb_ok);

}

return(readdata);

}

6 結束語

本文圍繞如何使用c++builder

api函數(shù)編寫出符合計算機與歐姆龍plc串行通信協(xié)議的控制程序進行闡述,項目已經(jīng)調(diào)試通過運行。

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯(lián)合牽頭組建的NVI技術創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術創(chuàng)新聯(lián)...

關鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉