|
很多時候,工業控製或者產品設計方麵受到PLC這(zhe)種(zhong)功(gong)能(neng)確(que)定(ding),擴(kuo)展(zhan)麻(ma)煩(fan),成(cheng)本(ben)昂(ang)貴(gui)等(deng)方(fang)麵(mian)的(de)製(zhi)約(yue)因(yin)素(su),需(xu)要(yao)獨(du)立(li)開(kai)發(fa)一(yi)種(zhong)特(te)殊(shu)功(gong)能(neng),但(dan)是(shi)又(you)需(xu)要(yao)連(lian)接(jie)觸(chu)摸(mo)屏(ping)通(tong)訊(xun),工(gong)程(cheng)師(shi)在(zai)這(zhe)個(ge)方(fang)麵(mian)往(wang)往(wang)需(xu)要(yao)花(hua)費(fei)很(hen)大(da)功(gong)夫(fu),現(xian)在(zai)我(wo)要(yao)幫(bang)大(da)家(jia)解(jie)決(jue)的(de)問(wen)題(ti)就(jiu)是(shi) 單片機與人機界麵觸摸屏通訊的最簡單,最有效的 2種方法,其實就是分為2種通訊協議,即工業標準的 Modbus RTU協議和工程師自己定義的 自由協議。
benshilicaiyongqizhongyikuanrenjijiemianzuoweicankao,youguangzhousanqingchuanggongzidonghuakejiyouxiangongsitigongjishuzhichihegongbudanpianjiyuandaima,jiashanggongsiderenjijiemianzhichiziyouxieyidengdengxiantianyoushi,kaifagongchengfangbiankuaijieyouxiao。

方案比較:
方案一 modbus―rtu協議:
優點:工業標準通訊協議,具有通用性,,傳輸數據量大
缺點:需要時間去了解協議的格式和以及按照規定編寫通訊程序(我們提供MODBUS-RTU源代碼,客戶直接移植就可以,不必費心)
方案二 自由協議:
優點:數據格式客戶自己定義,靈活多變,定製性強,可以模擬任何已知報文的通訊協議,單片機工程師比較容易接受,容易上手
缺點:傳輸數據量不大,通用性不強,移植不方便
工程師可以根據以上兩種通訊協議的優缺點來選擇理想的方案;
現在我們重點介紹工業觸摸屏人機界麵的自由通訊協議。
首先下載工業觸摸屏人機界麵的組態軟件,下載安裝好軟件之後,新建一個工程文件,

設備對應的是公司出產產品型號,通道是指設備代號,0是代表觸摸屏本身,點擊新增,出現如下設置:

接口選擇可以為串口,CAN Bus和內部(共享內存)三種,這邊我們選擇串口,因為人機界麵有1-2個串口,這些串口既可以做RS232,又可以做RS485,根據客戶工程需求接線,通訊協議對應的就是單片機工程師需要用的協議,其中有Modbus rtu協議,自由協議Free Protocol,當然還包括西門子200,台達PLC,歐姆龍,三菱等協議,這裏我們選擇COM1自由協議Free Protocol,通訊速率57600,數據位8,1位停止位,偶校驗,如下:

點擊確定進入用戶工程師的信息填寫欄:

也可以直接點擊完成進入畫麵編輯窗口:

到這裏,我們就可以像拚圖遊戲一樣拚自己喜歡的界麵了,這邊,我做一個最簡單的工程如下用位按鈕開關控製單片機的LED燈,采集單片機的數據(AD采集)顯示在組態軟件的數碼管(可以電腦串口連接單片機在線模擬,方便開發工程)

然後我們要把位按鈕的屬性綁定到人機界麵的係統寄存器,然後再用人機界麵內置的宏指令通訊函數output函數把寄存器數據傳輸給單片機,讓單片機接收這個指令之後進行動作控製,方法實現如下:

我們把位按鈕1綁定到人機界麵係統寄存器LB的第0個裏麵,再用一個LED指示燈觀察按鈕的狀態(綁定係統寄存器LB0)

對於數碼管顯示,屬性設置原來差不多,但是需要用input函數將從單片機采集的數據存儲到人機界麵係統寄存器,再通過宏指令函數映射顯示出來,方法如下:

我們將通道一綁定到係統寄存器LD的第1個寄存器,LD是數據寄存器,LB是布爾量的位寄存器,注意兩種寄存器的區別。
接下來我們要用到人機界麵的組態軟件內置的通訊函數,數學運算函數和其他函數了。由“設置”菜單那裏進入到宏指令編輯器進入宏指令編輯:

點擊新增,我們寫一個宏指令通訊函數,向單片機發送控製指令和接受數據:

具體編程如下:
宏指令macro_1:
void Macro_main( )
{
unsigned char dat[4];
unsigned short dat1[4];
int re_dat;
Input( 1, dat, 4, re_dat);
/*如果不明白函數使用,可以點擊函數向導按鈕查找函數使用說明

【描述】
第一個參數channel表示通道,如果通道為com1,則channel=1;如果通道為com2,則channel=2,數據類型為int。
第二個參數pString表示寫入通道的字符串的地址,數據類型為unsigned char *。
第三個參數count表示字符串中的字符個數,數據類型為int。
第四個參數result表示Output函數運行後返回的結果,如果result大於0,則表示讀寫有效,數據類型為int。
注意:此函數隻能用在freeprotocol(自由協議通道)中。
【用法】
Input(channel,pString,count,result);
【舉例】
char srt[9];
int result;
Input(1,str[0],9,result);
*/
dat1[0]=dat[0];
dat1[1]=dat[1];
dat1[2]=dat[2];
dat1[3]=dat[3];
SetWordData(0,1,1,16, dat1[0]);
SetWordData(0,1,2,16, dat1[1]);
SetWordData(0,1,3,16, dat1[2]);
SetWordData(0,1,4,16, dat1[3]);
}
macro_2:用於發送指令到單片機進行控製,主要用到output函數
static unsigned char key[3];
void Macro_main( )
{
bool key_data[16];
int re_dat;
GetByteData(0, 1,0, 9, 0,key_data);
key[0] = key_data[7]<<7 | key_data[6]<<6 | key_data[5]<<5 | key_data[4]<<4 | key_data[3]<<3 | key_data[2]<<2 | key_data[1]<<1 | key_data[0];
//key[1]=key_data[15]<<7 | key_data[14]<<6 | key_data[13]<<5 | key_data[12]<<4 | key_data[11]<<3 | key_data[10]<<2 | key_data[9]<<1 | key_data[8];
key[1]=key_data[8];
Output( 1, key, 2, re_dat);
}
對應單片機下位機的編程,作為單片機開發者應該都知道如何編程了.
|