实例介绍
【实例简介】
【实例截图】
【核心代码】
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net; using System.Net.Sockets; using System.Threading; namespace PlcConn_Tcp { public partial class Test_PLC_Conn : Form { private TcpClient plc_Socket = null; private NetworkStream myNetworkStream; private byte client_node_no; private byte server_node_no; private int readCount = 3;//read address count from begin address private int writeCount = 3;//write address count from begin address //private PLCCommu plcCommu = PLCCommu.Instance; public Test_PLC_Conn() { InitializeComponent(); } private byte[] StringToBytes16(string source) { byte[] destination = new byte[source.Length/2]; for (int i = 0, j = 0; i < source.Length &&j<source.Length/2; i = 2,j ) { string item = source.Substring(i, 2); destination[j] = Convert.ToByte(item, 16); } return destination; } public bool creatConn(string Plc_IP, string Tcp_Port) { bool execResu = true; //创建Socket连接 string tcp_header = "46494E530000000C000000000000000000000000"; byte[] fins_tcp_header = StringToBytes16(tcp_header); try { plc_Socket = new TcpClient(); plc_Socket.Connect(IPAddress.Parse(Plc_IP), int.Parse(Tcp_Port)); myNetworkStream = plc_Socket.GetStream(); } catch (SocketException ex) { MessageBox.Show(ex.Message); execResu = false; return execResu; } WriteData(fins_tcp_header); byte[] responseMessage = ReadData(); //response Packet check if (responseMessage.Length == 24) { if (responseMessage[8] != 0x00 || responseMessage[9] != 0x00 || responseMessage[10] != 0x00 || responseMessage[11] != 0x01 || responseMessage[12] != 0x00 || responseMessage[13] != 0x00 || responseMessage[14] != 0x00 || responseMessage[15] != 0x00) { return false; } client_node_no = responseMessage[19]; server_node_no= responseMessage[23]; } else { return false; } return execResu; } private bool Read(ref int[] data) { string Ssend_header = "46494E530000001A"; Ssend_header ="0000000200000000"; byte[] send_header = StringToBytes16(Ssend_header); Random ra = new Random(unchecked((int)DateTime.Now.Ticks)); int SID = ra.Next(1, 100);//generate random sid in orde to check response packet byte[] fins_header_comm = new byte[12]; fins_header_comm[0] = 0x80;//ICF fins_header_comm[1] = 0x00;//RSV fins_header_comm[2] = 0x02;//GCT fins_header_comm[3] = 0x00; //DNA fins_header_comm[4] = server_node_no;//PLC端节点号 fins_header_comm[5] = 0x00;//DA2 fins_header_comm[6] = 0x00;//SNA fins_header_comm[7] = client_node_no;//PC端节点号,通过连接程序直接获得的 fins_header_comm[8] = 0x00;//SA2 fins_header_comm[9] = Convert.ToByte(SID.ToString(), 16);//SID fins_header_comm[10] = 0x01; fins_header_comm[11] = 0x01;//读命令 string saddr_value = "821C2000"; saddr_value = Convert.ToString(readCount, 16).PadLeft(4,'0'); byte[] addr_value = StringToBytes16(saddr_value); WriteData(send_header); WriteData(fins_header_comm); WriteData(addr_value); byte[] Reseponse = ReadData(); //MessageBox.Show(Reseponse.Length.ToString()); //check response packet if (Reseponse[8] != 0 || Reseponse[9] != 0 || Reseponse[10] != 0 || Reseponse[11] != 2 || Reseponse[12] != 0 || Reseponse[13] != 0 || Reseponse[14] != 0 || Reseponse[15] != 0 || Reseponse[26] != 1 || Reseponse[27] != 1 || Reseponse[28] != 0 || Reseponse[29] != 0 || Reseponse[25] != Convert.ToByte(SID.ToString(), 16)) { return false; } MessageBox.Show((Convert.ToInt32(Reseponse[Reseponse.Length - 2].ToString("X2") Reseponse[Reseponse.Length - 1].ToString("X2"),16)).ToString()); object[] aaa=new object[2]; int a = 20; long b = 60; aaa[0] = a; aaa[1] = b; MessageBox.Show(aaa[0].GetType().ToString()); MessageBox.Show(aaa[1].GetType().ToString()); return true; } private bool Write(object[] data) { string Ssend_header = "46494E53000000"; Ssend_header = Convert.ToString((2*writeCount 1 25), 16).PadLeft(2, '0'); Ssend_header = "0000000200000000"; byte[] send_header=StringToBytes16(Ssend_header); Random ra = new Random(unchecked((int)DateTime.Now.Ticks)); int SID = ra.Next(1, 100);//generate random sid in orde to check response packet byte[] fins_header_comm=new byte[12]; fins_header_comm[0] = 0x80;//ICF4294967295 fins_header_comm[1] = 0x00;//RSV fins_header_comm[2] = 0x02;//GCT fins_header_comm[3] = 0x00; //DNA fins_header_comm[4] = server_node_no;//PLC端节点号 fins_header_comm[5] = 0x00;//DA2 fins_header_comm[6] = 0x00;//SNA fins_header_comm[7] = client_node_no;//PC端节点号,通过连接程序直接获得的 fins_header_comm[8] = 0x00;//SA2 fins_header_comm[9] = Convert.ToByte(SID.ToString(), 16);//SID fins_header_comm[10] = 0x01; fins_header_comm[11] = 0x02;//写命令 string saddr_value = "821C2000"; saddr_value = Convert.ToString(writeCount, 16).PadLeft(4, '0'); for (int i = 0; i < data.Length; i ) { if ("System.Int64"==data[i].GetType().ToString()) { saddr_value = Convert.ToString((long)data[i], 16).PadLeft(8, '0').Substring(4, 4); saddr_value = Convert.ToString((long)data[i], 16).PadLeft(8, '0').Substring(0, 4); } else { saddr_value = Convert.ToString((int)data[i], 16).PadLeft(4, '0'); } } byte[] addr_value = StringToBytes16(saddr_value); WriteData(send_header); WriteData(fins_header_comm); WriteData(addr_value); byte[] Reseponse = ReadData(); //check response packet if (Reseponse[8] != 0 || Reseponse[9] != 0 || Reseponse[10] != 0 || Reseponse[11] != 2 || Reseponse[12] != 0 || Reseponse[13] != 0 || Reseponse[14] != 0 || Reseponse[15] != 0 || Reseponse[26] != 1 || Reseponse[27] != 2 || Reseponse[28] != 0 || Reseponse[29] != 0 || Reseponse[25] != Convert.ToByte(SID.ToString(), 16)) { MessageBox.Show(Reseponse[8].ToString() Reseponse[9].ToString() Reseponse[10].ToString() Reseponse[11].ToString()); return false; } return true; } private void WriteData(byte[] myByte) { byte[] writeBytes = myByte; myNetworkStream.Write(writeBytes, 0, writeBytes.Length); myNetworkStream.Flush(); } private byte[] ReadData() { int k = plc_Socket.Available; while (k == 0) { k = plc_Socket.Available; } byte[] myBufferBytes = new byte[k]; myNetworkStream.Read(myBufferBytes, 0, k); myNetworkStream.Flush(); return myBufferBytes; } private void button1_Click(object sender, EventArgs e) { if (creatConn(this.txt_PlcIP.Text.Trim(), this.txt_Tcpport.Text.Trim())) { MessageBox.Show("successfully!"); } else { MessageBox.Show("Filed!"); } } private void button2_Click(object sender, EventArgs e) { long t = 4294967290; int uu = 56; object[] data = { t,uu }; if (Write(data)) { MessageBox.Show("写入成功"); } else MessageBox.Show("写入失败"); } private void button3_Click(object sender, EventArgs e) { int[] data=null; if (Read(ref data)) { MessageBox.Show("读取成功"); } else MessageBox.Show("读取失败"); } } }
好例子网口号:伸出你的我的手 — 分享!
网友评论
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
支持(0) 盖楼(回复)
支持(0) 盖楼(回复)
支持(0) 盖楼(回复)
支持(0) 盖楼(回复)
支持(0) 盖楼(回复)
支持(0) 盖楼(回复)
支持(0) 盖楼(回复)