文章目的:记录自己从小白-到到小白+的过程,其实还是小白;无非就是控件熟悉了一下。内容或者控件调用太水,不喜勿喷,从学这门语言到实际自己上手做点东西还是比较难。总而言之,全靠同事和度娘。
先定义项目名称吧,三轴螺丝机平台;使用雷赛DMC3000脉冲卡,搭载一个CANIO扩展模块(16输入16输出)。
大致分以下几部分写:IO调试界面设计;电机调试界面设计;登录界面设计;多点位运动以及插补运动;视觉拍照(这个放最后面吧,还没学视觉呢)
一、第一个篇章:IO调试界面设计
这里讲下我自己的思考,或者对于新手如何设计东西吧。我是这样认为的,要认识自己的不足,要汇总手里的资源,每天至少有计划和总结。做这一系列东西之前,我是定一个大致的方案,然后一天一天去啃。这是我这个星期做的计划,其实就是每天开搞的时候写一点点。
一、项目开始,新建窗口,准备资料(雷赛手册,雷赛头文件,DLL文件)。
1、把DLL文件拷贝放置在bin/debug...这个目录文件下,CSDN有很多大神写了这个DLL文件调用方法。拷贝完之后,在解决方案资源管理器中,选择-->引用-->右击添加-->找到对应文件夹的DLL(注意要选择自己电脑位数(32或者64位系统))。
2、把LTDMC.CS这个头文件复制在项目文件夹中,然后再资源管理器中增加LTDMC.CS这个文件
3、再之后在IO界面引用命名空间:using csLTDMC;关于DLL的调用,目前我看到有像我这样直接调用的,也有封装起来,在外部new出来的。第二种的好处就是,在主窗口下new完之后,其他地方直接调用,方便阅读。具体操作我现在也还在学习。
4、我记得当初刚出来工作,大佬说出来的话印象最深的一句就是:我们要站在巨人的肩膀上看世界。所以啥都不会的时候,看手册,看例程,看他人项目源码。打开雷赛例程,一脸问号,甩我好几条街。原来可以批量初始控件,原来还有这种操作。
例程中:Pannal控件内批量初始化Label控件;对应输出增加按键触发事件,增加红、绿控件背景,其他不多说。能学的先学,我这里批量初始化checkBox控件,翻资料一个CANIO模块有16个输入,16个输出。那么就初始化16个输入和16个输出对应的checkBox控件。主控板IO和CAN模块的数量时一样的,那就基本定好一个,其他批量复制了。
//本体IO控件初始化
for (int i = 0; i < checkBoxCount; i++)
{
checkBoxMainInput[i] = new CheckBox();
checkBoxMainInput[i].Name = "IN" + i.ToString();
checkBoxMainInput[i].Text = "IN" + i.ToString();
checkBoxMainInput[i].Width = 50;
if (i < 8)
checkBoxMainInput[i].Location = new Point(50 * i, 22);
if (i >= 8 && i < 16)
checkBoxMainInput[i].Location = new Point(50 * (i - 8), 44);
panel3.Controls.Add(checkBoxMainInput[i]);
}
checkBoxCount是控件数量,设置为16;
if (i < 8) 和 if (i >= 8 && i < 16) 这个是为了排列控件,一行有八个,Location 这个是定义控件位置,第一个参数为窗口横坐标,第二个参数为窗口纵坐标。
panel3.Controls.Add(checkBoxMainInput[i]); 使用Add增加控件,基本上都是需要增加的。
以下是控件初始化完效果:
其实可以做的更好看,比如放置在表格内,然后在表格上分3列,第一列是控件,第二列是IO名称,第三列是IO定义。这个涉及的东西就多了,要上dataTable了。
5、初始化工作准备完之后,有两个工作,一个是初始化板卡,一个是初始化CAN的IO模块。这个放置在主窗口load内了。
short num = LTDMC.dmc_board_init();//获取卡数量
if (num <= 0 || num > 8)
{
MessageBox.Show("初始卡失败!", "出错");
}
ushort _num = 0;
ushort[] cardids = new ushort[8];
uint[] cardtypes = new uint[8];
short res = LTDMC.dmc_get_CardInfList(ref _num, cardtypes, cardids);
LTDMC.dmc_read_inbit(0, 1);if (res != 0)
{
MessageBox.Show("获取卡信息失败!");
}
_CardID = cardids[0];
连接CAN模块
//连接CAN-IO卡
LTDMC.dmc_set_can_state(CardNo, CANCount, CANStatus, CANBaud);
LTDMC.dmc_get_can_state(CardNo, ref GetCANCount, ref GetCANStatus);
6、初始化工作昨晚之后,那就进行IO扫描事件了,这个直接看手册,找到读取,和设置IO的方法,用定时器去扫描即可。下面是读输入IO的状态,最好在初始化是就进行一次读取输入和输出
//本体IO初始扫描
for (ushort i = 0; i < checkBoxCount; i++)
{
short s1 = LTDMC.dmc_read_inbit(CardNo, i); //(CardNo, CANNum, i, ref MyInValue)
if (s1 == 1)
{
checkBoxMainInput[i].Checked = false;
}
else
{
checkBoxMainInput[i].Checked = true;
}
}
for (ushort i = 0; i < checkBoxCount; i++)
{
short s2 = LTDMC.dmc_read_outbit(CardNo, i);
if (s2 == 1)
{
checkBoxMainOutput[i].Checked = false;
}
else
{
checkBoxMainOutput[i].Checked = true;
}
}
然后再IO调试界面的Load里启动定时器,在IO窗口界面增加定时器控件。
private void IOtestForm_Load(object sender, EventArgs e)
{
timer1.Start();.................
}
在定时器控件上进行输入和输出IO的扫描
private void timer1_Tick(object sender, EventArgs e)
{
//本体IO扫描
bool CheckMainOutValue;
for (ushort i = 0; i < checkBoxCount; i++)
{
short s1 = LTDMC.dmc_read_inbit(CardNo, i); //(CardNo, CANNum, i, ref MyInValue)
if (s1 == 1)
{
checkBoxMainInput[i].Checked = false;
}
else
{
checkBoxMainInput[i].Checked = true;
}
}
for (ushort i = 0; i < checkBoxCount; i++)
{
CheckMainOutValue = checkBoxMainOutput[i].Checked;
if (CheckMainOutValue == false)
{
LTDMC.dmc_write_outbit(CardNo, i, 1);
}
else
{
LTDMC.dmc_write_outbit(CardNo, i, 0);
}}
以上就是IO窗口的全部内容了,其实我们只需要放置四个Panel 控件,其他的都是通过代码放置的。说真的,批量化控件基本会是常规操作,比如批量窗口,批量配置文件,批量轴调试界面等等。