跳到主要内容

第一个 WinForms 应用

这一篇带你做一个最小 WinForms 点表面板:从 zeus.json 装载虚拟 Modbus,显示通道状态、炉温、设定值和报警。

完整项目骨架请用 dotnet new zeus-winforms。仓库示例 Zeus.Samples.WinForms.QuickStart 与模板同一条路径。通道回显请看 控制台示例。

先运行示例​

在仓库的 code 目录执行:

dotnet run --project samples/Zeus.Samples.WinForms.QuickStart

窗口打开后:

  1. 通道状态应显示 Open。
  2. 温度应显示采集值(空虚拟从站默认 0.0 C)。
  3. 点击「模拟高温」后,温度变为 96.5 C,报警状态变为 High。

这说明宿主、JSON 点表、采集循环和 WinForms 绑定都通了。

你的项目需要哪些包​

dotnet add package Zeus.Communications
dotnet add package Zeus.Configuration
dotnet add package Zeus.Presentation.WinForms
dotnet add package Zeus.Protocols.Modbus

项目文件需要是 Windows 桌面目标:

<TargetFramework>net8.0-windows</TargetFramework>
<UseWindowsForms>true</UseWindowsForms>

最小窗口代码​

布局放在 MainForm.Designer.cs,后台只挂接 Zeus。把 zeus.json 复制到输出目录后:

using Zeus;

public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();

var attachment = this.AttachZeus(builder =>
builder.AddJsonFile(Path.Combine(AppContext.BaseDirectory, "zeus.json")));
attachment.Host.Channels.Get("bus").BindState(stateLabel);
attachment.Host.Points.BindText("temperature", temperatureLabel, value => $"{value:0.0} C");
}
}

stateLabel、temperatureLabel 由设计器声明。仓库示例还会绑定设定值、加热器和报警色,并用「模拟高温」写虚拟从站寄存器。核心就是:JSON 声明点表,窗口只绑 host.Points。

这段代码怎么理解​

代码作用
this.AttachZeus(...)把 Zeus 宿主挂到窗体生命周期上:窗口加载时启动,关闭时释放
builder.AddJsonFile("zeus.json")装载通道、虚拟 Modbus 从站和点表
Channels.Get("bus")取出 JSON 里声明的通道
InitializeComponent()加载设计器里的布局,不要在后台手写控件坐标
BindState(stateLabel)把通道状态显示到设计器里的 Label
Points.BindText("temperature", ...)把采集值写到 Label,并封送到 UI 线程

为什么不用自己 Invoke​

采集回调通常不在 UI 线程上。BindText、BindState 已经做了线程封送,不必在每个事件里手写 Invoke。

换成真实串口​

模板和本页示例都读 zeus.json。把通道从虚拟从站改成串口即可,窗口代码不用动:

{
"name": "bus",
"type": "serial",
"options": {
"portName": "COM3",
"baudRate": 9600
}
}

校验位、数据位、停止位目前只能在代码里用 AddSerialPort(name, options => …) 设置;JSON 串口参数写在 options.portName 和 options.baudRate。如果串口打不开,先确认端口名、波特率和是否被串口助手占用。

常见问题​

现象原因处理
状态一直不是 Open宿主启动失败或通道打开失败看弹窗和控制台日志
温度一直空白第一轮采集未完成,或 JSON 未复制到输出目录确认 CopyToOutputDirectory,稍等一轮或订 BatchChanged
绑定后界面没刷新没用 Zeus 的绑定扩展,或点名与 JSON 不一致确认 BindText("temperature", …) 与 zeus.json 点名一致
换真实串口后无数据程序结构没问题,问题可能在接线或参数先改回 type: virtual 确认界面,再查硬件

下一步:了解 WinForms 适配器,或直接看 串口。