2018年5月10日

开源纯C#工控网关+组态软件(十)移植到.NET Core

一、   引子

写这个开源系列已经十来篇了。自从十年前注册博客园以来,关注了张善友、老赵、xiaotie、深蓝色右手等一众大牛,也围观了逗比的吉日嘎啦、精密顽石等形形色色的园友。然而整整十年一篇文章都没有写过,属于非常努力的在社区汲取营养的菜青虫一只,现在也算破茧而出了,虽然远没有得道化蝶的境界,也在写作过程中得到不少提升。我开源的这个项目也有我固有的不良代码风格:严重缺乏注释,一方面是懒,一方面因为是单兵作战,也未曾想过让别人理解自己的代码。如何用简洁明了的方式表达自己的思路,虽然烧脑,但得到了社区的初步认可,在激励我把这个系列坚持下去的同时,对下一步如何完善这个项目,思路也更加清晰了。

二、      为什么要移植到.NET Core

 

.NET Core是.NET Framework的新一代版本,具有跨平台 (Windows、Mac OSX、Linux) 能力的应用程序开发框架。.NET Core遵循最宽松的开源协议,可以方便的移植到非微软平台,同时据说有相当出色的性能。这些已经足够吸引人了,对我这一工控狗而言,架构如果限定在Windows操作系统,有几个问题是难以解决但必须面对的:

  • 实时性

Windows是非实时的操作系统;受限于操作系统,我的网关程序始终找不到高精度的定时器,对一些实时性要求很高的场合,例如高精度机床控制,就力不从心了,而如果网关能移植到实时系统,这个问题就能得到解决。

  • 跨平台性

在一些诸如军工、机关、央企的场合都指定使用linux操作系统,如果不能跨平台,显然根本没有入局的机会。.NET Core的跨平台能力保证了广泛的适应性,起码不会因为绑定平台而被拒(杯具)。

  • 开源社区支持

因为宽松的开源协议,.NET Core现在已经成为很热门的开源项目,在社区获得了广泛的支持。最起码不用担心它的生命被微软忽然宣布死亡-微软虽然是.NET社区强有力的支持者,但不是唯一的;有谷歌,三星,Unity甚至红帽加入的.NET基金会的强大阵容;越来越多的开源社区接纳了.NET,并为之开发各种组件和应用。

  • 性能

看了不少公开资料及社区反馈,.NET Core的性能相比.NET Framework有大幅提升。部分常用类库据说提升达到60%(求证实)。但.NET Core毫无疑问是.NET 平台的未来,会得到持续的升级。

三、   如何移植

关于如何移植,博客园有不少好的文章。以我粗浅的理解和实践,就是建立一个.NET Core项目(VS017支持.NET Core 2.0),VS会自动加载相关的依赖项;将我网关部分的代码拷贝到新的文件夹下,形成下面这几个新的基于Core的项目:

可以看到,Core项目没有常规的dll引用方式,而代之以“项目”引用(即同一解决方案下的项目,这点和.NET Framework类似)以及NuGet包引用。NuGet可以理解为类库“商店”,在NuGet上寻找你需要的组件和类库,基本上常用的,你觉得应该有的,都能搜到,并傻瓜式下载、安装、部署。

 

和常规的.NET项目比较,基本大同小异,目标框架可选.NET Core的各版本。编译后生成的同样是dll文件,反射依然可用。另外还惊喜的发现.NET Core依然支持不安全代码-也就是支持指针,似乎说明微软设计者相当重视性能问题。

要让JAVA死忠们接受后来者.NET Core,性能优势、VS支持、部署傻瓜化这些显然很有吸引力。对我这类.NET 老用户而言,一个Core项目并没有什么违和感。一切都是亲切的老面孔,但深入之后,会发现也有一些不同之处,只是解决起来总体十分顺畅。下面说说我试手将SCADA项目的网关部分初步移植到.NET Core的过程。

四、   .NET Core填坑记

  • 移植准备

大概的学习了下.NET Core的基本概念,发现有几个重要问题必须要面对:

没有UI: Winform、WPF这一类的UI库并没有在.NET Core实现。大概是因为界面这部分各家差异太大,而且界面技术日新月异,做跨平台的界面现在流行用Web。Core只提供了简单的控制台输出显示。看来人机界面部分(HMI控件、WPF界面)目前是无法移植了。不过真正有移植价值的还是在网关部分,这部分如果能跨平台,界面用H5,WPF,还是QT都无所谓,反正都是通用的Socket通讯。(注:在最新的.NET Core 3.0版本,能够在Windows环境下兼容WPF,Winform,兼容UWP,这个消息值得期待)

