跳到主要内容

Omron Host Link

Zeus 的 Host Link 模块面向 Omron PLC 的 ASCII Host Link 通信,支持 @UU 站号帧、FCS 校验、CIO/LR/HR/AR/DM 常用字区读写、点表采集、按点名写回和虚拟 PLC 联调。

没硬件时先跑虚拟 PLC​

var memory = new HostLinkSlaveMemory();
memory.DataMemoryWords[100] = 253;
memory.CioWords[10] = 0x0001;

await using var app = ZeusHost.Create(builder =>
{
builder.AddAcquisition(TimeSpan.FromMilliseconds(100));
builder.AddVirtualChannel("host-link", new HostLinkSlaveResponder(unitNumber: 0, memory));
builder.AddOmronHostLink("plc", "host-link", new HostLinkOptions
{
UnitNumber = 0
}, points: map => map
.DmWord("temperature", address: 100, scale: 0.1).Writable("temperature")
.CioBit("running", address: 10, bitOffset: 0).Writable("running"));
});

await app.StartAsync();
var temperature = app.Points.Get<double>("temperature");
await app.Points.WriteAsync("temperature", 18.6);

这段代码里:

代码含义
HostLinkSlaveMemory虚拟 PLC 的 CIO/LR/HR/AR/DM 内存映像
HostLinkSlaveResponder(0, memory)模拟 00 号 Host Link PLC
UnitNumber = 0Host Link 帧里的两位十进制单元号
.DmWord(..., 0.1)D100 原始字乘以 0.1 后进入点表;写回时反算

可运行示例:samples/Zeus.Samples.Console.HostLink。

连接真实 PLC​

串口 Host Link 常见参数由 PLC 工程决定,示例:

await using var app = ZeusHost.Create(builder =>
{
builder.AddSerialPort("host-link", "COM3", 9600);
builder.AddOmronHostLink("plc", "host-link", new HostLinkOptions
{
UnitNumber = 0
});
});

如果现场通过以太网串口服务器或 PLC 网关做 TCP 透传,通道可以换成 TCP:

builder.AddTcpClient("host-link", "192.168.250.1", 9600);
builder.AddOmronHostLink("plc", "host-link", new HostLinkOptions { UnitNumber = 0 });

读写 API​

var plc = app.Devices.Get<HostLinkDevice>("plc");

var dm = await plc.ReadDataMemoryWordsAsync(100, 2);
await plc.WriteDataMemoryWordsAsync(110, [10, 20, 30]);

var cio = await plc.ReadCioWordsAsync(10, 1);
await plc.WriteCioWordsAsync(10, [0x0001]);

也可以直接发任意 Host Link 命令:

string data = await plc.ExecuteAsync("RD", "01000002");

支持的内存区​

区域读命令写命令点表便捷方法
CIO / IRRRWR.CioWord(...) / .CioBit(...)
LRRLWL.LinkWord(...) / .LinkBit(...)
HRRHWH.HoldingWord(...) / .HoldingBit(...)
ARRJWJ.AuxiliaryWord(...) / .AuxiliaryBit(...)
DMRDWD.DmWord(...) / .DmBit(...)

Host Link 位点通过读写所在字实现,写回时会先读取当前字,再只修改目标 bit。

点表采集​

builder.AddOmronHostLink("plc", "host-link", new HostLinkOptions
{
UnitNumber = 0,
WordOrder = HostLinkWordOrder.HighWordFirst
}, points: map => map
.DmWord("temperature", 100, 0.1).Writable("temperature")
.Int16("pressure", HostLinkArea.DataMemory, 120)
.Real("flow", HostLinkArea.DataMemory, 130)
.CioBit("running", 10, 0).Writable("running"));

Host Link 原始字是 16 位。UInt32、Int32 和 Real 占两个连续字,字序由 HostLinkOptions.WordOrder 控制,默认高字在前。

JSON 配置​

{
"channels": [
{
"name": "host-link",
"type": "serial",
"options": {
"portName": "COM3",
"baudRate": 9600
}
}
],
"devices": [
{
"name": "plc",
"channel": "host-link",
"type": "omron-host-link",
"options": {
"unitId": 0
},
"points": [
{
"name": "temperature",
"options": {
"area": "dm",
"address": 100,
"dataType": "word",
"scale": 0.1,
"writable": true
}
},
{
"name": "running",
"options": {
"area": "cio",
"address": 10,
"bit": 0,
"dataType": "bit",
"writable": true
}
}
]
}
]
}

虚拟 Host Link PLC:

{
"name": "host-link",
"type": "virtual",
"options": {
"responder": "host-link",
"unitId": 0
}
}

可直接复制的真实串口配置样例位于 samples/Zeus.Samples.Console.Config/zeus-host-link.json。

常见问题​

现象最可能原因处理
一直超时单元号、串口参数或 TCP 透传端口不对先用 HostLinkSlaveResponder 跑通,再查 PLC 通信设置
FCS 校验失败波特率/校验位错误,或接入的不是 Host Link ASCII核对串口参数和对端协议模式
读到结束码内存区、地址或数量不被 PLC 支持看异常里的 Host Link 结束码,核对 CPU 手册
32 位值高低字反了字序和 PLC 工程约定不一致改 HostLinkOptions.WordOrder
写回没执行点没有 .Writable(...) 或 JSON 没设 writable: true标记点为可写

下一步:周期读取数据看 点表与采集。