首页 > 其他分享 >使用插件式开发称重仪表驱动,RS232串口对接各类地磅秤数据实现ERP管理

使用插件式开发称重仪表驱动,RS232串口对接各类地磅秤数据实现ERP管理

时间:2023-01-05 12:33:55浏览次数:60  
标签:插件 ERP byteFrame 串口 byte verifHigh verifLow 称重

在ERP系统中,采集一线的生产数据是重要工作之一,而称重计量是企业的核心资产数据,人工计重费时费力,还容易出错,重量数据是否正确,直接影响企业的采购或销售额。基于此,由系统对接电子秤实现自动抓取数据是企业管理的第一步。

 

电子秤,一般由重量传感器、砝码、底座、仪表等组成。仪表与传感器相连,仪表一般具有记录皮重、归零等基本功能,大部分的仪表厂家都包含了串口数据对接的接口,满足企业的数据采集需求。

 

 

采集数据一般使用DB9 RS232串口线,连接电脑的串口,但是现代电脑基本没有保留串口头,可以购买RS232串口转USB转接线。

 

重点来了,上位机如何采集仪表的重量数据?

根据不同厂家的型号不同数据协议也有所不同,以耀华XK3190-A9这款为例,厂家协议的说明:

协议规定了,起止位、数据位、符号、小数点位置、校验位等参数说明,根据这个协议进行解析就可以形成上位机的重量数据。

核心代码:

        /// <summary>
        /// 耀华A9称重数据
        /// </summary>
        /// <param name="byteFrame">帧数据</param>
        private string ConvertWeight(byte[] byteFrame)
        {
            string value = string.Empty;
            if (byteFrame == null || byteFrame.Length == 0)
            {
                return value;
            }
            //对接收到的数据进行校验
            byte byteVerif = (byte)(byteFrame[1] ^ byteFrame[2] ^ byteFrame[3] ^ byteFrame[4] ^ byteFrame[5] ^ byteFrame[6] ^ byteFrame[7] ^ byteFrame[8]);
            //校验高位
            byte verifHigh = (byte)((byteVerif & 0xf0) >> 4);
            //校验低位
            byte verifLow = (byte)(byteVerif & 0x0f);

            if (verifHigh > 9)
                verifHigh = (byte)(verifHigh + 0x37);
            else
                verifHigh = (byte)(verifHigh + 0x30);

            if (verifLow > 9)
                verifLow = (byte)(verifLow + 0x37);
            else
                verifLow = (byte)(verifLow + 0x30);

            if (byteFrame[9] == verifHigh && byteFrame[10] == verifLow)
            {
                List<byte> listDigit = new List<byte>() { (byte)0x30, (byte)0x31, (byte)0x32, (byte)0x33, (byte)0x34, (byte)0x35, (byte)0x36, (byte)0x37, (byte)0x38, (byte)0x39 };

                StringBuilder sbDigit = new StringBuilder();
                //获取称重数据
                for (int i = 2; i < 8; i++)
                {
                    if (!listDigit.Contains(byteFrame[i]))
                        byteFrame[i] = (byte)0x30;

                    sbDigit.Append(byteFrame[i] - 0x30);
                }
                //小数点位置
                int dotPos = byteFrame[8] - 0x30;
                int exponent = -dotPos;
                double weightValue = Convert.ToInt32(sbDigit.ToString()) * Math.Pow(10, exponent);
                //负数处理
                if (byteFrame[1] == 0x2D)
                    weightValue = -weightValue;
                value = FormatWeight(weightValue);
            }
            return value;
        }

