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

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

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

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

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

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

核心代码:

///<summary>/// 耀华A9称重数据

///</summary>///<param name="byteFrame">帧数据</param>privatestring 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>publicstatic 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;

}

publicstaticbool IsScale(Type t)

{

var tWeighBase = typeof(WeightBase);

if (t.BaseType == null)

returnfalse;

return t.BaseType == tWeighBase || t.BaseType.BaseType == tWeighBase;// 子及孙

}

  最近开发的一款PC称重软件就是使用了这种方案,可以在不升级主程序的情况下,随时支持一款新的称重仪表驱动。目前已经支持耀华、昌信、顶尖等主流地磅秤、轨道秤设备厂家。

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

  1. .net 插件式开发学习总结

    .NET简谈插件系统开发模式 今天跟大家分享一下我们在日常开发中并不常用的开发模式"插件系统模式",什么叫插件从大一点的概念讲就是我们开发的软件是由很小的模块组成,每一块都能成功的 ...

  2. 基于AppDomain的插件式开发

    很多时候,我们都想使用(开发)USB式(热插拔)的应用,例如,开发一个WinForm应用,并且这个WinForm应用能允许开发人员定制扩展插件,又例如,我们可能维护着一个WinService管理系统, ...

  3. 从零开始实现ASP.NET Core MVC的插件式开发(五) - 插件的删除和升级

    标题:从零开始实现ASP.NET Core MVC的插件式开发(五) - 使用AssemblyLoadContext实现插件的升级和删除 作者:Lamond Lu 地址:https://www.cnb ...

  4. 从零开始实现ASP.NET Core MVC的插件式开发(四) - 插件安装

    标题:从零开始实现ASP.NET Core MVC的插件式开发(四) - 插件安装 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/11343141. ...

  5. 从零开始实现 ASP.NET Core MVC 的插件式开发(九) - 如何启用预编译视图

    标题:从零开始实现 ASP.NET Core MVC 的插件式开发(九) - 升级.NET 5及启用预编译视图 作者:Lamond Lu 地址:https://www.cnblogs.com/lwql ...

  6. 从零开始实现 ASP.NET Core MVC 的插件式开发(七) - 问题汇总及部分问题解决方案...

    标题:从零开始实现 ASP.NET Core MVC 的插件式开发(七) - 问题汇总及部分问题解决方案 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/ ...

  7. 从零开始实现ASP.NET Core MVC的插件式开发(六) - 如何加载插件引用

    标题:从零开始实现ASP.NET Core MVC的插件式开发(六) - 如何加载插件引用. 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/1171 ...

  8. 从零开始实现ASP.NET Core MVC的插件式开发(三) - 如何在运行时启用组件

    标题:从零开始实现ASP.NET Core MVC的插件式开发(三) - 如何在运行时启用组件 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/112 ...

  9. 从零开始实现ASP.NET Core MVC的插件式开发(二) - 如何创建项目模板

    标题:从零开始实现ASP.NET Core MVC的插件式开发(二) - 如何创建项目模板 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/11155 ...

最新文章

  1. 一堆让人惊喜的实用工具,也许你还不知道
  2. 新鲜出炉!20款好看的英文字体下载
  3. subversion for linux redhat as5的安装
  4. js让显示层居中且有遮挡层(IE,火狐,Chrome均可)
  5. c# combobox集合数据不显示_C#实战036:各种泛型的定义和使用详解
  6. 美媒:软银售ARM中国子公司51%股权,暴露美国痛处
  7. Windows下安装 rubyinstaller
  8. 【STM32F429开发板用户手册】第2章 STM32F429的开发环境搭建
  9. 苹果手机各种尺寸详细表以及iPhoneX、iPhone 11、iPhone 12、iPhone 13 屏幕适配,状态栏高度问题
  10. 阿里飞猪搜索技术的应用与创新(v2021-02-03)
  11. ABD — android debug bridge 简略介绍
  12. 建设工程项目全寿命周期管理是指_工程项目全寿命周期管理.ppt
  13. 华为 社招 C语言笔试,华为笔试C语言笔试题之3
  14. python零基础入门最简洁版
  15. 驱动保护进程 句柄降权 杀软自保 游戏破图标技术原理和实现
  16. w ndows8重装,如何重装windows8系统-系统城
  17. css+js简单实现126邮箱注册页面
  18. 晨光BT——强大的资源分享网站
  19. 发展认知科学EEG研究: 新视角与挑战
  20. 主播桌上的麦克风推荐——HyperX QuadCast S声浪加强版RGB麦克风

热门文章

  1. MAC 开机自动连接iPad
  2. 内连接以及外连接的注意事项
  3. 极客专用压缩软件7-Zip
  4. 芯科EmberZNet_ZigBee3.0_EFR32MG开发日记四:ZigBee例程下载至开发套件
  5. 【GNN】图注意力网络GAT(含代码讲解)
  6. oracle19c修改sys密码报错OPW-00029
  7. Http服务传输图片的Python实现
  8. R语言——多重共线性处理
  9. 4.3.1 国外LCA数据库 Foreign LCA Database
  10. vex夹球机器人_下一站,VEX机器人世界锦标赛!