第一次C#实验--编程分析
2017-10-04 22:48
501 查看
第一次机电控制上机实验,有点没太理顺到底在做什么,于是就把上机操作拷下来,仔细分析分析。
实验主要完成的任务其实很简单,就是控制电机转动,从而使丝杠旋转,然后测出物体速度、位移,并且使其在最左端最右端停止运动。
这是代码:
有点晕……慢慢看:
首先当然是定义变量了
https://baike.baidu.com/item/%E5%8F%A5%E6%9F%84/3527587?fr=aladdin
初始化
载入form1,此时执行的是禁止按钮3、4,防止在未载入设备时对空间进行操作
命令的积累:.Enabled 按钮的启动关闭。
按钮1的操作:
首先创建PCI8620对象设备,输入序号为0;
然后检查是否建立成功·,成功则消息窗口显示“Yes”,失败则显示“NO”,很好理解。
按钮2的功能:
当然设备初始化成功后后续操作便可以进行了,按钮3、4也就可以打开了,然后打开计时器,计时器在窗口中设定的是100ms,也就是说0.1m采集一次。
void Enc7480_Set_Encoder(WORD axis, value); //将输入编码器初始化为value值,向代码中是将第0轴编码器记数值设为0;
void Enc7480_Count_Config(WORD axis, WORD mode);//设置编码器计数模式,
官方文件解释的很有意思,其中给的例子中axis=1为y轴,那么不出意外0是指x轴喽?这个倒是与实验相吻合;
官方给了四种模式:0—对方向脉冲信号计数; 1—1 倍 AB 相计数 ;2—2 倍 AB 相计数 ;3—4 倍 AB 相计数,好吧……我不太懂,不过官方给的建议是使用模式3,不过
实验时却是使用的0,无所谓,不太懂了,记住,按着学长之的路走就好……
计时器开始工作了:
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/smile.gif)
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/quiet.gif)
……无伤大雅啦,该函数功能就是读取指定编码器的计数值,嗯,代码中的0号的确是之前初始化的,没有错
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/laugh.gif)
为什么我搜byte先出来的是JAVA?这种数组就是一堆0-255范围内的整形无符号数字,此处是要拿这个记录编码器信息?从后面看是这样的。
PCI8620.PCI8620_GetDeviceDI(PCI8620_h, bites);这个函数没有查到,但是大概可以估计到是将该设备检测值输出到bites数组中。
//bites[6]==0 中间
//radioButton1.Enabled = true;
//bites[7]==0 左边 —>停止
//bites[9]==0 右边 —>停止
if (bites[7] == 0)
{
radioButton1.Checked = true;
radioButton2.Checked = false;
radioButton3.Checked = false;
timer1.Enabled=false;
PCI8620.PCI8620_WriteDeviceDA(PCI8620_h, 0x00, 0, 0);
PCI8620.PCI8620_WriteDeviceDA(PCI8620_h, 0x00, 0, 1);
}
else if (bites[9] == 0)
{
radioButton3.Checked = true;
radioButton1.Checked = false;
radioButton2.Checked = false;
PCI8620.PCI8620_WriteDeviceDA(PCI8620_h, 0x00, 0, 0);
PCI8620.PCI8620_WriteDeviceDA(PCI8620_h, 0x00, 0, 1);
}
else if (bites[6] == 0)
{
radioButton2.Checked = true;
radioButton1.Checked = false;
radioButton3.Checked = false;
}
x2 = x1;很明显这些语句一方面是控制三个radioButton的亮暗,还有就是计数器的操作,我应该是在bites[9]==0是忘记对计时器操作了。
对于PCI8620_WriteDeciceDA函数,我只能很无奈的说老师没给说明书,不够大体上输入是清晰的,定义的IntPtr(该设备)+什么东西(有点像地址)+是否有电压+电压输入方向。
后面要实现的基本和以前学过的C与MATLAB相类似,或者与之前重复了,就不再累述,主要是自娱自乐的累了,想歇会儿了
实验主要完成的任务其实很简单,就是控制电机转动,从而使丝杠旋转,然后测出物体速度、位移,并且使其在最左端最右端停止运动。
这是代码:
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 Sys; using csENC7480; namespace WindowsFormsApplication1 { public partial class Form1 : Form { IntPtr PCI8620_h; double x2=0; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { button3.Enabled = false; button4.Enabled = false; } private void button1_Click(object sender, EventArgs e) { PCI8620_h=PCI8620.PCI8620_CreateDevice(0); if (PCI8620_h == (IntPtr)0) { MessageBox.Show("NO"); } else { MessageBox.Show("Yes"); } } private void button2_Click(object sender, EventArgs e) { if (ENC7480.Enc7480_Init() == 0) { MessageBox.Show("No"); } else { MessageBox.Show("Yes"); button3.Enabled = true; button4.Enabled = true; timer1.Enabled = true; } ENC7480.Enc7480_Count_Config(0, 1); ENC7480.Enc7480_Set_Encoder(0, 0); } private void timer1_Tick(object sender, EventArgs e) { Int32 Pulse_new = 0; Pulse_new = ENC7480.Enc7480_Get_Encoder(0); double x1,v; x1 = Pulse_new * 0.002; v = (x1 - x2) / 0.1; label6.Text = x1.ToString(); label8.Text = v.ToString(); byte[] bites = new byte[16]; PCI8620.PCI8620_GetDeviceDI(PCI8620_h, bites); //bites[6]==0 中间 //radioButton1.Enabled = true; //bites[7]==0 左边 —>停止 //bites[9]==0 右边 —> if (bites[7] == 0) { radioButton1.Checked = true; radioButton2.Checked = false; radioButton3.Checked = false; timer1.Enabled=false; PCI8620.PCI8620_WriteDeviceDA(PCI8620_h, 0x00, 0, 0); PCI8620.PCI8620_WriteDeviceDA(PCI8620_h, 0x00, 0, 1); } else if (bites[9] == 0) { radioButton3.Checked = true; radioButton1.Checked = false; radioButton2.Checked = false; PCI8620.PCI8620_WriteDeviceDA(PCI8620_h, 0x00, 0, 0); PCI8620.PCI8620_WriteDeviceDA(PCI8620_h, 0x00, 0, 1); } else if (bites[6] == 0) { radioButton2.Checked = true; radioButton1.Checked = false; radioButton3.Checked = false; } x2 = x1; } private void button3_Click(object sender, EventArgs e) { double v = 0; int direct = 0; try { v = Convert.ToDouble(textBox1.Text); } catch { MessageBox.Show("The v is not true.(-5V~+5V)"); return; } if (v <= 0) { v = -v; direct = 1; } PCI8620.PCI8620_WriteDeviceDA(PCI8620_h, 0x00, 0, 1 - direct); v = Math.Min(v, 5); short v_write = (short)(v / 5 * 4095); PCI8620.PCI8620_WriteDeviceDA(PCI8620_h, 0x00, v_write, direct); } private void button4_Click(object sender, EventArgs e) { PCI8620.PCI8620_WriteDeviceDA(PCI8620_h, 0x00, 0, 0); PCI8620.PCI8620_WriteDeviceDA(PCI8620_h, 0x00, 0, 1); } } }
有点晕……慢慢看:
首先当然是定义变量了
IntPtr PCI8620_h; double x2=0;x2不解释,后边用到再说。定义一个IntPtr PCI8620_h,该类型主要用C#调用WIN32 API(Application Programming Interface)时,我感觉百度中的解释对于理解上机实验的程序是足够了:
https://baike.baidu.com/item/%E5%8F%A5%E6%9F%84/3527587?fr=aladdin
初始化
public Form1() { InitializeComponent(); }
载入form1,此时执行的是禁止按钮3、4,防止在未载入设备时对空间进行操作
private void Form1_Load(object sender, EventArgs e) { button3.Enabled = false; button4.Enabled = false; }
命令的积累:.Enabled 按钮的启动关闭。
按钮1的操作:
private void button1_Click(object sender, EventArgs e) { PCI8620_h=PCI8620.PCI8620_CreateDevice(0); if (PCI8620_h == (IntPtr)0) { MessageBox.Show("NO"); } else { MessageBox.Show("Yes"); } }
首先创建PCI8620对象设备,输入序号为0;
然后检查是否建立成功·,成功则消息窗口显示“Yes”,失败则显示“NO”,很好理解。
按钮2的功能:
private void button2_Click(object sender, EventArgs e) { if (ENC7480.Enc7480_Init() == 0) { MessageBox.Show("No"); } else { MessageBox.Show("Yes"); button3.Enabled = true; button4.Enabled = true; timer1.Enabled = true; } ENC7480.Enc7480_Count_Config(0, 1); ENC7480.Enc7480_Set_Encoder(0, 0); }对·ENC7480进行初始化,并且同时利用其返回值进行成功性验证,最近见的好多程序都是这样的,初始化,利用初始化所使用的函数直接进行有效性的验证,很节省代码,这要建立在对于该函数了解的基础上,应该刻意向这种风格发展。
当然设备初始化成功后后续操作便可以进行了,按钮3、4也就可以打开了,然后打开计时器,计时器在窗口中设定的是100ms,也就是说0.1m采集一次。
void Enc7480_Set_Encoder(WORD axis, value); //将输入编码器初始化为value值,向代码中是将第0轴编码器记数值设为0;
void Enc7480_Count_Config(WORD axis, WORD mode);//设置编码器计数模式,
官方文件解释的很有意思,其中给的例子中axis=1为y轴,那么不出意外0是指x轴喽?这个倒是与实验相吻合;
官方给了四种模式:0—对方向脉冲信号计数; 1—1 倍 AB 相计数 ;2—2 倍 AB 相计数 ;3—4 倍 AB 相计数,好吧……我不太懂,不过官方给的建议是使用模式3,不过
实验时却是使用的0,无所谓,不太懂了,记住,按着学长之的路走就好……
计时器开始工作了:
private void timer1 4000 _Tick(object sender, EventArgs e)以我三脚猫的JAVA功底(笑而不语,囫囵吞枣,瞎搞一通),这种函数名都是有特定功能的,有这个,则会执行某种特定步骤。
Int32 Pulse_new = 0;定义了一个新变量,Int32类型?什么鬼?上网一查:Int32=int, int64=long, int16= short,那么对于本菜鸟来说区别就只剩范围不同了
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/smile.gif)
Pulse_new = ENC7480.Enc7480_Get_Encoder(0);赋值,很奇怪,因为大框架是学长给的,当时也没有弄明白,刚刚查了一下官方文档,这个函数返还的是long型的,但
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/quiet.gif)
……无伤大雅啦,该函数功能就是读取指定编码器的计数值,嗯,代码中的0号的确是之前初始化的,没有错
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/laugh.gif)
double x1,v; x1 = Pulse_new * 0.002; v = (x1 - x2) / 0.1;开始算数了,x2的作用开始初显,他应该是记录上一时刻的位移,然后计算速度,0.1是0.1毫秒,0.002是光栅间隔(好像是这么叫,反正是一格0.002m)。
label6.Text = x1.ToString(); label8.Text = v.ToString();文本框不能直接输出double类型,所以需要转换为字符串。
byte[] bites = new byte[16];
为什么我搜byte先出来的是JAVA?这种数组就是一堆0-255范围内的整形无符号数字,此处是要拿这个记录编码器信息?从后面看是这样的。
PCI8620.PCI8620_GetDeviceDI(PCI8620_h, bites);这个函数没有查到,但是大概可以估计到是将该设备检测值输出到bites数组中。
//bites[6]==0 中间
//radioButton1.Enabled = true;
//bites[7]==0 左边 —>停止
//bites[9]==0 右边 —>停止
if (bites[7] == 0)
{
radioButton1.Checked = true;
radioButton2.Checked = false;
radioButton3.Checked = false;
timer1.Enabled=false;
PCI8620.PCI8620_WriteDeviceDA(PCI8620_h, 0x00, 0, 0);
PCI8620.PCI8620_WriteDeviceDA(PCI8620_h, 0x00, 0, 1);
}
else if (bites[9] == 0)
{
radioButton3.Checked = true;
radioButton1.Checked = false;
radioButton2.Checked = false;
PCI8620.PCI8620_WriteDeviceDA(PCI8620_h, 0x00, 0, 0);
PCI8620.PCI8620_WriteDeviceDA(PCI8620_h, 0x00, 0, 1);
}
else if (bites[6] == 0)
{
radioButton2.Checked = true;
radioButton1.Checked = false;
radioButton3.Checked = false;
}
x2 = x1;很明显这些语句一方面是控制三个radioButton的亮暗,还有就是计数器的操作,我应该是在bites[9]==0是忘记对计时器操作了。
对于PCI8620_WriteDeciceDA函数,我只能很无奈的说老师没给说明书,不够大体上输入是清晰的,定义的IntPtr(该设备)+什么东西(有点像地址)+是否有电压+电压输入方向。
后面要实现的基本和以前学过的C与MATLAB相类似,或者与之前重复了,就不再累述,主要是自娱自乐的累了,想歇会儿了
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/titter.gif)
相关文章推荐
- 0916 编程实验一 词法分析程序 总结
- C#编程基础 实验(1)
- C#类型反射、晚期绑定、特性编程的使用背景与分析
- C#编程实现朴素贝叶斯算法下的情感分析
- C#编程基础 实验(2)
- 0916 编程实验一 词法分析程序
- 第一次C#界面编程备忘总结
- C#编程基础 实验(3),
- 0916 编程实验一 词法分析程序
- 0916 编程实验一 词法分析程序
- 如何:使用 Split 方法分析字符串(C# 编程指南)
- 编程实验一 词法分析程序
- 0916 编程实验一 词法分析程序
- C#编程之SQL语句语法错误分析(一)
- 朴素贝叶斯算法下的情感分析——C#编程实现
- C#强化系列文章三:实验分析C#中三种计时器使用异同点
- 王爽 汇编语言第二版 实验9 根据材料编程 代码及分析
- 实验分析C#中三种计时器使用异同点
- C#强化系列文章三:实验分析C#中三种计时器使用异同点
- WinCE 编程实验(第八章 动态链接库的载入分析)