这是一个面向工业通讯场景的类库:
- 免费开源: 整个类库家族都是MIT授权,而且相关依赖链也都是(或近乎是)MIT授权。
- 高度模块化: 每种硬件实现,以
nuget包为单元,各自独立。 - 易于扩展:照抄内置的设备实现,实现你自己的通讯封装,然后编写一个
.AddYourOwnSupport()扩展方法。 - 跨平台:依托于
dotnet跨平台的能力,让你的代码跑到各种设备上。
在正式发布1.0版本之前,这个包只会发布在我的测试源上。 如果你使用
nuget管理,请参照示例,指定包源为 https://baget.stdunit.com/v3/index.json ; 如果你使用paket管理,参照本项目paket.dependencies 指定包源。 我个人建议你使用paket管理依赖,这样哪怕我和nuget.org都破产跑路了,你的本地代码也能完全断网的情况下离线编译。
警告:假设版本号是<major>.<minor>.<patch>:
- 在
v1.0版本之前,每个minor版本的跳变,可能会引入新特性和破坏性更新。 - 在
v1.0版本之后,每个major版本的跳变,可能会引入新特性和破坏性更新。
你只管提供描述(xml),我们负责让它跑起来。
其中,你提供的描述类似于:
<root>
<!-- 通道,可以配置多个-->
<Channel name="S7-1" driver="S7" >
<IpAddr>172.16.10.20</IpAddr>
<Rack>0</Rack>
<Slot>1</Slot>
</Channel>
<!-- 测点配置,可以配置多个 -->
<TagGrp name="IoBox" isEntry="true" isEnabled="true" channel="S7-1" scanInterval="0">
<TagGrp name="通用状态">
<TagCbnt name="PLC" address="DB200.100" access="RO">
<Tag name="心跳请求" address="$$100.0" type="BIT" access="RO"></Tag>
<Tag name="状态码" address="$$102.0" type="INT16" access="RW" endian="BigEndian"></Tag>
</TagCbnt>
<TagCbnt name="MST" address="DB201.100" access="R1W">
<Tag name="心跳响应" address="$$100.0" type="BIT" access="R1W"></Tag>
<Tag name="扫描周期" address="$$102.0" type="FLOAT" access="R1W"></Tag>
</TagCbnt>
</TagGrp>
</TagGrp>
<!-- 逻辑配置,可以配置0~N个 -->
<!--<Logicet>Samples.Plugin1.dll</Logicet>-->
</root>我们的启动代码类似于:
// 项目启停控制器
var ctrl = sp.GetRequiredService<ITagsProjectCtrl>();
var dir ="D:/manufacture/pl01/"; // 提供项目运行目录,其中有通信点表和可能用到的插件
XElement? root = null; // 空表示使用默认的`index.xml`来配置项目
await ctrl.StartPollAsync(dir, root, hook: async(proj, sp, ct) =>{
// 添加心跳信号逻辑
proj.Logicets.Add(new HeartBeatLogicet(
proj.Channels,
proj.Tags,
loggerFactory.CreateLogger<HeartBeatLogicet>()
));
// ... 添加更多业务逻辑
// ...可选:如注册 proj.TurnStarted 或者 projCrashed 事件处理
return Task.CompletedTask;
});优势:
- 硬件无关抽象:理论上,你可以在家里用S7模拟器编写自动化测试,验证你的逻辑,最后到现场前再切换到
OpcUa设备上(或者反过来)。 - 支持逻辑组件插件(dll)
- 支持通过MCP方式暴露给AI:把测点项目描述作为上下文,AI可以轻松操作点位
开发者示例:
具体文档可以查看:tags.doc
.configdotnet-tools.json: 本项目用到的 dotnet tools 配置
global.json: 本项目SDK配置,目前锁定版本8.0.102src/: 项目代码及测试Itminus.Tags.Core: 核心抽象Itminus.Tags: 基本功能,但和具体的硬件设备无关,只依赖于Itminus.Tags.Core。Itminus.Tags.RxExtensions:dotnet/reactive扩展,只依赖于Itminus.Tags.CoreItminus.Tags.R3Extensions:Cysharp/R3扩展,只依赖于Itminus.Tags.CoreItminus.Tags.S7: 西门子S7协议扩展,只依赖于Itminus.Tags+ Sharp7Itminus.Tags.OpcUaClient: OpcUa客户端扩展,依赖于Itminus.Tags+ OpcUaItminus.Tags.ModbusTcp: ModbusTcp扩展,依赖于Itminus.Tags+ NModbusItminus.Tags.Hjzk: Hjzk IO盒子扩展,依赖于Itminus.Tags.ModbusTcp- ... 其它硬件扩展
Itminus.Tags.BlazorLib.Core: Blazor 类库,包含核心功能抽象,以及一个极简的监控页面。Itminus.Tags.BlazorLib: 包含一些常用硬件设备的实现。Itminus.Tags.McpServer: 这是一个把Itminus.Tags暴露成 Model Context Protocol Server 的类库。Itminus.Tags.Tests: 上述所有子项目的测试
samples/: 示例代码paket.dependencies: 用paket管理的依赖声明paket.lock: 依赖锁定文件
本仓库由许多子包构成,根据上游依赖的不同,我们为每个子包采用不同的授权协议。基本原则是在尊重上游依赖包授权的前提下,选择最友好的开源授权协议 (基本都是 MIT)。
- 官方类库:这里所称官方类库 是指 .NET BCL 或者 dotnet 的官方扩展包(MIT协议)
核心类库部分和部分硬件实现包,由于不涉及官方类库之外的第三方依赖,均采用MIT协议:
- Itminus.Tags.Core
- Itminus.Tags
- Itminus.Tags.BlazorLib.Core
- Itminus.Tags.BlazorLib
- Itminus.Tags.ComScanner
目前本项目下的依赖,除了OPC UA之外,所有的上游依赖都是MIT授权,所以这里我们也一律采用MIT授权:
- Itminus.Tags.RxExtensions
- Itminus.Tags.R3Extensions
- Itminus.Tags.ModbusTcp
- Itminus.Tags.Hjzk
- Itminus.Tags.ZLan
- Itminus.Tags.S7
目前唯一比较特殊的是OPC UA,我记得早期OPC基金会的仓库下基本都是GPL授权,不过最近我发现它们官方已经改成了OPC Foundation MIT License 1.00,所以我们也遵循这个开源协议——OPC Foundation MIT License 1.00:
- Itminus.Tags.OpcUaClient