翼度科技»论坛 编程开发 .net 查看内容

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

9

主题

9

帖子

27

积分

新手上路

Rank: 1

积分
27
在ERP系统中,采集一线的生产数据是重要工作之一,而称重计量是企业的核心资产数据,人工计重费时费力,还容易出错,重量数据是否正确,直接影响企业的采购或销售额。基于此,由系统对接电子秤实现自动抓取数据是企业管理的第一步。
电子秤,一般由重量传感器、砝码、底座、仪表等组成。仪表与传感器相连,仪表一般具有记录皮重、归零等基本功能,大部分的仪表厂家都包含了串口数据对接的接口,满足企业的数据采集需求。
采集数据一般使用DB9 RS232串口线,连接电脑的串口,但是现代电脑基本没有保留串口头,可以购买RS232串口转USB转接线。
重点来了,上位机如何采集仪表的重量数据?
根据不同厂家的型号不同数据协议也有所不同,以耀华XK3190-A9这款为例,厂家协议的说明:


协议规定了,起止位、数据位、符号、小数点位置、校验位等参数说明,根据这个协议进行解析就可以形成上位机的重量数据。
核心代码:
  1.         /// <summary>
  2.         /// 耀华A9称重数据
  3.         /// </summary>
  4.         /// <param name="byteFrame">帧数据</param>
  5.         private string ConvertWeight(byte[] byteFrame)
  6.         {
  7.             string value = string.Empty;
  8.             if (byteFrame == null || byteFrame.Length == 0)
  9.             {
  10.                 return value;
  11.             }
  12.             //对接收到的数据进行校验
  13.             byte byteVerif = (byte)(byteFrame[1] ^ byteFrame[2] ^ byteFrame[3] ^ byteFrame[4] ^ byteFrame[5] ^ byteFrame[6] ^ byteFrame[7] ^ byteFrame[8]);
  14.             //校验高位
  15.             byte verifHigh = (byte)((byteVerif & 0xf0) >> 4);
  16.             //校验低位
  17.             byte verifLow = (byte)(byteVerif & 0x0f);
  18.             if (verifHigh > 9)
  19.                 verifHigh = (byte)(verifHigh + 0x37);
  20.             else
  21.                 verifHigh = (byte)(verifHigh + 0x30);
  22.             if (verifLow > 9)
  23.                 verifLow = (byte)(verifLow + 0x37);
  24.             else
  25.                 verifLow = (byte)(verifLow + 0x30);
  26.             if (byteFrame[9] == verifHigh && byteFrame[10] == verifLow)
  27.             {
  28.                 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 };
  29.                 StringBuilder sbDigit = new StringBuilder();
  30.                 //获取称重数据
  31.                 for (int i = 2; i < 8; i++)
  32.                 {
  33.                     if (!listDigit.Contains(byteFrame[i]))
  34.                         byteFrame[i] = (byte)0x30;
  35.                     sbDigit.Append(byteFrame[i] - 0x30);
  36.                 }
  37.                 //小数点位置
  38.                 int dotPos = byteFrame[8] - 0x30;
  39.                 int exponent = -dotPos;
  40.                 double weightValue = Convert.ToInt32(sbDigit.ToString()) * Math.Pow(10, exponent);
  41.                 //负数处理
  42.                 if (byteFrame[1] == 0x2D)
  43.                     weightValue = -weightValue;
  44.                 value = FormatWeight(weightValue);
  45.             }
  46.             return value;
  47.         }
复制代码
同一厂家不同型号的仪表,定义的协议都不一样,这点比较费事。所以在开发这类需求的时候,可以考虑统一封装一个称重基础类,定义初始化、打开串口、关闭串口、获取重量等通用接口,不同型号使用子类实现业务逻辑。这样外层的调用,不需要关心每个仪表型号。如果考虑插播服务,可以使用插件式开发,原理就是使用反射扫描读取外部dll,只要实现了基类就可以热加载称重驱动。
  1.         /// <summary>
  2.         /// 查找外部电子秤驱动
  3.         /// 路径:{root}/
  4.         /// </summary>
  5.         /// <param name="type">类型</param>
  6.         /// <returns></returns>
  7.         public static WeightBase FindExt(string type)
  8.         {
  9.             WeightBase WeighBase = null;
  10.             string dirName = AppDomain.CurrentDomain.BaseDirectory + "plugins\\weight";
  11.             // 扫描外部电子秤驱动
  12.             if (System.IO.Directory.Exists(dirName))
  13.             {
  14.                 var files = System.IO.Directory.GetFiles(dirName);
  15.                 foreach (var file in files)
  16.                 {
  17.                     var ext = file.Substring(file.LastIndexOf('.') + 1);
  18.                     if (ext == "dll" || ext == "exe")
  19.                     {
  20.                         var ass = Assembly.LoadFrom(file);
  21.                         if (ass != null)
  22.                         {
  23.                             WeighBase = Find(ass, type);
  24.                             if (WeighBase != null)
  25.                             {
  26.                                 break;
  27.                             }
  28.                         }
  29.                     }
  30.                 }
  31.             }
  32.             return WeighBase;
  33.         }
  34.         public static bool IsScale(Type t)
  35.         {
  36.             var tWeighBase = typeof(WeightBase);
  37.             if (t.BaseType == null)
  38.                 return false;
  39.             return t.BaseType == tWeighBase || t.BaseType.BaseType == tWeighBase;// 子及孙
  40.         }
复制代码
 
  本人开发的这款PC称重软件就是使用了这种方案,可以在不升级主程序的情况下,随时支持一款仪表驱动。

 
 
 
    出处:http://yizhuqing.cnblogs.com/    多年.NET平台开发经验,擅长物联网各类设备(地磅、轨道秤、RFID等)集成开发。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
来源:https://www.cnblogs.com/yizhuqing/archive/2023/01/05/17027177.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具