同一厂家不同型号的仪表,定义的协议都不一样,这点比较费事。所以在开发这类需求的时候,可以考虑统一封装一个称重基础类,定义初始化、打开串口、关闭串口、获取重量等通用接口,不同型号使用子类实现业务逻辑。这样外层的调用,不需要关心每个仪表型号。如果考虑插播服务,可以使用插件式开发,原理就是使用反射扫描读取外部dll,只要实现了基类就可以热加载称重驱动。

        /// <summary>
        /// 查找外部电子秤驱动
        /// 路径:{root}/
        /// </summary>
        /// <param name="type">类型</param>
        /// <returns></returns>
        public static WeightBase FindExt(string type)
        {
            WeightBase WeighBase = null;

            string dirName = AppDomain.CurrentDomain.BaseDirectory + "plugins\\weight";
            // 扫描外部电子秤驱动
            if (System.IO.Directory.Exists(dirName))
            {

                var files = System.IO.Directory.GetFiles(dirName);
                foreach (var file in files)
                {
                    var ext = file.Substring(file.LastIndexOf('.') + 1);
                    if (ext == "dll" || ext == "exe")
                    {
                        var ass = Assembly.LoadFrom(file);
                        if (ass != null)
                        {
                            WeighBase = Find(ass, type);
                            if (WeighBase != null)
                            {
                                break;
                            }
                        }
                    }
                }
            }
            return WeighBase;
        }
        public static bool IsScale(Type t)
        {
            var tWeighBase = typeof(WeightBase);
            if (t.BaseType == null)
                return false;
            return t.BaseType == tWeighBase || t.BaseType.BaseType == tWeighBase;// 子及孙
        }

 

  本人开发的这款PC称重软件就是使用了这种方案,可以在不升级主程序的情况下,随时支持一款仪表驱动。

  有兴趣的可以看下这个:基于Chromium开发的称重软件,集称重、计价、打印于一体,支持耀华、顶尖等多个厂家设备型号

 

 

 

标签:插件,ERP,byteFrame,串口,byte,verifHigh,verifLow,称重
From: https://www.cnblogs.com/yizhuqing/p/17027177.html

相关文章

  • PhoneGap的Android端插件开发
    来自51cto:​​http://mobile.51cto.com/android-309311.htm​​ 前面一篇文章《​​移动APP之跨平台解决方案​​》介绍了一种跨平台的解决方案,即用开发webapp的方式......
  • 重磅直播 | CenterPoint:三维点云目标检测算法梳理及最新进展(CVPR2021)
    本期由德州大学奥斯汀分校在读生尹天为分享,分享的主题为《CenterPoint:三维点云目标检测算法梳理及最新进展(CVPR2021)》,主讲人会对该领域的核心和主流技术进行详细讲解,欢迎大......
  • Jenkins通过安装ssh插件实现构建后推送到其它服务器
    参考博客:https://www.cnblogs.com/zhchoutai/p/8869898.html一、PublishOverSSH 安装   因为我这里已经安装了PublishOverSSH 所以在installdeplugins中可......
  • STM32串口代码
    介绍在usart.c中进行了:usart的初始化发送字符串函数的编写printf和scanf的C库重定向中断中根据STM32接受到的信息进行开灯和关灯操作在led.c中进行了:led的GPIO的......
  • ubuntu下安装mysql + qt编译mysql插件
    sudoapt-getinstallmysql-serverapt-getisntallmysql-clientsudoapt-getinstalllibmysqlclient-dev安装成功后可以看一下有没有进程在监听sudonetstat-tap......
  • Tiktok shop上货工具,妙手ERP上货
    随着一些跨境电商平台的没落,近年来海外版TikTok作为新秀的电商平台正以黑马的趋势跻身跨境电商平台的主流。TikTokShop全面开放入驻后,吸引了不少中国商家入驻。对于中国......
  • 微慕积分商城插件
    微信小程序专业版在第一个正式版​发布的时候,就推出了积分系统。用户登录小程序、签到、发表文章、评论文章、发表话题、回复话题、点赞、赞赏​、付费阅读后都可以获得相应......
  • 02-插件介绍
    插件下载地址#1.手动在APP里创建templates文件(html写在里面)#2.在app中创建static文件夹:新建css/js(jquery)/img(图片)/plugins(插件)#3.下载......
  • SiteFactory编辑器支持PowerPoint粘贴
    ​ 当前功能基于PHP,其它语言流程大致相同 1.新增上传wordjson配置在ueditor\php\config.json中新增如下配置:     /* 上传word配置 */    "wordAction......
  • 小程序组件和小程序插件的差别是什么?
    一直以为小程序组件和小程序插件是一回事,只是措辞不一样,导致造成乌龙,其实完全是两回事,插件是可以直接提供服务的,组件是给开发者提供的轮子,不能直接提供服务。先看看微信是如......