face的GP2000系列(除GP2301,2501,2401H和2301H)觸摸屏有一個擴展串行接口(COM2) ,這個擴展串口通過D腳本程序的編寫可以方便的實現(xiàn)GP與一些特殊設備間的通訊(RS232) 。 下面是一個擴展串口通訊的實例。這里我們進行通訊的設備是GP-2500S與CHK-8D型電池巡檢儀(以下簡稱巡檢儀)。 1.通訊要求 我們的目的是通過觸摸屏讀出巡檢儀檢測到的電池電壓信息。 2.通訊設置 巡檢儀有一個RS-485口,支持多種波特率。它的通訊格式為異步,一位起始碼,八位數(shù)據(jù)位,一位停止位,無校驗,半雙工方式。首先,我們在GP的擴展SIO設置中選擇和巡檢儀的通訊設置一樣的參數(shù)。設置方法如下:同時按住GP的任意三個角,進入OFFLINE狀態(tài),依次進入INITIALIZE,SETUP I/O,SETUP SIO,這里有GP的通訊設置,把它們設置成與巡檢儀相應的格式即可。 3.報文交換格式(代碼各項均為1字節(jié)HEX碼) 上位機下發(fā)命令: EB 90 EB 90 巡檢儀機號 上位機號 03 00 C1 00 00 90 EB 巡檢儀回復: EB 90 EB 90 上位機號 巡檢儀機號 報文長度(L)報文長度(H) C2 電池組電壓(1)電池組電壓(2)1#電池電壓(1) 1#電池電壓(2) 2#電池電壓(1)2#電池電壓(2) …………N#電池電壓(1) N#電池電壓(2)代碼和(L) 代碼和(H) 90 EB 巡檢儀機號: 即機器的地址編號,在CHK-8D型巡檢儀上設定,我們這里把它設為1號 電池的節(jié)數(shù)N: 根據(jù)實際的電池節(jié)數(shù),在CHK-8D型巡檢儀上設定,我們這里設為103節(jié) 4.D腳本語句說明 4.1 接收功能 下面的命令被用于讀從擴展口接收到的數(shù)據(jù) 格式 IO_READ([p:EXT_SIO], LS Storage Address, Transer Byte) 例子 IO_READ([p:EXT_SIO],[w:LS0100], 10) [p:EXT_SIO]表示接收數(shù)據(jù) [w:LS0100]這是存放接收數(shù)據(jù)的起始地址,接收數(shù)據(jù)的大小存放在LS0100,接收的數(shù)據(jù)從LS0101開始存,10表示有10個字節(jié)存放在LS區(qū)(最大傳送字節(jié)是6095)。 4.2 發(fā)送功能 下面的命令表示把要發(fā)送的數(shù)據(jù)寫到擴展口 格式 IO_WRITE_EX([p:EXT_SIO], LS Storage Address, Transer Byte) 例子 IO_WRITE_EX([p:EXT_SIO], [w:LS0100], 10) [w:LS0100]是要發(fā)送的數(shù)據(jù)開始地址,10表示要發(fā)送10個數(shù)據(jù)。 *注意:每一個傳送的是字節(jié),也就是說傳送的是每一個字的低八位,同樣接收的數(shù)據(jù)也是一樣的。 4.3 控制 增加控制變量去清除發(fā)送和接收緩存器以及錯誤狀態(tài),這個變量的屬性是只能寫的。 格式 位 [c:EXT_SIO_CTRL**] **:00到15 字 [c:EXT_SIO_CTRL] 例如:控制字的內(nèi)容 位 [c:EXT_SIO_CTRL00]=1 字 [c:EXT_SIO_CTRL]=0x0007 當控制字的內(nèi)容被確定以后,它的處理過程按照這樣的次序來完成的,先清除錯誤狀態(tài),然后清除接收緩存,再清除發(fā)送緩存。
4.4 狀態(tài) 增加[EXT_eSIO_ISTAT]作為狀態(tài)變量,這個變量的屬性是只讀的。 格式 位 [s:EXT_SIO_STAT**] **:00到15 字 [s:EXT_SIO_STAT] 例如 位 if([s:EXT_SIO_STAT00]==1) 字 if(([s:EXT_SIO_STAT]&0x0000)<>0) 字的內(nèi)容描述如下
4.5 接收數(shù)據(jù)的大小 這個屬性也是只讀的。 格式 [r:EXT_SIO_RECV] 例如 if([r:EXT_SIO_RECV]>=10) 5.通訊實現(xiàn) 5.1 硬件連接 由于巡檢儀的通訊口是RS485,這里我們需要一個485/232的轉換器。9針的COM2口的管腳定義如下:
5.2 軟件設計 首先,新建一個PRO/PB工程,PLC類型選擇Memory Link SIO type, 協(xié)議選擇Extend SIO Script,如下圖所示

然后新建一個畫面,放置一些鍵盤輸入顯示,地址設為收到的電池電壓的地址。我們計算了總接受報文長度為221個字節(jié),準備放置到7000到7220的地址中。GP發(fā)送報文總長度為13個字節(jié),準備放置在6000到6012的地址中 。 這些準備完成后,下面就可以開始D腳本編程了。如下所示: 第一個程序:每30秒發(fā)送一次報文給巡檢儀?! ?

第二個程序:初始化

其中[s:EXT_SIO_STAT14]為擴展SIO狀態(tài)字的第14位,當其值為1時表示擴展SIO協(xié)議準備好了。[c:EXT_SIO_CTRL]為擴展SIO控制字,它的00,01,02位為1時分別清發(fā)送緩存,接收緩存,錯誤信息。[b:020000]到[b:020004]為通訊步驟,當初始化完成觸發(fā)[b:020001],執(zhí)行下一步。 第三個程序:發(fā)送準備

這一步主要是把發(fā)送到巡檢儀的報文儲存到6000開始的13個連續(xù)地址中去。完成后[b:020001]清零,[b:020002]置1,執(zhí)行下一步。 第四個程序:發(fā)送子程序

ldcopy(databuf0, [w:6000], 13)是把6000開始的13個地址中的數(shù)據(jù)放到databuf0這個串中。 [s:EXT_SIO_STAT00]等于1表示發(fā)送緩存區(qū)為空。 IO_WRITE_EX([p:EXT_SIO], databuf0, 13)為把databuf0的開始13個數(shù)據(jù)通過擴展口發(fā)送。 第五個程序:接收子程序

[s:EXT_SIO_STAT02]等于1表示接收數(shù)據(jù)準備完畢。 [r:EXT_SIO_RECV ]為接收數(shù)據(jù)長度,為了保證完整接收巡檢儀傳過來的報文,我們首先判斷接收數(shù)據(jù)的長度是否大于221。 IO READ ( [p:EXT_SIO ], databuf1, 221)表示接收221個字節(jié)的數(shù)據(jù)放到databuf1中。 _dlcopy ([w:7000], databuf1, 0, 221)是將databuf1中0位開始的221個字節(jié)數(shù)據(jù)存放到[w:7000]開始的地址中去。 第六個程序:主程序

[b:020002]等于1時開始發(fā)送報文,發(fā)送完畢[b:020003]置1開始接收數(shù)據(jù)。接收完判斷數(shù)據(jù)是否正確,正確的話[b:020004]置1,一次通訊完成。不正確的話[b:020003]重新置1,再收。 這樣一個擴展串口通訊程序就完成了,此后再對接收的數(shù)據(jù)進行一些處理,即可得到我們所需的數(shù)據(jù)了。這是擴展口通訊的一個實際應用,大家可以參照此中的參數(shù)設置和思路,編寫自己的擴展口通訊程序?! ?