没有对SQL Server的支持:大概因为SQL Server本身就不跨平台吧。这就逼得我必须寻找一个跨平台的数据库用来做系统配置和元数据存储。根据网友们的建议,我考虑 用MySQL作数据库,开源跨平台,用户多,工具完备,支持网络访问,性能也不错。好在NuGet上有不少开源类库支持对MySQL读写。

.Net Core下没有Windows 服务:原有的WCF后台服务和封装为Windows 服务组件的功能废弃,网关直接挂接一个控制台程序。需要与客户端交互,除了原有的基于Socket的TLV协议,还可以设计RESTful 调用接口,比WCF这种笨家伙只会更方便。

Windows日志的实现方式大不相同:大概为了和其他系统兼容,不能采用直接读写EventLog的方式了。SCADA项目的流水账记录和错误日志都写入Windows事件管理器,必须要替换。我比较了几种常用的日志移植方法,决定采用微    软自家的Logging组件,官方支持,同时扩展性看上去不错,最重要的是简单,写法上也和之前区别不大。另外第三方的Log4Net,NLog也移植到了.NET Core,这些日志库更为强大和专业。

没有内置串口组件:因为是工控组件,对串口的支持是必要的。但Core并没有内置SerialPort这种类库,感觉有点奇怪。在NuGet上搜到有RJCP.IO.Ports这个库,用法和SerialPort大同小异。

还有一些小功能需要移植,如读写ini配置文件等。好在NuGet上都有官方类库可用。

  • 移植过程

MySQL连接用了NuGet下载的MySQLConnector类库。开源免费,同时下载的人很多,从一个侧面印证了它的优秀。我重写了DataHelper类,使之能够实现多种数据库支持。简单起见,套用了一个数据库工厂模式,定义了一套数据读写接口。MySQLConnector比起Framework下的SqlConnector,没有什么特别的,继承的是同一套接口或抽象类,例如DbParameterDbDataReaderDbCommand等。唯一注意的就是之前惯用的数据库批量写入类SqlBulkCopy不能再用了。MySql里有它自家的批量写入方式。

对日志的操作用了一个“提供者模式”,对于在Debug模式下有DebugLoggerProvider、控制台模式下有ConsoleLoggerProvider,设计十分合理。

对配置文件的管理用了一个构建者(Builder)模式,无论是ini配置方式还是xml配置方式都有自己的实现。

从对日志和配置的官方实现,让我感觉微软对.NET Core的设计颇为用心。在.NET FX下对配置文件或者日志的读写,要么是专门对Windows设计的EventLog日志类,要么连ini的官方支持都没有,必须调用API函数。而在Core中进行了重构,进行了合理充分的抽象,架构十分简洁明了,尤其是充分考虑了各平台对日志、配置文件的共性需求,易于扩展,也有助于开源社区自行发展完善。

  • 总体感觉

感觉Core和老的Framework还是非常相似的,起码绝大部分是兼容的。只有与操作系统和数据库密切相关的部分被重新实现了,但也很容易在NuGet找到替代办法。可以说,移植体验很顺畅。移植过程很傻瓜。让我这类初次使用者就能很快完成移植,甚至感觉Core重写之后比老的Framework代码更为简洁,架构更为清晰。这让我对Core的前景信心大增。

  • 未来改进

这次的移植只是初试,虽然编译通过并在虚拟机环境下测试,但并没在真实Linux环境下测试。因为不熟悉mysql,原有SQL SERVER的部分功能(如存储过程等)移植不全。未来我希望把网关部分也加入NuGet包,并提供支持.NET Core的设备驱动包下载,依靠开源社区使这个项目支持越来越多的系统平台、硬件设备和行业。

五、   下面的计划

写一系列帖子,把架构、原理讲清楚。大致如下:

github地址:https://github.com/GavinYellow/SharpSCADA。QQ群:102486275

posted @ 2018-05-10 10:06 老坏猫 阅读(16463) 评论(19) 推荐(33) 编辑

2018年4月16日

开源纯C#工控网关+组态软件(九)定制Visual Studio

摘要: 一、 引子 一、 引子 因为最近很忙(lan),很久没发博了。不少朋友对那个右键弹出菜单和连线的功能很感兴趣,因为VS本身是不包含这种功能的。 大家想这是什么鬼,怎么我的设计器没有,其实这是一个微软黑科技,如果用好,VS可以打造为你专用的神兵利器。 为什么我要扩展Visual Studio的界面设计 阅读全文

posted @ 2018-04-16 23:24 老坏猫 阅读(21873) 评论(11) 推荐(31) 编辑

2018年1月29日

开源纯C#工控网关+组态软件(八)表达式编译器

