实例介绍
【实例简介】C#直接与PLC通讯无需OPC软件
【实例截图】
【核心代码】
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Net.Sockets; using System.Threading; namespace PLCDEMO { /// <summary> /// PLC软元件的类型 /// </summary> public enum SoftElement { /// <summary> /// X元件 /// </summary> X = 0, /// <summary> /// 元件 /// </summary> Y, /// <summary> /// M元件 /// </summary> M, /// <summary> /// D元件 /// </summary> D }; public partial class Form1 : Form { private TcpClient m_client= new TcpClient(); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { m_client.SendBufferSize = 4096; m_client.SendTimeout = 10000; m_client.ReceiveTimeout = 10000; m_client.ReceiveBufferSize = 4096; string m_strIP = textBox3.Text.ToString(); int m_nPort = Convert.ToInt32( textBox4.Text); m_client.BeginConnect(m_strIP, m_nPort, new AsyncCallback(CallBackMethod), m_client); Thread.Sleep(5); } /// <summary> ///网口打开时通过回调检测是否连接超时 /// </summary> /// <param name="asyncResult"></param> private static void CallBackMethod(IAsyncResult asyncResult) { try { TcpClient tcpClient = asyncResult.AsyncState as TcpClient; if (tcpClient.Client != null) { tcpClient.EndConnect(asyncResult); } } catch { } } /// <summary> ///向网口写入数据 /// </summary> /// <param name="sendBytes"></param> /// <param name="nLen"></param> /// <returns></returns> public bool WriteData(byte[] sendBytes, int nLen) { if (m_client.Connected) { NetworkStream netStream = m_client.GetStream(); if (netStream.CanWrite) { netStream.Write(sendBytes, 0, nLen); } return true; } return false; } /// <summary> ///从网口读取数据 /// </summary> /// <param name="bytes"></param> /// <param name="nLen"></param> /// <returns></returns> public int ReadData(byte[] bytes, int nLen) { int n = 0; if (m_client.Connected) { try { NetworkStream netStream = m_client.GetStream(); if (netStream.DataAvailable) { n = netStream.Read(bytes, 0, nLen); } } catch/*(TimeoutException e)*/ { } } return n; } /// <summary> ///关闭网口 /// </summary> public void Closem_client() { if (m_client != null) { if (m_client.Connected) { NetworkStream netStream = m_client.GetStream(); netStream.Close(); } m_client.Close(); m_client = null; } } private void button2_Click(object sender, EventArgs e) { Closem_client(); } private void button3_Click(object sender, EventArgs e) { UInt16[] aa = new UInt16[] { }; ReadMultiWord(SoftElement.D, 100, aa); textBox2.Text = aa[0].ToString(); } /// <summary> /// 读取多个字元件 /// </summary> /// <param name="element">元件类型:X、Y、M、D </param> /// <param name="nAddr">元件起始地址</param> /// <param name="nValues">保存元件值</param> /// <returns></returns> public bool ReadMultiWord(SoftElement element, int nAddr, UInt16[] nValues) { string line = "RDS "; line = element.ToString(); line = nAddr.ToString(); line = ".U"; line = " "; line = nValues.Length.ToString(); line = "\r"; byte[] cmdData = Encoding.ASCII.GetBytes(line); if (!WriteData(cmdData, cmdData.Length)) return false; byte[] rspData = new byte[nValues.Length * 6 1]; if (ReadData(rspData, rspData.Length) != rspData.Length) return false; string rspStr = Encoding.ASCII.GetString(rspData); if (rspStr.Substring(rspStr.Length - 2, 2) != "\r\n") return false; string[] strVals = rspStr.Split(' '); if (strVals.Length != nValues.Length) return false; for (int i = 0; i < nValues.Length; i ) { int nTemp = 0; if (int.TryParse(strVals[i], out nTemp)) { nValues[i] = (UInt16)nTemp; } else { return false; } } return true; } /// <summary> /// <summary> /// 写入多个元件 /// </summary> /// <param name="element"></param> /// <param name="nAddr"></param> /// <param name="nValues"></param> /// <returns></returns> public bool WriteMultiWord(SoftElement element, int nAddr, UInt16[] nValues) { string line = "WRS "; line = element.ToString(); line = nAddr.ToString(); line = ".U"; line = " "; line = nValues.Length.ToString(); for (int i = 0; i < nValues.Length; i ) { line = " "; line = nValues[i].ToString(); } line = "\r"; byte[] cmdData = Encoding.ASCII.GetBytes(line); if (!WriteData(cmdData, cmdData.Length)) return false; byte[] rspData = new byte[4]; if (ReadData(rspData, rspData.Length) != rspData.Length) return false; byte[] rspRightData = Encoding.ASCII.GetBytes("OK\r\n"); for (int i = 0; i < rspData.Length; i ) { if (rspData[i] != rspRightData[i]) return false; } return true; } private void button4_Click(object sender, EventArgs e) { UInt16[] aa=new UInt16[] { }; aa[0] = Convert.ToUInt16( textBox1.Text);//要写入的值,用户自定义 WriteMultiWord(SoftElement.D, 100, aa); } private void Form1_Load(object sender, EventArgs e) { } } }
相关软件
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论