引言
目前抄瑟,隨著plc的快速發(fā)展凡泣,越來越多的plc生產廠商開發(fā)了它與計算機的通信功能(主要是利用計算機串口進行通信),本文是以松下fp系列plc為例拯奔,作詳細闡述谭扑。在一臺計算機于plc之間的通信中,通信由計算機發(fā)動,把命令幀發(fā)向plc优诵,plc將以響應幀作應答吟筷,并執(zhí)行相應的動作。
1 簡介
可編程控制器是一種數字運算操作的電子系統药阔,專為在工業(yè)環(huán)境下應用而設計冲驶。它采用了可編程序的存儲器,用于其內部存儲程序预铁,執(zhí)行邏輯運算嚣赤、順序控制公掰、定時簸翠、計數和算術操作等面向用戶的指令,并通過數字式或模擬式輸入輸出控制各種類型的機械的生產過程虏丹〗希可編程控制器及其有關外部設備,都按易于與工業(yè)控制系統聯成一個整體庵佣、易于擴充其功能的原則設計歉胶。早期的plc以數字量的順序控制為主,提供了簡單的慢速的通信功能(只支持rs232巴粪、rs485通今、多采用modbus協議),現在的plc不僅具有邏輯運算肛根、順序控制辫塌、定時、計數和算術操作派哲,而且還具有a/d臼氨、d/a轉換,數值計算和數據處理等功能芭届。它既可以對開關量進行控制储矩,也可以對模擬量進行控制,隨著plc功能不斷擴充褂乍,它還有通訊聯網功能持隧。本文就是基于松下電工的專門通信協議(mewtocol),用vc++開發(fā)的上位機與plc間的通信粟五。
2 松下電工的專用通信協議mewtocol-com
目前腕浴,隨著plc的快速發(fā)展,越來越多的plc生產廠商開發(fā)了它與計算機的通信功能(主要是利用計算機串口進行通信)锤勉,本文是以松下fp系列plc為例跋共,作詳細闡述。在一臺計算機于plc之間的通信中,通信由計算機發(fā)動絮很,把命令幀發(fā)向plc捡奖,plc將以響應幀作應答,并執(zhí)行相應的動作戚绪。
∏显椤(1) 命令幀格式
其中: %:mewtocol-com的命令幀開始標志(ascii碼為25h)。
h曙辛,l:站地址的高位和低位夏植。
#:站號特征碼(ascii碼為23h)。
發(fā)送文本:由命令碼和數據組成移鸣,其主要命令碼如表1所示砸捏。
bcc:校驗碼,采用異或校驗碼隙赁,bcc為8位垦藏。
(2) 響應幀格式
當主站發(fā)來命令幀之后伞访,從站將以響應幀作應答掂骏。響應幀分為2種,若主站命令幀正確無誤厚掷,則用“正確響應幀”作應答;如果主站命令幀有錯誤則用“錯誤響應幀”作應答弟灼。這兩種應幀格式下。正確響應幀的格式
其中 %冒黑,h田绑,l,bcc薛闪,cr含義與命令幀相同辛馆。
$:正確響應的標志(acsii碼為24h)。
響應文本:應當按照命令幀要求及協議規(guī)定組織豁延。
錯誤響應幀的格式
其中%昙篙,h,l写掖,bcc揖岔,cr含義與命令幀相同。
〗挠佟N募浴:錯誤響應幀的標志(acsii碼為21h)。
錯誤代碼:對于命令及數據傳送中的各種錯誤均規(guī)定為代碼以識別或侥。
[DividePage:NextPage]
〕男怠(3) 命令碼: mewtocol-com協議的命令碼匯總如表1所示
(4)常用的命令與格式
a)單接點的讀
錯誤響應幀與單接點的相同。
[DividePage:NextPage]
3 用visual c++6.0編寫串行通信程序
≌搛(1) mscomm控件
串行通訊編程基本過程:設置初始化并打開串行口—配置串口—雙向傳輸數據—校驗—釋放串口隔抒。本文的上位機通信程序是用visualc++6.0編寫的,主要是利用vc++中的一個通信控件mscomm來現的淋憋。
該控件屏蔽了通訊過程中的底層操作课娃,程序員應用時只需設置,監(jiān)控mscomm控件的屬性和事件即可完成對串口的初始化和數據的輸入輸出工作桃序。mscomm控件的主要屬性如下:
* commport:設置并返回通訊端口號杖虾,設計時端口號可設為1到16的任何數(默認值為1)。如:setcommport(1);即設置當前通訊端口為com1媒熊。
* settings:設置并返回波特率奇适,奇偶校驗,數據位長度泛释,停止位長度滤愕。
如:setsettings(lpctstr string);string是一個包括四部分的字符串:第一部分:波特率;
第二部分:奇偶校驗温算,n表示不校驗怜校,e表示偶校驗,o表示奇校驗注竿,s表示空格校驗茄茁,m表示符號校驗;
第三部分:數據為長度,其可選值為4巩割,5裙顽,6,7宣谈,8;
第四部分:停止位長度颅网,其可選為1,1.5蜈率,2翎憨。 settings屬性的缺省值為“9600,n魔辉,8磨再,1”。
* portopen:用于打開和關閉端口阀霸。setportopen(bool bnewvalue);
當bnewvalue為true時打開端口莉遥,當為false時關閉端口。
* input:從接受緩沖區(qū)返回和刪除字符屠剥,該屬性在運行時為只讀灶逃。getinput();
* output:向緩沖區(qū)寫數據,要傳送的數據可以是文本數據或是二進制數據。
*commevent:返回最近的通訊事件或錯誤鬼胸。只要有通訊錯誤或事件發(fā)生時都會產生oncomm事件俭谨,commevent屬性中存有錯誤或事件的數值代碼。
getcommevent();
4 程序框架的生成及控件屬性的配置
首先利用mfcappwizard(exe)建立一個基于對話框径筏,支持activex控件葛假,命名為transcomn的應用程序。然后在對話框中加入一些控件滋恬,其中那個mscomm控件(電話形狀的控件)必須是在系統中注冊過的microsoft communications control聊训,由它進行通訊時首先得設置它的一些屬性,這些屬性既可以在控件屬性對話框中設置也可以在程序中設置恢氯,本文用后一種方法带斑,在程序中對mscomm控件屬性設置。最后用classwizard為控件添加變量和響應函數如表2
[DividePage:NextPage]
5 程序編寫
// transcommdlg.cpp : implementation file
bool ctranscommdlg::oninitdialog()
{
//初始化通訊端口勋拟,波特率為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,由串口發(fā)出
m_comm.setoutput(colevariant(m_commandstring));
sleep(50);//延時50毫秒鲫础,一個保證有足夠的時間 //讓plc響應命令
//讀取串口輸入緩沖區(qū)中的字符個數惕秧,如大于0表 //示串口接受到plc的響應幀,然后//進行處理
int k=m_comm.getinbuffercount();
if(k》0)
{
//把plc發(fā)送來的響應幀轉換為字符 //串嫉卵,并在對話框的響應文本框中顯示
vresponse=m_comm.getinput();
str=(char *)(unsigned char*)vresponse.parray-》pvdata;
str[k]=`
聲明:本網站所收集的部分公開資料來源于互聯網的炫,轉載的目的在于傳遞更多信息及用于網絡分享,并不代表本站贊同其觀點和對其真實性負責移卢,也不構成任何其他建議蜕裳。本站部分作品是由網友自主投稿和發(fā)布、編輯整理上傳椅勿,對此類作品本站僅提供交流平臺艳院,不為其版權負責。如果您發(fā)現網站上所用視頻扯际、圖片颠恬、文字如涉及作品版權問題,請第一時間告知注芯,我們將根據您提供的證明材料確認版權并按國家標準支付稿酬或立即刪除內容憾汛,以保證您的權益党饮!聯系電話:010-58612588 或 Email:editor@mmsonline.com.cn。
- 暫無反饋