摘要: 一、 引子 一、 引子 监控画面的主要功能之一就是跟踪下位机变量变化,并将这些变化展现为动画。大部分时候,界面上一个图元组件的某个状态,与单一变量Tag绑定,比如电机的运行态,绑定一个MotorRunning信号;但有些时候不会这么简单,比如温度计在温度高于50℃显示红色;某设备报警,可能是多个条件 阅读全文

posted @ 2018-01-29 22:13 老坏猫 阅读(12048) 评论(7) 推荐(13) 编辑

2017年12月12日

开源纯C#工控网关+组态软件(七)数据采集与归档

摘要: 一、 引子 在当前自动化、信息化、智能化的时代背景下,数据的作用日渐凸显。而工业发展到如今,科技含量和自动化水平均显著提高,但对数据的采集、利用才开始起步。 一、 引子 在当前自动化、信息化、智能化的时代背景下,数据的作用日渐凸显。而工业发展到如今,科技含量和自动化水平均显著提高,但对数据的采集、利 阅读全文

posted @ 2017-12-12 15:38 老坏猫 阅读(20727) 评论(11) 推荐(25) 编辑

2017年11月28日

开源纯C#工控网关+组态软件(六)图元组件

摘要: 一、 图元概述 一、 图元概述 图元是构成人机界面的基本单元。如一个个的电机、设备、数据显示、仪表盘,都是图元。构建人机界面的过程就是铺排、挪移、定位图元的过程。 图元设计是绘图和编码的结合。因为图元不仅有显示和动画,还有背后操纵动画的控制逻辑。 一个好的图元设计框架,应该最大限度提高设计的效率和专 阅读全文

posted @ 2017-11-28 14:58 老坏猫 阅读(22290) 评论(26) 推荐(46) 编辑

2017年11月4日

开源纯C#工控网关+组态软件(五)从网关到人机界面

摘要: 一、 引子 一、 引子 之前都在讲网关,不少网友关注如何实现界面。想了解下位机变量变化,是怎样一步步触发人机界面动画的。 这个步步触发,实质上是变量组(Group)的批量数据变化(DataChange)事件,引发了变量(Tag)的值更新(ValueChanged)事件,最终触发了图元的动画脚本(Ac 阅读全文

posted @ 2017-11-04 09:33 老坏猫 阅读(15672) 评论(7) 推荐(15) 编辑

2017年10月28日

开源纯C#工控网关+组态软件(四)上下位机通讯原理

摘要: 一、 网关的功能:承上启下 最近有点忙,更新慢了。感谢园友们给予的支持,现在github上已经有。目标是最好的开源组态,看来又近一步^^ 之前有提到网关是物联网的关键环节,它的作用就是承上启下。 下位机有下位机的语言,上位机有上位机的思路。网关就是一个翻译,把下位机的语言转成通用语,再告诉上位机该怎 阅读全文

posted @ 2017-10-28 09:06 老坏猫 阅读(23344) 评论(11) 推荐(16) 编辑

2017年10月21日

野生码农的架构实践

摘要: 一、 自传 一、 自传 IT圈子重所谓“出身”。在B乎、各种码农圈子,经常看到晒学历、晒工作经历。不是BAT,就是麻省,北清。就如龙母见任何人都要报出一堆头衔,以证明自己血统的高贵。 而本人,就是一个纯野生“双非”码农:非计算机科班出身、非IT名企出身。大学学的机电自动化,毕业也是一直跟机器、图纸打 阅读全文

posted @ 2017-10-21 14:54 老坏猫 阅读(10186) 评论(21) 推荐(12) 编辑

2017年10月10日

开源纯C#工控网关+组态软件(三)加入一个新驱动:西门子S7

摘要: 一、 引子 首先感谢博客园:第一篇文章、第一个开源项目,算是旗开得胜。可以看到,项目大部分流量来自于博客园,码农乐园,名不虚传^^。 园友给了我很多支持,并提出了很好的改进意见。现加入屏幕分辨率自适应和OPC Server可CLSID和ProgID自适应加载功能。屏幕自适应本是普遍问题,因为之前都是 阅读全文

posted @ 2017-10-10 21:02 老坏猫 阅读(23825) 评论(18) 推荐(23) 编辑

2017年10月5日

.NET十年回顾

摘要: 一、 引子 从我还是编程菜鸟时起,.NET就从来没让我失望过。总是惊喜不断。 当年我第一个项目是做个进销存。用的Winform。当时我是机电工程师。编程只是业余心血来潮而已。 .NET的低门槛、VS良好的编程体验及MSDN完善的说明让我从此踏上了码农的不归之路。 回首十年,是从.NET2.0一路走来 阅读全文

posted @ 2017-10-05 09:31 老坏猫 阅读(56202) 评论(84) 推荐(63) 编辑

< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

导航

统计

点击右上角即可分享
微信分享提示