本文采用的是读取本地文件,因为没有相机,所以只能够这么操作,基本上类似。
作业中的代码如图:
配置中“作业属性”->“编辑脚本”->“C#脚本”。
作业脚本代码如下:
1 using System; 2 using System.Net; 3 using System.Text; 4 using System.Net.Sockets; 5 using System.Threading; 6 using System.Windows.Forms; 7 using System.Collections.Generic; 8 using Cognex.VisionPro; 9 using Cognex.VisionPro.QuickBuild; 10
11
12 public class UserScript : CogJobBaseScript 13 { 14 //集合可以看似数组,集合的长度是可变得,其元素是object类型 15 //泛型集合时指定了数据类型的集合
16 private object _lock=new object(); 17
18 //定义NetworkStream的泛型集合
19 private List<NetworkStream>_streams = new List<NetworkStream>(); 20
21 //定义TCPClient的泛型集合
22 private List<TcpClient>_clients = new List<TcpClient>(); 23
24 //服务器端监听对象
25 private TcpListener _listener; 26
27 //连接线程
28 private Thread _connectionThread; 29
30 //定义Thread泛型集合
31 private List<Thread> _threads=new List<Thread>(); 32
33 //接受数据总长度
34 private long _totalBytes; 35
36 //作业
37 private CogJob MyJob; 38
39 #region "When an Acq Fifo Has Been Constructed and Assigned To The Job"
40 // This function is called when a new fifo is assigned to the job. This usually 41 // occurs when the "Initialize Acquisition" button is pressed on the image source 42 // control. This function is where you would perform custom setup associated 43 // with the fifo.
44 public override void AcqFifoConstruction(Cognex.VisionPro.ICogAcqFifo fifo) 45 { 46 } 47 #endregion
48
49 #region "When an Acquisition is About To Be Started"
50 // Called before an acquisition is started for manual and semi-automatic trigger 51 // models. If "Number of Software Acquisitions Pre-queued" is set to 1 in the 52 // job configuration, then no acquisitions should be in progress when this 53 // function is called.
54 public override void PreAcquisition() 55 { 56 // To let the execution stop in this script when a debugger is attached, uncomment the following lines. 57 // #if DEBUG 58 // if (System.Diagnostics.Debugger.IsAttached) System.Diagnostics.Debugger.Break(); 59 // #endif
60
61 } 62 #endregion
63
64 #region "When an Acquisition Has Just Completed"
65 // Called immediately after an acquisition has completed. 66 // Return true if the image should be inspected. 67 // Return false to skip the inspection and acquire another image.
68 public override bool PostAcquisitionRefInfo(ref Cognex.VisionPro.ICogImage image, 69 Cognex.VisionPro.ICogAcqInfo info) 70 { 71 // To let the execution stop in this script when a debugger is attached, uncomment the following lines. 72 // #if DEBUG 73 // if (System.Diagnostics.Debugger.IsAttached) System.Diagnostics.Debugger.Break(); 74 // #endif
75
76 return true; 77 } 78 #endregion
79
80 #region "When the Script is Initialized"
81 //Perform any initialization required by your script here.
82 public override void Initialize(CogJob jobParam) 83 { 84 //DO NOT REMOVE - Call the base class implementation first - DO NOT REMOVE
85 base.Initialize(jobParam); 86
87 //将当前作业可以复制给Myjob
88 MyJob = jobParam; 89
90 //开启线程
91 StartThreading(); 92 } 93 #endregion
94
95 //开启线程实现服务器的端口监听
96 private void StartThreading() 97 { 98 try
99 { 100 _totalBytes = 0; 101
102 //_connectionThread对象实例化
103 _connectionThread = new System.Threading.Thread(new ThreadStart(ConnectToClient)); 104
105 //线程后台运行
106 _connectionThread.IsBackground = true; 107
108 //线程开始运行
109 _connectionThread.Start(); 110 } 111 catch(Exception ex) 112 { 113 MessageBox.Show("线程启动失败"); 114 } 115 } 116
117 //连接到客户端
118 private void ConnectToClient() 119 { 120 try
121 { 122 //开始监听6001端口
123 _listener = new TcpListener(IPAddress.Any, 6001); 124
125 _listener.Start(); 126 } 127 catch(SocketException se) 128 { 129 MessageBox.Show("服务器监听失败" + se.Message); 130
131 StopServer(); 132
133 return; 134 } 135
136 //监听客户端的连接请求
137 try
138 { 139 for(;;) 140 { 141 //等待客户端的连接请求
142 TcpClient client = _listener.AcceptTcpClient(); 143
144 //创建线程开始接受客户端数据
145 Thread t = new Thread(new ParameterizedThreadStart(ReceiveDataFromClient)); 146
147 //线程后台运行
148 t.IsBackground = true; 149
150 //线程优先级
151 t.Priority = ThreadPriority.AboveNormal; 152
153 //线程名称
154 t.Name = "Handle Client"; 155
156 //开启线程
157 t.Start(client); 158
159 //将线程对象添加到泛型集合里
160 _threads.Add(t); 161
162 //将客户端添加到泛型集合里
163 _clients.Add(client); 164 } 165 } 166 catch(SocketException ex) 167 { 168 MessageBox.Show("Socket错误" + ex.Message); 169 } 170 catch(Exception ex) 171 { 172 MessageBox.Show("异常错误" + ex.Message); 173 } 174 } 175
176 //接受客户端传过来的数据
177 public void ReceiveDataFromClient(object clientObject) 178 { 179 //定义TcpClient对象并赋值
180 TcpClient client = clientObject as TcpClient; 181
182 //定义NetworkStream对象并赋值
183 NetworkStream netStream = null; 184
185 try
186 { 187 //获取客户端的网络数据流
188 netStream = client.GetStream(); 189 } 190 catch(Exception ex) 191 { 192 if(netStream != null) netStream.Close(); 193 MessageBox.Show("异常错误" + ex.Message); 194 return; 195 } 196
197 if(netStream.CanRead) 198 { 199 //将数据流添加到_streams泛型集合里
200 _streams.Add(netStream); 201 try
202 { 203 byte[] receiveBuffer = new byte[512]; 204 int bytesReceived; 205
206 //循环读取客户端发来的数据
207 while((bytesReceived = netStream.Read(receiveBuffer, 0, receiveBuffer.Length)) > 0) 208 { 209 if(Encoding.ASCII.GetString(receiveBuffer, 0, bytesReceived) == "start") 210 { 211 MyJob.RunContinuous(); 212 //MessageBox.Show("接受到的数据:"+Encoding.ASCII.GetString(receiveBuffer,0,bytesReceived);
213 } 214
215 if(Encoding.ASCII.GetString(receiveBuffer, 0, bytesReceived) == "stop") 216 { 217 MyJob.Stop(); 218 //MessageBox.Show("接受到的数据:"+Encoding.ASCII.GetString(receiveBuffer, 0, bytesReceived));
219 } 220 } 221 } 222 catch(Exception ex) 223 { 224 MessageBox.Show("异常错误" + ex.Message); 225 } 226 } 227 } 228
229 //停止服务器
230 private void StopServer() 231 { 232 if(_listener != null) 233 { 234 //关闭TCP监听
235 _listener.Stop(); 236
237 //等待服务器线程中断
238 _connectionThread.Join(); 239
240 //关闭所有客户端的网络数据流
241 foreach(NetworkStream s in _streams) 242 s.Close(); 243
244 //清除_streams泛型集合里的内容
245 _streams.Clear(); 246
247 //关闭客户端连接
248 foreach(TcpClient client in _clients) 249 client.Close(); 250
251 //清除_clients泛型集合里的内容
252 _clients.Clear(); 253
254 //等待所有客户端线程中断
255 foreach(Thread t in _threads) 256 t.Join(); 257
258 //清除_threads泛型集合里的内容
259 _threads.Clear(); 260
261 } 262 } 263
264 }
C# Form界面如下:
代码如下:
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Threading.Tasks; 9 using System.Windows.Forms; 10 using System.Net; 11 using System.Net.Sockets; 12 using System.Threading; 13
14 namespace TCPClientApplicationProgram 15 { 16 public partial class Form1 : Form 17 { 18 Socket clientSocket; 19 Thread clientThread; 20
21 public Form1() 22 { 23 InitializeComponent(); 24
25 //对跨线程的非法错误不检查
26 Control.CheckForIllegalCrossThreadCalls = false; 27
28 this.IP_textBox1.Text = "127.0.0.1"; 29
30 this.Port_textBox2.Text = "6001"; 31 } 32
33 private void Send_button_Click(object sender, EventArgs e) 34 { 35 byte[] data = new byte[1024]; 36
37 //对输入信息进行编码并放到一个字节数组
38 data = Encoding.ASCII.GetBytes(this.Content_textBox3.Text); 39
40 //向服务器发送信息
41 clientSocket.Send(data, data.Length, SocketFlags.None); 42 } 43
44 private void ConnectSever_button1_Click(object sender, EventArgs e) 45 { 46 if(this.IP_textBox1.Text=="") 47 { 48 MessageBox.Show("请输入IP!"); 49 return; 50 } 51
52 //开启一个子线程,连接到服务器
53 clientThread = new Thread(new ThreadStart(ConnectToServer)); 54 clientThread.Start(); 55 } 56
57 private void ConnectToServer() 58 { 59 byte[] data = new byte[1024]; 60
61 //网络地址和服务端口的组合称为端点,IPEndPoint类表示这个端口
62 IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(this.IP_textBox1.Text), int.Parse(this.Port_textBox2.Text)); 63
64 //初始化Socket
65 clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 66
67 //将套接字与远程服务器地址相连
68 try
69 { 70 //连接到服务器
71 clientSocket.Connect(ipep); 72 } 73 catch(SocketException ex) 74 { 75 MessageBox.Show("connect error:" + ex.Message); 76 } 77 } 78 } 79 }
运行效果: