暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

基于C#脚本MES多版本控制实现方案

1772
  1. 需求背景

MES系统的需求变动是很频繁的,往往需求提出后就需要尽快进入实施阶段,这对MES的版本控制提出了很高的要求,处理不当就会发生该有的功能合并没有生产或出现bug。最初为了规避MES快速实施阶段中由于编程错误导致已有数据受影响的风险,针对MES的不同的定制需求对数据进行了隔离,并分别建立分支来管理,可后来发现这基本上就是一个无底洞,不同客户的需求差异越来越大,维护的版本也越来越多,一旦出现涉及到多个版本的bug,其修复就显得力不从心。通过简单的整合是没法适应各版本差异化的需求的,代码迁移的工作量十分大,需要不变动原有客户端语言的前提下,对多版本的差异进行提取。

布尔科技基于内部需求,整合了一套基于C#脚本的MES多版本控制实现方案,并整合springboot和vue分别作为方案的后端和前端,该方案使用github.com上面的开源脚本实现方案,许可证为MIT License,可以进行企业级开发。另外由于早期版本MES需求较为简单,使用了最简单的C/S架构,MySQL作为服务端,C#的winform作为客户端,但后续随着需求越来越复杂,该架构也越来越难以维护,已经不能适应后续需求的变动,现已对架构进行调整,增加了后端和前端,优点是扩展性提高了,所有的MES数据都可以进行集中管理,缺点是增加了架构的复杂度,工作量较大,维护成本较高。


  1. 为什么使用C#脚本?

由于C#在工业领域十分广泛和普及,贸然切换开发语言成本十分巨大,所以C#现阶段是无法替代的,不过也确实需要动态脚本语言来动态切换客户端的执行逻辑,C#可以使用补丁的方式去更新客户端的执行逻辑,但这种方式维护成本较高,需要寻找一个轻量级的动态更新方案。

经过调研发现,开源项目中有个可以将C#作为脚本执行的项目符合预期,该项目地址为GitHub - oleg-shilo/cs-script.net-framework: A mirror of the oleg-shilo/cs-script repository of CS-Script for .NET Framework. A copy of the repo before the product migration on .NET 5migrat,作者为oleg-shilo,许可证为MIT License,刚好可以作为企业MES的脚本引擎使用,使用这个脚本引擎可以将不同的版本的差异,整合成几个静态函数,不同客户需求对应不同的脚本。同时脚本是经静态编译后再执行的,可以在界面打开时从后端获取脚本并编译,这样执行效率几乎没有损失。同时由于脚本执行环境是相同的,可以通过脚本对执行流程进行覆盖,可定制化高。

  1. 方案实现的系统架构图

图1 系统架构图
  1. 方案实现说明

之前MES客户端主要是与数据库交互,延迟较低,全部都是同步实现,实现较为方便,但方案增加了网络通信,使用同步方案获取容易造成界面卡死,将所有接口访问都改成异步方式,不会卡死界面。方案对原有MES改进如下:

(1)API访问使用异步的方式获取,可以防止界面卡死。
(2)增加登录界面,获取API访问的token,使用token操作API是会记录用户的操作记录,MES系统会有完善的操作历史。
(3)增加项目选择界面,用项目来管理不同需求变更,对项目数据进行隔离。
(4)增加打印模板上传和下载功能,选择完项目后,会自动下载打印模板,并校验打印模板的MD5码,可支持多模板下载,这样可以根据打印机型号,提前制作好标签打印模板,生产时根据实际打印机型号进行选择就可以了,降低了人工干预的风险。
(5)变更串口内容解析为脚本解析,界面打开时会自动获取脚本内容并编译,之后执行效率和原有C#执行效率一致了。
(6)变更序列号生成方案,通过事务控制序列号的顺序分配,若生成失败,会继续尝试获取,直到达到最大重试次数。
(7)变更报表打印的模板为可指定,可以根据产品型号生成对应的报表,报表生成更加灵活。
  1. 使用C#脚本进行MES多版本管理的优势

(1)C#脚本会在界面打开时自动编译,MES的脚本的任何bug都可以通过修改脚本,并重新打开界面解决。
(2)C#脚本可以操作界面上的控件,也可以添加界面显示的控件,功能添加更加灵活。
(3)C#脚本可以编写SN生成规则,由事务控制序列号顺序,使其不重复。
(4)C#脚本可以随时添加新的功能,在脚本中添加新的函数,并重新发布MES即可。
  1. 使用C#脚本进行MES多版本管理的技术难点

(1)打印模板文件是闭源的只能通过COM组件的方式进行打开。
(2)C#脚本由于是客户端编译,脚本编译错误仅会在运行时发现。
(3)C#脚本无法进行git版本控制。
  1. 使用C#脚本进行MES多版本管理的解决方案

(1)打印模板提供了.net的dll,该dll不能直接调用,方案中通过C++编写中间动态库,java调用中间动态库获取了模板内容。
(2)将C#脚本嵌入到客户端中,在调试模式下直接静态编译,只有在发布模式下才使用脚本。
(3)C#脚本加入到客户端代码中,一起进行git版本控制。
  1. 使用C#脚本进行MES多版本管理的注意事项

(1)C#脚本直接保存在数据库中,有被破坏性改动的风险,若被不小心覆盖,问题可能无法第一时间发现。
(2)C#脚本编写需要具备一定C#基础,脚本编制只能是C#背景的开发人员才能修改。


文章转载自布尔科技技术团队,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论