1 引言
可編程控製器是一種數字運算操作的電子係統,專(zhuan) 為(wei) 在工業(ye) 環境下應用而設計。它采用了可編程序的存儲(chu) 器,用於(yu) 其內(nei) 部存儲(chu) 程序,執行邏輯運算、順序控製、定時、計數和算術操作等麵向用戶的指令,並通過數字式或模擬式輸入輸出控製各種類型的機械的生產(chan) 過程。可編程控製器及其有關(guan) 外部設備,都按易於(yu) 與(yu) 工業(ye) 控製係統聯成一個(ge) 整體(ti) 、易於(yu) 擴充其功能的原則設計。早期的plc以數字量的順序控製為(wei) 主,提供了簡單的慢速的通信功能(隻支持rs232、rs485、多采用modbus協議),現在的plc不僅(jin) 具有邏輯運算、順序控製、定時、計數和算術操作,而且還具有a/d、d/a轉換,數值計算和數據處理等功能。它既可以對開關(guan) 量進行控製,也可以對模擬量進行控製,隨著plc功能不斷擴充,它還有通訊聯網功能。本文就是基於(yu) 鬆下電工的專(zhuan) 門通信協議(mewtocol),用vc++開發的上位機與(yu) plc間的通信。
2 鬆下電工的專(zhuan) 用通信協議mewtocol-com
目前,隨著plc的快速發展,越來越多的plc生產(chan) 廠商開發了它與(yu) 計算機的通信功能(主要是利用計算機串口進行通信),本文是以鬆下fp係列plc為(wei) 例,作詳細闡述。在一台計算機於(yu) plc之間的通信中,通信由計算機發動,把命令幀發向plc,plc將以響應幀作應答,並執行相應的動作。
(1) 命令幀格式

其中: %:mewtocol-com的命令幀開始標誌(ascii碼為(wei) 25h)。
h,l:站地址的高位和低位。
#:站號特征碼(ascii碼為(wei) 23h)。
發送文本:由命令碼和數據組成,其主要命令碼如表1所示。
bcc:校驗碼,采用異或校驗碼,bcc為(wei) 8位。
(2) 響應幀格式
當主站發來命令幀之後,從(cong) 站將以響應幀作應答。響應幀分為(wei) 2種,若主站命令幀正確無誤,則用“正確響應幀”作應答;如果主站命令幀有錯誤則用“錯誤響應幀”作應答。這兩(liang) 種應幀格式下。正確響應幀的格式
![]()
其中 %,h,l,bcc,cr含義(yi) 與(yu) 命令幀相同。
$:正確響應的標誌(acsii碼為(wei) 24h)。
響應文本:應當按照命令幀要求及協議規定組織。
錯誤響應幀的格式
![]()
其中%,h,l,bcc,cr含義(yi) 與(yu) 命令幀相同。
!:錯誤響應幀的標誌(acsii碼為(wei) 21h)。
錯誤代碼:對於(yu) 命令及數據傳(chuan) 送中的各種錯誤均規定為(wei) 代碼以識別。
(3) 命令碼: mewtocol-com協議的命令碼匯總如表1所示

(4)常用的命令與(yu) 格式
a)單接點的讀

錯誤響應幀與(yu) 單接點的相同。
3 用visual c++6.0編寫(xie) 串行通信程序
(1) mscomm控件
串行通訊編程基本過程:設置初始化並打開串行口—配置串口—雙向傳(chuan) 輸數據—校驗—釋放串口。本文的上位機通信程序是用visualc++6.0編寫(xie) 的,主要是利用vc++中的一個(ge) 通信控件mscomm來現的。
該控件屏蔽了通訊過程中的底層操作,程序員應用時隻需設置,監控mscomm控件的屬性和事件即可完成對串口的初始化和數據的輸入輸出工作。mscomm控件的主要屬性如下:
* commport:設置並返回通訊端口號,設計時端口號可設為(wei) 1到16的任何數(默認值為(wei) 1)。如:setcommport(1);即設置當前通訊端口為(wei) com1。
* settings:設置並返回波特率,奇偶校驗,數據位長度,停止位長度。
如:setsettings(lpctstr string);string是一個(ge) 包括四部分的字符串:第一部分:波特率;
第二部分:奇偶校驗,n表示不校驗,e表示偶校驗,o表示奇校驗,s表示空格校驗,m表示符號校驗;
第三部分:數據為(wei) 長度,其可選值為(wei) 4,5,6,7,8;
第四部分:停止位長度,其可選為(wei) 1,1.5,2。 settings屬性的缺省值為(wei) “9600,n,8,1”。
* portopen:用於(yu) 打開和關(guan) 閉端口。setportopen(bool bnewvalue);
當bnewvalue為(wei) true時打開端口,當為(wei) false時關(guan) 閉端口。
* input:從(cong) 接受緩衝(chong) 區返回和刪除字符,該屬性在運行時為(wei) 隻讀。getinput();
* output:向緩衝(chong) 區寫(xie) 數據,要傳(chuan) 送的數據可以是文本數據或是二進製數據。
*commevent:返回最近的通訊事件或錯誤。隻要有通訊錯誤或事件發生時都會(hui) 產(chan) 生oncomm事件,commevent屬性中存有錯誤或事件的數值代碼。
getcommevent();
4 程序框架的生成及控件屬性的配置
首先利用mfcappwizard(exe)建立一個(ge) 基於(yu) 對話框,支持activex控件,命名為(wei) transcomn的應用程序。然後在對話框中加入一些控件,其中那個(ge) mscomm控件(電話形狀的控件)必須是在係統中注冊(ce) 過的microsoft communications control,由它進行通訊時首先得設置它的一些屬性,這些屬性既可以在控件屬性對話框中設置也可以在程序中設置,本文用後一種方法,在程序中對mscomm控件屬性設置。最後用classwizard為(wei) 控件添加變量和響應函數如表2

5 程序編寫(xie)
// transcommdlg.cpp : implementation file
bool ctranscommdlg::oninitdialog()
{
//初始化通訊端口,波特率為(wei) 9600,奇校驗,8位數據位,1位校驗位,選擇com1口
cdialog::oninitdialog();
m_comm.setcommport(1);
m_comm.setsettings(“9600,o,8,1”);
m_comm.setinputmode(1);
m_comm.setportopen(true);
return true; // return true unless you set the focus to a
control
}
void ctranscommdlg::onsend()
{
updatedata(true);
variant vresponse;
char *str;
//把對話框中有用戶輸入的命令字符串cstring
//m_commandstring,由串口發出
m_comm.setoutput(colevariant(m_commandstring));
sleep(50);//延時50毫秒,一個(ge) 保證有足夠的時間 //讓plc響應命令
//讀取串口輸入緩衝(chong) 區中的字符個(ge) 數,如大於(yu) 0表 //示串口接受到plc的響應幀,然後//進行處理
int k=m_comm.getinbuffercount();
if(k》0)
{
//把plc發送來的響應幀轉換為(wei) 字符 //串,並在對話框的響應文本框中顯示
vresponse=m_comm.getinput();
str=(char *)(unsigned char*)vresponse.parray-》pvdata;
str[k]='';
}
}
轉載請注明出處。







相關文章
熱門資訊
精彩導讀



















關注我們

