CL3000是基恩士推出的同轴激光位移传感器。
相对于旧有型号的H025,H028红色点激光来说,还是有其优势的。具体可以参考使用手册。
这里勇哥只是附上测试用的代码,供大家参考。
using CL3_IF_DllSample; using Common; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using System.IO; using System.Diagnostics; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public MotionCard dmc = new MotionCard(); private int CurrentDeviceId = 0; bool netIsConnect = false; private const int MaxRequestDataLength = 512000; private const int MaxMeasurementDataCountPerTime = 100; private const int MaxSequenceMeasurementData = 100000; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { CL3IF_ETHERNET_SETTING ethernetSetting = new CL3IF_ETHERNET_SETTING(); ethernetSetting.ipAddress = new byte[4]; var ipstr = textBox1.Text.Split('.'); if (!byte.TryParse(ipstr[0], out ethernetSetting.ipAddress[0])) { MessageBox.Show(this, "ipAddress firstSegment is Invalid Value"); return; } if (!byte.TryParse(ipstr[1], out ethernetSetting.ipAddress[1])) { MessageBox.Show(this, "ipAddress secondSegment is Invalid Value"); return; } if (!byte.TryParse(ipstr[2], out ethernetSetting.ipAddress[2])) { MessageBox.Show(this, "ipAddress thirdSegment is Invalid Value"); return; } if (!byte.TryParse(ipstr[3], out ethernetSetting.ipAddress[3])) { MessageBox.Show(this, "ipAddress fourthSegment is Invalid Value"); return; } if (!ushort.TryParse(textBox2.Text, out ethernetSetting.portNo)) { MessageBox.Show(this, "ipAddress Port number is Invalid Value"); return; } ethernetSetting.reserved = new byte[2]; ethernetSetting.reserved[0] = 0x00; ethernetSetting.reserved[1] = 0x00; int returnCode = NativeMethods.CL3IF_OpenEthernetCommunication(CurrentDeviceId, ref ethernetSetting, 10000); var f1 = dmc.Init(); if (returnCode == 0) { netIsConnect = true && f1; } else netIsConnect = false; richTextBox1.AppendText (returnCode.ToString()); } private void CommunicationClose(int deviceId) { int returnCode = NativeMethods.CL3IF_CloseCommunication(deviceId); } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { CommunicationClose(CurrentDeviceId); } private void button3_Click(object sender, EventArgs e) { //批量采集数据 if (!netIsConnect) MessageBox.Show("先初始化激光!"); var avg = getData(10).Average(); richTextBox1.AppendText("\r\n"+avg.ToString("0.00000")); } private double calThick(double 陶瓷片A系数,double 陶瓷片标准值, double 上下激光头的和) { return 上下激光头的和 + 陶瓷片标准值 - 陶瓷片A系数; } /// <summary> /// 取激光数据 /// </summary> /// <returns></returns> private List<double> getData(uint dataSum) { CL3IF_MEASUREMENT_DATA[] trendDataList = new CL3IF_MEASUREMENT_DATA[MaxSequenceMeasurementData]; byte[] buffer = new byte[MaxRequestDataLength]; uint nextIndex = 0; uint obtainedDataCount = 0; uint indexGet = 0; uint sum = dataSum; var resData = new List<double>(); uint index = 0; int res1 = NativeMethods.CL3IF_GetTrendIndex(CurrentDeviceId, out index); if (res1 != NativeMethods.CL3IF_RC_OK) { throw new ArgumentNullException("error"); } indexGet = index; CL3IF_OUTNO outTarget = 0; using (PinnedObject pin = new PinnedObject(buffer)) { int res = -1; do { res = NativeMethods.CL3IF_GetTrendData(CurrentDeviceId, indexGet, sum, out nextIndex, out obtainedDataCount, out outTarget, pin.Pointer); Thread.Sleep(20); } while (obtainedDataCount < sum); if (res != NativeMethods.CL3IF_RC_OK) { throw new ArgumentNullException("error"); } List<int> outTargetList = ConvertOutTargetList(outTarget); int readPosition = 0; int trendDataCount = 0; for (uint i = 0; i < obtainedDataCount; i++) { CL3IF_MEASUREMENT_DATA measurementData = new CL3IF_MEASUREMENT_DATA(); measurementData.outMeasurementData = new CL3IF_OUTMEASUREMENT_DATA[outTargetList.Count]; measurementData.addInfo = (CL3IF_ADD_INFO)Marshal.PtrToStructure(pin.Pointer + readPosition, typeof(CL3IF_ADD_INFO)); readPosition += Marshal.SizeOf(typeof(CL3IF_ADD_INFO)); for (int j = 0; j < outTargetList.Count; j++) { measurementData.outMeasurementData[j] = (CL3IF_OUTMEASUREMENT_DATA)Marshal.PtrToStructure(pin.Pointer + readPosition, typeof(CL3IF_OUTMEASUREMENT_DATA)); readPosition += Marshal.SizeOf(typeof(CL3IF_OUTMEASUREMENT_DATA)); } trendDataList[i] = measurementData; var v1 = measurementData.outMeasurementData[0].measurementValue; if (v1 < 0 || v1>60000) resData.Add(0); else resData.Add(double.Parse("0." + v1.ToString())); trendDataCount++; } return resData; } } private void OutputLogMessage(string msg) { richTextBox1.AppendText(msg); } private List<int> ConvertOutTargetList(CL3IF_OUTNO outTarget) { byte mask = 1; List<int> outList = new List<int>(); for (int i = 0; i < NativeMethods.CL3IF_MAX_OUT_COUNT; i++) { if (((ushort)outTarget & mask) != 0) { outList.Add(i + 1); } mask = (byte)(mask << 1); } return outList; } double 系数A = 0; private void button4_Click(object sender, EventArgs e) { //读陶瓷片A系数 if (!netIsConnect) MessageBox.Show("先初始化激光!"); 系数A = 取陶瓷片系数(int.Parse(tbTcpPos.Text)); richTextBox1.AppendText("\r\n" + 系数A.ToString("0.00000")); } private void button5_Click(object sender, EventArgs e) { //读测量物厚度 if (!netIsConnect) MessageBox.Show("先初始化激光!"); goSpecifyPT(int.Parse(tbClwPos.Text)); Thread.Sleep(1000); var avg = getData(10).Average(); richTextBox1.AppendText("\r\n" + calThick(系数A, 0.50, avg).ToString("0.0000")); } public double 取陶瓷片系数(int pos) { goSpecifyPT(pos); 系数A = getData(10).Average(); return 系数A; } public void ResetToHome() { dmc.Stop(); //dmc.Home(0); dmc.Home(0, 0, 15, 3); } public void goSpecifyPT(int position) { dmc.SetMoveSpeed(0, 199000); dmc.A_Move(0, position); dmc.waitStop(0); } private void button2_Click(object sender, EventArgs e) { int pos = 0; int.TryParse(tbDis.Text, out pos); goSpecifyPT(pos); } private void button6_Click(object sender, EventArgs e) { ResetToHome(); } private void button7_Click(object sender, EventArgs e) { dmc.Stop(0); } private void Form1_Load(object sender, EventArgs e) { } private void button8_Click(object sender, EventArgs e) { //var ary1 = new List<double>(); //for (int i = 0; i < 100;i++ ) //{ // ary1.Add(i + 1); //} //saveSegmentData(ary1, 0.5, 10); //return; var dataAry = new List<double>(); Stopwatch sb1 = new Stopwatch(); float speed = 120000; float.TryParse(tbSpeed.Text, out speed); dmc.SetMoveSpeed(0, speed); var xs= 取陶瓷片系数(45); dmc.A_Move(0, 80); dmc.waitStop(0); dmc.A_Move(0, 430); sb1.Restart(); for (int i = 0; i < 2; i++) { dataAry.AddRange(getData(7677)); } var s1 = sb1.ElapsedMilliseconds; sb1.Stop(); saveCSV(dataAry,xs,checkBox2.Checked,"go"); dmc.waitStop(0); richTextBox1.AppendText("\r\n OK."); } /// <summary> /// 保存分段数据 /// </summary> /// <param name="data">一个单边的数据</param> /// <param name="xs">系数A</param> /// <param name="ds">分段数量</param> private void saveSegmentData(List<double> data,double xs,int ds) { double d = 0; var ary1 = new List<double>(); var resAry = new List<double>(); foreach(var m in data) { d=calThick(xs, 0.5, m); if (d <= 0) continue; ary1.Add(d); } var s1 = ary1.Count / ds; var tmp1 = new List<double>(); for(int i=0;i<ds;i++) { tmp1.Clear(); for (int k = 0; k < s1; k++) { tmp1.Add(ary1[(i*s1)+k]); } resAry.Add(getAverageNoZero(tmp1)); } DateTime t = DateTime.Now; StringBuilder sb1 = new StringBuilder(); var path = string.Format("D:\\segData_{0}.csv", t.Year + "_" + t.Month + "_" + t.Day); try { foreach (var m in resAry) { sb1.Append(m.ToString("0.00000")); sb1.Append(","); } sb1.Append(Environment.NewLine); File.AppendAllText(path, sb1.ToString()); } catch (Exception ex) { } } private void saveCSV(List<double> data,double xs,bool f,string msg) { DateTime t=DateTime.Now; StringBuilder sb1 = new StringBuilder(); var path = string.Format("D:\\data_{0}.csv",t.Year+"_"+t.Month+"_"+t.Day); try { sb1.Append(msg + ","); foreach (var m in data) { if (f) { sb1.Append(calThick(xs, 0.5, m).ToString("0.00000")); } else { sb1.Append(m.ToString("0.00000")); } sb1.Append(","); } sb1.Append(Environment.NewLine); File.AppendAllText(path,sb1.ToString()); } catch(Exception ex) { } } bool isRealDis = false; private void checkBox1_CheckedChanged(object sender, EventArgs e) { if (checkBox1.Checked && 系数A != 0) { timer1.Interval = 100; timer1.Enabled = true; isRealDis = true; } else { timer1.Enabled = false; label1.Text = "0"; isRealDis = false; } } /// <summary> /// 计算平均值,乎略0的元素 /// </summary> /// <returns></returns> private double getAverageNoZero(List<double> data) { var ary1 = new List<double>(); foreach(var m in data) { if (m != 0) ary1.Add(m); } if (ary1.Count < 1) return 0; return ary1.Average(); } private void timer1_Tick(object sender, EventArgs e) { if (isRealDis) { var realDisThickData = getAverageNoZero(getData(10)); label1.Text = calThick(系数A,0.5, realDisThickData).ToString("0.00000"); } } private void button9_Click(object sender, EventArgs e) { var m = dmc.getpos()/1000; int pos = 1; if (int.TryParse(textBox3.Text, out pos)) { goSpecifyPT(m + pos); } } private void button10_Click(object sender, EventArgs e) { var m = dmc.getpos()/1000; int pos = 1; if (int.TryParse(textBox3.Text, out pos)) { goSpecifyPT(m -pos); } } private void button11_Click(object sender, EventArgs e) { timer2.Interval = 12000; timer2.Enabled = true; timer2.Start(); } private void timer2_Tick(object sender, EventArgs e) { var dataAry = new List<double>(); Stopwatch sb1 = new Stopwatch(); sb1.Start(); float speed = 120000; float.TryParse(tbSpeed.Text, out speed); dmc.SetMoveSpeed(0, speed); var f1 = checkBox2.Checked; var xs = 取陶瓷片系数(45); dmc.A_Move(0, 80); dmc.waitStop(0); dmc.A_Move(0, 430); dataAry.Clear(); for (int i = 0; i < 2; i++) { dataAry.AddRange(getData(7677)); } var s1 = sb1.ElapsedMilliseconds; saveSegmentData(dataAry, xs, 10); saveCSV(dataAry, xs, f1,"go"); dmc.waitStop(0); dataAry.Clear(); dmc.A_Move(0, 100); for (int i = 0; i < 2; i++) { dataAry.AddRange(getData(7677)); } dataAry.Reverse(); saveSegmentData(dataAry, xs, 10); saveCSV(dataAry, xs, f1,"back"); dmc.waitStop(0); richTextBox1.AppendText("\r\n"+sb1.ElapsedMilliseconds.ToString()); sb1.Stop(); } private void button12_Click(object sender, EventArgs e) { timer2.Enabled = false; } } public sealed class PinnedObject : IDisposable { private GCHandle _Handle; public IntPtr Pointer { get { return _Handle.AddrOfPinnedObject(); } } public PinnedObject(object target) { _Handle = GCHandle.Alloc(target, GCHandleType.Pinned); } public void Dispose() { _Handle.Free(); _Handle = new GCHandle(); } } }
需要源代码的朋友请下载:
https://download.csdn.net/download/suneggs/12693459
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!
本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群: