您的位置:首页 > 编程语言 > C#

第一次C#实验--编程分析

2017-10-04 22:48 501 查看
第一次机电控制上机实验,有点没太理顺到底在做什么,于是就把上机操作拷下来,仔细分析分析。

实验主要完成的任务其实很简单,就是控制电机转动,从而使丝杠旋转,然后测出物体速度、位移,并且使其在最左端最右端停止运动。

这是代码:

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,那么对于本菜鸟来说区别就只剩范围不同了


Pulse_new = ENC7480.Enc7480_Get_Encoder(0);
赋值,很奇怪,因为大框架是学长给的,当时也没有弄明白,刚刚查了一下官方文档,这个函数返还的是long型的,但

……无伤大雅啦,该函数功能就是读取指定编码器的计数值,嗯,代码中的0号的确是之前初始化的,没有错


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相类似,或者与之前重复了,就不再累述,主要是自娱自乐的累了,想歇会儿了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: