本文介紹了通過引進ActiveX控件MSComm,利用C#語言編程,實現上位機與松下FPG-C24R2 PLC的通信,並給出了工程實例。該方法簡單可靠、便於移植、實用性強,在工業控制中有著廣泛的用途。
關鍵詞:C# 串口通信 實時監控 ActiveX 控件
一、前言
C#語言是.NET技術的核心開發語言,是一種簡單、現代、面向對象和類型安全的編程語言,它實現了快速應用程序開發、跨平台部署,能夠訪問平台固有的資源,支持COM和.NET技術,具有C++語言的強大功能、Java語言的跨平台特性和Delphi語言的方便快捷等眾多的優秀品質。FP∑是日本松下電工株式會社生產的小型可編程序控制器,它有許多規格,具有體積小、重量輕、功能齊全、編程簡單、價格便宜等優點,在工業控制中應用十分廣泛。 本文在Windows xp下用Visual Studio .NET 2003編制一個簡單的通信程序,探討使用MSComm控件對FPG-C24R2 PLC進行串行通信的實現方法。
二、ActiveX控件的引入
你必須有Mscomm.srg, Mscomm32.ocx,Mscomm32.dep文件在你的Windows的System目錄下(注意WinNT下是System32),而且它必須正確的注冊。你可以裝VB6.0來獲得,安裝VB.6.0後,MSComm控件就自動在你的計算機上注冊了,這比手工注冊控件省事多了,Visual.Studio.NET2003在項目工程中(Solution)插入MSComm控件的具體步驟:新建程序後,點擊Tools(工具)-->Add/Remove Toolbox items(添加/移除工具箱項)就打開了Customize Toolbox(自定義工具箱)對話框,再選擇COM Components(COM組件)項,並在出現控件中就可以找到Microsoft Communications Control,version 6.0,選上該項,再點擊"OK",就會在Toolbox控件工具箱中看到MSComm控件的電話圖標了,將它拖到窗體(Form)就可以了。
三、通信協議
FP∑系列PLC通信系統的基本協議是松下電工的專用通信協議-MEWTOCOL;PLC與計算機的通信協議是MEWTOCOL-COM。該協議采用異步通信方式,其波特率有300bps、600bps、1200bps、2400bps、4800bps、9600bps、19200bps、38400bps、57600bps、115200bps等多種可選,且報文長度可變可固定。該方式通信協議如下:
圖1和圖2分別為上位機發送的上位機鏈接命令幀讀DM區數據的命令格式和由PLC返回的應答幀格式。當PLC接收到從上位機發來的ASCII碼命令時自動返回ASCII碼應答。
其中,%為起始符,標記每一幀報文的開始,CR為結束符,標記每一幀報文的結束,BCC為兩字節的幀校驗碼FCS,它是從開始符"%"到正文結束的所有字符的ASCII碼按位異或的結果,HL為PLC的站地址,為兩位16進制數,如00則表示第一台PLC。#、$標注該幀報文為何種類型,上位機的命令幀由不固定的字節數組成,針對不同的識別碼有不同的幀長度。但基本格式大體一致。
四、編程實現
啟動Visual.Studio.NET2003,便可進入Visual C#.NET窗口環境,建立Windows應用程序,建立項目名稱(complc),生成項目窗體(comForm)。在窗體上添加通信按鈕button1、退出按鈕button2,並在工具箱Windows窗體控件欄選中Microsoft Communications Control,version 6.0控件,如圖3。
代碼如下:
using System; using System.Text; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; namespace complc { /// <summary> /// Form1 的摘要說明。 /// </summary> public class comForm : System.Windows.Forms.Form { private AxMSCommLib.AxMSComm axMSComm1; private System.Windows.Forms.TextBox textBox1; private System.Windows.Forms.TextBox textBox2; private System.Windows.Forms.Button button1; private System.Windows.Forms.Button button2; private System.Windows.Forms.Label label1; private System.Windows.Forms.Label label2; /// <summary> /// 必需的設計器變量。 /// </summary> private System.ComponentModel.Container components = null; public comForm() { // Windows 窗體設計器支持所必需的 InitializeComponent(); // TODO: 在 InitializeComponent 調用後添加任何構造函數代碼 } /// <summary> /// 清理所有正在使用的資源。 /// </summary> protected override void Dispose( bool disposing ) { if( disposing ) { if (components != null) { components.Dispose(); } } base.Dispose( disposing ); } /// Windows 窗體設計器生成的代碼 /// <summary> /// 應用程序的主入口點。 /// </summary> [STAThread] static void Main() { Application.Run(new comForm()); } private void button1_Click(object sender, System.EventArgs e) { string ms,rd = "" ; int i; if (!axMSComm1.PortOpen) axMSComm1.PortOpen = true; //打開串口 axMSComm1.InputLen = 0; //清除接收緩沖區 axMSComm1.DTREnable = true; //置DTR有效 axMSComm1.RTSEnable = true; //置RTS有效 axMSComm1.InputMode = MSCommLib.InputModeConstants.comInputModeText; //置為二進制輸入方式 axMSComm1.RThreshold = 1; //設置為接收緩沖區每接收一個字符將引發一次OnComm事件 ms=textBox1.Text; // 輸入如:%01#RDD9001590016或%01#RDD0100601036 axMSComm1.Output = ms+tobcc(ms)+(char)13; // sleep(30); rd += axMSComm1.Input; textBox2.Text = rd; } private void comForm_Load(object sender, System.EventArgs e) { axMSComm1.CommPort = System.Convert.ToInt16(1); //設為com1 axMSComm1.Settings = "9600,n,8,1"; } public string tobcc(string s) //幀校驗函數FCS { int t = 0; char[] chars = s.ToCharArray(); for(int i = 1;i <= s.Length-1;i++) { t = t^=(char)chars[i]; } return t.ToString().Substring(1,2); } private void button2_Click(object sender, System.EventArgs e) { Application.Exit(); } } }五、結論
本文所有程序均在Windows XP, Visual.Studio.NET2003環境中調試通過,該通信方式簡單,通信十分穩定可靠,從而在工業控制的小型監控系統中有著廣闊的應用前景。讀者可在本文的基礎上,參考松下公司的MEWTOCOL-COM協議,便可輕松實現PC與松下FP∑系列PLC的通信,以完成上位機對PLC的監視與控制。