流量計(jì) RS485 接口通訊程序的設(shè)計(jì)與實(shí)現(xiàn)
在工業(yè)現(xiàn)場(chǎng),流量計(jì)是工業(yè)測(cè)量中***重要的儀表之一,用于測(cè)量流體的流量,隨著工業(yè)的發(fā)展,尤其工廠對(duì)于智能制造的需求,市場(chǎng)對(duì)流量計(jì)在通訊方面的要求與日俱增,RS485 接口是***適合各種流量計(jì)的通訊接口,設(shè)計(jì)和實(shí)現(xiàn)此通訊程序,可以實(shí)時(shí)快速地將流量數(shù)據(jù)、診斷信息、狀態(tài)檢測(cè)等傳輸?shù)缴衔豢刂葡到y(tǒng)中,實(shí)現(xiàn)信息交互,提高工廠的自動(dòng)化水平。
0 引言
流量計(jì)量是計(jì)量科學(xué)技術(shù)的組成部分之一,它與國民經(jīng)濟(jì)、國防建設(shè)、科學(xué)研究有密切的關(guān)系,做好這一工作,對(duì)保證產(chǎn)品質(zhì)量、提高生產(chǎn)效率、促進(jìn)科學(xué)技術(shù)的發(fā)展都具有重要的作用。目前制造業(yè)都在向智能化轉(zhuǎn)型,工業(yè)生產(chǎn)自動(dòng)化程度愈來愈高,使得流量計(jì)都需要有信息通訊功能,***初是數(shù)據(jù)模擬信號(hào)輸出簡單過程量,后來采用 RS232 接口,這種接口可以實(shí)現(xiàn)點(diǎn)對(duì)點(diǎn)的通信方式,但這種方式不能實(shí)現(xiàn)聯(lián)網(wǎng)功能,隨后出現(xiàn)的 RS485 接口徹底解決了這個(gè)問題,RS485 接口使用通訊指令進(jìn)行串行通訊,傳輸流量計(jì)的流量數(shù)據(jù)、診斷信息、狀態(tài)檢測(cè)等信息。
1 .串行接口
工業(yè)生產(chǎn)對(duì)于信息化的需求是不可或缺的,使得企業(yè)在流量計(jì)選型時(shí)其中的一個(gè)必要條件就是要具有聯(lián)網(wǎng)通信接口 ,串行接口的出現(xiàn)正好解決了這個(gè)問題,串行接口是指數(shù)據(jù)一位一位地順序傳送,其特點(diǎn)是通信線路簡單,只要一對(duì)傳輸線就可以實(shí)現(xiàn)雙向通信,從而大大降低了成本,特別適用于遠(yuǎn)距離通信,具有串行接口的流量計(jì)采用串行通訊的方式將信息逐位按順序的傳送,傳送距離可以從幾米到幾千米。
串行接口按電氣標(biāo)準(zhǔn)及協(xié)議來分包括 RS-232、RS-422、RS-485。RS-232 是為點(diǎn)對(duì)點(diǎn)通訊而設(shè)計(jì)的,傳送距離***大為約 15 米,***高速率為 20kb/s,適合本地設(shè)備之間的通信。
RS-422 定義了接口電路的特性,總線上***多可接 10 個(gè)節(jié)點(diǎn),***大傳輸距離為 1219 米,***大傳輸速率為 10Mb/s。RS-485是從 RS-422 基礎(chǔ)上發(fā)展而來的升級(jí)版,RS-485 總線上***多可接到 32 個(gè)設(shè)備,共模輸出電壓提高到- 7V 至+12V 之說,提供了很大的便利與節(jié)省了大量的人力物力。傳統(tǒng)方法上,對(duì)于數(shù)據(jù)的統(tǒng)計(jì),特別是對(duì)于很多數(shù)據(jù)的***大傳輸速率為 10Mb/s。
2 .RS485 通訊程序的設(shè)計(jì)與實(shí)現(xiàn)
RS485 總線是基于物理接口和屏蔽雙絞線傳輸介質(zhì),只是物理介質(zhì)層,由于其電路特性專門針對(duì)一主多從協(xié)議的,上面可以運(yùn)行很多通訊協(xié)議,如何根據(jù)流量計(jì)內(nèi)部 RS485 接口的通訊協(xié)議編寫通訊程序,讀寫流量計(jì)的各種信息,就是關(guān)鍵所在了。本文的研究對(duì)象是采用 Kojima 公司的 DF 系列氣體質(zhì)量流量計(jì)作為 RS485 總線的從站,Schneider 公司的 Proface 觸摸屏作為 RS485 總線主站,在主站中采用腳本語言編寫通訊程序,讀寫從站流量計(jì)的各種信息。本文的研究和程序設(shè)計(jì)思路對(duì)于其余品牌的流量計(jì)和上位控制系統(tǒng)同樣適用。
2.1 從站流量計(jì)通訊規(guī)范設(shè)計(jì)
Kojima 公司的 DF 系列氣體質(zhì)量流量計(jì)的 RS485 通訊規(guī)格是傳輸速度 9600 bps、1 位開始位、數(shù)據(jù)長度 8 位、1 位停止位、無奇偶校驗(yàn)位、采用 3 線半雙工傳輸?shù)膫鬏斚到y(tǒng),支持 32 種指令格式,本文主要編寫的是 32 種指令中的 RCFR(獲取瞬時(shí)流量指令)和 WSFD(設(shè)定流量設(shè)定值指令)兩種指令的通訊程序。
2.1.1 WSFD 設(shè)定流量設(shè)定值指令
WSFD 設(shè)定流量設(shè)定值指令的報(bào)文格式,如表 1 所示。
STX:設(shè)定流量計(jì)通訊指令起始碼,固定為“@”,對(duì)應(yīng) AS-CII 碼 40H,占 1 個(gè)字節(jié)。
Communication ID:流量計(jì)從站地址,占用 3 個(gè)字節(jié),范圍是 001 ~ 099。
Command:指定通訊指令為 WSFD(設(shè)定流量設(shè)定值指令),占 4 個(gè)字節(jié)。
Data:4 位十進(jìn)制數(shù)的流量設(shè)定值,范圍 0000 ~***大流量,占 4 個(gè)字節(jié)。
Check sum:校驗(yàn)碼,計(jì)算方法是“STX + Communication ID + Command + Data”的低兩位 16 進(jìn)制數(shù),占 2 個(gè)字節(jié)。
ETX:通訊指令結(jié)束碼,固定為“CR”,對(duì)應(yīng) ASCII 碼 0DH,占 1 個(gè)字節(jié)。
發(fā)出 WSFD 指令后,返回的報(bào)文格式,如表 2 所示。STX:返回報(bào)文起始碼,固定為“%”,對(duì)應(yīng) ASCII 碼 25H,占 1 個(gè)字節(jié)。
Communication ID:流量計(jì)從站地址,占用 3 個(gè)字節(jié),范圍是 001 ~ 099。
Command:指定通訊指令為 WSFD(設(shè)定流量設(shè)定值指令),占用 4 個(gè)字節(jié)。
Exit code:返回?cái)?shù)據(jù)成功,顯示 OK 的 ASCII 碼;返回?cái)?shù)據(jù)失敗,顯示 NG 的 ASCII 碼,占用 2 個(gè)字節(jié)。
Check sum:校驗(yàn)碼,計(jì)算方法是“STX + Communication ID + Command + Exit code”的低兩位 16 進(jìn)制數(shù),占 2 個(gè)字節(jié)。
ETX:通訊指令結(jié)束碼,固定為“CR”,對(duì)應(yīng) ASCII 碼 0DH,
占 1 個(gè)字節(jié)。
2.1.2 RCFR 獲取瞬時(shí)流量指令
RCFR 獲取瞬時(shí)流量指令的報(bào)文格式,如表 3 所示:
STX:設(shè)定流量計(jì)通訊指令起始碼,固定為“@”,對(duì)應(yīng) AS-CII 碼 40H,占 1 個(gè)字節(jié)。
Communication ID:流量計(jì)從站地址,占用 3 個(gè)字節(jié),范圍是 001 ~ 099。
Command:指定通訊指令為 RCFR(獲取瞬時(shí)流量指令),占用 4 個(gè)字節(jié)。
Check sum:校驗(yàn)碼,計(jì)算方法是“STX + Communication ID + Command”的低兩位 16 進(jìn)制數(shù),占 2 個(gè)字節(jié)。
ETX:通訊指令結(jié)束碼,固定為“CR”,對(duì)應(yīng) ASCII 碼 0DH,占 1 個(gè)字節(jié)。
發(fā)出 RCFR 指令后,返回的瞬時(shí)流量值的報(bào)文格式,如表 4 所示。
STX:返回報(bào)文起始碼,固定為“%”,對(duì)應(yīng) ASCII 碼 25H,
占 1 個(gè)字節(jié)。
Communication ID:流量計(jì)從站地址,占用 3 個(gè)字節(jié),范圍
是 001 ~ 099。
Command:指定通訊指令為 RCFR(獲取瞬時(shí)流量指令),占用 4 個(gè)字節(jié)。
Exit code:返回?cái)?shù)據(jù)成功,顯示 OK 的 ASCII 碼;返回?cái)?shù)據(jù)失敗,顯示 NG 的 ASCII 碼,占用 2 個(gè)字節(jié)。
Data:返回 4 位十進(jìn)制數(shù)的瞬時(shí)流量值,范圍 0001 ~9999,占用 4 個(gè)字節(jié)。
Check sum:校驗(yàn)碼,計(jì)算方法是“STX + Communication ID + Command + Exit code + Data”的低兩位 16 進(jìn)制數(shù),占 2 個(gè)字節(jié)。
ETX:通訊指令結(jié)束碼,固定為“CR”,對(duì)應(yīng) ASCII 碼 0DH,占 1 個(gè)字節(jié)。
2.2 主站通訊程序?qū)崿F(xiàn)
主站采用 Schneider 公司的 Proface 觸摸屏,在主站中采用腳本語言編寫通訊程序,實(shí)現(xiàn) RCFR(獲取瞬時(shí)流量指令)和WSFD(設(shè)定流量設(shè)定值指令),從而可以讀寫從站流量計(jì)的流量信息。
2.2.1 主站通訊參數(shù)設(shè)定
在主站(Schneider 公司的 Proface 觸摸屏)中對(duì)應(yīng)設(shè)定 Ko-jima 公司的 DF 系列氣體質(zhì)量流量計(jì)的 RS485 通訊規(guī)格傳輸速度 9600 bps、1 位開始位、數(shù)據(jù)長度 8 位、1 位停止位、無奇偶校驗(yàn)位,如圖 1 所示。
2.2.2 主站串口操作指令
主站 Schneider 公司的 Proface 觸摸屏支持類 C 語言格式的腳本編程語言,具有完整的串口操作指令,引用 IO_WRITE和 IO_READ 兩個(gè)串口操作指令函數(shù)[5],編寫通訊程序,完成對(duì)從站流量計(jì)流量信息的讀寫。
IO_WRITE 發(fā)送指令,功能是將數(shù)據(jù)寫至流量計(jì)串口,格式如下。
IO_WRITE ([p:EXT_SIO],數(shù)據(jù)存儲(chǔ)地址,發(fā)送字節(jié)數(shù))IO_READ 接收指令,功能是從流量計(jì)串口中讀取已接收的數(shù)據(jù),格式如下。
IO_READ ([p:EXT_SIO],數(shù)據(jù)存儲(chǔ)地址,接收字節(jié)數(shù))
2.2.3 主站通訊程序編寫
本文給出如下編寫的 RCFR 和 WSFD 指令的通訊程序腳本,實(shí)現(xiàn)在主站觸摸屏上設(shè)定從站流量計(jì)的設(shè)定值,并實(shí)時(shí)讀取從站流量計(jì)的瞬時(shí)流量值的功能。
if([b:[#INTERNAL]USR0000000])
{ //檢測(cè)位開關(guān)發(fā)送設(shè)定值指令是否為 ON;如果為 ON,清除位開關(guān)發(fā)送設(shè)定值,使其為 OFFclear([b:[#INTERNAL]USR0000000])// 發(fā)送流量設(shè)定值,發(fā)送指令: @ 0 0 1 W S F D 設(shè)定值校驗(yàn)碼 CR
// (對(duì)應(yīng) ASCII 碼) 40H 30H 30H 31H 57H 53H 46H 44H 設(shè)定值 校驗(yàn)碼 ODH
//校驗(yàn)碼計(jì)算 校驗(yàn)和 & 0x00ff 得到低 8 位
[t:0010]=0x40+0x30+0x30+0x31+0x57+0x53+0x46+0x44+[w:[#INTERNAL]USR00002]
[t:0011]=[t:0010]&0x00ff
[w:[#INTERNAL]USR00003]=0x40
[w:[#INTERNAL]USR00004]=0x30
[w:[#INTERNAL]USR00005]=0x30
[w:[#INTERNAL]USR00006]=0x31
[w:[#INTERNAL]USR00007]=0x57
[w:[#INTERNAL]USR00008]=0x53
[w:[#INTERNAL]USR00009]=0x46
[w:[#INTERNAL]USR00010]=0x44
[w:[#INTERNAL]USR00011]=[w:[#INTERNAL]USR00002]//畫面輸入的設(shè)定值
[w:[#INTERNAL]USR00012]=[t:0011]
[w:[#INTERNAL]USR00013]=0x0D
//從數(shù)據(jù)緩沖器到內(nèi)部寄存器函數(shù)
//_dlcopy ([復(fù)制目標(biāo)地址]、復(fù)制源數(shù)據(jù)緩沖器、復(fù)制源偏移值、復(fù)制字符數(shù))
_ldcopy(databuf0, [w:[#INTERNAL]USR00003], 11)
//將數(shù)據(jù)寫至流量計(jì)串口時(shí),采用發(fā)送指令
IO_WRITE_EX([p:EXT_SIO], databuf0, 11)}
Endif
//接收流量瞬時(shí)值
//(1)發(fā)出讀瞬時(shí)流量指令 @ 0 0 1 R C F R 校驗(yàn)碼 CR// (對(duì)應(yīng) ASCII 碼) 40H 30H 30H 31H 52H 43H 46H 52H 校驗(yàn)碼 0DH
//校驗(yàn)碼計(jì)算,校驗(yàn)和 & 0x00ff 得到低 8 位
[t:0012]=0x40+0x30+0x30+0x31+0x52+0x43+0x46+0x52
[t:0013]=[t:0010]&0x00ff
[w:[#INTERNAL]USR00014]=0x40
[w:[#INTERNAL]USR00015]=0x30
[w:[#INTERNAL]USR00016]=0x30
[w:[#INTERNAL]USR00017]=0x31
[w:[#INTERNAL]USR00018]=0x52
[w:[#INTERNAL]USR00019]=0x43
[w:[#INTERNAL]USR00020]=0x46
[w:[#INTERNAL]USR00021]=0x52
[w:[#INTERNAL]USR00022]=[t:0013]
[w:[#INTERNAL]USR00023]=0x0D
_ldcopy(databuf1, [w:[#INTERNAL]USR00014], 10)IO_WRITE_EX([p:EXT_SIO], databuf1, 10)
//(2)接收返回的瞬時(shí)流量值
// 指令:% 0 0 1 R C F R O K 瞬時(shí)流量值 校驗(yàn)碼 CR
// (對(duì)應(yīng) ASCII 碼): 25H 30H 30H 31H 52H 43H 46H 52H
4FH 4BH 瞬時(shí)流量值 校驗(yàn)碼 ODH
//當(dāng)從流量計(jì)串口中讀取已接收數(shù)據(jù)時(shí),采用接收指令I(lǐng)O_READ_EX([p:EXT_SIO], databuf2, 13)
_dlcopy([w:[#INTERNAL]USR00024], databuf2, 0, 13)// [w:[#INTERNAL]USR00034] 里面 存儲(chǔ)的是 返回的瞬時(shí)流量值。
Kojima 公司的 DF 系列氣體質(zhì)量流量計(jì)一共支持 32 種通訊指令,每種指令的報(bào)文格式不同,根據(jù)它們的報(bào)文格式,參照如上 RCFR 和 WSFD 指令的通訊程序,可以在主站中實(shí)現(xiàn)全部 32 中通訊指令,從而可以讀寫流量計(jì)中各種各樣的數(shù)據(jù)信息。
3.結(jié)論
RS485 是工業(yè)數(shù)據(jù)總線的一種,是自動(dòng)化領(lǐng)域中底層數(shù)據(jù)通信網(wǎng)絡(luò),流量計(jì)具有 RS485 串口通訊使得上位系統(tǒng)可以方便的編寫通訊程序,用數(shù)字通信替代了傳統(tǒng)的模擬信號(hào)及普通開關(guān)量信號(hào)的傳輸,高效便捷的連接了智能現(xiàn)場(chǎng)設(shè)備和自動(dòng)化系統(tǒng),將流量計(jì)量和智能制造緊密的連接了起來。