当前位置: 首页 > article >正文

C#收集SMD零件计数器数料机

工厂为了提高效率有的场景下会使用数料机来完成高效重复的工作,原理就是通过转盘转动计算转动距离,间距不等来实现计数。常用的SMD零件计数器 通讯有串口方式,通过指令发送获取当前计数,打印按钮触发也会发送打印信息到PC,上位可以根据指令获取进行库存抵扣,并触发打印。

using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using TestTool.Utility;
using TestTool.Utility.LoggerHelper;

namespace SMDCountApp
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();

            CommonRedisHelper.InitRedis(AppConfig.Config.RedisUrl);
            List<string> intervals = new List<string>();
            // 初始化间距
            for (var i = 2; i < 50; i += 2)
            {
                intervals.Add(i.ToString());
            }
            CbxInterval.DataSource = intervals;
            CbxInterval.Text = "4";
            BtnRun_Click_1(null,null);
        }

        private void InitSerialport() {
            var log = GlobalConstant.ServiceProvider.GetService<TPLLogger>();
            try
            {
                var interval = CbxInterval.Text.ToInt();
                if (string.IsNullOrEmpty(AppConfig.Config.ComPort))
                {
                    AppConfig.Config.ComPort = SerialPortHelper.GetSerialPortList().Last();
                }
                // CbxCheck.SelectedIndex = 0;
                serialPortHelper = new SerialPortHelper(AppConfig.Config.ComPort, 9600, SerialParity.None, 8, StopBit.One);
                serialPortHelper.Connect();
                serialPortHelper.DataReceiveAction = (data) =>
                {
                    int value = data.ToInt();
                    value = value + AppConfig.Config.AddCount;
           
                    // 换算规则 4mm为基础项目 ,2mm*2 
                    var ratio = Convert.ToDouble(interval);
                    var v1 = ratio / 2;
                    var finalCount = value / v1 * 2;
                    this.Invoke(() =>
                    {
                        this.LTime.Text = DateTime.Now.ToString();
                        this.TxtCount.Text = finalCount.ToInt().ToString();
                    });
                    // 保存Redis
                    if (string.IsNullOrEmpty(AppConfig.Config.SaveRedisKey) == false)
                    {
                        CommonRedisHelper.StringSet(AppConfig.Config.SaveRedisKey, value);
                    }
                };
            }
            catch (Exception ex) {
                log.InsertAsync(new LogModel()
                {
                    LogMessage = $"打开串口{AppConfig.Config.ComPort} 异常 {ex.ToString()}"
                }) ;
            }
        }


        int defaultNum = 4;
        SerialPortHelper serialPortHelper;
        private void BtnRun_Click_1(object sender, EventArgs e)
        {

            try
            {
                if (!isOpen)
                {
                    InitSerialport();
                    Task.Run(async () =>
                    {
                        var log = GlobalConstant.ServiceProvider.GetService<TPLLogger>();

                        while (isOpen)
                        {
                            try
                            {
                                if (serialPortHelper == null || !serialPortHelper.IsConnected())
                                {
                                    InitSerialport();
                                }
                                serialPortHelper.Send("smdread\r\n");
                            }
                            catch (Exception ex)
                            {
                                log.InsertAsync(new LogModel()
                                {
                                    LogMessage = "读取异常:" + ex.Message,
                                });
                                await Task.Delay(500);
                            }
                            await Task.Delay(AppConfig.Config.ReadInterval);
                        }
                    });
                }
                else
                {
                    serialPortHelper.Disconnect();
                }
                ChangeButtonState();

             
            }
            catch (Exception ex)
            {
                MessageBox.Show($"异常:{ex.ToString()}");
            }
        }

        bool isOpen = false;
        private void ChangeButtonState()
        {
            isOpen = !isOpen;
            BtnRun.Text = isOpen ? "关闭" : "打开";
            this.Text = isOpen ? "零件计数器(读取中)" : "零件计数器(已停止)";
        }
    }
}


http://www.kler.cn/a/6581.html

相关文章:

  • 嵌入式C语言,函数指针参数的用法详解!!!
  • 搜索召回概要
  • UDP系统控制器_音量控制、电脑关机、文件打开、PPT演示、任务栏自动隐藏
  • wireshark初认识
  • UE UMG 多级弹出菜单踩坑
  • 网络安全概论——防火墙原理与设计
  • AI大模型争议的背后,是技术以人为本的初衷
  • Tomcat面试题+http面试题+Nginx面试题+常见面试题
  • 读《高效能人士的七个习惯》的一些感悟
  • CSS基础
  • 从零开始实现一个C++高性能服务器框架----协程模块
  • 【MySQL】表的基本约束
  • CSS特殊样式
  • 编译Linux内核一定要知道的几个小Tips
  • 数据结构_第五关:单链表OJ题练习
  • 反射学习总结
  • ABC296E Transition Game
  • c++实现sqlite的增删改查
  • 如何下载ChatGPT-ChatGPT如何写作
  • 中华好诗词(六)
  • ChatGPT 从注册到自建应用
  • Linux【环境变量】
  • Apple Pencil性价比高吗?第三方平替电容笔排名
  • 你好快哦, HikariCP
  • 获取QTableWidget中某个单元格的坐标
  • 互联网摸鱼日报(2023-04-06)