C#编写上位机调试软件-IO调试界面设计

文章目的:记录自己从小白-到到小白+的过程,其实还是小白;无非就是控件熟悉了一下。内容或者控件调用太水,不喜勿喷,从学这门语言到实际自己上手做点东西还是比较难。总而言之,全靠同事和度娘。

  先定义项目名称吧,三轴螺丝机平台;使用雷赛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 控件,其他的都是通过代码放置的。说真的,批量化控件基本会是常规操作,比如批量窗口,批量配置文件,批量轴调试界面等等。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
网络通信是C#上位机开发中非常重要的一部分,下面是C#上位机开发教程中网络通信篇的一些内容: 1.使用Socket进行TCP通信 ```csharp // 服务器端 IPAddress ip = IPAddress.Parse("127.0.0.1"); int port = 8888; TcpListener listener = new TcpListener(ip, port); listener.Start(); Console.WriteLine("服务器已启动,等待客户端连接..."); TcpClient client = listener.AcceptTcpClient(); NetworkStream stream = client.GetStream(); byte[] data = new byte[1024]; int length = stream.Read(data, 0, data.Length); string message = Encoding.UTF8.GetString(data, 0, length); Console.WriteLine("接收到客户端消息:" + message); stream.Write(Encoding.UTF8.GetBytes("服务器已接收到消息"), 0, "服务器已接收到消息".Length); stream.Close(); client.Close(); listener.Stop(); // 客户端 IPAddress ip = IPAddress.Parse("127.0.0.1"); int port = 8888; TcpClient client = new TcpClient(); client.Connect(ip, port); NetworkStream stream = client.GetStream(); string message = "Hello, Server!"; byte[] data = Encoding.UTF8.GetBytes(message); stream.Write(data, 0, data.Length); data = new byte[1024]; int length = stream.Read(data, 0, data.Length); message = Encoding.UTF8.GetString(data, 0, length); Console.WriteLine("接收到服务器消息:" + message); stream.Close(); client.Close(); ``` 2.使用Socket进行UDP通信 ```csharp // 服务器端 IPAddress ip = IPAddress.Parse("127.0.0.1"); int port = 8888; UdpClient server = new UdpClient(port); IPEndPoint remote = new IPEndPoint(IPAddress.Any, 0); byte[] data = server.Receive(ref remote); string message = Encoding.UTF8.GetString(data, 0, data.Length); Console.WriteLine("接收到客户端消息:" + message); server.Send(Encoding.UTF8.GetBytes("服务器已接收到消息"), Encoding.UTF8.GetBytes("服务器已接收到消息").Length, remote); server.Close(); // 客户端 IPAddress ip = IPAddress.Parse("127.0.0.1"); int port = 8888; UdpClient client = new UdpClient(); IPEndPoint remote = new IPEndPoint(ip, port); string message = "Hello, Server!"; byte[] data = Encoding.UTF8.GetBytes(message); client.Send(data, data.Length, remote); data = client.Receive(ref remote); message = Encoding.UTF8.GetString(data, 0, data.Length); Console.WriteLine("接收到服务器消息:" + message); client.Close(); ``` 3.使用HttpWebRequest进行HTTP通信 ```csharp string url = "http://www.example.com"; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "GET"; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream stream = response.GetResponseStream(); StreamReader reader = new StreamReader(stream, Encoding.UTF8); string result = reader.ReadToEnd(); Console.WriteLine(result); reader.Close(); stream.Close(); response.Close(); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值