1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > C# TCP/IP通讯协议的整理(二)附带——与欧姆龙PLC通讯

C# TCP/IP通讯协议的整理(二)附带——与欧姆龙PLC通讯

时间:2020-03-11 05:08:46

相关推荐

C# TCP/IP通讯协议的整理(二)附带——与欧姆龙PLC通讯

进行了下优化。OmronParent中在new MyClient 时,设置端口号之前我是固定了。现在把它也开放出来。

首先对MyClient类,进行一个小小的升级:添加发送和接收字节数组

using System;using System.Collections.Generic;using System.Linq;using ;using .Sockets;using System.Text;using System.Threading.Tasks;namespace CSDN{public class MyClient{TcpClient mClient;IPEndPoint endPoint;NetworkStream NetworkStream;public MyClient(string ip,int port){mClient = new TcpClient();endPoint = new IPEndPoint(IPAddress.Parse(ip), port);}/// <summary>/// 进行连接/// </summary>public void ConnectServer(){try{mClient.Connect(endPoint);NetworkStream = mClient.GetStream();NetworkStream.WriteTimeout = 100;NetworkStream.ReadTimeout = 300;}catch (Exception err){}}/// <summary>/// 是否连接成功/// </summary>public bool isConnected{get{return mClient.Connected;}}/// <summary>/// 发送命令/// </summary>/// <param name="Send"></param>public void SendString(string Send){try{if (Send != ""){Byte[] bSend = ASCIIEncoding.ASCII.GetBytes(Send);NetworkStream.Write(bSend, 0, bSend.Length);}}catch {}}/// <summary>/// 发送命令/// </summary>/// <param name="Send"></param>public void SendBytes(byte[] Send){int iBuff = mClient.Available;if (iBuff > 0){NetworkStream.Flush();byte[] bBuff = new byte[iBuff];NetworkStream.Read(bBuff, 0, bBuff.Length);}try{if (Send != null && Send.Length != 0){NetworkStream.Flush();NetworkStream.Write(Send, 0, Send.Length);}}catch {}}/// <summary>/// 接收数据—— 字符串/// </summary>/// <returns></returns>public string RecString(){try{byte[] bRec = new byte[1024];int icount = NetworkStream.Read(bRec, 0, bRec.Length);return Encoding.Default.GetString(bRec);}catch (Exception err){return "";}}/// <summary>/// 接收数据—— 字节/// </summary>/// <returns></returns>public byte[] RecBytes(){try{byte[] bRec = new byte[1024];int icount = NetworkStream.Read(bRec, 0, bRec.Length);return bRec;}catch (Exception err){return null;}}}}

然后创建一个欧姆龙PLC的通讯基类omoron

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace CSDN{public class omoron{public string IpAddressPLC;public byte IpPLC{get{try{string[] s = IpAddressPLC.Split('.');byte bIp = Convert.ToByte(s[3]);return bIp;}catch{return 0;}}}public string IpAddressPC;public byte IpPC{get{try{string[] s = IpAddressPC.Split('.');byte bIp = Convert.ToByte(s[3]);return bIp;}catch{return 0;}}}public string writeAddr;public string writeCnt;public string readCnt;public string readAddr;}}

然后创建具体的操作类OmronParent

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;using System.Threading.Tasks;namespace CSDN{public class OmronParent{#region 属性private MyClient _myClient;omoron _omoron;private bool isConnected = false;/// <summary>/// PLC的ip地址/// </summary>public string IPAddressPLC{set{_omoron.IpAddressPLC = value;}}public int PLCPort=9600;/// <summary>/// PC端的IP地址/// </summary>public string IPAddressPC{set{_omoron.IpAddressPC = value;}}public OmronParent() {_omoron = new omoron();}/// <summary>/// 连接欧姆龙PLC/// </summary>/// <returns></returns>public bool ConnectServer(){if (!isConnected){if (_omoron.IpPC == 0 || _omoron.IpPLC == 0){isConnected = false;}else{isConnected = GetHandshake();}}return isConnected;}private MyClient myClient{get {if (_myClient == null || !_myClient.isConnected){_myClient = new MyClient(_omoron.IpAddressPLC, PLCPort);Thread.Sleep(100);_myClient.ConnectServer();}return _myClient;}}#endregion#region 方法/// <summary>/// 连接欧姆龙PLC/// </summary>/// <returns></returns>private bool GetHandshake(){try{if (!_myClient.isConnected){return false;}byte[] Handshake = new byte[20];Handshake[0] = 0x46;Handshake[1] = 0x49;Handshake[2] = 0x4e;Handshake[3] = 0x53;Handshake[4] = 0;Handshake[5] = 0;Handshake[6] = 0;Handshake[7] = 0x0c;Handshake[8] = 0;Handshake[9] = 0;Handshake[10] = 0;Handshake[11] = 0;Handshake[12] = 0;Handshake[13] = 0;Handshake[14] = 0;Handshake[15] = 0;Handshake[16] = 0;Handshake[17] = 0;Handshake[18] = 0;Handshake[19] = _omoron.IpPC;_myClient.SendBytes(Handshake);Thread.Sleep(50);byte[] rec = _myClient.RecBytes();if (!(Convert.ToInt32(rec[15]) == 33 || Convert.ToInt32(rec[15]) == 0) || Convert.ToInt32(rec[23]) != Convert.ToInt32(_omoron.IpAddressPLC.Split('.')[3])){isConnected = false;return false;}}catch (Exception e){isConnected = false;return false;}isConnected = true;return true;}#region 读取和写入D区,W区,C区public bool WriteD(string adress, int length, int[] rdata){this._omoron.writeAddr = adress;return GetDMwrite(length, rdata);}private bool GetDMwrite(int length, int[] rdata){try{int len = (length - 1) * 2 + 28;byte[] writecmd = new byte[len + 8];writecmd[0] = 0x46;//Fwritecmd[1] = 0x49;//Iwritecmd[2] = 0x4e;//Nwritecmd[3] = 0x53;//Swritecmd[4] = 0;//cmd lengthwritecmd[5] = 0;writecmd[6] = 0;writecmd[7] = Convert.ToByte(len);writecmd[8] = 0;//frame commandwritecmd[9] = 0;writecmd[10] = 0;writecmd[11] = 0x02;writecmd[12] = 0;//errwritecmd[13] = 0;writecmd[14] = 0;writecmd[15] = 0;//command frame headerwritecmd[16] = 0x80;//ICFwritecmd[17] = 0x00;//RSVwritecmd[18] = 0x02;//GCT, less than 8 network layerswritecmd[19] = 0x00;//DNA, local networkwritecmd[20] = _omoron.IpPLC;//DA1writecmd[21] = 0x00;//DA2, CPU unitwritecmd[22] = 0x00;//SNA, local networkwritecmd[23] = _omoron.IpPC;//SA1writecmd[24] = 0x00;//SA2, CPU unitwritecmd[25] = 0xFF;//SIDwritecmd[26] = 0x01;writecmd[27] = 0x02;//byte block = getBlock((Block)Enum.Parse(typeof(Block),cOmron.memory));writecmd[28] = 0x82;//cOmron.memory//地址转为16进制,前2位fuzhiwritecmd[29] = GetHighByte(_omoron.writeAddr);writecmd[30] = GetLowByte(_omoron.writeAddr);//cOmron.writeAddrwritecmd[31] = 0x01;writecmd[32] = GetHighByte(Convert.ToString(length));writecmd[33] = GetLowByte(Convert.ToString(length));for (int i = 0; i < length; i++){string str = Convert.ToString(rdata[i], 16);if (str.Length < 3){writecmd[34 + 2 * i] = 0;writecmd[34 + 2 * i + 1] = Convert.ToByte(Convert.ToInt32(str, 16));}else if (str.Length == 3){writecmd[34 + 2 * i] = Convert.ToByte(Convert.ToInt32(str.Substring(0, 1), 16));writecmd[34 + 2 * i + 1] = Convert.ToByte(Convert.ToInt32(str.Substring(1, 2), 16));}else{writecmd[34 + 2 * i] = Convert.ToByte(Convert.ToInt32(str.Substring(0, 2), 16));writecmd[34 + 2 * i + 1] = Convert.ToByte(Convert.ToInt32(str.Substring(2, 2), 16));}}myClient.SendBytes(writecmd);Thread.Sleep(50);byte[] rec = myClient.RecBytes();if (rec == null || rec.Length < 16 || Convert.ToInt32(rec[15]) != 0 || rec[0] != 70){isConnected = false;return false;}}catch (Exception e){isConnected = false;return false;}return true;}//DMpublic bool ReadD(string address, int length, out int[] rdata){this._omoron.readAddr = address;return GetDMread(length, out rdata);}private bool GetDMread(int length, out int[] rdata){rdata = null;try{if (!myClient.isConnected){isConnected = false;return false;}byte[] FullCmd = new byte[34];FullCmd[0] = 0x46;//FFullCmd[1] = 0x49;//IFullCmd[2] = 0x4E;//NFullCmd[3] = 0x53;//SFullCmd[4] = 0;//cmd lengthFullCmd[5] = 0;FullCmd[6] = 0;FullCmd[7] = 0x1A;FullCmd[8] = 0;//frame commandFullCmd[9] = 0;FullCmd[10] = 0;FullCmd[11] = 0x02;FullCmd[12] = 0;//errFullCmd[13] = 0;FullCmd[14] = 0;FullCmd[15] = 0;//command frame headerFullCmd[16] = 0x80;//ICFFullCmd[17] = 0x00;//RSVFullCmd[18] = 0x02;//GCT, less than 8 network layersFullCmd[19] = 0x00;//DNA, local networkFullCmd[20] = _omoron.IpPLC;//DA1FullCmd[21] = 0x00;//DA2, CPU unitFullCmd[22] = 0x00;//SNA, local networkFullCmd[23] = _omoron.IpPC;//SA1FullCmd[24] = 0x00;//SA2, CPU unitFullCmd[25] = 0xFF;//SIDFullCmd[26] = 0x01;FullCmd[27] = 0x01;FullCmd[28] = 0x82;FullCmd[29] = GetHighByte(_omoron.readAddr);FullCmd[30] = GetLowByte(_omoron.readAddr);FullCmd[31] = 0x00;FullCmd[32] = GetHighByte(Convert.ToString(length));FullCmd[33] = GetLowByte(Convert.ToString(length));myClient.SendBytes(FullCmd);Thread.Sleep(50);byte[] rec = myClient.RecBytes();if (rec == null || Convert.ToInt32(rec[15]) != 0 || rec[0] != 70){isConnected = false;return false;// isConnected = false;}rdata = new int[length];for (int i = 0; i < length; i++){string hstr = Convert.ToString(Convert.ToInt32(rec[30 + 2 * i]), 16);string estr = Convert.ToString(Convert.ToInt32(rec[30 + 2 * i + 1]), 16);string str = hstr + estr;rdata[i] = Convert.ToInt32(str, 16);}}catch (Exception e){isConnected = false;return false;}return true;}public bool WriteCio(string address, int length, int[] rdata){this._omoron.writeAddr = address;return GetCIOwrite(length, rdata);}public bool WriteW(string address, int length, int[] rdata){this._omoron.writeAddr = address;return GetCIOwrite(length, rdata, 49);}private bool GetCIOwrite(int length, int[] rdata){try{int len = length + 26;byte[] writecmd = new byte[len + 8];writecmd[0] = 0x46;//Fwritecmd[1] = 0x49;//Iwritecmd[2] = 0x4e;//Nwritecmd[3] = 0x53;//Swritecmd[4] = 0;//cmd lengthwritecmd[5] = 0;writecmd[6] = 0;writecmd[7] = Convert.ToByte(len);writecmd[8] = 0;//frame commandwritecmd[9] = 0;writecmd[10] = 0;writecmd[11] = 0x02;writecmd[12] = 0;//errwritecmd[13] = 0;writecmd[14] = 0;writecmd[15] = 0;//command frame headerwritecmd[16] = 0x80;//ICFwritecmd[17] = 0x00;//RSVwritecmd[18] = 0x02;//GCT, less than 8 network layerswritecmd[19] = 0x00;//DNA, local networkwritecmd[20] = _omoron.IpPLC;//DA1writecmd[21] = 0x00;//DA2, CPU unitwritecmd[22] = 0x00;//SNA, local networkwritecmd[23] = _omoron.IpPC;//SA1writecmd[24] = 0x00;//SA2, CPU unitwritecmd[25] = 0x00;//SIDwritecmd[26] = 0x01;writecmd[27] = 0x02;// byte block = getBlock((Block)Enum.Parse(typeof(Block),cOmron.memory));writecmd[28] = 0x30;//cOmron.memory//将writeAddr分为小数部分和整数部分string[] arrary = (_omoron.writeAddr).Split('.');string intAddr = arrary[0];string frackAddr = "0";if (arrary.Length > 1){frackAddr = arrary[1];}//地址转为16进制,高位,地位分开writecmd[29] = GetHighByte(intAddr);writecmd[30] = GetLowByte(intAddr);writecmd[31] = Convert.ToByte(frackAddr);writecmd[32] = GetHighByte(Convert.ToString(length));writecmd[33] = GetLowByte(Convert.ToString(length));for (int i = 0; i < length; i++){writecmd[33 + i + 1] = Convert.ToByte(rdata[i]);}myClient.SendBytes(writecmd);Thread.Sleep(50);byte[] rec = myClient.RecBytes();if (rec == null || rec.Length < 16 || Convert.ToInt32(rec[15]) != 0 || rec[0] != 70){isConnected = false;return false;}}catch (Exception e){isConnected = false;return false;}return true;}private bool GetCIOwrite(int length, int[] rdata, byte type){try{int len = length + 26;byte[] writecmd = new byte[len + 8];writecmd[0] = 0x46;//Fwritecmd[1] = 0x49;//Iwritecmd[2] = 0x4e;//Nwritecmd[3] = 0x53;//Swritecmd[4] = 0;//cmd lengthwritecmd[5] = 0;writecmd[6] = 0;writecmd[7] = Convert.ToByte(len);writecmd[8] = 0;//frame commandwritecmd[9] = 0;writecmd[10] = 0;writecmd[11] = 0x02;writecmd[12] = 0;//errwritecmd[13] = 0;writecmd[14] = 0;writecmd[15] = 0;//command frame headerwritecmd[16] = 0x80;//ICFwritecmd[17] = 0x00;//RSVwritecmd[18] = 0x02;//GCT, less than 8 network layerswritecmd[19] = 0x00;//DNA, local networkwritecmd[20] = _omoron.IpPLC;//DA1writecmd[21] = 0x00;//DA2, CPU unitwritecmd[22] = 0x00;//SNA, local networkwritecmd[23] = _omoron.IpPC;//SA1writecmd[24] = 0x00;//SA2, CPU unitwritecmd[25] = 0x00;//SIDwritecmd[26] = 0x01;writecmd[27] = 0x02;// byte block = getBlock((Block)Enum.Parse(typeof(Block),cOmron.memory));writecmd[28] = type;//cOmron.memory//将writeAddr分为小数部分和整数部分string[] arrary = (_omoron.writeAddr).Split('.');string intAddr = arrary[0];string frackAddr = "0";if (arrary.Length > 1){frackAddr = arrary[1];}//地址转为16进制,高位,地位分开writecmd[29] = GetHighByte(intAddr);writecmd[30] = GetLowByte(intAddr);writecmd[31] = Convert.ToByte(frackAddr);writecmd[32] = GetHighByte(Convert.ToString(length));writecmd[33] = GetLowByte(Convert.ToString(length));for (int i = 0; i < length; i++){writecmd[33 + i + 1] = Convert.ToByte(rdata[i]);}myClient.SendBytes(writecmd);Thread.Sleep(50);byte[] rec = myClient.RecBytes();if (rec == null || rec.Length < 16 || Convert.ToInt32(rec[15]) != 0 || rec[0] != 70){isConnected = false;return false;}}catch (Exception e){isConnected = false;return false;}return true;}public bool ReadCio(string address, int length, out int[] rdata){_omoron.readAddr = address;return getCIOread(length, out rdata);}public bool ReadW(string address, int length, out int[] rdata){_omoron.readAddr = address;return getCIOread(length, out rdata, 49);}private bool getCIOread(int length, out int[] rdata){rdata = null;try{if (!myClient.isConnected){isConnected = false;return false;}byte[] FullCmd = new byte[34];FullCmd[0] = 0x46;//FFullCmd[1] = 0x49;//IFullCmd[2] = 0x4E;//NFullCmd[3] = 0x53;//SFullCmd[4] = 0;//cmd lengthFullCmd[5] = 0;FullCmd[6] = 0;FullCmd[7] = 0x1A;FullCmd[8] = 0;//frame commandFullCmd[9] = 0;FullCmd[10] = 0;FullCmd[11] = 0x02;FullCmd[12] = 0;//errFullCmd[13] = 0;FullCmd[14] = 0;FullCmd[15] = 0;//command frame headerFullCmd[16] = 0x80;//ICFFullCmd[17] = 0x00;//RSVFullCmd[18] = 0x02;//GCT, less than 8 network layersFullCmd[19] = 0x00;//DNA, local networkFullCmd[20] = _omoron.IpPLC;//DA1FullCmd[21] = 0x00;//DA2, CPU unitFullCmd[22] = 0x00;//SNA, local networkFullCmd[23] = _omoron.IpPC;//SA1FullCmd[24] = 0x00;//SA2, CPU unitFullCmd[25] = 0x00;//SIDFullCmd[26] = 0x01;FullCmd[27] = 0x01;//byte block = getBlock((Block)Enum.Parse(typeof(Block), cOmron.memory));FullCmd[28] = 0x30;string[] arrary = (_omoron.readAddr).Split('.');string intAddr = arrary[0];string frackAddr = "0";if (arrary.Length > 1){frackAddr = arrary[1];}FullCmd[29] = GetHighByte(intAddr);FullCmd[30] = GetLowByte(intAddr);FullCmd[31] = Convert.ToByte(frackAddr);FullCmd[32] = GetHighByte(Convert.ToString(length));FullCmd[33] = GetLowByte(Convert.ToString(length));myClient.SendBytes(FullCmd);Thread.Sleep(50);byte[] rec = myClient.RecBytes();if (rec == null || Convert.ToInt32(rec[15]) != 0 || rec[0] != 70){isConnected = false;return false;}rdata = new int[length];for (int i = 0; i < length; i++){string str = Convert.ToString(Convert.ToInt32(rec[30 + i]), 16);rdata[i] = Convert.ToInt32(str, 16);}}catch (Exception e){isConnected = false;return false;}return true;}private bool getCIOread(int length, out int[] rdata, byte type){rdata = null;try{if (!myClient.isConnected){isConnected = false;return false;}byte[] FullCmd = new byte[34];FullCmd[0] = 0x46;//FFullCmd[1] = 0x49;//IFullCmd[2] = 0x4E;//NFullCmd[3] = 0x53;//SFullCmd[4] = 0;//cmd lengthFullCmd[5] = 0;FullCmd[6] = 0;FullCmd[7] = 0x1A;FullCmd[8] = 0;//frame commandFullCmd[9] = 0;FullCmd[10] = 0;FullCmd[11] = 0x02;FullCmd[12] = 0;//errFullCmd[13] = 0;FullCmd[14] = 0;FullCmd[15] = 0;//command frame headerFullCmd[16] = 0x80;//ICFFullCmd[17] = 0x00;//RSVFullCmd[18] = 0x02;//GCT, less than 8 network layersFullCmd[19] = 0x00;//DNA, local networkFullCmd[20] = _omoron.IpPLC;//DA1FullCmd[21] = 0x00;//DA2, CPU unitFullCmd[22] = 0x00;//SNA, local networkFullCmd[23] = _omoron.IpPC;//SA1FullCmd[24] = 0x00;//SA2, CPU unitFullCmd[25] = 0x00;//SIDFullCmd[26] = 0x01;FullCmd[27] = 0x01;//byte block = getBlock((Block)Enum.Parse(typeof(Block), cOmron.memory));FullCmd[28] = type;string[] arrary = (_omoron.readAddr).Split('.');string intAddr = arrary[0];string frackAddr = "0";if (arrary.Length > 1){frackAddr = arrary[1];}FullCmd[29] = GetHighByte(intAddr);FullCmd[30] = GetLowByte(intAddr);FullCmd[31] = Convert.ToByte(frackAddr);FullCmd[32] = GetHighByte(Convert.ToString(length));FullCmd[33] = GetLowByte(Convert.ToString(length));myClient.SendBytes(FullCmd);Thread.Sleep(50);byte[] rec = myClient.RecBytes();if (rec == null || Convert.ToInt32(rec[15]) != 0 || rec[0] != 70){isConnected = false;return false;}rdata = new int[length];for (int i = 0; i < length; i++){string str = Convert.ToString(Convert.ToInt32(rec[30 + i]), 16);rdata[i] = Convert.ToInt32(str, 16);}}catch (Exception e){isConnected = false;return false;}return true;}#endregion#region 辅助方法private byte GetHighByte(string str){byte result = 0;try{string Hnum = Convert.ToString(Convert.ToInt32(str), 16);if (Hnum.Length < 3){}else if (Hnum.Length == 3){result = Convert.ToByte(Convert.ToInt32(Hnum.Substring(0, 1), 16));}else if (Hnum.Length == 4){result = Convert.ToByte(Convert.ToInt32(Hnum.Substring(0, 2), 16));}}catch (Exception e){return result;}return result;}private byte GetLowByte(string str){byte result = 0;try{string Hnum = Convert.ToString(Convert.ToInt32(str), 16);if (Hnum.Length < 3){result = Convert.ToByte(str);}else if (Hnum.Length == 3){result = Convert.ToByte(Convert.ToInt32(Hnum.Substring(1, 2), 16));}else if (Hnum.Length == 4){result = Convert.ToByte(Convert.ToInt32(Hnum.Substring(2, 2), 16));}}catch (Exception e){return result;}return result;}#endregion#endregion}}

具体使用方法:

OmronParent OmronParent = new OmronParent();OmronParent.IPAddressPC = "192.168.1.1";OmronParent.IPAddressPLC = "192.168.1.2";OmronParent.PLCPort = 1120;//设置端口if (OmronParent.ConnectServer()){//连接PLC成功!//往D区写入数据,地址从1111开始到1115,然后读取数据int[] data = new int[] {1,0,1,0,1 };bool WriteSuccess = OmronParent.WriteD("1111",5, data);OmronParent.ReadD("1111", 5,out data);//向C区写入数据,地址从220.05到220.09,然后读取数据WriteSuccess = OmronParent.WriteCio("220.05", 5, data);OmronParent.ReadCio("220.05", 5, out data);//W区同用法}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。