源碼:
1 namespace TCPIP測試 2 { 3 public partial class Form1 : Form 4 { 5 public Form1() 6 { 7 InitializeComponent(); 8 } 9 //創建Socket連接對象 10 private Socket socketlient = null; 11 //運行標志位 12 private bool isRunning = false; 13 14 private Thread thrClient; 15 16 private byte[] setArray = new byte[100]; 17 18 private void btn_Connect_Click(object sender, EventArgs e) 19 { 20 socketlient = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); 21 22 IPAddress address = IPAddress.Parse(this.txt_IP.Text.Trim()); 23 24 IPEndPoint iPEndPoint = new IPEndPoint(address, int.Parse(this.txt_Port.Text.Trim())); 25 26 try 27 { 28 socketlient.Connect(iPEndPoint); 29 } 30 catch(Exception ex) 31 { 32 MessageBox.Show("連接失敗" + ex, "連接信息"); 33 return; 34 } 35 MessageBox.Show("連接成功", "連接信息"); 36 isRunning = true; 37 38 //開始線程接受PLC報文 39 thrClient = new Thread(ReceiveMessage); 40 thrClient.IsBackground = true; 41 thrClient.Start(); 42 } 43 /// <summary> 44 /// 接受和處理PLC返回的報文 45 /// </summary> 46 private void ReceiveMessage() 47 { 48 while(isRunning==true) 49 { 50 //定義一個接受緩沖區 51 byte[] arrMsgRcv = new byte[1024]; 52 int length = -1; 53 try 54 { 55 length = socketlient.Receive(arrMsgRcv); 56 } 57 catch(Exception) 58 { 59 MessageBox.Show("異常"); 60 } 61 if(length==200|| length == 1024) 62 { 63 byte[] Result = GetByteArray(arrMsgRcv, 0, length); 64 setArray = GetByteArray(arrMsgRcv, 0, 100); 65 try 66 { 67 Invoke(new Action(() => 68 { 69 this.txt_SetReadBack1.Text = BitConverter.ToSingle(GetSingleByteArray(Result, 0, 4), 0).ToString(); 70 this.txt_SetReadBack2.Text = BitConverter.ToSingle(GetSingleByteArray(Result, 4, 4), 0).ToString(); 71 72 this.txt_ActualValue1.Text = BitConverter.ToSingle(GetSingleByteArray(Result, 100, 4), 0).ToString(); 73 this.txt_ActualValue2.Text = BitConverter.ToSingle(GetSingleByteArray(Result, 104, 4), 0).ToString(); 74 })); 75 } 76 catch(Exception ex) 77 { 78 break; 79 } 80 } 81 82 } 83 84 } 85 86 private void btn_DisConnect_Click(object sender, EventArgs e) 87 { 88 socketlient?.Shutdown(SocketShutdown.Both); 89 socketlient?.Close(); 90 } 91 /// <summary> 92 /// 自定義截取字節數組 93 /// </summary> 94 /// <param name="byteArray"></param> 95 /// <param name="start"></param> 96 /// <param name="length"></param> 97 /// <returns></returns> 98 private byte[] GetByteArray(byte[] byteArray,int start,int length) 99 { 100 byte[] resByte =new byte[length]; 101 if(byteArray!=null&&byteArray.Length>=length) 102 { 103 for(int i=0;i<length;i++) 104 { 105 resByte[i] = byteArray[i + start]; 106 } 107 } 108 return resByte; 109 } 110 /// <summary> 111 /// 四字節順序轉換 1:ABCD 2:BADC 3:CDAB 4:DCBA 112 /// </summary> 113 /// <param name="byteArr"></param> 114 /// <param name="start"></param> 115 /// <param name="type"></param> 116 /// <returns></returns> 117 private byte[] GetSingleByteArray(byte[] byteArr,int start,int type) 118 { 119 byte[] resByte = new byte[4]; 120 if(byteArr!=null&&byteArr.Length>4&&type>=1&&type<=4) 121 { 122 for(int i=0;i<4;i++) 123 { 124 resByte[i] = byteArr[i + start]; 125 } 126 byte[] resByte1 = new byte[4]; 127 switch(type) 128 { 129 case 1: 130 resByte1 = resByte; 131 break; 132 case 2: 133 resByte1[0] = resByte[1]; 134 resByte1[1] = resByte[0]; 135 resByte1[2] = resByte[3]; 136 resByte1[3] = resByte[2]; 137 break; 138 case 3: 139 resByte1[0] = resByte[2]; 140 resByte1[1] = resByte[3]; 141 resByte1[2] = resByte[0]; 142 resByte1[3] = resByte[1]; 143 break; 144 case 4: 145 resByte1[0] = resByte[3]; 146 resByte1[1] = resByte[2]; 147 resByte1[2] = resByte[1]; 148 resByte1[3] = resByte[0]; 149 break; 150 } 151 return resByte1; 152 } 153 return resByte; 154 155 } 156 157 private void groupBox2_Enter(object sender, EventArgs e) 158 { 159 160 } 161 162 private void btn_Set_Click(object sender, EventArgs e) 163 { 164 float f1 = Convert.ToSingle(this.txt_Set1.Text.Trim()); 165 float f2 = Convert.ToSingle(this.txt_Set2.Text.Trim()); 166 167 byte[] setArr1 = BitConverter.GetBytes(f1); 168 byte[] setArr2 = BitConverter.GetBytes(f2); 169 170 setArray[0] = setArr1[3]; 171 setArray[1] = setArr1[2]; 172 setArray[2] = setArr1[1]; 173 setArray[3] = setArr1[0]; 174 175 setArray[4] = setArr2[3]; 176 setArray[5] = setArr2[2]; 177 setArray[6] = setArr2[1]; 178 setArray[7] = setArr2[0]; 179 180 socketlient.Send(setArray); 181 182 } 183 184 private void Form1_Load(object sender, EventArgs e) 185 { 186 187 } 188 } 189 190 }
源碼連接(包括PLC程序):