本文介紹了通過引進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的監視與控制。